@deephaven/components 0.22.3-beta.18 → 0.22.3-beta.21
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.
- package/dist/AutoCompleteInput.js +12 -85
- package/dist/AutoCompleteInput.js.map +1 -1
- package/dist/AutoResizeTextarea.d.ts +5 -5
- package/dist/AutoResizeTextarea.d.ts.map +1 -1
- package/dist/AutoResizeTextarea.js +8 -23
- package/dist/AutoResizeTextarea.js.map +1 -1
- package/dist/BasicModal.d.ts +28 -1
- package/dist/BasicModal.d.ts.map +1 -1
- package/dist/BasicModal.js +2 -8
- package/dist/BasicModal.js.map +1 -1
- package/dist/Button.js +8 -34
- package/dist/Button.js.map +1 -1
- package/dist/ButtonGroup.d.ts +6 -6
- package/dist/ButtonGroup.d.ts.map +1 -1
- package/dist/ButtonGroup.js +2 -4
- package/dist/ButtonGroup.js.map +1 -1
- package/dist/ButtonOld.js.map +1 -1
- package/dist/CardFlip.d.ts +1 -1
- package/dist/CardFlip.d.ts.map +1 -1
- package/dist/CardFlip.js +2 -7
- package/dist/CardFlip.js.map +1 -1
- package/dist/Checkbox.js +3 -14
- package/dist/Checkbox.js.map +1 -1
- package/dist/Collapse.js +0 -15
- package/dist/Collapse.js.map +1 -1
- package/dist/ComboBox.js +4 -83
- package/dist/ComboBox.js.map +1 -1
- package/dist/CopyButton.d.ts +1 -1
- package/dist/CopyButton.d.ts.map +1 -1
- package/dist/CopyButton.js +2 -4
- package/dist/CopyButton.js.map +1 -1
- package/dist/CustomTimeSelect.js +2 -86
- package/dist/CustomTimeSelect.js.map +1 -1
- package/dist/DateInput.js.map +1 -1
- package/dist/DateInputUtils.js +0 -7
- package/dist/DateInputUtils.js.map +1 -1
- package/dist/DateTimeInput.js +7 -10
- package/dist/DateTimeInput.js.map +1 -1
- package/dist/DebouncedSearchInput.js +0 -14
- package/dist/DebouncedSearchInput.js.map +1 -1
- package/dist/DragUtils.js +4 -16
- package/dist/DragUtils.js.map +1 -1
- package/dist/DraggableItemList.d.ts.map +1 -1
- package/dist/DraggableItemList.js +22 -44
- package/dist/DraggableItemList.js.map +1 -1
- package/dist/EditableItemList.d.ts +1 -1
- package/dist/EditableItemList.d.ts.map +1 -1
- package/dist/EditableItemList.js +2 -6
- package/dist/EditableItemList.js.map +1 -1
- package/dist/HierarchicalCheckboxMenu.js +6 -28
- package/dist/HierarchicalCheckboxMenu.js.map +1 -1
- package/dist/ItemList.d.ts.map +1 -1
- package/dist/ItemList.js +22 -115
- package/dist/ItemList.js.map +1 -1
- package/dist/ItemListItem.d.ts +0 -1
- package/dist/ItemListItem.d.ts.map +1 -1
- package/dist/ItemListItem.js +26 -50
- package/dist/ItemListItem.js.map +1 -1
- package/dist/LoadingOverlay.d.ts +1 -1
- package/dist/LoadingOverlay.d.ts.map +1 -1
- package/dist/LoadingOverlay.js +3 -5
- package/dist/LoadingOverlay.js.map +1 -1
- package/dist/LoadingSpinner.d.ts +1 -1
- package/dist/LoadingSpinner.d.ts.map +1 -1
- package/dist/LoadingSpinner.js +2 -4
- package/dist/LoadingSpinner.js.map +1 -1
- package/dist/MaskedInput.js +26 -85
- package/dist/MaskedInput.js.map +1 -1
- package/dist/Option.d.ts +1 -1
- package/dist/Option.d.ts.map +1 -1
- package/dist/Option.js +2 -4
- package/dist/Option.js.map +1 -1
- package/dist/RadioGroup.d.ts +1 -1
- package/dist/RadioGroup.d.ts.map +1 -1
- package/dist/RadioGroup.js +4 -6
- package/dist/RadioGroup.js.map +1 -1
- package/dist/RadioItem.js +0 -1
- package/dist/RadioItem.js.map +1 -1
- package/dist/SearchInput.js +2 -13
- package/dist/SearchInput.js.map +1 -1
- package/dist/Select.d.ts +1 -1
- package/dist/Select.d.ts.map +1 -1
- package/dist/Select.js +2 -4
- package/dist/Select.js.map +1 -1
- package/dist/SelectValueList.js +0 -28
- package/dist/SelectValueList.js.map +1 -1
- package/dist/SocketedButton.js.map +1 -1
- package/dist/ThemeExport.js +0 -4
- package/dist/ThemeExport.js.map +1 -1
- package/dist/TimeInput.js +2 -12
- package/dist/TimeInput.js.map +1 -1
- package/dist/TimeSlider.d.ts +1 -1
- package/dist/TimeSlider.d.ts.map +1 -1
- package/dist/TimeSlider.js +19 -33
- package/dist/TimeSlider.js.map +1 -1
- package/dist/ToastNotification.d.ts +4 -4
- package/dist/ToastNotification.d.ts.map +1 -1
- package/dist/ToastNotification.js +2 -4
- package/dist/ToastNotification.js.map +1 -1
- package/dist/UISwitch.d.ts +1 -1
- package/dist/UISwitch.d.ts.map +1 -1
- package/dist/UISwitch.js +2 -4
- package/dist/UISwitch.js.map +1 -1
- package/dist/ValidateLabelInput.d.ts.map +1 -1
- package/dist/ValidateLabelInput.js +3 -3
- package/dist/ValidateLabelInput.js.map +1 -1
- package/dist/context-actions/ContextActionUtils.js +9 -40
- package/dist/context-actions/ContextActionUtils.js.map +1 -1
- package/dist/context-actions/ContextActions.js +1 -34
- package/dist/context-actions/ContextActions.js.map +1 -1
- package/dist/context-actions/ContextMenu.js +29 -110
- package/dist/context-actions/ContextMenu.js.map +1 -1
- package/dist/context-actions/ContextMenuItem.d.ts.map +1 -1
- package/dist/context-actions/ContextMenuItem.js +3 -19
- package/dist/context-actions/ContextMenuItem.js.map +1 -1
- package/dist/context-actions/ContextMenuRoot.js +7 -26
- package/dist/context-actions/ContextMenuRoot.js.map +1 -1
- package/dist/context-actions/GlobalContextAction.js +0 -15
- package/dist/context-actions/GlobalContextAction.js.map +1 -1
- package/dist/context-actions/GlobalContextActions.js +0 -6
- package/dist/context-actions/GlobalContextActions.js.map +1 -1
- package/dist/context-actions/index.js.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/menu-actions/DropdownMenu.js +4 -32
- package/dist/menu-actions/DropdownMenu.js.map +1 -1
- package/dist/menu-actions/Menu.js +7 -52
- package/dist/menu-actions/Menu.js.map +1 -1
- package/dist/menu-actions/index.d.ts +2 -1
- package/dist/menu-actions/index.d.ts.map +1 -1
- package/dist/menu-actions/index.js +2 -2
- package/dist/menu-actions/index.js.map +1 -1
- package/dist/modal/Modal.d.ts +2 -2
- package/dist/modal/Modal.d.ts.map +1 -1
- package/dist/modal/Modal.js +3 -9
- package/dist/modal/Modal.js.map +1 -1
- package/dist/modal/ModalBody.d.ts +1 -1
- package/dist/modal/ModalBody.d.ts.map +1 -1
- package/dist/modal/ModalBody.js +2 -4
- package/dist/modal/ModalBody.js.map +1 -1
- package/dist/modal/ModalFooter.d.ts +1 -1
- package/dist/modal/ModalFooter.d.ts.map +1 -1
- package/dist/modal/ModalFooter.js +2 -4
- package/dist/modal/ModalFooter.js.map +1 -1
- package/dist/modal/ModalHeader.d.ts +1 -1
- package/dist/modal/ModalHeader.d.ts.map +1 -1
- package/dist/modal/ModalHeader.js +2 -4
- package/dist/modal/ModalHeader.js.map +1 -1
- package/dist/modal/index.js.map +1 -1
- package/dist/navigation/Menu.d.ts +1 -1
- package/dist/navigation/Menu.d.ts.map +1 -1
- package/dist/navigation/Menu.js +2 -2
- package/dist/navigation/Menu.js.map +1 -1
- package/dist/navigation/MenuItem.d.ts +1 -1
- package/dist/navigation/MenuItem.d.ts.map +1 -1
- package/dist/navigation/MenuItem.js +4 -7
- package/dist/navigation/MenuItem.js.map +1 -1
- package/dist/navigation/Page.d.ts +1 -1
- package/dist/navigation/Page.d.ts.map +1 -1
- package/dist/navigation/Page.js +2 -3
- package/dist/navigation/Page.js.map +1 -1
- package/dist/navigation/Stack.d.ts +1 -1
- package/dist/navigation/Stack.d.ts.map +1 -1
- package/dist/navigation/Stack.js +3 -6
- package/dist/navigation/Stack.js.map +1 -1
- package/dist/navigation/index.js.map +1 -1
- package/dist/popper/Popper.d.ts.map +1 -1
- package/dist/popper/Popper.js +13 -46
- package/dist/popper/Popper.js.map +1 -1
- package/dist/popper/Tooltip.js +0 -56
- package/dist/popper/Tooltip.js.map +1 -1
- package/dist/popper/index.js.map +1 -1
- package/dist/shortcuts/GlobalShortcuts.js.map +1 -1
- package/dist/shortcuts/Shortcut.js +19 -76
- package/dist/shortcuts/Shortcut.js.map +1 -1
- package/dist/shortcuts/ShortcutRegistry.js +3 -18
- package/dist/shortcuts/ShortcutRegistry.js.map +1 -1
- package/dist/shortcuts/index.js.map +1 -1
- package/package.json +8 -8
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GlobalContextAction.js","names":["Component","Log","ContextActionUtils","log","module","GlobalContextAction","constructor","props","handleContextMenu","bind","handleKeyDown","componentDidMount","document","body","addEventListener","componentWillUnmount","removeEventListener","evt","e","contextActions","action","title","menuElement","push","debug","actionsDisabled","shortcut","undefined","matchesEvent","preventDefault","stopPropagation","render"],"sources":["../../src/context-actions/GlobalContextAction.tsx"],"sourcesContent":["import { Component } from 'react';\nimport Log from '@deephaven/log';\nimport ContextActionUtils from './ContextActionUtils';\nimport type { ContextAction, ContextActionEvent } from './ContextActionUtils';\n\nconst log = Log.module('GlobalContextAction');\n\ninterface GlobalContextActionProps {\n action: ContextAction;\n}\n\nclass GlobalContextAction extends Component<GlobalContextActionProps> {\n constructor(props: GlobalContextActionProps) {\n super(props);\n\n this.handleContextMenu = this.handleContextMenu.bind(this);\n this.handleKeyDown = this.handleKeyDown.bind(this);\n }\n\n componentDidMount(): void {\n document.body.addEventListener('contextmenu', this.handleContextMenu);\n document.body.addEventListener('keydown', this.handleKeyDown);\n }\n\n componentWillUnmount(): void {\n document.body.removeEventListener('contextmenu', this.handleContextMenu);\n document.body.removeEventListener('keydown', this.handleKeyDown);\n }\n\n handleContextMenu(evt: MouseEvent): void {\n const e = evt as ContextActionEvent;\n if (e.contextActions == null) {\n e.contextActions = [];\n }\n\n const { action } = this.props;\n\n if (action.title == null && !action.menuElement) {\n return;\n }\n\n if (e.contextActions == null) {\n e.contextActions = [];\n }\n\n e.contextActions.push(action);\n\n log.debug(\n 'Received context menu event at global action! Menu items are now: ',\n e.contextActions\n );\n }\n\n handleKeyDown(e: KeyboardEvent): void {\n const { action } = this.props;\n if (\n !ContextActionUtils.actionsDisabled &&\n action.shortcut !== undefined &&\n action.shortcut.matchesEvent(e)\n ) {\n log.debug('Global hotkey matched!', e);\n\n action.action?.(e);\n\n e.preventDefault();\n e.stopPropagation();\n }\n }\n\n render(): null {\n return null;\n }\n}\n\nexport default GlobalContextAction;\n"],"mappings":"AAAA,SAASA,
|
|
1
|
+
{"version":3,"file":"GlobalContextAction.js","names":["Component","Log","ContextActionUtils","log","module","GlobalContextAction","constructor","props","handleContextMenu","bind","handleKeyDown","componentDidMount","document","body","addEventListener","componentWillUnmount","removeEventListener","evt","e","contextActions","action","title","menuElement","push","debug","actionsDisabled","shortcut","undefined","matchesEvent","preventDefault","stopPropagation","render"],"sources":["../../src/context-actions/GlobalContextAction.tsx"],"sourcesContent":["import { Component } from 'react';\nimport Log from '@deephaven/log';\nimport ContextActionUtils from './ContextActionUtils';\nimport type { ContextAction, ContextActionEvent } from './ContextActionUtils';\n\nconst log = Log.module('GlobalContextAction');\n\ninterface GlobalContextActionProps {\n action: ContextAction;\n}\n\nclass GlobalContextAction extends Component<GlobalContextActionProps> {\n constructor(props: GlobalContextActionProps) {\n super(props);\n\n this.handleContextMenu = this.handleContextMenu.bind(this);\n this.handleKeyDown = this.handleKeyDown.bind(this);\n }\n\n componentDidMount(): void {\n document.body.addEventListener('contextmenu', this.handleContextMenu);\n document.body.addEventListener('keydown', this.handleKeyDown);\n }\n\n componentWillUnmount(): void {\n document.body.removeEventListener('contextmenu', this.handleContextMenu);\n document.body.removeEventListener('keydown', this.handleKeyDown);\n }\n\n handleContextMenu(evt: MouseEvent): void {\n const e = evt as ContextActionEvent;\n if (e.contextActions == null) {\n e.contextActions = [];\n }\n\n const { action } = this.props;\n\n if (action.title == null && !action.menuElement) {\n return;\n }\n\n if (e.contextActions == null) {\n e.contextActions = [];\n }\n\n e.contextActions.push(action);\n\n log.debug(\n 'Received context menu event at global action! Menu items are now: ',\n e.contextActions\n );\n }\n\n handleKeyDown(e: KeyboardEvent): void {\n const { action } = this.props;\n if (\n !ContextActionUtils.actionsDisabled &&\n action.shortcut !== undefined &&\n action.shortcut.matchesEvent(e)\n ) {\n log.debug('Global hotkey matched!', e);\n\n action.action?.(e);\n\n e.preventDefault();\n e.stopPropagation();\n }\n }\n\n render(): null {\n return null;\n }\n}\n\nexport default GlobalContextAction;\n"],"mappings":"AAAA,SAASA,SAAS,QAAQ,OAAO;AACjC,OAAOC,GAAG,MAAM,gBAAgB;AAAC,OAC1BC,kBAAkB;AAGzB,IAAMC,GAAG,GAAGF,GAAG,CAACG,MAAM,CAAC,qBAAqB,CAAC;AAM7C,MAAMC,mBAAmB,SAASL,SAAS,CAA2B;EACpEM,WAAW,CAACC,KAA+B,EAAE;IAC3C,KAAK,CAACA,KAAK,CAAC;IAEZ,IAAI,CAACC,iBAAiB,GAAG,IAAI,CAACA,iBAAiB,CAACC,IAAI,CAAC,IAAI,CAAC;IAC1D,IAAI,CAACC,aAAa,GAAG,IAAI,CAACA,aAAa,CAACD,IAAI,CAAC,IAAI,CAAC;EACpD;EAEAE,iBAAiB,GAAS;IACxBC,QAAQ,CAACC,IAAI,CAACC,gBAAgB,CAAC,aAAa,EAAE,IAAI,CAACN,iBAAiB,CAAC;IACrEI,QAAQ,CAACC,IAAI,CAACC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAACJ,aAAa,CAAC;EAC/D;EAEAK,oBAAoB,GAAS;IAC3BH,QAAQ,CAACC,IAAI,CAACG,mBAAmB,CAAC,aAAa,EAAE,IAAI,CAACR,iBAAiB,CAAC;IACxEI,QAAQ,CAACC,IAAI,CAACG,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAACN,aAAa,CAAC;EAClE;EAEAF,iBAAiB,CAACS,GAAe,EAAQ;IACvC,IAAMC,CAAC,GAAGD,GAAyB;IACnC,IAAIC,CAAC,CAACC,cAAc,IAAI,IAAI,EAAE;MAC5BD,CAAC,CAACC,cAAc,GAAG,EAAE;IACvB;IAEA,IAAM;MAAEC;IAAO,CAAC,GAAG,IAAI,CAACb,KAAK;IAE7B,IAAIa,MAAM,CAACC,KAAK,IAAI,IAAI,IAAI,CAACD,MAAM,CAACE,WAAW,EAAE;MAC/C;IACF;IAEA,IAAIJ,CAAC,CAACC,cAAc,IAAI,IAAI,EAAE;MAC5BD,CAAC,CAACC,cAAc,GAAG,EAAE;IACvB;IAEAD,CAAC,CAACC,cAAc,CAACI,IAAI,CAACH,MAAM,CAAC;IAE7BjB,GAAG,CAACqB,KAAK,CACP,oEAAoE,EACpEN,CAAC,CAACC,cAAc,CACjB;EACH;EAEAT,aAAa,CAACQ,CAAgB,EAAQ;IACpC,IAAM;MAAEE;IAAO,CAAC,GAAG,IAAI,CAACb,KAAK;IAC7B,IACE,CAACL,kBAAkB,CAACuB,eAAe,IACnCL,MAAM,CAACM,QAAQ,KAAKC,SAAS,IAC7BP,MAAM,CAACM,QAAQ,CAACE,YAAY,CAACV,CAAC,CAAC,EAC/B;MAAA;MACAf,GAAG,CAACqB,KAAK,CAAC,wBAAwB,EAAEN,CAAC,CAAC;MAEtC,kBAAAE,MAAM,CAACA,MAAM,mDAAb,oBAAAA,MAAM,EAAUF,CAAC,CAAC;MAElBA,CAAC,CAACW,cAAc,EAAE;MAClBX,CAAC,CAACY,eAAe,EAAE;IACrB;EACF;EAEAC,MAAM,GAAS;IACb,OAAO,IAAI;EACb;AACF;AAEA,eAAe1B,mBAAmB"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import React, { Component } from 'react';
|
|
2
2
|
import GlobalContextAction from "./GlobalContextAction.js";
|
|
3
|
-
|
|
4
3
|
class GlobalContextActions extends Component {
|
|
5
4
|
render() {
|
|
6
5
|
var {
|
|
@@ -8,13 +7,11 @@ class GlobalContextActions extends Component {
|
|
|
8
7
|
'data-testid': dataTestId
|
|
9
8
|
} = this.props;
|
|
10
9
|
var actionElements = [];
|
|
11
|
-
|
|
12
10
|
for (var i = 0; i < actions.length; i += 1) {
|
|
13
11
|
var action = actions[i];
|
|
14
12
|
var {
|
|
15
13
|
shortcut
|
|
16
14
|
} = action;
|
|
17
|
-
|
|
18
15
|
if (action.title != null || action.menuElement || shortcut) {
|
|
19
16
|
var actionElement = /*#__PURE__*/React.createElement(GlobalContextAction, {
|
|
20
17
|
key: "".concat(action.title, ".").concat(shortcut === null || shortcut === void 0 ? void 0 : shortcut.id),
|
|
@@ -24,11 +21,8 @@ class GlobalContextActions extends Component {
|
|
|
24
21
|
actionElements.push(actionElement);
|
|
25
22
|
}
|
|
26
23
|
}
|
|
27
|
-
|
|
28
24
|
return actionElements;
|
|
29
25
|
}
|
|
30
|
-
|
|
31
26
|
}
|
|
32
|
-
|
|
33
27
|
export default GlobalContextActions;
|
|
34
28
|
//# sourceMappingURL=GlobalContextActions.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GlobalContextActions.js","names":["React","Component","GlobalContextAction","GlobalContextActions","render","actions","dataTestId","props","actionElements","i","length","action","shortcut","title","menuElement","actionElement","id","push"],"sources":["../../src/context-actions/GlobalContextActions.tsx"],"sourcesContent":["import React, { Component } from 'react';\nimport GlobalContextAction from './GlobalContextAction';\nimport type { ContextAction } from './ContextActionUtils';\n\ninterface GlobalContextActionsProps {\n actions: ContextAction[];\n 'data-testid'?: string;\n}\n\nclass GlobalContextActions extends Component<GlobalContextActionsProps> {\n render(): React.ReactNode {\n const { actions, 'data-testid': dataTestId } = this.props;\n const actionElements = [];\n for (let i = 0; i < actions.length; i += 1) {\n const action = actions[i];\n const { shortcut } = action;\n if (action.title != null || action.menuElement || shortcut) {\n const actionElement = (\n <GlobalContextAction\n key={`${action.title}.${shortcut?.id}`}\n action={action}\n data-testid={dataTestId}\n />\n );\n actionElements.push(actionElement);\n }\n }\n return actionElements;\n }\n}\n\nexport default GlobalContextActions;\n"],"mappings":"AAAA,OAAOA,
|
|
1
|
+
{"version":3,"file":"GlobalContextActions.js","names":["React","Component","GlobalContextAction","GlobalContextActions","render","actions","dataTestId","props","actionElements","i","length","action","shortcut","title","menuElement","actionElement","id","push"],"sources":["../../src/context-actions/GlobalContextActions.tsx"],"sourcesContent":["import React, { Component } from 'react';\nimport GlobalContextAction from './GlobalContextAction';\nimport type { ContextAction } from './ContextActionUtils';\n\ninterface GlobalContextActionsProps {\n actions: ContextAction[];\n 'data-testid'?: string;\n}\n\nclass GlobalContextActions extends Component<GlobalContextActionsProps> {\n render(): React.ReactNode {\n const { actions, 'data-testid': dataTestId } = this.props;\n const actionElements = [];\n for (let i = 0; i < actions.length; i += 1) {\n const action = actions[i];\n const { shortcut } = action;\n if (action.title != null || action.menuElement || shortcut) {\n const actionElement = (\n <GlobalContextAction\n key={`${action.title}.${shortcut?.id}`}\n action={action}\n data-testid={dataTestId}\n />\n );\n actionElements.push(actionElement);\n }\n }\n return actionElements;\n }\n}\n\nexport default GlobalContextActions;\n"],"mappings":"AAAA,OAAOA,KAAK,IAAIC,SAAS,QAAQ,OAAO;AAAC,OAClCC,mBAAmB;AAQ1B,MAAMC,oBAAoB,SAASF,SAAS,CAA4B;EACtEG,MAAM,GAAoB;IACxB,IAAM;MAAEC,OAAO;MAAE,aAAa,EAAEC;IAAW,CAAC,GAAG,IAAI,CAACC,KAAK;IACzD,IAAMC,cAAc,GAAG,EAAE;IACzB,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGJ,OAAO,CAACK,MAAM,EAAED,CAAC,IAAI,CAAC,EAAE;MAC1C,IAAME,MAAM,GAAGN,OAAO,CAACI,CAAC,CAAC;MACzB,IAAM;QAAEG;MAAS,CAAC,GAAGD,MAAM;MAC3B,IAAIA,MAAM,CAACE,KAAK,IAAI,IAAI,IAAIF,MAAM,CAACG,WAAW,IAAIF,QAAQ,EAAE;QAC1D,IAAMG,aAAa,gBACjB,oBAAC,mBAAmB;UAClB,GAAG,YAAKJ,MAAM,CAACE,KAAK,cAAID,QAAQ,aAARA,QAAQ,uBAARA,QAAQ,CAAEI,EAAE,CAAG;UACvC,MAAM,EAAEL,MAAO;UACf,eAAaL;QAAW,EAE3B;QACDE,cAAc,CAACS,IAAI,CAACF,aAAa,CAAC;MACpC;IACF;IACA,OAAOP,cAAc;EACvB;AACF;AAEA,eAAeL,oBAAoB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["default","ContextActions","ContextActionUtils","ContextMenuItem","ContextMenuRoot"],"sources":["../../src/context-actions/index.ts"],"sourcesContent":["export { default as ContextActions } from './ContextActions';\nexport { default as ContextActionUtils } from './ContextActionUtils';\nexport type { ContextAction } from './ContextActionUtils';\nexport { default as ContextMenuItem } from './ContextMenuItem';\nexport { default as ContextMenuRoot } from './ContextMenuRoot';\nexport type { ResolvableContextAction } from './ContextActionUtils';\n"],"mappings":"SAASA,OAAO,IAAIC,
|
|
1
|
+
{"version":3,"file":"index.js","names":["default","ContextActions","ContextActionUtils","ContextMenuItem","ContextMenuRoot"],"sources":["../../src/context-actions/index.ts"],"sourcesContent":["export { default as ContextActions } from './ContextActions';\nexport { default as ContextActionUtils } from './ContextActionUtils';\nexport type { ContextAction } from './ContextActionUtils';\nexport { default as ContextMenuItem } from './ContextMenuItem';\nexport { default as ContextMenuRoot } from './ContextMenuRoot';\nexport type { ResolvableContextAction } from './ContextActionUtils';\n"],"mappings":"SAASA,OAAO,IAAIC,cAAc;AAAA,SACzBD,OAAO,IAAIE,kBAAkB;AAAA,SAE7BF,OAAO,IAAIG,eAAe;AAAA,SAC1BH,OAAO,IAAII,eAAe"}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["default","AutoCompleteInput","AutoResizeTextarea","BasicModal","Button","ButtonGroup","ButtonOld","CardFlip","Collapse","Checkbox","ComboBox","CopyButton","CustomTimeSelect","DateTimeInput","DateInput","DebouncedSearchInput","DraggableItemList","DragUtils","EditableItemList","HierarchicalCheckboxMenu","ItemListItem","LoadingOverlay","LoadingSpinner","DropdownMenu","MaskedInput","Option","RadioGroup","RadioItem","Select","SearchInput","SelectValueList","SocketedButton","ThemeExport","TimeInput","TimeSlider","ToastNotification","UISwitch","ValidateLabelInput"],"sources":["../src/index.ts"],"sourcesContent":["export type { Range } from '@deephaven/utils';\nexport { default as AutoCompleteInput } from './AutoCompleteInput';\nexport { default as AutoResizeTextarea } from './AutoResizeTextarea';\nexport { default as BasicModal } from './BasicModal';\nexport { default as Button } from './Button';\nexport { default as ButtonGroup } from './ButtonGroup';\nexport { default as ButtonOld } from './ButtonOld';\nexport { default as CardFlip } from './CardFlip';\nexport * from './context-actions';\nexport { default as Collapse } from './Collapse';\nexport { default as Checkbox } from './Checkbox';\nexport { default as ComboBox } from './ComboBox';\nexport { default as CopyButton } from './CopyButton';\nexport { default as CustomTimeSelect } from './CustomTimeSelect';\nexport { default as DateTimeInput } from './DateTimeInput';\nexport { default as DateInput } from './DateInput';\nexport { default as DebouncedSearchInput } from './DebouncedSearchInput';\nexport { default as DraggableItemList } from './DraggableItemList';\nexport * from './DraggableItemList';\nexport { default as DragUtils } from './DragUtils';\nexport { default as EditableItemList } from './EditableItemList';\nexport { default as HierarchicalCheckboxMenu } from './HierarchicalCheckboxMenu';\nexport * from './HierarchicalCheckboxMenu';\nexport * from './ItemList';\nexport { default as ItemListItem } from './ItemListItem';\nexport { default as LoadingOverlay } from './LoadingOverlay';\nexport { default as LoadingSpinner } from './LoadingSpinner';\nexport { default as DropdownMenu } from './menu-actions';\nexport * from './menu-actions';\nexport { default as MaskedInput } from './MaskedInput';\nexport * from './MaskedInput';\nexport * from './navigation';\nexport { default as Option } from './Option';\nexport * from './popper';\nexport * from './modal';\nexport { default as RadioGroup } from './RadioGroup';\nexport { default as RadioItem } from './RadioItem';\nexport { default as Select } from './Select';\nexport { default as SearchInput } from './SearchInput';\nexport { default as SelectValueList } from './SelectValueList';\nexport * from './SelectValueList';\nexport * from './shortcuts';\nexport { default as SocketedButton } from './SocketedButton';\nexport { default as ThemeExport } from './ThemeExport';\nexport { default as TimeInput } from './TimeInput';\nexport { default as TimeSlider } from './TimeSlider';\nexport { default as ToastNotification } from './ToastNotification';\nexport { default as UISwitch } from './UISwitch';\nexport { default as ValidateLabelInput } from './ValidateLabelInput';\n"],"mappings":"SACSA,OAAO,IAAIC,
|
|
1
|
+
{"version":3,"file":"index.js","names":["default","AutoCompleteInput","AutoResizeTextarea","BasicModal","Button","ButtonGroup","ButtonOld","CardFlip","Collapse","Checkbox","ComboBox","CopyButton","CustomTimeSelect","DateTimeInput","DateInput","DebouncedSearchInput","DraggableItemList","DragUtils","EditableItemList","HierarchicalCheckboxMenu","ItemListItem","LoadingOverlay","LoadingSpinner","DropdownMenu","MaskedInput","Option","RadioGroup","RadioItem","Select","SearchInput","SelectValueList","SocketedButton","ThemeExport","TimeInput","TimeSlider","ToastNotification","UISwitch","ValidateLabelInput"],"sources":["../src/index.ts"],"sourcesContent":["export type { Range } from '@deephaven/utils';\nexport { default as AutoCompleteInput } from './AutoCompleteInput';\nexport { default as AutoResizeTextarea } from './AutoResizeTextarea';\nexport { default as BasicModal } from './BasicModal';\nexport { default as Button } from './Button';\nexport { default as ButtonGroup } from './ButtonGroup';\nexport { default as ButtonOld } from './ButtonOld';\nexport { default as CardFlip } from './CardFlip';\nexport * from './context-actions';\nexport { default as Collapse } from './Collapse';\nexport { default as Checkbox } from './Checkbox';\nexport { default as ComboBox } from './ComboBox';\nexport { default as CopyButton } from './CopyButton';\nexport { default as CustomTimeSelect } from './CustomTimeSelect';\nexport { default as DateTimeInput } from './DateTimeInput';\nexport { default as DateInput } from './DateInput';\nexport { default as DebouncedSearchInput } from './DebouncedSearchInput';\nexport { default as DraggableItemList } from './DraggableItemList';\nexport * from './DraggableItemList';\nexport { default as DragUtils } from './DragUtils';\nexport { default as EditableItemList } from './EditableItemList';\nexport { default as HierarchicalCheckboxMenu } from './HierarchicalCheckboxMenu';\nexport * from './HierarchicalCheckboxMenu';\nexport * from './ItemList';\nexport { default as ItemListItem } from './ItemListItem';\nexport { default as LoadingOverlay } from './LoadingOverlay';\nexport { default as LoadingSpinner } from './LoadingSpinner';\nexport { default as DropdownMenu } from './menu-actions';\nexport * from './menu-actions';\nexport { default as MaskedInput } from './MaskedInput';\nexport * from './MaskedInput';\nexport * from './navigation';\nexport { default as Option } from './Option';\nexport * from './popper';\nexport * from './modal';\nexport { default as RadioGroup } from './RadioGroup';\nexport { default as RadioItem } from './RadioItem';\nexport { default as Select } from './Select';\nexport { default as SearchInput } from './SearchInput';\nexport { default as SelectValueList } from './SelectValueList';\nexport * from './SelectValueList';\nexport * from './shortcuts';\nexport { default as SocketedButton } from './SocketedButton';\nexport { default as ThemeExport } from './ThemeExport';\nexport { default as TimeInput } from './TimeInput';\nexport { default as TimeSlider } from './TimeSlider';\nexport { default as ToastNotification } from './ToastNotification';\nexport { default as UISwitch } from './UISwitch';\nexport { default as ValidateLabelInput } from './ValidateLabelInput';\n"],"mappings":"SACSA,OAAO,IAAIC,iBAAiB;AAAA,SAC5BD,OAAO,IAAIE,kBAAkB;AAAA,SAC7BF,OAAO,IAAIG,UAAU;AAAA,SACrBH,OAAO,IAAII,MAAM;AAAA,SACjBJ,OAAO,IAAIK,WAAW;AAAA,SACtBL,OAAO,IAAIM,SAAS;AAAA,SACpBN,OAAO,IAAIO,QAAQ;AAAA;AAAA,SAEnBP,OAAO,IAAIQ,QAAQ;AAAA,SACnBR,OAAO,IAAIS,QAAQ;AAAA,SACnBT,OAAO,IAAIU,QAAQ;AAAA,SACnBV,OAAO,IAAIW,UAAU;AAAA,SACrBX,OAAO,IAAIY,gBAAgB;AAAA,SAC3BZ,OAAO,IAAIa,aAAa;AAAA,SACxBb,OAAO,IAAIc,SAAS;AAAA,SACpBd,OAAO,IAAIe,oBAAoB;AAAA,SAC/Bf,OAAO,IAAIgB,iBAAiB;AAAA;AAAA,SAE5BhB,OAAO,IAAIiB,SAAS;AAAA,SACpBjB,OAAO,IAAIkB,gBAAgB;AAAA,SAC3BlB,OAAO,IAAImB,wBAAwB;AAAA;AAAA;AAAA,SAGnCnB,OAAO,IAAIoB,YAAY;AAAA,SACvBpB,OAAO,IAAIqB,cAAc;AAAA,SACzBrB,OAAO,IAAIsB,cAAc;AAAA,SACzBtB,OAAO,IAAIuB,YAAY;AAAA;AAAA,SAEvBvB,OAAO,IAAIwB,WAAW;AAAA;AAAA;AAAA,SAGtBxB,OAAO,IAAIyB,MAAM;AAAA;AAAA;AAAA,SAGjBzB,OAAO,IAAI0B,UAAU;AAAA,SACrB1B,OAAO,IAAI2B,SAAS;AAAA,SACpB3B,OAAO,IAAI4B,MAAM;AAAA,SACjB5B,OAAO,IAAI6B,WAAW;AAAA,SACtB7B,OAAO,IAAI8B,eAAe;AAAA;AAAA;AAAA,SAG1B9B,OAAO,IAAI+B,cAAc;AAAA,SACzB/B,OAAO,IAAIgC,WAAW;AAAA,SACtBhC,OAAO,IAAIiC,SAAS;AAAA,SACpBjC,OAAO,IAAIkC,UAAU;AAAA,SACrBlC,OAAO,IAAImC,iBAAiB;AAAA,SAC5BnC,OAAO,IAAIoC,QAAQ;AAAA,SACnBpC,OAAO,IAAIqC,kBAAkB"}
|
|
@@ -1,9 +1,6 @@
|
|
|
1
1
|
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
2
|
-
|
|
3
2
|
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
4
|
-
|
|
5
3
|
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; }
|
|
6
|
-
|
|
7
4
|
/**
|
|
8
5
|
* Add dropdown menu that you add onto any component.
|
|
9
6
|
*
|
|
@@ -39,19 +36,13 @@ import classNames from 'classnames';
|
|
|
39
36
|
import { Popper } from "../popper/index.js";
|
|
40
37
|
import Menu from "./Menu.js";
|
|
41
38
|
import "./DropdownMenu.css";
|
|
42
|
-
|
|
43
39
|
class DropdownMenu extends PureComponent {
|
|
44
40
|
constructor(props) {
|
|
45
41
|
super(props);
|
|
46
|
-
|
|
47
42
|
_defineProperty(this, "container", void 0);
|
|
48
|
-
|
|
49
43
|
_defineProperty(this, "parent", void 0);
|
|
50
|
-
|
|
51
44
|
_defineProperty(this, "popper", void 0);
|
|
52
|
-
|
|
53
45
|
_defineProperty(this, "isOpen", void 0);
|
|
54
|
-
|
|
55
46
|
this.handleClick = this.handleClick.bind(this);
|
|
56
47
|
this.handleCloseMenu = this.handleCloseMenu.bind(this);
|
|
57
48
|
this.handleExited = this.handleExited.bind(this);
|
|
@@ -60,15 +51,12 @@ class DropdownMenu extends PureComponent {
|
|
|
60
51
|
this.popper = /*#__PURE__*/React.createRef();
|
|
61
52
|
this.isOpen = false;
|
|
62
53
|
}
|
|
63
|
-
|
|
64
54
|
componentDidMount() {
|
|
65
55
|
var {
|
|
66
56
|
isShown
|
|
67
57
|
} = this.props;
|
|
68
|
-
|
|
69
58
|
if (isShown === null) {
|
|
70
59
|
var _this$container$curre;
|
|
71
|
-
|
|
72
60
|
if ((_this$container$curre = this.container.current) !== null && _this$container$curre !== void 0 && _this$container$curre.parentElement) {
|
|
73
61
|
this.parent = this.container.current.parentElement;
|
|
74
62
|
this.parent.addEventListener('click', this.handleClick);
|
|
@@ -77,12 +65,10 @@ class DropdownMenu extends PureComponent {
|
|
|
77
65
|
this.openMenu();
|
|
78
66
|
}
|
|
79
67
|
}
|
|
80
|
-
|
|
81
68
|
componentDidUpdate(prevProps) {
|
|
82
69
|
var {
|
|
83
70
|
isShown
|
|
84
71
|
} = this.props;
|
|
85
|
-
|
|
86
72
|
if (prevProps.isShown !== isShown) {
|
|
87
73
|
if (isShown !== null && isShown) {
|
|
88
74
|
// https://github.com/reactjs/react-transition-group/issues/382
|
|
@@ -94,42 +80,33 @@ class DropdownMenu extends PureComponent {
|
|
|
94
80
|
}
|
|
95
81
|
}
|
|
96
82
|
}
|
|
97
|
-
|
|
98
83
|
componentWillUnmount() {
|
|
99
84
|
if (this.parent) {
|
|
100
85
|
this.parent.removeEventListener('click', this.handleClick);
|
|
101
86
|
}
|
|
102
87
|
}
|
|
103
|
-
|
|
104
88
|
closeMenu() {
|
|
105
89
|
var _this$popper$current;
|
|
106
|
-
|
|
107
90
|
(_this$popper$current = this.popper.current) === null || _this$popper$current === void 0 ? void 0 : _this$popper$current.hide();
|
|
108
91
|
}
|
|
109
|
-
|
|
110
92
|
openMenu() {
|
|
111
93
|
if (this.popper.current && !this.isOpen) {
|
|
112
94
|
this.popper.current.show();
|
|
113
95
|
this.isOpen = true;
|
|
114
96
|
}
|
|
115
97
|
}
|
|
116
|
-
|
|
117
98
|
scheduleUpdate() {
|
|
118
99
|
var _this$popper$current2;
|
|
119
|
-
|
|
120
100
|
(_this$popper$current2 = this.popper.current) === null || _this$popper$current2 === void 0 ? void 0 : _this$popper$current2.scheduleUpdate();
|
|
121
101
|
}
|
|
122
|
-
|
|
123
102
|
handleClick(e) {
|
|
124
103
|
e.preventDefault();
|
|
125
104
|
e.stopPropagation();
|
|
126
105
|
this.openMenu();
|
|
127
106
|
}
|
|
128
|
-
|
|
129
107
|
handleCloseMenu() {
|
|
130
108
|
this.closeMenu();
|
|
131
109
|
}
|
|
132
|
-
|
|
133
110
|
handleExited() {
|
|
134
111
|
this.isOpen = false;
|
|
135
112
|
var {
|
|
@@ -137,7 +114,6 @@ class DropdownMenu extends PureComponent {
|
|
|
137
114
|
} = this.props;
|
|
138
115
|
onMenuClosed();
|
|
139
116
|
}
|
|
140
|
-
|
|
141
117
|
render() {
|
|
142
118
|
var {
|
|
143
119
|
actions,
|
|
@@ -177,24 +153,20 @@ class DropdownMenu extends PureComponent {
|
|
|
177
153
|
menuStyle: menuStyle
|
|
178
154
|
})));
|
|
179
155
|
}
|
|
180
|
-
|
|
181
156
|
}
|
|
182
|
-
|
|
183
157
|
_defineProperty(DropdownMenu, "defaultProps", {
|
|
184
158
|
isShown: null,
|
|
185
|
-
|
|
186
|
-
|
|
159
|
+
onMenuClosed() {
|
|
160
|
+
// no-op
|
|
187
161
|
},
|
|
188
|
-
|
|
189
|
-
|
|
162
|
+
onMenuOpened() {
|
|
163
|
+
// no-op
|
|
190
164
|
},
|
|
191
|
-
|
|
192
165
|
options: {},
|
|
193
166
|
popperOptions: {},
|
|
194
167
|
popperClassName: '',
|
|
195
168
|
menuStyle: {},
|
|
196
169
|
'data-testid': undefined
|
|
197
170
|
});
|
|
198
|
-
|
|
199
171
|
export default DropdownMenu;
|
|
200
172
|
//# sourceMappingURL=DropdownMenu.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DropdownMenu.js","names":["React","PureComponent","classNames","Popper","Menu","DropdownMenu","constructor","props","handleClick","bind","handleCloseMenu","handleExited","container","createRef","parent","popper","isOpen","componentDidMount","isShown","current","parentElement","addEventListener","openMenu","componentDidUpdate","prevProps","window","requestAnimationFrame","closeMenu","componentWillUnmount","removeEventListener","hide","show","scheduleUpdate","e","preventDefault","stopPropagation","onMenuClosed","render","actions","onMenuOpened","popperClassName","dataTestId","menuStyle","options","popperOptions","placement","separateKeyboardMouse","undefined"],"sources":["../../src/menu-actions/DropdownMenu.tsx"],"sourcesContent":["/**\n * Add dropdown menu that you add onto any component.\n *\n * Similar to the context-actions package, accepts list of actions to create a dropdown menu.\n * Note: Does not support nested sub-menus.\n *\n * Usage:\n * let actions = [{\n * title: 'My Action',\n * action: () => { alert('My Action Clicked!') }\n * icon: faPrint, // Limited to FontAwesome icons for now.\n * shortcut: Shortcut, // Shortcut class instance\n * group: ContextActions.groups.default, // What group to group the context action with\n * order: null // Int where to order within group\n * }];\n *\n * Usage:\n * 1. Auto bind click to open event to parent\n * <div>\n * Click in this container\n * <DropdownMenu actions={actions}/>\n * </div>\n *\n * 2. Control via prop\n * <div>\n * DropdownMenu will not react to the click event if isShown prop is used\n * <DropdownMenu actions={actions} isShown={isShown} />\n * </div>\n *\n */\nimport React, { PureComponent } from 'react';\nimport classNames from 'classnames';\nimport { PopperOptions } from 'popper.js';\nimport { Popper } from '../popper';\nimport Menu, { MenuOptions } from './Menu';\nimport { ContextAction } from '../context-actions/ContextActionUtils';\nimport './DropdownMenu.scss';\n\nexport type DropdownAction = ContextAction & { actions?: never };\n\nexport type DropdownActions =\n | (() => DropdownAction[])\n | DropdownAction\n | DropdownAction[];\n\ntype DropdownMenuProps = {\n // Override to prevent nested lists\n actions: DropdownActions;\n isShown: boolean | null;\n onMenuClosed(): void;\n onMenuOpened(): void;\n options: MenuOptions;\n popperOptions: PopperOptions;\n popperClassName: string;\n menuStyle: React.CSSProperties;\n 'data-testid'?: string;\n};\n\nclass DropdownMenu extends PureComponent<DropdownMenuProps> {\n static defaultProps = {\n isShown: null,\n onMenuClosed(): void {\n // no-op\n },\n onMenuOpened(): void {\n // no-op\n },\n options: {},\n popperOptions: {},\n popperClassName: '',\n menuStyle: {},\n 'data-testid': undefined,\n };\n\n constructor(props: DropdownMenuProps) {\n super(props);\n\n this.handleClick = this.handleClick.bind(this);\n this.handleCloseMenu = this.handleCloseMenu.bind(this);\n this.handleExited = this.handleExited.bind(this);\n\n this.container = React.createRef();\n this.parent = null;\n this.popper = React.createRef();\n\n this.isOpen = false;\n }\n\n componentDidMount(): void {\n const { isShown } = this.props;\n\n if (isShown === null) {\n if (this.container.current?.parentElement) {\n this.parent = this.container.current.parentElement;\n this.parent.addEventListener('click', this.handleClick);\n }\n } else if (isShown) {\n this.openMenu();\n }\n }\n\n componentDidUpdate(prevProps: DropdownMenuProps): void {\n const { isShown } = this.props;\n\n if (prevProps.isShown !== isShown) {\n if (isShown !== null && isShown) {\n // https://github.com/reactjs/react-transition-group/issues/382\n window.requestAnimationFrame(() => {\n this.openMenu();\n });\n } else {\n this.closeMenu();\n }\n }\n }\n\n componentWillUnmount(): void {\n if (this.parent) {\n this.parent.removeEventListener('click', this.handleClick);\n }\n }\n\n container: React.RefObject<HTMLDivElement>;\n\n parent: Element | null;\n\n popper: React.RefObject<Popper>;\n\n isOpen: boolean;\n\n closeMenu(): void {\n this.popper.current?.hide();\n }\n\n openMenu(): void {\n if (this.popper.current && !this.isOpen) {\n this.popper.current.show();\n this.isOpen = true;\n }\n }\n\n scheduleUpdate(): void {\n this.popper.current?.scheduleUpdate();\n }\n\n handleClick(e: Event): void {\n e.preventDefault();\n e.stopPropagation();\n\n this.openMenu();\n }\n\n handleCloseMenu(): void {\n this.closeMenu();\n }\n\n handleExited(): void {\n this.isOpen = false;\n\n const { onMenuClosed } = this.props;\n onMenuClosed();\n }\n\n render(): JSX.Element {\n const {\n actions,\n onMenuOpened,\n popperClassName,\n 'data-testid': dataTestId,\n } = this.props;\n const { menuStyle } = this.props;\n let { options, popperOptions } = this.props;\n popperOptions = { placement: 'bottom', ...popperOptions };\n options = {\n separateKeyboardMouse: true,\n ...options,\n };\n return (\n <div\n className=\"menu-actions-listener\"\n ref={this.container}\n data-testid={dataTestId}\n >\n <Popper\n ref={this.popper}\n options={popperOptions}\n className={classNames('menu-popper', popperClassName)}\n onExited={this.handleExited}\n closeOnBlur\n interactive\n >\n <Menu\n actions={actions}\n closeMenu={this.handleCloseMenu}\n onMenuOpened={onMenuOpened}\n options={options}\n menuStyle={menuStyle}\n />\n </Popper>\n </div>\n );\n }\n}\n\nexport default DropdownMenu;\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"DropdownMenu.js","names":["React","PureComponent","classNames","Popper","Menu","DropdownMenu","constructor","props","handleClick","bind","handleCloseMenu","handleExited","container","createRef","parent","popper","isOpen","componentDidMount","isShown","current","parentElement","addEventListener","openMenu","componentDidUpdate","prevProps","window","requestAnimationFrame","closeMenu","componentWillUnmount","removeEventListener","hide","show","scheduleUpdate","e","preventDefault","stopPropagation","onMenuClosed","render","actions","onMenuOpened","popperClassName","dataTestId","menuStyle","options","popperOptions","placement","separateKeyboardMouse","undefined"],"sources":["../../src/menu-actions/DropdownMenu.tsx"],"sourcesContent":["/**\n * Add dropdown menu that you add onto any component.\n *\n * Similar to the context-actions package, accepts list of actions to create a dropdown menu.\n * Note: Does not support nested sub-menus.\n *\n * Usage:\n * let actions = [{\n * title: 'My Action',\n * action: () => { alert('My Action Clicked!') }\n * icon: faPrint, // Limited to FontAwesome icons for now.\n * shortcut: Shortcut, // Shortcut class instance\n * group: ContextActions.groups.default, // What group to group the context action with\n * order: null // Int where to order within group\n * }];\n *\n * Usage:\n * 1. Auto bind click to open event to parent\n * <div>\n * Click in this container\n * <DropdownMenu actions={actions}/>\n * </div>\n *\n * 2. Control via prop\n * <div>\n * DropdownMenu will not react to the click event if isShown prop is used\n * <DropdownMenu actions={actions} isShown={isShown} />\n * </div>\n *\n */\nimport React, { PureComponent } from 'react';\nimport classNames from 'classnames';\nimport { PopperOptions } from 'popper.js';\nimport { Popper } from '../popper';\nimport Menu, { MenuOptions } from './Menu';\nimport { ContextAction } from '../context-actions/ContextActionUtils';\nimport './DropdownMenu.scss';\n\nexport type DropdownAction = ContextAction & { actions?: never };\n\nexport type DropdownActions =\n | (() => DropdownAction[])\n | DropdownAction\n | DropdownAction[];\n\ntype DropdownMenuProps = {\n // Override to prevent nested lists\n actions: DropdownActions;\n isShown: boolean | null;\n onMenuClosed(): void;\n onMenuOpened(): void;\n options: MenuOptions;\n popperOptions: PopperOptions;\n popperClassName: string;\n menuStyle: React.CSSProperties;\n 'data-testid'?: string;\n};\n\nclass DropdownMenu extends PureComponent<DropdownMenuProps> {\n static defaultProps = {\n isShown: null,\n onMenuClosed(): void {\n // no-op\n },\n onMenuOpened(): void {\n // no-op\n },\n options: {},\n popperOptions: {},\n popperClassName: '',\n menuStyle: {},\n 'data-testid': undefined,\n };\n\n constructor(props: DropdownMenuProps) {\n super(props);\n\n this.handleClick = this.handleClick.bind(this);\n this.handleCloseMenu = this.handleCloseMenu.bind(this);\n this.handleExited = this.handleExited.bind(this);\n\n this.container = React.createRef();\n this.parent = null;\n this.popper = React.createRef();\n\n this.isOpen = false;\n }\n\n componentDidMount(): void {\n const { isShown } = this.props;\n\n if (isShown === null) {\n if (this.container.current?.parentElement) {\n this.parent = this.container.current.parentElement;\n this.parent.addEventListener('click', this.handleClick);\n }\n } else if (isShown) {\n this.openMenu();\n }\n }\n\n componentDidUpdate(prevProps: DropdownMenuProps): void {\n const { isShown } = this.props;\n\n if (prevProps.isShown !== isShown) {\n if (isShown !== null && isShown) {\n // https://github.com/reactjs/react-transition-group/issues/382\n window.requestAnimationFrame(() => {\n this.openMenu();\n });\n } else {\n this.closeMenu();\n }\n }\n }\n\n componentWillUnmount(): void {\n if (this.parent) {\n this.parent.removeEventListener('click', this.handleClick);\n }\n }\n\n container: React.RefObject<HTMLDivElement>;\n\n parent: Element | null;\n\n popper: React.RefObject<Popper>;\n\n isOpen: boolean;\n\n closeMenu(): void {\n this.popper.current?.hide();\n }\n\n openMenu(): void {\n if (this.popper.current && !this.isOpen) {\n this.popper.current.show();\n this.isOpen = true;\n }\n }\n\n scheduleUpdate(): void {\n this.popper.current?.scheduleUpdate();\n }\n\n handleClick(e: Event): void {\n e.preventDefault();\n e.stopPropagation();\n\n this.openMenu();\n }\n\n handleCloseMenu(): void {\n this.closeMenu();\n }\n\n handleExited(): void {\n this.isOpen = false;\n\n const { onMenuClosed } = this.props;\n onMenuClosed();\n }\n\n render(): JSX.Element {\n const {\n actions,\n onMenuOpened,\n popperClassName,\n 'data-testid': dataTestId,\n } = this.props;\n const { menuStyle } = this.props;\n let { options, popperOptions } = this.props;\n popperOptions = { placement: 'bottom', ...popperOptions };\n options = {\n separateKeyboardMouse: true,\n ...options,\n };\n return (\n <div\n className=\"menu-actions-listener\"\n ref={this.container}\n data-testid={dataTestId}\n >\n <Popper\n ref={this.popper}\n options={popperOptions}\n className={classNames('menu-popper', popperClassName)}\n onExited={this.handleExited}\n closeOnBlur\n interactive\n >\n <Menu\n actions={actions}\n closeMenu={this.handleCloseMenu}\n onMenuOpened={onMenuOpened}\n options={options}\n menuStyle={menuStyle}\n />\n </Popper>\n </div>\n );\n }\n}\n\nexport default DropdownMenu;\n"],"mappings":"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"}
|
|
@@ -1,13 +1,9 @@
|
|
|
1
1
|
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
2
|
-
|
|
3
2
|
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
4
|
-
|
|
5
3
|
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; }
|
|
6
|
-
|
|
7
4
|
import React, { PureComponent } from 'react';
|
|
8
5
|
import ContextActionUtils from "../context-actions/ContextActionUtils.js";
|
|
9
6
|
import ContextMenuItem from "../context-actions/ContextMenuItem.js";
|
|
10
|
-
|
|
11
7
|
/**
|
|
12
8
|
* Do not use this class directly. Use DropdownMenu instead.
|
|
13
9
|
*
|
|
@@ -16,18 +12,14 @@ import ContextMenuItem from "../context-actions/ContextMenuItem.js";
|
|
|
16
12
|
* but still re-uses styling from context-menu. Depending on how usage evolves, may get split further.
|
|
17
13
|
*
|
|
18
14
|
*/
|
|
15
|
+
|
|
19
16
|
class Menu extends PureComponent {
|
|
20
17
|
constructor(props) {
|
|
21
18
|
var _options$initialKeybo;
|
|
22
|
-
|
|
23
19
|
super(props);
|
|
24
|
-
|
|
25
20
|
_defineProperty(this, "container", void 0);
|
|
26
|
-
|
|
27
21
|
_defineProperty(this, "oldFocus", void 0);
|
|
28
|
-
|
|
29
22
|
_defineProperty(this, "rAF", void 0);
|
|
30
|
-
|
|
31
23
|
this.handleKeyDown = this.handleKeyDown.bind(this);
|
|
32
24
|
this.handleMenuItemClick = this.handleMenuItemClick.bind(this);
|
|
33
25
|
this.handleMenuItemMouseMove = this.handleMenuItemMouseMove.bind(this);
|
|
@@ -46,12 +38,10 @@ class Menu extends PureComponent {
|
|
|
46
38
|
mouseIndex: -1
|
|
47
39
|
};
|
|
48
40
|
}
|
|
49
|
-
|
|
50
41
|
componentDidMount() {
|
|
51
42
|
this.initMenu();
|
|
52
43
|
this.rAF = window.requestAnimationFrame(() => {
|
|
53
44
|
var _this$container$curre;
|
|
54
|
-
|
|
55
45
|
// set initial focus to container so keyboard navigation works
|
|
56
46
|
// components can still override focus in onMenuOpened callback
|
|
57
47
|
(_this$container$curre = this.container.current) === null || _this$container$curre === void 0 ? void 0 : _this$container$curre.focus();
|
|
@@ -61,41 +51,33 @@ class Menu extends PureComponent {
|
|
|
61
51
|
onMenuOpened(this);
|
|
62
52
|
});
|
|
63
53
|
}
|
|
64
|
-
|
|
65
54
|
componentDidUpdate(prevProps) {
|
|
66
55
|
var {
|
|
67
56
|
actions
|
|
68
57
|
} = this.props;
|
|
69
|
-
|
|
70
58
|
if (prevProps.actions !== actions) {
|
|
71
59
|
this.initMenu();
|
|
72
60
|
}
|
|
73
61
|
}
|
|
74
|
-
|
|
75
62
|
componentWillUnmount() {
|
|
76
63
|
cancelAnimationFrame(this.rAF);
|
|
77
64
|
}
|
|
78
|
-
|
|
79
65
|
getKeyboardIndex() {
|
|
80
66
|
var {
|
|
81
67
|
options
|
|
82
68
|
} = this.props;
|
|
83
|
-
|
|
84
69
|
if (options.separateKeyboardMouse !== undefined && options.separateKeyboardMouse) {
|
|
85
70
|
var {
|
|
86
71
|
keyboardIndex
|
|
87
72
|
} = this.state;
|
|
88
73
|
return keyboardIndex;
|
|
89
74
|
}
|
|
90
|
-
|
|
91
75
|
return this.getMouseIndex();
|
|
92
76
|
}
|
|
93
|
-
|
|
94
77
|
setKeyboardIndex(index) {
|
|
95
78
|
var {
|
|
96
79
|
options
|
|
97
80
|
} = this.props;
|
|
98
|
-
|
|
99
81
|
if (options.separateKeyboardMouse !== undefined && options.separateKeyboardMouse) {
|
|
100
82
|
this.setState({
|
|
101
83
|
keyboardIndex: index
|
|
@@ -104,20 +86,17 @@ class Menu extends PureComponent {
|
|
|
104
86
|
this.setMouseIndex(index);
|
|
105
87
|
}
|
|
106
88
|
}
|
|
107
|
-
|
|
108
89
|
getMouseIndex() {
|
|
109
90
|
var {
|
|
110
91
|
mouseIndex
|
|
111
92
|
} = this.state;
|
|
112
93
|
return mouseIndex;
|
|
113
94
|
}
|
|
114
|
-
|
|
115
95
|
setMouseIndex(index) {
|
|
116
96
|
this.setState({
|
|
117
97
|
mouseIndex: index
|
|
118
98
|
});
|
|
119
99
|
}
|
|
120
|
-
|
|
121
100
|
initMenu() {
|
|
122
101
|
// cancel any pending close
|
|
123
102
|
cancelAnimationFrame(this.rAF);
|
|
@@ -128,57 +107,46 @@ class Menu extends PureComponent {
|
|
|
128
107
|
actions
|
|
129
108
|
} = this.props;
|
|
130
109
|
var menuItems = ContextActionUtils.getMenuItems(actions, false);
|
|
131
|
-
|
|
132
110
|
if (menuItems.length > 0) {
|
|
133
111
|
this.setState(state => ({
|
|
134
112
|
menuItems: ContextActionUtils.sortActions(state.menuItems.concat(menuItems))
|
|
135
113
|
}));
|
|
136
114
|
}
|
|
137
115
|
}
|
|
138
|
-
|
|
139
116
|
handleKeyDown(e) {
|
|
140
117
|
var {
|
|
141
118
|
menuItems
|
|
142
119
|
} = this.state;
|
|
143
120
|
var oldFocus = this.getKeyboardIndex();
|
|
144
121
|
var newFocus = oldFocus;
|
|
145
|
-
|
|
146
122
|
if (e.key === 'Enter' || e.key === ' ') {
|
|
147
123
|
if (oldFocus != null && oldFocus >= 0 && oldFocus < menuItems.length) {
|
|
148
124
|
this.handleMenuItemClick(menuItems[oldFocus], e);
|
|
149
125
|
}
|
|
150
|
-
|
|
151
126
|
return;
|
|
152
127
|
}
|
|
153
|
-
|
|
154
128
|
if (e.key === 'Escape') {
|
|
155
129
|
newFocus = null;
|
|
156
130
|
} else if (e.key === 'ArrowUp' || e.key === 'Tab' && e.shiftKey === true) {
|
|
157
131
|
var _newFocus;
|
|
158
|
-
|
|
159
132
|
newFocus = ContextActionUtils.getNextMenuItem((_newFocus = newFocus) !== null && _newFocus !== void 0 ? _newFocus : 0, -1, menuItems);
|
|
160
133
|
} else if (e.key === 'ArrowDown' || e.key === 'Tab' && e.shiftKey === false) {
|
|
161
134
|
var _newFocus2;
|
|
162
|
-
|
|
163
135
|
newFocus = ContextActionUtils.getNextMenuItem((_newFocus2 = newFocus) !== null && _newFocus2 !== void 0 ? _newFocus2 : 0, 1, menuItems);
|
|
164
136
|
}
|
|
165
|
-
|
|
166
137
|
if (oldFocus !== newFocus) {
|
|
167
138
|
if (newFocus !== null) {
|
|
168
139
|
this.setKeyboardIndex(newFocus);
|
|
169
140
|
} else {
|
|
170
141
|
this.closeMenu();
|
|
171
|
-
|
|
172
142
|
if (this.oldFocus instanceof HTMLElement) {
|
|
173
143
|
this.oldFocus.focus();
|
|
174
144
|
}
|
|
175
145
|
}
|
|
176
|
-
|
|
177
146
|
e.preventDefault();
|
|
178
147
|
e.stopPropagation();
|
|
179
148
|
}
|
|
180
149
|
}
|
|
181
|
-
|
|
182
150
|
closeMenu() {
|
|
183
151
|
var closeAll = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
|
|
184
152
|
var {
|
|
@@ -191,21 +159,17 @@ class Menu extends PureComponent {
|
|
|
191
159
|
onMenuClosed(this);
|
|
192
160
|
});
|
|
193
161
|
}
|
|
194
|
-
|
|
195
162
|
handleCloseMenu() {
|
|
196
163
|
this.closeMenu();
|
|
197
164
|
}
|
|
198
|
-
|
|
199
165
|
handleMenuItemClick(menuItem, e) {
|
|
200
166
|
e.preventDefault();
|
|
201
167
|
e.stopPropagation();
|
|
202
|
-
|
|
203
168
|
if (menuItem != null && (menuItem.disabled === undefined || !menuItem.disabled) && menuItem.action != null) {
|
|
204
169
|
menuItem.action();
|
|
205
170
|
this.closeMenu(true);
|
|
206
171
|
}
|
|
207
172
|
}
|
|
208
|
-
|
|
209
173
|
handleMenuItemMouseMove(menuItem) {
|
|
210
174
|
var {
|
|
211
175
|
menuItems
|
|
@@ -213,11 +177,9 @@ class Menu extends PureComponent {
|
|
|
213
177
|
var focusIndex = menuItems.indexOf(menuItem);
|
|
214
178
|
this.setMouseIndex(focusIndex);
|
|
215
179
|
}
|
|
216
|
-
|
|
217
180
|
handleMouseLeave() {
|
|
218
181
|
this.setMouseIndex(-1);
|
|
219
182
|
}
|
|
220
|
-
|
|
221
183
|
render() {
|
|
222
184
|
var menuItemElements = [];
|
|
223
185
|
var {
|
|
@@ -228,16 +190,13 @@ class Menu extends PureComponent {
|
|
|
228
190
|
menuItems,
|
|
229
191
|
mouseIndex
|
|
230
192
|
} = this.state;
|
|
231
|
-
|
|
232
193
|
for (var i = 0; i < menuItems.length; i += 1) {
|
|
233
194
|
var menuItem = menuItems[i];
|
|
234
|
-
|
|
235
195
|
if (i > 0 && menuItem.group !== menuItems[i - 1].group) {
|
|
236
196
|
menuItemElements.push( /*#__PURE__*/React.createElement("hr", {
|
|
237
197
|
key: "".concat(i, ".separator")
|
|
238
198
|
}));
|
|
239
199
|
}
|
|
240
|
-
|
|
241
200
|
var menuItemElement = /*#__PURE__*/React.createElement(ContextMenuItem, {
|
|
242
201
|
key: i,
|
|
243
202
|
isKeyboardSelected: keyboardIndex === i,
|
|
@@ -250,7 +209,6 @@ class Menu extends PureComponent {
|
|
|
250
209
|
});
|
|
251
210
|
menuItemElements.push(menuItemElement);
|
|
252
211
|
}
|
|
253
|
-
|
|
254
212
|
var {
|
|
255
213
|
menuStyle
|
|
256
214
|
} = this.props;
|
|
@@ -265,23 +223,20 @@ class Menu extends PureComponent {
|
|
|
265
223
|
"data-testid": dataTestId
|
|
266
224
|
}, menuItemElements);
|
|
267
225
|
}
|
|
268
|
-
|
|
269
226
|
}
|
|
270
|
-
|
|
271
227
|
_defineProperty(Menu, "defaultProps", {
|
|
272
|
-
closeMenu() {
|
|
228
|
+
closeMenu() {
|
|
229
|
+
// no-op
|
|
273
230
|
},
|
|
274
|
-
|
|
275
|
-
|
|
231
|
+
onMenuOpened() {
|
|
232
|
+
// no-op
|
|
276
233
|
},
|
|
277
|
-
|
|
278
|
-
|
|
234
|
+
onMenuClosed() {
|
|
235
|
+
// no-op
|
|
279
236
|
},
|
|
280
|
-
|
|
281
237
|
options: {},
|
|
282
238
|
menuStyle: {},
|
|
283
239
|
'data-testid': undefined
|
|
284
240
|
});
|
|
285
|
-
|
|
286
241
|
export default Menu;
|
|
287
242
|
//# sourceMappingURL=Menu.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Menu.js","names":["React","PureComponent","ContextActionUtils","ContextMenuItem","Menu","constructor","props","handleKeyDown","bind","handleMenuItemClick","handleMenuItemMouseMove","handleMouseLeave","handleCloseMenu","container","createRef","oldFocus","document","activeElement","rAF","options","keyboardIndex","initialKeyboardIndex","state","menuItems","mouseIndex","componentDidMount","initMenu","window","requestAnimationFrame","current","focus","onMenuOpened","componentDidUpdate","prevProps","actions","componentWillUnmount","cancelAnimationFrame","getKeyboardIndex","separateKeyboardMouse","undefined","getMouseIndex","setKeyboardIndex","index","setState","setMouseIndex","getMenuItems","length","sortActions","concat","e","newFocus","key","shiftKey","getNextMenuItem","closeMenu","HTMLElement","preventDefault","stopPropagation","closeAll","onMenuClosed","menuItem","disabled","action","focusIndex","indexOf","render","menuItemElements","dataTestId","i","group","push","menuItemElement","menuStyle"],"sources":["../../src/menu-actions/Menu.tsx"],"sourcesContent":["import React, { PureComponent } from 'react';\nimport ContextActionUtils, {\n ContextAction,\n} from '../context-actions/ContextActionUtils';\nimport ContextMenuItem from '../context-actions/ContextMenuItem';\n\nexport type MenuOptions = {\n doNotVerifyPosition?: boolean;\n separateKeyboardMouse?: boolean;\n initialKeyboardIndex?: number;\n};\n\ntype MenuProps = {\n actions: (() => ContextAction[]) | ContextAction | ContextAction[];\n closeMenu(closeAll: boolean): void;\n onMenuClosed(menu: Menu): void;\n onMenuOpened(menu: Menu): void;\n options: MenuOptions;\n menuStyle: React.CSSProperties;\n 'data-testid'?: string;\n};\n\ntype MenuState = {\n menuItems: ContextAction[];\n keyboardIndex: number;\n mouseIndex: number;\n};\n\n/**\n * Do not use this class directly. Use DropdownMenu instead.\n *\n * Generates list from actions for use by DropdownMenu.\n * It has beem split from the context-actions component, due to divergering requirements,\n * but still re-uses styling from context-menu. Depending on how usage evolves, may get split further.\n *\n */\n\nclass Menu extends PureComponent<MenuProps, MenuState> {\n static defaultProps = {\n closeMenu(): void {\n // no-op\n },\n onMenuOpened(): void {\n // no-op\n },\n onMenuClosed(): void {\n // no-op\n },\n options: {},\n menuStyle: {},\n 'data-testid': undefined,\n };\n\n constructor(props: MenuProps) {\n super(props);\n\n this.handleKeyDown = this.handleKeyDown.bind(this);\n this.handleMenuItemClick = this.handleMenuItemClick.bind(this);\n this.handleMenuItemMouseMove = this.handleMenuItemMouseMove.bind(this);\n this.handleMouseLeave = this.handleMouseLeave.bind(this);\n this.handleCloseMenu = this.handleCloseMenu.bind(this);\n\n this.container = React.createRef();\n this.oldFocus = document.activeElement;\n this.rAF = 0;\n\n const { options } = props;\n const keyboardIndex = options.initialKeyboardIndex ?? -1;\n this.state = {\n menuItems: [],\n keyboardIndex,\n mouseIndex: -1,\n };\n }\n\n componentDidMount(): void {\n this.initMenu();\n\n this.rAF = window.requestAnimationFrame(() => {\n // set initial focus to container so keyboard navigation works\n // components can still override focus in onMenuOpened callback\n this.container.current?.focus();\n const { onMenuOpened } = this.props;\n onMenuOpened(this);\n });\n }\n\n componentDidUpdate(prevProps: MenuProps): void {\n const { actions } = this.props;\n if (prevProps.actions !== actions) {\n this.initMenu();\n }\n }\n\n componentWillUnmount(): void {\n cancelAnimationFrame(this.rAF);\n }\n\n container: React.RefObject<HTMLDivElement>;\n\n oldFocus: Element | null;\n\n rAF: number;\n\n getKeyboardIndex(): number | null {\n const { options } = this.props;\n if (\n options.separateKeyboardMouse !== undefined &&\n options.separateKeyboardMouse\n ) {\n const { keyboardIndex } = this.state;\n return keyboardIndex;\n }\n\n return this.getMouseIndex();\n }\n\n setKeyboardIndex(index: number): void {\n const { options } = this.props;\n if (\n options.separateKeyboardMouse !== undefined &&\n options.separateKeyboardMouse\n ) {\n this.setState({ keyboardIndex: index });\n } else {\n this.setMouseIndex(index);\n }\n }\n\n getMouseIndex(): number {\n const { mouseIndex } = this.state;\n return mouseIndex;\n }\n\n setMouseIndex(index: number): void {\n this.setState({ mouseIndex: index });\n }\n\n initMenu(): void {\n // cancel any pending close\n cancelAnimationFrame(this.rAF);\n\n this.setState({\n menuItems: [],\n });\n\n const { actions } = this.props;\n const menuItems = ContextActionUtils.getMenuItems(actions, false);\n\n if (menuItems.length > 0) {\n this.setState(state => ({\n menuItems: ContextActionUtils.sortActions(\n state.menuItems.concat(menuItems)\n ),\n }));\n }\n }\n\n handleKeyDown(e: React.KeyboardEvent): void {\n const { menuItems } = this.state;\n const oldFocus = this.getKeyboardIndex();\n let newFocus = oldFocus;\n\n if (e.key === 'Enter' || e.key === ' ') {\n if (oldFocus != null && oldFocus >= 0 && oldFocus < menuItems.length) {\n this.handleMenuItemClick(menuItems[oldFocus], e);\n }\n return;\n }\n\n if (e.key === 'Escape') {\n newFocus = null;\n } else if (\n e.key === 'ArrowUp' ||\n (e.key === 'Tab' && e.shiftKey === true)\n ) {\n newFocus = ContextActionUtils.getNextMenuItem(\n newFocus ?? 0,\n -1,\n menuItems\n );\n } else if (\n e.key === 'ArrowDown' ||\n (e.key === 'Tab' && e.shiftKey === false)\n ) {\n newFocus = ContextActionUtils.getNextMenuItem(\n newFocus ?? 0,\n 1,\n menuItems\n );\n }\n\n if (oldFocus !== newFocus) {\n if (newFocus !== null) {\n this.setKeyboardIndex(newFocus);\n } else {\n this.closeMenu();\n if (this.oldFocus instanceof HTMLElement) {\n this.oldFocus.focus();\n }\n }\n\n e.preventDefault();\n e.stopPropagation();\n }\n }\n\n closeMenu(closeAll = false): void {\n const { closeMenu, onMenuClosed } = this.props;\n cancelAnimationFrame(this.rAF);\n this.rAF = window.requestAnimationFrame(() => {\n closeMenu(closeAll);\n onMenuClosed(this);\n });\n }\n\n handleCloseMenu(): void {\n this.closeMenu();\n }\n\n handleMenuItemClick(menuItem: ContextAction, e: React.SyntheticEvent): void {\n e.preventDefault();\n e.stopPropagation();\n\n if (\n menuItem != null &&\n (menuItem.disabled === undefined || !menuItem.disabled) &&\n menuItem.action != null\n ) {\n menuItem.action();\n this.closeMenu(true);\n }\n }\n\n handleMenuItemMouseMove(menuItem: ContextAction): void {\n const { menuItems } = this.state;\n const focusIndex = menuItems.indexOf(menuItem);\n this.setMouseIndex(focusIndex);\n }\n\n handleMouseLeave(): void {\n this.setMouseIndex(-1);\n }\n\n render(): JSX.Element {\n const menuItemElements = [];\n const { 'data-testid': dataTestId } = this.props;\n const { keyboardIndex, menuItems, mouseIndex } = this.state;\n for (let i = 0; i < menuItems.length; i += 1) {\n const menuItem = menuItems[i];\n\n if (i > 0 && menuItem.group !== menuItems[i - 1].group) {\n menuItemElements.push(<hr key={`${i}.separator`} />);\n }\n\n const menuItemElement = (\n <ContextMenuItem\n key={i}\n isKeyboardSelected={keyboardIndex === i}\n isMouseSelected={mouseIndex === i}\n menuItem={menuItem}\n closeMenu={this.handleCloseMenu}\n onMenuItemClick={this.handleMenuItemClick}\n onMenuItemMouseMove={this.handleMenuItemMouseMove}\n onMenuItemContextMenu={() => false}\n />\n );\n\n menuItemElements.push(menuItemElement);\n }\n\n const { menuStyle } = this.props;\n\n return (\n <div\n className=\"context-menu-container\"\n style={{ ...menuStyle }}\n ref={this.container}\n onKeyDown={this.handleKeyDown}\n onMouseLeave={this.handleMouseLeave}\n role=\"menuitem\"\n tabIndex={0}\n data-testid={dataTestId}\n >\n {menuItemElements}\n </div>\n );\n }\n}\n\nexport default Menu;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Menu.js","names":["React","PureComponent","ContextActionUtils","ContextMenuItem","Menu","constructor","props","handleKeyDown","bind","handleMenuItemClick","handleMenuItemMouseMove","handleMouseLeave","handleCloseMenu","container","createRef","oldFocus","document","activeElement","rAF","options","keyboardIndex","initialKeyboardIndex","state","menuItems","mouseIndex","componentDidMount","initMenu","window","requestAnimationFrame","current","focus","onMenuOpened","componentDidUpdate","prevProps","actions","componentWillUnmount","cancelAnimationFrame","getKeyboardIndex","separateKeyboardMouse","undefined","getMouseIndex","setKeyboardIndex","index","setState","setMouseIndex","getMenuItems","length","sortActions","concat","e","newFocus","key","shiftKey","getNextMenuItem","closeMenu","HTMLElement","preventDefault","stopPropagation","closeAll","onMenuClosed","menuItem","disabled","action","focusIndex","indexOf","render","menuItemElements","dataTestId","i","group","push","menuItemElement","menuStyle"],"sources":["../../src/menu-actions/Menu.tsx"],"sourcesContent":["import React, { PureComponent } from 'react';\nimport ContextActionUtils, {\n ContextAction,\n} from '../context-actions/ContextActionUtils';\nimport ContextMenuItem from '../context-actions/ContextMenuItem';\n\nexport type MenuOptions = {\n doNotVerifyPosition?: boolean;\n separateKeyboardMouse?: boolean;\n initialKeyboardIndex?: number;\n};\n\ntype MenuProps = {\n actions: (() => ContextAction[]) | ContextAction | ContextAction[];\n closeMenu(closeAll: boolean): void;\n onMenuClosed(menu: Menu): void;\n onMenuOpened(menu: Menu): void;\n options: MenuOptions;\n menuStyle: React.CSSProperties;\n 'data-testid'?: string;\n};\n\ntype MenuState = {\n menuItems: ContextAction[];\n keyboardIndex: number;\n mouseIndex: number;\n};\n\n/**\n * Do not use this class directly. Use DropdownMenu instead.\n *\n * Generates list from actions for use by DropdownMenu.\n * It has beem split from the context-actions component, due to divergering requirements,\n * but still re-uses styling from context-menu. Depending on how usage evolves, may get split further.\n *\n */\n\nclass Menu extends PureComponent<MenuProps, MenuState> {\n static defaultProps = {\n closeMenu(): void {\n // no-op\n },\n onMenuOpened(): void {\n // no-op\n },\n onMenuClosed(): void {\n // no-op\n },\n options: {},\n menuStyle: {},\n 'data-testid': undefined,\n };\n\n constructor(props: MenuProps) {\n super(props);\n\n this.handleKeyDown = this.handleKeyDown.bind(this);\n this.handleMenuItemClick = this.handleMenuItemClick.bind(this);\n this.handleMenuItemMouseMove = this.handleMenuItemMouseMove.bind(this);\n this.handleMouseLeave = this.handleMouseLeave.bind(this);\n this.handleCloseMenu = this.handleCloseMenu.bind(this);\n\n this.container = React.createRef();\n this.oldFocus = document.activeElement;\n this.rAF = 0;\n\n const { options } = props;\n const keyboardIndex = options.initialKeyboardIndex ?? -1;\n this.state = {\n menuItems: [],\n keyboardIndex,\n mouseIndex: -1,\n };\n }\n\n componentDidMount(): void {\n this.initMenu();\n\n this.rAF = window.requestAnimationFrame(() => {\n // set initial focus to container so keyboard navigation works\n // components can still override focus in onMenuOpened callback\n this.container.current?.focus();\n const { onMenuOpened } = this.props;\n onMenuOpened(this);\n });\n }\n\n componentDidUpdate(prevProps: MenuProps): void {\n const { actions } = this.props;\n if (prevProps.actions !== actions) {\n this.initMenu();\n }\n }\n\n componentWillUnmount(): void {\n cancelAnimationFrame(this.rAF);\n }\n\n container: React.RefObject<HTMLDivElement>;\n\n oldFocus: Element | null;\n\n rAF: number;\n\n getKeyboardIndex(): number | null {\n const { options } = this.props;\n if (\n options.separateKeyboardMouse !== undefined &&\n options.separateKeyboardMouse\n ) {\n const { keyboardIndex } = this.state;\n return keyboardIndex;\n }\n\n return this.getMouseIndex();\n }\n\n setKeyboardIndex(index: number): void {\n const { options } = this.props;\n if (\n options.separateKeyboardMouse !== undefined &&\n options.separateKeyboardMouse\n ) {\n this.setState({ keyboardIndex: index });\n } else {\n this.setMouseIndex(index);\n }\n }\n\n getMouseIndex(): number {\n const { mouseIndex } = this.state;\n return mouseIndex;\n }\n\n setMouseIndex(index: number): void {\n this.setState({ mouseIndex: index });\n }\n\n initMenu(): void {\n // cancel any pending close\n cancelAnimationFrame(this.rAF);\n\n this.setState({\n menuItems: [],\n });\n\n const { actions } = this.props;\n const menuItems = ContextActionUtils.getMenuItems(actions, false);\n\n if (menuItems.length > 0) {\n this.setState(state => ({\n menuItems: ContextActionUtils.sortActions(\n state.menuItems.concat(menuItems)\n ),\n }));\n }\n }\n\n handleKeyDown(e: React.KeyboardEvent): void {\n const { menuItems } = this.state;\n const oldFocus = this.getKeyboardIndex();\n let newFocus = oldFocus;\n\n if (e.key === 'Enter' || e.key === ' ') {\n if (oldFocus != null && oldFocus >= 0 && oldFocus < menuItems.length) {\n this.handleMenuItemClick(menuItems[oldFocus], e);\n }\n return;\n }\n\n if (e.key === 'Escape') {\n newFocus = null;\n } else if (\n e.key === 'ArrowUp' ||\n (e.key === 'Tab' && e.shiftKey === true)\n ) {\n newFocus = ContextActionUtils.getNextMenuItem(\n newFocus ?? 0,\n -1,\n menuItems\n );\n } else if (\n e.key === 'ArrowDown' ||\n (e.key === 'Tab' && e.shiftKey === false)\n ) {\n newFocus = ContextActionUtils.getNextMenuItem(\n newFocus ?? 0,\n 1,\n menuItems\n );\n }\n\n if (oldFocus !== newFocus) {\n if (newFocus !== null) {\n this.setKeyboardIndex(newFocus);\n } else {\n this.closeMenu();\n if (this.oldFocus instanceof HTMLElement) {\n this.oldFocus.focus();\n }\n }\n\n e.preventDefault();\n e.stopPropagation();\n }\n }\n\n closeMenu(closeAll = false): void {\n const { closeMenu, onMenuClosed } = this.props;\n cancelAnimationFrame(this.rAF);\n this.rAF = window.requestAnimationFrame(() => {\n closeMenu(closeAll);\n onMenuClosed(this);\n });\n }\n\n handleCloseMenu(): void {\n this.closeMenu();\n }\n\n handleMenuItemClick(menuItem: ContextAction, e: React.SyntheticEvent): void {\n e.preventDefault();\n e.stopPropagation();\n\n if (\n menuItem != null &&\n (menuItem.disabled === undefined || !menuItem.disabled) &&\n menuItem.action != null\n ) {\n menuItem.action();\n this.closeMenu(true);\n }\n }\n\n handleMenuItemMouseMove(menuItem: ContextAction): void {\n const { menuItems } = this.state;\n const focusIndex = menuItems.indexOf(menuItem);\n this.setMouseIndex(focusIndex);\n }\n\n handleMouseLeave(): void {\n this.setMouseIndex(-1);\n }\n\n render(): JSX.Element {\n const menuItemElements = [];\n const { 'data-testid': dataTestId } = this.props;\n const { keyboardIndex, menuItems, mouseIndex } = this.state;\n for (let i = 0; i < menuItems.length; i += 1) {\n const menuItem = menuItems[i];\n\n if (i > 0 && menuItem.group !== menuItems[i - 1].group) {\n menuItemElements.push(<hr key={`${i}.separator`} />);\n }\n\n const menuItemElement = (\n <ContextMenuItem\n key={i}\n isKeyboardSelected={keyboardIndex === i}\n isMouseSelected={mouseIndex === i}\n menuItem={menuItem}\n closeMenu={this.handleCloseMenu}\n onMenuItemClick={this.handleMenuItemClick}\n onMenuItemMouseMove={this.handleMenuItemMouseMove}\n onMenuItemContextMenu={() => false}\n />\n );\n\n menuItemElements.push(menuItemElement);\n }\n\n const { menuStyle } = this.props;\n\n return (\n <div\n className=\"context-menu-container\"\n style={{ ...menuStyle }}\n ref={this.container}\n onKeyDown={this.handleKeyDown}\n onMouseLeave={this.handleMouseLeave}\n role=\"menuitem\"\n tabIndex={0}\n data-testid={dataTestId}\n >\n {menuItemElements}\n </div>\n );\n }\n}\n\nexport default Menu;\n"],"mappings":"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"}
|