@deephaven/components 0.8.2-beta.1 → 0.9.1-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/dist/AutoCompleteInput.js +8 -0
  2. package/dist/AutoCompleteInput.js.map +1 -1
  3. package/dist/ComboBox.js +12 -0
  4. package/dist/ComboBox.js.map +1 -1
  5. package/dist/CustomTimeSelect.js +9 -0
  6. package/dist/CustomTimeSelect.js.map +1 -1
  7. package/dist/DebouncedSearchInput.js +3 -0
  8. package/dist/DebouncedSearchInput.js.map +1 -1
  9. package/dist/DraggableItemList.js +2 -0
  10. package/dist/DraggableItemList.js.map +1 -1
  11. package/dist/ItemList.js +4 -0
  12. package/dist/ItemList.js.map +1 -1
  13. package/dist/ItemListItem.js +3 -0
  14. package/dist/ItemListItem.js.map +1 -1
  15. package/dist/SearchInput.js +3 -0
  16. package/dist/SearchInput.js.map +1 -1
  17. package/dist/SelectValueList.js +6 -0
  18. package/dist/SelectValueList.js.map +1 -1
  19. package/dist/context-actions/ContextActions.js +3 -0
  20. package/dist/context-actions/ContextActions.js.map +1 -1
  21. package/dist/context-actions/ContextMenu.js +13 -0
  22. package/dist/context-actions/ContextMenu.js.map +1 -1
  23. package/dist/context-actions/ContextMenuRoot.js +7 -0
  24. package/dist/context-actions/ContextMenuRoot.js.map +1 -1
  25. package/dist/menu-actions/DropdownMenu.js +9 -0
  26. package/dist/menu-actions/DropdownMenu.js.map +1 -1
  27. package/dist/menu-actions/Menu.js +7 -0
  28. package/dist/menu-actions/Menu.js.map +1 -1
  29. package/dist/popper/Popper.js +9 -0
  30. package/dist/popper/Popper.js.map +1 -1
  31. package/dist/popper/Tooltip.js +9 -0
  32. package/dist/popper/Tooltip.js.map +1 -1
  33. package/dist/shortcuts/Shortcut.d.ts +6 -1
  34. package/dist/shortcuts/Shortcut.d.ts.map +1 -1
  35. package/dist/shortcuts/Shortcut.js +49 -4
  36. package/dist/shortcuts/Shortcut.js.map +1 -1
  37. package/dist/shortcuts/ShortcutRegistry.d.ts +17 -9
  38. package/dist/shortcuts/ShortcutRegistry.d.ts.map +1 -1
  39. package/dist/shortcuts/ShortcutRegistry.js +48 -21
  40. package/dist/shortcuts/ShortcutRegistry.js.map +1 -1
  41. package/package.json +9 -8
  42. package/dist/tsconfig.tsbuildinfo +0 -1
@@ -1,4 +1,6 @@
1
+ import { EventTarget } from 'event-target-shim';
1
2
  import React from 'react';
3
+ import { CustomEventMap } from '@deephaven/utils';
2
4
  export declare enum MODIFIER {
3
5
  CTRL = "MODIFIER_CTRL",
4
6
  CMD = "MODIFIER_CMD",
@@ -98,7 +100,10 @@ export interface KeyState {
98
100
  export interface ValidKeyState extends KeyState {
99
101
  keyValue: KEY | null;
100
102
  }
101
- export default class Shortcut {
103
+ declare type EventMap = CustomEventMap<{
104
+ onUpdate: CustomEvent<Shortcut>;
105
+ }>;
106
+ export default class Shortcut extends EventTarget<EventMap, 'strict'> {
102
107
  readonly id: string;
103
108
  readonly name: string;
104
109
  readonly tooltip?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"Shortcut.d.ts","sourceRoot":"","sources":["../../src/shortcuts/Shortcut.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Shortcut.d.ts","sourceRoot":"","sources":["../../src/shortcuts/Shortcut.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,11 @@
1
1
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
2
2
 
3
3
  /* eslint-disable no-underscore-dangle */
4
+ import { EventTarget } from 'event-target-shim';
5
+ import { Log } from '@deephaven/log';
6
+ import { EventShimCustomEvent } from '@deephaven/utils';
4
7
  import { ContextActionUtils } from "../context-actions/index.js";
8
+ var log = Log.module('Shortcut');
5
9
  export var MODIFIER; // The value should match the KeyboardEvent.key value
6
10
  // This is the value which will be displayed if no display overrides are done in the OS specific getDisplayString methods
7
11
 
@@ -92,7 +96,8 @@ export var KEY;
92
96
  KEY["F12"] = "F12";
93
97
  })(KEY || (KEY = {}));
94
98
 
95
- export default class Shortcut {
99
+ var ALLOWED_SINGLE_KEY_SET = new Set([KEY.ENTER, KEY.DELETE, KEY.F1, KEY.F2, KEY.F3, KEY.F4, KEY.F5, KEY.F6, KEY.F7, KEY.F8, KEY.F9, KEY.F10, KEY.F11, KEY.F12]);
100
+ export default class Shortcut extends EventTarget {
96
101
  // Unique identifier for the shortcut
97
102
  // e.g. Rename, Save, Run Selected
98
103
 
@@ -112,8 +117,26 @@ export default class Shortcut {
112
117
 
113
118
 
114
119
  static isValidKeyState(state) {
115
- return state.keyValue === null || Shortcut.isAllowedKey(state.keyValue) && (Shortcut.isMacPlatform || !state.metaKey) && ( // MetaKey not allowed in windows
116
- state.altKey || state.ctrlKey || state.metaKey || state.shiftKey || state.keyValue === KEY.ENTER || state.keyValue === KEY.DELETE);
120
+ var {
121
+ keyValue
122
+ } = state;
123
+
124
+ if (keyValue === null) {
125
+ // Null state is valid
126
+ return true;
127
+ }
128
+
129
+ if (!Shortcut.isMacPlatform && state.metaKey) {
130
+ // MetaKey not allowed in windows
131
+ return false;
132
+ }
133
+
134
+ if (!Shortcut.isAllowedKey(keyValue)) {
135
+ return false;
136
+ }
137
+
138
+ var isSingleKey = !state.altKey && !state.ctrlKey && !state.metaKey && !state.shiftKey;
139
+ return !isSingleKey || ALLOWED_SINGLE_KEY_SET.has(keyValue);
117
140
  }
118
141
 
119
142
  /**
@@ -164,7 +187,9 @@ export default class Shortcut {
164
187
 
165
188
  if (eventKey === 'Shift' || eventKey === 'Meta' || eventKey === 'Control' || eventKey === 'Alt') {
166
189
  key = '';
167
- } else if (!Shortcut.isAllowedKey(eventKey) && Shortcut.isAllowedKey(String.fromCharCode(keyCode))) {
190
+ } else if ( // This is primarily for Mac which has a symbol keyboard hidden behind the alt key
191
+ // The keyCode still corresponds to the letter keyCode, but the key value will be a symbol
192
+ !Shortcut.isAllowedKey(eventKey) && Shortcut.isAllowedKey(String.fromCharCode(keyCode))) {
168
193
  key = String.fromCharCode(keyCode);
169
194
  } else {
170
195
  key = eventKey;
@@ -299,6 +324,20 @@ export default class Shortcut {
299
324
  name,
300
325
  tooltip
301
326
  } = _ref;
327
+ super();
328
+
329
+ _defineProperty(this, "id", void 0);
330
+
331
+ _defineProperty(this, "name", void 0);
332
+
333
+ _defineProperty(this, "tooltip", void 0);
334
+
335
+ _defineProperty(this, "isEditable", void 0);
336
+
337
+ _defineProperty(this, "defaultKeyState", void 0);
338
+
339
+ _defineProperty(this, "keyState", void 0);
340
+
302
341
  this.id = id;
303
342
  this.name = name;
304
343
  this.tooltip = tooltip;
@@ -332,7 +371,13 @@ export default class Shortcut {
332
371
 
333
372
  setKeyState(keyState) {
334
373
  if (Shortcut.isValidKeyState(keyState)) {
374
+ log.debug2("Shortcut ".concat(this.id, " updated to ").concat(JSON.stringify(keyState)));
335
375
  this.keyState = keyState;
376
+ this.dispatchEvent(new EventShimCustomEvent('onUpdate', {
377
+ detail: this
378
+ }));
379
+ } else {
380
+ log.debug2("Shortcut ".concat(this.id, " tried to update to invalid keyState ").concat(JSON.stringify(keyState)));
336
381
  }
337
382
  }
338
383
  /**
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/shortcuts/Shortcut.ts"],"names":["ContextActionUtils","MODIFIER","KEY","Shortcut","isAllowedKey","key","Object","values","includes","isValidKeyState","state","keyValue","isMacPlatform","metaKey","altKey","ctrlKey","shiftKey","ENTER","DELETE","createKeyState","keys","keyState","length","forEach","CTRL","ALT","OPTION","CMD","SHIFT","getKeyStateFromEvent","e","eventKey","keyCode","String","fromCharCode","getWindowsDisplayText","display","ESCAPE","getMacDisplayText","BACKSPACE","doKeyStatesMatch","state1","state2","toUpperCase","getDisplayText","constructor","id","shortcut","macShortcut","isEditable","name","tooltip","isMac","activeShortcut","defaultKeyState","getKeyState","setKeyState","getDefaultKeyState","isDefault","setToNull","NULL_KEY_STATE","isNull","setToDefault","matchesKeyState","matchesEvent"],"mappings":"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","sourcesContent":["/* eslint-disable no-underscore-dangle */\nimport React from 'react';\nimport { ContextActionUtils } from '../context-actions';\n\nexport enum MODIFIER {\n CTRL = 'MODIFIER_CTRL',\n CMD = 'MODIFIER_CMD',\n ALT = 'MODIFIER_ALT',\n OPTION = 'MODIFIER_OPTION',\n SHIFT = 'MODIFIER_SHIFT',\n}\n\n// The value should match the KeyboardEvent.key value\n// This is the value which will be displayed if no display overrides are done in the OS specific getDisplayString methods\nexport enum KEY {\n A = 'A',\n B = 'B',\n C = 'C',\n D = 'D',\n E = 'E',\n F = 'F',\n G = 'G',\n H = 'H',\n I = 'I',\n J = 'J',\n K = 'K',\n L = 'L',\n M = 'M',\n N = 'N',\n O = 'O',\n P = 'P',\n Q = 'Q',\n R = 'R',\n S = 'S',\n T = 'T',\n U = 'U',\n V = 'V',\n W = 'W',\n X = 'X',\n Y = 'Y',\n Z = 'Z',\n ZERO = '0',\n ONE = '1',\n TWO = '2',\n THREE = '3',\n FOUR = '4',\n FIVE = '5',\n SIX = '6',\n SEVEN = '7',\n EIGHT = '8',\n NINE = '9',\n BACKSPACE = 'Backspace',\n ESCAPE = 'Escape',\n ENTER = 'Enter',\n DELETE = 'Delete',\n SLASH = '/',\n QUESTION_MARK = '?',\n BACKSLASH = '\\\\',\n PIPE = '|',\n MINUS = '-',\n UNDERSCORE = '_',\n EQUALS = '=',\n PLUS = '+',\n BACKTICK = '`',\n TILDE = '~',\n COMMA = ',',\n LEFT_CHEVRON = '<',\n PERIOD = '.',\n RIGHT_CHEVRON = '>',\n SEMICOLON = ';',\n COLON = ':',\n SINGLE_QUOTE = \"'\",\n DOUBLE_QUOTE = '\"',\n LEFT_BRACKET = '[',\n RIGHT_BRACKET = ']',\n LEFT_CURLY = '{',\n RIGHT_CURLY = '}',\n F1 = 'F1',\n F2 = 'F2',\n F3 = 'F3',\n F4 = 'F4',\n F5 = 'F5',\n F6 = 'F6',\n F7 = 'F7',\n F8 = 'F8',\n F9 = 'F9',\n F10 = 'F10',\n F11 = 'F11',\n F12 = 'F12',\n}\n\ntype ShortcutKeys = [...MODIFIER[], KEY];\n\nexport interface KeyState {\n /**\n * This is purposely keyValue and not key to make KeyboardEvents not match the interface\n * KeyboardEvents need some processing to get the actual value\n * Use Shortcut.getKeyStateFromEvent to get the right KeyState from an event\n */\n keyValue: string | null;\n altKey: boolean;\n ctrlKey: boolean;\n metaKey: boolean;\n shiftKey: boolean;\n}\n\nexport interface ValidKeyState extends KeyState {\n keyValue: KEY | null;\n}\n\nexport default class Shortcut {\n readonly id: string; // Unique identifier for the shortcut\n\n readonly name: string; // e.g. Rename, Save, Run Selected\n\n readonly tooltip?: string;\n\n readonly isEditable: boolean;\n\n private readonly defaultKeyState: ValidKeyState;\n\n private keyState: ValidKeyState;\n\n static NULL_KEY_STATE: ValidKeyState = {\n metaKey: false,\n shiftKey: false,\n altKey: false,\n ctrlKey: false,\n keyValue: null,\n };\n\n /**\n * Use to check if a keyCode corresponds to an allowed key for a shortcut\n * @param keyCode The keyCode to check. This should be the charCode of the key\n * @returns Type predicate asserting the key is an allowed KEY\n */\n static isAllowedKey(key: string | null): key is KEY {\n return Object.values(KEY).includes(key as KEY);\n }\n\n /**\n * Checks if a KeyState has a valid key.\n * @param state KeyState with any string as the key\n * @returns True if KeyState is is using an allowed keyCode\n */\n static isValidKeyState(state: KeyState): state is ValidKeyState {\n return (\n state.keyValue === null ||\n (Shortcut.isAllowedKey(state.keyValue) &&\n (Shortcut.isMacPlatform || !state.metaKey) && // MetaKey not allowed in windows\n (state.altKey ||\n state.ctrlKey ||\n state.metaKey ||\n state.shiftKey ||\n state.keyValue === KEY.ENTER ||\n state.keyValue === KEY.DELETE))\n );\n }\n\n static isMacPlatform = ContextActionUtils.isMacPlatform();\n\n /**\n * Creates a KeyState from a valid array of modifier and key constants\n * @param keys Array of keys in the shortcut. Modifiers first and key last. Should use the MODIFIER and KEY enums\n * @returns KeyState representing the array of constants\n */\n static createKeyState(keys: ShortcutKeys): ValidKeyState {\n const keyState: ValidKeyState = {\n altKey: false,\n ctrlKey: false,\n metaKey: false,\n shiftKey: false,\n keyValue: keys[keys.length - 1] as KEY,\n };\n\n keys.forEach(key => {\n switch (key) {\n case MODIFIER.CTRL:\n keyState.ctrlKey = true;\n break;\n case MODIFIER.ALT:\n case MODIFIER.OPTION:\n keyState.altKey = true;\n break;\n case MODIFIER.CMD:\n keyState.metaKey = true;\n break;\n case MODIFIER.SHIFT:\n keyState.shiftKey = true;\n break;\n default:\n break;\n }\n });\n\n return keyState;\n }\n\n static getKeyStateFromEvent(\n e: React.KeyboardEvent | KeyboardEvent\n ): KeyState {\n const { key: eventKey, keyCode } = e;\n let key = '';\n if (\n eventKey === 'Shift' ||\n eventKey === 'Meta' ||\n eventKey === 'Control' ||\n eventKey === 'Alt'\n ) {\n key = '';\n } else if (\n !Shortcut.isAllowedKey(eventKey) &&\n Shortcut.isAllowedKey(String.fromCharCode(keyCode))\n ) {\n key = String.fromCharCode(keyCode);\n } else {\n key = eventKey;\n }\n\n return {\n keyValue: key,\n altKey: e.altKey,\n ctrlKey: e.ctrlKey,\n metaKey: e.metaKey,\n shiftKey: e.shiftKey,\n };\n }\n\n /**\n * Gets display string for Windows (and Linux + any other non-Mac OS)\n * If the key is not an allowed key, the display will only display the modifiers\n * @param keyState KeyState to get the display for\n * @returns The string to display on Windows/non-Mac OS\n */\n private static getWindowsDisplayText(keyState: KeyState): string {\n let display = '';\n\n if (keyState.ctrlKey) {\n display += 'Ctrl+';\n }\n if (keyState.altKey) {\n display += 'Alt+';\n }\n if (keyState.shiftKey) {\n display += 'Shift+';\n }\n\n if (keyState.keyValue === KEY.ESCAPE) {\n display += 'Esc';\n } else if (keyState.keyValue !== null) {\n display += keyState.keyValue;\n }\n\n return display;\n }\n\n /**\n * Gets display string Mac OS\n * If the key is not an allowed key, the display will only display the modifiers\n * @param keyState KeyState to get the display for\n * @returns The string to display on Mac OS\n */\n private static getMacDisplayText(keyState: KeyState): string {\n let display = '';\n\n if (keyState.ctrlKey) {\n display += '⌃';\n }\n if (keyState.altKey) {\n display += '⌥';\n }\n if (keyState.shiftKey) {\n display += '⇧';\n }\n if (keyState.metaKey) {\n display += '⌘';\n }\n\n switch (keyState.keyValue) {\n case KEY.ENTER:\n display += '⏎';\n break;\n case KEY.ESCAPE:\n display += '⎋';\n break;\n case KEY.BACKSPACE:\n display += '⌫';\n break;\n case KEY.DELETE:\n display += '⌦';\n break;\n case null:\n break;\n default:\n display += keyState.keyValue;\n }\n\n return display;\n }\n\n /**\n * Checks if 2 KeyStates match\n * @param state1 First KeyState to compare\n * @param state2 Second KeyState to compare\n * @returns True if the KeyStates match and have non-null keyValues\n */\n static doKeyStatesMatch(state1: KeyState, state2: KeyState): boolean {\n return (\n state1.keyValue?.toUpperCase() === state2.keyValue?.toUpperCase() &&\n state1.altKey === state2.altKey &&\n state1.ctrlKey === state2.ctrlKey &&\n state1.metaKey === state2.metaKey &&\n state1.shiftKey === state2.shiftKey\n );\n }\n\n /**\n * Gets the display string for the current OS from a KeyState.\n * @param keyState KeyState to get the display for\n * @returns Display string for the current OS\n */\n static getDisplayText(keyState: KeyState): string {\n if (keyState.keyValue === null) {\n return '';\n }\n return Shortcut.isMacPlatform\n ? Shortcut.getMacDisplayText(keyState)\n : Shortcut.getWindowsDisplayText(keyState);\n }\n\n constructor({\n id,\n shortcut,\n macShortcut,\n isEditable = true,\n name,\n tooltip,\n }: {\n id: string;\n shortcut: ShortcutKeys;\n macShortcut: ShortcutKeys;\n isEditable?: boolean;\n name: string;\n tooltip?: string;\n }) {\n this.id = id;\n this.name = name;\n this.tooltip = tooltip;\n this.isEditable = isEditable;\n\n const isMac = Shortcut.isMacPlatform;\n const activeShortcut = isMac ? macShortcut : shortcut;\n this.defaultKeyState = Shortcut.createKeyState(activeShortcut);\n this.keyState = this.defaultKeyState;\n }\n\n /**\n * Gets the display string for the current OS\n */\n getDisplayText(): string {\n return Shortcut.getDisplayText(this.keyState);\n }\n\n /**\n * Gets the current keyState for the Shortcut\n */\n getKeyState(): ValidKeyState {\n return this.keyState;\n }\n\n /**\n * Sets the KeyState if it is valid\n * @param keyState\n */\n setKeyState(keyState: KeyState): void {\n if (Shortcut.isValidKeyState(keyState)) {\n this.keyState = keyState;\n }\n }\n\n /**\n * Gets the default key state of the shortcut\n * @returns Default key state\n */\n getDefaultKeyState(): ValidKeyState {\n return this.defaultKeyState;\n }\n\n isDefault(): boolean {\n return Shortcut.doKeyStatesMatch(\n this.getDefaultKeyState(),\n this.getKeyState()\n );\n }\n\n /**\n * Sets the shortcut to have null keyValue\n */\n setToNull(): void {\n this.setKeyState(Shortcut.NULL_KEY_STATE);\n }\n\n isNull(): boolean {\n return Shortcut.doKeyStatesMatch(this.keyState, Shortcut.NULL_KEY_STATE);\n }\n\n /**\n * Sets the shortcut to its default key state\n */\n setToDefault(): void {\n this.setKeyState(this.defaultKeyState);\n }\n\n /**\n * Checks if a KeyState matches the KeyState for the shortcut\n * @param keyState KeyState to check\n * @returns True if the passed KeyState matches the Shortcut's KeyState\n */\n matchesKeyState(keyState: KeyState): boolean {\n return Shortcut.doKeyStatesMatch(keyState, this.keyState);\n }\n\n /**\n * Alias for matchesKeyState\n * @param e KeyboardEvent to check if the Shortcut matches\n * @returns True if the event matches the Shortcut's KeyState\n */\n matchesEvent(e: React.KeyboardEvent | KeyboardEvent): boolean {\n return this.matchesKeyState(Shortcut.getKeyStateFromEvent(e));\n }\n}\n"],"file":"Shortcut.js"}
1
+ {"version":3,"sources":["../../src/shortcuts/Shortcut.ts"],"names":["EventTarget","Log","EventShimCustomEvent","ContextActionUtils","log","module","MODIFIER","KEY","ALLOWED_SINGLE_KEY_SET","Set","ENTER","DELETE","F1","F2","F3","F4","F5","F6","F7","F8","F9","F10","F11","F12","Shortcut","isAllowedKey","key","Object","values","includes","isValidKeyState","state","keyValue","isMacPlatform","metaKey","isSingleKey","altKey","ctrlKey","shiftKey","has","createKeyState","keys","keyState","length","forEach","CTRL","ALT","OPTION","CMD","SHIFT","getKeyStateFromEvent","e","eventKey","keyCode","String","fromCharCode","getWindowsDisplayText","display","ESCAPE","getMacDisplayText","BACKSPACE","doKeyStatesMatch","state1","state2","toUpperCase","getDisplayText","constructor","id","shortcut","macShortcut","isEditable","name","tooltip","isMac","activeShortcut","defaultKeyState","getKeyState","setKeyState","debug2","JSON","stringify","dispatchEvent","detail","getDefaultKeyState","isDefault","setToNull","NULL_KEY_STATE","isNull","setToDefault","matchesKeyState","matchesEvent"],"mappings":"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","sourcesContent":["/* eslint-disable no-underscore-dangle */\nimport { EventTarget } from 'event-target-shim';\nimport React from 'react';\nimport { Log } from '@deephaven/log';\nimport { CustomEventMap, EventShimCustomEvent } from '@deephaven/utils';\nimport { ContextActionUtils } from '../context-actions';\n\nconst log = Log.module('Shortcut');\n\nexport enum MODIFIER {\n CTRL = 'MODIFIER_CTRL',\n CMD = 'MODIFIER_CMD',\n ALT = 'MODIFIER_ALT',\n OPTION = 'MODIFIER_OPTION',\n SHIFT = 'MODIFIER_SHIFT',\n}\n\n// The value should match the KeyboardEvent.key value\n// This is the value which will be displayed if no display overrides are done in the OS specific getDisplayString methods\nexport enum KEY {\n A = 'A',\n B = 'B',\n C = 'C',\n D = 'D',\n E = 'E',\n F = 'F',\n G = 'G',\n H = 'H',\n I = 'I',\n J = 'J',\n K = 'K',\n L = 'L',\n M = 'M',\n N = 'N',\n O = 'O',\n P = 'P',\n Q = 'Q',\n R = 'R',\n S = 'S',\n T = 'T',\n U = 'U',\n V = 'V',\n W = 'W',\n X = 'X',\n Y = 'Y',\n Z = 'Z',\n ZERO = '0',\n ONE = '1',\n TWO = '2',\n THREE = '3',\n FOUR = '4',\n FIVE = '5',\n SIX = '6',\n SEVEN = '7',\n EIGHT = '8',\n NINE = '9',\n BACKSPACE = 'Backspace',\n ESCAPE = 'Escape',\n ENTER = 'Enter',\n DELETE = 'Delete',\n SLASH = '/',\n QUESTION_MARK = '?',\n BACKSLASH = '\\\\',\n PIPE = '|',\n MINUS = '-',\n UNDERSCORE = '_',\n EQUALS = '=',\n PLUS = '+',\n BACKTICK = '`',\n TILDE = '~',\n COMMA = ',',\n LEFT_CHEVRON = '<',\n PERIOD = '.',\n RIGHT_CHEVRON = '>',\n SEMICOLON = ';',\n COLON = ':',\n SINGLE_QUOTE = \"'\",\n DOUBLE_QUOTE = '\"',\n LEFT_BRACKET = '[',\n RIGHT_BRACKET = ']',\n LEFT_CURLY = '{',\n RIGHT_CURLY = '}',\n F1 = 'F1',\n F2 = 'F2',\n F3 = 'F3',\n F4 = 'F4',\n F5 = 'F5',\n F6 = 'F6',\n F7 = 'F7',\n F8 = 'F8',\n F9 = 'F9',\n F10 = 'F10',\n F11 = 'F11',\n F12 = 'F12',\n}\n\nconst ALLOWED_SINGLE_KEY_SET: Set<KEY> = new Set([\n KEY.ENTER,\n KEY.DELETE,\n KEY.F1,\n KEY.F2,\n KEY.F3,\n KEY.F4,\n KEY.F5,\n KEY.F6,\n KEY.F7,\n KEY.F8,\n KEY.F9,\n KEY.F10,\n KEY.F11,\n KEY.F12,\n]);\n\ntype ShortcutKeys = [...MODIFIER[], KEY];\n\nexport interface KeyState {\n /**\n * This is purposely keyValue and not key to make KeyboardEvents not match the interface\n * KeyboardEvents need some processing to get the actual value\n * Use Shortcut.getKeyStateFromEvent to get the right KeyState from an event\n */\n keyValue: string | null;\n altKey: boolean;\n ctrlKey: boolean;\n metaKey: boolean;\n shiftKey: boolean;\n}\n\nexport interface ValidKeyState extends KeyState {\n keyValue: KEY | null;\n}\n\ntype EventMap = CustomEventMap<{\n onUpdate: CustomEvent<Shortcut>;\n}>;\n\nexport default class Shortcut extends EventTarget<EventMap, 'strict'> {\n readonly id: string; // Unique identifier for the shortcut\n\n readonly name: string; // e.g. Rename, Save, Run Selected\n\n readonly tooltip?: string;\n\n readonly isEditable: boolean;\n\n private readonly defaultKeyState: ValidKeyState;\n\n private keyState: ValidKeyState;\n\n static NULL_KEY_STATE: ValidKeyState = {\n metaKey: false,\n shiftKey: false,\n altKey: false,\n ctrlKey: false,\n keyValue: null,\n };\n\n /**\n * Use to check if a keyCode corresponds to an allowed key for a shortcut\n * @param keyCode The keyCode to check. This should be the charCode of the key\n * @returns Type predicate asserting the key is an allowed KEY\n */\n static isAllowedKey(key: string | null): key is KEY {\n return Object.values(KEY).includes(key as KEY);\n }\n\n /**\n * Checks if a KeyState has a valid key.\n * @param state KeyState with any string as the key\n * @returns True if KeyState is is using an allowed keyCode\n */\n static isValidKeyState(state: KeyState): state is ValidKeyState {\n const { keyValue } = state;\n\n if (keyValue === null) {\n // Null state is valid\n return true;\n }\n\n if (!Shortcut.isMacPlatform && state.metaKey) {\n // MetaKey not allowed in windows\n return false;\n }\n\n if (!Shortcut.isAllowedKey(keyValue)) {\n return false;\n }\n\n const isSingleKey =\n !state.altKey && !state.ctrlKey && !state.metaKey && !state.shiftKey;\n\n return !isSingleKey || ALLOWED_SINGLE_KEY_SET.has(keyValue);\n }\n\n static isMacPlatform = ContextActionUtils.isMacPlatform();\n\n /**\n * Creates a KeyState from a valid array of modifier and key constants\n * @param keys Array of keys in the shortcut. Modifiers first and key last. Should use the MODIFIER and KEY enums\n * @returns KeyState representing the array of constants\n */\n static createKeyState(keys: ShortcutKeys): ValidKeyState {\n const keyState: ValidKeyState = {\n altKey: false,\n ctrlKey: false,\n metaKey: false,\n shiftKey: false,\n keyValue: keys[keys.length - 1] as KEY,\n };\n\n keys.forEach(key => {\n switch (key) {\n case MODIFIER.CTRL:\n keyState.ctrlKey = true;\n break;\n case MODIFIER.ALT:\n case MODIFIER.OPTION:\n keyState.altKey = true;\n break;\n case MODIFIER.CMD:\n keyState.metaKey = true;\n break;\n case MODIFIER.SHIFT:\n keyState.shiftKey = true;\n break;\n default:\n break;\n }\n });\n\n return keyState;\n }\n\n static getKeyStateFromEvent(\n e: React.KeyboardEvent | KeyboardEvent\n ): KeyState {\n const { key: eventKey, keyCode } = e;\n let key = '';\n if (\n eventKey === 'Shift' ||\n eventKey === 'Meta' ||\n eventKey === 'Control' ||\n eventKey === 'Alt'\n ) {\n key = '';\n } else if (\n // This is primarily for Mac which has a symbol keyboard hidden behind the alt key\n // The keyCode still corresponds to the letter keyCode, but the key value will be a symbol\n !Shortcut.isAllowedKey(eventKey) &&\n Shortcut.isAllowedKey(String.fromCharCode(keyCode))\n ) {\n key = String.fromCharCode(keyCode);\n } else {\n key = eventKey;\n }\n\n return {\n keyValue: key,\n altKey: e.altKey,\n ctrlKey: e.ctrlKey,\n metaKey: e.metaKey,\n shiftKey: e.shiftKey,\n };\n }\n\n /**\n * Gets display string for Windows (and Linux + any other non-Mac OS)\n * If the key is not an allowed key, the display will only display the modifiers\n * @param keyState KeyState to get the display for\n * @returns The string to display on Windows/non-Mac OS\n */\n private static getWindowsDisplayText(keyState: KeyState): string {\n let display = '';\n\n if (keyState.ctrlKey) {\n display += 'Ctrl+';\n }\n if (keyState.altKey) {\n display += 'Alt+';\n }\n if (keyState.shiftKey) {\n display += 'Shift+';\n }\n\n if (keyState.keyValue === KEY.ESCAPE) {\n display += 'Esc';\n } else if (keyState.keyValue !== null) {\n display += keyState.keyValue;\n }\n\n return display;\n }\n\n /**\n * Gets display string Mac OS\n * If the key is not an allowed key, the display will only display the modifiers\n * @param keyState KeyState to get the display for\n * @returns The string to display on Mac OS\n */\n private static getMacDisplayText(keyState: KeyState): string {\n let display = '';\n\n if (keyState.ctrlKey) {\n display += '⌃';\n }\n if (keyState.altKey) {\n display += '⌥';\n }\n if (keyState.shiftKey) {\n display += '⇧';\n }\n if (keyState.metaKey) {\n display += '⌘';\n }\n\n switch (keyState.keyValue) {\n case KEY.ENTER:\n display += '⏎';\n break;\n case KEY.ESCAPE:\n display += '⎋';\n break;\n case KEY.BACKSPACE:\n display += '⌫';\n break;\n case KEY.DELETE:\n display += '⌦';\n break;\n case null:\n break;\n default:\n display += keyState.keyValue;\n }\n\n return display;\n }\n\n /**\n * Checks if 2 KeyStates match\n * @param state1 First KeyState to compare\n * @param state2 Second KeyState to compare\n * @returns True if the KeyStates match and have non-null keyValues\n */\n static doKeyStatesMatch(state1: KeyState, state2: KeyState): boolean {\n return (\n state1.keyValue?.toUpperCase() === state2.keyValue?.toUpperCase() &&\n state1.altKey === state2.altKey &&\n state1.ctrlKey === state2.ctrlKey &&\n state1.metaKey === state2.metaKey &&\n state1.shiftKey === state2.shiftKey\n );\n }\n\n /**\n * Gets the display string for the current OS from a KeyState.\n * @param keyState KeyState to get the display for\n * @returns Display string for the current OS\n */\n static getDisplayText(keyState: KeyState): string {\n if (keyState.keyValue === null) {\n return '';\n }\n return Shortcut.isMacPlatform\n ? Shortcut.getMacDisplayText(keyState)\n : Shortcut.getWindowsDisplayText(keyState);\n }\n\n constructor({\n id,\n shortcut,\n macShortcut,\n isEditable = true,\n name,\n tooltip,\n }: {\n id: string;\n shortcut: ShortcutKeys;\n macShortcut: ShortcutKeys;\n isEditable?: boolean;\n name: string;\n tooltip?: string;\n }) {\n super();\n this.id = id;\n this.name = name;\n this.tooltip = tooltip;\n this.isEditable = isEditable;\n\n const isMac = Shortcut.isMacPlatform;\n const activeShortcut = isMac ? macShortcut : shortcut;\n this.defaultKeyState = Shortcut.createKeyState(activeShortcut);\n this.keyState = this.defaultKeyState;\n }\n\n /**\n * Gets the display string for the current OS\n */\n getDisplayText(): string {\n return Shortcut.getDisplayText(this.keyState);\n }\n\n /**\n * Gets the current keyState for the Shortcut\n */\n getKeyState(): ValidKeyState {\n return this.keyState;\n }\n\n /**\n * Sets the KeyState if it is valid\n * @param keyState\n */\n setKeyState(keyState: KeyState): void {\n if (Shortcut.isValidKeyState(keyState)) {\n log.debug2(`Shortcut ${this.id} updated to ${JSON.stringify(keyState)}`);\n this.keyState = keyState;\n this.dispatchEvent(\n new EventShimCustomEvent('onUpdate', { detail: this })\n );\n } else {\n log.debug2(\n `Shortcut ${\n this.id\n } tried to update to invalid keyState ${JSON.stringify(keyState)}`\n );\n }\n }\n\n /**\n * Gets the default key state of the shortcut\n * @returns Default key state\n */\n getDefaultKeyState(): ValidKeyState {\n return this.defaultKeyState;\n }\n\n isDefault(): boolean {\n return Shortcut.doKeyStatesMatch(\n this.getDefaultKeyState(),\n this.getKeyState()\n );\n }\n\n /**\n * Sets the shortcut to have null keyValue\n */\n setToNull(): void {\n this.setKeyState(Shortcut.NULL_KEY_STATE);\n }\n\n isNull(): boolean {\n return Shortcut.doKeyStatesMatch(this.keyState, Shortcut.NULL_KEY_STATE);\n }\n\n /**\n * Sets the shortcut to its default key state\n */\n setToDefault(): void {\n this.setKeyState(this.defaultKeyState);\n }\n\n /**\n * Checks if a KeyState matches the KeyState for the shortcut\n * @param keyState KeyState to check\n * @returns True if the passed KeyState matches the Shortcut's KeyState\n */\n matchesKeyState(keyState: KeyState): boolean {\n return Shortcut.doKeyStatesMatch(keyState, this.keyState);\n }\n\n /**\n * Alias for matchesKeyState\n * @param e KeyboardEvent to check if the Shortcut matches\n * @returns True if the event matches the Shortcut's KeyState\n */\n matchesEvent(e: React.KeyboardEvent | KeyboardEvent): boolean {\n return this.matchesKeyState(Shortcut.getKeyStateFromEvent(e));\n }\n}\n"],"file":"Shortcut.js"}
@@ -1,30 +1,38 @@
1
+ import { EventTarget } from 'event-target-shim';
2
+ import { CustomEventMap } from '@deephaven/utils';
1
3
  import Shortcut, { KeyState } from './Shortcut';
2
- export default class ShortcutRegistry {
3
- static readonly shortcutMap: Map<string, Shortcut>;
4
- static readonly shortcutsByCategory: Map<string, Shortcut[]>;
4
+ declare type EventMap = CustomEventMap<{
5
+ onUpdate: CustomEvent<Shortcut>;
6
+ }>;
7
+ declare class ShortcutRegistry extends EventTarget<EventMap, 'strict'> {
8
+ readonly shortcutMap: Map<string, Shortcut>;
9
+ readonly shortcutsByCategory: Map<string, Shortcut[]>;
5
10
  /**
6
11
  * Creates a Shortcut and adds it to the registry
7
12
  * @param params The constructor params for the {@link Shortcut}
8
- * @returns The created Shortcut
13
+ * @returns The created shortcut or the shortcut in the registry if 1 already exists w/ the same ID
9
14
  */
10
- static createAndAdd(params: ConstructorParameters<typeof Shortcut>[0]): Shortcut;
15
+ createAndAdd(params: ConstructorParameters<typeof Shortcut>[0]): Shortcut;
11
16
  /**
12
- * Adds a shortcut to the registry. Throws if a shortcut with the same ID already exists
17
+ * Adds a shortcut to the registry. Warns and returns existing shortcut if a shortcut with the same ID already exists
13
18
  * @param shortcut Shortcut to add to the registry
19
+ * @returns Shortcut passed if it is not in the registry. Shortcut from the registry if one exists for the same ID
14
20
  */
15
- static add(shortcut: Shortcut): void;
21
+ add(shortcut: Shortcut): Shortcut;
16
22
  /**
17
23
  * Gets a shortcut from the registry from an ID
18
24
  * @param id ID of the shortcut
19
25
  * @returns The shortcut for that ID if it exists
20
26
  */
21
- static get(id: string): Shortcut | undefined;
27
+ get(id: string): Shortcut | undefined;
22
28
  /**
23
29
  * Gets an array of any registered shortcuts with conflicting key states.
24
30
  * Only checks the key states of the current OS (Mac or Windows/Linux)
25
31
  * @param keyState
26
32
  * @returns Array of conflicting shortcuts. Empty array if none conflict
27
33
  */
28
- static getConflictingShortcuts(keyState: KeyState): Shortcut[];
34
+ getConflictingShortcuts(keyState: KeyState): Shortcut[];
29
35
  }
36
+ declare const registry: Readonly<ShortcutRegistry>;
37
+ export default registry;
30
38
  //# sourceMappingURL=ShortcutRegistry.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ShortcutRegistry.d.ts","sourceRoot":"","sources":["../../src/shortcuts/ShortcutRegistry.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,EAAE,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEhD,MAAM,CAAC,OAAO,OAAO,gBAAgB;IACnC,MAAM,CAAC,QAAQ,CAAC,WAAW,wBAA+B;IAE1D,MAAM,CAAC,QAAQ,CAAC,mBAAmB,0BAAiC;IAEpE;;;;OAIG;IACH,MAAM,CAAC,YAAY,CACjB,MAAM,EAAE,qBAAqB,CAAC,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,GAChD,QAAQ;IAMX;;;OAGG;IACH,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI;IAiBpC;;;;OAIG;IACH,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS;IAI5C;;;;;OAKG;IACH,MAAM,CAAC,uBAAuB,CAAC,QAAQ,EAAE,QAAQ,GAAG,QAAQ,EAAE;CAK/D"}
1
+ {"version":3,"file":"ShortcutRegistry.d.ts","sourceRoot":"","sources":["../../src/shortcuts/ShortcutRegistry.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAE,cAAc,EAAwB,MAAM,kBAAkB,CAAC;AACxE,OAAO,QAAQ,EAAE,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAIhD,aAAK,QAAQ,GAAG,cAAc,CAAC;IAC7B,QAAQ,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAC;CACjC,CAAC,CAAC;AAEH,cAAM,gBAAiB,SAAQ,WAAW,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5D,QAAQ,CAAC,WAAW,wBAA+B;IAEnD,QAAQ,CAAC,mBAAmB,0BAAiC;IAE7D;;;;OAIG;IACH,YAAY,CAAC,MAAM,EAAE,qBAAqB,CAAC,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,QAAQ;IAKzE;;;;OAIG;IACH,GAAG,CAAC,QAAQ,EAAE,QAAQ,GAAG,QAAQ;IA2BjC;;;;OAIG;IACH,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS;IAIrC;;;;;OAKG;IACH,uBAAuB,CAAC,QAAQ,EAAE,QAAQ,GAAG,QAAQ,EAAE;CAKxD;AAED,QAAA,MAAM,QAAQ,4BAAwC,CAAC;AAEvD,eAAe,QAAQ,CAAC"}
@@ -1,38 +1,66 @@
1
1
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
2
2
 
3
+ /* eslint-disable max-classes-per-file */
4
+ import { EventTarget } from 'event-target-shim';
5
+ import { Log } from '@deephaven/log';
6
+ import { EventShimCustomEvent } from '@deephaven/utils';
3
7
  import Shortcut from "./Shortcut.js";
4
- export default class ShortcutRegistry {
8
+ var log = Log.module('ShortcutRegistry');
9
+
10
+ class ShortcutRegistry extends EventTarget {
11
+ constructor() {
12
+ super(...arguments);
13
+
14
+ _defineProperty(this, "shortcutMap", new Map());
15
+
16
+ _defineProperty(this, "shortcutsByCategory", new Map());
17
+ }
18
+
5
19
  /**
6
20
  * Creates a Shortcut and adds it to the registry
7
21
  * @param params The constructor params for the {@link Shortcut}
8
- * @returns The created Shortcut
22
+ * @returns The created shortcut or the shortcut in the registry if 1 already exists w/ the same ID
9
23
  */
10
- static createAndAdd(params) {
24
+ createAndAdd(params) {
11
25
  var shortcut = new Shortcut(params);
12
- ShortcutRegistry.add(shortcut);
13
- return shortcut;
26
+ return this.add(shortcut);
14
27
  }
15
28
  /**
16
- * Adds a shortcut to the registry. Throws if a shortcut with the same ID already exists
29
+ * Adds a shortcut to the registry. Warns and returns existing shortcut if a shortcut with the same ID already exists
17
30
  * @param shortcut Shortcut to add to the registry
31
+ * @returns Shortcut passed if it is not in the registry. Shortcut from the registry if one exists for the same ID
18
32
  */
19
33
 
20
34
 
21
- static add(shortcut) {
22
- if (ShortcutRegistry.shortcutMap.has(shortcut.id)) {
23
- throw new Error("Skipping attempt to add duplicate shortcut ID to registry: ".concat(shortcut.id));
35
+ add(shortcut) {
36
+ var existingShortcut = this.shortcutMap.get(shortcut.id);
37
+
38
+ if (existingShortcut) {
39
+ log.warn("Skipping attempt to add duplicate shortcut ID to registry: ".concat(shortcut.id));
40
+ return existingShortcut;
24
41
  }
25
42
 
43
+ log.debug2("Adding shortcut to registry: ".concat(shortcut.id));
44
+ shortcut.addEventListener('onUpdate', _ref => {
45
+ var {
46
+ detail
47
+ } = _ref;
48
+ return this.dispatchEvent(new EventShimCustomEvent('onUpdate', {
49
+ detail
50
+ }));
51
+ });
26
52
  var category = shortcut.id.split('.')[0];
27
- ShortcutRegistry.shortcutMap.set(shortcut.id, shortcut);
53
+ this.shortcutMap.set(shortcut.id, shortcut);
28
54
 
29
- if (ShortcutRegistry.shortcutsByCategory.has(category)) {
30
- var _ShortcutRegistry$sho;
55
+ if (this.shortcutsByCategory.has(category)) {
56
+ var _this$shortcutsByCate;
31
57
 
32
- (_ShortcutRegistry$sho = ShortcutRegistry.shortcutsByCategory.get(category)) === null || _ShortcutRegistry$sho === void 0 ? void 0 : _ShortcutRegistry$sho.push(shortcut);
58
+ (_this$shortcutsByCate = this.shortcutsByCategory.get(category)) === null || _this$shortcutsByCate === void 0 ? void 0 : _this$shortcutsByCate.push(shortcut);
33
59
  } else {
34
- ShortcutRegistry.shortcutsByCategory.set(category, [shortcut]);
60
+ this.shortcutsByCategory.set(category, [shortcut]);
35
61
  }
62
+
63
+ return shortcut;
36
64
  }
37
65
  /**
38
66
  * Gets a shortcut from the registry from an ID
@@ -41,8 +69,8 @@ export default class ShortcutRegistry {
41
69
  */
42
70
 
43
71
 
44
- static get(id) {
45
- return ShortcutRegistry.shortcutMap.get(id);
72
+ get(id) {
73
+ return this.shortcutMap.get(id);
46
74
  }
47
75
  /**
48
76
  * Gets an array of any registered shortcuts with conflicting key states.
@@ -52,13 +80,12 @@ export default class ShortcutRegistry {
52
80
  */
53
81
 
54
82
 
55
- static getConflictingShortcuts(keyState) {
56
- return Array.from(ShortcutRegistry.shortcutMap.values()).filter(shortcut => !shortcut.isNull() && shortcut.matchesKeyState(keyState));
83
+ getConflictingShortcuts(keyState) {
84
+ return Array.from(this.shortcutMap.values()).filter(shortcut => !shortcut.isNull() && shortcut.matchesKeyState(keyState));
57
85
  }
58
86
 
59
87
  }
60
88
 
61
- _defineProperty(ShortcutRegistry, "shortcutMap", new Map());
62
-
63
- _defineProperty(ShortcutRegistry, "shortcutsByCategory", new Map());
89
+ var registry = Object.freeze(new ShortcutRegistry());
90
+ export default registry;
64
91
  //# sourceMappingURL=ShortcutRegistry.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/shortcuts/ShortcutRegistry.ts"],"names":["Shortcut","ShortcutRegistry","createAndAdd","params","shortcut","add","shortcutMap","has","id","Error","category","split","set","shortcutsByCategory","get","push","getConflictingShortcuts","keyState","Array","from","values","filter","isNull","matchesKeyState","Map"],"mappings":";;OAAOA,Q;AAEP,eAAe,MAAMC,gBAAN,CAAuB;AAKpC;AACF;AACA;AACA;AACA;AACqB,SAAZC,YAAY,CACjBC,MADiB,EAEP;AACV,QAAMC,QAAQ,GAAG,IAAIJ,QAAJ,CAAaG,MAAb,CAAjB;AACAF,IAAAA,gBAAgB,CAACI,GAAjB,CAAqBD,QAArB;AACA,WAAOA,QAAP;AACD;AAED;AACF;AACA;AACA;;;AACY,SAAHC,GAAG,CAACD,QAAD,EAA2B;AACnC,QAAIH,gBAAgB,CAACK,WAAjB,CAA6BC,GAA7B,CAAiCH,QAAQ,CAACI,EAA1C,CAAJ,EAAmD;AACjD,YAAM,IAAIC,KAAJ,sEAC0DL,QAAQ,CAACI,EADnE,EAAN;AAGD;;AAED,QAAME,QAAQ,GAAGN,QAAQ,CAACI,EAAT,CAAYG,KAAZ,CAAkB,GAAlB,EAAuB,CAAvB,CAAjB;AAEAV,IAAAA,gBAAgB,CAACK,WAAjB,CAA6BM,GAA7B,CAAiCR,QAAQ,CAACI,EAA1C,EAA8CJ,QAA9C;;AACA,QAAIH,gBAAgB,CAACY,mBAAjB,CAAqCN,GAArC,CAAyCG,QAAzC,CAAJ,EAAwD;AAAA;;AACtD,+BAAAT,gBAAgB,CAACY,mBAAjB,CAAqCC,GAArC,CAAyCJ,QAAzC,iFAAoDK,IAApD,CAAyDX,QAAzD;AACD,KAFD,MAEO;AACLH,MAAAA,gBAAgB,CAACY,mBAAjB,CAAqCD,GAArC,CAAyCF,QAAzC,EAAmD,CAACN,QAAD,CAAnD;AACD;AACF;AAED;AACF;AACA;AACA;AACA;;;AACY,SAAHU,GAAG,CAACN,EAAD,EAAmC;AAC3C,WAAOP,gBAAgB,CAACK,WAAjB,CAA6BQ,GAA7B,CAAiCN,EAAjC,CAAP;AACD;AAED;AACF;AACA;AACA;AACA;AACA;;;AACgC,SAAvBQ,uBAAuB,CAACC,QAAD,EAAiC;AAC7D,WAAOC,KAAK,CAACC,IAAN,CAAWlB,gBAAgB,CAACK,WAAjB,CAA6Bc,MAA7B,EAAX,EAAkDC,MAAlD,CACLjB,QAAQ,IAAI,CAACA,QAAQ,CAACkB,MAAT,EAAD,IAAsBlB,QAAQ,CAACmB,eAAT,CAAyBN,QAAzB,CAD7B,CAAP;AAGD;;AA1DmC;;gBAAjBhB,gB,iBACW,IAAIuB,GAAJ,E;;gBADXvB,gB,yBAGmB,IAAIuB,GAAJ,E","sourcesContent":["import Shortcut, { KeyState } from './Shortcut';\n\nexport default class ShortcutRegistry {\n static readonly shortcutMap = new Map<string, Shortcut>();\n\n static readonly shortcutsByCategory = new Map<string, Shortcut[]>();\n\n /**\n * Creates a Shortcut and adds it to the registry\n * @param params The constructor params for the {@link Shortcut}\n * @returns The created Shortcut\n */\n static createAndAdd(\n params: ConstructorParameters<typeof Shortcut>[0]\n ): Shortcut {\n const shortcut = new Shortcut(params);\n ShortcutRegistry.add(shortcut);\n return shortcut;\n }\n\n /**\n * Adds a shortcut to the registry. Throws if a shortcut with the same ID already exists\n * @param shortcut Shortcut to add to the registry\n */\n static add(shortcut: Shortcut): void {\n if (ShortcutRegistry.shortcutMap.has(shortcut.id)) {\n throw new Error(\n `Skipping attempt to add duplicate shortcut ID to registry: ${shortcut.id}`\n );\n }\n\n const category = shortcut.id.split('.')[0];\n\n ShortcutRegistry.shortcutMap.set(shortcut.id, shortcut);\n if (ShortcutRegistry.shortcutsByCategory.has(category)) {\n ShortcutRegistry.shortcutsByCategory.get(category)?.push(shortcut);\n } else {\n ShortcutRegistry.shortcutsByCategory.set(category, [shortcut]);\n }\n }\n\n /**\n * Gets a shortcut from the registry from an ID\n * @param id ID of the shortcut\n * @returns The shortcut for that ID if it exists\n */\n static get(id: string): Shortcut | undefined {\n return ShortcutRegistry.shortcutMap.get(id);\n }\n\n /**\n * Gets an array of any registered shortcuts with conflicting key states.\n * Only checks the key states of the current OS (Mac or Windows/Linux)\n * @param keyState\n * @returns Array of conflicting shortcuts. Empty array if none conflict\n */\n static getConflictingShortcuts(keyState: KeyState): Shortcut[] {\n return Array.from(ShortcutRegistry.shortcutMap.values()).filter(\n shortcut => !shortcut.isNull() && shortcut.matchesKeyState(keyState)\n );\n }\n}\n"],"file":"ShortcutRegistry.js"}
1
+ {"version":3,"sources":["../../src/shortcuts/ShortcutRegistry.ts"],"names":["EventTarget","Log","EventShimCustomEvent","Shortcut","log","module","ShortcutRegistry","Map","createAndAdd","params","shortcut","add","existingShortcut","shortcutMap","get","id","warn","debug2","addEventListener","detail","dispatchEvent","category","split","set","shortcutsByCategory","has","push","getConflictingShortcuts","keyState","Array","from","values","filter","isNull","matchesKeyState","registry","Object","freeze"],"mappings":";;AAAA;AACA,SAASA,WAAT,QAA4B,mBAA5B;AACA,SAASC,GAAT,QAAoB,gBAApB;AACA,SAAyBC,oBAAzB,QAAqD,kBAArD;OACOC,Q;AAEP,IAAMC,GAAG,GAAGH,GAAG,CAACI,MAAJ,CAAW,kBAAX,CAAZ;;AAMA,MAAMC,gBAAN,SAA+BN,WAA/B,CAA+D;AAAA;AAAA;;AAAA,yCACtC,IAAIO,GAAJ,EADsC;;AAAA,iDAG9B,IAAIA,GAAJ,EAH8B;AAAA;;AAK7D;AACF;AACA;AACA;AACA;AACEC,EAAAA,YAAY,CAACC,MAAD,EAA8D;AACxE,QAAMC,QAAQ,GAAG,IAAIP,QAAJ,CAAaM,MAAb,CAAjB;AACA,WAAO,KAAKE,GAAL,CAASD,QAAT,CAAP;AACD;AAED;AACF;AACA;AACA;AACA;;;AACEC,EAAAA,GAAG,CAACD,QAAD,EAA+B;AAChC,QAAME,gBAAgB,GAAG,KAAKC,WAAL,CAAiBC,GAAjB,CAAqBJ,QAAQ,CAACK,EAA9B,CAAzB;;AACA,QAAIH,gBAAJ,EAAsB;AACpBR,MAAAA,GAAG,CAACY,IAAJ,sEACgEN,QAAQ,CAACK,EADzE;AAGA,aAAOH,gBAAP;AACD;;AAEDR,IAAAA,GAAG,CAACa,MAAJ,wCAA2CP,QAAQ,CAACK,EAApD;AAEAL,IAAAA,QAAQ,CAACQ,gBAAT,CAA0B,UAA1B,EAAsC;AAAA,UAAC;AAAEC,QAAAA;AAAF,OAAD;AAAA,aACpC,KAAKC,aAAL,CAAmB,IAAIlB,oBAAJ,CAAyB,UAAzB,EAAqC;AAAEiB,QAAAA;AAAF,OAArC,CAAnB,CADoC;AAAA,KAAtC;AAIA,QAAME,QAAQ,GAAGX,QAAQ,CAACK,EAAT,CAAYO,KAAZ,CAAkB,GAAlB,EAAuB,CAAvB,CAAjB;AAEA,SAAKT,WAAL,CAAiBU,GAAjB,CAAqBb,QAAQ,CAACK,EAA9B,EAAkCL,QAAlC;;AACA,QAAI,KAAKc,mBAAL,CAAyBC,GAAzB,CAA6BJ,QAA7B,CAAJ,EAA4C;AAAA;;AAC1C,oCAAKG,mBAAL,CAAyBV,GAAzB,CAA6BO,QAA7B,iFAAwCK,IAAxC,CAA6ChB,QAA7C;AACD,KAFD,MAEO;AACL,WAAKc,mBAAL,CAAyBD,GAAzB,CAA6BF,QAA7B,EAAuC,CAACX,QAAD,CAAvC;AACD;;AAED,WAAOA,QAAP;AACD;AAED;AACF;AACA;AACA;AACA;;;AACEI,EAAAA,GAAG,CAACC,EAAD,EAAmC;AACpC,WAAO,KAAKF,WAAL,CAAiBC,GAAjB,CAAqBC,EAArB,CAAP;AACD;AAED;AACF;AACA;AACA;AACA;AACA;;;AACEY,EAAAA,uBAAuB,CAACC,QAAD,EAAiC;AACtD,WAAOC,KAAK,CAACC,IAAN,CAAW,KAAKjB,WAAL,CAAiBkB,MAAjB,EAAX,EAAsCC,MAAtC,CACLtB,QAAQ,IAAI,CAACA,QAAQ,CAACuB,MAAT,EAAD,IAAsBvB,QAAQ,CAACwB,eAAT,CAAyBN,QAAzB,CAD7B,CAAP;AAGD;;AAlE4D;;AAqE/D,IAAMO,QAAQ,GAAGC,MAAM,CAACC,MAAP,CAAc,IAAI/B,gBAAJ,EAAd,CAAjB;AAEA,eAAe6B,QAAf","sourcesContent":["/* eslint-disable max-classes-per-file */\nimport { EventTarget } from 'event-target-shim';\nimport { Log } from '@deephaven/log';\nimport { CustomEventMap, EventShimCustomEvent } from '@deephaven/utils';\nimport Shortcut, { KeyState } from './Shortcut';\n\nconst log = Log.module('ShortcutRegistry');\n\ntype EventMap = CustomEventMap<{\n onUpdate: CustomEvent<Shortcut>;\n}>;\n\nclass ShortcutRegistry extends EventTarget<EventMap, 'strict'> {\n readonly shortcutMap = new Map<string, Shortcut>();\n\n readonly shortcutsByCategory = new Map<string, Shortcut[]>();\n\n /**\n * Creates a Shortcut and adds it to the registry\n * @param params The constructor params for the {@link Shortcut}\n * @returns The created shortcut or the shortcut in the registry if 1 already exists w/ the same ID\n */\n createAndAdd(params: ConstructorParameters<typeof Shortcut>[0]): Shortcut {\n const shortcut = new Shortcut(params);\n return this.add(shortcut);\n }\n\n /**\n * Adds a shortcut to the registry. Warns and returns existing shortcut if a shortcut with the same ID already exists\n * @param shortcut Shortcut to add to the registry\n * @returns Shortcut passed if it is not in the registry. Shortcut from the registry if one exists for the same ID\n */\n add(shortcut: Shortcut): Shortcut {\n const existingShortcut = this.shortcutMap.get(shortcut.id);\n if (existingShortcut) {\n log.warn(\n `Skipping attempt to add duplicate shortcut ID to registry: ${shortcut.id}`\n );\n return existingShortcut;\n }\n\n log.debug2(`Adding shortcut to registry: ${shortcut.id}`);\n\n shortcut.addEventListener('onUpdate', ({ detail }) =>\n this.dispatchEvent(new EventShimCustomEvent('onUpdate', { detail }))\n );\n\n const category = shortcut.id.split('.')[0];\n\n this.shortcutMap.set(shortcut.id, shortcut);\n if (this.shortcutsByCategory.has(category)) {\n this.shortcutsByCategory.get(category)?.push(shortcut);\n } else {\n this.shortcutsByCategory.set(category, [shortcut]);\n }\n\n return shortcut;\n }\n\n /**\n * Gets a shortcut from the registry from an ID\n * @param id ID of the shortcut\n * @returns The shortcut for that ID if it exists\n */\n get(id: string): Shortcut | undefined {\n return this.shortcutMap.get(id);\n }\n\n /**\n * Gets an array of any registered shortcuts with conflicting key states.\n * Only checks the key states of the current OS (Mac or Windows/Linux)\n * @param keyState\n * @returns Array of conflicting shortcuts. Empty array if none conflict\n */\n getConflictingShortcuts(keyState: KeyState): Shortcut[] {\n return Array.from(this.shortcutMap.values()).filter(\n shortcut => !shortcut.isNull() && shortcut.matchesKeyState(keyState)\n );\n }\n}\n\nconst registry = Object.freeze(new ShortcutRegistry());\n\nexport default registry;\n"],"file":"ShortcutRegistry.js"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@deephaven/components",
3
- "version": "0.8.2-beta.1+8d5c8d0",
3
+ "version": "0.9.1-beta.0+559f166",
4
4
  "description": "Deephaven React component library",
5
5
  "author": "Deephaven Data Labs LLC",
6
6
  "license": "Apache-2.0",
@@ -34,13 +34,14 @@
34
34
  "start": "cross-env NODE_ENV=development npm run watch"
35
35
  },
36
36
  "dependencies": {
37
- "@deephaven/icons": "^0.8.2-beta.1+8d5c8d0",
38
- "@deephaven/react-hooks": "^0.8.2-beta.1+8d5c8d0",
39
- "@deephaven/utils": "^0.8.2-beta.1+8d5c8d0",
37
+ "@deephaven/icons": "^0.9.1-beta.0+559f166",
38
+ "@deephaven/react-hooks": "^0.9.1-beta.0+559f166",
39
+ "@deephaven/utils": "^0.9.1-beta.0+559f166",
40
40
  "@fortawesome/fontawesome-svg-core": "^1.2.32",
41
41
  "@fortawesome/react-fontawesome": "^0.1.12",
42
42
  "bootstrap": "4.4.1",
43
43
  "classnames": "^2.3.1",
44
+ "event-target-shim": "^6.0.2",
44
45
  "jquery": "^3.5.1",
45
46
  "lodash.debounce": "^4.0.8",
46
47
  "lodash.flatten": "^4.4.0",
@@ -61,9 +62,9 @@
61
62
  },
62
63
  "devDependencies": {
63
64
  "@babel/cli": "^7.16.0",
64
- "@deephaven/log": "^0.8.2-beta.1+8d5c8d0",
65
- "@deephaven/mocks": "^0.8.2-beta.1+8d5c8d0",
66
- "@deephaven/tsconfig": "^0.8.2-beta.1+8d5c8d0",
65
+ "@deephaven/log": "^0.9.1-beta.0+559f166",
66
+ "@deephaven/mocks": "^0.9.1-beta.0+559f166",
67
+ "@deephaven/tsconfig": "^0.9.1-beta.0+559f166",
67
68
  "@types/bootstrap": "^4.4.1",
68
69
  "@types/jquery": "^3.5.1",
69
70
  "@types/lodash.flatten": "^4.4.0",
@@ -95,5 +96,5 @@
95
96
  "publishConfig": {
96
97
  "access": "public"
97
98
  },
98
- "gitHead": "8d5c8d092e2bfdf125ae8c8a57e398a88edc76eb"
99
+ "gitHead": "559f166018ce6e882a57351526fba18153912503"
99
100
  }