@deephaven/components 0.51.0 → 0.51.1-alpha-theme-fix.3

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 (93) hide show
  1. package/dist/AutoCompleteInput.d.ts +2 -2
  2. package/dist/AutoCompleteInput.d.ts.map +1 -1
  3. package/dist/AutoCompleteInput.js.map +1 -1
  4. package/dist/ComboBox.d.ts +2 -2
  5. package/dist/ComboBox.d.ts.map +1 -1
  6. package/dist/ComboBox.js.map +1 -1
  7. package/dist/CustomTimeSelect.d.ts +3 -3
  8. package/dist/CustomTimeSelect.d.ts.map +1 -1
  9. package/dist/CustomTimeSelect.js.map +1 -1
  10. package/dist/DateInput.d.ts +3 -3
  11. package/dist/DateInput.d.ts.map +1 -1
  12. package/dist/DateInput.js.map +1 -1
  13. package/dist/DateTimeInput.d.ts +4 -4
  14. package/dist/DateTimeInput.d.ts.map +1 -1
  15. package/dist/DateTimeInput.js.map +1 -1
  16. package/dist/DebouncedSearchInput.d.ts +1 -1
  17. package/dist/DebouncedSearchInput.d.ts.map +1 -1
  18. package/dist/DebouncedSearchInput.js.map +1 -1
  19. package/dist/DragUtils.d.ts +3 -3
  20. package/dist/DragUtils.d.ts.map +1 -1
  21. package/dist/DragUtils.js.map +1 -1
  22. package/dist/DraggableItemList.d.ts +1 -1
  23. package/dist/DraggableItemList.d.ts.map +1 -1
  24. package/dist/DraggableItemList.js.map +1 -1
  25. package/dist/EditableItemList.js.map +1 -1
  26. package/dist/HierarchicalCheckboxMenu.d.ts +1 -1
  27. package/dist/HierarchicalCheckboxMenu.d.ts.map +1 -1
  28. package/dist/HierarchicalCheckboxMenu.js.map +1 -1
  29. package/dist/ItemList.d.ts +4 -4
  30. package/dist/ItemList.d.ts.map +1 -1
  31. package/dist/ItemList.js +6 -6
  32. package/dist/ItemList.js.map +1 -1
  33. package/dist/ItemListItem.d.ts +13 -13
  34. package/dist/ItemListItem.d.ts.map +1 -1
  35. package/dist/ItemListItem.js.map +1 -1
  36. package/dist/MaskedInput.d.ts +5 -5
  37. package/dist/MaskedInput.d.ts.map +1 -1
  38. package/dist/MaskedInput.js.map +1 -1
  39. package/dist/SelectValueList.d.ts +2 -2
  40. package/dist/SelectValueList.d.ts.map +1 -1
  41. package/dist/SelectValueList.js.map +1 -1
  42. package/dist/TimeInput.d.ts +4 -4
  43. package/dist/TimeInput.d.ts.map +1 -1
  44. package/dist/TimeInput.js.map +1 -1
  45. package/dist/TimeSlider.d.ts +2 -2
  46. package/dist/TimeSlider.d.ts.map +1 -1
  47. package/dist/TimeSlider.js.map +1 -1
  48. package/dist/context-actions/ContextActionUtils.d.ts +1 -1
  49. package/dist/context-actions/ContextActionUtils.d.ts.map +1 -1
  50. package/dist/context-actions/ContextActionUtils.js +4 -4
  51. package/dist/context-actions/ContextActionUtils.js.map +1 -1
  52. package/dist/context-actions/ContextMenu.d.ts +4 -4
  53. package/dist/context-actions/ContextMenu.d.ts.map +1 -1
  54. package/dist/context-actions/ContextMenu.js +1 -1
  55. package/dist/context-actions/ContextMenu.js.map +1 -1
  56. package/dist/context-actions/ContextMenuItem.d.ts +4 -4
  57. package/dist/context-actions/ContextMenuItem.d.ts.map +1 -1
  58. package/dist/context-actions/ContextMenuItem.js.map +1 -1
  59. package/dist/declaration.d.js.map +1 -1
  60. package/dist/menu-actions/DropdownMenu.d.ts +2 -2
  61. package/dist/menu-actions/DropdownMenu.d.ts.map +1 -1
  62. package/dist/menu-actions/DropdownMenu.js.map +1 -1
  63. package/dist/menu-actions/Menu.d.ts +3 -3
  64. package/dist/menu-actions/Menu.d.ts.map +1 -1
  65. package/dist/menu-actions/Menu.js +1 -1
  66. package/dist/menu-actions/Menu.js.map +1 -1
  67. package/dist/theme/theme-dark/index.d.ts +14 -1
  68. package/dist/theme/theme-dark/index.d.ts.map +1 -1
  69. package/dist/theme/theme-dark/index.js +19 -6
  70. package/dist/theme/theme-dark/index.js.map +1 -1
  71. package/dist/theme/theme-dark/theme-dark-components.css +1 -8
  72. package/dist/theme/theme-dark/theme-dark-components.css.map +1 -1
  73. package/dist/theme/theme-dark/theme-dark-palette.css +1 -290
  74. package/dist/theme/theme-dark/theme-dark-palette.css.map +1 -1
  75. package/dist/theme/theme-dark/theme-dark-semantic-editor.css +1 -62
  76. package/dist/theme/theme-dark/theme-dark-semantic-editor.css.map +1 -1
  77. package/dist/theme/theme-dark/theme-dark-semantic-grid.css +1 -84
  78. package/dist/theme/theme-dark/theme-dark-semantic-grid.css.map +1 -1
  79. package/dist/theme/theme-dark/theme-dark-semantic.css +1 -122
  80. package/dist/theme/theme-dark/theme-dark-semantic.css.map +1 -1
  81. package/dist/theme/theme-light/index.d.ts +37 -0
  82. package/dist/theme/theme-light/index.d.ts.map +1 -1
  83. package/dist/theme/theme-light/index.js +38 -1
  84. package/dist/theme/theme-light/index.js.map +1 -1
  85. package/dist/theme/theme-light/theme-light-palette.css +1 -53
  86. package/dist/theme/theme-light/theme-light-palette.css.map +1 -1
  87. package/dist/theme/theme-spectrum/theme-spectrum-alias.module.css +1 -192
  88. package/dist/theme/theme-spectrum/theme-spectrum-alias.module.css.map +1 -1
  89. package/dist/theme/theme-spectrum/theme-spectrum-overrides.module.css +1 -7
  90. package/dist/theme/theme-spectrum/theme-spectrum-overrides.module.css.map +1 -1
  91. package/dist/theme/theme-spectrum/theme-spectrum-palette.module.css +1 -211
  92. package/dist/theme/theme-spectrum/theme-spectrum-palette.module.css.map +1 -1
  93. package/package.json +10 -9
@@ -1 +1 @@
1
- {"version":3,"file":"SelectValueList.js","names":["React","PureComponent","classNames","memoize","Checkbox","jsx","_jsx","SelectValueList","constructor","props","_defineProperty","itemIndex","key","value","displayValue","rowHeight","isSelected","disabled","style","height","text","className","tabIndex","children","checked","onChange","handleSelect","max","items","offset","itemElements","i","length","item","element","getCachedItem","push","handleBlur","bind","handleScroll","list","createRef","topRow","bottomRow","componentDidMount","sendViewportUpdate","componentDidUpdate","e","relatedTarget","current","HTMLElement","contains","onBlur","onSelect","visibleItemIndex","clientHeight","onViewportChange","top","scrollTop","bottom","Math","floor","ceil","getElement","elements","querySelectorAll","scrollIntoView","index","block","render","isInvalid","itemCount","dataTestId","getCachedItems","onScroll","ref","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 | JSX.Element;\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 onBlur?: React.FocusEventHandler<Element>;\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 onBlur: (): void => undefined,\n 'data-testid': undefined,\n };\n\n constructor(props: SelectValueListProps<T>) {\n super(props);\n\n this.handleBlur = this.handleBlur.bind(this);\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 | JSX.Element | 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 // Tab index is needed so the item could be a related target in the blur event details\n <li className=\"value-list-item\" style={style} key={key} tabIndex={-1}>\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 handleBlur(e: React.FocusEvent): void {\n if (\n !e.relatedTarget ||\n (this.list.current &&\n e.relatedTarget instanceof HTMLElement &&\n !this.list.current.contains(e.relatedTarget))\n ) {\n // Next focused element is outside of the list\n const { onBlur } = this.props;\n onBlur?.(e);\n }\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 getElement(itemIndex: number): Element | null {\n if (this.list.current == null) {\n return null;\n }\n const elements = this.list.current.querySelectorAll('.value-list-item');\n return elements[itemIndex];\n }\n\n scrollIntoView(index: number): void {\n const element = this.getElement(index);\n element?.scrollIntoView({ block: 'center' });\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 onBlur={this.handleBlur}\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
+ {"version":3,"file":"SelectValueList.js","names":["React","PureComponent","classNames","memoize","Checkbox","jsx","_jsx","SelectValueList","constructor","props","_defineProperty","itemIndex","key","value","displayValue","rowHeight","isSelected","disabled","style","height","text","className","tabIndex","children","checked","onChange","handleSelect","max","items","offset","itemElements","i","length","item","element","getCachedItem","push","handleBlur","bind","handleScroll","list","createRef","topRow","bottomRow","componentDidMount","sendViewportUpdate","componentDidUpdate","e","relatedTarget","current","HTMLElement","contains","onBlur","onSelect","visibleItemIndex","clientHeight","onViewportChange","top","scrollTop","bottom","Math","floor","ceil","getElement","elements","querySelectorAll","scrollIntoView","index","block","render","isInvalid","itemCount","dataTestId","getCachedItems","onScroll","ref","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 | JSX.Element;\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 onBlur?: React.FocusEventHandler<Element>;\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 onBlur: (): void => undefined,\n 'data-testid': undefined,\n };\n\n constructor(props: SelectValueListProps<T>) {\n super(props);\n\n this.handleBlur = this.handleBlur.bind(this);\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 | JSX.Element | 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 // Tab index is needed so the item could be a related target in the blur event details\n <li className=\"value-list-item\" style={style} key={key} tabIndex={-1}>\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 handleBlur(e: React.FocusEvent): void {\n if (\n !e.relatedTarget ||\n (this.list.current &&\n e.relatedTarget instanceof HTMLElement &&\n !this.list.current.contains(e.relatedTarget))\n ) {\n // Next focused element is outside of the list\n const { onBlur } = this.props;\n onBlur?.(e);\n }\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 getElement(itemIndex: number): Element | null {\n if (this.list.current == null) {\n return null;\n }\n const elements = this.list.current.querySelectorAll('.value-list-item');\n return elements[itemIndex];\n }\n\n scrollIntoView(index: number): void {\n const element = this.getElement(index);\n element?.scrollIntoView({ block: 'center' });\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 onBlur={this.handleBlur}\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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"}
@@ -4,11 +4,11 @@ export type { SelectionSegment } from './MaskedInput';
4
4
  type TimeInputProps = {
5
5
  allowValueWrapping?: boolean;
6
6
  className?: string;
7
- onChange?(timeInSec: number): void;
8
- onSelect?(selection: SelectionSegment): void;
7
+ onChange?: (timeInSec: number) => void;
8
+ onSelect?: (selection: SelectionSegment) => void;
9
9
  value?: number;
10
- onFocus?(): void;
11
- onBlur?(): void;
10
+ onFocus?: () => void;
11
+ onBlur?: () => void;
12
12
  'data-testid'?: string;
13
13
  };
14
14
  export type TimeInputElement = {
@@ -1 +1 @@
1
- {"version":3,"file":"TimeInput.d.ts","sourceRoot":"","sources":["../src/TimeInput.tsx"],"names":[],"mappings":"AAAA,OAAO,KAMN,MAAM,OAAO,CAAC;AAGf,OAAoB,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAG9D,YAAY,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAOtD,KAAK,cAAc,GAAG;IACpB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,CAAC,SAAS,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAC7C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,IAAI,IAAI,CAAC;IACjB,MAAM,CAAC,IAAI,IAAI,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,YAAY,EAAE,CAAC,YAAY,EAAE,gBAAgB,KAAK,IAAI,CAAC;CACxD,CAAC;AAKF,QAAA,MAAM,SAAS,yFAmHd,CAAC;AAaF,eAAe,SAAS,CAAC"}
1
+ {"version":3,"file":"TimeInput.d.ts","sourceRoot":"","sources":["../src/TimeInput.tsx"],"names":[],"mappings":"AAAA,OAAO,KAMN,MAAM,OAAO,CAAC;AAGf,OAAoB,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAG9D,YAAY,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAOtD,KAAK,cAAc,GAAG;IACpB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,QAAQ,CAAC,EAAE,CAAC,SAAS,EAAE,gBAAgB,KAAK,IAAI,CAAC;IACjD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,YAAY,EAAE,CAAC,YAAY,EAAE,gBAAgB,KAAK,IAAI,CAAC;CACxD,CAAC;AAKF,QAAA,MAAM,SAAS,yFAmHd,CAAC;AAaF,eAAe,SAAS,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"TimeInput.js","names":["React","useCallback","useEffect","useImperativeHandle","useRef","useState","Log","TimeUtils","MaskedInput","DEFAULT_GET_PREFERRED_REPLACEMENT_STRING","jsx","_jsx","log","module","TIME_PATTERN","EXAMPLES","TimeInput","forwardRef","props","ref","allowValueWrapping","className","onChange","value","propsValue","onFocus","onBlur","onSelect","dataTestId","setValue","formatTime","selection","setSelection","inputRef","focus","_inputRef$current","current","newSelection","_inputRef$current2","setFormattedTime","getNextSegmentValue","range","delta","segmentValue","maxValue","selectionStart","newSegmentValue","parseInt","Number","isNaN","Math","min","max","concat","padStart","getPreferredReplacementString","replaceValue","replaceIndex","newChar","selectionEnd","substring","handleChange","newValue","debug","isTimeString","parseTime","handleSelect","example","pattern","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, { SelectionSegment } from './MaskedInput';\nimport { DEFAULT_GET_PREFERRED_REPLACEMENT_STRING } from './MaskedInputUtils';\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 ): string {\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
+ {"version":3,"file":"TimeInput.js","names":["React","useCallback","useEffect","useImperativeHandle","useRef","useState","Log","TimeUtils","MaskedInput","DEFAULT_GET_PREFERRED_REPLACEMENT_STRING","jsx","_jsx","log","module","TIME_PATTERN","EXAMPLES","TimeInput","forwardRef","props","ref","allowValueWrapping","className","onChange","value","propsValue","onFocus","onBlur","onSelect","dataTestId","setValue","formatTime","selection","setSelection","inputRef","focus","_inputRef$current","current","newSelection","_inputRef$current2","setFormattedTime","getNextSegmentValue","range","delta","segmentValue","maxValue","selectionStart","newSegmentValue","parseInt","Number","isNaN","Math","min","max","concat","padStart","getPreferredReplacementString","replaceValue","replaceIndex","newChar","selectionEnd","substring","handleChange","newValue","debug","isTimeString","parseTime","handleSelect","example","pattern","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, { SelectionSegment } from './MaskedInput';\nimport { DEFAULT_GET_PREFERRED_REPLACEMENT_STRING } from './MaskedInputUtils';\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 ): string {\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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"}
@@ -3,10 +3,10 @@ import './TimeSlider.scss';
3
3
  type TimeSliderProps = {
4
4
  startTime: number;
5
5
  endTime: number;
6
- onChange(value: {
6
+ onChange: (value: {
7
7
  startTime: number;
8
8
  endTime: number;
9
- }): void;
9
+ }) => void;
10
10
  isStartModified?: boolean;
11
11
  isEndModified?: boolean;
12
12
  'data-testid'?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"TimeSlider.d.ts","sourceRoot":"","sources":["../src/TimeSlider.tsx"],"names":[],"mappings":";AAaA,OAAO,mBAAmB,CAAC;AAO3B,KAAK,eAAe,GAAG;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,KAAK,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAC9D,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF;;;GAGG;AACH,iBAAS,UAAU,CAAC,EAClB,SAAS,EAAE,aAAa,EACxB,OAAO,EAAE,WAAW,EACpB,QAAQ,EACR,eAAuB,EACvB,aAAqB,EACrB,aAAa,EAAE,UAAU,GAC1B,EAAE,eAAe,GAAG,GAAG,CAAC,OAAO,CAuF/B;AAwSD,eAAe,UAAU,CAAC"}
1
+ {"version":3,"file":"TimeSlider.d.ts","sourceRoot":"","sources":["../src/TimeSlider.tsx"],"names":[],"mappings":";AAaA,OAAO,mBAAmB,CAAC;AAO3B,KAAK,eAAe,GAAG;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,CAAC,KAAK,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IAClE,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF;;;GAGG;AACH,iBAAS,UAAU,CAAC,EAClB,SAAS,EAAE,aAAa,EACxB,OAAO,EAAE,WAAW,EACpB,QAAQ,EACR,eAAuB,EACvB,aAAqB,EACrB,aAAa,EAAE,UAAU,GAC1B,EAAE,eAAe,GAAG,GAAG,CAAC,OAAO,CAuF/B;AAwSD,eAAe,UAAU,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"TimeSlider.js","names":["React","useCallback","useMemo","useRef","useState","useEffect","classNames","TimeInput","StyleExports","jsx","_jsx","jsxs","_jsxs","Fragment","_Fragment","HANDLE_SIZE","parseInt","POPOVER_WIDTH","SECONDS_IN_DAY","SNAP_NEAREST_MINUTES","TimeSlider","_ref","startTime","propStartTime","endTime","propEndTime","onChange","isStartModified","isEndModified","dataTestId","setStartTime","setEndTime","track","setTimeOnPropTimeChange","updateTime","newStartTime","newEndTime","start","end","handleStartTimeChange","handleEndTimeChange","className","children","PopOvers","onStartTimeChange","onEndTimeChange","ref","TrackFills","Array","fill","map","value","index","Handle","time","setTime","concat","props","swapTimes","firstTime","setFirstTime","secondTime","setSecondTime","firstTimeRef","secondTimeRef","firstTimeSelectionRef","secondTimeSelectionRef","setFocusOnSwapTimesChange","current","_secondTimeRef$curren","setSelection","_firstTimeRef$current","onFirstTimeChange","onSecondTimeChange","onFirstTimeSelect","selection","onSecondTimeSelect","style","flexBasis","modified","allowValueWrapping","onSelect","undefined","transform","ONE_HOUR","handleOffset","calculatePositionAsTime","clientX","trackRect","getBoundingClientRect","leftEdge","Math","max","left","preciseTime","min","width","roundedTime","round","limitMax","handleMouseMove","_ref2","handleMouseUp","_ref3","window","removeEventListener","document","documentElement","classList","remove","startDragListening","addEventListener","add","stopDragListening","handleMouseDown","removeListenersOnUnmount","type","onMouseDown"],"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 */\nfunction 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\nfunction 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): void {\n if (startTime <= endTime) {\n onStartTimeChange(value);\n } else {\n onEndTimeChange(value);\n }\n }\n\n function onSecondTimeChange(value: number): void {\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={\n dataTestId !== undefined ? `${dataTestId}-input-1` : undefined\n }\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={\n dataTestId !== undefined ? `${dataTestId}-input-2` : undefined\n }\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 */\nfunction 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 */\nfunction 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
+ {"version":3,"file":"TimeSlider.js","names":["React","useCallback","useMemo","useRef","useState","useEffect","classNames","TimeInput","StyleExports","jsx","_jsx","jsxs","_jsxs","Fragment","_Fragment","HANDLE_SIZE","parseInt","POPOVER_WIDTH","SECONDS_IN_DAY","SNAP_NEAREST_MINUTES","TimeSlider","_ref","startTime","propStartTime","endTime","propEndTime","onChange","isStartModified","isEndModified","dataTestId","setStartTime","setEndTime","track","setTimeOnPropTimeChange","updateTime","newStartTime","newEndTime","start","end","handleStartTimeChange","handleEndTimeChange","className","children","PopOvers","onStartTimeChange","onEndTimeChange","ref","TrackFills","Array","fill","map","value","index","Handle","time","setTime","concat","props","swapTimes","firstTime","setFirstTime","secondTime","setSecondTime","firstTimeRef","secondTimeRef","firstTimeSelectionRef","secondTimeSelectionRef","setFocusOnSwapTimesChange","current","_secondTimeRef$curren","setSelection","_firstTimeRef$current","onFirstTimeChange","onSecondTimeChange","onFirstTimeSelect","selection","onSecondTimeSelect","style","flexBasis","modified","allowValueWrapping","onSelect","undefined","transform","ONE_HOUR","handleOffset","calculatePositionAsTime","clientX","trackRect","getBoundingClientRect","leftEdge","Math","max","left","preciseTime","min","width","roundedTime","round","limitMax","handleMouseMove","_ref2","handleMouseUp","_ref3","window","removeEventListener","document","documentElement","classList","remove","startDragListening","addEventListener","add","stopDragListening","handleMouseDown","removeListenersOnUnmount","type","onMouseDown"],"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 */\nfunction 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\nfunction 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): void {\n if (startTime <= endTime) {\n onStartTimeChange(value);\n } else {\n onEndTimeChange(value);\n }\n }\n\n function onSecondTimeChange(value: number): void {\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={\n dataTestId !== undefined ? `${dataTestId}-input-1` : undefined\n }\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={\n dataTestId !== undefined ? `${dataTestId}-input-2` : undefined\n }\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 */\nfunction 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 */\nfunction 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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"}
@@ -6,7 +6,7 @@ export type MenuItem = ContextAction | Promise<ContextAction[]>;
6
6
  export interface ContextAction {
7
7
  title?: string;
8
8
  description?: string;
9
- action?(event?: Event): void;
9
+ action?: (event: Event) => void;
10
10
  actions?: ResolvableContextAction[];
11
11
  icon?: IconDefinition | React.ReactElement;
12
12
  iconColor?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"ContextActionUtils.d.ts","sourceRoot":"","sources":["../../src/context-actions/ContextActionUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAE7C,MAAM,MAAM,uBAAuB,GAC/B,aAAa,GACb,OAAO,CAAC,aAAa,EAAE,CAAC,GACxB,CAAC,MAAM,OAAO,CAAC,aAAa,EAAE,CAAC,GAAG,aAAa,EAAE,GAAG,aAAa,CAAC,CAAC;AAEvE,MAAM,MAAM,QAAQ,GAAG,aAAa,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;AAEhE,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC;IAC7B,OAAO,CAAC,EAAE,uBAAuB,EAAE,CAAC;IACpC,IAAI,CAAC,EAAE,cAAc,GAAG,KAAK,CAAC,YAAY,CAAC;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,KAAK,CAAC,YAAY,CAAC;IACjC,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,kBAAmB,SAAQ,UAAU;IACpD,cAAc,EAAE,uBAAuB,EAAE,CAAC;CAC3C;AAED,wBAAgB,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,OAAO,CAAC,CAAC,CAAC,CAE1E;AAED,cAAM,kBAAkB;IACtB,MAAM,CAAC,eAAe,UAAS;IAE/B,MAAM,CAAC,iBAAiB,IAAI,IAAI;IAIhC,MAAM,CAAC,gBAAgB,IAAI,IAAI;IAI/B,MAAM,CAAC,oBAAoB,CAAC,CAAC,EAAE,UAAU,GAAG,CAAC,IAAI,kBAAkB;IAInE;;;;OAIG;IACH,MAAM,CAAC,cAAc,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,aAAa,GAAG,MAAM;IAoBjE;;;OAGG;IACH,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,aAAa,EAAE,GAAG,aAAa,EAAE;IAU7D,MAAM,CAAC,aAAa,IAAI,OAAO;IAK/B;;OAEG;IACH,MAAM,CAAC,cAAc,IAAI,SAAS,GAAG,SAAS;IAQ9C;;;OAGG;IACH,MAAM,CAAC,iBAAiB,CACtB,KAAK,EAAE,aAAa,GAAG,UAAU,GAAG,KAAK,CAAC,aAAa,GAAG,KAAK,CAAC,UAAU,GACzE,OAAO;IAKV;;;;OAIG;IACH,MAAM,CAAC,YAAY,CACjB,YAAY,EAAE,uBAAuB,GAAG,uBAAuB,EAAE,EACjE,eAAe,CAAC,EAAE,IAAI,GACrB,QAAQ,EAAE;IAGb,MAAM,CAAC,YAAY,CACjB,YAAY,EAAE,uBAAuB,GAAG,uBAAuB,EAAE,EACjE,eAAe,EAAE,KAAK,GACrB,aAAa,EAAE;IA+ClB;;;;;OAKG;IACH,MAAM,CAAC,eAAe,CACpB,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,EACb,SAAS,EAAE,QAAQ,EAAE,GACpB,MAAM;CAiBV;AAED,eAAe,kBAAkB,CAAC"}
1
+ {"version":3,"file":"ContextActionUtils.d.ts","sourceRoot":"","sources":["../../src/context-actions/ContextActionUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAE7C,MAAM,MAAM,uBAAuB,GAC/B,aAAa,GACb,OAAO,CAAC,aAAa,EAAE,CAAC,GACxB,CAAC,MAAM,OAAO,CAAC,aAAa,EAAE,CAAC,GAAG,aAAa,EAAE,GAAG,aAAa,CAAC,CAAC;AAEvE,MAAM,MAAM,QAAQ,GAAG,aAAa,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;AAEhE,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IAChC,OAAO,CAAC,EAAE,uBAAuB,EAAE,CAAC;IACpC,IAAI,CAAC,EAAE,cAAc,GAAG,KAAK,CAAC,YAAY,CAAC;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,KAAK,CAAC,YAAY,CAAC;IACjC,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,kBAAmB,SAAQ,UAAU;IACpD,cAAc,EAAE,uBAAuB,EAAE,CAAC;CAC3C;AAED,wBAAgB,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,OAAO,CAAC,CAAC,CAAC,CAE1E;AAED,cAAM,kBAAkB;IACtB,MAAM,CAAC,eAAe,UAAS;IAE/B,MAAM,CAAC,iBAAiB,IAAI,IAAI;IAIhC,MAAM,CAAC,gBAAgB,IAAI,IAAI;IAI/B,MAAM,CAAC,oBAAoB,CAAC,CAAC,EAAE,UAAU,GAAG,CAAC,IAAI,kBAAkB;IAInE;;;;OAIG;IACH,MAAM,CAAC,cAAc,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,aAAa,GAAG,MAAM;IAoBjE;;;OAGG;IACH,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,aAAa,EAAE,GAAG,aAAa,EAAE;IAU7D,MAAM,CAAC,aAAa,IAAI,OAAO;IAK/B;;OAEG;IACH,MAAM,CAAC,cAAc,IAAI,SAAS,GAAG,SAAS;IAQ9C;;;OAGG;IACH,MAAM,CAAC,iBAAiB,CACtB,KAAK,EAAE,aAAa,GAAG,UAAU,GAAG,KAAK,CAAC,aAAa,GAAG,KAAK,CAAC,UAAU,GACzE,OAAO;IAKV;;;;OAIG;IACH,MAAM,CAAC,YAAY,CACjB,YAAY,EAAE,uBAAuB,GAAG,uBAAuB,EAAE,EACjE,eAAe,CAAC,EAAE,IAAI,GACrB,QAAQ,EAAE;IAGb,MAAM,CAAC,YAAY,CACjB,YAAY,EAAE,uBAAuB,GAAG,uBAAuB,EAAE,EACjE,eAAe,EAAE,KAAK,GACrB,aAAa,EAAE;IA+ClB;;;;;OAKG;IACH,MAAM,CAAC,eAAe,CACpB,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,EACb,SAAS,EAAE,QAAQ,EAAE,GACpB,MAAM;CAiBV;AAED,eAAe,kBAAkB,CAAC"}
@@ -93,12 +93,12 @@ class ContextActionUtils {
93
93
  actions = [actions];
94
94
  }
95
95
  for (var i = 0; i < actions.length; i += 1) {
96
- var _action = actions[i];
96
+ var action = actions[i];
97
97
  var newMenuItems = void 0;
98
- if (typeof _action === 'function') {
99
- newMenuItems = _action();
98
+ if (typeof action === 'function') {
99
+ newMenuItems = action();
100
100
  } else {
101
- newMenuItems = _action;
101
+ newMenuItems = action;
102
102
  }
103
103
  if (newMenuItems != null) {
104
104
  if (newMenuItems instanceof Promise) {
@@ -1 +1 @@
1
- {"version":3,"file":"ContextActionUtils.js","names":["isPromise","value","then","undefined","ContextActionUtils","disableAllActions","actionsDisabled","enableAllActions","isContextActionEvent","e","Array","isArray","contextActions","compareActions","a","b","group","_a$group","_b$group","order","_a$order","_b$order","title","_a$title","_b$title","sortActions","actions","sortedActions","slice","sort","isMacPlatform","platform","window","navigator","startsWith","getModifierKey","isModifierKeyDown","event","modifierKey","getMenuItems","actionsParam","includePromises","arguments","length","menuItems","i","action","newMenuItems","Promise","push","concat","filter","menuElement","getNextMenuItem","startIndex","delta","firstIndex","menuIndex","item","disabled","_defineProperty"],"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?: Event): 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 == null || !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 * 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 !== undefined ||\n (action as Promise<ContextAction[]>).then != null ||\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
+ {"version":3,"file":"ContextActionUtils.js","names":["isPromise","value","then","undefined","ContextActionUtils","disableAllActions","actionsDisabled","enableAllActions","isContextActionEvent","e","Array","isArray","contextActions","compareActions","a","b","group","_a$group","_b$group","order","_a$order","_b$order","title","_a$title","_b$title","sortActions","actions","sortedActions","slice","sort","isMacPlatform","platform","window","navigator","startsWith","getModifierKey","isModifierKeyDown","event","modifierKey","getMenuItems","actionsParam","includePromises","arguments","length","menuItems","i","action","newMenuItems","Promise","push","concat","filter","menuElement","getNextMenuItem","startIndex","delta","firstIndex","menuIndex","item","disabled","_defineProperty"],"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: Event) => 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 == null || !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 * 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 !== undefined ||\n (action as Promise<ContextAction[]>).then != null ||\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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"}
@@ -4,13 +4,13 @@ import { ContextAction, ResolvableContextAction } from './ContextActionUtils';
4
4
  interface ContextMenuProps {
5
5
  top: number;
6
6
  left: number;
7
- updatePosition(top: number, left: number): void;
7
+ updatePosition: (top: number, left: number) => void;
8
8
  subMenuParentWidth: number;
9
9
  subMenuParentHeight: number;
10
10
  actions: ResolvableContextAction[];
11
- closeMenu(closeAll: boolean): void;
12
- onMenuClosed(menu: ContextMenu): void;
13
- onMenuOpened(menu: ContextMenu): void;
11
+ closeMenu: (closeAll: boolean) => void;
12
+ onMenuClosed: (menu: ContextMenu) => void;
13
+ onMenuOpened: (menu: ContextMenu) => void;
14
14
  options: {
15
15
  doNotVerifyPosition?: boolean;
16
16
  separateKeyboardMouse?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"ContextMenu.d.ts","sourceRoot":"","sources":["../../src/context-actions/ContextMenu.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ContextMenu.d.ts","sourceRoot":"","sources":["../../src/context-actions/ContextMenu.tsx"],"names":[],"mappings":"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"}
@@ -433,7 +433,7 @@ class ContextMenu extends PureComponent {
433
433
  if (menuItem.actions != null) {
434
434
  this.openSubMenu(menuItems.indexOf(menuItem));
435
435
  } else if (menuItem.action != null) {
436
- menuItem.action();
436
+ menuItem.action(e.nativeEvent);
437
437
  this.closeMenu(true);
438
438
  }
439
439
  }