{"action":"created","comment":{"url":"https://api.github.com/repos/Opentrons/opentrons/pulls/comments/171412048","pull_request_review_id":100257156,"id":171412048,"diff_hunk":"@@ -10,3 +13,60 @@ export type FilePageFields = {\n }\n \n export type FilePageFieldAccessors = $Keys<FilePageFields>\n+\n+type ISODate = $Subtype<string> // TODO Ian 2018-02-28 ???","path":"protocol-designer/src/file-data/types.js","position":13,"original_position":13,"commit_id":"47ba9fe1abefc2d78a43ca23cf469f9df523a8ad","original_commit_id":"47ba9fe1abefc2d78a43ca23cf469f9df523a8ad","user":{"login":"mcous","id":2963448,"avatar_url":"https://avatars1.githubusercontent.com/u/2963448?v=4","gravatar_id":"","url":"https://api.github.com/users/mcous","html_url":"https://github.com/mcous","followers_url":"https://api.github.com/users/mcous/followers","following_url":"https://api.github.com/users/mcous/following{/other_user}","gists_url":"https://api.github.com/users/mcous/gists{/gist_id}","starred_url":"https://api.github.com/users/mcous/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mcous/subscriptions","organizations_url":"https://api.github.com/users/mcous/orgs","repos_url":"https://api.github.com/users/mcous/repos","events_url":"https://api.github.com/users/mcous/events{/privacy}","received_events_url":"https://api.github.com/users/mcous/received_events","type":"User","site_admin":false},"body":"See comment above about datetime format","created_at":"2018-02-28T22:50:52Z","updated_at":"2018-02-28T22:51:37Z","html_url":"https://github.com/Opentrons/opentrons/pull/938#discussion_r171412048","pull_request_url":"https://api.github.com/repos/Opentrons/opentrons/pulls/938","author_association":"MEMBER","_links":{"self":{"href":"https://api.github.com/repos/Opentrons/opentrons/pulls/comments/171412048"},"html":{"href":"https://github.com/Opentrons/opentrons/pull/938#discussion_r171412048"},"pull_request":{"href":"https://api.github.com/repos/Opentrons/opentrons/pulls/938"}}},"pull_request":{"url":"https://api.github.com/repos/Opentrons/opentrons/pulls/938","id":172085665,"html_url":"https://github.com/Opentrons/opentrons/pull/938","diff_url":"https://github.com/Opentrons/opentrons/pull/938.diff","patch_url":"https://github.com/Opentrons/opentrons/pull/938.patch","issue_url":"https://api.github.com/repos/Opentrons/opentrons/issues/938","number":938,"state":"open","locked":false,"title":"(pd) download file with metadata; buttons.css resets for <a>","user":{"login":"IanLondon","id":11590381,"avatar_url":"https://avatars0.githubusercontent.com/u/11590381?v=4","gravatar_id":"","url":"https://api.github.com/users/IanLondon","html_url":"https://github.com/IanLondon","followers_url":"https://api.github.com/users/IanLondon/followers","following_url":"https://api.github.com/users/IanLondon/following{/other_user}","gists_url":"https://api.github.com/users/IanLondon/gists{/gist_id}","starred_url":"https://api.github.com/users/IanLondon/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/IanLondon/subscriptions","organizations_url":"https://api.github.com/users/IanLondon/orgs","repos_url":"https://api.github.com/users/IanLondon/repos","events_url":"https://api.github.com/users/IanLondon/events{/privacy}","received_events_url":"https://api.github.com/users/IanLondon/received_events","type":"User","site_admin":false},"body":"Closes #854\r\n\r\n## overview\r\n\r\n\"Download\" button appears, and user can download a JSON file.\r\nRight now it just has blank/placeholder data, and the download button doesn't only show when there is a file to download.\r\n\r\n## changelog\r\n\r\n* Added 2 lines to `buttons.css` in Components Library so that `<a>` buttons can render (I need <a> to trigger download)\r\n* Factored out `file-data` selectors into their own dir with an `index.js`\r\n\r\n## review requests\r\n\r\nAre changes to `buttons.css` ok?\r\n\r\nYou should be able to download a JSON file, and if you enter a protocol name / author / description it should show up in the file. The file name should match the name you entered.\r\n\r\n## Discussion question\r\n\r\nRight now, this `createFile` selector is going to run every time any of its inputs change. Ideally this should happen lazily, and only actually run when the user clicks the download button - maybe some less expensive selector could toggle the download button visibility. However, I can't think of a nice way to make the `a`'s `href` prop update only when the user clicks - maybe I can stick something into the onclick before the download is triggered, or I can have the <a> go to a route that then triggers a download somehow? I'm OK trying to optimize this lazy file generation thing later, but if you have any thoughts I'd like to hear them.\r\n\r\nMaybe something like https://github.com/kennethjiang/js-file-download -- it appends a hidden `a` with a blob URL, clicks it, removes it, then deletes the blob... this lets you lazily call `createFile` by making the download button's onClick handler look like `onClick={() => fileDownload(props.createFile(), 'filename.json', 'application/json')}`. If that works, then I don't need to use an `a`, can just use a normal `button`.","created_at":"2018-02-28T22:01:36Z","updated_at":"2018-02-28T22:51:37Z","closed_at":null,"merged_at":null,"merge_commit_sha":"340aad09adf5957bd9141d213c8a054b75d2bf22","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/Opentrons/opentrons/pulls/938/commits","review_comments_url":"https://api.github.com/repos/Opentrons/opentrons/pulls/938/comments","review_comment_url":"https://api.github.com/repos/Opentrons/opentrons/pulls/comments{/number}","comments_url":"https://api.github.com/repos/Opentrons/opentrons/issues/938/comments","statuses_url":"https://api.github.com/repos/Opentrons/opentrons/statuses/47ba9fe1abefc2d78a43ca23cf469f9df523a8ad","head":{"label":"Opentrons:pd_download-file-metadata","ref":"pd_download-file-metadata","sha":"47ba9fe1abefc2d78a43ca23cf469f9df523a8ad","user":{"login":"Opentrons","id":6139147,"avatar_url":"https://avatars2.githubusercontent.com/u/6139147?v=4","gravatar_id":"","url":"https://api.github.com/users/Opentrons","html_url":"https://github.com/Opentrons","followers_url":"https://api.github.com/users/Opentrons/followers","following_url":"https://api.github.com/users/Opentrons/following{/other_user}","gists_url":"https://api.github.com/users/Opentrons/gists{/gist_id}","starred_url":"https://api.github.com/users/Opentrons/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Opentrons/subscriptions","organizations_url":"https://api.github.com/users/Opentrons/orgs","repos_url":"https://api.github.com/users/Opentrons/repos","events_url":"https://api.github.com/users/Opentrons/events{/privacy}","received_events_url":"https://api.github.com/users/Opentrons/received_events","type":"Organization","site_admin":false},"repo":{"id":38644841,"name":"opentrons","full_name":"Opentrons/opentrons","owner":{"login":"Opentrons","id":6139147,"avatar_url":"https://avatars2.githubusercontent.com/u/6139147?v=4","gravatar_id":"","url":"https://api.github.com/users/Opentrons","html_url":"https://github.com/Opentrons","followers_url":"https://api.github.com/users/Opentrons/followers","following_url":"https://api.github.com/users/Opentrons/following{/other_user}","gists_url":"https://api.github.com/users/Opentrons/gists{/gist_id}","starred_url":"https://api.github.com/users/Opentrons/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Opentrons/subscriptions","organizations_url":"https://api.github.com/users/Opentrons/orgs","repos_url":"https://api.github.com/users/Opentrons/repos","events_url":"https://api.github.com/users/Opentrons/events{/privacy}","received_events_url":"https://api.github.com/users/Opentrons/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/Opentrons/opentrons","description":"Software for writing protocols and running them on Opentrons robots","fork":false,"url":"https://api.github.com/repos/Opentrons/opentrons","forks_url":"https://api.github.com/repos/Opentrons/opentrons/forks","keys_url":"https://api.github.com/repos/Opentrons/opentrons/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Opentrons/opentrons/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Opentrons/opentrons/teams","hooks_url":"https://api.github.com/repos/Opentrons/opentrons/hooks","issue_events_url":"https://api.github.com/repos/Opentrons/opentrons/issues/events{/number}","events_url":"https://api.github.com/repos/Opentrons/opentrons/events","assignees_url":"https://api.github.com/repos/Opentrons/opentrons/assignees{/user}","branches_url":"https://api.github.com/repos/Opentrons/opentrons/branches{/branch}","tags_url":"https://api.github.com/repos/Opentrons/opentrons/tags","blobs_url":"https://api.github.com/repos/Opentrons/opentrons/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Opentrons/opentrons/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Opentrons/opentrons/git/refs{/sha}","trees_url":"https://api.github.com/repos/Opentrons/opentrons/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Opentrons/opentrons/statuses/{sha}","languages_url":"https://api.github.com/repos/Opentrons/opentrons/languages","stargazers_url":"https://api.github.com/repos/Opentrons/opentrons/stargazers","contributors_url":"https://api.github.com/repos/Opentrons/opentrons/contributors","subscribers_url":"https://api.github.com/repos/Opentrons/opentrons/subscribers","subscription_url":"https://api.github.com/repos/Opentrons/opentrons/subscription","commits_url":"https://api.github.com/repos/Opentrons/opentrons/commits{/sha}","git_commits_url":"https://api.github.com/repos/Opentrons/opentrons/git/commits{/sha}","comments_url":"https://api.github.com/repos/Opentrons/opentrons/comments{/number}","issue_comment_url":"https://api.github.com/repos/Opentrons/opentrons/issues/comments{/number}","contents_url":"https://api.github.com/repos/Opentrons/opentrons/contents/{+path}","compare_url":"https://api.github.com/repos/Opentrons/opentrons/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Opentrons/opentrons/merges","archive_url":"https://api.github.com/repos/Opentrons/opentrons/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Opentrons/opentrons/downloads","issues_url":"https://api.github.com/repos/Opentrons/opentrons/issues{/number}","pulls_url":"https://api.github.com/repos/Opentrons/opentrons/pulls{/number}","milestones_url":"https://api.github.com/repos/Opentrons/opentrons/milestones{/number}","notifications_url":"https://api.github.com/repos/Opentrons/opentrons/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Opentrons/opentrons/labels{/name}","releases_url":"https://api.github.com/repos/Opentrons/opentrons/releases{/id}","deployments_url":"https://api.github.com/repos/Opentrons/opentrons/deployments","created_at":"2015-07-06T20:41:01Z","updated_at":"2018-02-27T23:56:39Z","pushed_at":"2018-02-28T22:06:19Z","git_url":"git://github.com/Opentrons/opentrons.git","ssh_url":"git@github.com:Opentrons/opentrons.git","clone_url":"https://github.com/Opentrons/opentrons.git","svn_url":"https://github.com/Opentrons/opentrons","homepage":"","size":18391,"stargazers_count":42,"watchers_count":42,"language":"JavaScript","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":28,"mirror_url":null,"archived":false,"open_issues_count":132,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0"},"forks":28,"open_issues":132,"watchers":42,"default_branch":"edge"}},"base":{"label":"Opentrons:edge","ref":"edge","sha":"930816ccc0f98800776ccc7af45fef7edf6b89de","user":{"login":"Opentrons","id":6139147,"avatar_url":"https://avatars2.githubusercontent.com/u/6139147?v=4","gravatar_id":"","url":"https://api.github.com/users/Opentrons","html_url":"https://github.com/Opentrons","followers_url":"https://api.github.com/users/Opentrons/followers","following_url":"https://api.github.com/users/Opentrons/following{/other_user}","gists_url":"https://api.github.com/users/Opentrons/gists{/gist_id}","starred_url":"https://api.github.com/users/Opentrons/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Opentrons/subscriptions","organizations_url":"https://api.github.com/users/Opentrons/orgs","repos_url":"https://api.github.com/users/Opentrons/repos","events_url":"https://api.github.com/users/Opentrons/events{/privacy}","received_events_url":"https://api.github.com/users/Opentrons/received_events","type":"Organization","site_admin":false},"repo":{"id":38644841,"name":"opentrons","full_name":"Opentrons/opentrons","owner":{"login":"Opentrons","id":6139147,"avatar_url":"https://avatars2.githubusercontent.com/u/6139147?v=4","gravatar_id":"","url":"https://api.github.com/users/Opentrons","html_url":"https://github.com/Opentrons","followers_url":"https://api.github.com/users/Opentrons/followers","following_url":"https://api.github.com/users/Opentrons/following{/other_user}","gists_url":"https://api.github.com/users/Opentrons/gists{/gist_id}","starred_url":"https://api.github.com/users/Opentrons/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Opentrons/subscriptions","organizations_url":"https://api.github.com/users/Opentrons/orgs","repos_url":"https://api.github.com/users/Opentrons/repos","events_url":"https://api.github.com/users/Opentrons/events{/privacy}","received_events_url":"https://api.github.com/users/Opentrons/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/Opentrons/opentrons","description":"Software for writing protocols and running them on Opentrons robots","fork":false,"url":"https://api.github.com/repos/Opentrons/opentrons","forks_url":"https://api.github.com/repos/Opentrons/opentrons/forks","keys_url":"https://api.github.com/repos/Opentrons/opentrons/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Opentrons/opentrons/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Opentrons/opentrons/teams","hooks_url":"https://api.github.com/repos/Opentrons/opentrons/hooks","issue_events_url":"https://api.github.com/repos/Opentrons/opentrons/issues/events{/number}","events_url":"https://api.github.com/repos/Opentrons/opentrons/events","assignees_url":"https://api.github.com/repos/Opentrons/opentrons/assignees{/user}","branches_url":"https://api.github.com/repos/Opentrons/opentrons/branches{/branch}","tags_url":"https://api.github.com/repos/Opentrons/opentrons/tags","blobs_url":"https://api.github.com/repos/Opentrons/opentrons/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Opentrons/opentrons/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Opentrons/opentrons/git/refs{/sha}","trees_url":"https://api.github.com/repos/Opentrons/opentrons/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Opentrons/opentrons/statuses/{sha}","languages_url":"https://api.github.com/repos/Opentrons/opentrons/languages","stargazers_url":"https://api.github.com/repos/Opentrons/opentrons/stargazers","contributors_url":"https://api.github.com/repos/Opentrons/opentrons/contributors","subscribers_url":"https://api.github.com/repos/Opentrons/opentrons/subscribers","subscription_url":"https://api.github.com/repos/Opentrons/opentrons/subscription","commits_url":"https://api.github.com/repos/Opentrons/opentrons/commits{/sha}","git_commits_url":"https://api.github.com/repos/Opentrons/opentrons/git/commits{/sha}","comments_url":"https://api.github.com/repos/Opentrons/opentrons/comments{/number}","issue_comment_url":"https://api.github.com/repos/Opentrons/opentrons/issues/comments{/number}","contents_url":"https://api.github.com/repos/Opentrons/opentrons/contents/{+path}","compare_url":"https://api.github.com/repos/Opentrons/opentrons/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Opentrons/opentrons/merges","archive_url":"https://api.github.com/repos/Opentrons/opentrons/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Opentrons/opentrons/downloads","issues_url":"https://api.github.com/repos/Opentrons/opentrons/issues{/number}","pulls_url":"https://api.github.com/repos/Opentrons/opentrons/pulls{/number}","milestones_url":"https://api.github.com/repos/Opentrons/opentrons/milestones{/number}","notifications_url":"https://api.github.com/repos/Opentrons/opentrons/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Opentrons/opentrons/labels{/name}","releases_url":"https://api.github.com/repos/Opentrons/opentrons/releases{/id}","deployments_url":"https://api.github.com/repos/Opentrons/opentrons/deployments","created_at":"2015-07-06T20:41:01Z","updated_at":"2018-02-27T23:56:39Z","pushed_at":"2018-02-28T22:06:19Z","git_url":"git://github.com/Opentrons/opentrons.git","ssh_url":"git@github.com:Opentrons/opentrons.git","clone_url":"https://github.com/Opentrons/opentrons.git","svn_url":"https://github.com/Opentrons/opentrons","homepage":"","size":18391,"stargazers_count":42,"watchers_count":42,"language":"JavaScript","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":28,"mirror_url":null,"archived":false,"open_issues_count":132,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0"},"forks":28,"open_issues":132,"watchers":42,"default_branch":"edge"}},"_links":{"self":{"href":"https://api.github.com/repos/Opentrons/opentrons/pulls/938"},"html":{"href":"https://github.com/Opentrons/opentrons/pull/938"},"issue":{"href":"https://api.github.com/repos/Opentrons/opentrons/issues/938"},"comments":{"href":"https://api.github.com/repos/Opentrons/opentrons/issues/938/comments"},"review_comments":{"href":"https://api.github.com/repos/Opentrons/opentrons/pulls/938/comments"},"review_comment":{"href":"https://api.github.com/repos/Opentrons/opentrons/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/Opentrons/opentrons/pulls/938/commits"},"statuses":{"href":"https://api.github.com/repos/Opentrons/opentrons/statuses/47ba9fe1abefc2d78a43ca23cf469f9df523a8ad"}},"author_association":"MEMBER"}}
{"actor":{"display_login":"mcous"}}