blob: 9ca2213c8468435c29129d32d45373c8faf5a736 [file] [log] [blame]
/**
* @license
* Copyright 2021 Google LLC
* SPDX-License-Identifier: Apache-2.0
*/
/** Enum for all special shortcuts */
import {ComboKey, Key, Modifier, Binding} from '../../utils/dom-util';
export enum SPECIAL_SHORTCUT {
DOC_ONLY = 'DOC_ONLY',
GO_KEY = 'GO_KEY',
V_KEY = 'V_KEY',
}
/**
* Enum for all shortcut sections, where that shortcut should be applied to.
*/
export enum ShortcutSection {
ACTIONS = 'Actions',
DIFFS = 'Diffs',
EVERYWHERE = 'Global Shortcuts',
FILE_LIST = 'File list',
NAVIGATION = 'Navigation',
REPLY_DIALOG = 'Reply dialog',
}
/**
* Enum for all possible shortcut names.
*/
export enum Shortcut {
OPEN_SHORTCUT_HELP_DIALOG = 'OPEN_SHORTCUT_HELP_DIALOG',
GO_TO_USER_DASHBOARD = 'GO_TO_USER_DASHBOARD',
GO_TO_OPENED_CHANGES = 'GO_TO_OPENED_CHANGES',
GO_TO_MERGED_CHANGES = 'GO_TO_MERGED_CHANGES',
GO_TO_ABANDONED_CHANGES = 'GO_TO_ABANDONED_CHANGES',
GO_TO_WATCHED_CHANGES = 'GO_TO_WATCHED_CHANGES',
GO_TO_REPOS = 'GO_TO_REPOS',
GO_TO_GROUPS = 'GO_TO_GROUPS',
CURSOR_NEXT_CHANGE = 'CURSOR_NEXT_CHANGE',
CURSOR_PREV_CHANGE = 'CURSOR_PREV_CHANGE',
OPEN_CHANGE = 'OPEN_CHANGE',
NEXT_PAGE = 'NEXT_PAGE',
PREV_PAGE = 'PREV_PAGE',
TOGGLE_CHANGE_STAR = 'TOGGLE_CHANGE_STAR',
REFRESH_CHANGE_LIST = 'REFRESH_CHANGE_LIST',
OPEN_SUBMIT_DIALOG = 'OPEN_SUBMIT_DIALOG',
TOGGLE_ATTENTION_SET = 'TOGGLE_ATTENTION_SET',
OPEN_REPLY_DIALOG = 'OPEN_REPLY_DIALOG',
OPEN_DOWNLOAD_DIALOG = 'OPEN_DOWNLOAD_DIALOG',
OPEN_COPY_LINKS_DROPDOWN = 'OPEN_COPY_LINKS_DROPDOWN',
EXPAND_ALL_MESSAGES = 'EXPAND_ALL_MESSAGES',
COLLAPSE_ALL_MESSAGES = 'COLLAPSE_ALL_MESSAGES',
UP_TO_DASHBOARD = 'UP_TO_DASHBOARD',
UP_TO_CHANGE = 'UP_TO_CHANGE',
TOGGLE_DIFF_MODE = 'TOGGLE_DIFF_MODE',
REFRESH_CHANGE = 'REFRESH_CHANGE',
EDIT_TOPIC = 'EDIT_TOPIC',
DIFF_AGAINST_BASE = 'DIFF_AGAINST_BASE',
DIFF_AGAINST_LATEST = 'DIFF_AGAINST_LATEST',
DIFF_BASE_AGAINST_LEFT = 'DIFF_BASE_AGAINST_LEFT',
DIFF_RIGHT_AGAINST_LATEST = 'DIFF_RIGHT_AGAINST_LATEST',
DIFF_BASE_AGAINST_LATEST = 'DIFF_BASE_AGAINST_LATEST',
NEXT_LINE = 'NEXT_LINE',
PREV_LINE = 'PREV_LINE',
VISIBLE_LINE = 'VISIBLE_LINE',
NEXT_CHUNK = 'NEXT_CHUNK',
PREV_CHUNK = 'PREV_CHUNK',
TOGGLE_ALL_DIFF_CONTEXT = 'TOGGLE_ALL_DIFF_CONTEXT',
NEXT_COMMENT_THREAD = 'NEXT_COMMENT_THREAD',
PREV_COMMENT_THREAD = 'PREV_COMMENT_THREAD',
EXPAND_ALL_COMMENT_THREADS = 'EXPAND_ALL_COMMENT_THREADS',
COLLAPSE_ALL_COMMENT_THREADS = 'COLLAPSE_ALL_COMMENT_THREADS',
LEFT_PANE = 'LEFT_PANE',
RIGHT_PANE = 'RIGHT_PANE',
TOGGLE_LEFT_PANE = 'TOGGLE_LEFT_PANE',
NEW_COMMENT = 'NEW_COMMENT',
SAVE_COMMENT = 'SAVE_COMMENT',
OPEN_DIFF_PREFS = 'OPEN_DIFF_PREFS',
TOGGLE_DIFF_REVIEWED = 'TOGGLE_DIFF_REVIEWED',
NEXT_FILE = 'NEXT_FILE',
PREV_FILE = 'PREV_FILE',
NEXT_FILE_WITH_COMMENTS = 'NEXT_FILE_WITH_COMMENTS',
PREV_FILE_WITH_COMMENTS = 'PREV_FILE_WITH_COMMENTS',
NEXT_UNREVIEWED_FILE = 'NEXT_UNREVIEWED_FILE',
CURSOR_NEXT_FILE = 'CURSOR_NEXT_FILE',
CURSOR_PREV_FILE = 'CURSOR_PREV_FILE',
OPEN_FILE = 'OPEN_FILE',
TOGGLE_FILE_REVIEWED = 'TOGGLE_FILE_REVIEWED',
TOGGLE_ALL_INLINE_DIFFS = 'TOGGLE_ALL_INLINE_DIFFS',
TOGGLE_INLINE_DIFF = 'TOGGLE_INLINE_DIFF',
TOGGLE_HIDE_ALL_COMMENT_THREADS = 'TOGGLE_HIDE_ALL_COMMENT_THREADS',
OPEN_FILE_LIST = 'OPEN_FILE_LIST',
OPEN_FIRST_FILE = 'OPEN_FIRST_FILE',
OPEN_LAST_FILE = 'OPEN_LAST_FILE',
SEARCH = 'SEARCH',
EMOJI_DROPDOWN = 'EMOJI_DROPDOWN',
MENTIONS_DROPDOWN = 'MENTIONS_DROPDOWN',
TOGGLE_BLAME = 'TOGGLE_BLAME',
TOGGLE_CHECKBOX = 'TOGGLE_CHECKBOX',
}
export interface ShortcutHelpItem {
shortcut: Shortcut;
text: string;
bindings: Binding[];
}
export function createShortcutConfig() {
const config = new Map<ShortcutSection, ShortcutHelpItem[]>();
function describe(
shortcut: Shortcut,
section: ShortcutSection,
text: string,
binding: Binding,
...moreBindings: Binding[]
) {
if (!config.has(section)) {
config.set(section, []);
}
const shortcuts = config.get(section);
if (shortcuts) {
shortcuts.push({shortcut, text, bindings: [binding, ...moreBindings]});
}
}
describe(Shortcut.SEARCH, ShortcutSection.EVERYWHERE, 'Search', {key: '/'});
describe(
Shortcut.OPEN_SHORTCUT_HELP_DIALOG,
ShortcutSection.EVERYWHERE,
'Show this dialog',
{key: '?'}
);
describe(
Shortcut.GO_TO_USER_DASHBOARD,
ShortcutSection.EVERYWHERE,
'Go to User Dashboard',
{key: 'i', combo: ComboKey.G}
);
describe(
Shortcut.GO_TO_OPENED_CHANGES,
ShortcutSection.EVERYWHERE,
'Go to Opened Changes',
{key: 'o', combo: ComboKey.G}
);
describe(
Shortcut.GO_TO_MERGED_CHANGES,
ShortcutSection.EVERYWHERE,
'Go to Merged Changes',
{key: 'm', combo: ComboKey.G}
);
describe(
Shortcut.GO_TO_ABANDONED_CHANGES,
ShortcutSection.EVERYWHERE,
'Go to Abandoned Changes',
{key: 'a', combo: ComboKey.G}
);
describe(
Shortcut.GO_TO_WATCHED_CHANGES,
ShortcutSection.EVERYWHERE,
'Go to Watched Changes',
{key: 'w', combo: ComboKey.G}
);
describe(
Shortcut.GO_TO_REPOS,
ShortcutSection.EVERYWHERE,
'Go to Repositories',
{key: 'r', combo: ComboKey.G}
);
describe(Shortcut.GO_TO_GROUPS, ShortcutSection.EVERYWHERE, 'Go to Groups', {
key: 'g',
combo: ComboKey.G,
});
describe(
Shortcut.TOGGLE_CHECKBOX,
ShortcutSection.ACTIONS,
'Toggle checkbox',
{key: 'x'}
);
describe(
Shortcut.CURSOR_NEXT_CHANGE,
ShortcutSection.ACTIONS,
'Select next change',
{key: 'j', allowRepeat: true}
);
describe(
Shortcut.CURSOR_PREV_CHANGE,
ShortcutSection.ACTIONS,
'Select previous change',
{key: 'k', allowRepeat: true}
);
describe(
Shortcut.OPEN_CHANGE,
ShortcutSection.ACTIONS,
'Show selected change',
{key: 'o'}
);
describe(
Shortcut.NEXT_PAGE,
ShortcutSection.ACTIONS,
'Go to next page',
{key: 'n'},
{key: ']'}
);
describe(
Shortcut.PREV_PAGE,
ShortcutSection.ACTIONS,
'Go to previous page',
{key: 'p'},
{key: '['}
);
describe(
Shortcut.OPEN_REPLY_DIALOG,
ShortcutSection.ACTIONS,
'Open reply dialog to publish comments and add reviewers',
{key: 'a'}
);
describe(
Shortcut.OPEN_DOWNLOAD_DIALOG,
ShortcutSection.ACTIONS,
'Open download overlay',
{key: 'd'}
);
describe(
Shortcut.OPEN_COPY_LINKS_DROPDOWN,
ShortcutSection.ACTIONS,
'Open link dialog',
{key: 'l'}
);
describe(
Shortcut.EXPAND_ALL_MESSAGES,
ShortcutSection.ACTIONS,
'Expand all messages',
{key: 'x'}
);
describe(
Shortcut.COLLAPSE_ALL_MESSAGES,
ShortcutSection.ACTIONS,
'Collapse all messages',
{key: 'z'}
);
describe(
Shortcut.REFRESH_CHANGE,
ShortcutSection.ACTIONS,
'Reload the change at the latest patch',
{key: 'R'}
);
describe(
Shortcut.TOGGLE_FILE_REVIEWED,
ShortcutSection.ACTIONS,
'Toggle review flag on selected file',
{key: 'r'}
);
describe(
Shortcut.REFRESH_CHANGE_LIST,
ShortcutSection.ACTIONS,
'Refresh list of changes',
{key: 'R'}
);
describe(
Shortcut.TOGGLE_CHANGE_STAR,
ShortcutSection.ACTIONS,
'Star/unstar change',
{key: 's'}
);
describe(
Shortcut.OPEN_SUBMIT_DIALOG,
ShortcutSection.ACTIONS,
'Open submit dialog',
{key: 'S'}
);
describe(
Shortcut.TOGGLE_ATTENTION_SET,
ShortcutSection.ACTIONS,
'Toggle attention set status',
{key: 'T'}
);
describe(Shortcut.EDIT_TOPIC, ShortcutSection.ACTIONS, 'Add a change topic', {
key: 't',
});
describe(
Shortcut.DIFF_AGAINST_BASE,
ShortcutSection.DIFFS,
'Diff against base',
{key: Key.DOWN, combo: ComboKey.V},
{key: 's', combo: ComboKey.V}
);
describe(
Shortcut.DIFF_AGAINST_LATEST,
ShortcutSection.DIFFS,
'Diff against latest patchset',
{key: Key.UP, combo: ComboKey.V},
{key: 'w', combo: ComboKey.V}
);
describe(
Shortcut.DIFF_BASE_AGAINST_LEFT,
ShortcutSection.DIFFS,
'Diff base against left',
{key: Key.LEFT, combo: ComboKey.V},
{key: 'a', combo: ComboKey.V}
);
describe(
Shortcut.DIFF_RIGHT_AGAINST_LATEST,
ShortcutSection.DIFFS,
'Diff right against latest',
{key: Key.RIGHT, combo: ComboKey.V},
{key: 'd', combo: ComboKey.V}
);
describe(
Shortcut.DIFF_BASE_AGAINST_LATEST,
ShortcutSection.DIFFS,
'Diff base against latest',
{key: 'b', combo: ComboKey.V}
);
describe(
Shortcut.NEXT_LINE,
ShortcutSection.DIFFS,
'Go to next line',
{key: 'j', allowRepeat: true},
{key: Key.DOWN, allowRepeat: true}
);
describe(
Shortcut.PREV_LINE,
ShortcutSection.DIFFS,
'Go to previous line',
{key: 'k', allowRepeat: true},
{key: Key.UP, allowRepeat: true}
);
describe(
Shortcut.VISIBLE_LINE,
ShortcutSection.DIFFS,
'Move cursor to currently visible code',
{key: '.'}
);
describe(
Shortcut.NEXT_CHUNK,
ShortcutSection.DIFFS,
'Go to next diff chunk',
{
key: 'n',
}
);
describe(
Shortcut.PREV_CHUNK,
ShortcutSection.DIFFS,
'Go to previous diff chunk',
{key: 'p'}
);
describe(
Shortcut.TOGGLE_ALL_DIFF_CONTEXT,
ShortcutSection.DIFFS,
'Toggle all diff context',
{key: 'X'}
);
describe(
Shortcut.NEXT_COMMENT_THREAD,
ShortcutSection.DIFFS,
'Go to next comment thread',
{key: 'N'}
);
describe(
Shortcut.PREV_COMMENT_THREAD,
ShortcutSection.DIFFS,
'Go to previous comment thread',
{key: 'P'}
);
describe(
Shortcut.EXPAND_ALL_COMMENT_THREADS,
ShortcutSection.DIFFS,
'Expand all comment threads',
{key: 'e', docOnly: true}
);
describe(
Shortcut.COLLAPSE_ALL_COMMENT_THREADS,
ShortcutSection.DIFFS,
'Collapse all comment threads',
{key: 'E', docOnly: true}
);
describe(
Shortcut.TOGGLE_HIDE_ALL_COMMENT_THREADS,
ShortcutSection.DIFFS,
'Hide/Display all comment threads',
{key: 'h'}
);
describe(Shortcut.LEFT_PANE, ShortcutSection.DIFFS, 'Select left pane', {
key: Key.LEFT,
modifiers: [Modifier.SHIFT_KEY],
});
describe(Shortcut.RIGHT_PANE, ShortcutSection.DIFFS, 'Select right pane', {
key: Key.RIGHT,
modifiers: [Modifier.SHIFT_KEY],
});
describe(
Shortcut.TOGGLE_LEFT_PANE,
ShortcutSection.DIFFS,
'Hide/show left diff',
{key: 'A'}
);
describe(Shortcut.NEW_COMMENT, ShortcutSection.DIFFS, 'Draft new comment', {
key: 'c',
});
describe(
Shortcut.SAVE_COMMENT,
ShortcutSection.DIFFS,
'Save comment',
{key: Key.ENTER, modifiers: [Modifier.CTRL_KEY]},
{key: Key.ENTER, modifiers: [Modifier.META_KEY]},
{key: 's', modifiers: [Modifier.CTRL_KEY]},
{key: 's', modifiers: [Modifier.META_KEY]}
);
describe(
Shortcut.OPEN_DIFF_PREFS,
ShortcutSection.DIFFS,
'Show diff preferences',
{key: ','}
);
describe(
Shortcut.TOGGLE_DIFF_REVIEWED,
ShortcutSection.DIFFS,
'Mark/unmark file as reviewed',
{key: 'r'}
);
describe(
Shortcut.TOGGLE_DIFF_MODE,
ShortcutSection.DIFFS,
'Toggle unified/side-by-side diff',
{key: 'm'}
);
describe(
Shortcut.NEXT_UNREVIEWED_FILE,
ShortcutSection.DIFFS,
'Mark file as reviewed and go to next unreviewed file',
{key: 'M'}
);
describe(Shortcut.TOGGLE_BLAME, ShortcutSection.DIFFS, 'Toggle blame', {
key: 'b',
});
describe(Shortcut.OPEN_FILE_LIST, ShortcutSection.DIFFS, 'Open file list', {
key: 'f',
});
describe(Shortcut.NEXT_FILE, ShortcutSection.NAVIGATION, 'Go to next file', {
key: ']',
});
describe(
Shortcut.PREV_FILE,
ShortcutSection.NAVIGATION,
'Go to previous file',
{key: '['}
);
describe(
Shortcut.NEXT_FILE_WITH_COMMENTS,
ShortcutSection.NAVIGATION,
'Go to next file that has comments',
{key: 'J'}
);
describe(
Shortcut.PREV_FILE_WITH_COMMENTS,
ShortcutSection.NAVIGATION,
'Go to previous file that has comments',
{key: 'K'}
);
describe(
Shortcut.OPEN_FIRST_FILE,
ShortcutSection.NAVIGATION,
'Go to first file',
{key: ']'}
);
describe(
Shortcut.OPEN_LAST_FILE,
ShortcutSection.NAVIGATION,
'Go to last file',
{key: '['}
);
describe(
Shortcut.UP_TO_DASHBOARD,
ShortcutSection.NAVIGATION,
'Up to dashboard',
{key: 'u'}
);
describe(Shortcut.UP_TO_CHANGE, ShortcutSection.NAVIGATION, 'Up to change', {
key: 'u',
});
describe(
Shortcut.CURSOR_NEXT_FILE,
ShortcutSection.FILE_LIST,
'Select next file',
{key: 'j', allowRepeat: true},
{key: Key.DOWN, allowRepeat: true}
);
describe(
Shortcut.CURSOR_PREV_FILE,
ShortcutSection.FILE_LIST,
'Select previous file',
{key: 'k', allowRepeat: true},
{key: Key.UP, allowRepeat: true}
);
describe(
Shortcut.OPEN_FILE,
ShortcutSection.FILE_LIST,
'Go to selected file',
{key: 'o'},
{key: Key.ENTER}
);
describe(
Shortcut.TOGGLE_ALL_INLINE_DIFFS,
ShortcutSection.FILE_LIST,
'Show/hide all inline diffs',
{key: 'I'}
);
describe(
Shortcut.TOGGLE_INLINE_DIFF,
ShortcutSection.FILE_LIST,
'Show/hide selected inline diff',
{key: 'i'}
);
describe(
Shortcut.EMOJI_DROPDOWN,
ShortcutSection.REPLY_DIALOG,
'Emoji dropdown',
{key: ':', docOnly: true}
);
describe(
Shortcut.MENTIONS_DROPDOWN,
ShortcutSection.REPLY_DIALOG,
'Mentions dropdown',
{key: '@', docOnly: true}
);
return config;
}