1
0
Fork 0
mirror of https://we.phorge.it/source/phorge.git synced 2024-11-22 23:02:42 +01:00

Add more keyboard navigation options for inline comments

Summary:
  - Use n/p to jump between comments.
  - Use r to reply to the selected comment.
  - Use e to edit the selected comment.

Test Plan: Verified n, p, r, e, j, k, J, K, "click edit" and "click reply"
behavior in as many weird cases as I could come up with.

Reviewers: btrahan, jungejason, nh, cpiro, jl

Reviewed By: btrahan

CC: aran, btrahan, epriestley

Maniphest Tasks: T583

Differential Revision: https://secure.phabricator.com/D1308
This commit is contained in:
epriestley 2012-01-04 08:21:22 -08:00
parent 275472d70f
commit 1c1fe96bec
3 changed files with 139 additions and 71 deletions

View file

@ -330,6 +330,17 @@ celerity_register_resource_map(array(
), ),
'disk' => '/rsrc/js/javelin/lib/behavior.js', 'disk' => '/rsrc/js/javelin/lib/behavior.js',
), ),
0 =>
array(
'uri' => '/res/b6096fdd/rsrc/js/javelin/lib/__tests__/URI.js',
'type' => 'js',
'requires' =>
array(
0 => 'javelin-uri',
1 => 'javelin-php-serializer',
),
'disk' => '/rsrc/js/javelin/lib/__tests__/URI.js',
),
'javelin-behavior-aphront-basic-tokenizer' => 'javelin-behavior-aphront-basic-tokenizer' =>
array( array(
'uri' => '/res/9be30797/rsrc/js/application/core/behavior-tokenizer.js', 'uri' => '/res/9be30797/rsrc/js/application/core/behavior-tokenizer.js',
@ -461,7 +472,7 @@ celerity_register_resource_map(array(
), ),
'javelin-behavior-differential-edit-inline-comments' => 'javelin-behavior-differential-edit-inline-comments' =>
array( array(
'uri' => '/res/b1168479/rsrc/js/application/differential/behavior-edit-inline-comments.js', 'uri' => '/res/c24338ce/rsrc/js/application/differential/behavior-edit-inline-comments.js',
'type' => 'js', 'type' => 'js',
'requires' => 'requires' =>
array( array(
@ -491,13 +502,14 @@ celerity_register_resource_map(array(
), ),
'javelin-behavior-differential-keyboard-navigation' => 'javelin-behavior-differential-keyboard-navigation' =>
array( array(
'uri' => '/res/e36415a2/rsrc/js/application/differential/behavior-keyboard-nav.js', 'uri' => '/res/f5ce5987/rsrc/js/application/differential/behavior-keyboard-nav.js',
'type' => 'js', 'type' => 'js',
'requires' => 'requires' =>
array( array(
0 => 'javelin-behavior', 0 => 'javelin-behavior',
1 => 'javelin-dom', 1 => 'javelin-dom',
2 => 'phabricator-keyboard-shortcut', 2 => 'javelin-stratcom',
3 => 'phabricator-keyboard-shortcut',
), ),
'disk' => '/rsrc/js/application/differential/behavior-keyboard-nav.js', 'disk' => '/rsrc/js/application/differential/behavior-keyboard-nav.js',
), ),
@ -1023,17 +1035,6 @@ celerity_register_resource_map(array(
), ),
'disk' => '/rsrc/js/javelin/lib/control/tokenizer/Tokenizer.js', 'disk' => '/rsrc/js/javelin/lib/control/tokenizer/Tokenizer.js',
), ),
0 =>
array(
'uri' => '/res/b6096fdd/rsrc/js/javelin/lib/__tests__/URI.js',
'type' => 'js',
'requires' =>
array(
0 => 'javelin-uri',
1 => 'javelin-php-serializer',
),
'disk' => '/rsrc/js/javelin/lib/__tests__/URI.js',
),
'javelin-typeahead' => 'javelin-typeahead' =>
array( array(
'uri' => '/res/7dea2b98/rsrc/js/javelin/lib/control/typeahead/Typeahead.js', 'uri' => '/res/7dea2b98/rsrc/js/javelin/lib/control/typeahead/Typeahead.js',
@ -1664,6 +1665,30 @@ celerity_register_resource_map(array(
'uri' => '/res/pkg/03ef179e/diffusion.pkg.css', 'uri' => '/res/pkg/03ef179e/diffusion.pkg.css',
'type' => 'css', 'type' => 'css',
), ),
'11a5c52c' =>
array(
'name' => 'differential.pkg.js',
'symbols' =>
array(
0 => 'phabricator-drag-and-drop-file-upload',
1 => 'phabricator-shaped-request',
2 => 'javelin-behavior-differential-feedback-preview',
3 => 'javelin-behavior-differential-edit-inline-comments',
4 => 'javelin-behavior-differential-populate',
5 => 'javelin-behavior-differential-show-more',
6 => 'javelin-behavior-differential-diff-radios',
7 => 'javelin-behavior-differential-accept-with-errors',
8 => 'javelin-behavior-differential-comment-jump',
9 => 'javelin-behavior-differential-add-reviewers-and-ccs',
10 => 'javelin-behavior-differential-keyboard-navigation',
11 => 'javelin-behavior-aphront-drag-and-drop',
12 => 'javelin-behavior-aphront-drag-and-drop-textarea',
13 => 'javelin-behavior-phabricator-object-selector',
14 => 'differential-inline-comment-editor',
),
'uri' => '/res/pkg/11a5c52c/differential.pkg.js',
'type' => 'js',
),
'4e7acf1a' => '4e7acf1a' =>
array( array(
'name' => 'core.pkg.js', 'name' => 'core.pkg.js',
@ -1722,30 +1747,6 @@ celerity_register_resource_map(array(
'uri' => '/res/pkg/540effd7/typeahead.pkg.js', 'uri' => '/res/pkg/540effd7/typeahead.pkg.js',
'type' => 'js', 'type' => 'js',
), ),
'882478c9' =>
array(
'name' => 'differential.pkg.js',
'symbols' =>
array(
0 => 'phabricator-drag-and-drop-file-upload',
1 => 'phabricator-shaped-request',
2 => 'javelin-behavior-differential-feedback-preview',
3 => 'javelin-behavior-differential-edit-inline-comments',
4 => 'javelin-behavior-differential-populate',
5 => 'javelin-behavior-differential-show-more',
6 => 'javelin-behavior-differential-diff-radios',
7 => 'javelin-behavior-differential-accept-with-errors',
8 => 'javelin-behavior-differential-comment-jump',
9 => 'javelin-behavior-differential-add-reviewers-and-ccs',
10 => 'javelin-behavior-differential-keyboard-navigation',
11 => 'javelin-behavior-aphront-drag-and-drop',
12 => 'javelin-behavior-aphront-drag-and-drop-textarea',
13 => 'javelin-behavior-phabricator-object-selector',
14 => 'differential-inline-comment-editor',
),
'uri' => '/res/pkg/882478c9/differential.pkg.js',
'type' => 'js',
),
'8b139246' => '8b139246' =>
array( array(
'name' => 'differential.pkg.css', 'name' => 'differential.pkg.css',
@ -1801,7 +1802,7 @@ celerity_register_resource_map(array(
'aphront-typeahead-control-css' => '4f6e449d', 'aphront-typeahead-control-css' => '4f6e449d',
'differential-changeset-view-css' => '8b139246', 'differential-changeset-view-css' => '8b139246',
'differential-core-view-css' => '8b139246', 'differential-core-view-css' => '8b139246',
'differential-inline-comment-editor' => '882478c9', 'differential-inline-comment-editor' => '11a5c52c',
'differential-local-commits-view-css' => '8b139246', 'differential-local-commits-view-css' => '8b139246',
'differential-revision-add-comment-css' => '8b139246', 'differential-revision-add-comment-css' => '8b139246',
'differential-revision-comment-css' => '8b139246', 'differential-revision-comment-css' => '8b139246',
@ -1812,20 +1813,20 @@ celerity_register_resource_map(array(
'diffusion-commit-view-css' => '03ef179e', 'diffusion-commit-view-css' => '03ef179e',
'javelin-behavior' => 'b164acea', 'javelin-behavior' => 'b164acea',
'javelin-behavior-aphront-basic-tokenizer' => '540effd7', 'javelin-behavior-aphront-basic-tokenizer' => '540effd7',
'javelin-behavior-aphront-drag-and-drop' => '882478c9', 'javelin-behavior-aphront-drag-and-drop' => '11a5c52c',
'javelin-behavior-aphront-drag-and-drop-textarea' => '882478c9', 'javelin-behavior-aphront-drag-and-drop-textarea' => '11a5c52c',
'javelin-behavior-aphront-form-disable-on-submit' => '4e7acf1a', 'javelin-behavior-aphront-form-disable-on-submit' => '4e7acf1a',
'javelin-behavior-differential-accept-with-errors' => '882478c9', 'javelin-behavior-differential-accept-with-errors' => '11a5c52c',
'javelin-behavior-differential-add-reviewers-and-ccs' => '882478c9', 'javelin-behavior-differential-add-reviewers-and-ccs' => '11a5c52c',
'javelin-behavior-differential-comment-jump' => '882478c9', 'javelin-behavior-differential-comment-jump' => '11a5c52c',
'javelin-behavior-differential-diff-radios' => '882478c9', 'javelin-behavior-differential-diff-radios' => '11a5c52c',
'javelin-behavior-differential-edit-inline-comments' => '882478c9', 'javelin-behavior-differential-edit-inline-comments' => '11a5c52c',
'javelin-behavior-differential-feedback-preview' => '882478c9', 'javelin-behavior-differential-feedback-preview' => '11a5c52c',
'javelin-behavior-differential-keyboard-navigation' => '882478c9', 'javelin-behavior-differential-keyboard-navigation' => '11a5c52c',
'javelin-behavior-differential-populate' => '882478c9', 'javelin-behavior-differential-populate' => '11a5c52c',
'javelin-behavior-differential-show-more' => '882478c9', 'javelin-behavior-differential-show-more' => '11a5c52c',
'javelin-behavior-phabricator-keyboard-shortcuts' => '4e7acf1a', 'javelin-behavior-phabricator-keyboard-shortcuts' => '4e7acf1a',
'javelin-behavior-phabricator-object-selector' => '882478c9', 'javelin-behavior-phabricator-object-selector' => '11a5c52c',
'javelin-behavior-phabricator-watch-anchor' => '4e7acf1a', 'javelin-behavior-phabricator-watch-anchor' => '4e7acf1a',
'javelin-behavior-refresh-csrf' => '4e7acf1a', 'javelin-behavior-refresh-csrf' => '4e7acf1a',
'javelin-behavior-workflow' => '4e7acf1a', 'javelin-behavior-workflow' => '4e7acf1a',
@ -1850,12 +1851,12 @@ celerity_register_resource_map(array(
'phabricator-core-buttons-css' => '4f6e449d', 'phabricator-core-buttons-css' => '4f6e449d',
'phabricator-core-css' => '4f6e449d', 'phabricator-core-css' => '4f6e449d',
'phabricator-directory-css' => '4f6e449d', 'phabricator-directory-css' => '4f6e449d',
'phabricator-drag-and-drop-file-upload' => '882478c9', 'phabricator-drag-and-drop-file-upload' => '11a5c52c',
'phabricator-keyboard-shortcut' => '4e7acf1a', 'phabricator-keyboard-shortcut' => '4e7acf1a',
'phabricator-keyboard-shortcut-manager' => '4e7acf1a', 'phabricator-keyboard-shortcut-manager' => '4e7acf1a',
'phabricator-object-selector-css' => '8b139246', 'phabricator-object-selector-css' => '8b139246',
'phabricator-remarkup-css' => '4f6e449d', 'phabricator-remarkup-css' => '4f6e449d',
'phabricator-shaped-request' => '882478c9', 'phabricator-shaped-request' => '11a5c52c',
'phabricator-standard-page-view' => '4f6e449d', 'phabricator-standard-page-view' => '4f6e449d',
'syntax-highlighting-css' => '4f6e449d', 'syntax-highlighting-css' => '4f6e449d',
), ),

View file

@ -183,8 +183,13 @@ JX.behavior('differential-edit-inline-comments', function(config) {
}); });
var action_handler = function(op, e) { var action_handler = function(op, e) {
var data = e.getNodeData('differential-inline-comment');
var node = e.getNode('differential-inline-comment'); var node = e.getNode('differential-inline-comment');
handle_inline_action(node, op);
e.kill();
}
var handle_inline_action = function(node, op) {
var data = JX.Stratcom.getData(node);
var row = node.parentNode.parentNode; var row = node.parentNode.parentNode;
var original = data.original; var original = data.original;
@ -203,8 +208,6 @@ JX.behavior('differential-edit-inline-comments', function(config) {
.setRow(row) .setRow(row)
.setTable(row.parentNode) .setTable(row.parentNode)
.start(); .start();
e.kill();
} }
for (var op in {'edit' : 1, 'delete' : 1, 'reply' : 1}) { for (var op in {'edit' : 1, 'delete' : 1, 'reply' : 1}) {
@ -214,5 +217,13 @@ JX.behavior('differential-edit-inline-comments', function(config) {
JX.bind(null, action_handler, op)); JX.bind(null, action_handler, op));
} }
JX.Stratcom.listen(
'differential-inline-action',
null,
function(e) {
var data = e.getData();
handle_inline_action(data.node, data.op);
});
}); });

View file

@ -2,6 +2,7 @@
* @provides javelin-behavior-differential-keyboard-navigation * @provides javelin-behavior-differential-keyboard-navigation
* @requires javelin-behavior * @requires javelin-behavior
* javelin-dom * javelin-dom
* javelin-stratcom
* phabricator-keyboard-shortcut * phabricator-keyboard-shortcut
*/ */
@ -28,21 +29,28 @@ JX.behavior('differential-keyboard-navigation', function(config) {
var blocks = [[changesets[cursor], changesets[cursor]]]; var blocks = [[changesets[cursor], changesets[cursor]]];
var start = null; var start = null;
var type; var type;
for (var ii = 0; ii < rows.length; ii++) { var ii;
type = getRowType(rows[ii]);
if (type == 'ignore') { function push() {
continue; if (start) {
}
if (!type && start) {
blocks.push([start, rows[ii - 1]]); blocks.push([start, rows[ii - 1]]);
start = null; }
start = null;
}
for (ii = 0; ii < rows.length; ii++) {
type = getRowType(rows[ii]);
if (type == 'comment') {
// If we see these types of rows, make a block for each one.
push();
}
if (!type) {
push();
} else if (type && !start) { } else if (type && !start) {
start = rows[ii]; start = rows[ii];
} }
} }
if (start) { push();
blocks.push([start, rows[ii - 1]]);
}
return blocks; return blocks;
} }
@ -52,7 +60,7 @@ JX.behavior('differential-keyboard-navigation', function(config) {
// to be easily focused in the future (inline comments, 'show more..'). // to be easily focused in the future (inline comments, 'show more..').
if (row.className.indexOf('inline') !== -1) { if (row.className.indexOf('inline') !== -1) {
return 'ignore'; return 'comment';
} }
if (row.className.indexOf('differential-changeset') !== -1) { if (row.className.indexOf('differential-changeset') !== -1) {
@ -73,7 +81,7 @@ JX.behavior('differential-keyboard-navigation', function(config) {
return null; return null;
} }
function jump(manager, delta, jump_to_file) { function jump(manager, delta, jump_to_type) {
init(); init();
if (cursor < 0) { if (cursor < 0) {
@ -106,7 +114,7 @@ JX.behavior('differential-keyboard-navigation', function(config) {
if (blocks[focus]) { if (blocks[focus]) {
var row_type = getRowType(blocks[focus][0]); var row_type = getRowType(blocks[focus][0]);
if (jump_to_file && row_type != 'file') { if (jump_to_type && row_type != jump_to_type) {
continue; continue;
} }
@ -133,6 +141,15 @@ JX.behavior('differential-keyboard-navigation', function(config) {
} }
// When inline comments are updated, wipe out our cache of blocks since
// comments may have been added or deleted.
JX.Stratcom.listen(
null,
'differential-inline-comment-update',
function() {
changesets = null;
});
var is_haunted = false; var is_haunted = false;
function haunt() { function haunt() {
is_haunted = !is_haunted; is_haunted = !is_haunted;
@ -154,13 +171,52 @@ JX.behavior('differential-keyboard-navigation', function(config) {
new JX.KeyboardShortcut('J', 'Jump to next file.') new JX.KeyboardShortcut('J', 'Jump to next file.')
.setHandler(function(manager) { .setHandler(function(manager) {
jump(manager, 1, true); jump(manager, 1, 'file');
}) })
.register(); .register();
new JX.KeyboardShortcut('K', 'Jump to previous file.') new JX.KeyboardShortcut('K', 'Jump to previous file.')
.setHandler(function(manager) { .setHandler(function(manager) {
jump(manager, -1, true); jump(manager, -1, 'file');
})
.register();
new JX.KeyboardShortcut('n', 'Jump to next inline comment.')
.setHandler(function(manager) {
jump(manager, 1, 'comment');
})
.register();
new JX.KeyboardShortcut('p', 'Jump to previous inline comment.')
.setHandler(function(manager) {
jump(manager, -1, 'comment');
})
.register();
function inline_op(node, op) {
if (!JX.DOM.scry(node, 'a', 'differential-inline-' + op)) {
// No link for this operation, e.g. editing a comment you can't edit.
return;
}
var data = {
node: JX.DOM.find(node, 'div', 'differential-inline-comment'),
op: op
};
JX.Stratcom.invoke('differential-inline-action', null, data);
}
new JX.KeyboardShortcut('r', 'Reply to selected inline comment.')
.setHandler(function(manager) {
inline_op(selection_begin, 'reply');
})
.register();
new JX.KeyboardShortcut('e', 'Edit selected inline comment.')
.setHandler(function(manager) {
inline_op(selection_begin, 'edit');
}) })
.register(); .register();