@deephaven/components 0.16.1-sept8-monaco.10 → 0.16.1-vite.27

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 (77) hide show
  1. package/dist/AutoCompleteInput.js.map +1 -1
  2. package/dist/AutoResizeTextarea.js.map +1 -1
  3. package/dist/BasicModal.js.map +1 -1
  4. package/dist/Button.js.map +1 -1
  5. package/dist/ButtonGroup.js.map +1 -1
  6. package/dist/ButtonOld.js.map +1 -1
  7. package/dist/CardFlip.js.map +1 -1
  8. package/dist/Checkbox.js.map +1 -1
  9. package/dist/Collapse.js.map +1 -1
  10. package/dist/ComboBox.js.map +1 -1
  11. package/dist/CustomTimeSelect.js.map +1 -1
  12. package/dist/DebouncedSearchInput.js.map +1 -1
  13. package/dist/DeephavenSpinner.js.map +1 -1
  14. package/dist/DragUtils.js.map +1 -1
  15. package/dist/DraggableItemList.js +1 -1
  16. package/dist/DraggableItemList.js.map +1 -1
  17. package/dist/EditableItemList.d.ts +11 -0
  18. package/dist/EditableItemList.d.ts.map +1 -0
  19. package/dist/EditableItemList.js +107 -0
  20. package/dist/EditableItemList.js.map +1 -0
  21. package/dist/HierarchicalCheckboxMenu.js.map +1 -1
  22. package/dist/ItemList.js +1 -1
  23. package/dist/ItemList.js.map +1 -1
  24. package/dist/ItemListItem.js.map +1 -1
  25. package/dist/LoadingOverlay.js.map +1 -1
  26. package/dist/LoadingSpinner.js.map +1 -1
  27. package/dist/MaskedInput.js.map +1 -1
  28. package/dist/Option.js.map +1 -1
  29. package/dist/RadioGroup.js.map +1 -1
  30. package/dist/RadioItem.js.map +1 -1
  31. package/dist/SearchInput.js.map +1 -1
  32. package/dist/Select.js.map +1 -1
  33. package/dist/SelectValueList.js.map +1 -1
  34. package/dist/SocketedButton.js.map +1 -1
  35. package/dist/ThemeExport.js.map +1 -1
  36. package/dist/TimeInput.js.map +1 -1
  37. package/dist/TimeSlider.js.map +1 -1
  38. package/dist/ToastNotification.js.map +1 -1
  39. package/dist/UISwitch.js.map +1 -1
  40. package/dist/ValidateLabelInput.js.map +1 -1
  41. package/dist/context-actions/ContextActionUtils.js.map +1 -1
  42. package/dist/context-actions/ContextActions.js.map +1 -1
  43. package/dist/context-actions/ContextMenu.js.map +1 -1
  44. package/dist/context-actions/ContextMenuItem.js.map +1 -1
  45. package/dist/context-actions/ContextMenuRoot.js.map +1 -1
  46. package/dist/context-actions/GlobalContextAction.js.map +1 -1
  47. package/dist/context-actions/GlobalContextActions.js.map +1 -1
  48. package/dist/context-actions/index.js.map +1 -1
  49. package/dist/declaration.d.js.map +1 -1
  50. package/dist/index.d.ts +2 -1
  51. package/dist/index.d.ts.map +1 -1
  52. package/dist/index.js +2 -1
  53. package/dist/index.js.map +1 -1
  54. package/dist/menu-actions/DropdownMenu.js.map +1 -1
  55. package/dist/menu-actions/Menu.js.map +1 -1
  56. package/dist/menu-actions/index.js.map +1 -1
  57. package/dist/modal/Modal.js.map +1 -1
  58. package/dist/modal/ModalBody.js.map +1 -1
  59. package/dist/modal/ModalFooter.js.map +1 -1
  60. package/dist/modal/ModalHeader.js.map +1 -1
  61. package/dist/modal/index.js.map +1 -1
  62. package/dist/navigation/Menu.js.map +1 -1
  63. package/dist/navigation/MenuItem.js.map +1 -1
  64. package/dist/navigation/Page.js.map +1 -1
  65. package/dist/navigation/Stack.js.map +1 -1
  66. package/dist/navigation/index.js.map +1 -1
  67. package/dist/popper/Popper.js.map +1 -1
  68. package/dist/popper/Tooltip.js.map +1 -1
  69. package/dist/popper/index.js.map +1 -1
  70. package/dist/shortcuts/GlobalShortcuts.js.map +1 -1
  71. package/dist/shortcuts/Shortcut.js.map +1 -1
  72. package/dist/shortcuts/ShortcutRegistry.js.map +1 -1
  73. package/dist/shortcuts/index.js.map +1 -1
  74. package/package.json +10 -9
  75. package/scss/BaseStyleSheet.scss +847 -0
  76. package/dist/BaseStyleSheet.css +0 -11560
  77. package/dist/BaseStyleSheet.css.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/SelectValueList.tsx"],"names":["React","PureComponent","classNames","memoize","Checkbox","SelectValueList","constructor","props","itemIndex","key","value","displayValue","rowHeight","isSelected","disabled","style","height","text","handleSelect","max","items","offset","itemElements","i","length","item","element","getCachedItem","push","handleScroll","bind","list","createRef","topRow","bottomRow","componentDidMount","sendViewportUpdate","componentDidUpdate","onSelect","visibleItemIndex","current","clientHeight","onViewportChange","top","scrollTop","bottom","Math","floor","ceil","render","className","isInvalid","itemCount","dataTestId","getCachedItems","position","left","undefined"],"mappings":"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","sourcesContent":["import React, { PureComponent } from 'react';\nimport './SelectValueList.scss';\nimport classNames from 'classnames';\nimport memoize from 'memoizee';\nimport Checkbox from './Checkbox';\n\nexport interface SelectItem<T> {\n value: T;\n displayValue?: string;\n isSelected: boolean;\n}\n\ntype SelectValueListProps<T> = {\n className?: string;\n disabled: boolean;\n isInvalid?: boolean;\n // Total item count\n itemCount: number;\n rowHeight: number;\n\n // Offset of the top item in the items array\n offset: number;\n items: SelectItem<T>[];\n\n onSelect(itemIndex: number, value: T | null): void;\n onViewportChange(topRow: number, bottomRow: number): void;\n\n 'data-testid'?: string;\n};\n\n/**\n * Select values from a long scrollable list.\n * Swaps items in and out for infinite scrolling\n */\nclass SelectValueList<T> extends PureComponent<SelectValueListProps<T>> {\n static defaultProps = {\n disabled: false,\n rowHeight: 21,\n 'data-testid': undefined,\n };\n\n constructor(props: SelectValueListProps<T>) {\n super(props);\n\n this.handleScroll = this.handleScroll.bind(this);\n this.handleSelect = this.handleSelect.bind(this);\n\n this.list = React.createRef();\n this.topRow = null;\n this.bottomRow = null;\n }\n\n componentDidMount(): void {\n this.sendViewportUpdate();\n }\n\n componentDidUpdate(): void {\n this.sendViewportUpdate();\n }\n\n list: React.RefObject<HTMLDivElement>;\n\n topRow: number | null;\n\n bottomRow: number | null;\n\n getCachedItem = memoize(\n (\n itemIndex: number,\n key: number,\n value: T,\n displayValue: string | undefined,\n rowHeight: number,\n isSelected: boolean,\n disabled: boolean\n ): JSX.Element => {\n const style = {\n height: rowHeight,\n };\n const text = displayValue != null ? displayValue : value;\n\n return (\n <li className=\"value-list-item\" style={style} key={key}>\n <Checkbox\n checked={isSelected}\n disabled={disabled}\n onChange={() => this.handleSelect(itemIndex)}\n >\n {text}\n </Checkbox>\n </li>\n );\n },\n { max: 1000 }\n );\n\n getCachedItems = memoize(\n (\n items: SelectItem<T>[],\n rowHeight: number,\n offset: number,\n disabled: boolean\n ): React.ReactNode => {\n const itemElements: JSX.Element[] = [];\n for (let i = 0; i < items.length; i += 1) {\n const item = items[i];\n const { value, displayValue, isSelected } = item;\n const itemIndex = offset + i;\n const key = itemIndex;\n const element = this.getCachedItem(\n itemIndex,\n key,\n value,\n displayValue,\n rowHeight,\n isSelected,\n disabled\n );\n itemElements.push(element);\n }\n return itemElements;\n },\n { max: 1 }\n );\n\n handleScroll(): void {\n this.sendViewportUpdate();\n }\n\n handleSelect(itemIndex: number): void {\n const { items, offset, onSelect } = this.props;\n const visibleItemIndex = itemIndex - offset;\n if (visibleItemIndex >= 0 && visibleItemIndex < items.length) {\n const item = items[visibleItemIndex];\n const { value } = item;\n onSelect(itemIndex, value);\n } else {\n onSelect(itemIndex, null);\n }\n }\n\n sendViewportUpdate(): void {\n if (!this.list.current || this.list.current.clientHeight === 0) {\n return;\n }\n\n const { onViewportChange, rowHeight } = this.props;\n const top = this.list.current.scrollTop;\n const bottom = top + this.list.current.clientHeight;\n\n const topRow = Math.floor(top / rowHeight);\n const bottomRow = Math.ceil(bottom / rowHeight);\n\n if (this.topRow !== topRow || this.bottomRow !== bottomRow) {\n this.topRow = topRow;\n this.bottomRow = bottomRow;\n onViewportChange(topRow, bottomRow);\n }\n }\n\n render(): JSX.Element {\n const {\n className,\n disabled,\n isInvalid,\n items,\n itemCount,\n offset,\n rowHeight,\n 'data-testid': dataTestId,\n } = this.props;\n const itemElements = this.getCachedItems(\n items,\n rowHeight,\n offset,\n disabled\n );\n\n return (\n <div\n className={classNames(\n 'select-value-list-scroll-pane h-100 w-100',\n { 'is-invalid': isInvalid },\n className\n )}\n onScroll={this.handleScroll}\n ref={this.list}\n data-testid={dataTestId}\n >\n <div\n className=\"select-value-list\"\n style={{ height: itemCount * rowHeight }}\n >\n <ol\n className=\"select-value-list-content\"\n style={{\n position: 'absolute',\n height: items.length * rowHeight,\n top: offset * rowHeight,\n left: 0,\n }}\n >\n {itemElements}\n </ol>\n </div>\n </div>\n );\n }\n}\n\nexport default SelectValueList;\n"],"file":"SelectValueList.js"}
1
+ {"version":3,"file":"SelectValueList.js","names":["React","PureComponent","classNames","memoize","Checkbox","SelectValueList","constructor","props","itemIndex","key","value","displayValue","rowHeight","isSelected","disabled","style","height","text","handleSelect","max","items","offset","itemElements","i","length","item","element","getCachedItem","push","handleScroll","bind","list","createRef","topRow","bottomRow","componentDidMount","sendViewportUpdate","componentDidUpdate","onSelect","visibleItemIndex","current","clientHeight","onViewportChange","top","scrollTop","bottom","Math","floor","ceil","render","className","isInvalid","itemCount","dataTestId","getCachedItems","position","left","undefined"],"sources":["../src/SelectValueList.tsx"],"sourcesContent":["import React, { PureComponent } from 'react';\nimport './SelectValueList.scss';\nimport classNames from 'classnames';\nimport memoize from 'memoizee';\nimport Checkbox from './Checkbox';\n\nexport interface SelectItem<T> {\n value: T;\n displayValue?: string;\n isSelected: boolean;\n}\n\ntype SelectValueListProps<T> = {\n className?: string;\n disabled: boolean;\n isInvalid?: boolean;\n // Total item count\n itemCount: number;\n rowHeight: number;\n\n // Offset of the top item in the items array\n offset: number;\n items: SelectItem<T>[];\n\n onSelect(itemIndex: number, value: T | null): void;\n onViewportChange(topRow: number, bottomRow: number): void;\n\n 'data-testid'?: string;\n};\n\n/**\n * Select values from a long scrollable list.\n * Swaps items in and out for infinite scrolling\n */\nclass SelectValueList<T> extends PureComponent<SelectValueListProps<T>> {\n static defaultProps = {\n disabled: false,\n rowHeight: 21,\n 'data-testid': undefined,\n };\n\n constructor(props: SelectValueListProps<T>) {\n super(props);\n\n this.handleScroll = this.handleScroll.bind(this);\n this.handleSelect = this.handleSelect.bind(this);\n\n this.list = React.createRef();\n this.topRow = null;\n this.bottomRow = null;\n }\n\n componentDidMount(): void {\n this.sendViewportUpdate();\n }\n\n componentDidUpdate(): void {\n this.sendViewportUpdate();\n }\n\n list: React.RefObject<HTMLDivElement>;\n\n topRow: number | null;\n\n bottomRow: number | null;\n\n getCachedItem = memoize(\n (\n itemIndex: number,\n key: number,\n value: T,\n displayValue: string | undefined,\n rowHeight: number,\n isSelected: boolean,\n disabled: boolean\n ): JSX.Element => {\n const style = {\n height: rowHeight,\n };\n const text = displayValue != null ? displayValue : value;\n\n return (\n <li className=\"value-list-item\" style={style} key={key}>\n <Checkbox\n checked={isSelected}\n disabled={disabled}\n onChange={() => this.handleSelect(itemIndex)}\n >\n {text}\n </Checkbox>\n </li>\n );\n },\n { max: 1000 }\n );\n\n getCachedItems = memoize(\n (\n items: SelectItem<T>[],\n rowHeight: number,\n offset: number,\n disabled: boolean\n ): React.ReactNode => {\n const itemElements: JSX.Element[] = [];\n for (let i = 0; i < items.length; i += 1) {\n const item = items[i];\n const { value, displayValue, isSelected } = item;\n const itemIndex = offset + i;\n const key = itemIndex;\n const element = this.getCachedItem(\n itemIndex,\n key,\n value,\n displayValue,\n rowHeight,\n isSelected,\n disabled\n );\n itemElements.push(element);\n }\n return itemElements;\n },\n { max: 1 }\n );\n\n handleScroll(): void {\n this.sendViewportUpdate();\n }\n\n handleSelect(itemIndex: number): void {\n const { items, offset, onSelect } = this.props;\n const visibleItemIndex = itemIndex - offset;\n if (visibleItemIndex >= 0 && visibleItemIndex < items.length) {\n const item = items[visibleItemIndex];\n const { value } = item;\n onSelect(itemIndex, value);\n } else {\n onSelect(itemIndex, null);\n }\n }\n\n sendViewportUpdate(): void {\n if (!this.list.current || this.list.current.clientHeight === 0) {\n return;\n }\n\n const { onViewportChange, rowHeight } = this.props;\n const top = this.list.current.scrollTop;\n const bottom = top + this.list.current.clientHeight;\n\n const topRow = Math.floor(top / rowHeight);\n const bottomRow = Math.ceil(bottom / rowHeight);\n\n if (this.topRow !== topRow || this.bottomRow !== bottomRow) {\n this.topRow = topRow;\n this.bottomRow = bottomRow;\n onViewportChange(topRow, bottomRow);\n }\n }\n\n render(): JSX.Element {\n const {\n className,\n disabled,\n isInvalid,\n items,\n itemCount,\n offset,\n rowHeight,\n 'data-testid': dataTestId,\n } = this.props;\n const itemElements = this.getCachedItems(\n items,\n rowHeight,\n offset,\n disabled\n );\n\n return (\n <div\n className={classNames(\n 'select-value-list-scroll-pane h-100 w-100',\n { 'is-invalid': isInvalid },\n className\n )}\n onScroll={this.handleScroll}\n ref={this.list}\n data-testid={dataTestId}\n >\n <div\n className=\"select-value-list\"\n style={{ height: itemCount * rowHeight }}\n >\n <ol\n className=\"select-value-list-content\"\n style={{\n position: 'absolute',\n height: items.length * rowHeight,\n top: offset * rowHeight,\n left: 0,\n }}\n >\n {itemElements}\n </ol>\n </div>\n </div>\n );\n }\n}\n\nexport default SelectValueList;\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/SocketedButton.tsx"],"names":["React","classNames","dhExclamation","vsLink","FontAwesomeIcon","SocketedButton","forwardRef","props","ref","children","className","disabled","isLinked","isLinkedSource","isInvalid","onClick","onMouseEnter","onMouseLeave","style","dataTestId","displayName","defaultProps","undefined"],"mappings":"AAAA,OAAOA,KAAP,MAAkB,OAAlB;AACA,OAAOC,UAAP,MAAuB,YAAvB;AACA,SAASC,aAAT,EAAwBC,MAAxB,QAAsC,kBAAtC;AACA,SAASC,eAAT,QAAgC,gCAAhC;;AAkBA,IAAMC,cAAc,gBAAGL,KAAK,CAACM,UAAN,CACrB,CAACC,KAAD,EAA6BC,GAA7B,KAAqC;AACnC,MAAM;AACJC,IAAAA,QADI;AAEJC,IAAAA,SAFI;AAGJC,IAAAA,QAHI;AAIJC,IAAAA,QAJI;AAKJC,IAAAA,cALI;AAMJC,IAAAA,SANI;AAOJC,IAAAA,OAPI;AAQJC,IAAAA,YARI;AASJC,IAAAA,YATI;AAUJC,IAAAA,KAVI;AAWJ,mBAAeC;AAXX,MAYFZ,KAZJ;AAaA,sBACE;AACE,IAAA,GAAG,EAAEC,GADP;AAEE,IAAA,IAAI,EAAC,QAFP;AAGE,IAAA,SAAS,EAAEP,UAAU,CACnB,cADmB,EAEnB;AAAE,6BAAuBW,QAAQ,IAAIC;AAArC,KAFmB,EAGnB;AAAE,oCAA8BA;AAAhC,KAHmB,EAInB;AAAE,oBAAcC;AAAhB,KAJmB,EAKnBJ,SALmB,CAHvB;AAUE,IAAA,OAAO,EAAEK,OAVX;AAWE,IAAA,YAAY,EAAEC,YAXhB;AAYE,IAAA,YAAY,EAAEC,YAZhB;AAaE,IAAA,KAAK,EAAEC,KAbT;AAcE,IAAA,QAAQ,EAAEP,QAdZ;AAeE,mBAAaQ;AAff,KAiBGV,QAjBH,eAkBE,oBAAC,eAAD;AACE,IAAA,IAAI,EAAEN,MADR;AAEE,IAAA,SAAS,EAAC,0BAFZ;AAGE,IAAA,SAAS,EAAC;AAHZ,IAlBF,eAuBE,oBAAC,eAAD;AACE,IAAA,IAAI,EAAED,aADR;AAEE,IAAA,SAAS,EAAC;AAFZ,IAvBF,CADF;AA8BD,CA7CoB,CAAvB;AAgDAG,cAAc,CAACe,WAAf,GAA6B,gBAA7B;AAEAf,cAAc,CAACgB,YAAf,GAA8B;AAC5BZ,EAAAA,QAAQ,EAAEa,SADkB;AAE5BZ,EAAAA,SAAS,EAAE,EAFiB;AAG5BC,EAAAA,QAAQ,EAAE,KAHkB;AAI5BC,EAAAA,QAAQ,EAAE,KAJkB;AAK5BC,EAAAA,cAAc,EAAE,KALY;AAM5BC,EAAAA,SAAS,EAAE,KANiB;AAO5BC,EAAAA,OAAO,EAAEO,SAPmB;AAQ5BN,EAAAA,YAAY,EAAEM,SARc;AAS5BL,EAAAA,YAAY,EAAEK,SATc;AAU5BJ,EAAAA,KAAK,EAAEI,SAVqB;AAW5B,iBAAeA;AAXa,CAA9B;AAcA,eAAejB,cAAf","sourcesContent":["import React from 'react';\nimport classNames from 'classnames';\nimport { dhExclamation, vsLink } from '@deephaven/icons';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\n\nimport './SocketedButton.scss';\n\ntype SocketedButtonProps = {\n children?: React.ReactNode;\n className?: string;\n disabled?: boolean;\n isLinked?: boolean;\n isLinkedSource?: boolean;\n isInvalid?: boolean;\n onClick?: React.MouseEventHandler<HTMLButtonElement>;\n onMouseEnter?: React.MouseEventHandler<HTMLButtonElement>;\n onMouseLeave?: React.MouseEventHandler<HTMLButtonElement>;\n style?: React.CSSProperties;\n 'data-testid'?: string;\n};\n\nconst SocketedButton = React.forwardRef<HTMLButtonElement, SocketedButtonProps>(\n (props: SocketedButtonProps, ref) => {\n const {\n children,\n className,\n disabled,\n isLinked,\n isLinkedSource,\n isInvalid,\n onClick,\n onMouseEnter,\n onMouseLeave,\n style,\n 'data-testid': dataTestId,\n } = props;\n return (\n <button\n ref={ref}\n type=\"button\"\n className={classNames(\n 'btn-socketed',\n { 'btn-socketed-linked': isLinked || isLinkedSource },\n { 'btn-socketed-linked-source': isLinkedSource },\n { 'is-invalid': isInvalid },\n className\n )}\n onClick={onClick}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n style={style}\n disabled={disabled}\n data-testid={dataTestId}\n >\n {children}\n <FontAwesomeIcon\n icon={vsLink}\n className=\"linked btn-socketed-icon\"\n transform=\"down-1\"\n />\n <FontAwesomeIcon\n icon={dhExclamation}\n className=\"is-invalid btn-socketed-icon\"\n />\n </button>\n );\n }\n);\n\nSocketedButton.displayName = 'SocketedButton';\n\nSocketedButton.defaultProps = {\n children: undefined,\n className: '',\n disabled: false,\n isLinked: false,\n isLinkedSource: false,\n isInvalid: false,\n onClick: undefined,\n onMouseEnter: undefined,\n onMouseLeave: undefined,\n style: undefined,\n 'data-testid': undefined,\n};\n\nexport default SocketedButton;\n"],"file":"SocketedButton.js"}
1
+ {"version":3,"file":"SocketedButton.js","names":["React","classNames","dhExclamation","vsLink","FontAwesomeIcon","SocketedButton","forwardRef","props","ref","children","className","disabled","isLinked","isLinkedSource","isInvalid","onClick","onMouseEnter","onMouseLeave","style","dataTestId","displayName","defaultProps","undefined"],"sources":["../src/SocketedButton.tsx"],"sourcesContent":["import React from 'react';\nimport classNames from 'classnames';\nimport { dhExclamation, vsLink } from '@deephaven/icons';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\n\nimport './SocketedButton.scss';\n\ntype SocketedButtonProps = {\n children?: React.ReactNode;\n className?: string;\n disabled?: boolean;\n isLinked?: boolean;\n isLinkedSource?: boolean;\n isInvalid?: boolean;\n onClick?: React.MouseEventHandler<HTMLButtonElement>;\n onMouseEnter?: React.MouseEventHandler<HTMLButtonElement>;\n onMouseLeave?: React.MouseEventHandler<HTMLButtonElement>;\n style?: React.CSSProperties;\n 'data-testid'?: string;\n};\n\nconst SocketedButton = React.forwardRef<HTMLButtonElement, SocketedButtonProps>(\n (props: SocketedButtonProps, ref) => {\n const {\n children,\n className,\n disabled,\n isLinked,\n isLinkedSource,\n isInvalid,\n onClick,\n onMouseEnter,\n onMouseLeave,\n style,\n 'data-testid': dataTestId,\n } = props;\n return (\n <button\n ref={ref}\n type=\"button\"\n className={classNames(\n 'btn-socketed',\n { 'btn-socketed-linked': isLinked || isLinkedSource },\n { 'btn-socketed-linked-source': isLinkedSource },\n { 'is-invalid': isInvalid },\n className\n )}\n onClick={onClick}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n style={style}\n disabled={disabled}\n data-testid={dataTestId}\n >\n {children}\n <FontAwesomeIcon\n icon={vsLink}\n className=\"linked btn-socketed-icon\"\n transform=\"down-1\"\n />\n <FontAwesomeIcon\n icon={dhExclamation}\n className=\"is-invalid btn-socketed-icon\"\n />\n </button>\n );\n }\n);\n\nSocketedButton.displayName = 'SocketedButton';\n\nSocketedButton.defaultProps = {\n children: undefined,\n className: '',\n disabled: false,\n isLinked: false,\n isLinkedSource: false,\n isInvalid: false,\n onClick: undefined,\n onMouseEnter: undefined,\n onMouseLeave: undefined,\n style: undefined,\n 'data-testid': undefined,\n};\n\nexport default SocketedButton;\n"],"mappings":"AAAA,OAAOA,KAAP,MAAkB,OAAlB;AACA,OAAOC,UAAP,MAAuB,YAAvB;AACA,SAASC,aAAT,EAAwBC,MAAxB,QAAsC,kBAAtC;AACA,SAASC,eAAT,QAAgC,gCAAhC;;AAkBA,IAAMC,cAAc,gBAAGL,KAAK,CAACM,UAAN,CACrB,CAACC,KAAD,EAA6BC,GAA7B,KAAqC;EACnC,IAAM;IACJC,QADI;IAEJC,SAFI;IAGJC,QAHI;IAIJC,QAJI;IAKJC,cALI;IAMJC,SANI;IAOJC,OAPI;IAQJC,YARI;IASJC,YATI;IAUJC,KAVI;IAWJ,eAAeC;EAXX,IAYFZ,KAZJ;EAaA,oBACE;IACE,GAAG,EAAEC,GADP;IAEE,IAAI,EAAC,QAFP;IAGE,SAAS,EAAEP,UAAU,CACnB,cADmB,EAEnB;MAAE,uBAAuBW,QAAQ,IAAIC;IAArC,CAFmB,EAGnB;MAAE,8BAA8BA;IAAhC,CAHmB,EAInB;MAAE,cAAcC;IAAhB,CAJmB,EAKnBJ,SALmB,CAHvB;IAUE,OAAO,EAAEK,OAVX;IAWE,YAAY,EAAEC,YAXhB;IAYE,YAAY,EAAEC,YAZhB;IAaE,KAAK,EAAEC,KAbT;IAcE,QAAQ,EAAEP,QAdZ;IAeE,eAAaQ;EAff,GAiBGV,QAjBH,eAkBE,oBAAC,eAAD;IACE,IAAI,EAAEN,MADR;IAEE,SAAS,EAAC,0BAFZ;IAGE,SAAS,EAAC;EAHZ,EAlBF,eAuBE,oBAAC,eAAD;IACE,IAAI,EAAED,aADR;IAEE,SAAS,EAAC;EAFZ,EAvBF,CADF;AA8BD,CA7CoB,CAAvB;AAgDAG,cAAc,CAACe,WAAf,GAA6B,gBAA7B;AAEAf,cAAc,CAACgB,YAAf,GAA8B;EAC5BZ,QAAQ,EAAEa,SADkB;EAE5BZ,SAAS,EAAE,EAFiB;EAG5BC,QAAQ,EAAE,KAHkB;EAI5BC,QAAQ,EAAE,KAJkB;EAK5BC,cAAc,EAAE,KALY;EAM5BC,SAAS,EAAE,KANiB;EAO5BC,OAAO,EAAEO,SAPmB;EAQ5BN,YAAY,EAAEM,SARc;EAS5BL,YAAY,EAAEK,SATc;EAU5BJ,KAAK,EAAEI,SAVqB;EAW5B,eAAeA;AAXa,CAA9B;AAcA,eAAejB,cAAf"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/ThemeExport.ts"],"names":["ThemeExport","Object","freeze","transitionMs","transitionMidMs","transitionLongMs","transitionSlowMs"],"mappings":";;;;;;OAAOA,W,kCAEP;AACA;;AACA,eAAeC,MAAM,CAACC,MAAP;AACbC,EAAAA,YAAY,EAAE,GADD;AAEbC,EAAAA,eAAe,EAAE,GAFJ;AAGbC,EAAAA,gBAAgB,EAAE,GAHL;AAIbC,EAAAA,gBAAgB,EAAE;AAJL,GAKVN,WALU,EAAf","sourcesContent":["import ThemeExport from './ThemeExport.module.scss';\n\n// Note that TypeScript does not know what keys exist on ThemeExport.module.scss\n// It only knows it's an object with strings for keys and values\nexport default Object.freeze({\n transitionMs: 150,\n transitionMidMs: 200,\n transitionLongMs: 300,\n transitionSlowMs: 1000,\n ...ThemeExport,\n});\n"],"file":"ThemeExport.js"}
1
+ {"version":3,"file":"ThemeExport.js","names":["ThemeExport","Object","freeze","transitionMs","transitionMidMs","transitionLongMs","transitionSlowMs"],"sources":["../src/ThemeExport.ts"],"sourcesContent":["import ThemeExport from './ThemeExport.module.scss';\n\n// Note that TypeScript does not know what keys exist on ThemeExport.module.scss\n// It only knows it's an object with strings for keys and values\nexport default Object.freeze({\n transitionMs: 150,\n transitionMidMs: 200,\n transitionLongMs: 300,\n transitionSlowMs: 1000,\n ...ThemeExport,\n});\n"],"mappings":";;;;;;OAAOA,W,kCAEP;AACA;;AACA,eAAeC,MAAM,CAACC,MAAP;EACbC,YAAY,EAAE,GADD;EAEbC,eAAe,EAAE,GAFJ;EAGbC,gBAAgB,EAAE,GAHL;EAIbC,gBAAgB,EAAE;AAJL,GAKVN,WALU,EAAf"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/TimeInput.tsx"],"names":["React","useCallback","useEffect","useImperativeHandle","useRef","useState","Log","TimeUtils","MaskedInput","DEFAULT_GET_PREFERRED_REPLACEMENT_STRING","log","module","TIME_PATTERN","EXAMPLES","TimeInput","forwardRef","props","ref","allowValueWrapping","className","onChange","value","propsValue","onFocus","onBlur","onSelect","dataTestId","setValue","formatTime","selection","setSelection","inputRef","focus","current","newSelection","setFormattedTime","getNextSegmentValue","range","delta","segmentValue","maxValue","selectionStart","newSegmentValue","parseInt","Number","isNaN","Math","min","max","padStart","getPreferredReplacementString","replaceValue","replaceIndex","newChar","selectionEnd","substring","handleChange","newValue","debug","isTimeString","parseTime","handleSelect","defaultProps","undefined"],"mappings":"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","sourcesContent":["import React, {\n useCallback,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n} from 'react';\nimport Log from '@deephaven/log';\nimport { TimeUtils } from '@deephaven/utils';\nimport MaskedInput, {\n DEFAULT_GET_PREFERRED_REPLACEMENT_STRING,\n SelectionSegment,\n} from './MaskedInput';\n\nexport type { SelectionSegment } from './MaskedInput';\n\nconst log = Log.module('TimeInput');\n\nconst TIME_PATTERN = '([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]';\nconst EXAMPLES = ['00:00:00', '12:34:56', '23:59:59'];\n\ntype TimeInputProps = {\n allowValueWrapping?: boolean;\n className?: string;\n onChange?(timeInSec: number): void;\n onSelect?(selection: SelectionSegment): void;\n value?: number;\n onFocus?(): void;\n onBlur?(): void;\n 'data-testid'?: string;\n};\n\nexport type TimeInputElement = {\n focus: () => void;\n setSelection: (newSelection: SelectionSegment) => void;\n};\n\n// Forward ref causes a false positive for display-name in eslint:\n// https://github.com/yannickcr/eslint-plugin-react/issues/2269\n// eslint-disable-next-line react/display-name\nconst TimeInput = React.forwardRef<TimeInputElement, TimeInputProps>(\n (props: TimeInputProps, ref) => {\n const {\n allowValueWrapping = true,\n className = '',\n onChange = () => false,\n value: propsValue = 0,\n onFocus = () => false,\n onBlur = () => false,\n onSelect = () => false,\n 'data-testid': dataTestId,\n } = props;\n const [value, setValue] = useState(TimeUtils.formatTime(propsValue));\n const [selection, setSelection] = useState<SelectionSegment>();\n const inputRef = useRef<HTMLInputElement>(null);\n\n useImperativeHandle(\n ref,\n () => ({\n focus: () => {\n inputRef.current?.focus();\n },\n setSelection: newSelection => {\n inputRef.current?.focus();\n setSelection(newSelection);\n },\n }),\n []\n );\n\n useEffect(\n function setFormattedTime() {\n setValue(TimeUtils.formatTime(propsValue));\n },\n [propsValue]\n );\n\n function getNextSegmentValue(\n range: SelectionSegment,\n delta: number,\n segmentValue: string\n ): string {\n // Delta is backward because negative Y is up\n const maxValue = range.selectionStart === 0 ? 24 : 60;\n let newSegmentValue = parseInt(segmentValue, 10) - delta;\n if (Number.isNaN(newSegmentValue)) {\n newSegmentValue = 0;\n } else if (allowValueWrapping) {\n // Add max value and re-mod so we don't get negative values after mod\n newSegmentValue = ((newSegmentValue % maxValue) + maxValue) % maxValue;\n } else {\n newSegmentValue = Math.min(Math.max(0, newSegmentValue), maxValue - 1);\n }\n return `${newSegmentValue}`.padStart(2, '0');\n }\n\n function getPreferredReplacementString(\n replaceValue: string,\n replaceIndex: number,\n newChar: string,\n selectionStart: number,\n selectionEnd: number\n ) {\n if (\n selectionStart === 0 &&\n selectionEnd === 2 &&\n replaceIndex === 1 &&\n parseInt(newChar, 10) > 1\n ) {\n // DH-10082 Special case for when typing `3` when it's already 12\n return `0${newChar}${replaceValue.substring(2)}`;\n }\n return DEFAULT_GET_PREFERRED_REPLACEMENT_STRING(\n replaceValue,\n replaceIndex,\n newChar\n );\n }\n\n function handleChange(newValue: string): void {\n log.debug('handleChange', newValue);\n setValue(newValue);\n\n // Only send a change if the value is actually valid\n if (TimeUtils.isTimeString(newValue)) {\n onChange(TimeUtils.parseTime(newValue));\n }\n }\n\n const handleSelect = useCallback(\n (newSelection: SelectionSegment) => {\n setSelection(newSelection);\n onSelect(newSelection);\n },\n [onSelect]\n );\n\n return (\n <MaskedInput\n ref={inputRef}\n className={className}\n example={EXAMPLES}\n getNextSegmentValue={getNextSegmentValue}\n getPreferredReplacementString={getPreferredReplacementString}\n onChange={handleChange}\n onSelect={handleSelect}\n pattern={TIME_PATTERN}\n selection={selection}\n value={value}\n onFocus={onFocus}\n onBlur={onBlur}\n data-testid={dataTestId}\n />\n );\n }\n);\n\nTimeInput.defaultProps = {\n allowValueWrapping: true,\n className: '',\n onChange: () => false,\n onSelect: () => false,\n value: 0,\n onFocus: () => false,\n onBlur: () => false,\n 'data-testid': undefined,\n};\n\nexport default TimeInput;\n"],"file":"TimeInput.js"}
1
+ {"version":3,"file":"TimeInput.js","names":["React","useCallback","useEffect","useImperativeHandle","useRef","useState","Log","TimeUtils","MaskedInput","DEFAULT_GET_PREFERRED_REPLACEMENT_STRING","log","module","TIME_PATTERN","EXAMPLES","TimeInput","forwardRef","props","ref","allowValueWrapping","className","onChange","value","propsValue","onFocus","onBlur","onSelect","dataTestId","setValue","formatTime","selection","setSelection","inputRef","focus","current","newSelection","setFormattedTime","getNextSegmentValue","range","delta","segmentValue","maxValue","selectionStart","newSegmentValue","parseInt","Number","isNaN","Math","min","max","padStart","getPreferredReplacementString","replaceValue","replaceIndex","newChar","selectionEnd","substring","handleChange","newValue","debug","isTimeString","parseTime","handleSelect","defaultProps","undefined"],"sources":["../src/TimeInput.tsx"],"sourcesContent":["import React, {\n useCallback,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n} from 'react';\nimport Log from '@deephaven/log';\nimport { TimeUtils } from '@deephaven/utils';\nimport MaskedInput, {\n DEFAULT_GET_PREFERRED_REPLACEMENT_STRING,\n SelectionSegment,\n} from './MaskedInput';\n\nexport type { SelectionSegment } from './MaskedInput';\n\nconst log = Log.module('TimeInput');\n\nconst TIME_PATTERN = '([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]';\nconst EXAMPLES = ['00:00:00', '12:34:56', '23:59:59'];\n\ntype TimeInputProps = {\n allowValueWrapping?: boolean;\n className?: string;\n onChange?(timeInSec: number): void;\n onSelect?(selection: SelectionSegment): void;\n value?: number;\n onFocus?(): void;\n onBlur?(): void;\n 'data-testid'?: string;\n};\n\nexport type TimeInputElement = {\n focus: () => void;\n setSelection: (newSelection: SelectionSegment) => void;\n};\n\n// Forward ref causes a false positive for display-name in eslint:\n// https://github.com/yannickcr/eslint-plugin-react/issues/2269\n// eslint-disable-next-line react/display-name\nconst TimeInput = React.forwardRef<TimeInputElement, TimeInputProps>(\n (props: TimeInputProps, ref) => {\n const {\n allowValueWrapping = true,\n className = '',\n onChange = () => false,\n value: propsValue = 0,\n onFocus = () => false,\n onBlur = () => false,\n onSelect = () => false,\n 'data-testid': dataTestId,\n } = props;\n const [value, setValue] = useState(TimeUtils.formatTime(propsValue));\n const [selection, setSelection] = useState<SelectionSegment>();\n const inputRef = useRef<HTMLInputElement>(null);\n\n useImperativeHandle(\n ref,\n () => ({\n focus: () => {\n inputRef.current?.focus();\n },\n setSelection: newSelection => {\n inputRef.current?.focus();\n setSelection(newSelection);\n },\n }),\n []\n );\n\n useEffect(\n function setFormattedTime() {\n setValue(TimeUtils.formatTime(propsValue));\n },\n [propsValue]\n );\n\n function getNextSegmentValue(\n range: SelectionSegment,\n delta: number,\n segmentValue: string\n ): string {\n // Delta is backward because negative Y is up\n const maxValue = range.selectionStart === 0 ? 24 : 60;\n let newSegmentValue = parseInt(segmentValue, 10) - delta;\n if (Number.isNaN(newSegmentValue)) {\n newSegmentValue = 0;\n } else if (allowValueWrapping) {\n // Add max value and re-mod so we don't get negative values after mod\n newSegmentValue = ((newSegmentValue % maxValue) + maxValue) % maxValue;\n } else {\n newSegmentValue = Math.min(Math.max(0, newSegmentValue), maxValue - 1);\n }\n return `${newSegmentValue}`.padStart(2, '0');\n }\n\n function getPreferredReplacementString(\n replaceValue: string,\n replaceIndex: number,\n newChar: string,\n selectionStart: number,\n selectionEnd: number\n ) {\n if (\n selectionStart === 0 &&\n selectionEnd === 2 &&\n replaceIndex === 1 &&\n parseInt(newChar, 10) > 1\n ) {\n // DH-10082 Special case for when typing `3` when it's already 12\n return `0${newChar}${replaceValue.substring(2)}`;\n }\n return DEFAULT_GET_PREFERRED_REPLACEMENT_STRING(\n replaceValue,\n replaceIndex,\n newChar\n );\n }\n\n function handleChange(newValue: string): void {\n log.debug('handleChange', newValue);\n setValue(newValue);\n\n // Only send a change if the value is actually valid\n if (TimeUtils.isTimeString(newValue)) {\n onChange(TimeUtils.parseTime(newValue));\n }\n }\n\n const handleSelect = useCallback(\n (newSelection: SelectionSegment) => {\n setSelection(newSelection);\n onSelect(newSelection);\n },\n [onSelect]\n );\n\n return (\n <MaskedInput\n ref={inputRef}\n className={className}\n example={EXAMPLES}\n getNextSegmentValue={getNextSegmentValue}\n getPreferredReplacementString={getPreferredReplacementString}\n onChange={handleChange}\n onSelect={handleSelect}\n pattern={TIME_PATTERN}\n selection={selection}\n value={value}\n onFocus={onFocus}\n onBlur={onBlur}\n data-testid={dataTestId}\n />\n );\n }\n);\n\nTimeInput.defaultProps = {\n allowValueWrapping: true,\n className: '',\n onChange: () => false,\n onSelect: () => false,\n value: 0,\n onFocus: () => false,\n onBlur: () => false,\n 'data-testid': undefined,\n};\n\nexport default TimeInput;\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/TimeSlider.tsx"],"names":["React","useCallback","useMemo","useRef","useState","useEffect","classNames","TimeInput","StyleExports","HANDLE_SIZE","parseInt","POPOVER_WIDTH","SECONDS_IN_DAY","SNAP_NEAREST_MINUTES","TimeSlider","startTime","propStartTime","endTime","propEndTime","onChange","isStartModified","isEndModified","dataTestId","setStartTime","setEndTime","track","setTimeOnPropTimeChange","updateTime","newStartTime","newEndTime","start","end","handleStartTimeChange","handleEndTimeChange","Array","fill","map","value","index","PopOvers","props","onStartTimeChange","onEndTimeChange","swapTimes","firstTime","setFirstTime","secondTime","setSecondTime","firstTimeRef","secondTimeRef","firstTimeSelectionRef","secondTimeSelectionRef","setFocusOnSwapTimesChange","current","setSelection","onFirstTimeChange","onSecondTimeChange","onFirstTimeSelect","selection","onSecondTimeSelect","flexBasis","modified","undefined","TrackFills","transform","Handle","time","setTime","ONE_HOUR","handleOffset","calculatePositionAsTime","clientX","trackRect","getBoundingClientRect","leftEdge","Math","max","left","preciseTime","min","width","roundedTime","round","limitMax","handleMouseMove","handleMouseUp","window","removeEventListener","document","documentElement","classList","remove","startDragListening","addEventListener","add","stopDragListening","handleMouseDown","removeListenersOnUnmount"],"mappings":"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","sourcesContent":["/* eslint-disable react/no-array-index-key */\n// array maps being used are static, this is fine.\n\nimport React, {\n useCallback,\n useMemo,\n useRef,\n useState,\n useEffect,\n} from 'react';\nimport classNames from 'classnames';\nimport TimeInput, { SelectionSegment, TimeInputElement } from './TimeInput';\nimport StyleExports from './TimeSlider.module.scss';\nimport './TimeSlider.scss';\n\nconst HANDLE_SIZE = parseInt(StyleExports['handle-size'], 10);\nconst POPOVER_WIDTH = parseInt(StyleExports['popover-width'], 10);\nconst SECONDS_IN_DAY = 24 * 60 * 60 - 1; // Max is actually 23:59:59\nconst SNAP_NEAREST_MINUTES = 5 * 60; // rounds in 5 minute intervals\n\ntype TimeSliderProps = {\n startTime: number;\n endTime: number;\n onChange(value: { startTime: number; endTime: number }): void;\n isStartModified?: boolean;\n isEndModified?: boolean;\n 'data-testid'?: string;\n};\n\n/**\n * Creates a time slider for setting a start and end time, that can also run overnight\n * @param props takes times in seconds 0 - 86399 and a callback\n */\nconst TimeSlider = ({\n startTime: propStartTime,\n endTime: propEndTime,\n onChange,\n isStartModified = false,\n isEndModified = false,\n 'data-testid': dataTestId,\n}: TimeSliderProps): JSX.Element => {\n const [startTime, setStartTime] = useState(propStartTime);\n const [endTime, setEndTime] = useState(propEndTime);\n\n const track = useRef<HTMLDivElement>(null); // we need the track width while calulculating time from handle drag\n\n // updates state if props change\n useEffect(\n function setTimeOnPropTimeChange() {\n setStartTime(propStartTime);\n setEndTime(propEndTime);\n },\n [propStartTime, propEndTime]\n );\n\n const updateTime = useCallback(\n (newStartTime: number, newEndTime: number) => {\n let start = newStartTime;\n let end = newEndTime;\n if (start === end) {\n if (end < SECONDS_IN_DAY) {\n end += 1;\n } else {\n start -= 1;\n }\n }\n\n setStartTime(start);\n setEndTime(end);\n onChange({ startTime: start, endTime: end });\n },\n [setStartTime, setEndTime, onChange]\n );\n\n const handleStartTimeChange = useCallback(\n (newStartTime: number) => {\n updateTime(newStartTime, endTime);\n },\n [updateTime, endTime]\n );\n\n const handleEndTimeChange = useCallback(\n (newEndTime: number) => {\n updateTime(startTime, newEndTime);\n },\n [updateTime, startTime]\n );\n\n return (\n <div className=\"time-slider\" data-testid={dataTestId}>\n <PopOvers\n startTime={startTime}\n endTime={endTime}\n onStartTimeChange={handleStartTimeChange}\n onEndTimeChange={handleEndTimeChange}\n isStartModified={isStartModified}\n isEndModified={isEndModified}\n />\n <div className=\"track\" ref={track}>\n <TrackFills startTime={startTime} endTime={endTime} />\n <div className=\"ticks\">\n {Array(24)\n .fill(null)\n .map((value, index) => (\n <div className=\"tick\" key={index} />\n ))}\n </div>\n <Handle\n track={track}\n time={startTime}\n setTime={handleStartTimeChange}\n />\n <Handle track={track} time={endTime} setTime={handleEndTimeChange} />\n </div>\n\n <div className=\"tick-labels\">\n <div className=\"tick-label\">0:00</div>\n <div className=\"tick-label-wrapper\">\n {Array(24)\n .fill(null)\n .map((value, index) => (\n <div className=\"tick-label\" key={index}>{`${index + 1}:00`}</div>\n ))}\n </div>\n </div>\n </div>\n );\n};\n\ntype PopOversProps = {\n startTime: number;\n endTime: number;\n onStartTimeChange(time: number): void;\n onEndTimeChange(time: number): void;\n isStartModified: boolean;\n isEndModified: boolean;\n 'data-testid'?: string;\n};\n\nconst PopOvers = (props: PopOversProps): JSX.Element => {\n const {\n startTime,\n endTime,\n onStartTimeChange,\n onEndTimeChange,\n isStartModified,\n isEndModified,\n 'data-testid': dataTestId,\n } = props;\n\n const swapTimes = startTime > endTime;\n\n const [firstTime, setFirstTime] = useState(swapTimes ? endTime : startTime);\n const [secondTime, setSecondTime] = useState(swapTimes ? startTime : endTime);\n const firstTimeRef = useRef<TimeInputElement>(null);\n const secondTimeRef = useRef<TimeInputElement>(null);\n // Keep track of selection in both time inputs\n const firstTimeSelectionRef = useRef<SelectionSegment | null>(null);\n const secondTimeSelectionRef = useRef<SelectionSegment | null>(null);\n\n useEffect(\n function setTimeOnPropTimeChange() {\n setFirstTime(startTime > endTime ? endTime : startTime);\n setSecondTime(startTime > endTime ? startTime : endTime);\n },\n [startTime, endTime]\n );\n\n useEffect(\n function setFocusOnSwapTimesChange() {\n if (firstTimeSelectionRef.current !== null) {\n secondTimeRef.current?.setSelection(firstTimeSelectionRef.current);\n }\n if (secondTimeSelectionRef.current !== null) {\n firstTimeRef.current?.setSelection(secondTimeSelectionRef.current);\n }\n },\n [swapTimes]\n );\n\n function onFirstTimeChange(value: number) {\n if (startTime <= endTime) {\n onStartTimeChange(value);\n } else {\n onEndTimeChange(value);\n }\n }\n\n function onSecondTimeChange(value: number) {\n if (startTime <= endTime) {\n onEndTimeChange(value);\n } else {\n onStartTimeChange(value);\n }\n }\n\n const onFirstTimeSelect = useCallback(selection => {\n firstTimeSelectionRef.current = selection;\n secondTimeSelectionRef.current = null;\n }, []);\n\n const onSecondTimeSelect = useCallback(selection => {\n firstTimeSelectionRef.current = null;\n secondTimeSelectionRef.current = selection;\n }, []);\n\n return (\n <div className=\"time-slider-popovers\">\n <div\n className=\"flex\"\n style={{\n flexBasis: `calc(${(firstTime / SECONDS_IN_DAY) * 100}% - ${\n POPOVER_WIDTH / 2\n }px)`,\n }}\n />\n <div className=\"handle-popper\">\n <label\n className={classNames({\n modified: swapTimes ? isEndModified : isStartModified,\n })}\n >\n {swapTimes ? 'End Time' : 'Start Time'}\n </label>\n <TimeInput\n ref={firstTimeRef}\n allowValueWrapping={false}\n value={firstTime}\n onChange={onFirstTimeChange}\n onSelect={onFirstTimeSelect}\n data-testid={dataTestId ? `${dataTestId}-input-1` : undefined}\n />\n </div>\n <div className=\"flex-spacer\" />\n <div className=\"handle-popper\">\n <label\n className={classNames({\n modified: swapTimes ? isStartModified : isEndModified,\n })}\n >\n {swapTimes ? 'Start Time' : 'End Time'}\n </label>\n <TimeInput\n ref={secondTimeRef}\n allowValueWrapping={false}\n value={secondTime}\n onChange={onSecondTimeChange}\n onSelect={onSecondTimeSelect}\n data-testid={dataTestId ? `${dataTestId}-input-2` : undefined}\n />\n </div>\n <div\n className=\"flex\"\n style={{\n flexBasis: `calc(${\n ((SECONDS_IN_DAY - secondTime) / SECONDS_IN_DAY) * 100\n }% - ${POPOVER_WIDTH / 2}px)`,\n }}\n />\n </div>\n );\n};\n\ntype TrackFillsProps = {\n startTime: number;\n endTime: number;\n 'data-testid'?: string;\n};\n\n/**\n * Shades the area between or outside of handles according to if start or endtime is greater.\n */\nconst TrackFills = (props: TrackFillsProps): JSX.Element => {\n const { startTime, endTime, 'data-testid': dataTestId } = props;\n return (\n <div className=\"track-fills\" data-testid={dataTestId}>\n {startTime > endTime && (\n <>\n <div\n className=\"track-fill track-fill-start\"\n style={{ transform: `scaleX(${endTime / SECONDS_IN_DAY})` }}\n />\n <div\n className=\"track-fill track-fill-end\"\n style={{\n transform: `scaleX(${\n (SECONDS_IN_DAY - startTime) / SECONDS_IN_DAY\n })`,\n }}\n />\n </>\n )}\n {startTime < endTime && (\n <div\n className=\"track-fill track-fill-middle\"\n style={{\n transform: `translateX(${\n (startTime / SECONDS_IN_DAY) * 100\n }%) scaleX(${(endTime - startTime) / SECONDS_IN_DAY})`,\n }}\n />\n )}\n </div>\n );\n};\n\ntype HandleProps = {\n track: React.RefObject<HTMLDivElement>;\n time: number;\n setTime(time: number): void;\n 'data-testid'?: string;\n};\n\n/**\n * Creates a draggable handle the sets the time\n */\nconst Handle = (props: HandleProps): JSX.Element => {\n const { track, time, setTime, 'data-testid': dataTestId } = props;\n\n /**\n * Takes the time and generate our translation string taking into account handle offset.\n * The handle offset changes for the first and last tick range dynmaically. Normally,\n * the center of the handle (size/2) is the selection origin, but at edges, it becomes either\n * end of the handle, requireing a relative offset range of 0 - 0.5, and 0.5 - 1 of handle size.\n * @param t time in seconds\n */\n const transform = useMemo(() => {\n const ONE_HOUR = 60 * 60;\n let handleOffset = HANDLE_SIZE / 2;\n if (time < ONE_HOUR) {\n handleOffset = (time / ONE_HOUR) * (HANDLE_SIZE / 2); // 0 - 0.5 Handle size\n } else if (time > 23 * ONE_HOUR) {\n handleOffset =\n HANDLE_SIZE / 2 +\n (1 / (SECONDS_IN_DAY - 23 * ONE_HOUR)) *\n (time - 23 * ONE_HOUR) *\n (HANDLE_SIZE / 2); // 0.5 - 1 Handle size\n }\n return `translateX(calc(${\n (time / SECONDS_IN_DAY) * 100\n }% - ${handleOffset}px))`;\n }, [time]);\n\n const calculatePositionAsTime = useCallback(\n (clientX: number) => {\n if (!track.current) {\n return 0;\n }\n const trackRect = track.current.getBoundingClientRect();\n const leftEdge = Math.max(clientX - trackRect.left, 0);\n // get position as 0-1 on slider and mulitply by seconds in a day to convert to time\n const preciseTime =\n SECONDS_IN_DAY * Math.min(1, leftEdge / trackRect.width);\n // snap to nearest N(5) minute interval\n const roundedTime =\n SNAP_NEAREST_MINUTES * Math.round(preciseTime / SNAP_NEAREST_MINUTES);\n // prevent over-rounding to 24:00:00\n const limitMax = Math.min(SECONDS_IN_DAY, roundedTime);\n return limitMax;\n },\n [track]\n );\n\n const handleMouseMove = useCallback(\n ({ clientX }: MouseEvent) => {\n setTime(calculatePositionAsTime(clientX));\n },\n [setTime, calculatePositionAsTime]\n );\n\n const handleMouseUp = useCallback(\n ({ clientX }: MouseEvent) => {\n setTime(calculatePositionAsTime(clientX));\n\n window.removeEventListener('mousemove', handleMouseMove);\n window.removeEventListener('mouseup', handleMouseUp);\n document.documentElement.classList.remove('drag-pointer-events-none');\n },\n [setTime, calculatePositionAsTime, handleMouseMove]\n );\n\n const startDragListening = useCallback(() => {\n window.addEventListener('mousemove', handleMouseMove);\n window.addEventListener('mouseup', handleMouseUp);\n document.documentElement.classList.add('drag-pointer-events-none');\n }, [handleMouseMove, handleMouseUp]);\n\n const stopDragListening = useCallback(() => {\n window.removeEventListener('mousemove', handleMouseMove);\n window.removeEventListener('mouseup', handleMouseUp);\n document.documentElement.classList.remove('drag-pointer-events-none');\n }, [handleMouseMove, handleMouseUp]);\n\n const handleMouseDown = useCallback(() => {\n startDragListening();\n }, [startDragListening]);\n\n useEffect(\n function removeListenersOnUnmount() {\n return () => {\n stopDragListening();\n };\n },\n [stopDragListening]\n );\n\n return (\n <div className=\"handle-track\" style={{ transform }}>\n <button\n className=\"handle\"\n type=\"button\"\n aria-label=\"Change time\"\n onMouseDown={handleMouseDown}\n data-testid={dataTestId}\n />\n </div>\n );\n};\n\nexport default TimeSlider;\n"],"file":"TimeSlider.js"}
1
+ {"version":3,"file":"TimeSlider.js","names":["React","useCallback","useMemo","useRef","useState","useEffect","classNames","TimeInput","StyleExports","HANDLE_SIZE","parseInt","POPOVER_WIDTH","SECONDS_IN_DAY","SNAP_NEAREST_MINUTES","TimeSlider","startTime","propStartTime","endTime","propEndTime","onChange","isStartModified","isEndModified","dataTestId","setStartTime","setEndTime","track","setTimeOnPropTimeChange","updateTime","newStartTime","newEndTime","start","end","handleStartTimeChange","handleEndTimeChange","Array","fill","map","value","index","PopOvers","props","onStartTimeChange","onEndTimeChange","swapTimes","firstTime","setFirstTime","secondTime","setSecondTime","firstTimeRef","secondTimeRef","firstTimeSelectionRef","secondTimeSelectionRef","setFocusOnSwapTimesChange","current","setSelection","onFirstTimeChange","onSecondTimeChange","onFirstTimeSelect","selection","onSecondTimeSelect","flexBasis","modified","undefined","TrackFills","transform","Handle","time","setTime","ONE_HOUR","handleOffset","calculatePositionAsTime","clientX","trackRect","getBoundingClientRect","leftEdge","Math","max","left","preciseTime","min","width","roundedTime","round","limitMax","handleMouseMove","handleMouseUp","window","removeEventListener","document","documentElement","classList","remove","startDragListening","addEventListener","add","stopDragListening","handleMouseDown","removeListenersOnUnmount"],"sources":["../src/TimeSlider.tsx"],"sourcesContent":["/* eslint-disable react/no-array-index-key */\n// array maps being used are static, this is fine.\n\nimport React, {\n useCallback,\n useMemo,\n useRef,\n useState,\n useEffect,\n} from 'react';\nimport classNames from 'classnames';\nimport TimeInput, { SelectionSegment, TimeInputElement } from './TimeInput';\nimport StyleExports from './TimeSlider.module.scss';\nimport './TimeSlider.scss';\n\nconst HANDLE_SIZE = parseInt(StyleExports['handle-size'], 10);\nconst POPOVER_WIDTH = parseInt(StyleExports['popover-width'], 10);\nconst SECONDS_IN_DAY = 24 * 60 * 60 - 1; // Max is actually 23:59:59\nconst SNAP_NEAREST_MINUTES = 5 * 60; // rounds in 5 minute intervals\n\ntype TimeSliderProps = {\n startTime: number;\n endTime: number;\n onChange(value: { startTime: number; endTime: number }): void;\n isStartModified?: boolean;\n isEndModified?: boolean;\n 'data-testid'?: string;\n};\n\n/**\n * Creates a time slider for setting a start and end time, that can also run overnight\n * @param props takes times in seconds 0 - 86399 and a callback\n */\nconst TimeSlider = ({\n startTime: propStartTime,\n endTime: propEndTime,\n onChange,\n isStartModified = false,\n isEndModified = false,\n 'data-testid': dataTestId,\n}: TimeSliderProps): JSX.Element => {\n const [startTime, setStartTime] = useState(propStartTime);\n const [endTime, setEndTime] = useState(propEndTime);\n\n const track = useRef<HTMLDivElement>(null); // we need the track width while calulculating time from handle drag\n\n // updates state if props change\n useEffect(\n function setTimeOnPropTimeChange() {\n setStartTime(propStartTime);\n setEndTime(propEndTime);\n },\n [propStartTime, propEndTime]\n );\n\n const updateTime = useCallback(\n (newStartTime: number, newEndTime: number) => {\n let start = newStartTime;\n let end = newEndTime;\n if (start === end) {\n if (end < SECONDS_IN_DAY) {\n end += 1;\n } else {\n start -= 1;\n }\n }\n\n setStartTime(start);\n setEndTime(end);\n onChange({ startTime: start, endTime: end });\n },\n [setStartTime, setEndTime, onChange]\n );\n\n const handleStartTimeChange = useCallback(\n (newStartTime: number) => {\n updateTime(newStartTime, endTime);\n },\n [updateTime, endTime]\n );\n\n const handleEndTimeChange = useCallback(\n (newEndTime: number) => {\n updateTime(startTime, newEndTime);\n },\n [updateTime, startTime]\n );\n\n return (\n <div className=\"time-slider\" data-testid={dataTestId}>\n <PopOvers\n startTime={startTime}\n endTime={endTime}\n onStartTimeChange={handleStartTimeChange}\n onEndTimeChange={handleEndTimeChange}\n isStartModified={isStartModified}\n isEndModified={isEndModified}\n />\n <div className=\"track\" ref={track}>\n <TrackFills startTime={startTime} endTime={endTime} />\n <div className=\"ticks\">\n {Array(24)\n .fill(null)\n .map((value, index) => (\n <div className=\"tick\" key={index} />\n ))}\n </div>\n <Handle\n track={track}\n time={startTime}\n setTime={handleStartTimeChange}\n />\n <Handle track={track} time={endTime} setTime={handleEndTimeChange} />\n </div>\n\n <div className=\"tick-labels\">\n <div className=\"tick-label\">0:00</div>\n <div className=\"tick-label-wrapper\">\n {Array(24)\n .fill(null)\n .map((value, index) => (\n <div className=\"tick-label\" key={index}>{`${index + 1}:00`}</div>\n ))}\n </div>\n </div>\n </div>\n );\n};\n\ntype PopOversProps = {\n startTime: number;\n endTime: number;\n onStartTimeChange(time: number): void;\n onEndTimeChange(time: number): void;\n isStartModified: boolean;\n isEndModified: boolean;\n 'data-testid'?: string;\n};\n\nconst PopOvers = (props: PopOversProps): JSX.Element => {\n const {\n startTime,\n endTime,\n onStartTimeChange,\n onEndTimeChange,\n isStartModified,\n isEndModified,\n 'data-testid': dataTestId,\n } = props;\n\n const swapTimes = startTime > endTime;\n\n const [firstTime, setFirstTime] = useState(swapTimes ? endTime : startTime);\n const [secondTime, setSecondTime] = useState(swapTimes ? startTime : endTime);\n const firstTimeRef = useRef<TimeInputElement>(null);\n const secondTimeRef = useRef<TimeInputElement>(null);\n // Keep track of selection in both time inputs\n const firstTimeSelectionRef = useRef<SelectionSegment | null>(null);\n const secondTimeSelectionRef = useRef<SelectionSegment | null>(null);\n\n useEffect(\n function setTimeOnPropTimeChange() {\n setFirstTime(startTime > endTime ? endTime : startTime);\n setSecondTime(startTime > endTime ? startTime : endTime);\n },\n [startTime, endTime]\n );\n\n useEffect(\n function setFocusOnSwapTimesChange() {\n if (firstTimeSelectionRef.current !== null) {\n secondTimeRef.current?.setSelection(firstTimeSelectionRef.current);\n }\n if (secondTimeSelectionRef.current !== null) {\n firstTimeRef.current?.setSelection(secondTimeSelectionRef.current);\n }\n },\n [swapTimes]\n );\n\n function onFirstTimeChange(value: number) {\n if (startTime <= endTime) {\n onStartTimeChange(value);\n } else {\n onEndTimeChange(value);\n }\n }\n\n function onSecondTimeChange(value: number) {\n if (startTime <= endTime) {\n onEndTimeChange(value);\n } else {\n onStartTimeChange(value);\n }\n }\n\n const onFirstTimeSelect = useCallback(selection => {\n firstTimeSelectionRef.current = selection;\n secondTimeSelectionRef.current = null;\n }, []);\n\n const onSecondTimeSelect = useCallback(selection => {\n firstTimeSelectionRef.current = null;\n secondTimeSelectionRef.current = selection;\n }, []);\n\n return (\n <div className=\"time-slider-popovers\">\n <div\n className=\"flex\"\n style={{\n flexBasis: `calc(${(firstTime / SECONDS_IN_DAY) * 100}% - ${\n POPOVER_WIDTH / 2\n }px)`,\n }}\n />\n <div className=\"handle-popper\">\n <label\n className={classNames({\n modified: swapTimes ? isEndModified : isStartModified,\n })}\n >\n {swapTimes ? 'End Time' : 'Start Time'}\n </label>\n <TimeInput\n ref={firstTimeRef}\n allowValueWrapping={false}\n value={firstTime}\n onChange={onFirstTimeChange}\n onSelect={onFirstTimeSelect}\n data-testid={dataTestId ? `${dataTestId}-input-1` : undefined}\n />\n </div>\n <div className=\"flex-spacer\" />\n <div className=\"handle-popper\">\n <label\n className={classNames({\n modified: swapTimes ? isStartModified : isEndModified,\n })}\n >\n {swapTimes ? 'Start Time' : 'End Time'}\n </label>\n <TimeInput\n ref={secondTimeRef}\n allowValueWrapping={false}\n value={secondTime}\n onChange={onSecondTimeChange}\n onSelect={onSecondTimeSelect}\n data-testid={dataTestId ? `${dataTestId}-input-2` : undefined}\n />\n </div>\n <div\n className=\"flex\"\n style={{\n flexBasis: `calc(${\n ((SECONDS_IN_DAY - secondTime) / SECONDS_IN_DAY) * 100\n }% - ${POPOVER_WIDTH / 2}px)`,\n }}\n />\n </div>\n );\n};\n\ntype TrackFillsProps = {\n startTime: number;\n endTime: number;\n 'data-testid'?: string;\n};\n\n/**\n * Shades the area between or outside of handles according to if start or endtime is greater.\n */\nconst TrackFills = (props: TrackFillsProps): JSX.Element => {\n const { startTime, endTime, 'data-testid': dataTestId } = props;\n return (\n <div className=\"track-fills\" data-testid={dataTestId}>\n {startTime > endTime && (\n <>\n <div\n className=\"track-fill track-fill-start\"\n style={{ transform: `scaleX(${endTime / SECONDS_IN_DAY})` }}\n />\n <div\n className=\"track-fill track-fill-end\"\n style={{\n transform: `scaleX(${\n (SECONDS_IN_DAY - startTime) / SECONDS_IN_DAY\n })`,\n }}\n />\n </>\n )}\n {startTime < endTime && (\n <div\n className=\"track-fill track-fill-middle\"\n style={{\n transform: `translateX(${\n (startTime / SECONDS_IN_DAY) * 100\n }%) scaleX(${(endTime - startTime) / SECONDS_IN_DAY})`,\n }}\n />\n )}\n </div>\n );\n};\n\ntype HandleProps = {\n track: React.RefObject<HTMLDivElement>;\n time: number;\n setTime(time: number): void;\n 'data-testid'?: string;\n};\n\n/**\n * Creates a draggable handle the sets the time\n */\nconst Handle = (props: HandleProps): JSX.Element => {\n const { track, time, setTime, 'data-testid': dataTestId } = props;\n\n /**\n * Takes the time and generate our translation string taking into account handle offset.\n * The handle offset changes for the first and last tick range dynmaically. Normally,\n * the center of the handle (size/2) is the selection origin, but at edges, it becomes either\n * end of the handle, requireing a relative offset range of 0 - 0.5, and 0.5 - 1 of handle size.\n * @param t time in seconds\n */\n const transform = useMemo(() => {\n const ONE_HOUR = 60 * 60;\n let handleOffset = HANDLE_SIZE / 2;\n if (time < ONE_HOUR) {\n handleOffset = (time / ONE_HOUR) * (HANDLE_SIZE / 2); // 0 - 0.5 Handle size\n } else if (time > 23 * ONE_HOUR) {\n handleOffset =\n HANDLE_SIZE / 2 +\n (1 / (SECONDS_IN_DAY - 23 * ONE_HOUR)) *\n (time - 23 * ONE_HOUR) *\n (HANDLE_SIZE / 2); // 0.5 - 1 Handle size\n }\n return `translateX(calc(${\n (time / SECONDS_IN_DAY) * 100\n }% - ${handleOffset}px))`;\n }, [time]);\n\n const calculatePositionAsTime = useCallback(\n (clientX: number) => {\n if (!track.current) {\n return 0;\n }\n const trackRect = track.current.getBoundingClientRect();\n const leftEdge = Math.max(clientX - trackRect.left, 0);\n // get position as 0-1 on slider and mulitply by seconds in a day to convert to time\n const preciseTime =\n SECONDS_IN_DAY * Math.min(1, leftEdge / trackRect.width);\n // snap to nearest N(5) minute interval\n const roundedTime =\n SNAP_NEAREST_MINUTES * Math.round(preciseTime / SNAP_NEAREST_MINUTES);\n // prevent over-rounding to 24:00:00\n const limitMax = Math.min(SECONDS_IN_DAY, roundedTime);\n return limitMax;\n },\n [track]\n );\n\n const handleMouseMove = useCallback(\n ({ clientX }: MouseEvent) => {\n setTime(calculatePositionAsTime(clientX));\n },\n [setTime, calculatePositionAsTime]\n );\n\n const handleMouseUp = useCallback(\n ({ clientX }: MouseEvent) => {\n setTime(calculatePositionAsTime(clientX));\n\n window.removeEventListener('mousemove', handleMouseMove);\n window.removeEventListener('mouseup', handleMouseUp);\n document.documentElement.classList.remove('drag-pointer-events-none');\n },\n [setTime, calculatePositionAsTime, handleMouseMove]\n );\n\n const startDragListening = useCallback(() => {\n window.addEventListener('mousemove', handleMouseMove);\n window.addEventListener('mouseup', handleMouseUp);\n document.documentElement.classList.add('drag-pointer-events-none');\n }, [handleMouseMove, handleMouseUp]);\n\n const stopDragListening = useCallback(() => {\n window.removeEventListener('mousemove', handleMouseMove);\n window.removeEventListener('mouseup', handleMouseUp);\n document.documentElement.classList.remove('drag-pointer-events-none');\n }, [handleMouseMove, handleMouseUp]);\n\n const handleMouseDown = useCallback(() => {\n startDragListening();\n }, [startDragListening]);\n\n useEffect(\n function removeListenersOnUnmount() {\n return () => {\n stopDragListening();\n };\n },\n [stopDragListening]\n );\n\n return (\n <div className=\"handle-track\" style={{ transform }}>\n <button\n className=\"handle\"\n type=\"button\"\n aria-label=\"Change time\"\n onMouseDown={handleMouseDown}\n data-testid={dataTestId}\n />\n </div>\n );\n};\n\nexport default TimeSlider;\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/ToastNotification.tsx"],"names":["React","classNames","CSSTransition","vsClose","Button","ThemeExport","ToastNotification","buttons","isShown","classNamesProp","message","type","onClick","onDismiss","dataTestId","hasButtons","length","transitionMs","transitionSlowMs","TYPE","Object","freeze","ERROR"],"mappings":"AAAA,OAAOA,KAAP,MAAkB,OAAlB;AACA,OAAOC,UAAP,MAAuB,YAAvB;AACA,SAASC,aAAT,QAA8B,wBAA9B;AACA,SAASC,OAAT,QAAwB,kBAAxB;OACOC,M;OACAC,W;;;AAiBP,IAAMC,iBAAiB,GAAG,QASiB;AAAA,MAThB;AACzBC,IAAAA,OADyB;AAEzBC,IAAAA,OAAO,GAAG,KAFe;AAGzBP,IAAAA,UAAU,EAAEQ,cAHa;AAIzBC,IAAAA,OAJyB;AAKzBC,IAAAA,IALyB;AAMzBC,IAAAA,OANyB;AAOzBC,IAAAA,SAPyB;AAQzB,mBAAeC;AARU,GASgB;AACzC,MAAMC,UAAU,GAAGR,OAAO,IAAIA,OAAO,CAACS,MAAR,KAAmB,CAAjD;AAEA,sBACE,oBAAC,aAAD;AACE,IAAA,EAAE,EAAER,OADN;AAEE,IAAA,OAAO,EAAEH,WAAW,CAACY,YAFvB;AAGE,IAAA,UAAU,EAAC,6BAHb;AAIE,IAAA,YAAY,MAJd;AAKE,IAAA,aAAa;AALf,kBAOE;AACE,IAAA,SAAS,EAAEhB,UAAU,CAAC,oBAAD,EAAuBQ,cAAvB,EAAuCE,IAAvC,CADvB;AAEE,IAAA,IAAI,EAAC,cAFP;AAGE,IAAA,OAAO,EAAEC,OAHX;AAIE,IAAA,UAAU,EAAEA,OAJd;AAKE,mBAAaE;AALf,kBAOE;AAAK,IAAA,SAAS,EAAC;AAAf,kBACE;AAAM,IAAA,SAAS,EAAC;AAAhB,KAA2BJ,OAA3B,CADF,CAPF,eAUE,oBAAC,aAAD;AACE,IAAA,EAAE,EAAEK,UADN;AAEE,IAAA,OAAO,EAAEV,WAAW,CAACa,gBAFvB;AAGE,IAAA,UAAU,EAAC,MAHb;AAIE,IAAA,YAAY,MAJd;AAKE,IAAA,aAAa;AALf,kBAOE;AAAK,IAAA,SAAS,EAAC;AAAf,KAAoCX,OAApC,CAPF,CAVF,EAmBGM,SAAS,iBACR,oBAAC,MAAD;AACE,IAAA,IAAI,EAAC,OADP;AAEE,IAAA,IAAI,EAAEV,OAFR;AAGE,IAAA,OAAO,EAAC,oBAHV;AAIE,IAAA,SAAS,EAAC,MAJZ;AAKE,IAAA,OAAO,EAAEU;AALX,IApBJ,CAPF,CADF;AAuCD,CAnDD;;AAqDAP,iBAAiB,CAACa,IAAlB,GAAyBC,MAAM,CAACC,MAAP,CAAc;AACrCC,EAAAA,KAAK,EAAE;AAD8B,CAAd,CAAzB;AAIA,eAAehB,iBAAf","sourcesContent":["import React from 'react';\nimport classNames from 'classnames';\nimport { CSSTransition } from 'react-transition-group';\nimport { vsClose } from '@deephaven/icons';\nimport Button from './Button';\nimport ThemeExport from './ThemeExport';\nimport './ToastNotification.scss';\n\ntype ToastNotificationProps = {\n buttons?: typeof Button[];\n classNames?: string;\n isShown?: boolean;\n message?: string;\n type?: string;\n 'data-testid'?: string;\n\n onClick?: React.EventHandler<\n React.MouseEvent<HTMLDivElement> | React.KeyboardEvent<HTMLDivElement>\n >;\n onDismiss?: React.MouseEventHandler<HTMLButtonElement>;\n};\n\nconst ToastNotification = ({\n buttons,\n isShown = false,\n classNames: classNamesProp,\n message,\n type,\n onClick,\n onDismiss,\n 'data-testid': dataTestId,\n}: ToastNotificationProps): JSX.Element => {\n const hasButtons = buttons && buttons.length !== 0;\n\n return (\n <CSSTransition\n in={isShown}\n timeout={ThemeExport.transitionMs}\n classNames=\"toast-notification-slide-up\"\n mountOnEnter\n unmountOnExit\n >\n <div\n className={classNames('toast-notification', classNamesProp, type)}\n role=\"presentation\"\n onClick={onClick}\n onKeyPress={onClick}\n data-testid={dataTestId}\n >\n <div className=\"message-container\">\n <span className=\"message\">{message}</span>\n </div>\n <CSSTransition\n in={hasButtons}\n timeout={ThemeExport.transitionSlowMs}\n classNames=\"fade\"\n mountOnEnter\n unmountOnExit\n >\n <div className=\"buttons-container\">{buttons}</div>\n </CSSTransition>\n {onDismiss && (\n <Button\n kind=\"ghost\"\n icon={vsClose}\n tooltip=\"Close notification\"\n className=\"my-2\"\n onClick={onDismiss}\n />\n )}\n </div>\n </CSSTransition>\n );\n};\n\nToastNotification.TYPE = Object.freeze({\n ERROR: 'error',\n});\n\nexport default ToastNotification;\n"],"file":"ToastNotification.js"}
1
+ {"version":3,"file":"ToastNotification.js","names":["React","classNames","CSSTransition","vsClose","Button","ThemeExport","ToastNotification","buttons","isShown","classNamesProp","message","type","onClick","onDismiss","dataTestId","hasButtons","length","transitionMs","transitionSlowMs","TYPE","Object","freeze","ERROR"],"sources":["../src/ToastNotification.tsx"],"sourcesContent":["import React from 'react';\nimport classNames from 'classnames';\nimport { CSSTransition } from 'react-transition-group';\nimport { vsClose } from '@deephaven/icons';\nimport Button from './Button';\nimport ThemeExport from './ThemeExport';\nimport './ToastNotification.scss';\n\ntype ToastNotificationProps = {\n buttons?: typeof Button[];\n classNames?: string;\n isShown?: boolean;\n message?: string;\n type?: string;\n 'data-testid'?: string;\n\n onClick?: React.EventHandler<\n React.MouseEvent<HTMLDivElement> | React.KeyboardEvent<HTMLDivElement>\n >;\n onDismiss?: React.MouseEventHandler<HTMLButtonElement>;\n};\n\nconst ToastNotification = ({\n buttons,\n isShown = false,\n classNames: classNamesProp,\n message,\n type,\n onClick,\n onDismiss,\n 'data-testid': dataTestId,\n}: ToastNotificationProps): JSX.Element => {\n const hasButtons = buttons && buttons.length !== 0;\n\n return (\n <CSSTransition\n in={isShown}\n timeout={ThemeExport.transitionMs}\n classNames=\"toast-notification-slide-up\"\n mountOnEnter\n unmountOnExit\n >\n <div\n className={classNames('toast-notification', classNamesProp, type)}\n role=\"presentation\"\n onClick={onClick}\n onKeyPress={onClick}\n data-testid={dataTestId}\n >\n <div className=\"message-container\">\n <span className=\"message\">{message}</span>\n </div>\n <CSSTransition\n in={hasButtons}\n timeout={ThemeExport.transitionSlowMs}\n classNames=\"fade\"\n mountOnEnter\n unmountOnExit\n >\n <div className=\"buttons-container\">{buttons}</div>\n </CSSTransition>\n {onDismiss && (\n <Button\n kind=\"ghost\"\n icon={vsClose}\n tooltip=\"Close notification\"\n className=\"my-2\"\n onClick={onDismiss}\n />\n )}\n </div>\n </CSSTransition>\n );\n};\n\nToastNotification.TYPE = Object.freeze({\n ERROR: 'error',\n});\n\nexport default ToastNotification;\n"],"mappings":"AAAA,OAAOA,KAAP,MAAkB,OAAlB;AACA,OAAOC,UAAP,MAAuB,YAAvB;AACA,SAASC,aAAT,QAA8B,wBAA9B;AACA,SAASC,OAAT,QAAwB,kBAAxB;OACOC,M;OACAC,W;;;AAiBP,IAAMC,iBAAiB,GAAG,QASiB;EAAA,IAThB;IACzBC,OADyB;IAEzBC,OAAO,GAAG,KAFe;IAGzBP,UAAU,EAAEQ,cAHa;IAIzBC,OAJyB;IAKzBC,IALyB;IAMzBC,OANyB;IAOzBC,SAPyB;IAQzB,eAAeC;EARU,CASgB;EACzC,IAAMC,UAAU,GAAGR,OAAO,IAAIA,OAAO,CAACS,MAAR,KAAmB,CAAjD;EAEA,oBACE,oBAAC,aAAD;IACE,EAAE,EAAER,OADN;IAEE,OAAO,EAAEH,WAAW,CAACY,YAFvB;IAGE,UAAU,EAAC,6BAHb;IAIE,YAAY,MAJd;IAKE,aAAa;EALf,gBAOE;IACE,SAAS,EAAEhB,UAAU,CAAC,oBAAD,EAAuBQ,cAAvB,EAAuCE,IAAvC,CADvB;IAEE,IAAI,EAAC,cAFP;IAGE,OAAO,EAAEC,OAHX;IAIE,UAAU,EAAEA,OAJd;IAKE,eAAaE;EALf,gBAOE;IAAK,SAAS,EAAC;EAAf,gBACE;IAAM,SAAS,EAAC;EAAhB,GAA2BJ,OAA3B,CADF,CAPF,eAUE,oBAAC,aAAD;IACE,EAAE,EAAEK,UADN;IAEE,OAAO,EAAEV,WAAW,CAACa,gBAFvB;IAGE,UAAU,EAAC,MAHb;IAIE,YAAY,MAJd;IAKE,aAAa;EALf,gBAOE;IAAK,SAAS,EAAC;EAAf,GAAoCX,OAApC,CAPF,CAVF,EAmBGM,SAAS,iBACR,oBAAC,MAAD;IACE,IAAI,EAAC,OADP;IAEE,IAAI,EAAEV,OAFR;IAGE,OAAO,EAAC,oBAHV;IAIE,SAAS,EAAC,MAJZ;IAKE,OAAO,EAAEU;EALX,EApBJ,CAPF,CADF;AAuCD,CAnDD;;AAqDAP,iBAAiB,CAACa,IAAlB,GAAyBC,MAAM,CAACC,MAAP,CAAc;EACrCC,KAAK,EAAE;AAD8B,CAAd,CAAzB;AAIA,eAAehB,iBAAf"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/UISwitch.tsx"],"names":["React","classNames","UISwitch","on","id","className","isInvalid","disabled","onClick","dataTestId","active"],"mappings":"AAAA,OAAOA,KAAP,MAAkB,OAAlB;AACA,OAAOC,UAAP,MAAuB,YAAvB;;;AAaA,IAAMC,QAAQ,GAAG;AAAA,MAAC;AAChBC,IAAAA,EADgB;AAEhBC,IAAAA,EAFgB;AAGhBC,IAAAA,SAHgB;AAIhBC,IAAAA,SAJgB;AAKhBC,IAAAA,QAAQ,GAAG,KALK;AAMhBC,IAAAA,OANgB;AAOhB,mBAAeC;AAPC,GAAD;AAAA,sBASf;AACE,IAAA,IAAI,EAAC,QADP;AAEE,IAAA,SAAS,EAAER,UAAU,CACnB,KADmB,EAEnB,YAFmB,EAGnBI,SAHmB,EAInB;AAAEK,MAAAA,MAAM,EAAEP;AAAV,KAJmB,EAKnB;AAAE,oBAAcG;AAAhB,KALmB,CAFvB;AASE,IAAA,EAAE,EAAEF,EATN;AAUE,IAAA,OAAO,EAAEI,OAVX;AAWE,IAAA,QAAQ,EAAED,QAXZ;AAYE,mBAAaE;AAZf,kBAcE;AAAK,IAAA,SAAS,EAAC;AAAf,IAdF,CATe;AAAA,CAAjB;;AA2BA,eAAeP,QAAf","sourcesContent":["import React from 'react';\nimport classNames from 'classnames';\nimport './UISwitch.scss';\n\nexport type UISwitchProps = {\n on: boolean;\n onClick: React.MouseEventHandler<HTMLButtonElement>;\n id?: string;\n className?: string;\n isInvalid?: boolean;\n disabled?: boolean;\n 'data-testid'?: string;\n};\n\nconst UISwitch = ({\n on,\n id,\n className,\n isInvalid,\n disabled = false,\n onClick,\n 'data-testid': dataTestId,\n}: UISwitchProps): JSX.Element => (\n <button\n type=\"button\"\n className={classNames(\n 'btn',\n 'btn-switch',\n className,\n { active: on },\n { 'is-invalid': isInvalid }\n )}\n id={id}\n onClick={onClick}\n disabled={disabled}\n data-testid={dataTestId}\n >\n <div className=\"handle\" />\n </button>\n);\n\nexport default UISwitch;\n"],"file":"UISwitch.js"}
1
+ {"version":3,"file":"UISwitch.js","names":["React","classNames","UISwitch","on","id","className","isInvalid","disabled","onClick","dataTestId","active"],"sources":["../src/UISwitch.tsx"],"sourcesContent":["import React from 'react';\nimport classNames from 'classnames';\nimport './UISwitch.scss';\n\nexport type UISwitchProps = {\n on: boolean;\n onClick: React.MouseEventHandler<HTMLButtonElement>;\n id?: string;\n className?: string;\n isInvalid?: boolean;\n disabled?: boolean;\n 'data-testid'?: string;\n};\n\nconst UISwitch = ({\n on,\n id,\n className,\n isInvalid,\n disabled = false,\n onClick,\n 'data-testid': dataTestId,\n}: UISwitchProps): JSX.Element => (\n <button\n type=\"button\"\n className={classNames(\n 'btn',\n 'btn-switch',\n className,\n { active: on },\n { 'is-invalid': isInvalid }\n )}\n id={id}\n onClick={onClick}\n disabled={disabled}\n data-testid={dataTestId}\n >\n <div className=\"handle\" />\n </button>\n);\n\nexport default UISwitch;\n"],"mappings":"AAAA,OAAOA,KAAP,MAAkB,OAAlB;AACA,OAAOC,UAAP,MAAuB,YAAvB;;;AAaA,IAAMC,QAAQ,GAAG;EAAA,IAAC;IAChBC,EADgB;IAEhBC,EAFgB;IAGhBC,SAHgB;IAIhBC,SAJgB;IAKhBC,QAAQ,GAAG,KALK;IAMhBC,OANgB;IAOhB,eAAeC;EAPC,CAAD;EAAA,oBASf;IACE,IAAI,EAAC,QADP;IAEE,SAAS,EAAER,UAAU,CACnB,KADmB,EAEnB,YAFmB,EAGnBI,SAHmB,EAInB;MAAEK,MAAM,EAAEP;IAAV,CAJmB,EAKnB;MAAE,cAAcG;IAAhB,CALmB,CAFvB;IASE,EAAE,EAAEF,EATN;IAUE,OAAO,EAAEI,OAVX;IAWE,QAAQ,EAAED,QAXZ;IAYE,eAAaE;EAZf,gBAcE;IAAK,SAAS,EAAC;EAAf,EAdF,CATe;AAAA,CAAjB;;AA2BA,eAAeP,QAAf"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/ValidateLabelInput.tsx"],"names":["React","useRef","classNames","shortid","ValidateLabelInput","props","children","className","labelText","hintText","isModified","validationError","showValidationError","dataTestId","id","idProp","current","modified","Children","toArray","map","child","isValidElement","cloneElement"],"mappings":"AAAA,OAAOA,KAAP,IAAgBC,MAAhB,QAA8B,OAA9B;AACA,OAAOC,UAAP,MAAuB,YAAvB;AACA,OAAOC,OAAP,MAAoB,SAApB;;;AAgCA;AACA;AACA;AACA,OAAO,SAASC,kBAAT,CACLC,KADK,EAEe;AACpB,MAAM;AACJC,IAAAA,QADI;AAEJC,IAAAA,SAFI;AAGJC,IAAAA,SAHI;AAIJC,IAAAA,QAJI;AAKJC,IAAAA,UALI;AAMJC,IAAAA,eANI;AAOJC,IAAAA,mBAAmB,GAAG,IAPlB;AAQJ,mBAAeC,UARX;AASJC,IAAAA,EAAE,EAAEC;AATA,MAUFV,KAVJ;AAYA,MAAM;AAAEW,IAAAA,OAAO,EAAEF;AAAX,MAAkBb,MAAM,CAACc,MAAD,aAACA,MAAD,cAACA,MAAD,GAAWZ,OAAO,EAAlB,CAA9B;AAEA,sBACE,uDACE;AACE,IAAA,SAAS,EAAED,UAAU,CAAC,gBAAD,EAAmBK,SAAnB,EAA8B;AACjDU,MAAAA,QAAQ,EAAEP;AADuC,KAA9B,CADvB;AAIE,IAAA,OAAO,EAAEI,EAJX;AAKE,mBAAaD;AALf,KAOGL,SAPH,CADF,EAUGR,KAAK,CAACkB,QAAN,CAAeC,OAAf,CAAuBb,QAAvB,EAAiCc,GAAjC,CAAqCC,KAAK,IAAI;AAC7C,QAAI,eAACrB,KAAK,CAACsB,cAAN,CAAqBD,KAArB,CAAL,EAAkC;AAChC,0BAAO;AAAK,QAAA,SAAS,EAAEnB,UAAU,CAACK,SAAD;AAA1B,SAAwCc,KAAxC,CAAP;AACD,KAH4C,CAK7C;;;AACA,wBAAOrB,KAAK,CAACuB,YAAN,CAAmBF,KAAnB,EAA0B;AAC/Bd,MAAAA,SAAS,EAAEL,UAAU,CAACmB,KAAK,CAAChB,KAAN,CAAYE,SAAb,EAAwB;AAC3C,sBAAcI;AAD6B,OAAxB;AADU,KAA1B,CAAP;AAKD,GAXA,CAVH,EAsBGF,QAAQ,iBAAI;AAAO,IAAA,SAAS,EAAC;AAAjB,KAAyCA,QAAzC,CAtBf,EAuBGE,eAAe,IAAIC,mBAAnB,iBACC;AAAG,IAAA,SAAS,EAAC;AAAb,KAAiDD,eAAjD,CAxBJ,CADF;AA6BD;AAED,eAAeP,kBAAf","sourcesContent":["import React, { useRef } from 'react';\nimport classNames from 'classnames';\nimport shortid from 'shortid';\nimport './ValidateLabelInput.scss';\n\nexport type ValidateLabelInputProps = {\n /** Element to add label to */\n children: React.ReactNode;\n\n /** Any classnames to add */\n className?: string | string[];\n\n /** Text for this validation label */\n labelText?: string;\n\n /** Small hint text next to the main label */\n hintText?: string;\n\n /** Show a modified state. Defaults to false. */\n isModified?: boolean;\n\n /** Validation error that has occurred */\n validationError?: string;\n\n /** Show the validation error if it exists. Default to true. */\n showValidationError?: boolean;\n\n /** ID to use. Auto-generates if not provided */\n id?: string;\n\n /** data-testid to apply to the label */\n 'data-testid'?: string;\n};\n\n/**\n * Takes a child and add a label and validaton error\n */\nexport function ValidateLabelInput(\n props: ValidateLabelInputProps\n): React.ReactElement {\n const {\n children,\n className,\n labelText,\n hintText,\n isModified,\n validationError,\n showValidationError = true,\n 'data-testid': dataTestId,\n id: idProp,\n } = props;\n\n const { current: id } = useRef(idProp ?? shortid());\n\n return (\n <>\n <label\n className={classNames('validate-label', className, {\n modified: isModified,\n })}\n htmlFor={id}\n data-testid={dataTestId}\n >\n {labelText}\n </label>\n {React.Children.toArray(children).map(child => {\n if (!React.isValidElement(child)) {\n return <div className={classNames(className)}>{child}</div>;\n }\n\n // toArray strips null children\n return React.cloneElement(child, {\n className: classNames(child.props.className, {\n 'is-invalid': validationError,\n }),\n });\n })}\n {hintText && <small className=\"form-text text-muted\">{hintText}</small>}\n {validationError && showValidationError && (\n <p className=\"validate-label-error text-danger\">{validationError}</p>\n )}\n </>\n );\n}\n\nexport default ValidateLabelInput;\n"],"file":"ValidateLabelInput.js"}
1
+ {"version":3,"file":"ValidateLabelInput.js","names":["React","useRef","classNames","shortid","ValidateLabelInput","props","children","className","labelText","hintText","isModified","validationError","showValidationError","dataTestId","id","idProp","current","modified","Children","toArray","map","child","isValidElement","cloneElement"],"sources":["../src/ValidateLabelInput.tsx"],"sourcesContent":["import React, { useRef } from 'react';\nimport classNames from 'classnames';\nimport shortid from 'shortid';\nimport './ValidateLabelInput.scss';\n\nexport type ValidateLabelInputProps = {\n /** Element to add label to */\n children: React.ReactNode;\n\n /** Any classnames to add */\n className?: string | string[];\n\n /** Text for this validation label */\n labelText?: string;\n\n /** Small hint text next to the main label */\n hintText?: string;\n\n /** Show a modified state. Defaults to false. */\n isModified?: boolean;\n\n /** Validation error that has occurred */\n validationError?: string;\n\n /** Show the validation error if it exists. Default to true. */\n showValidationError?: boolean;\n\n /** ID to use. Auto-generates if not provided */\n id?: string;\n\n /** data-testid to apply to the label */\n 'data-testid'?: string;\n};\n\n/**\n * Takes a child and add a label and validaton error\n */\nexport function ValidateLabelInput(\n props: ValidateLabelInputProps\n): React.ReactElement {\n const {\n children,\n className,\n labelText,\n hintText,\n isModified,\n validationError,\n showValidationError = true,\n 'data-testid': dataTestId,\n id: idProp,\n } = props;\n\n const { current: id } = useRef(idProp ?? shortid());\n\n return (\n <>\n <label\n className={classNames('validate-label', className, {\n modified: isModified,\n })}\n htmlFor={id}\n data-testid={dataTestId}\n >\n {labelText}\n </label>\n {React.Children.toArray(children).map(child => {\n if (!React.isValidElement(child)) {\n return <div className={classNames(className)}>{child}</div>;\n }\n\n // toArray strips null children\n return React.cloneElement(child, {\n className: classNames(child.props.className, {\n 'is-invalid': validationError,\n }),\n });\n })}\n {hintText && <small className=\"form-text text-muted\">{hintText}</small>}\n {validationError && showValidationError && (\n <p className=\"validate-label-error text-danger\">{validationError}</p>\n )}\n </>\n );\n}\n\nexport default ValidateLabelInput;\n"],"mappings":"AAAA,OAAOA,KAAP,IAAgBC,MAAhB,QAA8B,OAA9B;AACA,OAAOC,UAAP,MAAuB,YAAvB;AACA,OAAOC,OAAP,MAAoB,SAApB;;;AAgCA;AACA;AACA;AACA,OAAO,SAASC,kBAAT,CACLC,KADK,EAEe;EACpB,IAAM;IACJC,QADI;IAEJC,SAFI;IAGJC,SAHI;IAIJC,QAJI;IAKJC,UALI;IAMJC,eANI;IAOJC,mBAAmB,GAAG,IAPlB;IAQJ,eAAeC,UARX;IASJC,EAAE,EAAEC;EATA,IAUFV,KAVJ;EAYA,IAAM;IAAEW,OAAO,EAAEF;EAAX,IAAkBb,MAAM,CAACc,MAAD,aAACA,MAAD,cAACA,MAAD,GAAWZ,OAAO,EAAlB,CAA9B;EAEA,oBACE,uDACE;IACE,SAAS,EAAED,UAAU,CAAC,gBAAD,EAAmBK,SAAnB,EAA8B;MACjDU,QAAQ,EAAEP;IADuC,CAA9B,CADvB;IAIE,OAAO,EAAEI,EAJX;IAKE,eAAaD;EALf,GAOGL,SAPH,CADF,EAUGR,KAAK,CAACkB,QAAN,CAAeC,OAAf,CAAuBb,QAAvB,EAAiCc,GAAjC,CAAqCC,KAAK,IAAI;IAC7C,IAAI,eAACrB,KAAK,CAACsB,cAAN,CAAqBD,KAArB,CAAL,EAAkC;MAChC,oBAAO;QAAK,SAAS,EAAEnB,UAAU,CAACK,SAAD;MAA1B,GAAwCc,KAAxC,CAAP;IACD,CAH4C,CAK7C;;;IACA,oBAAOrB,KAAK,CAACuB,YAAN,CAAmBF,KAAnB,EAA0B;MAC/Bd,SAAS,EAAEL,UAAU,CAACmB,KAAK,CAAChB,KAAN,CAAYE,SAAb,EAAwB;QAC3C,cAAcI;MAD6B,CAAxB;IADU,CAA1B,CAAP;EAKD,CAXA,CAVH,EAsBGF,QAAQ,iBAAI;IAAO,SAAS,EAAC;EAAjB,GAAyCA,QAAzC,CAtBf,EAuBGE,eAAe,IAAIC,mBAAnB,iBACC;IAAG,SAAS,EAAC;EAAb,GAAiDD,eAAjD,CAxBJ,CADF;AA6BD;AAED,eAAeP,kBAAf"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/context-actions/ContextActionUtils.ts"],"names":["isPromise","value","then","undefined","ContextActionUtils","disableAllActions","actionsDisabled","enableAllActions","isContextActionEvent","e","Array","isArray","contextActions","compareActions","a","b","group","order","title","sortActions","actions","sortedActions","slice","sort","isMacPlatform","platform","window","navigator","startsWith","getModifierKey","isModifierKeyDown","event","modifierKey","copyToClipboard","text","clipboard","copyToClipboardExecCommand","Promise","resolve","writeText","catch","oldFocus","document","activeElement","textArea","createElement","body","appendChild","focus","select","execCommand","Error","removeChild","HTMLElement","getMenuItems","actionsParam","includePromises","menuItems","i","length","action","newMenuItems","push","concat","filter","menuElement","getNextMenuItem","startIndex","delta","firstIndex","menuIndex","item","disabled"],"mappings":"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","sourcesContent":["import { IconDefinition } from '@deephaven/icons';\nimport React from 'react';\nimport type { Shortcut } from '../shortcuts';\n\nexport type ResolvableContextAction =\n | ContextAction\n | Promise<ContextAction[]>\n | (() => Promise<ContextAction[]> | ContextAction[] | ContextAction);\n\nexport type MenuItem = ContextAction | Promise<ContextAction[]>;\n\nexport interface ContextAction {\n title?: string;\n description?: string;\n action?(event?: KeyboardEvent): void;\n actions?: ResolvableContextAction[];\n icon?: IconDefinition | React.ReactElement;\n iconColor?: string;\n shortcut?: Shortcut;\n isGlobal?: boolean;\n group?: number;\n order?: number;\n disabled?: boolean;\n menuElement?: React.ReactElement;\n iconOutline?: boolean;\n}\n\nexport interface ContextActionEvent extends MouseEvent {\n contextActions: ResolvableContextAction[];\n}\n\nexport function isPromise<A, T>(value: A | Promise<T>): value is Promise<T> {\n return (value as Promise<T>).then !== undefined;\n}\n\nclass ContextActionUtils {\n static actionsDisabled = false;\n\n static disableAllActions(): void {\n ContextActionUtils.actionsDisabled = true;\n }\n\n static enableAllActions(): void {\n ContextActionUtils.actionsDisabled = false;\n }\n\n static isContextActionEvent(e: MouseEvent): e is ContextActionEvent {\n return Array.isArray((e as ContextActionEvent).contextActions);\n }\n\n /**\n * Compare two action items. Useful in Array.sort\n * @param a First context action to compare\n * @param b Second context action to compare\n */\n static compareActions(a: ContextAction, b: ContextAction): number {\n if (a.group !== b.group) {\n return (a.group || 0) > (b.group || 0) ? 1 : -1;\n }\n\n if (a.order !== b.order) {\n return (a.order || 0) > (b.order || 0) ? 1 : -1;\n }\n\n if (a.title !== b.title) {\n return (a.title || '') > (b.title || '') ? 1 : -1;\n }\n\n if (a !== b) {\n return a > b ? 1 : -1;\n }\n\n return 0;\n }\n\n /**\n *\n * @param actions The array of actions to sort\n */\n static sortActions(actions: ContextAction[]): ContextAction[] {\n if (!actions || !Array.isArray(actions)) {\n return [];\n }\n\n const sortedActions = actions.slice();\n sortedActions.sort(ContextActionUtils.compareActions);\n return sortedActions;\n }\n\n static isMacPlatform(): boolean {\n const { platform } = window.navigator;\n return platform.startsWith('Mac');\n }\n\n /**\n * Retrieve the preferred modifier key based on the current platform\n */\n static getModifierKey(): 'metaKey' | 'ctrlKey' {\n if (ContextActionUtils.isMacPlatform()) {\n return 'metaKey';\n }\n\n return 'ctrlKey';\n }\n\n /**\n * Returns true if the modifier key for the current platform is down for the event (Ctrl for windows/linux, Command (meta) for mac)\n * @param event The event to get the meta key status from\n */\n static isModifierKeyDown(\n event: KeyboardEvent | MouseEvent | React.KeyboardEvent | React.MouseEvent\n ): boolean {\n const modifierKey = ContextActionUtils.getModifierKey();\n return event[modifierKey];\n }\n\n /**\n * Copy the passed in text to the clipboard.\n * @param text The text to copy\n * @returns Promise Resolved on success, rejected on failure\n */\n static copyToClipboard(text: string): Promise<void> {\n const { clipboard } = navigator;\n if (clipboard === undefined) {\n ContextActionUtils.copyToClipboardExecCommand(text);\n return Promise.resolve();\n }\n return navigator.clipboard.writeText(text).catch(() => {\n ContextActionUtils.copyToClipboardExecCommand(text);\n });\n }\n\n /**\n * Copy the passed in text to the clipboard using the `execCommand` functionality\n * Throws on error/failure\n * @param text The text to copy\n */\n static copyToClipboardExecCommand(text: string): void {\n const oldFocus = document.activeElement;\n const textArea = document.createElement('textarea');\n textArea.value = text;\n document.body.appendChild(textArea);\n textArea.focus();\n textArea.select();\n\n if (!document.execCommand('copy')) {\n throw new Error('Unable to execute copy command');\n }\n\n document.body.removeChild(textArea);\n\n if (oldFocus instanceof HTMLElement) {\n oldFocus.focus();\n }\n }\n\n /**\n * Returns the menu items for the provided context actions, or empty array if none found.\n * @param actionsParam The actions to get menu items for\n * @param includePromises Whether or not to include promises in the returned menu items\n */\n static getMenuItems(\n actionsParam: ResolvableContextAction | ResolvableContextAction[],\n includePromises?: true\n ): MenuItem[];\n\n // If ignoring promises, then the return type is narrowed\n static getMenuItems(\n actionsParam: ResolvableContextAction | ResolvableContextAction[],\n includePromises: false\n ): ContextAction[];\n\n static getMenuItems(\n actionsParam: ResolvableContextAction | ResolvableContextAction[],\n includePromises = true\n ): MenuItem[] {\n let menuItems: MenuItem[] = [];\n let actions = actionsParam;\n if (!Array.isArray(actions)) {\n actions = [actions];\n }\n\n for (let i = 0; i < actions.length; i += 1) {\n const action = actions[i];\n let newMenuItems:\n | ContextAction\n | ContextAction[]\n | Promise<ContextAction[]>;\n if (typeof action === 'function') {\n newMenuItems = action();\n } else {\n newMenuItems = action;\n }\n\n if (newMenuItems != null) {\n if (newMenuItems instanceof Promise) {\n if (includePromises) {\n menuItems.push(newMenuItems);\n }\n } else if (Array.isArray(newMenuItems)) {\n menuItems = menuItems.concat(newMenuItems);\n } else {\n menuItems.push(newMenuItems);\n }\n }\n }\n\n menuItems = menuItems.filter(\n action =>\n (action as ContextAction).title ||\n (action as Promise<ContextAction[]>).then ||\n (action as ContextAction).menuElement\n );\n\n return menuItems;\n }\n\n /**\n * Returns the index of the next menu item in a list that doesn't have a disabled=true prop\n * @param startIndex the starting position for the iteration\n * @param delta the direction of travel, -1 or 1\n * @param menuItems an array of menuItems\n */\n static getNextMenuItem(\n startIndex: number,\n delta: -1 | 1,\n menuItems: MenuItem[]\n ): number {\n let firstIndex = startIndex;\n if (firstIndex < 0 && delta < 0) {\n // if menu index is -1 and delta -1 manually set start point\n firstIndex = menuItems.length;\n }\n // find the next non disabled menu option, iterating the list only once\n for (let i = 1; i < menuItems.length + 1; i += 1) {\n const menuIndex =\n (firstIndex + delta * i + menuItems.length) % menuItems.length;\n const item = menuItems[menuIndex];\n if (!(item instanceof Promise) && item.disabled !== true) {\n return menuIndex;\n }\n }\n return startIndex;\n }\n}\n\nexport default ContextActionUtils;\n"],"file":"ContextActionUtils.js"}
1
+ {"version":3,"file":"ContextActionUtils.js","names":["isPromise","value","then","undefined","ContextActionUtils","disableAllActions","actionsDisabled","enableAllActions","isContextActionEvent","e","Array","isArray","contextActions","compareActions","a","b","group","order","title","sortActions","actions","sortedActions","slice","sort","isMacPlatform","platform","window","navigator","startsWith","getModifierKey","isModifierKeyDown","event","modifierKey","copyToClipboard","text","clipboard","copyToClipboardExecCommand","Promise","resolve","writeText","catch","oldFocus","document","activeElement","textArea","createElement","body","appendChild","focus","select","execCommand","Error","removeChild","HTMLElement","getMenuItems","actionsParam","includePromises","menuItems","i","length","action","newMenuItems","push","concat","filter","menuElement","getNextMenuItem","startIndex","delta","firstIndex","menuIndex","item","disabled"],"sources":["../../src/context-actions/ContextActionUtils.ts"],"sourcesContent":["import { IconDefinition } from '@deephaven/icons';\nimport React from 'react';\nimport type { Shortcut } from '../shortcuts';\n\nexport type ResolvableContextAction =\n | ContextAction\n | Promise<ContextAction[]>\n | (() => Promise<ContextAction[]> | ContextAction[] | ContextAction);\n\nexport type MenuItem = ContextAction | Promise<ContextAction[]>;\n\nexport interface ContextAction {\n title?: string;\n description?: string;\n action?(event?: KeyboardEvent): void;\n actions?: ResolvableContextAction[];\n icon?: IconDefinition | React.ReactElement;\n iconColor?: string;\n shortcut?: Shortcut;\n isGlobal?: boolean;\n group?: number;\n order?: number;\n disabled?: boolean;\n menuElement?: React.ReactElement;\n iconOutline?: boolean;\n}\n\nexport interface ContextActionEvent extends MouseEvent {\n contextActions: ResolvableContextAction[];\n}\n\nexport function isPromise<A, T>(value: A | Promise<T>): value is Promise<T> {\n return (value as Promise<T>).then !== undefined;\n}\n\nclass ContextActionUtils {\n static actionsDisabled = false;\n\n static disableAllActions(): void {\n ContextActionUtils.actionsDisabled = true;\n }\n\n static enableAllActions(): void {\n ContextActionUtils.actionsDisabled = false;\n }\n\n static isContextActionEvent(e: MouseEvent): e is ContextActionEvent {\n return Array.isArray((e as ContextActionEvent).contextActions);\n }\n\n /**\n * Compare two action items. Useful in Array.sort\n * @param a First context action to compare\n * @param b Second context action to compare\n */\n static compareActions(a: ContextAction, b: ContextAction): number {\n if (a.group !== b.group) {\n return (a.group || 0) > (b.group || 0) ? 1 : -1;\n }\n\n if (a.order !== b.order) {\n return (a.order || 0) > (b.order || 0) ? 1 : -1;\n }\n\n if (a.title !== b.title) {\n return (a.title || '') > (b.title || '') ? 1 : -1;\n }\n\n if (a !== b) {\n return a > b ? 1 : -1;\n }\n\n return 0;\n }\n\n /**\n *\n * @param actions The array of actions to sort\n */\n static sortActions(actions: ContextAction[]): ContextAction[] {\n if (!actions || !Array.isArray(actions)) {\n return [];\n }\n\n const sortedActions = actions.slice();\n sortedActions.sort(ContextActionUtils.compareActions);\n return sortedActions;\n }\n\n static isMacPlatform(): boolean {\n const { platform } = window.navigator;\n return platform.startsWith('Mac');\n }\n\n /**\n * Retrieve the preferred modifier key based on the current platform\n */\n static getModifierKey(): 'metaKey' | 'ctrlKey' {\n if (ContextActionUtils.isMacPlatform()) {\n return 'metaKey';\n }\n\n return 'ctrlKey';\n }\n\n /**\n * Returns true if the modifier key for the current platform is down for the event (Ctrl for windows/linux, Command (meta) for mac)\n * @param event The event to get the meta key status from\n */\n static isModifierKeyDown(\n event: KeyboardEvent | MouseEvent | React.KeyboardEvent | React.MouseEvent\n ): boolean {\n const modifierKey = ContextActionUtils.getModifierKey();\n return event[modifierKey];\n }\n\n /**\n * Copy the passed in text to the clipboard.\n * @param text The text to copy\n * @returns Promise Resolved on success, rejected on failure\n */\n static copyToClipboard(text: string): Promise<void> {\n const { clipboard } = navigator;\n if (clipboard === undefined) {\n ContextActionUtils.copyToClipboardExecCommand(text);\n return Promise.resolve();\n }\n return navigator.clipboard.writeText(text).catch(() => {\n ContextActionUtils.copyToClipboardExecCommand(text);\n });\n }\n\n /**\n * Copy the passed in text to the clipboard using the `execCommand` functionality\n * Throws on error/failure\n * @param text The text to copy\n */\n static copyToClipboardExecCommand(text: string): void {\n const oldFocus = document.activeElement;\n const textArea = document.createElement('textarea');\n textArea.value = text;\n document.body.appendChild(textArea);\n textArea.focus();\n textArea.select();\n\n if (!document.execCommand('copy')) {\n throw new Error('Unable to execute copy command');\n }\n\n document.body.removeChild(textArea);\n\n if (oldFocus instanceof HTMLElement) {\n oldFocus.focus();\n }\n }\n\n /**\n * Returns the menu items for the provided context actions, or empty array if none found.\n * @param actionsParam The actions to get menu items for\n * @param includePromises Whether or not to include promises in the returned menu items\n */\n static getMenuItems(\n actionsParam: ResolvableContextAction | ResolvableContextAction[],\n includePromises?: true\n ): MenuItem[];\n\n // If ignoring promises, then the return type is narrowed\n static getMenuItems(\n actionsParam: ResolvableContextAction | ResolvableContextAction[],\n includePromises: false\n ): ContextAction[];\n\n static getMenuItems(\n actionsParam: ResolvableContextAction | ResolvableContextAction[],\n includePromises = true\n ): MenuItem[] {\n let menuItems: MenuItem[] = [];\n let actions = actionsParam;\n if (!Array.isArray(actions)) {\n actions = [actions];\n }\n\n for (let i = 0; i < actions.length; i += 1) {\n const action = actions[i];\n let newMenuItems:\n | ContextAction\n | ContextAction[]\n | Promise<ContextAction[]>;\n if (typeof action === 'function') {\n newMenuItems = action();\n } else {\n newMenuItems = action;\n }\n\n if (newMenuItems != null) {\n if (newMenuItems instanceof Promise) {\n if (includePromises) {\n menuItems.push(newMenuItems);\n }\n } else if (Array.isArray(newMenuItems)) {\n menuItems = menuItems.concat(newMenuItems);\n } else {\n menuItems.push(newMenuItems);\n }\n }\n }\n\n menuItems = menuItems.filter(\n action =>\n (action as ContextAction).title ||\n (action as Promise<ContextAction[]>).then ||\n (action as ContextAction).menuElement\n );\n\n return menuItems;\n }\n\n /**\n * Returns the index of the next menu item in a list that doesn't have a disabled=true prop\n * @param startIndex the starting position for the iteration\n * @param delta the direction of travel, -1 or 1\n * @param menuItems an array of menuItems\n */\n static getNextMenuItem(\n startIndex: number,\n delta: -1 | 1,\n menuItems: MenuItem[]\n ): number {\n let firstIndex = startIndex;\n if (firstIndex < 0 && delta < 0) {\n // if menu index is -1 and delta -1 manually set start point\n firstIndex = menuItems.length;\n }\n // find the next non disabled menu option, iterating the list only once\n for (let i = 1; i < menuItems.length + 1; i += 1) {\n const menuIndex =\n (firstIndex + delta * i + menuItems.length) % menuItems.length;\n const item = menuItems[menuIndex];\n if (!(item instanceof Promise) && item.disabled !== true) {\n return menuIndex;\n }\n }\n return startIndex;\n }\n}\n\nexport default ContextActionUtils;\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/context-actions/ContextActions.tsx"],"names":["React","Component","Log","ContextActionUtils","isPromise","GlobalContextActions","log","module","ContextActions","triggerMenu","element","clientX","clientY","actions","mouseEvent","MouseEvent","bubbles","cancelable","contextActions","dispatchEvent","constructor","props","handleContextMenu","bind","handleKeyDown","container","createRef","state","globalActions","keyboardActions","getDerivedStateFromProps","Array","isArray","filter","action","isGlobal","shortcut","componentDidMount","current","parentElement","addEventListener","componentWillUnmount","removeEventListener","e","ignoreClassNames","length","el","target","classList","ignoredClassName","find","className","contains","undefined","debug2","isContextActionEvent","concat","debug","i","keyboardAction","actionsDisabled","matchesEvent","result","stopPropagation","preventDefault","render","dataTestId","default","high","medium","low","global","edit"],"mappings":"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","sourcesContent":["/**\n * Just a simple utility class for displaying a popup menu.\n */\nimport React, { Component } from 'react';\nimport Log from '@deephaven/log';\nimport ContextActionUtils, {\n ResolvableContextAction,\n isPromise,\n} from './ContextActionUtils';\nimport type { ContextAction, ContextActionEvent } from './ContextActionUtils';\nimport GlobalContextActions from './GlobalContextActions';\nimport './ContextActions.scss';\n\nconst log = Log.module('ContextActions');\n\ninterface ContextActionsProps {\n actions: ResolvableContextAction | ResolvableContextAction[];\n ignoreClassNames?: string[];\n 'data-testid'?: string;\n}\n\ninterface ContextActionsState {\n globalActions: ContextAction[];\n keyboardActions: ContextAction[];\n}\n\n/**\n * ContextActions that you add onto any component.\n *\n * Usage:\n * let actions = [{\n * title: 'My Action', // Omit the title to hide it from the context menu\n * action: () => { alert('My Action Clicked!') }\n * actions: [] // Submenu of actions\n * icon: faPrint, // Limited to FontAwesome icons for now.\n * iconColor: '#ff0000, // Color to use for the icon\n * shortcut: Shortcut, // Defaults to null\n * isGlobal: false, // Global context action. Defaults to false.\n * group: ContextActions.groups.default, // What group to group the context action with\n * order: null, // Int where to order within group\n * disabled: true // disable action\n * menuElement: null // Custom menu element for displaying in context menu. When null, creates a default menu item based on title\n * }];\n *\n * <div>\n * Right click in this container\n * <ContextActions actions={actions}/>\n * </div>\n *\n * Right clicking the container will then build the context menu, bubbling up until an element with a ContextMenuRoot is on it.\n * You should generally have a ContextMenuRoot on the root node of your document.\n */\nclass ContextActions extends Component<\n ContextActionsProps,\n ContextActionsState\n> {\n /**\n * Group you can assign to context menu actions to group them together.\n * Lower group IDs appear at the top of the list.\n * Groups are separated by a separator item.\n * Items within groups are ordered by their order property, then by their title.\n */\n static groups = {\n default: null,\n high: 100,\n medium: 5000,\n low: 10000,\n global: 100000,\n\n edit: 100,\n };\n\n static triggerMenu(\n element: Element,\n clientX: number,\n clientY: number,\n actions: ContextAction[]\n ): void {\n if (!element || !clientX || !clientY || !actions) {\n return;\n }\n\n const mouseEvent: Partial<ContextActionEvent> = new MouseEvent(\n 'contextmenu',\n {\n clientX,\n clientY,\n bubbles: true,\n cancelable: true,\n }\n );\n mouseEvent.contextActions = actions;\n\n element.dispatchEvent(mouseEvent as ContextActionEvent);\n }\n\n constructor(props: ContextActionsProps) {\n super(props);\n\n this.handleContextMenu = this.handleContextMenu.bind(this);\n this.handleKeyDown = this.handleKeyDown.bind(this);\n\n this.container = React.createRef();\n\n this.state = { globalActions: [], keyboardActions: [] };\n }\n\n static getDerivedStateFromProps(\n props: ContextActionsProps\n ): ContextActionsState {\n if (!props.actions || !Array.isArray(props.actions)) {\n return { globalActions: [], keyboardActions: [] };\n }\n const globalActions = props.actions.filter(\n action =>\n !isPromise(action) && typeof action !== 'function' && action.isGlobal\n ) as ContextAction[];\n const keyboardActions = props.actions.filter(\n action =>\n !isPromise(action) &&\n typeof action !== 'function' &&\n !action.isGlobal &&\n action.shortcut != null\n ) as ContextAction[];\n\n return { globalActions, keyboardActions };\n }\n\n componentDidMount(): void {\n if (this.container.current?.parentElement) {\n this.container.current.parentElement.addEventListener(\n 'contextmenu',\n this.handleContextMenu\n );\n this.container.current.parentElement.addEventListener(\n 'keydown',\n this.handleKeyDown\n );\n }\n }\n\n componentWillUnmount(): void {\n if (this.container.current?.parentElement) {\n this.container.current.parentElement.removeEventListener(\n 'contextmenu',\n this.handleContextMenu\n );\n this.container.current.parentElement.removeEventListener(\n 'keydown',\n this.handleKeyDown\n );\n }\n }\n\n container: React.RefObject<HTMLDivElement>;\n\n handleContextMenu(e: MouseEvent): void {\n const { ignoreClassNames = [] } = this.props;\n if (ignoreClassNames.length > 0) {\n let el = e.target as Element | null;\n while (el != null) {\n const { classList } = el;\n const ignoredClassName = ignoreClassNames.find(className =>\n classList.contains(className)\n );\n if (ignoredClassName !== undefined) {\n log.debug2(\n `Contextmenu event ignored based on the target className \"${ignoredClassName}\"`\n );\n return;\n }\n el = el.parentElement;\n }\n }\n if (!ContextActionUtils.isContextActionEvent(e)) {\n (e as ContextActionEvent).contextActions = [];\n }\n\n if (!ContextActionUtils.isContextActionEvent(e)) {\n return;\n }\n\n const { actions } = this.props;\n if (actions) {\n let contextActions = actions;\n if (Array.isArray(contextActions)) {\n contextActions = contextActions.filter(\n action =>\n isPromise(action) ||\n typeof action === 'function' ||\n !action.isGlobal\n );\n }\n\n e.contextActions = e.contextActions.concat(contextActions);\n }\n\n log.debug(\n 'Received context menu event! Menu items are now: ',\n e.contextActions\n );\n }\n\n handleKeyDown(e: KeyboardEvent): void {\n const { keyboardActions } = this.state;\n for (let i = 0; i < keyboardActions.length; i += 1) {\n const keyboardAction = keyboardActions[i];\n if (\n !ContextActionUtils.actionsDisabled &&\n keyboardAction.shortcut?.matchesEvent(e)\n ) {\n log.debug('Context hotkey matched!', e);\n\n const result = keyboardAction.action?.(e);\n\n if (result || result === undefined) {\n e.stopPropagation();\n e.preventDefault();\n return;\n }\n\n log.debug2('Matched hotkey returned false, key event not consumed');\n }\n }\n }\n\n render(): JSX.Element {\n const { 'data-testid': dataTestId } = this.props;\n const { globalActions } = this.state;\n return (\n <div\n className=\"context-actions-listener\"\n ref={this.container}\n data-testid={dataTestId}\n >\n <GlobalContextActions actions={globalActions} />\n </div>\n );\n }\n}\n\nexport default ContextActions;\n"],"file":"ContextActions.js"}
1
+ {"version":3,"file":"ContextActions.js","names":["React","Component","Log","ContextActionUtils","isPromise","GlobalContextActions","log","module","ContextActions","triggerMenu","element","clientX","clientY","actions","mouseEvent","MouseEvent","bubbles","cancelable","contextActions","dispatchEvent","constructor","props","handleContextMenu","bind","handleKeyDown","container","createRef","state","globalActions","keyboardActions","getDerivedStateFromProps","Array","isArray","filter","action","isGlobal","shortcut","componentDidMount","current","parentElement","addEventListener","componentWillUnmount","removeEventListener","e","ignoreClassNames","length","el","target","classList","ignoredClassName","find","className","contains","undefined","debug2","isContextActionEvent","concat","debug","i","keyboardAction","actionsDisabled","matchesEvent","result","stopPropagation","preventDefault","render","dataTestId","default","high","medium","low","global","edit"],"sources":["../../src/context-actions/ContextActions.tsx"],"sourcesContent":["/**\n * Just a simple utility class for displaying a popup menu.\n */\nimport React, { Component } from 'react';\nimport Log from '@deephaven/log';\nimport ContextActionUtils, {\n ResolvableContextAction,\n isPromise,\n} from './ContextActionUtils';\nimport type { ContextAction, ContextActionEvent } from './ContextActionUtils';\nimport GlobalContextActions from './GlobalContextActions';\nimport './ContextActions.scss';\n\nconst log = Log.module('ContextActions');\n\ninterface ContextActionsProps {\n actions: ResolvableContextAction | ResolvableContextAction[];\n ignoreClassNames?: string[];\n 'data-testid'?: string;\n}\n\ninterface ContextActionsState {\n globalActions: ContextAction[];\n keyboardActions: ContextAction[];\n}\n\n/**\n * ContextActions that you add onto any component.\n *\n * Usage:\n * let actions = [{\n * title: 'My Action', // Omit the title to hide it from the context menu\n * action: () => { alert('My Action Clicked!') }\n * actions: [] // Submenu of actions\n * icon: faPrint, // Limited to FontAwesome icons for now.\n * iconColor: '#ff0000, // Color to use for the icon\n * shortcut: Shortcut, // Defaults to null\n * isGlobal: false, // Global context action. Defaults to false.\n * group: ContextActions.groups.default, // What group to group the context action with\n * order: null, // Int where to order within group\n * disabled: true // disable action\n * menuElement: null // Custom menu element for displaying in context menu. When null, creates a default menu item based on title\n * }];\n *\n * <div>\n * Right click in this container\n * <ContextActions actions={actions}/>\n * </div>\n *\n * Right clicking the container will then build the context menu, bubbling up until an element with a ContextMenuRoot is on it.\n * You should generally have a ContextMenuRoot on the root node of your document.\n */\nclass ContextActions extends Component<\n ContextActionsProps,\n ContextActionsState\n> {\n /**\n * Group you can assign to context menu actions to group them together.\n * Lower group IDs appear at the top of the list.\n * Groups are separated by a separator item.\n * Items within groups are ordered by their order property, then by their title.\n */\n static groups = {\n default: null,\n high: 100,\n medium: 5000,\n low: 10000,\n global: 100000,\n\n edit: 100,\n };\n\n static triggerMenu(\n element: Element,\n clientX: number,\n clientY: number,\n actions: ContextAction[]\n ): void {\n if (!element || !clientX || !clientY || !actions) {\n return;\n }\n\n const mouseEvent: Partial<ContextActionEvent> = new MouseEvent(\n 'contextmenu',\n {\n clientX,\n clientY,\n bubbles: true,\n cancelable: true,\n }\n );\n mouseEvent.contextActions = actions;\n\n element.dispatchEvent(mouseEvent as ContextActionEvent);\n }\n\n constructor(props: ContextActionsProps) {\n super(props);\n\n this.handleContextMenu = this.handleContextMenu.bind(this);\n this.handleKeyDown = this.handleKeyDown.bind(this);\n\n this.container = React.createRef();\n\n this.state = { globalActions: [], keyboardActions: [] };\n }\n\n static getDerivedStateFromProps(\n props: ContextActionsProps\n ): ContextActionsState {\n if (!props.actions || !Array.isArray(props.actions)) {\n return { globalActions: [], keyboardActions: [] };\n }\n const globalActions = props.actions.filter(\n action =>\n !isPromise(action) && typeof action !== 'function' && action.isGlobal\n ) as ContextAction[];\n const keyboardActions = props.actions.filter(\n action =>\n !isPromise(action) &&\n typeof action !== 'function' &&\n !action.isGlobal &&\n action.shortcut != null\n ) as ContextAction[];\n\n return { globalActions, keyboardActions };\n }\n\n componentDidMount(): void {\n if (this.container.current?.parentElement) {\n this.container.current.parentElement.addEventListener(\n 'contextmenu',\n this.handleContextMenu\n );\n this.container.current.parentElement.addEventListener(\n 'keydown',\n this.handleKeyDown\n );\n }\n }\n\n componentWillUnmount(): void {\n if (this.container.current?.parentElement) {\n this.container.current.parentElement.removeEventListener(\n 'contextmenu',\n this.handleContextMenu\n );\n this.container.current.parentElement.removeEventListener(\n 'keydown',\n this.handleKeyDown\n );\n }\n }\n\n container: React.RefObject<HTMLDivElement>;\n\n handleContextMenu(e: MouseEvent): void {\n const { ignoreClassNames = [] } = this.props;\n if (ignoreClassNames.length > 0) {\n let el = e.target as Element | null;\n while (el != null) {\n const { classList } = el;\n const ignoredClassName = ignoreClassNames.find(className =>\n classList.contains(className)\n );\n if (ignoredClassName !== undefined) {\n log.debug2(\n `Contextmenu event ignored based on the target className \"${ignoredClassName}\"`\n );\n return;\n }\n el = el.parentElement;\n }\n }\n if (!ContextActionUtils.isContextActionEvent(e)) {\n (e as ContextActionEvent).contextActions = [];\n }\n\n if (!ContextActionUtils.isContextActionEvent(e)) {\n return;\n }\n\n const { actions } = this.props;\n if (actions) {\n let contextActions = actions;\n if (Array.isArray(contextActions)) {\n contextActions = contextActions.filter(\n action =>\n isPromise(action) ||\n typeof action === 'function' ||\n !action.isGlobal\n );\n }\n\n e.contextActions = e.contextActions.concat(contextActions);\n }\n\n log.debug(\n 'Received context menu event! Menu items are now: ',\n e.contextActions\n );\n }\n\n handleKeyDown(e: KeyboardEvent): void {\n const { keyboardActions } = this.state;\n for (let i = 0; i < keyboardActions.length; i += 1) {\n const keyboardAction = keyboardActions[i];\n if (\n !ContextActionUtils.actionsDisabled &&\n keyboardAction.shortcut?.matchesEvent(e)\n ) {\n log.debug('Context hotkey matched!', e);\n\n const result = keyboardAction.action?.(e);\n\n if (result || result === undefined) {\n e.stopPropagation();\n e.preventDefault();\n return;\n }\n\n log.debug2('Matched hotkey returned false, key event not consumed');\n }\n }\n }\n\n render(): JSX.Element {\n const { 'data-testid': dataTestId } = this.props;\n const { globalActions } = this.state;\n return (\n <div\n className=\"context-actions-listener\"\n ref={this.container}\n data-testid={dataTestId}\n >\n <GlobalContextActions actions={globalActions} />\n </div>\n );\n }\n}\n\nexport default ContextActions;\n"],"mappings":";;AAAA;AACA;AACA;AACA,OAAOA,KAAP,IAAgBC,SAAhB,QAAiC,OAAjC;AACA,OAAOC,GAAP,MAAgB,gBAAhB;OACOC,kB,IAELC,S;OAGKC,oB;;AAGP,IAAMC,GAAG,GAAGJ,GAAG,CAACK,MAAJ,CAAW,gBAAX,CAAZ;;AAaA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAMC,cAAN,SAA6BP,SAA7B,CAGE;EACA;AACF;AACA;AACA;AACA;AACA;EAWoB,OAAXQ,WAAW,CAChBC,OADgB,EAEhBC,OAFgB,EAGhBC,OAHgB,EAIhBC,OAJgB,EAKV;IACN,IAAI,CAACH,OAAD,IAAY,CAACC,OAAb,IAAwB,CAACC,OAAzB,IAAoC,CAACC,OAAzC,EAAkD;MAChD;IACD;;IAED,IAAMC,UAAuC,GAAG,IAAIC,UAAJ,CAC9C,aAD8C,EAE9C;MACEJ,OADF;MAEEC,OAFF;MAGEI,OAAO,EAAE,IAHX;MAIEC,UAAU,EAAE;IAJd,CAF8C,CAAhD;IASAH,UAAU,CAACI,cAAX,GAA4BL,OAA5B;IAEAH,OAAO,CAACS,aAAR,CAAsBL,UAAtB;EACD;;EAEDM,WAAW,CAACC,KAAD,EAA6B;IACtC,MAAMA,KAAN;;IADsC;;IAGtC,KAAKC,iBAAL,GAAyB,KAAKA,iBAAL,CAAuBC,IAAvB,CAA4B,IAA5B,CAAzB;IACA,KAAKC,aAAL,GAAqB,KAAKA,aAAL,CAAmBD,IAAnB,CAAwB,IAAxB,CAArB;IAEA,KAAKE,SAAL,gBAAiBzB,KAAK,CAAC0B,SAAN,EAAjB;IAEA,KAAKC,KAAL,GAAa;MAAEC,aAAa,EAAE,EAAjB;MAAqBC,eAAe,EAAE;IAAtC,CAAb;EACD;;EAE8B,OAAxBC,wBAAwB,CAC7BT,KAD6B,EAER;IACrB,IAAI,CAACA,KAAK,CAACR,OAAP,IAAkB,CAACkB,KAAK,CAACC,OAAN,CAAcX,KAAK,CAACR,OAApB,CAAvB,EAAqD;MACnD,OAAO;QAAEe,aAAa,EAAE,EAAjB;QAAqBC,eAAe,EAAE;MAAtC,CAAP;IACD;;IACD,IAAMD,aAAa,GAAGP,KAAK,CAACR,OAAN,CAAcoB,MAAd,CACpBC,MAAM,IACJ,CAAC9B,SAAS,CAAC8B,MAAD,CAAV,IAAsB,OAAOA,MAAP,KAAkB,UAAxC,IAAsDA,MAAM,CAACC,QAF3C,CAAtB;IAIA,IAAMN,eAAe,GAAGR,KAAK,CAACR,OAAN,CAAcoB,MAAd,CACtBC,MAAM,IACJ,CAAC9B,SAAS,CAAC8B,MAAD,CAAV,IACA,OAAOA,MAAP,KAAkB,UADlB,IAEA,CAACA,MAAM,CAACC,QAFR,IAGAD,MAAM,CAACE,QAAP,IAAmB,IALC,CAAxB;IAQA,OAAO;MAAER,aAAF;MAAiBC;IAAjB,CAAP;EACD;;EAEDQ,iBAAiB,GAAS;IAAA;;IACxB,6BAAI,KAAKZ,SAAL,CAAea,OAAnB,kDAAI,sBAAwBC,aAA5B,EAA2C;MACzC,KAAKd,SAAL,CAAea,OAAf,CAAuBC,aAAvB,CAAqCC,gBAArC,CACE,aADF,EAEE,KAAKlB,iBAFP;MAIA,KAAKG,SAAL,CAAea,OAAf,CAAuBC,aAAvB,CAAqCC,gBAArC,CACE,SADF,EAEE,KAAKhB,aAFP;IAID;EACF;;EAEDiB,oBAAoB,GAAS;IAAA;;IAC3B,8BAAI,KAAKhB,SAAL,CAAea,OAAnB,mDAAI,uBAAwBC,aAA5B,EAA2C;MACzC,KAAKd,SAAL,CAAea,OAAf,CAAuBC,aAAvB,CAAqCG,mBAArC,CACE,aADF,EAEE,KAAKpB,iBAFP;MAIA,KAAKG,SAAL,CAAea,OAAf,CAAuBC,aAAvB,CAAqCG,mBAArC,CACE,SADF,EAEE,KAAKlB,aAFP;IAID;EACF;;EAIDF,iBAAiB,CAACqB,CAAD,EAAsB;IACrC,IAAM;MAAEC,gBAAgB,GAAG;IAArB,IAA4B,KAAKvB,KAAvC;;IACA,IAAIuB,gBAAgB,CAACC,MAAjB,GAA0B,CAA9B,EAAiC;MAC/B,IAAIC,EAAE,GAAGH,CAAC,CAACI,MAAX;;MAD+B;QAG7B,IAAM;UAAEC;QAAF,IAAgBF,EAAtB;QACA,IAAMG,gBAAgB,GAAGL,gBAAgB,CAACM,IAAjB,CAAsBC,SAAS,IACtDH,SAAS,CAACI,QAAV,CAAmBD,SAAnB,CADuB,CAAzB;;QAGA,IAAIF,gBAAgB,KAAKI,SAAzB,EAAoC;UAClC/C,GAAG,CAACgD,MAAJ,qEAC8DL,gBAD9D;UAGA;YAAA;UAAA;QACD;;QACDH,EAAE,GAAGA,EAAE,CAACP,aAAR;MAb6B;;MAE/B,OAAOO,EAAE,IAAI,IAAb,EAAmB;QAAA;;QAAA;MAYlB;IACF;;IACD,IAAI,CAAC3C,kBAAkB,CAACoD,oBAAnB,CAAwCZ,CAAxC,CAAL,EAAiD;MAC9CA,CAAD,CAA0BzB,cAA1B,GAA2C,EAA3C;IACD;;IAED,IAAI,CAACf,kBAAkB,CAACoD,oBAAnB,CAAwCZ,CAAxC,CAAL,EAAiD;MAC/C;IACD;;IAED,IAAM;MAAE9B;IAAF,IAAc,KAAKQ,KAAzB;;IACA,IAAIR,OAAJ,EAAa;MACX,IAAIK,cAAc,GAAGL,OAArB;;MACA,IAAIkB,KAAK,CAACC,OAAN,CAAcd,cAAd,CAAJ,EAAmC;QACjCA,cAAc,GAAGA,cAAc,CAACe,MAAf,CACfC,MAAM,IACJ9B,SAAS,CAAC8B,MAAD,CAAT,IACA,OAAOA,MAAP,KAAkB,UADlB,IAEA,CAACA,MAAM,CAACC,QAJK,CAAjB;MAMD;;MAEDQ,CAAC,CAACzB,cAAF,GAAmByB,CAAC,CAACzB,cAAF,CAAiBsC,MAAjB,CAAwBtC,cAAxB,CAAnB;IACD;;IAEDZ,GAAG,CAACmD,KAAJ,CACE,mDADF,EAEEd,CAAC,CAACzB,cAFJ;EAID;;EAEDM,aAAa,CAACmB,CAAD,EAAyB;IACpC,IAAM;MAAEd;IAAF,IAAsB,KAAKF,KAAjC;;IACA,KAAK,IAAI+B,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAG7B,eAAe,CAACgB,MAApC,EAA4Ca,CAAC,IAAI,CAAjD,EAAoD;MAAA;;MAClD,IAAMC,cAAc,GAAG9B,eAAe,CAAC6B,CAAD,CAAtC;;MACA,IACE,CAACvD,kBAAkB,CAACyD,eAApB,6BACAD,cAAc,CAACvB,QADf,kDACA,sBAAyByB,YAAzB,CAAsClB,CAAtC,CAFF,EAGE;QAAA;;QACArC,GAAG,CAACmD,KAAJ,CAAU,yBAAV,EAAqCd,CAArC;QAEA,IAAMmB,MAAM,4BAAGH,cAAc,CAACzB,MAAlB,0DAAG,2BAAAyB,cAAc,EAAUhB,CAAV,CAA7B;;QAEA,IAAImB,MAAM,IAAIA,MAAM,KAAKT,SAAzB,EAAoC;UAClCV,CAAC,CAACoB,eAAF;UACApB,CAAC,CAACqB,cAAF;UACA;QACD;;QAED1D,GAAG,CAACgD,MAAJ,CAAW,uDAAX;MACD;IACF;EACF;;EAEDW,MAAM,GAAgB;IACpB,IAAM;MAAE,eAAeC;IAAjB,IAAgC,KAAK7C,KAA3C;IACA,IAAM;MAAEO;IAAF,IAAoB,KAAKD,KAA/B;IACA,oBACE;MACE,SAAS,EAAC,0BADZ;MAEE,GAAG,EAAE,KAAKF,SAFZ;MAGE,eAAayC;IAHf,gBAKE,oBAAC,oBAAD;MAAsB,OAAO,EAAEtC;IAA/B,EALF,CADF;EASD;;AAvLD;;gBAHIpB,c,YAUY;EACd2D,OAAO,EAAE,IADK;EAEdC,IAAI,EAAE,GAFQ;EAGdC,MAAM,EAAE,IAHM;EAIdC,GAAG,EAAE,KAJS;EAKdC,MAAM,EAAE,MALM;EAOdC,IAAI,EAAE;AAPQ,C;;AAmLlB,eAAehE,cAAf"}