mirror of
https://we.phorge.it/source/phorge.git
synced 2024-11-26 00:32:42 +01:00
Retain keyboard cursor state across more inline edit operations in Differential
Summary: Ref T12634. Fixes T8131. Currently, most edit operations (edit, reply, collapse, mark done) lose the keyboard cursor state. Instead, bind the state more tighlty to the inline object itself (instead of the rows which happen to be in the document), and then do a bit of recalculation to try to keep it selected across edits. Test Plan: - Used "n" to select an inline. - Clicked "Done" checkbox. - Pressed "n". - Went to the next inline (previously: lost position in document). - Behavior is also better for: edit, reply, collapse/expand. Reviewers: chad Reviewed By: chad Maniphest Tasks: T12634, T8131 Differential Revision: https://secure.phabricator.com/D17905
This commit is contained in:
parent
1493f08272
commit
a154407efb
4 changed files with 52 additions and 35 deletions
|
@ -13,7 +13,7 @@ return array(
|
||||||
'core.pkg.js' => '8c5f913d',
|
'core.pkg.js' => '8c5f913d',
|
||||||
'darkconsole.pkg.js' => '1f9a31bc',
|
'darkconsole.pkg.js' => '1f9a31bc',
|
||||||
'differential.pkg.css' => '58712637',
|
'differential.pkg.css' => '58712637',
|
||||||
'differential.pkg.js' => '6ee9a850',
|
'differential.pkg.js' => '0bfd141c',
|
||||||
'diffusion.pkg.css' => 'b93d9b8c',
|
'diffusion.pkg.css' => 'b93d9b8c',
|
||||||
'diffusion.pkg.js' => '84c8f8fd',
|
'diffusion.pkg.js' => '84c8f8fd',
|
||||||
'favicon.ico' => '30672e08',
|
'favicon.ico' => '30672e08',
|
||||||
|
@ -390,9 +390,9 @@ return array(
|
||||||
'rsrc/js/application/dashboard/behavior-dashboard-move-panels.js' => '408bf173',
|
'rsrc/js/application/dashboard/behavior-dashboard-move-panels.js' => '408bf173',
|
||||||
'rsrc/js/application/dashboard/behavior-dashboard-query-panel-select.js' => '453c5375',
|
'rsrc/js/application/dashboard/behavior-dashboard-query-panel-select.js' => '453c5375',
|
||||||
'rsrc/js/application/dashboard/behavior-dashboard-tab-panel.js' => 'd4eecc63',
|
'rsrc/js/application/dashboard/behavior-dashboard-tab-panel.js' => 'd4eecc63',
|
||||||
'rsrc/js/application/diff/DiffChangeset.js' => 'f7100923',
|
'rsrc/js/application/diff/DiffChangeset.js' => '145c34e2',
|
||||||
'rsrc/js/application/diff/DiffChangesetList.js' => 'e5c5e171',
|
'rsrc/js/application/diff/DiffChangesetList.js' => 'ca3b6387',
|
||||||
'rsrc/js/application/diff/DiffInline.js' => '4bbefc49',
|
'rsrc/js/application/diff/DiffInline.js' => 'b5b1f167',
|
||||||
'rsrc/js/application/diff/behavior-preview-link.js' => '051c7832',
|
'rsrc/js/application/diff/behavior-preview-link.js' => '051c7832',
|
||||||
'rsrc/js/application/differential/behavior-comment-jump.js' => '4fdb476d',
|
'rsrc/js/application/differential/behavior-comment-jump.js' => '4fdb476d',
|
||||||
'rsrc/js/application/differential/behavior-comment-preview.js' => 'b064af76',
|
'rsrc/js/application/differential/behavior-comment-preview.js' => 'b064af76',
|
||||||
|
@ -781,9 +781,9 @@ return array(
|
||||||
'phabricator-darklog' => 'c8e1ffe3',
|
'phabricator-darklog' => 'c8e1ffe3',
|
||||||
'phabricator-darkmessage' => 'c48cccdd',
|
'phabricator-darkmessage' => 'c48cccdd',
|
||||||
'phabricator-dashboard-css' => 'fe5b1869',
|
'phabricator-dashboard-css' => 'fe5b1869',
|
||||||
'phabricator-diff-changeset' => 'f7100923',
|
'phabricator-diff-changeset' => '145c34e2',
|
||||||
'phabricator-diff-changeset-list' => 'e5c5e171',
|
'phabricator-diff-changeset-list' => 'ca3b6387',
|
||||||
'phabricator-diff-inline' => '4bbefc49',
|
'phabricator-diff-inline' => 'b5b1f167',
|
||||||
'phabricator-drag-and-drop-file-upload' => '58dea2fa',
|
'phabricator-drag-and-drop-file-upload' => '58dea2fa',
|
||||||
'phabricator-draggable-list' => 'bea6e7f4',
|
'phabricator-draggable-list' => 'bea6e7f4',
|
||||||
'phabricator-fatal-config-template-css' => '8f18fa41',
|
'phabricator-fatal-config-template-css' => '8f18fa41',
|
||||||
|
@ -999,6 +999,17 @@ return array(
|
||||||
'javelin-dom',
|
'javelin-dom',
|
||||||
'javelin-typeahead-normalizer',
|
'javelin-typeahead-normalizer',
|
||||||
),
|
),
|
||||||
|
'145c34e2' => array(
|
||||||
|
'javelin-dom',
|
||||||
|
'javelin-util',
|
||||||
|
'javelin-stratcom',
|
||||||
|
'javelin-install',
|
||||||
|
'javelin-workflow',
|
||||||
|
'javelin-router',
|
||||||
|
'javelin-behavior-device',
|
||||||
|
'javelin-vector',
|
||||||
|
'phabricator-diff-inline',
|
||||||
|
),
|
||||||
'1499a8cb' => array(
|
'1499a8cb' => array(
|
||||||
'javelin-behavior',
|
'javelin-behavior',
|
||||||
'javelin-stratcom',
|
'javelin-stratcom',
|
||||||
|
@ -1259,9 +1270,6 @@ return array(
|
||||||
'javelin-util',
|
'javelin-util',
|
||||||
'phabricator-shaped-request',
|
'phabricator-shaped-request',
|
||||||
),
|
),
|
||||||
'4bbefc49' => array(
|
|
||||||
'javelin-dom',
|
|
||||||
),
|
|
||||||
'4c193c96' => array(
|
'4c193c96' => array(
|
||||||
'javelin-behavior',
|
'javelin-behavior',
|
||||||
'javelin-uri',
|
'javelin-uri',
|
||||||
|
@ -1834,6 +1842,9 @@ return array(
|
||||||
'javelin-dom',
|
'javelin-dom',
|
||||||
'phabricator-draggable-list',
|
'phabricator-draggable-list',
|
||||||
),
|
),
|
||||||
|
'b5b1f167' => array(
|
||||||
|
'javelin-dom',
|
||||||
|
),
|
||||||
'b5c256b8' => array(
|
'b5c256b8' => array(
|
||||||
'javelin-install',
|
'javelin-install',
|
||||||
'javelin-dom',
|
'javelin-dom',
|
||||||
|
@ -1973,6 +1984,9 @@ return array(
|
||||||
'phabricator-shaped-request',
|
'phabricator-shaped-request',
|
||||||
'conpherence-thread-manager',
|
'conpherence-thread-manager',
|
||||||
),
|
),
|
||||||
|
'ca3b6387' => array(
|
||||||
|
'javelin-install',
|
||||||
|
),
|
||||||
'ca3f91eb' => array(
|
'ca3f91eb' => array(
|
||||||
'javelin-behavior',
|
'javelin-behavior',
|
||||||
'javelin-dom',
|
'javelin-dom',
|
||||||
|
@ -2137,9 +2151,6 @@ return array(
|
||||||
'javelin-workflow',
|
'javelin-workflow',
|
||||||
'javelin-magical-init',
|
'javelin-magical-init',
|
||||||
),
|
),
|
||||||
'e5c5e171' => array(
|
|
||||||
'javelin-install',
|
|
||||||
),
|
|
||||||
'e9581f08' => array(
|
'e9581f08' => array(
|
||||||
'javelin-behavior',
|
'javelin-behavior',
|
||||||
'javelin-stratcom',
|
'javelin-stratcom',
|
||||||
|
@ -2188,17 +2199,6 @@ return array(
|
||||||
'phuix-icon-view',
|
'phuix-icon-view',
|
||||||
'phabricator-prefab',
|
'phabricator-prefab',
|
||||||
),
|
),
|
||||||
'f7100923' => array(
|
|
||||||
'javelin-dom',
|
|
||||||
'javelin-util',
|
|
||||||
'javelin-stratcom',
|
|
||||||
'javelin-install',
|
|
||||||
'javelin-workflow',
|
|
||||||
'javelin-router',
|
|
||||||
'javelin-behavior-device',
|
|
||||||
'javelin-vector',
|
|
||||||
'phabricator-diff-inline',
|
|
||||||
),
|
|
||||||
'f7fc67ec' => array(
|
'f7fc67ec' => array(
|
||||||
'javelin-install',
|
'javelin-install',
|
||||||
'javelin-typeahead',
|
'javelin-typeahead',
|
||||||
|
|
|
@ -369,17 +369,11 @@ JX.install('DiffChangeset', {
|
||||||
for (var jj = 0; jj < block.items.length; jj++) {
|
for (var jj = 0; jj < block.items.length; jj++) {
|
||||||
var inline = this.getInlineForRow(block.items[jj]);
|
var inline = this.getInlineForRow(block.items[jj]);
|
||||||
|
|
||||||
// If this inline has been collapsed, don't select it with the
|
|
||||||
// keyboard cursor.
|
|
||||||
if (inline.isHidden()) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
items.push({
|
items.push({
|
||||||
type: block.type,
|
type: block.type,
|
||||||
changeset: this,
|
changeset: this,
|
||||||
target: block.items[jj],
|
target: inline,
|
||||||
inline: inline,
|
hidden: inline.isHidden(),
|
||||||
nodes: {
|
nodes: {
|
||||||
begin: block.items[jj],
|
begin: block.items[jj],
|
||||||
end: block.items[jj]
|
end: block.items[jj]
|
||||||
|
|
|
@ -206,7 +206,7 @@ JX.install('DiffChangesetList', {
|
||||||
|
|
||||||
if (cursor) {
|
if (cursor) {
|
||||||
if (cursor.type == 'comment') {
|
if (cursor.type == 'comment') {
|
||||||
var inline = cursor.inline;
|
var inline = cursor.target;
|
||||||
if (inline.canReply()) {
|
if (inline.canReply()) {
|
||||||
this.setFocus(null);
|
this.setFocus(null);
|
||||||
|
|
||||||
|
@ -225,7 +225,7 @@ JX.install('DiffChangesetList', {
|
||||||
|
|
||||||
if (cursor) {
|
if (cursor) {
|
||||||
if (cursor.type == 'comment') {
|
if (cursor.type == 'comment') {
|
||||||
var inline = cursor.inline;
|
var inline = cursor.target;
|
||||||
if (inline.canEdit()) {
|
if (inline.canEdit()) {
|
||||||
this.setFocus(null);
|
this.setFocus(null);
|
||||||
|
|
||||||
|
@ -284,6 +284,12 @@ JX.install('DiffChangesetList', {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If the item is hidden, don't select it when iterating with jump
|
||||||
|
// keys. It can still potentially be selected in other ways.
|
||||||
|
if (items[cursor].hidden) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
// Otherwise, we've found a valid item to select.
|
// Otherwise, we've found a valid item to select.
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -328,13 +334,28 @@ JX.install('DiffChangesetList', {
|
||||||
|
|
||||||
this.setFocus(cursor.nodes.begin, cursor.nodes.end);
|
this.setFocus(cursor.nodes.begin, cursor.nodes.end);
|
||||||
|
|
||||||
if (scroll) {
|
if (manager && scroll) {
|
||||||
manager.scrollTo(cursor.nodes.begin);
|
manager.scrollTo(cursor.nodes.begin);
|
||||||
}
|
}
|
||||||
|
|
||||||
return this;
|
return this;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
redrawCursor: function() {
|
||||||
|
// NOTE: This is setting the cursor to the current cursor. Usually, this
|
||||||
|
// would have no effect.
|
||||||
|
|
||||||
|
// However, if the old cursor pointed at an inline and the inline has
|
||||||
|
// been edited so the rows have changed, this updates the cursor to point
|
||||||
|
// at the new inline with the proper rows for the current state, and
|
||||||
|
// redraws the reticle correctly.
|
||||||
|
|
||||||
|
var state = this._getSelectionState();
|
||||||
|
if (state.cursor !== null) {
|
||||||
|
this._setSelectionState(state.items[state.cursor]);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
_getSelectableItems: function() {
|
_getSelectableItems: function() {
|
||||||
var result = [];
|
var result = [];
|
||||||
|
|
||||||
|
|
|
@ -519,6 +519,8 @@ JX.install('DiffInline', {
|
||||||
// preview at the bottom of the page.
|
// preview at the bottom of the page.
|
||||||
this.getChangeset().getChangesetList().redrawPreview();
|
this.getChangeset().getChangesetList().redrawPreview();
|
||||||
|
|
||||||
|
this.getChangeset().getChangesetList().redrawCursor();
|
||||||
|
|
||||||
// Emit a resize event so that UI elements like the keyboad focus
|
// Emit a resize event so that UI elements like the keyboad focus
|
||||||
// reticle can redraw properly.
|
// reticle can redraw properly.
|
||||||
JX.Stratcom.invoke('resize');
|
JX.Stratcom.invoke('resize');
|
||||||
|
|
Loading…
Reference in a new issue