@deephaven/components 0.11.9-beta.0 → 0.11.9

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 (166) hide show
  1. package/dist/AutoCompleteInput.d.ts +3 -0
  2. package/dist/AutoCompleteInput.d.ts.map +1 -1
  3. package/dist/AutoCompleteInput.js +8 -4
  4. package/dist/AutoCompleteInput.js.map +1 -1
  5. package/dist/AutoResizeTextarea.d.ts +4 -1
  6. package/dist/AutoResizeTextarea.d.ts.map +1 -1
  7. package/dist/AutoResizeTextarea.js +8 -4
  8. package/dist/AutoResizeTextarea.js.map +1 -1
  9. package/dist/BasicModal.d.ts +1 -0
  10. package/dist/BasicModal.d.ts.map +1 -1
  11. package/dist/BasicModal.js +14 -7
  12. package/dist/BasicModal.js.map +1 -1
  13. package/dist/Button.d.ts +1 -1
  14. package/dist/ButtonGroup.d.ts +3 -0
  15. package/dist/ButtonGroup.d.ts.map +1 -1
  16. package/dist/ButtonGroup.js +8 -4
  17. package/dist/ButtonGroup.js.map +1 -1
  18. package/dist/CardFlip.d.ts +2 -1
  19. package/dist/CardFlip.d.ts.map +1 -1
  20. package/dist/CardFlip.js +4 -2
  21. package/dist/CardFlip.js.map +1 -1
  22. package/dist/Checkbox.d.ts +1 -0
  23. package/dist/Checkbox.d.ts.map +1 -1
  24. package/dist/Checkbox.js +8 -4
  25. package/dist/Checkbox.js.map +1 -1
  26. package/dist/Collapse.d.ts +3 -0
  27. package/dist/Collapse.d.ts.map +1 -1
  28. package/dist/Collapse.js +8 -4
  29. package/dist/Collapse.js.map +1 -1
  30. package/dist/ComboBox.d.ts +3 -0
  31. package/dist/ComboBox.d.ts.map +1 -1
  32. package/dist/ComboBox.js +10 -5
  33. package/dist/ComboBox.js.map +1 -1
  34. package/dist/CustomTimeSelect.d.ts +1 -0
  35. package/dist/CustomTimeSelect.d.ts.map +1 -1
  36. package/dist/CustomTimeSelect.js +6 -3
  37. package/dist/CustomTimeSelect.js.map +1 -1
  38. package/dist/DebouncedSearchInput.d.ts +2 -0
  39. package/dist/DebouncedSearchInput.d.ts.map +1 -1
  40. package/dist/DebouncedSearchInput.js +6 -3
  41. package/dist/DebouncedSearchInput.js.map +1 -1
  42. package/dist/DeephavenSpinner.d.ts +2 -1
  43. package/dist/DeephavenSpinner.d.ts.map +1 -1
  44. package/dist/DeephavenSpinner.js +4 -2
  45. package/dist/DeephavenSpinner.js.map +1 -1
  46. package/dist/DraggableItemList.d.ts +2 -0
  47. package/dist/DraggableItemList.d.ts.map +1 -1
  48. package/dist/DraggableItemList.js +6 -3
  49. package/dist/DraggableItemList.js.map +1 -1
  50. package/dist/HierarchicalCheckboxMenu.d.ts +1 -0
  51. package/dist/HierarchicalCheckboxMenu.d.ts.map +1 -1
  52. package/dist/HierarchicalCheckboxMenu.js +12 -6
  53. package/dist/HierarchicalCheckboxMenu.js.map +1 -1
  54. package/dist/ItemList.d.ts +2 -0
  55. package/dist/ItemList.d.ts.map +1 -1
  56. package/dist/ItemList.js +6 -3
  57. package/dist/ItemList.js.map +1 -1
  58. package/dist/ItemListItem.d.ts +2 -0
  59. package/dist/ItemListItem.d.ts.map +1 -1
  60. package/dist/ItemListItem.js +5 -2
  61. package/dist/ItemListItem.js.map +1 -1
  62. package/dist/LoadingOverlay.d.ts +2 -1
  63. package/dist/LoadingOverlay.d.ts.map +1 -1
  64. package/dist/LoadingOverlay.js +4 -2
  65. package/dist/LoadingOverlay.js.map +1 -1
  66. package/dist/LoadingSpinner.d.ts +2 -1
  67. package/dist/LoadingSpinner.d.ts.map +1 -1
  68. package/dist/LoadingSpinner.js +4 -2
  69. package/dist/LoadingSpinner.js.map +1 -1
  70. package/dist/MaskedInput.d.ts +1 -0
  71. package/dist/MaskedInput.d.ts.map +1 -1
  72. package/dist/MaskedInput.js +6 -3
  73. package/dist/MaskedInput.js.map +1 -1
  74. package/dist/Option.d.ts +2 -1
  75. package/dist/Option.d.ts.map +1 -1
  76. package/dist/Option.js +4 -2
  77. package/dist/Option.js.map +1 -1
  78. package/dist/RadioGroup.d.ts +1 -0
  79. package/dist/RadioGroup.d.ts.map +1 -1
  80. package/dist/RadioGroup.js +4 -2
  81. package/dist/RadioGroup.js.map +1 -1
  82. package/dist/SearchInput.d.ts +2 -0
  83. package/dist/SearchInput.d.ts.map +1 -1
  84. package/dist/SearchInput.js +6 -3
  85. package/dist/SearchInput.js.map +1 -1
  86. package/dist/Select.d.ts +2 -1
  87. package/dist/Select.d.ts.map +1 -1
  88. package/dist/Select.js +4 -2
  89. package/dist/Select.js.map +1 -1
  90. package/dist/SelectValueList.d.ts +2 -0
  91. package/dist/SelectValueList.d.ts.map +1 -1
  92. package/dist/SelectValueList.js +6 -3
  93. package/dist/SelectValueList.js.map +1 -1
  94. package/dist/SocketedButton.d.ts +1 -0
  95. package/dist/SocketedButton.d.ts.map +1 -1
  96. package/dist/SocketedButton.js +6 -3
  97. package/dist/SocketedButton.js.map +1 -1
  98. package/dist/TimeInput.d.ts +1 -0
  99. package/dist/TimeInput.d.ts.map +1 -1
  100. package/dist/TimeInput.js +6 -3
  101. package/dist/TimeInput.js.map +1 -1
  102. package/dist/TimeSlider.d.ts +2 -1
  103. package/dist/TimeSlider.d.ts.map +1 -1
  104. package/dist/TimeSlider.js +18 -9
  105. package/dist/TimeSlider.js.map +1 -1
  106. package/dist/ToastNotification.d.ts +2 -1
  107. package/dist/ToastNotification.d.ts.map +1 -1
  108. package/dist/ToastNotification.js +4 -2
  109. package/dist/ToastNotification.js.map +1 -1
  110. package/dist/UISwitch.d.ts +3 -2
  111. package/dist/UISwitch.d.ts.map +1 -1
  112. package/dist/UISwitch.js +4 -2
  113. package/dist/UISwitch.js.map +1 -1
  114. package/dist/context-actions/ContextActions.d.ts +1 -0
  115. package/dist/context-actions/ContextActions.d.ts.map +1 -1
  116. package/dist/context-actions/ContextActions.js +5 -1
  117. package/dist/context-actions/ContextActions.js.map +1 -1
  118. package/dist/context-actions/ContextMenu.d.ts +2 -0
  119. package/dist/context-actions/ContextMenu.d.ts.map +1 -1
  120. package/dist/context-actions/ContextMenu.js +6 -3
  121. package/dist/context-actions/ContextMenu.js.map +1 -1
  122. package/dist/context-actions/ContextMenuItem.d.ts +1 -0
  123. package/dist/context-actions/ContextMenuItem.d.ts.map +1 -1
  124. package/dist/context-actions/ContextMenuItem.js +10 -5
  125. package/dist/context-actions/ContextMenuItem.js.map +1 -1
  126. package/dist/context-actions/ContextMenuRoot.d.ts +3 -1
  127. package/dist/context-actions/ContextMenuRoot.d.ts.map +1 -1
  128. package/dist/context-actions/ContextMenuRoot.js +5 -1
  129. package/dist/context-actions/ContextMenuRoot.js.map +1 -1
  130. package/dist/context-actions/GlobalContextActions.d.ts +1 -0
  131. package/dist/context-actions/GlobalContextActions.d.ts.map +1 -1
  132. package/dist/context-actions/GlobalContextActions.js +4 -2
  133. package/dist/context-actions/GlobalContextActions.js.map +1 -1
  134. package/dist/menu-actions/DropdownMenu.d.ts +2 -0
  135. package/dist/menu-actions/DropdownMenu.d.ts.map +1 -1
  136. package/dist/menu-actions/DropdownMenu.js +6 -3
  137. package/dist/menu-actions/DropdownMenu.js.map +1 -1
  138. package/dist/menu-actions/Menu.d.ts +2 -0
  139. package/dist/menu-actions/Menu.d.ts.map +1 -1
  140. package/dist/menu-actions/Menu.js +7 -2
  141. package/dist/menu-actions/Menu.js.map +1 -1
  142. package/dist/navigation/Menu.d.ts +2 -1
  143. package/dist/navigation/Menu.d.ts.map +1 -1
  144. package/dist/navigation/Menu.js +4 -2
  145. package/dist/navigation/Menu.js.map +1 -1
  146. package/dist/navigation/MenuItem.d.ts +2 -1
  147. package/dist/navigation/MenuItem.d.ts.map +1 -1
  148. package/dist/navigation/MenuItem.js +4 -2
  149. package/dist/navigation/MenuItem.js.map +1 -1
  150. package/dist/navigation/Page.d.ts +2 -1
  151. package/dist/navigation/Page.d.ts.map +1 -1
  152. package/dist/navigation/Page.js +4 -2
  153. package/dist/navigation/Page.js.map +1 -1
  154. package/dist/navigation/Stack.d.ts +2 -1
  155. package/dist/navigation/Stack.d.ts.map +1 -1
  156. package/dist/navigation/Stack.js +4 -2
  157. package/dist/navigation/Stack.js.map +1 -1
  158. package/dist/popper/Popper.d.ts +3 -0
  159. package/dist/popper/Popper.d.ts.map +1 -1
  160. package/dist/popper/Popper.js +9 -3
  161. package/dist/popper/Popper.js.map +1 -1
  162. package/dist/popper/Tooltip.d.ts +2 -0
  163. package/dist/popper/Tooltip.d.ts.map +1 -1
  164. package/dist/popper/Tooltip.js +6 -3
  165. package/dist/popper/Tooltip.js.map +1 -1
  166. package/package.json +8 -8
package/dist/TimeInput.js CHANGED
@@ -15,7 +15,8 @@ var TimeInput = /*#__PURE__*/React.forwardRef((props, ref) => {
15
15
  onChange = () => false,
16
16
  value: propsValue = 0,
17
17
  onFocus = () => false,
18
- onBlur = () => false
18
+ onBlur = () => false,
19
+ 'data-testid': dataTestId
19
20
  } = props;
20
21
  var [value, setValue] = useState(TimeUtils.formatTime(propsValue));
21
22
  var [selection, setSelection] = useState();
@@ -74,7 +75,8 @@ var TimeInput = /*#__PURE__*/React.forwardRef((props, ref) => {
74
75
  selection: selection,
75
76
  value: value,
76
77
  onFocus: onFocus,
77
- onBlur: onBlur
78
+ onBlur: onBlur,
79
+ "data-testid": dataTestId
78
80
  });
79
81
  });
80
82
  TimeInput.defaultProps = {
@@ -83,7 +85,8 @@ TimeInput.defaultProps = {
83
85
  onChange: () => false,
84
86
  value: 0,
85
87
  onFocus: () => false,
86
- onBlur: () => false
88
+ onBlur: () => false,
89
+ 'data-testid': undefined
87
90
  };
88
91
  export default TimeInput;
89
92
  //# sourceMappingURL=TimeInput.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/TimeInput.tsx"],"names":["React","useEffect","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","setValue","formatTime","selection","setSelection","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","newSelection","defaultProps"],"mappings":"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","sourcesContent":["import React, { useEffect, useState } 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\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 value?: number;\n onFocus?(): void;\n onBlur?(): 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<HTMLInputElement, 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 } = props;\n const [value, setValue] = useState(TimeUtils.formatTime(propsValue));\n const [selection, setSelection] = useState<SelectionSegment>();\n useEffect(() => {\n setValue(TimeUtils.formatTime(propsValue));\n }, [propsValue]);\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 function handleSelect(newSelection: SelectionSegment) {\n setSelection(newSelection);\n }\n\n return (\n <MaskedInput\n ref={ref}\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 />\n );\n }\n);\n\nTimeInput.defaultProps = {\n allowValueWrapping: true,\n className: '',\n onChange: () => false,\n value: 0,\n onFocus: () => false,\n onBlur: () => false,\n};\n\nexport default TimeInput;\n"],"file":"TimeInput.js"}
1
+ {"version":3,"sources":["../src/TimeInput.tsx"],"names":["React","useEffect","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","dataTestId","setValue","formatTime","selection","setSelection","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","newSelection","defaultProps","undefined"],"mappings":"AAAA,OAAOA,KAAP,IAAgBC,SAAhB,EAA2BC,QAA3B,QAA2C,OAA3C;AACA,OAAOC,GAAP,MAAgB,gBAAhB;AACA,SAASC,SAAT,QAA0B,kBAA1B;OACOC,W,IACLC,wC;AAIF,IAAMC,GAAG,GAAGJ,GAAG,CAACK,MAAJ,CAAW,WAAX,CAAZ;AAEA,IAAMC,YAAY,GAAG,0CAArB;AACA,IAAMC,QAAQ,GAAG,CAAC,UAAD,EAAa,UAAb,EAAyB,UAAzB,CAAjB;AAYA;AACA;AACA;AACA,IAAMC,SAAS,gBAAGX,KAAK,CAACY,UAAN,CAChB,CAACC,KAAD,EAAwBC,GAAxB,KAAgC;AAC9B,MAAM;AACJC,IAAAA,kBAAkB,GAAG,IADjB;AAEJC,IAAAA,SAAS,GAAG,EAFR;AAGJC,IAAAA,QAAQ,GAAG,MAAM,KAHb;AAIJC,IAAAA,KAAK,EAAEC,UAAU,GAAG,CAJhB;AAKJC,IAAAA,OAAO,GAAG,MAAM,KALZ;AAMJC,IAAAA,MAAM,GAAG,MAAM,KANX;AAOJ,mBAAeC;AAPX,MAQFT,KARJ;AASA,MAAM,CAACK,KAAD,EAAQK,QAAR,IAAoBrB,QAAQ,CAACE,SAAS,CAACoB,UAAV,CAAqBL,UAArB,CAAD,CAAlC;AACA,MAAM,CAACM,SAAD,EAAYC,YAAZ,IAA4BxB,QAAQ,EAA1C;AACAD,EAAAA,SAAS,CAAC,MAAM;AACdsB,IAAAA,QAAQ,CAACnB,SAAS,CAACoB,UAAV,CAAqBL,UAArB,CAAD,CAAR;AACD,GAFQ,EAEN,CAACA,UAAD,CAFM,CAAT;;AAIA,WAASQ,mBAAT,CACEC,KADF,EAEEC,KAFF,EAGEC,YAHF,EAIU;AACR;AACA,QAAMC,QAAQ,GAAGH,KAAK,CAACI,cAAN,KAAyB,CAAzB,GAA6B,EAA7B,GAAkC,EAAnD;AACA,QAAIC,eAAe,GAAGC,QAAQ,CAACJ,YAAD,EAAe,EAAf,CAAR,GAA6BD,KAAnD;;AACA,QAAIM,MAAM,CAACC,KAAP,CAAaH,eAAb,CAAJ,EAAmC;AACjCA,MAAAA,eAAe,GAAG,CAAlB;AACD,KAFD,MAEO,IAAIlB,kBAAJ,EAAwB;AAC7B;AACAkB,MAAAA,eAAe,GAAG,CAAEA,eAAe,GAAGF,QAAnB,GAA+BA,QAAhC,IAA4CA,QAA9D;AACD,KAHM,MAGA;AACLE,MAAAA,eAAe,GAAGI,IAAI,CAACC,GAAL,CAASD,IAAI,CAACE,GAAL,CAAS,CAAT,EAAYN,eAAZ,CAAT,EAAuCF,QAAQ,GAAG,CAAlD,CAAlB;AACD;;AACD,WAAO,UAAGE,eAAH,EAAqBO,QAArB,CAA8B,CAA9B,EAAiC,GAAjC,CAAP;AACD;;AAED,WAASC,6BAAT,CACEC,YADF,EAEEC,YAFF,EAGEC,OAHF,EAIEZ,cAJF,EAKEa,YALF,EAME;AACA,QACEb,cAAc,KAAK,CAAnB,IACAa,YAAY,KAAK,CADjB,IAEAF,YAAY,KAAK,CAFjB,IAGAT,QAAQ,CAACU,OAAD,EAAU,EAAV,CAAR,GAAwB,CAJ1B,EAKE;AACA;AACA,wBAAWA,OAAX,SAAqBF,YAAY,CAACI,SAAb,CAAuB,CAAvB,CAArB;AACD;;AACD,WAAOxC,wCAAwC,CAC7CoC,YAD6C,EAE7CC,YAF6C,EAG7CC,OAH6C,CAA/C;AAKD;;AAED,WAASG,YAAT,CAAsBC,QAAtB,EAA8C;AAC5CzC,IAAAA,GAAG,CAAC0C,KAAJ,CAAU,cAAV,EAA0BD,QAA1B;AACAzB,IAAAA,QAAQ,CAACyB,QAAD,CAAR,CAF4C,CAI5C;;AACA,QAAI5C,SAAS,CAAC8C,YAAV,CAAuBF,QAAvB,CAAJ,EAAsC;AACpC/B,MAAAA,QAAQ,CAACb,SAAS,CAAC+C,SAAV,CAAoBH,QAApB,CAAD,CAAR;AACD;AACF;;AAED,WAASI,YAAT,CAAsBC,YAAtB,EAAsD;AACpD3B,IAAAA,YAAY,CAAC2B,YAAD,CAAZ;AACD;;AAED,sBACE,oBAAC,WAAD;AACE,IAAA,GAAG,EAAEvC,GADP;AAEE,IAAA,SAAS,EAAEE,SAFb;AAGE,IAAA,OAAO,EAAEN,QAHX;AAIE,IAAA,mBAAmB,EAAEiB,mBAJvB;AAKE,IAAA,6BAA6B,EAAEc,6BALjC;AAME,IAAA,QAAQ,EAAEM,YANZ;AAOE,IAAA,QAAQ,EAAEK,YAPZ;AAQE,IAAA,OAAO,EAAE3C,YARX;AASE,IAAA,SAAS,EAAEgB,SATb;AAUE,IAAA,KAAK,EAAEP,KAVT;AAWE,IAAA,OAAO,EAAEE,OAXX;AAYE,IAAA,MAAM,EAAEC,MAZV;AAaE,mBAAaC;AAbf,IADF;AAiBD,CA1Fe,CAAlB;AA6FAX,SAAS,CAAC2C,YAAV,GAAyB;AACvBvC,EAAAA,kBAAkB,EAAE,IADG;AAEvBC,EAAAA,SAAS,EAAE,EAFY;AAGvBC,EAAAA,QAAQ,EAAE,MAAM,KAHO;AAIvBC,EAAAA,KAAK,EAAE,CAJgB;AAKvBE,EAAAA,OAAO,EAAE,MAAM,KALQ;AAMvBC,EAAAA,MAAM,EAAE,MAAM,KANS;AAOvB,iBAAekC;AAPQ,CAAzB;AAUA,eAAe5C,SAAf","sourcesContent":["import React, { useEffect, useState } 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\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 value?: number;\n onFocus?(): void;\n onBlur?(): void;\n 'data-testid'?: string;\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<HTMLInputElement, 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 'data-testid': dataTestId,\n } = props;\n const [value, setValue] = useState(TimeUtils.formatTime(propsValue));\n const [selection, setSelection] = useState<SelectionSegment>();\n useEffect(() => {\n setValue(TimeUtils.formatTime(propsValue));\n }, [propsValue]);\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 function handleSelect(newSelection: SelectionSegment) {\n setSelection(newSelection);\n }\n\n return (\n <MaskedInput\n ref={ref}\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 value: 0,\n onFocus: () => false,\n onBlur: () => false,\n 'data-testid': undefined,\n};\n\nexport default TimeInput;\n"],"file":"TimeInput.js"}
@@ -9,11 +9,12 @@ declare type TimeSliderProps = {
9
9
  }): void;
10
10
  isStartModified?: boolean;
11
11
  isEndModified?: boolean;
12
+ 'data-testid'?: string;
12
13
  };
13
14
  /**
14
15
  * Creates a time slider for setting a start and end time, that can also run overnight
15
16
  * @param {startTime, endTime, onChange} props takes times in seconds 0 - 86399 and a callback
16
17
  */
17
- declare const TimeSlider: ({ startTime: propStartTime, endTime: propEndTime, onChange, isStartModified, isEndModified, }: TimeSliderProps) => JSX.Element;
18
+ declare const TimeSlider: ({ startTime: propStartTime, endTime: propEndTime, onChange, isStartModified, isEndModified, "data-testid": dataTestId, }: TimeSliderProps) => JSX.Element;
18
19
  export default TimeSlider;
19
20
  //# sourceMappingURL=TimeSlider.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"TimeSlider.d.ts","sourceRoot":"","sources":["../src/TimeSlider.tsx"],"names":[],"mappings":";AAaA,OAAO,mBAAmB,CAAC;AAO3B,aAAK,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;CACzB,CAAC;AAEF;;;GAGG;AACH,QAAA,MAAM,UAAU,kGAMb,eAAe,KAAG,WAoFpB,CAAC;AA2PF,eAAe,UAAU,CAAC"}
1
+ {"version":3,"file":"TimeSlider.d.ts","sourceRoot":"","sources":["../src/TimeSlider.tsx"],"names":[],"mappings":";AAaA,OAAO,mBAAmB,CAAC;AAO3B,aAAK,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,QAAA,MAAM,UAAU,6HAOb,eAAe,KAAG,WAoFpB,CAAC;AAkQF,eAAe,UAAU,CAAC"}
@@ -21,7 +21,8 @@ var TimeSlider = _ref => {
21
21
  endTime: propEndTime,
22
22
  onChange,
23
23
  isStartModified = false,
24
- isEndModified = false
24
+ isEndModified = false,
25
+ 'data-testid': dataTestId
25
26
  } = _ref;
26
27
  var [startTime, setStartTime] = useState(propStartTime);
27
28
  var [endTime, setEndTime] = useState(propEndTime);
@@ -58,7 +59,8 @@ var TimeSlider = _ref => {
58
59
  updateTime(startTime, newEndTime);
59
60
  }, [updateTime, startTime]);
60
61
  return /*#__PURE__*/React.createElement("div", {
61
- className: "time-slider"
62
+ className: "time-slider",
63
+ "data-testid": dataTestId
62
64
  }, /*#__PURE__*/React.createElement(PopOvers, {
63
65
  startTime: startTime,
64
66
  endTime: endTime,
@@ -104,7 +106,8 @@ var PopOvers = props => {
104
106
  onStartTimeChange,
105
107
  onEndTimeChange,
106
108
  isStartModified,
107
- isEndModified
109
+ isEndModified,
110
+ 'data-testid': dataTestId
108
111
  } = props;
109
112
  var [firstTime, setFirstTime] = useState(startTime > endTime ? endTime : startTime);
110
113
  var [secondTime, setSecondTime] = useState(startTime > endTime ? startTime : endTime);
@@ -145,7 +148,8 @@ var PopOvers = props => {
145
148
  }, startTime <= endTime ? 'Start Time' : 'End Time'), /*#__PURE__*/React.createElement(TimeInput, {
146
149
  allowValueWrapping: false,
147
150
  value: firstTime,
148
- onChange: onFirstTimeChange
151
+ onChange: onFirstTimeChange,
152
+ "data-testid": dataTestId ? "".concat(dataTestId, "-input-1") : undefined
149
153
  })), /*#__PURE__*/React.createElement("div", {
150
154
  className: "flex-spacer"
151
155
  }), /*#__PURE__*/React.createElement("div", {
@@ -157,7 +161,8 @@ var PopOvers = props => {
157
161
  }, startTime > endTime ? 'Start Time' : 'End Time'), /*#__PURE__*/React.createElement(TimeInput, {
158
162
  allowValueWrapping: false,
159
163
  value: secondTime,
160
- onChange: onSecondTimeChange
164
+ onChange: onSecondTimeChange,
165
+ "data-testid": dataTestId ? "".concat(dataTestId, "-input-2") : undefined
161
166
  })), /*#__PURE__*/React.createElement("div", {
162
167
  className: "flex",
163
168
  style: {
@@ -172,10 +177,12 @@ var PopOvers = props => {
172
177
  var TrackFills = props => {
173
178
  var {
174
179
  startTime,
175
- endTime
180
+ endTime,
181
+ 'data-testid': dataTestId
176
182
  } = props;
177
183
  return /*#__PURE__*/React.createElement("div", {
178
- className: "track-fills"
184
+ className: "track-fills",
185
+ "data-testid": dataTestId
179
186
  }, startTime > endTime && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
180
187
  className: "track-fill track-fill-start",
181
188
  style: {
@@ -201,7 +208,8 @@ var Handle = props => {
201
208
  var {
202
209
  track,
203
210
  time,
204
- setTime
211
+ setTime,
212
+ 'data-testid': dataTestId
205
213
  } = props;
206
214
  /**
207
215
  * Takes the time and generate our translation string taking into account handle offset.
@@ -278,7 +286,8 @@ var Handle = props => {
278
286
  className: "handle",
279
287
  type: "button",
280
288
  "aria-label": "Change time",
281
- onMouseDown: handleMouseDown
289
+ onMouseDown: handleMouseDown,
290
+ "data-testid": dataTestId
282
291
  }));
283
292
  };
284
293
 
@@ -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","setStartTime","setEndTime","track","updateTime","newStartTime","newEndTime","start","end","handleStartTimeChange","handleEndTimeChange","Array","fill","map","value","index","PopOvers","props","onStartTimeChange","onEndTimeChange","firstTime","setFirstTime","secondTime","setSecondTime","onFirstTimeChange","onSecondTimeChange","flexBasis","modified","TrackFills","transform","Handle","time","setTime","ONE_HOUR","handleOffset","calculatePositionAsTime","clientX","current","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"],"mappings":"AAAA;AACA;AAEA,OAAOA,KAAP,IACEC,WADF,EAEEC,OAFF,EAGEC,MAHF,EAIEC,QAJF,EAKEC,SALF,QAMO,OANP;AAOA,OAAOC,UAAP,MAAuB,YAAvB;OACOC,S;OACAC,Y;;AAGP,IAAMC,WAAW,GAAGC,QAAQ,CAACF,YAAY,CAAC,aAAD,CAAb,EAA8B,EAA9B,CAA5B;AACA,IAAMG,aAAa,GAAGD,QAAQ,CAACF,YAAY,CAAC,eAAD,CAAb,EAAgC,EAAhC,CAA9B;AACA,IAAMI,cAAc,GAAG,KAAK,EAAL,GAAU,EAAV,GAAe,CAAtC,C,CAAyC;;AACzC,IAAMC,oBAAoB,GAAG,IAAI,EAAjC,C,CAAqC;;AAUrC;AACA;AACA;AACA;AACA,IAAMC,UAAU,GAAG,QAMiB;AAAA,MANhB;AAClBC,IAAAA,SAAS,EAAEC,aADO;AAElBC,IAAAA,OAAO,EAAEC,WAFS;AAGlBC,IAAAA,QAHkB;AAIlBC,IAAAA,eAAe,GAAG,KAJA;AAKlBC,IAAAA,aAAa,GAAG;AALE,GAMgB;AAClC,MAAM,CAACN,SAAD,EAAYO,YAAZ,IAA4BlB,QAAQ,CAACY,aAAD,CAA1C;AACA,MAAM,CAACC,OAAD,EAAUM,UAAV,IAAwBnB,QAAQ,CAACc,WAAD,CAAtC;AAEA,MAAMM,KAAK,GAAGrB,MAAM,CAAiB,IAAjB,CAApB,CAJkC,CAIU;AAE5C;;AACAE,EAAAA,SAAS,CAAC,MAAM;AACdiB,IAAAA,YAAY,CAACN,aAAD,CAAZ;AACAO,IAAAA,UAAU,CAACL,WAAD,CAAV;AACD,GAHQ,EAGN,CAACF,aAAD,EAAgBE,WAAhB,CAHM,CAAT;AAKA,MAAMO,UAAU,GAAGxB,WAAW,CAC5B,CAACyB,YAAD,EAAuBC,UAAvB,KAA8C;AAC5C,QAAIC,KAAK,GAAGF,YAAZ;AACA,QAAIG,GAAG,GAAGF,UAAV;;AACA,QAAIC,KAAK,KAAKC,GAAd,EAAmB;AACjB,UAAIA,GAAG,GAAGjB,cAAV,EAA0B;AACxBiB,QAAAA,GAAG,IAAI,CAAP;AACD,OAFD,MAEO;AACLD,QAAAA,KAAK,IAAI,CAAT;AACD;AACF;;AAEDN,IAAAA,YAAY,CAACM,KAAD,CAAZ;AACAL,IAAAA,UAAU,CAACM,GAAD,CAAV;AACAV,IAAAA,QAAQ,CAAC;AAAEJ,MAAAA,SAAS,EAAEa,KAAb;AAAoBX,MAAAA,OAAO,EAAEY;AAA7B,KAAD,CAAR;AACD,GAf2B,EAgB5B,CAACP,YAAD,EAAeC,UAAf,EAA2BJ,QAA3B,CAhB4B,CAA9B;AAmBA,MAAMW,qBAAqB,GAAG7B,WAAW,CACtCyB,YAAD,IAA0B;AACxBD,IAAAA,UAAU,CAACC,YAAD,EAAeT,OAAf,CAAV;AACD,GAHsC,EAIvC,CAACQ,UAAD,EAAaR,OAAb,CAJuC,CAAzC;AAOA,MAAMc,mBAAmB,GAAG9B,WAAW,CACpC0B,UAAD,IAAwB;AACtBF,IAAAA,UAAU,CAACV,SAAD,EAAYY,UAAZ,CAAV;AACD,GAHoC,EAIrC,CAACF,UAAD,EAAaV,SAAb,CAJqC,CAAvC;AAOA,sBACE;AAAK,IAAA,SAAS,EAAC;AAAf,kBACE,oBAAC,QAAD;AACE,IAAA,SAAS,EAAEA,SADb;AAEE,IAAA,OAAO,EAAEE,OAFX;AAGE,IAAA,iBAAiB,EAAEa,qBAHrB;AAIE,IAAA,eAAe,EAAEC,mBAJnB;AAKE,IAAA,eAAe,EAAEX,eALnB;AAME,IAAA,aAAa,EAAEC;AANjB,IADF,eASE;AAAK,IAAA,SAAS,EAAC,OAAf;AAAuB,IAAA,GAAG,EAAEG;AAA5B,kBACE,oBAAC,UAAD;AAAY,IAAA,SAAS,EAAET,SAAvB;AAAkC,IAAA,OAAO,EAAEE;AAA3C,IADF,eAEE;AAAK,IAAA,SAAS,EAAC;AAAf,KACGe,KAAK,CAAC,EAAD,CAAL,CACEC,IADF,CACO,IADP,EAEEC,GAFF,CAEM,CAACC,KAAD,EAAQC,KAAR,kBACH;AAAK,IAAA,SAAS,EAAC,MAAf;AAAsB,IAAA,GAAG,EAAEA;AAA3B,IAHH,CADH,CAFF,eASE,oBAAC,MAAD;AACE,IAAA,KAAK,EAAEZ,KADT;AAEE,IAAA,IAAI,EAAET,SAFR;AAGE,IAAA,OAAO,EAAEe;AAHX,IATF,eAcE,oBAAC,MAAD;AAAQ,IAAA,KAAK,EAAEN,KAAf;AAAsB,IAAA,IAAI,EAAEP,OAA5B;AAAqC,IAAA,OAAO,EAAEc;AAA9C,IAdF,CATF,eA0BE;AAAK,IAAA,SAAS,EAAC;AAAf,kBACE;AAAK,IAAA,SAAS,EAAC;AAAf,YADF,eAEE;AAAK,IAAA,SAAS,EAAC;AAAf,KACGC,KAAK,CAAC,EAAD,CAAL,CACEC,IADF,CACO,IADP,EAEEC,GAFF,CAEM,CAACC,KAAD,EAAQC,KAAR,kBACH;AAAK,IAAA,SAAS,EAAC,YAAf;AAA4B,IAAA,GAAG,EAAEA;AAAjC,eAA4CA,KAAK,GAAG,CAApD,SAHH,CADH,CAFF,CA1BF,CADF;AAuCD,CA1FD;;AAqGA,IAAMC,QAAQ,GAAIC,KAAD,IAAuC;AACtD,MAAM;AACJvB,IAAAA,SADI;AAEJE,IAAAA,OAFI;AAGJsB,IAAAA,iBAHI;AAIJC,IAAAA,eAJI;AAKJpB,IAAAA,eALI;AAMJC,IAAAA;AANI,MAOFiB,KAPJ;AASA,MAAM,CAACG,SAAD,EAAYC,YAAZ,IAA4BtC,QAAQ,CACxCW,SAAS,GAAGE,OAAZ,GAAsBA,OAAtB,GAAgCF,SADQ,CAA1C;AAGA,MAAM,CAAC4B,UAAD,EAAaC,aAAb,IAA8BxC,QAAQ,CAC1CW,SAAS,GAAGE,OAAZ,GAAsBF,SAAtB,GAAkCE,OADQ,CAA5C;AAIAZ,EAAAA,SAAS,CAAC,MAAM;AACdqC,IAAAA,YAAY,CAAC3B,SAAS,GAAGE,OAAZ,GAAsBA,OAAtB,GAAgCF,SAAjC,CAAZ;AACA6B,IAAAA,aAAa,CAAC7B,SAAS,GAAGE,OAAZ,GAAsBF,SAAtB,GAAkCE,OAAnC,CAAb;AACD,GAHQ,EAGN,CAACF,SAAD,EAAYE,OAAZ,CAHM,CAAT;;AAKA,WAAS4B,iBAAT,CAA2BV,KAA3B,EAA0C;AACxC,QAAIpB,SAAS,IAAIE,OAAjB,EAA0B;AACxBsB,MAAAA,iBAAiB,CAACJ,KAAD,CAAjB;AACD,KAFD,MAEO;AACLK,MAAAA,eAAe,CAACL,KAAD,CAAf;AACD;AACF;;AAED,WAASW,kBAAT,CAA4BX,KAA5B,EAA2C;AACzC,QAAIpB,SAAS,IAAIE,OAAjB,EAA0B;AACxBuB,MAAAA,eAAe,CAACL,KAAD,CAAf;AACD,KAFD,MAEO;AACLI,MAAAA,iBAAiB,CAACJ,KAAD,CAAjB;AACD;AACF;;AAED,sBACE;AAAK,IAAA,SAAS,EAAC;AAAf,kBACE;AACE,IAAA,SAAS,EAAC,MADZ;AAEE,IAAA,KAAK,EAAE;AACLY,MAAAA,SAAS,iBAAWN,SAAS,GAAG7B,cAAb,GAA+B,GAAzC,iBACPD,aAAa,GAAG,CADT;AADJ;AAFT,IADF,eASE;AAAK,IAAA,SAAS,EAAC;AAAf,kBACE;AACE,IAAA,SAAS,EAAEL,UAAU,CAAC;AACpB0C,MAAAA,QAAQ,EAAEjC,SAAS,GAAGE,OAAZ,GAAsBG,eAAtB,GAAwCC;AAD9B,KAAD;AADvB,KAKGN,SAAS,IAAIE,OAAb,GAAuB,YAAvB,GAAsC,UALzC,CADF,eAQE,oBAAC,SAAD;AACE,IAAA,kBAAkB,EAAE,KADtB;AAEE,IAAA,KAAK,EAAEwB,SAFT;AAGE,IAAA,QAAQ,EAAEI;AAHZ,IARF,CATF,eAuBE;AAAK,IAAA,SAAS,EAAC;AAAf,IAvBF,eAwBE;AAAK,IAAA,SAAS,EAAC;AAAf,kBACE;AACE,IAAA,SAAS,EAAEvC,UAAU,CAAC;AACpB0C,MAAAA,QAAQ,EAAEjC,SAAS,GAAGE,OAAZ,GAAsBG,eAAtB,GAAwCC;AAD9B,KAAD;AADvB,KAKGN,SAAS,GAAGE,OAAZ,GAAsB,YAAtB,GAAqC,UALxC,CADF,eAQE,oBAAC,SAAD;AACE,IAAA,kBAAkB,EAAE,KADtB;AAEE,IAAA,KAAK,EAAE0B,UAFT;AAGE,IAAA,QAAQ,EAAEG;AAHZ,IARF,CAxBF,eAsCE;AACE,IAAA,SAAS,EAAC,MADZ;AAEE,IAAA,KAAK,EAAE;AACLC,MAAAA,SAAS,iBACN,CAACnC,cAAc,GAAG+B,UAAlB,IAAgC/B,cAAjC,GAAmD,GAD5C,iBAEFD,aAAa,GAAG,CAFd;AADJ;AAFT,IAtCF,CADF;AAiDD,CAvFD;;AA8FA;AACA;AACA;AACA,IAAMsC,UAAU,GAAIX,KAAD,IAAyC;AAC1D,MAAM;AAAEvB,IAAAA,SAAF;AAAaE,IAAAA;AAAb,MAAyBqB,KAA/B;AACA,sBACE;AAAK,IAAA,SAAS,EAAC;AAAf,KACGvB,SAAS,GAAGE,OAAZ,iBACC,uDACE;AACE,IAAA,SAAS,EAAC,6BADZ;AAEE,IAAA,KAAK,EAAE;AAAEiC,MAAAA,SAAS,mBAAYjC,OAAO,GAAGL,cAAtB;AAAX;AAFT,IADF,eAKE;AACE,IAAA,SAAS,EAAC,2BADZ;AAEE,IAAA,KAAK,EAAE;AACLsC,MAAAA,SAAS,mBACP,CAACtC,cAAc,GAAGG,SAAlB,IAA+BH,cADxB;AADJ;AAFT,IALF,CAFJ,EAiBGG,SAAS,GAAGE,OAAZ,iBACC;AACE,IAAA,SAAS,EAAC,8BADZ;AAEE,IAAA,KAAK,EAAE;AACLiC,MAAAA,SAAS,uBACNnC,SAAS,GAAGH,cAAb,GAA+B,GADxB,uBAEI,CAACK,OAAO,GAAGF,SAAX,IAAwBH,cAF5B;AADJ;AAFT,IAlBJ,CADF;AA8BD,CAhCD;;AAwCA;AACA;AACA;AACA,IAAMuC,MAAM,GAAIb,KAAD,IAAqC;AAClD,MAAM;AAAEd,IAAAA,KAAF;AAAS4B,IAAAA,IAAT;AAAeC,IAAAA;AAAf,MAA2Bf,KAAjC;AAEA;AACF;AACA;AACA;AACA;AACA;AACA;;AACE,MAAMY,SAAS,GAAGhD,OAAO,CAAC,MAAM;AAC9B,QAAMoD,QAAQ,GAAG,KAAK,EAAtB;AACA,QAAIC,YAAY,GAAG9C,WAAW,GAAG,CAAjC;;AACA,QAAI2C,IAAI,GAAGE,QAAX,EAAqB;AACnBC,MAAAA,YAAY,GAAIH,IAAI,GAAGE,QAAR,IAAqB7C,WAAW,GAAG,CAAnC,CAAf,CADmB,CACmC;AACvD,KAFD,MAEO,IAAI2C,IAAI,GAAG,KAAKE,QAAhB,EAA0B;AAC/BC,MAAAA,YAAY,GACV9C,WAAW,GAAG,CAAd,GACC,KAAKG,cAAc,GAAG,KAAK0C,QAA3B,CAAD,IACGF,IAAI,GAAG,KAAKE,QADf,KAEG7C,WAAW,GAAG,CAFjB,CAFF,CAD+B,CAKR;AACxB;;AACD,qCACG2C,IAAI,GAAGxC,cAAR,GAA0B,GAD5B,iBAEO2C,YAFP;AAGD,GAfwB,EAetB,CAACH,IAAD,CAfsB,CAAzB;AAiBA,MAAMI,uBAAuB,GAAGvD,WAAW,CACxCwD,OAAD,IAAqB;AACnB,QAAI,CAACjC,KAAK,CAACkC,OAAX,EAAoB;AAClB,aAAO,CAAP;AACD;;AACD,QAAMC,SAAS,GAAGnC,KAAK,CAACkC,OAAN,CAAcE,qBAAd,EAAlB;AACA,QAAMC,QAAQ,GAAGC,IAAI,CAACC,GAAL,CAASN,OAAO,GAAGE,SAAS,CAACK,IAA7B,EAAmC,CAAnC,CAAjB,CALmB,CAMnB;;AACA,QAAMC,WAAW,GACfrD,cAAc,GAAGkD,IAAI,CAACI,GAAL,CAAS,CAAT,EAAYL,QAAQ,GAAGF,SAAS,CAACQ,KAAjC,CADnB,CAPmB,CASnB;;AACA,QAAMC,WAAW,GACfvD,oBAAoB,GAAGiD,IAAI,CAACO,KAAL,CAAWJ,WAAW,GAAGpD,oBAAzB,CADzB,CAVmB,CAYnB;;AACA,QAAMyD,QAAQ,GAAGR,IAAI,CAACI,GAAL,CAAStD,cAAT,EAAyBwD,WAAzB,CAAjB;AACA,WAAOE,QAAP;AACD,GAhBwC,EAiBzC,CAAC9C,KAAD,CAjByC,CAA3C;AAoBA,MAAM+C,eAAe,GAAGtE,WAAW,CACjC,SAA6B;AAAA,QAA5B;AAAEwD,MAAAA;AAAF,KAA4B;AAC3BJ,IAAAA,OAAO,CAACG,uBAAuB,CAACC,OAAD,CAAxB,CAAP;AACD,GAHgC,EAIjC,CAACJ,OAAD,EAAUG,uBAAV,CAJiC,CAAnC;AAOA,MAAMgB,aAAa,GAAGvE,WAAW,CAC/B,SAA6B;AAAA,QAA5B;AAAEwD,MAAAA;AAAF,KAA4B;AAC3BJ,IAAAA,OAAO,CAACG,uBAAuB,CAACC,OAAD,CAAxB,CAAP;AAEAgB,IAAAA,MAAM,CAACC,mBAAP,CAA2B,WAA3B,EAAwCH,eAAxC;AACAE,IAAAA,MAAM,CAACC,mBAAP,CAA2B,SAA3B,EAAsCF,aAAtC;AACAG,IAAAA,QAAQ,CAACC,eAAT,CAAyBC,SAAzB,CAAmCC,MAAnC,CAA0C,0BAA1C;AACD,GAP8B,EAQ/B,CAACzB,OAAD,EAAUG,uBAAV,EAAmCe,eAAnC,CAR+B,CAAjC;AAWA,MAAMQ,kBAAkB,GAAG9E,WAAW,CAAC,MAAM;AAC3CwE,IAAAA,MAAM,CAACO,gBAAP,CAAwB,WAAxB,EAAqCT,eAArC;AACAE,IAAAA,MAAM,CAACO,gBAAP,CAAwB,SAAxB,EAAmCR,aAAnC;AACAG,IAAAA,QAAQ,CAACC,eAAT,CAAyBC,SAAzB,CAAmCI,GAAnC,CAAuC,0BAAvC;AACD,GAJqC,EAInC,CAACV,eAAD,EAAkBC,aAAlB,CAJmC,CAAtC;AAMA,MAAMU,iBAAiB,GAAGjF,WAAW,CAAC,MAAM;AAC1CwE,IAAAA,MAAM,CAACC,mBAAP,CAA2B,WAA3B,EAAwCH,eAAxC;AACAE,IAAAA,MAAM,CAACC,mBAAP,CAA2B,SAA3B,EAAsCF,aAAtC;AACAG,IAAAA,QAAQ,CAACC,eAAT,CAAyBC,SAAzB,CAAmCC,MAAnC,CAA0C,0BAA1C;AACD,GAJoC,EAIlC,CAACP,eAAD,EAAkBC,aAAlB,CAJkC,CAArC;AAMA,MAAMW,eAAe,GAAGlF,WAAW,CAAC,MAAM;AACxC8E,IAAAA,kBAAkB;AACnB,GAFkC,EAEhC,CAACA,kBAAD,CAFgC,CAAnC;AAIA1E,EAAAA,SAAS,CACP,MAAM,MAAM;AACV6E,IAAAA,iBAAiB;AAClB,GAHM,EAIP,CAACA,iBAAD,CAJO,CAAT;AAOA,sBACE;AAAK,IAAA,SAAS,EAAC,cAAf;AAA8B,IAAA,KAAK,EAAE;AAAEhC,MAAAA;AAAF;AAArC,kBACE;AACE,IAAA,SAAS,EAAC,QADZ;AAEE,IAAA,IAAI,EAAC,QAFP;AAGE,kBAAW,aAHb;AAIE,IAAA,WAAW,EAAEiC;AAJf,IADF,CADF;AAUD,CAlGD;;AAoGA,eAAerE,UAAf","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 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};\n\n/**\n * Creates a time slider for setting a start and end time, that can also run overnight\n * @param {startTime, endTime, onChange} 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}: 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 setStartTime(propStartTime);\n setEndTime(propEndTime);\n }, [propStartTime, propEndTime]);\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\">\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};\n\nconst PopOvers = (props: PopOversProps): JSX.Element => {\n const {\n startTime,\n endTime,\n onStartTimeChange,\n onEndTimeChange,\n isStartModified,\n isEndModified,\n } = props;\n\n const [firstTime, setFirstTime] = useState(\n startTime > endTime ? endTime : startTime\n );\n const [secondTime, setSecondTime] = useState(\n startTime > endTime ? startTime : endTime\n );\n\n useEffect(() => {\n setFirstTime(startTime > endTime ? endTime : startTime);\n setSecondTime(startTime > endTime ? startTime : endTime);\n }, [startTime, endTime]);\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 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: startTime < endTime ? isStartModified : isEndModified,\n })}\n >\n {startTime <= endTime ? 'Start Time' : 'End Time'}\n </label>\n <TimeInput\n allowValueWrapping={false}\n value={firstTime}\n onChange={onFirstTimeChange}\n />\n </div>\n <div className=\"flex-spacer\" />\n <div className=\"handle-popper\">\n <label\n className={classNames({\n modified: startTime > endTime ? isStartModified : isEndModified,\n })}\n >\n {startTime > endTime ? 'Start Time' : 'End Time'}\n </label>\n <TimeInput\n allowValueWrapping={false}\n value={secondTime}\n onChange={onSecondTimeChange}\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};\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 } = props;\n return (\n <div className=\"track-fills\">\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};\n\n/**\n * Creates a draggable handle the sets the time\n */\nconst Handle = (props: HandleProps): JSX.Element => {\n const { track, time, setTime } = 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 {number} 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 () => () => {\n stopDragListening();\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 />\n </div>\n );\n};\n\nexport default TimeSlider;\n"],"file":"TimeSlider.js"}
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","updateTime","newStartTime","newEndTime","start","end","handleStartTimeChange","handleEndTimeChange","Array","fill","map","value","index","PopOvers","props","onStartTimeChange","onEndTimeChange","firstTime","setFirstTime","secondTime","setSecondTime","onFirstTimeChange","onSecondTimeChange","flexBasis","modified","undefined","TrackFills","transform","Handle","time","setTime","ONE_HOUR","handleOffset","calculatePositionAsTime","clientX","current","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"],"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 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 {startTime, endTime, onChange} 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 setStartTime(propStartTime);\n setEndTime(propEndTime);\n }, [propStartTime, propEndTime]);\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 [firstTime, setFirstTime] = useState(\n startTime > endTime ? endTime : startTime\n );\n const [secondTime, setSecondTime] = useState(\n startTime > endTime ? startTime : endTime\n );\n\n useEffect(() => {\n setFirstTime(startTime > endTime ? endTime : startTime);\n setSecondTime(startTime > endTime ? startTime : endTime);\n }, [startTime, endTime]);\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 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: startTime < endTime ? isStartModified : isEndModified,\n })}\n >\n {startTime <= endTime ? 'Start Time' : 'End Time'}\n </label>\n <TimeInput\n allowValueWrapping={false}\n value={firstTime}\n onChange={onFirstTimeChange}\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: startTime > endTime ? isStartModified : isEndModified,\n })}\n >\n {startTime > endTime ? 'Start Time' : 'End Time'}\n </label>\n <TimeInput\n allowValueWrapping={false}\n value={secondTime}\n onChange={onSecondTimeChange}\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 {number} 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 () => () => {\n stopDragListening();\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"}
@@ -7,11 +7,12 @@ declare type ToastNotificationProps = {
7
7
  isShown?: boolean;
8
8
  message?: string;
9
9
  type?: string;
10
+ 'data-testid'?: string;
10
11
  onClick?: React.EventHandler<React.MouseEvent<HTMLDivElement> | React.KeyboardEvent<HTMLDivElement>>;
11
12
  onDismiss?: React.MouseEventHandler<HTMLButtonElement>;
12
13
  };
13
14
  declare const ToastNotification: {
14
- ({ buttons, isShown, classNames: classNamesProp, message, type, onClick, onDismiss, }: ToastNotificationProps): JSX.Element;
15
+ ({ buttons, isShown, classNames: classNamesProp, message, type, onClick, onDismiss, "data-testid": dataTestId, }: ToastNotificationProps): JSX.Element;
15
16
  TYPE: Readonly<{
16
17
  ERROR: string;
17
18
  }>;
@@ -1 +1 @@
1
- {"version":3,"file":"ToastNotification.d.ts","sourceRoot":"","sources":["../src/ToastNotification.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,OAAO,MAAM,MAAM,UAAU,CAAC;AAE9B,OAAO,0BAA0B,CAAC;AAElC,aAAK,sBAAsB,GAAG;IAC5B,OAAO,CAAC,EAAE,OAAO,MAAM,EAAE,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,OAAO,CAAC,EAAE,KAAK,CAAC,YAAY,CAC1B,KAAK,CAAC,UAAU,CAAC,cAAc,CAAC,GAAG,KAAK,CAAC,aAAa,CAAC,cAAc,CAAC,CACvE,CAAC;IACF,SAAS,CAAC,EAAE,KAAK,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,CAAC;CACxD,CAAC;AAEF,QAAA,MAAM,iBAAiB;2FAQpB,sBAAsB,GAAG,WAAW;;;;CAyCtC,CAAC;AAMF,eAAe,iBAAiB,CAAC"}
1
+ {"version":3,"file":"ToastNotification.d.ts","sourceRoot":"","sources":["../src/ToastNotification.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,OAAO,MAAM,MAAM,UAAU,CAAC;AAE9B,OAAO,0BAA0B,CAAC;AAElC,aAAK,sBAAsB,GAAG;IAC5B,OAAO,CAAC,EAAE,OAAO,MAAM,EAAE,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,OAAO,CAAC,EAAE,KAAK,CAAC,YAAY,CAC1B,KAAK,CAAC,UAAU,CAAC,cAAc,CAAC,GAAG,KAAK,CAAC,aAAa,CAAC,cAAc,CAAC,CACvE,CAAC;IACF,SAAS,CAAC,EAAE,KAAK,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,CAAC;CACxD,CAAC;AAEF,QAAA,MAAM,iBAAiB;sHASpB,sBAAsB,GAAG,WAAW;;;;CA0CtC,CAAC;AAMF,eAAe,iBAAiB,CAAC"}
@@ -14,7 +14,8 @@ var ToastNotification = _ref => {
14
14
  message,
15
15
  type,
16
16
  onClick,
17
- onDismiss
17
+ onDismiss,
18
+ 'data-testid': dataTestId
18
19
  } = _ref;
19
20
  var hasButtons = buttons && buttons.length !== 0;
20
21
  return /*#__PURE__*/React.createElement(CSSTransition, {
@@ -27,7 +28,8 @@ var ToastNotification = _ref => {
27
28
  className: classNames('toast-notification', classNamesProp, type),
28
29
  role: "presentation",
29
30
  onClick: onClick,
30
- onKeyPress: onClick
31
+ onKeyPress: onClick,
32
+ "data-testid": dataTestId
31
33
  }, /*#__PURE__*/React.createElement("div", {
32
34
  className: "message-container"
33
35
  }, /*#__PURE__*/React.createElement("span", {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/ToastNotification.tsx"],"names":["React","classNames","CSSTransition","vsClose","Button","ThemeExport","ToastNotification","buttons","isShown","classNamesProp","message","type","onClick","onDismiss","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;;;AAgBP,IAAMC,iBAAiB,GAAG,QAQiB;AAAA,MARhB;AACzBC,IAAAA,OADyB;AAEzBC,IAAAA,OAAO,GAAG,KAFe;AAGzBP,IAAAA,UAAU,EAAEQ,cAHa;AAIzBC,IAAAA,OAJyB;AAKzBC,IAAAA,IALyB;AAMzBC,IAAAA,OANyB;AAOzBC,IAAAA;AAPyB,GAQgB;AACzC,MAAMC,UAAU,GAAGP,OAAO,IAAIA,OAAO,CAACQ,MAAR,KAAmB,CAAjD;AAEA,sBACE,oBAAC,aAAD;AACE,IAAA,EAAE,EAAEP,OADN;AAEE,IAAA,OAAO,EAAEH,WAAW,CAACW,YAFvB;AAGE,IAAA,UAAU,EAAC,6BAHb;AAIE,IAAA,YAAY,MAJd;AAKE,IAAA,aAAa;AALf,kBAOE;AACE,IAAA,SAAS,EAAEf,UAAU,CAAC,oBAAD,EAAuBQ,cAAvB,EAAuCE,IAAvC,CADvB;AAEE,IAAA,IAAI,EAAC,cAFP;AAGE,IAAA,OAAO,EAAEC,OAHX;AAIE,IAAA,UAAU,EAAEA;AAJd,kBAME;AAAK,IAAA,SAAS,EAAC;AAAf,kBACE;AAAM,IAAA,SAAS,EAAC;AAAhB,KAA2BF,OAA3B,CADF,CANF,eASE,oBAAC,aAAD;AACE,IAAA,EAAE,EAAEI,UADN;AAEE,IAAA,OAAO,EAAET,WAAW,CAACY,gBAFvB;AAGE,IAAA,UAAU,EAAC,MAHb;AAIE,IAAA,YAAY,MAJd;AAKE,IAAA,aAAa;AALf,kBAOE;AAAK,IAAA,SAAS,EAAC;AAAf,KAAoCV,OAApC,CAPF,CATF,EAkBGM,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,IAnBJ,CAPF,CADF;AAsCD,CAjDD;;AAmDAP,iBAAiB,CAACY,IAAlB,GAAyBC,MAAM,CAACC,MAAP,CAAc;AACrCC,EAAAA,KAAK,EAAE;AAD8B,CAAd,CAAzB;AAIA,eAAef,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\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}: 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 >\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,"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,13 +1,14 @@
1
1
  import React from 'react';
2
2
  import './UISwitch.scss';
3
- declare type UISwitchProps = {
3
+ export declare type UISwitchProps = {
4
4
  on: boolean;
5
5
  onClick: React.MouseEventHandler<HTMLButtonElement>;
6
6
  id?: string;
7
7
  className?: string;
8
8
  isInvalid?: boolean;
9
9
  disabled?: boolean;
10
+ 'data-testid'?: string;
10
11
  };
11
- declare const UISwitch: ({ on, id, className, isInvalid, disabled, onClick, }: UISwitchProps) => JSX.Element;
12
+ declare const UISwitch: ({ on, id, className, isInvalid, disabled, onClick, "data-testid": dataTestId, }: UISwitchProps) => JSX.Element;
12
13
  export default UISwitch;
13
14
  //# sourceMappingURL=UISwitch.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"UISwitch.d.ts","sourceRoot":"","sources":["../src/UISwitch.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,iBAAiB,CAAC;AAEzB,aAAK,aAAa,GAAG;IACnB,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,EAAE,KAAK,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,CAAC;IACpD,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,QAAA,MAAM,QAAQ,yDAOX,aAAa,KAAG,WAgBlB,CAAC;AAEF,eAAe,QAAQ,CAAC"}
1
+ {"version":3,"file":"UISwitch.d.ts","sourceRoot":"","sources":["../src/UISwitch.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,iBAAiB,CAAC;AAEzB,oBAAY,aAAa,GAAG;IAC1B,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,EAAE,KAAK,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,CAAC;IACpD,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,QAAA,MAAM,QAAQ,oFAQX,aAAa,KAAG,WAiBlB,CAAC;AAEF,eAAe,QAAQ,CAAC"}
package/dist/UISwitch.js CHANGED
@@ -9,7 +9,8 @@ var UISwitch = _ref => {
9
9
  className,
10
10
  isInvalid,
11
11
  disabled = false,
12
- onClick
12
+ onClick,
13
+ 'data-testid': dataTestId
13
14
  } = _ref;
14
15
  return /*#__PURE__*/React.createElement("button", {
15
16
  type: "button",
@@ -20,7 +21,8 @@ var UISwitch = _ref => {
20
21
  }),
21
22
  id: id,
22
23
  onClick: onClick,
23
- disabled: disabled
24
+ disabled: disabled,
25
+ "data-testid": dataTestId
24
26
  }, /*#__PURE__*/React.createElement("div", {
25
27
  className: "handle"
26
28
  }));
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/UISwitch.tsx"],"names":["React","classNames","UISwitch","on","id","className","isInvalid","disabled","onClick","active"],"mappings":"AAAA,OAAOA,KAAP,MAAkB,OAAlB;AACA,OAAOC,UAAP,MAAuB,YAAvB;;;AAYA,IAAMC,QAAQ,GAAG;AAAA,MAAC;AAChBC,IAAAA,EADgB;AAEhBC,IAAAA,EAFgB;AAGhBC,IAAAA,SAHgB;AAIhBC,IAAAA,SAJgB;AAKhBC,IAAAA,QAAQ,GAAG,KALK;AAMhBC,IAAAA;AANgB,GAAD;AAAA,sBAQf;AACE,IAAA,IAAI,EAAC,QADP;AAEE,IAAA,SAAS,EAAEP,UAAU,CACnB,KADmB,EAEnB,YAFmB,EAGnBI,SAHmB,EAInB;AAAEI,MAAAA,MAAM,EAAEN;AAAV,KAJmB,EAKnB;AAAE,oBAAcG;AAAhB,KALmB,CAFvB;AASE,IAAA,EAAE,EAAEF,EATN;AAUE,IAAA,OAAO,EAAEI,OAVX;AAWE,IAAA,QAAQ,EAAED;AAXZ,kBAaE;AAAK,IAAA,SAAS,EAAC;AAAf,IAbF,CARe;AAAA,CAAjB;;AAyBA,eAAeL,QAAf","sourcesContent":["import React from 'react';\nimport classNames from 'classnames';\nimport './UISwitch.scss';\n\ntype UISwitchProps = {\n on: boolean;\n onClick: React.MouseEventHandler<HTMLButtonElement>;\n id?: string;\n className?: string;\n isInvalid?: boolean;\n disabled?: boolean;\n};\n\nconst UISwitch = ({\n on,\n id,\n className,\n isInvalid,\n disabled = false,\n onClick,\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 >\n <div className=\"handle\" />\n </button>\n);\n\nexport default UISwitch;\n"],"file":"UISwitch.js"}
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"}
@@ -7,6 +7,7 @@ import './ContextActions.scss';
7
7
  interface ContextActionsProps {
8
8
  actions: ContextAction[] | (() => ContextAction[]);
9
9
  ignoreClassNames?: string[];
10
+ 'data-testid'?: string;
10
11
  }
11
12
  interface ContextActionsState {
12
13
  globalActions: ContextAction[];
@@ -1 +1 @@
1
- {"version":3,"file":"ContextActions.d.ts","sourceRoot":"","sources":["../../src/context-actions/ContextActions.tsx"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGzC,OAAO,KAAK,EAAE,aAAa,EAAsB,MAAM,sBAAsB,CAAC;AAE9E,OAAO,uBAAuB,CAAC;AAI/B,UAAU,mBAAmB;IAC3B,OAAO,EAAE,aAAa,EAAE,GAAG,CAAC,MAAM,aAAa,EAAE,CAAC,CAAC;IACnD,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC7B;AAED,UAAU,mBAAmB;IAC3B,aAAa,EAAE,aAAa,EAAE,CAAC;IAC/B,eAAe,EAAE,aAAa,EAAE,CAAC;CAClC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,cAAM,cAAe,SAAQ,SAAS,CACpC,mBAAmB,EACnB,mBAAmB,CACpB;IACC;;;;;OAKG;IACH,MAAM,CAAC,MAAM;;;;;;;MAQX;IAEF,MAAM,CAAC,WAAW,CAChB,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,aAAa,EAAE,GACvB,IAAI;gBAmBK,KAAK,EAAE,mBAAmB;IAWtC,MAAM,CAAC,wBAAwB,CAC7B,KAAK,EAAE,mBAAmB,GACzB,mBAAmB;IAYtB,iBAAiB,IAAI,IAAI;IAazB,oBAAoB,IAAI,IAAI;IAa5B,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;IAE3C,iBAAiB,CAAC,CAAC,EAAE,UAAU,GAAG,IAAI;IA0CtC,aAAa,CAAC,CAAC,EAAE,aAAa,GAAG,IAAI;IAuBrC,MAAM,IAAI,GAAG,CAAC,OAAO;CAQtB;AAED,eAAe,cAAc,CAAC"}
1
+ {"version":3,"file":"ContextActions.d.ts","sourceRoot":"","sources":["../../src/context-actions/ContextActions.tsx"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGzC,OAAO,KAAK,EAAE,aAAa,EAAsB,MAAM,sBAAsB,CAAC;AAE9E,OAAO,uBAAuB,CAAC;AAI/B,UAAU,mBAAmB;IAC3B,OAAO,EAAE,aAAa,EAAE,GAAG,CAAC,MAAM,aAAa,EAAE,CAAC,CAAC;IACnD,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,UAAU,mBAAmB;IAC3B,aAAa,EAAE,aAAa,EAAE,CAAC;IAC/B,eAAe,EAAE,aAAa,EAAE,CAAC;CAClC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,cAAM,cAAe,SAAQ,SAAS,CACpC,mBAAmB,EACnB,mBAAmB,CACpB;IACC;;;;;OAKG;IACH,MAAM,CAAC,MAAM;;;;;;;MAQX;IAEF,MAAM,CAAC,WAAW,CAChB,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,aAAa,EAAE,GACvB,IAAI;gBAmBK,KAAK,EAAE,mBAAmB;IAWtC,MAAM,CAAC,wBAAwB,CAC7B,KAAK,EAAE,mBAAmB,GACzB,mBAAmB;IAYtB,iBAAiB,IAAI,IAAI;IAazB,oBAAoB,IAAI,IAAI;IAa5B,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;IAE3C,iBAAiB,CAAC,CAAC,EAAE,UAAU,GAAG,IAAI;IA0CtC,aAAa,CAAC,CAAC,EAAE,aAAa,GAAG,IAAI;IAuBrC,MAAM,IAAI,GAAG,CAAC,OAAO;CAatB;AAED,eAAe,cAAc,CAAC"}
@@ -190,12 +190,16 @@ class ContextActions extends Component {
190
190
  }
191
191
 
192
192
  render() {
193
+ var {
194
+ 'data-testid': dataTestId
195
+ } = this.props;
193
196
  var {
194
197
  globalActions
195
198
  } = this.state;
196
199
  return /*#__PURE__*/React.createElement("div", {
197
200
  className: "context-actions-listener",
198
- ref: this.container
201
+ ref: this.container,
202
+ "data-testid": dataTestId
199
203
  }, /*#__PURE__*/React.createElement(GlobalContextActions, {
200
204
  actions: globalActions
201
205
  }));
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/context-actions/ContextActions.tsx"],"names":["React","Component","Log","ContextActionUtils","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","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 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: ContextAction[] | (() => ContextAction[]);\n ignoreClassNames?: 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(action => action.isGlobal);\n const keyboardActions = props.actions.filter(\n action => !action.isGlobal && action.shortcut != null\n );\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(action => !action.isGlobal);\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 { globalActions } = this.state;\n return (\n <div className=\"context-actions-listener\" ref={this.container}>\n <GlobalContextActions actions={globalActions} />\n </div>\n );\n }\n}\n\nexport default ContextActions;\n"],"file":"ContextActions.js"}
1
+ {"version":3,"sources":["../../src/context-actions/ContextActions.tsx"],"names":["React","Component","Log","ContextActionUtils","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 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: ContextAction[] | (() => ContextAction[]);\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(action => action.isGlobal);\n const keyboardActions = props.actions.filter(\n action => !action.isGlobal && action.shortcut != null\n );\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(action => !action.isGlobal);\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"}
@@ -17,6 +17,7 @@ interface ContextMenuProps {
17
17
  initialKeyboardIndex?: number;
18
18
  };
19
19
  menuStyle: React.CSSProperties;
20
+ 'data-testid'?: string;
20
21
  }
21
22
  interface ContextMenuState {
22
23
  menuItems: ContextAction[];
@@ -40,6 +41,7 @@ declare class ContextMenu extends PureComponent<ContextMenuProps, ContextMenuSta
40
41
  onMenuClosed(): void;
41
42
  options: {};
42
43
  menuStyle: {};
44
+ 'data-testid': undefined;
43
45
  };
44
46
  static handleContextMenu(e: React.MouseEvent): void;
45
47
  constructor(props: ContextMenuProps);
@@ -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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"}
@@ -577,7 +577,8 @@ class ContextMenu extends PureComponent {
577
577
  }
578
578
 
579
579
  var {
580
- menuStyle
580
+ menuStyle,
581
+ 'data-testid': dataTestId
581
582
  } = this.props; // don't show submenu until it has an position initialized
582
583
 
583
584
  var showSubmenu = activeSubMenu !== null && subMenuTop !== null && subMenuLeft !== null;
@@ -596,7 +597,8 @@ class ContextMenu extends PureComponent {
596
597
  onMouseLeave: this.handleMouseLeave,
597
598
  onContextMenu: ContextMenu.handleContextMenu,
598
599
  role: "menuitem",
599
- tabIndex: 0
600
+ tabIndex: 0,
601
+ "data-testid": dataTestId
600
602
  }, menuItemElements, pendingElement), showSubmenu && activeSubMenu !== null && subMenuTop !== null && subMenuLeft !== null && /*#__PURE__*/React.createElement(ContextMenu, {
601
603
  key: "sub-".concat(activeSubMenu),
602
604
  actions: menuItems[activeSubMenu].actions || [],
@@ -630,7 +632,8 @@ _defineProperty(ContextMenu, "defaultProps", {
630
632
  },
631
633
 
632
634
  options: {},
633
- menuStyle: {}
635
+ menuStyle: {},
636
+ 'data-testid': undefined
634
637
  });
635
638
 
636
639
  export default ContextMenu;