{"action":"created","comment":{"url":"https://api.github.com/repos/uPortal-Project/uportal-home/pulls/comments/174948138","pull_request_review_id":104398820,"id":174948138,"diff_hunk":"@@ -47,11 +47,127 @@ define(['angular', 'jquery'], function(angular, $) {\n     function($localStorage, $log, $sessionStorage,\n       $scope, $rootScope, layoutService) {\n       var vm = this;\n+\n+      /**\n+       * Log whenever a widget is moved\n+       * @param eventType {String} Kind of interaction that moved the widget\n+       * @param fname {String} The moved widget's fname\n+       * @param dropIndex {Number} Index where the widget landed\n+       * @param startIndex {Number} (optional) Index before moving the widget\n+       * @return {boolean}","path":"web/src/main/webapp/my-app/layout/controllers.js","position":11,"original_position":11,"commit_id":"1d8b272f38565a86891930e98169beca3e31dad0","original_commit_id":"1d8b272f38565a86891930e98169beca3e31dad0","user":{"login":"apetro","id":952283,"avatar_url":"https://avatars3.githubusercontent.com/u/952283?v=4","gravatar_id":"","url":"https://api.github.com/users/apetro","html_url":"https://github.com/apetro","followers_url":"https://api.github.com/users/apetro/followers","following_url":"https://api.github.com/users/apetro/following{/other_user}","gists_url":"https://api.github.com/users/apetro/gists{/gist_id}","starred_url":"https://api.github.com/users/apetro/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/apetro/subscriptions","organizations_url":"https://api.github.com/users/apetro/orgs","repos_url":"https://api.github.com/users/apetro/repos","events_url":"https://api.github.com/users/apetro/events{/privacy}","received_events_url":"https://api.github.com/users/apetro/received_events","type":"User","site_admin":false},"body":"What are the semantics of the boolean returned? `true` means what? `false` means what?","created_at":"2018-03-15T22:10:20Z","updated_at":"2018-03-15T22:10:20Z","html_url":"https://github.com/uPortal-Project/uportal-home/pull/795#discussion_r174948138","pull_request_url":"https://api.github.com/repos/uPortal-Project/uportal-home/pulls/795","author_association":"OWNER","_links":{"self":{"href":"https://api.github.com/repos/uPortal-Project/uportal-home/pulls/comments/174948138"},"html":{"href":"https://github.com/uPortal-Project/uportal-home/pull/795#discussion_r174948138"},"pull_request":{"href":"https://api.github.com/repos/uPortal-Project/uportal-home/pulls/795"}}},"pull_request":{"url":"https://api.github.com/repos/uPortal-Project/uportal-home/pulls/795","id":175315256,"html_url":"https://github.com/uPortal-Project/uportal-home/pull/795","diff_url":"https://github.com/uPortal-Project/uportal-home/pull/795.diff","patch_url":"https://github.com/uPortal-Project/uportal-home/pull/795.patch","issue_url":"https://api.github.com/repos/uPortal-Project/uportal-home/issues/795","number":795,"state":"open","locked":false,"title":"feat: add keyboard controls for widget layout","user":{"login":"thevoiceofzeke","id":5818702,"avatar_url":"https://avatars1.githubusercontent.com/u/5818702?v=4","gravatar_id":"","url":"https://api.github.com/users/thevoiceofzeke","html_url":"https://github.com/thevoiceofzeke","followers_url":"https://api.github.com/users/thevoiceofzeke/followers","following_url":"https://api.github.com/users/thevoiceofzeke/following{/other_user}","gists_url":"https://api.github.com/users/thevoiceofzeke/gists{/gist_id}","starred_url":"https://api.github.com/users/thevoiceofzeke/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/thevoiceofzeke/subscriptions","organizations_url":"https://api.github.com/users/thevoiceofzeke/orgs","repos_url":"https://api.github.com/users/thevoiceofzeke/repos","events_url":"https://api.github.com/users/thevoiceofzeke/events{/privacy}","received_events_url":"https://api.github.com/users/thevoiceofzeke/received_events","type":"User","site_admin":false},"body":"[MUMUP-3249](https://jira.doit.wisc.edu/jira/browse/MUMUP-3249): \"As a keyboard user I would like to re-order my layout so that I can customize my MyUW experience to my needs.\"\r\n\r\n**In this PR**:\r\n- Replace incompatible jQuery UI drag and drop implementation with angular-drag-and-drop-lists\r\n- Using arrow keys while focusing a widget will move it up or down in the layout order\r\n- Add initial focus point with aria label in list of widgets\r\n- Add controls for compact mode\r\n- Remove ui bootstrap layout implementation and replace with CSS-grid (with flex box fallback for unsupported browsers)\r\n\r\n**Related PR:** [uportal-app-framework#721](https://github.com/uPortal-Project/uportal-app-framework/pull/721)\r\n\r\n**Known bugs:**\r\n- Focus order is buggy when using keyboard to move widget up/left in the layout. The widget loses focus and focus is set on the widget after the moved widget's previous position\r\n- Placeholder for drag and drop doesn't look quite right for compact widgets\r\n\r\n## Demos\r\n\r\n### New drag and drop\r\n![draggable](https://user-images.githubusercontent.com/5818702/37478048-3ec40a26-2847-11e8-8dc0-9751a43fbbd0.gif)\r\n\r\n### Keyboard controls\r\n![keyboard-move](https://user-images.githubusercontent.com/5818702/37478060-43d11306-2847-11e8-8892-f389056da9ae.gif)\r\n\r\n### New responsive layout\r\n![new-layout](https://user-images.githubusercontent.com/5818702/37478075-4814f874-2847-11e8-924e-0fda8cd306f6.gif)\r\n\r\n----\r\n\r\nContributor License Agreement adherence:\r\n\r\n<!-- Place an x in the checkbox for YES. -->\r\n\r\n- [x] This Contribution is under the terms of Individual [Contributor License Agreements][] (and also Corporate Contributor License Agreements to the extent applicable) appearing in the [Apereo CLA roster][].\r\n\r\n[Apereo CLA roster]: http://licensing.apereo.org/completed-clas\r\n[Contributor License Agreements]: https://www.apereo.org/licensing/agreements\r\n","created_at":"2018-03-15T16:55:34Z","updated_at":"2018-03-15T22:10:20Z","closed_at":null,"merged_at":null,"merge_commit_sha":"32003e08020c2db2542205126750276ba73067f7","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/uPortal-Project/uportal-home/pulls/795/commits","review_comments_url":"https://api.github.com/repos/uPortal-Project/uportal-home/pulls/795/comments","review_comment_url":"https://api.github.com/repos/uPortal-Project/uportal-home/pulls/comments{/number}","comments_url":"https://api.github.com/repos/uPortal-Project/uportal-home/issues/795/comments","statuses_url":"https://api.github.com/repos/uPortal-Project/uportal-home/statuses/1d8b272f38565a86891930e98169beca3e31dad0","head":{"label":"thevoiceofzeke:keyboard-control","ref":"keyboard-control","sha":"1d8b272f38565a86891930e98169beca3e31dad0","user":{"login":"thevoiceofzeke","id":5818702,"avatar_url":"https://avatars1.githubusercontent.com/u/5818702?v=4","gravatar_id":"","url":"https://api.github.com/users/thevoiceofzeke","html_url":"https://github.com/thevoiceofzeke","followers_url":"https://api.github.com/users/thevoiceofzeke/followers","following_url":"https://api.github.com/users/thevoiceofzeke/following{/other_user}","gists_url":"https://api.github.com/users/thevoiceofzeke/gists{/gist_id}","starred_url":"https://api.github.com/users/thevoiceofzeke/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/thevoiceofzeke/subscriptions","organizations_url":"https://api.github.com/users/thevoiceofzeke/orgs","repos_url":"https://api.github.com/users/thevoiceofzeke/repos","events_url":"https://api.github.com/users/thevoiceofzeke/events{/privacy}","received_events_url":"https://api.github.com/users/thevoiceofzeke/received_events","type":"User","site_admin":false},"repo":{"id":105169186,"name":"uportal-home","full_name":"thevoiceofzeke/uportal-home","owner":{"login":"thevoiceofzeke","id":5818702,"avatar_url":"https://avatars1.githubusercontent.com/u/5818702?v=4","gravatar_id":"","url":"https://api.github.com/users/thevoiceofzeke","html_url":"https://github.com/thevoiceofzeke","followers_url":"https://api.github.com/users/thevoiceofzeke/followers","following_url":"https://api.github.com/users/thevoiceofzeke/following{/other_user}","gists_url":"https://api.github.com/users/thevoiceofzeke/gists{/gist_id}","starred_url":"https://api.github.com/users/thevoiceofzeke/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/thevoiceofzeke/subscriptions","organizations_url":"https://api.github.com/users/thevoiceofzeke/orgs","repos_url":"https://api.github.com/users/thevoiceofzeke/repos","events_url":"https://api.github.com/users/thevoiceofzeke/events{/privacy}","received_events_url":"https://api.github.com/users/thevoiceofzeke/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/thevoiceofzeke/uportal-home","description":"AngularJS alternative UI for Apereo uPortal (built for MyUW)","fork":true,"url":"https://api.github.com/repos/thevoiceofzeke/uportal-home","forks_url":"https://api.github.com/repos/thevoiceofzeke/uportal-home/forks","keys_url":"https://api.github.com/repos/thevoiceofzeke/uportal-home/keys{/key_id}","collaborators_url":"https://api.github.com/repos/thevoiceofzeke/uportal-home/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/thevoiceofzeke/uportal-home/teams","hooks_url":"https://api.github.com/repos/thevoiceofzeke/uportal-home/hooks","issue_events_url":"https://api.github.com/repos/thevoiceofzeke/uportal-home/issues/events{/number}","events_url":"https://api.github.com/repos/thevoiceofzeke/uportal-home/events","assignees_url":"https://api.github.com/repos/thevoiceofzeke/uportal-home/assignees{/user}","branches_url":"https://api.github.com/repos/thevoiceofzeke/uportal-home/branches{/branch}","tags_url":"https://api.github.com/repos/thevoiceofzeke/uportal-home/tags","blobs_url":"https://api.github.com/repos/thevoiceofzeke/uportal-home/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/thevoiceofzeke/uportal-home/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/thevoiceofzeke/uportal-home/git/refs{/sha}","trees_url":"https://api.github.com/repos/thevoiceofzeke/uportal-home/git/trees{/sha}","statuses_url":"https://api.github.com/repos/thevoiceofzeke/uportal-home/statuses/{sha}","languages_url":"https://api.github.com/repos/thevoiceofzeke/uportal-home/languages","stargazers_url":"https://api.github.com/repos/thevoiceofzeke/uportal-home/stargazers","contributors_url":"https://api.github.com/repos/thevoiceofzeke/uportal-home/contributors","subscribers_url":"https://api.github.com/repos/thevoiceofzeke/uportal-home/subscribers","subscription_url":"https://api.github.com/repos/thevoiceofzeke/uportal-home/subscription","commits_url":"https://api.github.com/repos/thevoiceofzeke/uportal-home/commits{/sha}","git_commits_url":"https://api.github.com/repos/thevoiceofzeke/uportal-home/git/commits{/sha}","comments_url":"https://api.github.com/repos/thevoiceofzeke/uportal-home/comments{/number}","issue_comment_url":"https://api.github.com/repos/thevoiceofzeke/uportal-home/issues/comments{/number}","contents_url":"https://api.github.com/repos/thevoiceofzeke/uportal-home/contents/{+path}","compare_url":"https://api.github.com/repos/thevoiceofzeke/uportal-home/compare/{base}...{head}","merges_url":"https://api.github.com/repos/thevoiceofzeke/uportal-home/merges","archive_url":"https://api.github.com/repos/thevoiceofzeke/uportal-home/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/thevoiceofzeke/uportal-home/downloads","issues_url":"https://api.github.com/repos/thevoiceofzeke/uportal-home/issues{/number}","pulls_url":"https://api.github.com/repos/thevoiceofzeke/uportal-home/pulls{/number}","milestones_url":"https://api.github.com/repos/thevoiceofzeke/uportal-home/milestones{/number}","notifications_url":"https://api.github.com/repos/thevoiceofzeke/uportal-home/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/thevoiceofzeke/uportal-home/labels{/name}","releases_url":"https://api.github.com/repos/thevoiceofzeke/uportal-home/releases{/id}","deployments_url":"https://api.github.com/repos/thevoiceofzeke/uportal-home/deployments","created_at":"2017-09-28T16:00:47Z","updated_at":"2018-03-14T14:55:50Z","pushed_at":"2018-03-15T17:39:36Z","git_url":"git://github.com/thevoiceofzeke/uportal-home.git","ssh_url":"git@github.com:thevoiceofzeke/uportal-home.git","clone_url":"https://github.com/thevoiceofzeke/uportal-home.git","svn_url":"https://github.com/thevoiceofzeke/uportal-home","homepage":"http://uportal-project.github.io/uportal-home/","size":24021,"stargazers_count":0,"watchers_count":0,"language":"JavaScript","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":null,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"uPortal-Project:master","ref":"master","sha":"eb5bfd6b39f3fea320d736cc65aa9a317ea24994","user":{"login":"uPortal-Project","id":19936409,"avatar_url":"https://avatars0.githubusercontent.com/u/19936409?v=4","gravatar_id":"","url":"https://api.github.com/users/uPortal-Project","html_url":"https://github.com/uPortal-Project","followers_url":"https://api.github.com/users/uPortal-Project/followers","following_url":"https://api.github.com/users/uPortal-Project/following{/other_user}","gists_url":"https://api.github.com/users/uPortal-Project/gists{/gist_id}","starred_url":"https://api.github.com/users/uPortal-Project/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/uPortal-Project/subscriptions","organizations_url":"https://api.github.com/users/uPortal-Project/orgs","repos_url":"https://api.github.com/users/uPortal-Project/repos","events_url":"https://api.github.com/users/uPortal-Project/events{/privacy}","received_events_url":"https://api.github.com/users/uPortal-Project/received_events","type":"Organization","site_admin":false},"repo":{"id":24428594,"name":"uportal-home","full_name":"uPortal-Project/uportal-home","owner":{"login":"uPortal-Project","id":19936409,"avatar_url":"https://avatars0.githubusercontent.com/u/19936409?v=4","gravatar_id":"","url":"https://api.github.com/users/uPortal-Project","html_url":"https://github.com/uPortal-Project","followers_url":"https://api.github.com/users/uPortal-Project/followers","following_url":"https://api.github.com/users/uPortal-Project/following{/other_user}","gists_url":"https://api.github.com/users/uPortal-Project/gists{/gist_id}","starred_url":"https://api.github.com/users/uPortal-Project/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/uPortal-Project/subscriptions","organizations_url":"https://api.github.com/users/uPortal-Project/orgs","repos_url":"https://api.github.com/users/uPortal-Project/repos","events_url":"https://api.github.com/users/uPortal-Project/events{/privacy}","received_events_url":"https://api.github.com/users/uPortal-Project/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/uPortal-Project/uportal-home","description":"Alternative UI for Apereo uPortal (originally built for MyUW)","fork":false,"url":"https://api.github.com/repos/uPortal-Project/uportal-home","forks_url":"https://api.github.com/repos/uPortal-Project/uportal-home/forks","keys_url":"https://api.github.com/repos/uPortal-Project/uportal-home/keys{/key_id}","collaborators_url":"https://api.github.com/repos/uPortal-Project/uportal-home/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/uPortal-Project/uportal-home/teams","hooks_url":"https://api.github.com/repos/uPortal-Project/uportal-home/hooks","issue_events_url":"https://api.github.com/repos/uPortal-Project/uportal-home/issues/events{/number}","events_url":"https://api.github.com/repos/uPortal-Project/uportal-home/events","assignees_url":"https://api.github.com/repos/uPortal-Project/uportal-home/assignees{/user}","branches_url":"https://api.github.com/repos/uPortal-Project/uportal-home/branches{/branch}","tags_url":"https://api.github.com/repos/uPortal-Project/uportal-home/tags","blobs_url":"https://api.github.com/repos/uPortal-Project/uportal-home/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/uPortal-Project/uportal-home/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/uPortal-Project/uportal-home/git/refs{/sha}","trees_url":"https://api.github.com/repos/uPortal-Project/uportal-home/git/trees{/sha}","statuses_url":"https://api.github.com/repos/uPortal-Project/uportal-home/statuses/{sha}","languages_url":"https://api.github.com/repos/uPortal-Project/uportal-home/languages","stargazers_url":"https://api.github.com/repos/uPortal-Project/uportal-home/stargazers","contributors_url":"https://api.github.com/repos/uPortal-Project/uportal-home/contributors","subscribers_url":"https://api.github.com/repos/uPortal-Project/uportal-home/subscribers","subscription_url":"https://api.github.com/repos/uPortal-Project/uportal-home/subscription","commits_url":"https://api.github.com/repos/uPortal-Project/uportal-home/commits{/sha}","git_commits_url":"https://api.github.com/repos/uPortal-Project/uportal-home/git/commits{/sha}","comments_url":"https://api.github.com/repos/uPortal-Project/uportal-home/comments{/number}","issue_comment_url":"https://api.github.com/repos/uPortal-Project/uportal-home/issues/comments{/number}","contents_url":"https://api.github.com/repos/uPortal-Project/uportal-home/contents/{+path}","compare_url":"https://api.github.com/repos/uPortal-Project/uportal-home/compare/{base}...{head}","merges_url":"https://api.github.com/repos/uPortal-Project/uportal-home/merges","archive_url":"https://api.github.com/repos/uPortal-Project/uportal-home/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/uPortal-Project/uportal-home/downloads","issues_url":"https://api.github.com/repos/uPortal-Project/uportal-home/issues{/number}","pulls_url":"https://api.github.com/repos/uPortal-Project/uportal-home/pulls{/number}","milestones_url":"https://api.github.com/repos/uPortal-Project/uportal-home/milestones{/number}","notifications_url":"https://api.github.com/repos/uPortal-Project/uportal-home/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/uPortal-Project/uportal-home/labels{/name}","releases_url":"https://api.github.com/repos/uPortal-Project/uportal-home/releases{/id}","deployments_url":"https://api.github.com/repos/uPortal-Project/uportal-home/deployments","created_at":"2014-09-24T19:04:44Z","updated_at":"2018-03-15T17:21:26Z","pushed_at":"2018-03-15T17:39:38Z","git_url":"git://github.com/uPortal-Project/uportal-home.git","ssh_url":"git@github.com:uPortal-Project/uportal-home.git","clone_url":"https://github.com/uPortal-Project/uportal-home.git","svn_url":"https://github.com/uPortal-Project/uportal-home","homepage":"http://uportal-project.github.io/uportal-home/","size":16801,"stargazers_count":23,"watchers_count":23,"language":"JavaScript","has_issues":true,"has_projects":false,"has_downloads":true,"has_wiki":false,"has_pages":true,"forks_count":25,"mirror_url":null,"archived":false,"open_issues_count":20,"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":25,"open_issues":20,"watchers":23,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/uPortal-Project/uportal-home/pulls/795"},"html":{"href":"https://github.com/uPortal-Project/uportal-home/pull/795"},"issue":{"href":"https://api.github.com/repos/uPortal-Project/uportal-home/issues/795"},"comments":{"href":"https://api.github.com/repos/uPortal-Project/uportal-home/issues/795/comments"},"review_comments":{"href":"https://api.github.com/repos/uPortal-Project/uportal-home/pulls/795/comments"},"review_comment":{"href":"https://api.github.com/repos/uPortal-Project/uportal-home/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/uPortal-Project/uportal-home/pulls/795/commits"},"statuses":{"href":"https://api.github.com/repos/uPortal-Project/uportal-home/statuses/1d8b272f38565a86891930e98169beca3e31dad0"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"apetro"}}