Add shift+m shortcut to diff view
Shift+m marks the current file as reviewed and navigates to the next unreviewed file. Bug: Issue 9280 Change-Id: I11ac225dfbfdf07b10b35297314031c48fd0799c
This commit is contained in:
		@@ -161,6 +161,10 @@
 | 
			
		||||
        type: Object,
 | 
			
		||||
        computed: '_getRevisionInfo(_change)',
 | 
			
		||||
      },
 | 
			
		||||
      _reviewedFiles: {
 | 
			
		||||
        type: Object,
 | 
			
		||||
        value: () => new Set(),
 | 
			
		||||
      },
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    behaviors: [
 | 
			
		||||
@@ -207,6 +211,7 @@
 | 
			
		||||
        [this.Shortcut.TOGGLE_DIFF_MODE]: '_handleToggleDiffMode',
 | 
			
		||||
        [this.Shortcut.TOGGLE_FILE_REVIEWED]: '_handleToggleFileReviewed',
 | 
			
		||||
        [this.Shortcut.EXPAND_ALL_DIFF_CONTEXT]: '_handleExpandAllDiffContext',
 | 
			
		||||
        [this.Shortcut.NEXT_UNREVIEWED_FILE]: '_handleNextUnreviewedFile',
 | 
			
		||||
 | 
			
		||||
        // Final two are actually handled by gr-diff-comment-thread.
 | 
			
		||||
        [this.Shortcut.EXPAND_ALL_COMMENT_THREADS]: null,
 | 
			
		||||
@@ -555,10 +560,18 @@
 | 
			
		||||
      return {path: fileList[idx]};
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _getReviewedFiles(changeNum, patchNum) {
 | 
			
		||||
      return this.$.restAPI.getReviewedFiles(changeNum, patchNum)
 | 
			
		||||
          .then(files => {
 | 
			
		||||
            this._reviewedFiles = new Set(files);
 | 
			
		||||
            return this._reviewedFiles;
 | 
			
		||||
          });
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _getReviewedStatus(editMode, changeNum, patchNum, path) {
 | 
			
		||||
      if (editMode) { return Promise.resolve(false); }
 | 
			
		||||
      return this.$.restAPI.getReviewedFiles(changeNum, patchNum)
 | 
			
		||||
          .then(files => files.includes(path));
 | 
			
		||||
      return this._getReviewedFiles(changeNum, patchNum)
 | 
			
		||||
          .then(files => files.has(path));
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _paramsChanged(value) {
 | 
			
		||||
@@ -1012,5 +1025,15 @@
 | 
			
		||||
      if (this.shouldSuppressKeyboardShortcut(e)) { return; }
 | 
			
		||||
      this.$.diffHost.expandAllContext();
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _handleNextUnreviewedFile(e) {
 | 
			
		||||
      this._setReviewed(true);
 | 
			
		||||
      // Ensure that the currently viewed file always appears in unreviewedFiles
 | 
			
		||||
      // so we resolve the right "next" file.
 | 
			
		||||
      const unreviewedFiles = this._fileList
 | 
			
		||||
          .filter(file =>
 | 
			
		||||
          (file === this._path || !this._reviewedFiles.has(file)));
 | 
			
		||||
      this._navToFile(this._path, unreviewedFiles, 1);
 | 
			
		||||
    },
 | 
			
		||||
  });
 | 
			
		||||
})();
 | 
			
		||||
 
 | 
			
		||||
@@ -67,6 +67,7 @@ limitations under the License.
 | 
			
		||||
    kb.bindShortcut(kb.Shortcut.EXPAND_ALL_DIFF_CONTEXT, 'shift+x');
 | 
			
		||||
    kb.bindShortcut(kb.Shortcut.EXPAND_ALL_COMMENT_THREADS, 'e');
 | 
			
		||||
    kb.bindShortcut(kb.Shortcut.COLLAPSE_ALL_COMMENT_THREADS, 'shift+e');
 | 
			
		||||
    kb.bindShortcut(kb.Shortcut.NEXT_UNREVIEWED_FILE, 'shift+m');
 | 
			
		||||
 | 
			
		||||
    let element;
 | 
			
		||||
    let sandbox;
 | 
			
		||||
@@ -1106,5 +1107,22 @@ limitations under the License.
 | 
			
		||||
      assert.isTrue(setStub.calledOnce);
 | 
			
		||||
      assert.isTrue(setStub.calledWith(101, 'test-project'));
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    test('shift+m navigates to next unreviewed file', () => {
 | 
			
		||||
      element._fileList = ['file1', 'file2', 'file3'];
 | 
			
		||||
      element._reviewedFiles = new Set(['file1', 'file2']);
 | 
			
		||||
      element._path = 'file1';
 | 
			
		||||
      const reviewedStub = sandbox.stub(element, '_setReviewed');
 | 
			
		||||
      const navStub = sandbox.stub(element, '_navToFile');
 | 
			
		||||
      MockInteractions.pressAndReleaseKeyOn(element, 77, 'shift', 'm');
 | 
			
		||||
      flushAsynchronousOperations();
 | 
			
		||||
 | 
			
		||||
      assert.isTrue(reviewedStub.lastCall.args[0]);
 | 
			
		||||
      assert.deepEqual(navStub.lastCall.args, [
 | 
			
		||||
        'file1',
 | 
			
		||||
        ['file1', 'file3'],
 | 
			
		||||
        1,
 | 
			
		||||
      ]);
 | 
			
		||||
    });
 | 
			
		||||
  });
 | 
			
		||||
</script>
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user