-
Notifications
You must be signed in to change notification settings - Fork 1.8k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Connect: Prepare keyboard shortcuts configuration #22193
Connect: Prepare keyboard shortcuts configuration #22193
Conversation
Previously, we used words like: "key", "type", "shortcut" which were really confusing (and I wrote this code), because it was hard to tell what exactly they describe. From now, we will use only "accelerator" (borrowed from Electron) and "action" words. For example, in a shortcut "Command+1": "tab-1": - "Command+1" is "accelerator" - "tab-1" is "action"
With "-" we are not able to use this symbol as a valid key code.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Good refactor, I like the distinction between an accelerator and an action a lot.
At first I thought that the name "accelerator" is just a pun (because electron accelerators exist) but it looks like it's used outside of Electron as well.
/** Inverts shortcuts-keys pairs to allow accessing shortcut by an accelerator. */ | ||
private mapAcceleratorsToActions(): void { | ||
this.acceleratorsToActions.clear(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why does it need to call clear
in the first place? 🤔
If you feel like it, seeing how this is used only in the constructor I'd be for rewriting it to be free of side effects. It could be a function which takes a shortcut config and returns a map. In the constructor, we could assign its return value to this.acceleratorsToActions
.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why does it need to call clear in the first place? 🤔
I think it was prepared to recalculate the shortcuts multiple times (to update them while the app is working), but we do it only once :)
I'd be for rewriting it to be free of side effects.
Done.
@@ -41,18 +41,18 @@ export function useKeyboardShortcutFormatters(): KeyboardShortcutFormatters { | |||
const keyboardShortcuts = keyboardShortcutsService.getShortcutsConfig(); | |||
|
|||
return { | |||
getLabelWithShortcut(label, shortcutKey, options) { | |||
getLabelWithShortcut(label, shortcutAction, options) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Should those functions be renamed to something like getLabelWithAccelerator
, getAccelerator
? I like the action & accelerator distinction, when we say just "shortcut" I feel like we loose the clarity that this distinction brings us.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done! I'm wondering if we should rename the top level useKeyboardShortcutFormatters
. It feels to me like it is a good, more general name 🤔
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm wondering if we should rename the top level
useKeyboardShortcutFormatters
. It feels to me like it is a good, more general name 🤔
I feel the same way.
@@ -61,19 +61,19 @@ export function useKeyboardShortcutFormatters(): KeyboardShortcutFormatters { | |||
|
|||
function formatKeyboardShortcut(options: { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Same question as above.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done
* Make naming around keyboard shortcuts more consistent Previously, we used words like: "key", "type", "shortcut" which were really confusing (and I wrote this code), because it was hard to tell what exactly they describe. From now, we will use only "accelerator" (borrowed from Electron) and "action" words. For example, in a shortcut "Command+1": "tab-1": - "Command+1" is "accelerator" - "tab-1" is "action" * Use "+" instead of "-" as a separator With "-" we are not able to use this symbol as a valid key code. * Rename some config keys to follow the same naming pattern * Rename keyboard shortcuts to match config keys * Extract `mapAcceleratorsToActions` to a function * Rename other "keyboard shortcuts" to "accelerators" and "actions" (cherry picked from commit 717c4fa)
* Connect: Prepare keyboard shortcuts configuration (#22193) * Make naming around keyboard shortcuts more consistent Previously, we used words like: "key", "type", "shortcut" which were really confusing (and I wrote this code), because it was hard to tell what exactly they describe. From now, we will use only "accelerator" (borrowed from Electron) and "action" words. For example, in a shortcut "Command+1": "tab-1": - "Command+1" is "accelerator" - "tab-1" is "action" * Use "+" instead of "-" as a separator With "-" we are not able to use this symbol as a valid key code. * Rename some config keys to follow the same naming pattern * Rename keyboard shortcuts to match config keys * Extract `mapAcceleratorsToActions` to a function * Rename other "keyboard shortcuts" to "accelerators" and "actions" (cherry picked from commit 717c4fa) * Connect: Enable keyboard shortcuts configuration (#22194) * Use event.code for non A-z keys Without this fix, shortcuts like "Shift+1" can't work, because the reported character is "!". * Add Zod schema to validate keyboard shortcuts * Render better formatted error notification, add a link to docs * Notify about duplicated accelerators * Improve the error message for re-parsing failure (it can happen when a default value does not pass validation) * A bunch of renames * Allow spaces in accelerators * Rename `isContentAnObject` * Allow `Notification` to render links and lists * Split by optional whitespace and "+" * Allow lowercase letters * Require a modifier for non-function keys * Move VALID_SHORTCUT_MESSAGE to `initUi` * Always return from `getDuplicateAccelerators` * Use 'Cmd' and 'Ctrl' for mac * Add comments * Fix notification not rendering content * Add more comments, rename `getKeyCode` to `getKeyName` * Fix incorrect size of <Link> text * Remove "expected" prefix * Revert `typeof content === 'object'` in `Notification` * Remove a comment about disabled keys in `ConfigService`, add a note about `keymap.` prefix * Improve `getKeyName` comment * Extract an inline object to a variable in `getKeyName` * Fix notification list padding * Change text for doc link & description for config error * Improve comment for `getKeyName` * Remove special formatting for list === 1 in `Notification` * Print valid modifiers * Call `getKeyboardShortcutSchema()` once * Collect issues from all validations, run `invalidModifiers` through a set * Change error message for `missingModifierIssue` * Convert duplicates warning to error * Define ALLOWED_KEY_CODES in a more concise way * Support both `IntlBackslash` and `Backquote` * Restore modifiers for mac to full spelling, sort them in order recommended by platform guidelines * Fix old comment about the shortcuts order --------- Co-authored-by: Rafał Cieślak <[email protected]> (cherry picked from commit 4830ea1) * Connect: Generate json schema for app config (#22538) * Rename `putAllSync` to `writeSync` * Extend `FileStorage` with functions to replace an entire state and return file path used to create it * Add `updateJsonSchema` function * Generate schema for the app config * Always return a string from `createMockFileStorage().getFilePath()` * Add missing license headers * Rename 'teleport_connect_config_schema.json' to 'schema_app_config.json' * Rename `getKeyboardShortcutDescription` to `getShortcutDesc` * Rename `keyboardShortcutSchema` to `shortcutSchema` * Update a valid shortcut message * Rename `configJsonSchemaFile` to `jsonSchema` * Simplify `updateJsonSchema` * Set `$refStrategy` to none * Add missing description for `usageReporting.enabled` * Bump zod to the latest (improves TS performance) * Move `configService` implementation to `configStore` * Rename `configStore` to `configService` * Move `updateJsonSchema` to `createConfigService` * Move `validateStoredConfig` outside `createConfigService` * Rename `createAppConfigSchema.ts` to `appConfigSchema.ts`, `getKeyboardShortcutSchema.ts` to `keyboardShortcutSchema.ts` * Export `createKeyboardShortcutSchema` * Add license header (cherry picked from commit 9967149) * Connect: Show config file errors (#22728) * Add a function that returns error that might happen during loading the file * Return validation and file loading errors from `ConfigService` * Discard file storage updates when the file was not loaded correctly * Do not show usage reporting dialog when the file was not loaded correctly * Make title of notifications a little bit smaller, so longer titles do not look weird * Get rid of sync fs functions wherever possible in file storage * Move error handling code to `createFileStorage` * Improve `getConfigError` comment * Rename `discardUpdatesWhenLoadingFileFailed` to `discardUpdatesOnLoadError` * Fix the error message in `notifyAboutConfigErrors` * Revert "Make title of notifications a little bit smaller, so longer titles do not look weird" * Make `writeSync` async too * Return `unknown` from `FileStorage.get` * Add a TODO comment about createFileStorage type * Add "the" to "Using default config instead" * Remove `toString()` --------- Co-authored-by: Rafał Cieślak <[email protected]> (cherry picked from commit 17ff6d6) * Connect: Add "Open Config File" item to menu (#22730) * Expose `openConfigFile` IPC * Add "Open Config File" to `NavigationMenu` * Make `NavigationMenu` more concise * Remove unused imports * Call "three dots" menu "More Options" to make it easier to refer to in the docs * Show a notification with a config file path * Render the icon component only in `NavigationItem` * Render the separator only with access request items * Use just `separator` string instead of an object * Render `StyledListItem` as a button * Shorten the notification Co-authored-by: Rafał Cieślak <[email protected]> --------- Co-authored-by: Rafał Cieślak <[email protected]> (cherry picked from commit af9e0ed) * Add docs for Connect config (#22898) * Rename old "quick input" to the current "command bar" feature name * Remove 'Droid Sans Fallback' from Linux fonts * Add docs for config * Link to the proper documentation section * Apply suggestions from @ravicious and @ibeckermayer Co-authored-by: Rafał Cieślak <[email protected]> Co-authored-by: Isaiah Becker-Mayer <[email protected]> * Adjust property descriptions with the names used in User Interface * Drop `Courier New` * Simplify `$schema` description * Fix lint issues * Add a break line after each heading Co-authored-by: Paul Gottschling <[email protected]> * Schema should not be modified * Config file is created on first launch --------- Co-authored-by: Rafał Cieślak <[email protected]> Co-authored-by: Isaiah Becker-Mayer <[email protected]> Co-authored-by: Paul Gottschling <[email protected]> (cherry picked from commit 2d387e1)
1/2
Part of #21914
Initially I wanted to create a single PR for all the changes, but I realized that it will be hard to review. The PR that actually enables shortcuts configuration is here.
In this PR I focused on renaming a few things:
Command+1
) and "action" (e.g.tab1
) words. Previously, we used words like: "key", "type", "shortcut" which were really confusing (even for me who wrote this code 🙃). I borrowed "accelerator" from Electron.keymap.tabNew
, tokeymap.newTab
to make them all more consistent.keymap.toggleClusters
tokeymap.openClusters
. "Toggle" sounds like a more serious and permanent action, while it only opens (and closes) a popup.tab-1
totab1
to match config keys (keymap.tab1
).I also changed the separator for the accelerators. With "-" we were not able to use this symbol as a valid key code.
Best to review commit by commit.