{"action":"created","comment":{"url":"https://api.github.com/repos/code-dot-org/code-dot-org/pulls/comments/66325939","id":66325939,"diff_hunk":"@@ -157,58 +159,68 @@ window.dashboard.dialog = (function () {\n    * @param {function(boolean)} onComplete Optional callback function to call when\n    *     the server call completes, which receives a boolean indicating whether\n    *     the browser will redirect to a new location after it is called.\n+   * @param {function(function)} beforeHook Optional callback function to call\n+   *     before processResults gets underway. This function must call the completion\n+   *     function passed as the parameter to complete the processResults call.\n    */\n   // TODO(dave): move this logic into appOptions.onAttempt for levels of type\n-  // external (including pixelation), multi, match, free_response, level_group,\n-  // and any others which render 'levels/dialog'.\n-  var processResults = function (onComplete) {\n-    var results = getResult();\n-    var response = results.response;\n-    var result = results.result;\n-    var errorType = results.errorType;\n-    var testResult = results.testResult ? results.testResult : (result ? 100 : 0);\n-    var submitted = results.submitted || false;\n-\n-\n-    if (!result) {\n-      showDialog(errorType || \"error\");\n-      if (!appOptions.dialog.skipSound) {\n-        CDOSounds.play('failure');\n-      }\n+  // external (including pixelation), multi, match, and any others","path":"code-studio/src/js/levels/dialogHelper.js","position":56,"original_position":56,"commit_id":"e7f750ad2c42dc9eb9fba6671cc77f27124a7943","original_commit_id":"57667303f097630f3713729a650b34853444dd4f","user":{"login":"cpirich","id":5429146,"avatar_url":"https://avatars.githubusercontent.com/u/5429146?v=3","gravatar_id":"","url":"https://api.github.com/users/cpirich","html_url":"https://github.com/cpirich","followers_url":"https://api.github.com/users/cpirich/followers","following_url":"https://api.github.com/users/cpirich/following{/other_user}","gists_url":"https://api.github.com/users/cpirich/gists{/gist_id}","starred_url":"https://api.github.com/users/cpirich/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cpirich/subscriptions","organizations_url":"https://api.github.com/users/cpirich/orgs","repos_url":"https://api.github.com/users/cpirich/repos","events_url":"https://api.github.com/users/cpirich/events{/privacy}","received_events_url":"https://api.github.com/users/cpirich/received_events","type":"User","site_admin":false},"body":"nope, that was a merge issue. thanks!","created_at":"2016-06-08T19:48:10Z","updated_at":"2016-06-08T19:48:10Z","html_url":"https://github.com/code-dot-org/code-dot-org/pull/8826#discussion_r66325939","pull_request_url":"https://api.github.com/repos/code-dot-org/code-dot-org/pulls/8826","_links":{"self":{"href":"https://api.github.com/repos/code-dot-org/code-dot-org/pulls/comments/66325939"},"html":{"href":"https://github.com/code-dot-org/code-dot-org/pull/8826#discussion_r66325939"},"pull_request":{"href":"https://api.github.com/repos/code-dot-org/code-dot-org/pulls/8826"}}},"pull_request":{"url":"https://api.github.com/repos/code-dot-org/code-dot-org/pulls/8826","id":73090633,"html_url":"https://github.com/code-dot-org/code-dot-org/pull/8826","diff_url":"https://github.com/code-dot-org/code-dot-org/pull/8826.diff","patch_url":"https://github.com/code-dot-org/code-dot-org/pull/8826.patch","issue_url":"https://api.github.com/repos/code-dot-org/code-dot-org/issues/8826","number":8826,"state":"open","locked":false,"title":"Level group submit milestone on sublevels [test ui]","user":{"login":"cpirich","id":5429146,"avatar_url":"https://avatars.githubusercontent.com/u/5429146?v=3","gravatar_id":"","url":"https://api.github.com/users/cpirich","html_url":"https://github.com/cpirich","followers_url":"https://api.github.com/users/cpirich/followers","following_url":"https://api.github.com/users/cpirich/following{/other_user}","gists_url":"https://api.github.com/users/cpirich/gists{/gist_id}","starred_url":"https://api.github.com/users/cpirich/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cpirich/subscriptions","organizations_url":"https://api.github.com/users/cpirich/orgs","repos_url":"https://api.github.com/users/cpirich/repos","events_url":"https://api.github.com/users/cpirich/events{/privacy}","received_events_url":"https://api.github.com/users/cpirich/received_events","type":"User","site_admin":false},"body":"Level groups previously submitted all of their level data as one large JSON object in a milestone post against the top-level \"level group\" level id. In order to achieve consistency with a variety of other \"nested\" or \"sublevel\" scenarios, we are moving to a model where the responses (activity records) are created for each sublevel (in this case, the individual multi, match, or free response questions). The top-level \"level group\" level will still be used to track the \"submitted\" state for the assessment, but the `program` part of the payload will not be important. The first step in this transition is to submit `milestone` posts to the individual sublevels. The top-level \"level group\" level will still see the same `milestone` post with the large JSON object for now.\r\n* Modify how `UserLevel` records are created for the `milestone_script_level` post when both `script_level_id` and `level_id` are supplied. The `script_level_id` is used to extract the `script_id`, but the `level_id` used in `track_level_progress_async` now comes from the specified level.\r\n* Supply a `sublevelCallback` URL in the `dialogOptions` object for level group levels\r\n* Extend `processResults()` and `saveAnswers()` to accept a `beforeHook` parameter (an optional function to call before processResults/saveAnswers gets underway). This allows us to jump in and submit the sublevel `milestone` posts at the normal time.\r\n* For level group, implement a new `submitSublevelResults()` function to send sublevel milestone posts in parallel. When they are all complete, the top-level `milestone` post can proceed.\r\n* Extend `sendReport()` to allow concurrent posts when `allowMultipleSends` is true.\r\n* Extend `answerChangedFn()`, `throttledSaveAnswers()`, and `saveAnswers()` to allow an additional `subLevelIdChanged` parameter so we can be more specific about which milestone posts should occur in response to an answer changing. When that parameter is not specified, all sublevels on the page are submitted. When it is specified, only the sublevel that change is posted. In both cases, the top-level \"level group\" level post also occurs. \r\n* Extend `TextMatch` and `Multi` to accept their `levelId` in the constructor (previously, they only had their DOM id, which was similar). This allows them to call `answerChangedFn()` with their own level id.\r\n","created_at":"2016-06-08T17:49:24Z","updated_at":"2016-06-08T19:48:10Z","closed_at":null,"merged_at":null,"merge_commit_sha":"de3ec0111826464821fae6f42c9aeb3fc09fd2de","assignee":{"login":"laurelfan","id":7763,"avatar_url":"https://avatars.githubusercontent.com/u/7763?v=3","gravatar_id":"","url":"https://api.github.com/users/laurelfan","html_url":"https://github.com/laurelfan","followers_url":"https://api.github.com/users/laurelfan/followers","following_url":"https://api.github.com/users/laurelfan/following{/other_user}","gists_url":"https://api.github.com/users/laurelfan/gists{/gist_id}","starred_url":"https://api.github.com/users/laurelfan/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/laurelfan/subscriptions","organizations_url":"https://api.github.com/users/laurelfan/orgs","repos_url":"https://api.github.com/users/laurelfan/repos","events_url":"https://api.github.com/users/laurelfan/events{/privacy}","received_events_url":"https://api.github.com/users/laurelfan/received_events","type":"User","site_admin":false},"milestone":null,"commits_url":"https://api.github.com/repos/code-dot-org/code-dot-org/pulls/8826/commits","review_comments_url":"https://api.github.com/repos/code-dot-org/code-dot-org/pulls/8826/comments","review_comment_url":"https://api.github.com/repos/code-dot-org/code-dot-org/pulls/comments{/number}","comments_url":"https://api.github.com/repos/code-dot-org/code-dot-org/issues/8826/comments","statuses_url":"https://api.github.com/repos/code-dot-org/code-dot-org/statuses/e7f750ad2c42dc9eb9fba6671cc77f27124a7943","head":{"label":"code-dot-org:level_group_submit_milestone_on_sublevels","ref":"level_group_submit_milestone_on_sublevels","sha":"e7f750ad2c42dc9eb9fba6671cc77f27124a7943","user":{"login":"code-dot-org","id":5124627,"avatar_url":"https://avatars.githubusercontent.com/u/5124627?v=3","gravatar_id":"","url":"https://api.github.com/users/code-dot-org","html_url":"https://github.com/code-dot-org","followers_url":"https://api.github.com/users/code-dot-org/followers","following_url":"https://api.github.com/users/code-dot-org/following{/other_user}","gists_url":"https://api.github.com/users/code-dot-org/gists{/gist_id}","starred_url":"https://api.github.com/users/code-dot-org/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/code-dot-org/subscriptions","organizations_url":"https://api.github.com/users/code-dot-org/orgs","repos_url":"https://api.github.com/users/code-dot-org/repos","events_url":"https://api.github.com/users/code-dot-org/events{/privacy}","received_events_url":"https://api.github.com/users/code-dot-org/received_events","type":"Organization","site_admin":false},"repo":{"id":24250009,"name":"code-dot-org","full_name":"code-dot-org/code-dot-org","owner":{"login":"code-dot-org","id":5124627,"avatar_url":"https://avatars.githubusercontent.com/u/5124627?v=3","gravatar_id":"","url":"https://api.github.com/users/code-dot-org","html_url":"https://github.com/code-dot-org","followers_url":"https://api.github.com/users/code-dot-org/followers","following_url":"https://api.github.com/users/code-dot-org/following{/other_user}","gists_url":"https://api.github.com/users/code-dot-org/gists{/gist_id}","starred_url":"https://api.github.com/users/code-dot-org/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/code-dot-org/subscriptions","organizations_url":"https://api.github.com/users/code-dot-org/orgs","repos_url":"https://api.github.com/users/code-dot-org/repos","events_url":"https://api.github.com/users/code-dot-org/events{/privacy}","received_events_url":"https://api.github.com/users/code-dot-org/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/code-dot-org/code-dot-org","description":"The code powering code.org and studio.code.org","fork":false,"url":"https://api.github.com/repos/code-dot-org/code-dot-org","forks_url":"https://api.github.com/repos/code-dot-org/code-dot-org/forks","keys_url":"https://api.github.com/repos/code-dot-org/code-dot-org/keys{/key_id}","collaborators_url":"https://api.github.com/repos/code-dot-org/code-dot-org/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/code-dot-org/code-dot-org/teams","hooks_url":"https://api.github.com/repos/code-dot-org/code-dot-org/hooks","issue_events_url":"https://api.github.com/repos/code-dot-org/code-dot-org/issues/events{/number}","events_url":"https://api.github.com/repos/code-dot-org/code-dot-org/events","assignees_url":"https://api.github.com/repos/code-dot-org/code-dot-org/assignees{/user}","branches_url":"https://api.github.com/repos/code-dot-org/code-dot-org/branches{/branch}","tags_url":"https://api.github.com/repos/code-dot-org/code-dot-org/tags","blobs_url":"https://api.github.com/repos/code-dot-org/code-dot-org/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/code-dot-org/code-dot-org/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/code-dot-org/code-dot-org/git/refs{/sha}","trees_url":"https://api.github.com/repos/code-dot-org/code-dot-org/git/trees{/sha}","statuses_url":"https://api.github.com/repos/code-dot-org/code-dot-org/statuses/{sha}","languages_url":"https://api.github.com/repos/code-dot-org/code-dot-org/languages","stargazers_url":"https://api.github.com/repos/code-dot-org/code-dot-org/stargazers","contributors_url":"https://api.github.com/repos/code-dot-org/code-dot-org/contributors","subscribers_url":"https://api.github.com/repos/code-dot-org/code-dot-org/subscribers","subscription_url":"https://api.github.com/repos/code-dot-org/code-dot-org/subscription","commits_url":"https://api.github.com/repos/code-dot-org/code-dot-org/commits{/sha}","git_commits_url":"https://api.github.com/repos/code-dot-org/code-dot-org/git/commits{/sha}","comments_url":"https://api.github.com/repos/code-dot-org/code-dot-org/comments{/number}","issue_comment_url":"https://api.github.com/repos/code-dot-org/code-dot-org/issues/comments{/number}","contents_url":"https://api.github.com/repos/code-dot-org/code-dot-org/contents/{+path}","compare_url":"https://api.github.com/repos/code-dot-org/code-dot-org/compare/{base}...{head}","merges_url":"https://api.github.com/repos/code-dot-org/code-dot-org/merges","archive_url":"https://api.github.com/repos/code-dot-org/code-dot-org/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/code-dot-org/code-dot-org/downloads","issues_url":"https://api.github.com/repos/code-dot-org/code-dot-org/issues{/number}","pulls_url":"https://api.github.com/repos/code-dot-org/code-dot-org/pulls{/number}","milestones_url":"https://api.github.com/repos/code-dot-org/code-dot-org/milestones{/number}","notifications_url":"https://api.github.com/repos/code-dot-org/code-dot-org/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/code-dot-org/code-dot-org/labels{/name}","releases_url":"https://api.github.com/repos/code-dot-org/code-dot-org/releases{/id}","deployments_url":"https://api.github.com/repos/code-dot-org/code-dot-org/deployments","created_at":"2014-09-20T00:46:11Z","updated_at":"2016-05-30T09:44:27Z","pushed_at":"2016-06-08T19:45:45Z","git_url":"git://github.com/code-dot-org/code-dot-org.git","ssh_url":"git@github.com:code-dot-org/code-dot-org.git","clone_url":"https://github.com/code-dot-org/code-dot-org.git","svn_url":"https://github.com/code-dot-org/code-dot-org","homepage":"http://code.org","size":4727569,"stargazers_count":119,"watchers_count":119,"language":"JavaScript","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":72,"mirror_url":null,"open_issues_count":46,"forks":72,"open_issues":46,"watchers":119,"default_branch":"staging"}},"base":{"label":"code-dot-org:staging","ref":"staging","sha":"8bf6429839de12c668eeb1770a6145b59c8a4b8d","user":{"login":"code-dot-org","id":5124627,"avatar_url":"https://avatars.githubusercontent.com/u/5124627?v=3","gravatar_id":"","url":"https://api.github.com/users/code-dot-org","html_url":"https://github.com/code-dot-org","followers_url":"https://api.github.com/users/code-dot-org/followers","following_url":"https://api.github.com/users/code-dot-org/following{/other_user}","gists_url":"https://api.github.com/users/code-dot-org/gists{/gist_id}","starred_url":"https://api.github.com/users/code-dot-org/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/code-dot-org/subscriptions","organizations_url":"https://api.github.com/users/code-dot-org/orgs","repos_url":"https://api.github.com/users/code-dot-org/repos","events_url":"https://api.github.com/users/code-dot-org/events{/privacy}","received_events_url":"https://api.github.com/users/code-dot-org/received_events","type":"Organization","site_admin":false},"repo":{"id":24250009,"name":"code-dot-org","full_name":"code-dot-org/code-dot-org","owner":{"login":"code-dot-org","id":5124627,"avatar_url":"https://avatars.githubusercontent.com/u/5124627?v=3","gravatar_id":"","url":"https://api.github.com/users/code-dot-org","html_url":"https://github.com/code-dot-org","followers_url":"https://api.github.com/users/code-dot-org/followers","following_url":"https://api.github.com/users/code-dot-org/following{/other_user}","gists_url":"https://api.github.com/users/code-dot-org/gists{/gist_id}","starred_url":"https://api.github.com/users/code-dot-org/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/code-dot-org/subscriptions","organizations_url":"https://api.github.com/users/code-dot-org/orgs","repos_url":"https://api.github.com/users/code-dot-org/repos","events_url":"https://api.github.com/users/code-dot-org/events{/privacy}","received_events_url":"https://api.github.com/users/code-dot-org/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/code-dot-org/code-dot-org","description":"The code powering code.org and studio.code.org","fork":false,"url":"https://api.github.com/repos/code-dot-org/code-dot-org","forks_url":"https://api.github.com/repos/code-dot-org/code-dot-org/forks","keys_url":"https://api.github.com/repos/code-dot-org/code-dot-org/keys{/key_id}","collaborators_url":"https://api.github.com/repos/code-dot-org/code-dot-org/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/code-dot-org/code-dot-org/teams","hooks_url":"https://api.github.com/repos/code-dot-org/code-dot-org/hooks","issue_events_url":"https://api.github.com/repos/code-dot-org/code-dot-org/issues/events{/number}","events_url":"https://api.github.com/repos/code-dot-org/code-dot-org/events","assignees_url":"https://api.github.com/repos/code-dot-org/code-dot-org/assignees{/user}","branches_url":"https://api.github.com/repos/code-dot-org/code-dot-org/branches{/branch}","tags_url":"https://api.github.com/repos/code-dot-org/code-dot-org/tags","blobs_url":"https://api.github.com/repos/code-dot-org/code-dot-org/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/code-dot-org/code-dot-org/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/code-dot-org/code-dot-org/git/refs{/sha}","trees_url":"https://api.github.com/repos/code-dot-org/code-dot-org/git/trees{/sha}","statuses_url":"https://api.github.com/repos/code-dot-org/code-dot-org/statuses/{sha}","languages_url":"https://api.github.com/repos/code-dot-org/code-dot-org/languages","stargazers_url":"https://api.github.com/repos/code-dot-org/code-dot-org/stargazers","contributors_url":"https://api.github.com/repos/code-dot-org/code-dot-org/contributors","subscribers_url":"https://api.github.com/repos/code-dot-org/code-dot-org/subscribers","subscription_url":"https://api.github.com/repos/code-dot-org/code-dot-org/subscription","commits_url":"https://api.github.com/repos/code-dot-org/code-dot-org/commits{/sha}","git_commits_url":"https://api.github.com/repos/code-dot-org/code-dot-org/git/commits{/sha}","comments_url":"https://api.github.com/repos/code-dot-org/code-dot-org/comments{/number}","issue_comment_url":"https://api.github.com/repos/code-dot-org/code-dot-org/issues/comments{/number}","contents_url":"https://api.github.com/repos/code-dot-org/code-dot-org/contents/{+path}","compare_url":"https://api.github.com/repos/code-dot-org/code-dot-org/compare/{base}...{head}","merges_url":"https://api.github.com/repos/code-dot-org/code-dot-org/merges","archive_url":"https://api.github.com/repos/code-dot-org/code-dot-org/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/code-dot-org/code-dot-org/downloads","issues_url":"https://api.github.com/repos/code-dot-org/code-dot-org/issues{/number}","pulls_url":"https://api.github.com/repos/code-dot-org/code-dot-org/pulls{/number}","milestones_url":"https://api.github.com/repos/code-dot-org/code-dot-org/milestones{/number}","notifications_url":"https://api.github.com/repos/code-dot-org/code-dot-org/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/code-dot-org/code-dot-org/labels{/name}","releases_url":"https://api.github.com/repos/code-dot-org/code-dot-org/releases{/id}","deployments_url":"https://api.github.com/repos/code-dot-org/code-dot-org/deployments","created_at":"2014-09-20T00:46:11Z","updated_at":"2016-05-30T09:44:27Z","pushed_at":"2016-06-08T19:45:45Z","git_url":"git://github.com/code-dot-org/code-dot-org.git","ssh_url":"git@github.com:code-dot-org/code-dot-org.git","clone_url":"https://github.com/code-dot-org/code-dot-org.git","svn_url":"https://github.com/code-dot-org/code-dot-org","homepage":"http://code.org","size":4727569,"stargazers_count":119,"watchers_count":119,"language":"JavaScript","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":72,"mirror_url":null,"open_issues_count":46,"forks":72,"open_issues":46,"watchers":119,"default_branch":"staging"}},"_links":{"self":{"href":"https://api.github.com/repos/code-dot-org/code-dot-org/pulls/8826"},"html":{"href":"https://github.com/code-dot-org/code-dot-org/pull/8826"},"issue":{"href":"https://api.github.com/repos/code-dot-org/code-dot-org/issues/8826"},"comments":{"href":"https://api.github.com/repos/code-dot-org/code-dot-org/issues/8826/comments"},"review_comments":{"href":"https://api.github.com/repos/code-dot-org/code-dot-org/pulls/8826/comments"},"review_comment":{"href":"https://api.github.com/repos/code-dot-org/code-dot-org/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/code-dot-org/code-dot-org/pulls/8826/commits"},"statuses":{"href":"https://api.github.com/repos/code-dot-org/code-dot-org/statuses/e7f750ad2c42dc9eb9fba6671cc77f27124a7943"}}}}
{"actor":{"display_login":"cpirich"}}