@perses-dev/components 0.53.0-rc.0 → 0.53.0-rc.2

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 (534) hide show
  1. package/dist/AlignSelector/AlignSelector.js +1 -1
  2. package/dist/AlignSelector/AlignSelector.js.map +1 -1
  3. package/dist/AlignSelector/index.js +1 -1
  4. package/dist/AlignSelector/index.js.map +1 -1
  5. package/dist/ColorPicker/ColorPicker.js +1 -1
  6. package/dist/ColorPicker/ColorPicker.js.map +1 -1
  7. package/dist/ColorPicker/OptionsColorPicker.js +1 -1
  8. package/dist/ColorPicker/OptionsColorPicker.js.map +1 -1
  9. package/dist/ColorPicker/index.js +1 -1
  10. package/dist/ColorPicker/index.js.map +1 -1
  11. package/dist/ContentWithLegend/ContentWithLegend.js +1 -1
  12. package/dist/ContentWithLegend/ContentWithLegend.js.map +1 -1
  13. package/dist/ContentWithLegend/index.js +1 -1
  14. package/dist/ContentWithLegend/index.js.map +1 -1
  15. package/dist/ContentWithLegend/model/content-with-legend-model.js +1 -1
  16. package/dist/ContentWithLegend/model/content-with-legend-model.js.map +1 -1
  17. package/dist/DensitySelector/DensitySelector.js +1 -1
  18. package/dist/DensitySelector/DensitySelector.js.map +1 -1
  19. package/dist/DensitySelector/index.js +1 -1
  20. package/dist/DensitySelector/index.js.map +1 -1
  21. package/dist/Dialog/Dialog.js +1 -1
  22. package/dist/Dialog/Dialog.js.map +1 -1
  23. package/dist/Dialog/DiscardChangesConfirmationDialog.js +1 -1
  24. package/dist/Dialog/DiscardChangesConfirmationDialog.js.map +1 -1
  25. package/dist/Dialog/index.js +1 -1
  26. package/dist/Dialog/index.js.map +1 -1
  27. package/dist/DragAndDrop/DragAndDropList.js +1 -1
  28. package/dist/DragAndDrop/DragAndDropList.js.map +1 -1
  29. package/dist/DragAndDrop/DragButton.js +1 -1
  30. package/dist/DragAndDrop/DragButton.js.map +1 -1
  31. package/dist/DragAndDrop/DropIndicator.js +1 -1
  32. package/dist/DragAndDrop/DropIndicator.js.map +1 -1
  33. package/dist/DragAndDrop/index.js +1 -1
  34. package/dist/DragAndDrop/index.js.map +1 -1
  35. package/dist/DragAndDrop/model.js +1 -1
  36. package/dist/DragAndDrop/model.js.map +1 -1
  37. package/dist/Drawer/Drawer.js +1 -1
  38. package/dist/Drawer/Drawer.js.map +1 -1
  39. package/dist/Drawer/index.js +1 -1
  40. package/dist/Drawer/index.js.map +1 -1
  41. package/dist/EChart/EChart.js +1 -1
  42. package/dist/EChart/EChart.js.map +1 -1
  43. package/dist/EChart/index.js +1 -1
  44. package/dist/EChart/index.js.map +1 -1
  45. package/dist/ErrorAlert.js +1 -1
  46. package/dist/ErrorAlert.js.map +1 -1
  47. package/dist/ErrorBoundary.js +1 -1
  48. package/dist/ErrorBoundary.js.map +1 -1
  49. package/dist/FontSizeSelector/FontSizeSelector.js +1 -1
  50. package/dist/FontSizeSelector/FontSizeSelector.js.map +1 -1
  51. package/dist/FontSizeSelector/index.js +1 -1
  52. package/dist/FontSizeSelector/index.js.map +1 -1
  53. package/dist/FormEditor/FormActions.js +1 -1
  54. package/dist/FormEditor/FormActions.js.map +1 -1
  55. package/dist/FormEditor/index.js +1 -1
  56. package/dist/FormEditor/index.js.map +1 -1
  57. package/dist/FormatControls/FormatControls.d.ts.map +1 -1
  58. package/dist/FormatControls/FormatControls.js +10 -23
  59. package/dist/FormatControls/FormatControls.js.map +1 -1
  60. package/dist/FormatControls/UnitSelector.d.ts +9 -0
  61. package/dist/FormatControls/UnitSelector.d.ts.map +1 -0
  62. package/dist/FormatControls/UnitSelector.js +47 -0
  63. package/dist/FormatControls/UnitSelector.js.map +1 -0
  64. package/dist/FormatControls/index.d.ts +1 -0
  65. package/dist/FormatControls/index.d.ts.map +1 -1
  66. package/dist/FormatControls/index.js +2 -1
  67. package/dist/FormatControls/index.js.map +1 -1
  68. package/dist/InfoTooltip/InfoTooltip.js +1 -1
  69. package/dist/InfoTooltip/InfoTooltip.js.map +1 -1
  70. package/dist/InfoTooltip/index.js +1 -1
  71. package/dist/InfoTooltip/index.js.map +1 -1
  72. package/dist/JSONEditor.js +1 -1
  73. package/dist/JSONEditor.js.map +1 -1
  74. package/dist/Legend/CompactLegend.js +1 -1
  75. package/dist/Legend/CompactLegend.js.map +1 -1
  76. package/dist/Legend/Legend.js +1 -1
  77. package/dist/Legend/Legend.js.map +1 -1
  78. package/dist/Legend/LegendColorBadge.js +1 -1
  79. package/dist/Legend/LegendColorBadge.js.map +1 -1
  80. package/dist/Legend/ListLegend.js +1 -1
  81. package/dist/Legend/ListLegend.js.map +1 -1
  82. package/dist/Legend/ListLegendItem.js +1 -1
  83. package/dist/Legend/ListLegendItem.js.map +1 -1
  84. package/dist/Legend/TableLegend.js +1 -1
  85. package/dist/Legend/TableLegend.js.map +1 -1
  86. package/dist/Legend/index.js +1 -1
  87. package/dist/Legend/index.js.map +1 -1
  88. package/dist/Legend/legend-model.js +1 -1
  89. package/dist/Legend/legend-model.js.map +1 -1
  90. package/dist/LinksEditor/LinkEditorForm.js +1 -1
  91. package/dist/LinksEditor/LinkEditorForm.js.map +1 -1
  92. package/dist/LinksEditor/LinksEditor.js +1 -1
  93. package/dist/LinksEditor/LinksEditor.js.map +1 -1
  94. package/dist/LinksEditor/index.js +1 -1
  95. package/dist/LinksEditor/index.js.map +1 -1
  96. package/dist/ModeSelector/ModeSelector.js +1 -1
  97. package/dist/ModeSelector/ModeSelector.js.map +1 -1
  98. package/dist/ModeSelector/index.js +1 -1
  99. package/dist/ModeSelector/index.js.map +1 -1
  100. package/dist/OptionsEditorLayout/OptionsEditorColumn.js +1 -1
  101. package/dist/OptionsEditorLayout/OptionsEditorColumn.js.map +1 -1
  102. package/dist/OptionsEditorLayout/OptionsEditorControl.d.ts.map +1 -1
  103. package/dist/OptionsEditorLayout/OptionsEditorControl.js +5 -2
  104. package/dist/OptionsEditorLayout/OptionsEditorControl.js.map +1 -1
  105. package/dist/OptionsEditorLayout/OptionsEditorGrid.js +1 -1
  106. package/dist/OptionsEditorLayout/OptionsEditorGrid.js.map +1 -1
  107. package/dist/OptionsEditorLayout/OptionsEditorGroup.js +1 -1
  108. package/dist/OptionsEditorLayout/OptionsEditorGroup.js.map +1 -1
  109. package/dist/OptionsEditorLayout/index.js +1 -1
  110. package/dist/OptionsEditorLayout/index.js.map +1 -1
  111. package/dist/Overlay/Overlay.js +1 -1
  112. package/dist/Overlay/Overlay.js.map +1 -1
  113. package/dist/Overlay/index.js +1 -1
  114. package/dist/Overlay/index.js.map +1 -1
  115. package/dist/RefreshIntervalPicker/RefreshIntervalPicker.js +1 -1
  116. package/dist/RefreshIntervalPicker/RefreshIntervalPicker.js.map +1 -1
  117. package/dist/RefreshIntervalPicker/index.js +1 -1
  118. package/dist/RefreshIntervalPicker/index.js.map +1 -1
  119. package/dist/SettingsAutocomplete/SettingsAutocomplete.d.ts +1 -1
  120. package/dist/SettingsAutocomplete/SettingsAutocomplete.d.ts.map +1 -1
  121. package/dist/SettingsAutocomplete/SettingsAutocomplete.js +16 -3
  122. package/dist/SettingsAutocomplete/SettingsAutocomplete.js.map +1 -1
  123. package/dist/SettingsAutocomplete/index.js +1 -1
  124. package/dist/SettingsAutocomplete/index.js.map +1 -1
  125. package/dist/SortSelector/SortSelector.js +1 -1
  126. package/dist/SortSelector/SortSelector.js.map +1 -1
  127. package/dist/SortSelector/SortSelectorButtons.js +1 -1
  128. package/dist/SortSelector/SortSelectorButtons.js.map +1 -1
  129. package/dist/SortSelector/index.js +1 -1
  130. package/dist/SortSelector/index.js.map +1 -1
  131. package/dist/Table/InnerTable.js +1 -1
  132. package/dist/Table/InnerTable.js.map +1 -1
  133. package/dist/Table/Table.d.ts +1 -1
  134. package/dist/Table/Table.d.ts.map +1 -1
  135. package/dist/Table/Table.js +31 -7
  136. package/dist/Table/Table.js.map +1 -1
  137. package/dist/Table/TableBody.js +1 -1
  138. package/dist/Table/TableBody.js.map +1 -1
  139. package/dist/Table/TableCell.d.ts +4 -2
  140. package/dist/Table/TableCell.d.ts.map +1 -1
  141. package/dist/Table/TableCell.js +27 -5
  142. package/dist/Table/TableCell.js.map +1 -1
  143. package/dist/Table/TableCheckbox.js +1 -1
  144. package/dist/Table/TableCheckbox.js.map +1 -1
  145. package/dist/Table/TableFoot.js +1 -1
  146. package/dist/Table/TableFoot.js.map +1 -1
  147. package/dist/Table/TableHead.js +1 -1
  148. package/dist/Table/TableHead.js.map +1 -1
  149. package/dist/Table/TableHeaderCell.js +1 -1
  150. package/dist/Table/TableHeaderCell.js.map +1 -1
  151. package/dist/Table/TableRow.js +1 -1
  152. package/dist/Table/TableRow.js.map +1 -1
  153. package/dist/Table/VirtualizedTable.d.ts.map +1 -1
  154. package/dist/Table/VirtualizedTable.js +19 -3
  155. package/dist/Table/VirtualizedTable.js.map +1 -1
  156. package/dist/Table/VirtualizedTableContainer.js +1 -1
  157. package/dist/Table/VirtualizedTableContainer.js.map +1 -1
  158. package/dist/Table/hooks/useTableKeyboardNav.js +1 -1
  159. package/dist/Table/hooks/useTableKeyboardNav.js.map +1 -1
  160. package/dist/Table/hooks/useVirtualizedTableKeyboardNav.js +1 -1
  161. package/dist/Table/hooks/useVirtualizedTableKeyboardNav.js.map +1 -1
  162. package/dist/Table/index.js +1 -1
  163. package/dist/Table/index.js.map +1 -1
  164. package/dist/Table/model/table-model.d.ts +16 -6
  165. package/dist/Table/model/table-model.d.ts.map +1 -1
  166. package/dist/Table/model/table-model.js +4 -3
  167. package/dist/Table/model/table-model.js.map +1 -1
  168. package/dist/ThresholdsEditor/ThresholdInput.js +1 -1
  169. package/dist/ThresholdsEditor/ThresholdInput.js.map +1 -1
  170. package/dist/ThresholdsEditor/ThresholdsEditor.js +1 -1
  171. package/dist/ThresholdsEditor/ThresholdsEditor.js.map +1 -1
  172. package/dist/ThresholdsEditor/index.js +1 -1
  173. package/dist/ThresholdsEditor/index.js.map +1 -1
  174. package/dist/TimeRangeSelector/DateTimeRangePicker.d.ts +2 -1
  175. package/dist/TimeRangeSelector/DateTimeRangePicker.d.ts.map +1 -1
  176. package/dist/TimeRangeSelector/DateTimeRangePicker.js +21 -33
  177. package/dist/TimeRangeSelector/DateTimeRangePicker.js.map +1 -1
  178. package/dist/TimeRangeSelector/TimeRangeSelector.d.ts +6 -1
  179. package/dist/TimeRangeSelector/TimeRangeSelector.d.ts.map +1 -1
  180. package/dist/TimeRangeSelector/TimeRangeSelector.js +140 -19
  181. package/dist/TimeRangeSelector/TimeRangeSelector.js.map +1 -1
  182. package/dist/TimeRangeSelector/index.js +1 -1
  183. package/dist/TimeRangeSelector/index.js.map +1 -1
  184. package/dist/TimeRangeSelector/utils.js +1 -1
  185. package/dist/TimeRangeSelector/utils.js.map +1 -1
  186. package/dist/TimeSeriesTooltip/SeriesInfo.js +1 -1
  187. package/dist/TimeSeriesTooltip/SeriesInfo.js.map +1 -1
  188. package/dist/TimeSeriesTooltip/SeriesLabelsStack.js +1 -1
  189. package/dist/TimeSeriesTooltip/SeriesLabelsStack.js.map +1 -1
  190. package/dist/TimeSeriesTooltip/SeriesMarker.js +1 -1
  191. package/dist/TimeSeriesTooltip/SeriesMarker.js.map +1 -1
  192. package/dist/TimeSeriesTooltip/TimeChartTooltip.d.ts +4 -0
  193. package/dist/TimeSeriesTooltip/TimeChartTooltip.d.ts.map +1 -1
  194. package/dist/TimeSeriesTooltip/TimeChartTooltip.js +3 -2
  195. package/dist/TimeSeriesTooltip/TimeChartTooltip.js.map +1 -1
  196. package/dist/TimeSeriesTooltip/TooltipContent.js +1 -1
  197. package/dist/TimeSeriesTooltip/TooltipContent.js.map +1 -1
  198. package/dist/TimeSeriesTooltip/TooltipHeader.d.ts.map +1 -1
  199. package/dist/TimeSeriesTooltip/TooltipHeader.js +6 -3
  200. package/dist/TimeSeriesTooltip/TooltipHeader.js.map +1 -1
  201. package/dist/TimeSeriesTooltip/index.js +1 -1
  202. package/dist/TimeSeriesTooltip/index.js.map +1 -1
  203. package/dist/TimeSeriesTooltip/nearby-series.d.ts +3 -14
  204. package/dist/TimeSeriesTooltip/nearby-series.d.ts.map +1 -1
  205. package/dist/TimeSeriesTooltip/nearby-series.js +80 -58
  206. package/dist/TimeSeriesTooltip/nearby-series.js.map +1 -1
  207. package/dist/TimeSeriesTooltip/tooltip-model.js +1 -1
  208. package/dist/TimeSeriesTooltip/tooltip-model.js.map +1 -1
  209. package/dist/TimeSeriesTooltip/utils.js +1 -1
  210. package/dist/TimeSeriesTooltip/utils.js.map +1 -1
  211. package/dist/TimeZoneSelector.d.ts +16 -0
  212. package/dist/TimeZoneSelector.d.ts.map +1 -0
  213. package/dist/TimeZoneSelector.js +58 -0
  214. package/dist/TimeZoneSelector.js.map +1 -0
  215. package/dist/ToolbarIconButton/ToolbarIconButton.js +1 -1
  216. package/dist/ToolbarIconButton/ToolbarIconButton.js.map +1 -1
  217. package/dist/ToolbarIconButton/index.js +1 -1
  218. package/dist/ToolbarIconButton/index.js.map +1 -1
  219. package/dist/TransformsEditor/TransformEditor.js +1 -1
  220. package/dist/TransformsEditor/TransformEditor.js.map +1 -1
  221. package/dist/TransformsEditor/TransformEditorContainer.js +1 -1
  222. package/dist/TransformsEditor/TransformEditorContainer.js.map +1 -1
  223. package/dist/TransformsEditor/TransformsEditor.js +1 -1
  224. package/dist/TransformsEditor/TransformsEditor.js.map +1 -1
  225. package/dist/TransformsEditor/index.js +1 -1
  226. package/dist/TransformsEditor/index.js.map +1 -1
  227. package/dist/ValueMappingEditor/ValueMappingEditor.js +1 -1
  228. package/dist/ValueMappingEditor/ValueMappingEditor.js.map +1 -1
  229. package/dist/ValueMappingEditor/ValueMappingsEditor.js +1 -1
  230. package/dist/ValueMappingEditor/ValueMappingsEditor.js.map +1 -1
  231. package/dist/ValueMappingEditor/index.js +1 -1
  232. package/dist/ValueMappingEditor/index.js.map +1 -1
  233. package/dist/YAxisLabel.js +1 -1
  234. package/dist/YAxisLabel.js.map +1 -1
  235. package/dist/cjs/AlignSelector/AlignSelector.js +1 -1
  236. package/dist/cjs/AlignSelector/index.js +1 -1
  237. package/dist/cjs/ColorPicker/ColorPicker.js +1 -1
  238. package/dist/cjs/ColorPicker/OptionsColorPicker.js +1 -1
  239. package/dist/cjs/ColorPicker/index.js +1 -1
  240. package/dist/cjs/ContentWithLegend/ContentWithLegend.js +1 -1
  241. package/dist/cjs/ContentWithLegend/index.js +1 -1
  242. package/dist/cjs/ContentWithLegend/model/content-with-legend-model.js +1 -1
  243. package/dist/cjs/DensitySelector/DensitySelector.js +1 -1
  244. package/dist/cjs/DensitySelector/index.js +1 -1
  245. package/dist/cjs/Dialog/Dialog.js +1 -1
  246. package/dist/cjs/Dialog/DiscardChangesConfirmationDialog.js +1 -1
  247. package/dist/cjs/Dialog/index.js +1 -1
  248. package/dist/cjs/DragAndDrop/DragAndDropList.js +1 -1
  249. package/dist/cjs/DragAndDrop/DragButton.js +1 -1
  250. package/dist/cjs/DragAndDrop/DropIndicator.js +1 -1
  251. package/dist/cjs/DragAndDrop/index.js +1 -1
  252. package/dist/cjs/DragAndDrop/model.js +1 -1
  253. package/dist/cjs/Drawer/Drawer.js +1 -1
  254. package/dist/cjs/Drawer/index.js +1 -1
  255. package/dist/cjs/EChart/EChart.js +1 -1
  256. package/dist/cjs/EChart/index.js +1 -1
  257. package/dist/cjs/ErrorAlert.js +1 -1
  258. package/dist/cjs/ErrorBoundary.js +1 -1
  259. package/dist/cjs/FontSizeSelector/FontSizeSelector.js +1 -1
  260. package/dist/cjs/FontSizeSelector/index.js +1 -1
  261. package/dist/cjs/FormEditor/FormActions.js +1 -1
  262. package/dist/cjs/FormEditor/index.js +1 -1
  263. package/dist/cjs/FormatControls/FormatControls.js +9 -22
  264. package/dist/cjs/FormatControls/UnitSelector.js +55 -0
  265. package/dist/cjs/FormatControls/index.js +2 -1
  266. package/dist/cjs/InfoTooltip/InfoTooltip.js +1 -1
  267. package/dist/cjs/InfoTooltip/index.js +1 -1
  268. package/dist/cjs/JSONEditor.js +1 -1
  269. package/dist/cjs/Legend/CompactLegend.js +1 -1
  270. package/dist/cjs/Legend/Legend.js +1 -1
  271. package/dist/cjs/Legend/LegendColorBadge.js +1 -1
  272. package/dist/cjs/Legend/ListLegend.js +1 -1
  273. package/dist/cjs/Legend/ListLegendItem.js +1 -1
  274. package/dist/cjs/Legend/TableLegend.js +1 -1
  275. package/dist/cjs/Legend/index.js +1 -1
  276. package/dist/cjs/Legend/legend-model.js +1 -1
  277. package/dist/cjs/LinksEditor/LinkEditorForm.js +1 -1
  278. package/dist/cjs/LinksEditor/LinksEditor.js +1 -1
  279. package/dist/cjs/LinksEditor/index.js +1 -1
  280. package/dist/cjs/ModeSelector/ModeSelector.js +1 -1
  281. package/dist/cjs/ModeSelector/index.js +1 -1
  282. package/dist/cjs/OptionsEditorLayout/OptionsEditorColumn.js +1 -1
  283. package/dist/cjs/OptionsEditorLayout/OptionsEditorControl.js +5 -2
  284. package/dist/cjs/OptionsEditorLayout/OptionsEditorGrid.js +1 -1
  285. package/dist/cjs/OptionsEditorLayout/OptionsEditorGroup.js +1 -1
  286. package/dist/cjs/OptionsEditorLayout/index.js +1 -1
  287. package/dist/cjs/Overlay/Overlay.js +1 -1
  288. package/dist/cjs/Overlay/index.js +1 -1
  289. package/dist/cjs/RefreshIntervalPicker/RefreshIntervalPicker.js +1 -1
  290. package/dist/cjs/RefreshIntervalPicker/index.js +1 -1
  291. package/dist/cjs/SettingsAutocomplete/SettingsAutocomplete.js +16 -3
  292. package/dist/cjs/SettingsAutocomplete/index.js +1 -1
  293. package/dist/cjs/SortSelector/SortSelector.js +1 -1
  294. package/dist/cjs/SortSelector/SortSelectorButtons.js +1 -1
  295. package/dist/cjs/SortSelector/index.js +1 -1
  296. package/dist/cjs/Table/InnerTable.js +1 -1
  297. package/dist/cjs/Table/Table.js +29 -5
  298. package/dist/cjs/Table/TableBody.js +1 -1
  299. package/dist/cjs/Table/TableCell.js +25 -3
  300. package/dist/cjs/Table/TableCheckbox.js +1 -1
  301. package/dist/cjs/Table/TableFoot.js +1 -1
  302. package/dist/cjs/Table/TableHead.js +1 -1
  303. package/dist/cjs/Table/TableHeaderCell.js +1 -1
  304. package/dist/cjs/Table/TableRow.js +1 -1
  305. package/dist/cjs/Table/VirtualizedTable.js +19 -3
  306. package/dist/cjs/Table/VirtualizedTableContainer.js +1 -1
  307. package/dist/cjs/Table/hooks/useTableKeyboardNav.js +1 -1
  308. package/dist/cjs/Table/hooks/useVirtualizedTableKeyboardNav.js +1 -1
  309. package/dist/cjs/Table/index.js +1 -1
  310. package/dist/cjs/Table/model/table-model.js +4 -3
  311. package/dist/cjs/ThresholdsEditor/ThresholdInput.js +1 -1
  312. package/dist/cjs/ThresholdsEditor/ThresholdsEditor.js +1 -1
  313. package/dist/cjs/ThresholdsEditor/index.js +1 -1
  314. package/dist/cjs/TimeRangeSelector/DateTimeRangePicker.js +20 -32
  315. package/dist/cjs/TimeRangeSelector/TimeRangeSelector.js +139 -18
  316. package/dist/cjs/TimeRangeSelector/index.js +1 -1
  317. package/dist/cjs/TimeRangeSelector/utils.js +1 -1
  318. package/dist/cjs/TimeSeriesTooltip/SeriesInfo.js +1 -1
  319. package/dist/cjs/TimeSeriesTooltip/SeriesLabelsStack.js +1 -1
  320. package/dist/cjs/TimeSeriesTooltip/SeriesMarker.js +1 -1
  321. package/dist/cjs/TimeSeriesTooltip/TimeChartTooltip.js +3 -2
  322. package/dist/cjs/TimeSeriesTooltip/TooltipContent.js +1 -1
  323. package/dist/cjs/TimeSeriesTooltip/TooltipHeader.js +6 -3
  324. package/dist/cjs/TimeSeriesTooltip/index.js +1 -1
  325. package/dist/cjs/TimeSeriesTooltip/nearby-series.js +80 -58
  326. package/dist/cjs/TimeSeriesTooltip/tooltip-model.js +1 -1
  327. package/dist/cjs/TimeSeriesTooltip/utils.js +1 -1
  328. package/dist/cjs/TimeZoneSelector.js +63 -0
  329. package/dist/cjs/ToolbarIconButton/ToolbarIconButton.js +1 -1
  330. package/dist/cjs/ToolbarIconButton/index.js +1 -1
  331. package/dist/cjs/TransformsEditor/TransformEditor.js +1 -1
  332. package/dist/cjs/TransformsEditor/TransformEditorContainer.js +1 -1
  333. package/dist/cjs/TransformsEditor/TransformsEditor.js +1 -1
  334. package/dist/cjs/TransformsEditor/index.js +1 -1
  335. package/dist/cjs/ValueMappingEditor/ValueMappingEditor.js +1 -1
  336. package/dist/cjs/ValueMappingEditor/ValueMappingsEditor.js +1 -1
  337. package/dist/cjs/ValueMappingEditor/index.js +1 -1
  338. package/dist/cjs/YAxisLabel.js +1 -1
  339. package/dist/cjs/context/ChartsProvider.js +1 -1
  340. package/dist/cjs/context/ItemActionsProvider.js +111 -0
  341. package/dist/cjs/context/SelectionProvider.js +128 -0
  342. package/dist/cjs/context/SnackbarProvider.js +1 -1
  343. package/dist/cjs/context/TimeZoneProvider.js +1 -1
  344. package/dist/cjs/context/index.js +3 -1
  345. package/dist/cjs/controls/TextField.js +1 -1
  346. package/dist/cjs/controls/index.js +1 -1
  347. package/dist/cjs/index.js +2 -1
  348. package/dist/cjs/model/graph.js +1 -1
  349. package/dist/cjs/model/index.js +2 -1
  350. package/dist/cjs/model/theme.js +1 -1
  351. package/dist/cjs/model/timeOption.js +1 -1
  352. package/dist/cjs/model/timeZoneOption.js +34 -0
  353. package/dist/cjs/test/index.js +1 -1
  354. package/dist/cjs/test/render.js +1 -1
  355. package/dist/cjs/test/setup-tests.js +1 -1
  356. package/dist/cjs/test-utils/index.js +1 -1
  357. package/dist/cjs/test-utils/theme.js +1 -1
  358. package/dist/cjs/theme/component-overrides/alert.js +1 -1
  359. package/dist/cjs/theme/component-overrides/paper.js +1 -1
  360. package/dist/cjs/theme/index.js +1 -1
  361. package/dist/cjs/theme/palette/background.js +1 -1
  362. package/dist/cjs/theme/palette/colors/blue.js +1 -1
  363. package/dist/cjs/theme/palette/colors/common.js +1 -1
  364. package/dist/cjs/theme/palette/colors/green.js +1 -1
  365. package/dist/cjs/theme/palette/colors/grey.js +1 -1
  366. package/dist/cjs/theme/palette/colors/index.js +1 -1
  367. package/dist/cjs/theme/palette/colors/orange.js +1 -1
  368. package/dist/cjs/theme/palette/colors/purple.js +1 -1
  369. package/dist/cjs/theme/palette/colors/red.js +1 -1
  370. package/dist/cjs/theme/palette/colors/types.js +1 -1
  371. package/dist/cjs/theme/palette/error.js +1 -1
  372. package/dist/cjs/theme/palette/grey.js +1 -1
  373. package/dist/cjs/theme/palette/index.js +1 -1
  374. package/dist/cjs/theme/palette/palette-options.js +1 -1
  375. package/dist/cjs/theme/palette/primary.js +1 -1
  376. package/dist/cjs/theme/palette/secondary.js +1 -1
  377. package/dist/cjs/theme/palette/success.js +1 -1
  378. package/dist/cjs/theme/palette/text.js +1 -1
  379. package/dist/cjs/theme/palette/warning.js +1 -1
  380. package/dist/cjs/theme/theme.js +1 -1
  381. package/dist/cjs/theme/types/ThemeExtension.d.js +1 -1
  382. package/dist/cjs/theme/typography.js +1 -1
  383. package/dist/cjs/utils/axis.js +80 -5
  384. package/dist/cjs/utils/browser-storage.js +1 -1
  385. package/dist/cjs/utils/chart-actions.js +1 -1
  386. package/dist/cjs/utils/combine-sx.js +1 -1
  387. package/dist/cjs/utils/component-ids.js +1 -1
  388. package/dist/cjs/utils/data-field-interpolation.js +230 -0
  389. package/dist/cjs/utils/format.js +1 -1
  390. package/dist/cjs/utils/index.js +5 -2
  391. package/dist/cjs/utils/mathjs.js +1 -1
  392. package/dist/cjs/utils/memo.js +1 -1
  393. package/dist/cjs/utils/selection-interpolation.js +69 -0
  394. package/dist/cjs/utils/theme-gen.js +1 -1
  395. package/dist/cjs/utils/variable-interpolation.js +192 -0
  396. package/dist/context/ChartsProvider.js +1 -1
  397. package/dist/context/ChartsProvider.js.map +1 -1
  398. package/dist/context/ItemActionsProvider.d.ts +25 -0
  399. package/dist/context/ItemActionsProvider.d.ts.map +1 -0
  400. package/dist/context/ItemActionsProvider.js +95 -0
  401. package/dist/context/ItemActionsProvider.js.map +1 -0
  402. package/dist/context/SelectionProvider.d.ts +34 -0
  403. package/dist/context/SelectionProvider.d.ts.map +1 -0
  404. package/dist/context/SelectionProvider.js +120 -0
  405. package/dist/context/SelectionProvider.js.map +1 -0
  406. package/dist/context/SnackbarProvider.js +1 -1
  407. package/dist/context/SnackbarProvider.js.map +1 -1
  408. package/dist/context/TimeZoneProvider.js +1 -1
  409. package/dist/context/TimeZoneProvider.js.map +1 -1
  410. package/dist/context/index.d.ts +2 -0
  411. package/dist/context/index.d.ts.map +1 -1
  412. package/dist/context/index.js +3 -1
  413. package/dist/context/index.js.map +1 -1
  414. package/dist/controls/TextField.js +1 -1
  415. package/dist/controls/TextField.js.map +1 -1
  416. package/dist/controls/index.js +1 -1
  417. package/dist/controls/index.js.map +1 -1
  418. package/dist/index.d.ts +1 -0
  419. package/dist/index.d.ts.map +1 -1
  420. package/dist/index.js +2 -1
  421. package/dist/index.js.map +1 -1
  422. package/dist/model/graph.js +1 -1
  423. package/dist/model/graph.js.map +1 -1
  424. package/dist/model/index.d.ts +1 -0
  425. package/dist/model/index.d.ts.map +1 -1
  426. package/dist/model/index.js +2 -1
  427. package/dist/model/index.js.map +1 -1
  428. package/dist/model/theme.d.ts +1 -0
  429. package/dist/model/theme.d.ts.map +1 -1
  430. package/dist/model/theme.js +1 -1
  431. package/dist/model/theme.js.map +1 -1
  432. package/dist/model/timeOption.js +1 -1
  433. package/dist/model/timeOption.js.map +1 -1
  434. package/dist/model/timeZoneOption.d.ts +10 -0
  435. package/dist/model/timeZoneOption.d.ts.map +1 -0
  436. package/dist/model/timeZoneOption.js +29 -0
  437. package/dist/model/timeZoneOption.js.map +1 -0
  438. package/dist/test/index.js +1 -1
  439. package/dist/test/index.js.map +1 -1
  440. package/dist/test/render.js +1 -1
  441. package/dist/test/render.js.map +1 -1
  442. package/dist/test/setup-tests.js +1 -1
  443. package/dist/test/setup-tests.js.map +1 -1
  444. package/dist/test-utils/index.js +1 -1
  445. package/dist/test-utils/index.js.map +1 -1
  446. package/dist/test-utils/theme.js +1 -1
  447. package/dist/test-utils/theme.js.map +1 -1
  448. package/dist/theme/component-overrides/alert.js +1 -1
  449. package/dist/theme/component-overrides/alert.js.map +1 -1
  450. package/dist/theme/component-overrides/paper.js +1 -1
  451. package/dist/theme/component-overrides/paper.js.map +1 -1
  452. package/dist/theme/index.js +1 -1
  453. package/dist/theme/index.js.map +1 -1
  454. package/dist/theme/palette/background.js +1 -1
  455. package/dist/theme/palette/background.js.map +1 -1
  456. package/dist/theme/palette/colors/blue.js +1 -1
  457. package/dist/theme/palette/colors/blue.js.map +1 -1
  458. package/dist/theme/palette/colors/common.js +1 -1
  459. package/dist/theme/palette/colors/common.js.map +1 -1
  460. package/dist/theme/palette/colors/green.js +1 -1
  461. package/dist/theme/palette/colors/green.js.map +1 -1
  462. package/dist/theme/palette/colors/grey.js +1 -1
  463. package/dist/theme/palette/colors/grey.js.map +1 -1
  464. package/dist/theme/palette/colors/index.js +1 -1
  465. package/dist/theme/palette/colors/index.js.map +1 -1
  466. package/dist/theme/palette/colors/orange.js +1 -1
  467. package/dist/theme/palette/colors/orange.js.map +1 -1
  468. package/dist/theme/palette/colors/purple.js +1 -1
  469. package/dist/theme/palette/colors/purple.js.map +1 -1
  470. package/dist/theme/palette/colors/red.js +1 -1
  471. package/dist/theme/palette/colors/red.js.map +1 -1
  472. package/dist/theme/palette/colors/types.js +1 -1
  473. package/dist/theme/palette/colors/types.js.map +1 -1
  474. package/dist/theme/palette/error.js +1 -1
  475. package/dist/theme/palette/error.js.map +1 -1
  476. package/dist/theme/palette/grey.js +1 -1
  477. package/dist/theme/palette/grey.js.map +1 -1
  478. package/dist/theme/palette/index.js +1 -1
  479. package/dist/theme/palette/index.js.map +1 -1
  480. package/dist/theme/palette/palette-options.js +1 -1
  481. package/dist/theme/palette/palette-options.js.map +1 -1
  482. package/dist/theme/palette/primary.js +1 -1
  483. package/dist/theme/palette/primary.js.map +1 -1
  484. package/dist/theme/palette/secondary.js +1 -1
  485. package/dist/theme/palette/secondary.js.map +1 -1
  486. package/dist/theme/palette/success.js +1 -1
  487. package/dist/theme/palette/success.js.map +1 -1
  488. package/dist/theme/palette/text.js +1 -1
  489. package/dist/theme/palette/text.js.map +1 -1
  490. package/dist/theme/palette/warning.js +1 -1
  491. package/dist/theme/palette/warning.js.map +1 -1
  492. package/dist/theme/theme.js +1 -1
  493. package/dist/theme/theme.js.map +1 -1
  494. package/dist/theme/types/ThemeExtension.d.js +1 -1
  495. package/dist/theme/types/ThemeExtension.d.js.map +1 -1
  496. package/dist/theme/typography.js +1 -1
  497. package/dist/theme/typography.js.map +1 -1
  498. package/dist/utils/axis.d.ts +18 -0
  499. package/dist/utils/axis.d.ts.map +1 -1
  500. package/dist/utils/axis.js +79 -3
  501. package/dist/utils/axis.js.map +1 -1
  502. package/dist/utils/browser-storage.js +1 -1
  503. package/dist/utils/browser-storage.js.map +1 -1
  504. package/dist/utils/chart-actions.js +1 -1
  505. package/dist/utils/chart-actions.js.map +1 -1
  506. package/dist/utils/combine-sx.js +1 -1
  507. package/dist/utils/combine-sx.js.map +1 -1
  508. package/dist/utils/component-ids.js +1 -1
  509. package/dist/utils/component-ids.js.map +1 -1
  510. package/dist/utils/data-field-interpolation.d.ts +84 -0
  511. package/dist/utils/data-field-interpolation.d.ts.map +1 -0
  512. package/dist/utils/data-field-interpolation.js +239 -0
  513. package/dist/utils/data-field-interpolation.js.map +1 -0
  514. package/dist/utils/format.js +1 -1
  515. package/dist/utils/format.js.map +1 -1
  516. package/dist/utils/index.d.ts +4 -1
  517. package/dist/utils/index.d.ts.map +1 -1
  518. package/dist/utils/index.js +5 -2
  519. package/dist/utils/index.js.map +1 -1
  520. package/dist/utils/mathjs.js +1 -1
  521. package/dist/utils/mathjs.js.map +1 -1
  522. package/dist/utils/memo.js +1 -1
  523. package/dist/utils/memo.js.map +1 -1
  524. package/dist/utils/selection-interpolation.d.ts +32 -0
  525. package/dist/utils/selection-interpolation.d.ts.map +1 -0
  526. package/dist/utils/selection-interpolation.js +77 -0
  527. package/dist/utils/selection-interpolation.js.map +1 -0
  528. package/dist/utils/theme-gen.js +1 -1
  529. package/dist/utils/theme-gen.js.map +1 -1
  530. package/dist/utils/variable-interpolation.d.ts +71 -0
  531. package/dist/utils/variable-interpolation.d.ts.map +1 -0
  532. package/dist/utils/variable-interpolation.js +176 -0
  533. package/dist/utils/variable-interpolation.js.map +1 -0
  534. package/package.json +3 -3
@@ -1,4 +1,4 @@
1
- // Copyright 2023 The Perses Authors
1
+ // Copyright The Perses Authors
2
2
  // Licensed under the Apache License, Version 2.0 (the "License");
3
3
  // you may not use this file except in compliance with the License.
4
4
  // You may obtain a copy of the License at
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/ThresholdsEditor/ThresholdsEditor.tsx"],"sourcesContent":["// Copyright 2023 The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport React, { ReactElement, useEffect, useRef, useState } from 'react';\nimport { produce } from 'immer';\nimport { IconButton, ToggleButton, ToggleButtonGroup, Typography } from '@mui/material';\nimport PlusIcon from 'mdi-material-ui/Plus';\nimport { Stack } from '@mui/system';\nimport { ThresholdOptions } from '@perses-dev/core';\nimport { useChartsTheme } from '../context/ChartsProvider';\nimport { OptionsEditorControl, OptionsEditorGroup } from '../OptionsEditorLayout';\nimport { InfoTooltip } from '../InfoTooltip';\nimport { OptionsColorPicker } from '../ColorPicker/OptionsColorPicker';\nimport { ThresholdInput } from './ThresholdInput';\n\nexport interface ThresholdsEditorProps {\n onChange: (thresholds: ThresholdOptions) => void;\n thresholds?: ThresholdOptions;\n hideDefault?: boolean;\n disablePercentMode?: boolean;\n}\n\nconst DEFAULT_STEP = 10;\n\nexport function ThresholdsEditor({\n thresholds,\n onChange,\n hideDefault,\n disablePercentMode,\n}: ThresholdsEditorProps): ReactElement {\n const chartsTheme = useChartsTheme();\n const {\n thresholds: { defaultColor, palette },\n } = chartsTheme;\n const defaultThresholdColor = thresholds?.defaultColor ?? defaultColor;\n\n const [steps, setSteps] = useState(thresholds?.steps);\n useEffect(() => {\n setSteps(thresholds?.steps);\n }, [thresholds?.steps]);\n\n // every time a new threshold is added, we want to focus the recently added input\n const recentlyAddedInputRef = useRef<HTMLInputElement | null>(null);\n const focusRef = useRef(false);\n useEffect(() => {\n if (!recentlyAddedInputRef.current || !focusRef.current) return;\n recentlyAddedInputRef.current?.focus();\n focusRef.current = false;\n }, [steps?.length]);\n\n const handleThresholdValueChange = (e: React.ChangeEvent<HTMLInputElement>, i: number): void => {\n setSteps(\n produce(steps, (draft) => {\n const step = draft?.[i];\n if (step) {\n step.value = Number(e.target.value);\n }\n })\n );\n };\n\n const handleThresholdColorChange = (color: string, i: number): void => {\n if (thresholds !== undefined) {\n onChange(\n produce(thresholds, (draft) => {\n if (draft.steps !== undefined) {\n const step = draft.steps[i];\n if (step) {\n step.color = color;\n }\n }\n })\n );\n }\n };\n\n const handleDefaultColorChange = (color: string): void => {\n if (thresholds !== undefined) {\n onChange(\n produce(thresholds, (draft) => {\n draft.defaultColor = color;\n })\n );\n } else {\n onChange({\n defaultColor: color,\n });\n }\n };\n\n // sort thresholds in ascending order every time an input blurs\n const handleThresholdBlur = (): void => {\n if (steps !== undefined) {\n const sortedSteps = [...steps];\n sortedSteps.sort((a, b) => a.value - b.value);\n if (thresholds !== undefined) {\n onChange(\n produce(thresholds, (draft) => {\n draft.steps = sortedSteps;\n })\n );\n }\n }\n };\n\n const deleteThreshold = (i: number): void => {\n if (thresholds !== undefined) {\n const updatedThresholds = produce(thresholds, (draft) => {\n if (draft.steps) {\n draft.steps.splice(i, 1);\n }\n });\n onChange(updatedThresholds);\n }\n };\n\n const addThresholdInput = (): void => {\n focusRef.current = true;\n if (thresholds === undefined) {\n onChange({\n steps: [{ value: DEFAULT_STEP }],\n });\n } else if (thresholds && thresholds.steps === undefined) {\n onChange(\n produce(thresholds, (draft) => {\n draft.steps = [{ value: DEFAULT_STEP }];\n })\n );\n } else {\n onChange(\n produce(thresholds, (draft) => {\n const steps = draft.steps;\n if (steps?.length) {\n const lastStep = steps[steps.length - 1];\n const color = palette[steps.length] ?? getRandomColor(); // we will assign color from the palette first, then generate random color\n steps.push({ color, value: (lastStep?.value ?? 0) + DEFAULT_STEP }); // set new threshold value to last step value + 10\n } else if (steps) {\n steps.push({ value: DEFAULT_STEP });\n }\n })\n );\n }\n };\n\n const handleModeChange = (event: React.MouseEvent, value: string): void => {\n const mode = value === 'percent' ? 'percent' : undefined;\n if (thresholds !== undefined) {\n onChange(\n produce(thresholds, (draft) => {\n draft.mode = mode;\n })\n );\n } else {\n onChange({ mode });\n }\n };\n\n return (\n <OptionsEditorGroup\n title=\"Thresholds\"\n icon={\n <InfoTooltip description=\"Add threshold\">\n <IconButton size=\"small\" aria-label=\"add threshold\" onClick={addThresholdInput}>\n <PlusIcon />\n </IconButton>\n </InfoTooltip>\n }\n >\n <OptionsEditorControl\n label=\"Mode\"\n description=\"Percentage means thresholds relative to min & max\"\n control={\n <ToggleButtonGroup\n exclusive\n disabled={disablePercentMode}\n value={thresholds?.mode ?? 'absolute'}\n onChange={handleModeChange}\n sx={{ height: '36px', marginLeft: 'auto' }}\n >\n <ToggleButton aria-label=\"absolute\" value=\"absolute\" sx={{ fontWeight: 500 }}>\n Absolute\n </ToggleButton>\n <ToggleButton aria-label=\"percent\" value=\"percent\" sx={{ fontWeight: 500 }}>\n Percent\n </ToggleButton>\n </ToggleButtonGroup>\n }\n />\n {steps &&\n steps\n .map((step, i) => (\n <ThresholdInput\n inputRef={i === steps.length - 1 ? recentlyAddedInputRef : undefined}\n key={i}\n label={`T${i + 1}`}\n color={step.color ?? palette[i] ?? defaultThresholdColor}\n value={step.value}\n mode={thresholds?.mode}\n onColorChange={(color) => handleThresholdColorChange(color, i)}\n onChange={(e) => {\n handleThresholdValueChange(e, i);\n }}\n onDelete={() => {\n deleteThreshold(i);\n }}\n onBlur={handleThresholdBlur}\n />\n ))\n .reverse()}\n {!hideDefault && (\n <Stack flex={1} direction=\"row\" alignItems=\"center\" spacing={1}>\n <OptionsColorPicker label=\"default\" color={defaultThresholdColor} onColorChange={handleDefaultColorChange} />\n <Typography>Default</Typography>\n </Stack>\n )}\n </OptionsEditorGroup>\n );\n}\n\n// https://www.paulirish.com/2009/random-hex-color-code-snippets/\nconst getRandomColor = (): string => {\n return (\n '#' +\n Math.floor(Math.random() * 16777216)\n .toString(16)\n .padStart(6, '0')\n );\n};\n"],"names":["React","useEffect","useRef","useState","produce","IconButton","ToggleButton","ToggleButtonGroup","Typography","PlusIcon","Stack","useChartsTheme","OptionsEditorControl","OptionsEditorGroup","InfoTooltip","OptionsColorPicker","ThresholdInput","DEFAULT_STEP","ThresholdsEditor","thresholds","onChange","hideDefault","disablePercentMode","chartsTheme","defaultColor","palette","defaultThresholdColor","steps","setSteps","recentlyAddedInputRef","focusRef","current","focus","length","handleThresholdValueChange","e","i","draft","step","value","Number","target","handleThresholdColorChange","color","undefined","handleDefaultColorChange","handleThresholdBlur","sortedSteps","sort","a","b","deleteThreshold","updatedThresholds","splice","addThresholdInput","lastStep","getRandomColor","push","handleModeChange","event","mode","title","icon","description","size","aria-label","onClick","label","control","exclusive","disabled","sx","height","marginLeft","fontWeight","map","inputRef","onColorChange","onDelete","onBlur","reverse","flex","direction","alignItems","spacing","Math","floor","random","toString","padStart"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/ThresholdsEditor/ThresholdsEditor.tsx"],"sourcesContent":["// Copyright The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport React, { ReactElement, useEffect, useRef, useState } from 'react';\nimport { produce } from 'immer';\nimport { IconButton, ToggleButton, ToggleButtonGroup, Typography } from '@mui/material';\nimport PlusIcon from 'mdi-material-ui/Plus';\nimport { Stack } from '@mui/system';\nimport { ThresholdOptions } from '@perses-dev/core';\nimport { useChartsTheme } from '../context/ChartsProvider';\nimport { OptionsEditorControl, OptionsEditorGroup } from '../OptionsEditorLayout';\nimport { InfoTooltip } from '../InfoTooltip';\nimport { OptionsColorPicker } from '../ColorPicker/OptionsColorPicker';\nimport { ThresholdInput } from './ThresholdInput';\n\nexport interface ThresholdsEditorProps {\n onChange: (thresholds: ThresholdOptions) => void;\n thresholds?: ThresholdOptions;\n hideDefault?: boolean;\n disablePercentMode?: boolean;\n}\n\nconst DEFAULT_STEP = 10;\n\nexport function ThresholdsEditor({\n thresholds,\n onChange,\n hideDefault,\n disablePercentMode,\n}: ThresholdsEditorProps): ReactElement {\n const chartsTheme = useChartsTheme();\n const {\n thresholds: { defaultColor, palette },\n } = chartsTheme;\n const defaultThresholdColor = thresholds?.defaultColor ?? defaultColor;\n\n const [steps, setSteps] = useState(thresholds?.steps);\n useEffect(() => {\n setSteps(thresholds?.steps);\n }, [thresholds?.steps]);\n\n // every time a new threshold is added, we want to focus the recently added input\n const recentlyAddedInputRef = useRef<HTMLInputElement | null>(null);\n const focusRef = useRef(false);\n useEffect(() => {\n if (!recentlyAddedInputRef.current || !focusRef.current) return;\n recentlyAddedInputRef.current?.focus();\n focusRef.current = false;\n }, [steps?.length]);\n\n const handleThresholdValueChange = (e: React.ChangeEvent<HTMLInputElement>, i: number): void => {\n setSteps(\n produce(steps, (draft) => {\n const step = draft?.[i];\n if (step) {\n step.value = Number(e.target.value);\n }\n })\n );\n };\n\n const handleThresholdColorChange = (color: string, i: number): void => {\n if (thresholds !== undefined) {\n onChange(\n produce(thresholds, (draft) => {\n if (draft.steps !== undefined) {\n const step = draft.steps[i];\n if (step) {\n step.color = color;\n }\n }\n })\n );\n }\n };\n\n const handleDefaultColorChange = (color: string): void => {\n if (thresholds !== undefined) {\n onChange(\n produce(thresholds, (draft) => {\n draft.defaultColor = color;\n })\n );\n } else {\n onChange({\n defaultColor: color,\n });\n }\n };\n\n // sort thresholds in ascending order every time an input blurs\n const handleThresholdBlur = (): void => {\n if (steps !== undefined) {\n const sortedSteps = [...steps];\n sortedSteps.sort((a, b) => a.value - b.value);\n if (thresholds !== undefined) {\n onChange(\n produce(thresholds, (draft) => {\n draft.steps = sortedSteps;\n })\n );\n }\n }\n };\n\n const deleteThreshold = (i: number): void => {\n if (thresholds !== undefined) {\n const updatedThresholds = produce(thresholds, (draft) => {\n if (draft.steps) {\n draft.steps.splice(i, 1);\n }\n });\n onChange(updatedThresholds);\n }\n };\n\n const addThresholdInput = (): void => {\n focusRef.current = true;\n if (thresholds === undefined) {\n onChange({\n steps: [{ value: DEFAULT_STEP }],\n });\n } else if (thresholds && thresholds.steps === undefined) {\n onChange(\n produce(thresholds, (draft) => {\n draft.steps = [{ value: DEFAULT_STEP }];\n })\n );\n } else {\n onChange(\n produce(thresholds, (draft) => {\n const steps = draft.steps;\n if (steps?.length) {\n const lastStep = steps[steps.length - 1];\n const color = palette[steps.length] ?? getRandomColor(); // we will assign color from the palette first, then generate random color\n steps.push({ color, value: (lastStep?.value ?? 0) + DEFAULT_STEP }); // set new threshold value to last step value + 10\n } else if (steps) {\n steps.push({ value: DEFAULT_STEP });\n }\n })\n );\n }\n };\n\n const handleModeChange = (event: React.MouseEvent, value: string): void => {\n const mode = value === 'percent' ? 'percent' : undefined;\n if (thresholds !== undefined) {\n onChange(\n produce(thresholds, (draft) => {\n draft.mode = mode;\n })\n );\n } else {\n onChange({ mode });\n }\n };\n\n return (\n <OptionsEditorGroup\n title=\"Thresholds\"\n icon={\n <InfoTooltip description=\"Add threshold\">\n <IconButton size=\"small\" aria-label=\"add threshold\" onClick={addThresholdInput}>\n <PlusIcon />\n </IconButton>\n </InfoTooltip>\n }\n >\n <OptionsEditorControl\n label=\"Mode\"\n description=\"Percentage means thresholds relative to min & max\"\n control={\n <ToggleButtonGroup\n exclusive\n disabled={disablePercentMode}\n value={thresholds?.mode ?? 'absolute'}\n onChange={handleModeChange}\n sx={{ height: '36px', marginLeft: 'auto' }}\n >\n <ToggleButton aria-label=\"absolute\" value=\"absolute\" sx={{ fontWeight: 500 }}>\n Absolute\n </ToggleButton>\n <ToggleButton aria-label=\"percent\" value=\"percent\" sx={{ fontWeight: 500 }}>\n Percent\n </ToggleButton>\n </ToggleButtonGroup>\n }\n />\n {steps &&\n steps\n .map((step, i) => (\n <ThresholdInput\n inputRef={i === steps.length - 1 ? recentlyAddedInputRef : undefined}\n key={i}\n label={`T${i + 1}`}\n color={step.color ?? palette[i] ?? defaultThresholdColor}\n value={step.value}\n mode={thresholds?.mode}\n onColorChange={(color) => handleThresholdColorChange(color, i)}\n onChange={(e) => {\n handleThresholdValueChange(e, i);\n }}\n onDelete={() => {\n deleteThreshold(i);\n }}\n onBlur={handleThresholdBlur}\n />\n ))\n .reverse()}\n {!hideDefault && (\n <Stack flex={1} direction=\"row\" alignItems=\"center\" spacing={1}>\n <OptionsColorPicker label=\"default\" color={defaultThresholdColor} onColorChange={handleDefaultColorChange} />\n <Typography>Default</Typography>\n </Stack>\n )}\n </OptionsEditorGroup>\n );\n}\n\n// https://www.paulirish.com/2009/random-hex-color-code-snippets/\nconst getRandomColor = (): string => {\n return (\n '#' +\n Math.floor(Math.random() * 16777216)\n .toString(16)\n .padStart(6, '0')\n );\n};\n"],"names":["React","useEffect","useRef","useState","produce","IconButton","ToggleButton","ToggleButtonGroup","Typography","PlusIcon","Stack","useChartsTheme","OptionsEditorControl","OptionsEditorGroup","InfoTooltip","OptionsColorPicker","ThresholdInput","DEFAULT_STEP","ThresholdsEditor","thresholds","onChange","hideDefault","disablePercentMode","chartsTheme","defaultColor","palette","defaultThresholdColor","steps","setSteps","recentlyAddedInputRef","focusRef","current","focus","length","handleThresholdValueChange","e","i","draft","step","value","Number","target","handleThresholdColorChange","color","undefined","handleDefaultColorChange","handleThresholdBlur","sortedSteps","sort","a","b","deleteThreshold","updatedThresholds","splice","addThresholdInput","lastStep","getRandomColor","push","handleModeChange","event","mode","title","icon","description","size","aria-label","onClick","label","control","exclusive","disabled","sx","height","marginLeft","fontWeight","map","inputRef","onColorChange","onDelete","onBlur","reverse","flex","direction","alignItems","spacing","Math","floor","random","toString","padStart"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- // Copyright 2023 The Perses Authors
1
+ // Copyright The Perses Authors
2
2
  // Licensed under the Apache License, Version 2.0 (the "License");
3
3
  // you may not use this file except in compliance with the License.
4
4
  // You may obtain a copy of the License at
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/ThresholdsEditor/index.ts"],"sourcesContent":["// Copyright 2023 The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nexport * from './ThresholdsEditor';\n"],"names":[],"mappings":"AAAA,oCAAoC;AACpC,kEAAkE;AAClE,mEAAmE;AACnE,0CAA0C;AAC1C,EAAE;AACF,6CAA6C;AAC7C,EAAE;AACF,sEAAsE;AACtE,oEAAoE;AACpE,2EAA2E;AAC3E,sEAAsE;AACtE,iCAAiC;AAEjC,cAAc,qBAAqB"}
1
+ {"version":3,"sources":["../../src/ThresholdsEditor/index.ts"],"sourcesContent":["// Copyright The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nexport * from './ThresholdsEditor';\n"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,kEAAkE;AAClE,mEAAmE;AACnE,0CAA0C;AAC1C,EAAE;AACF,6CAA6C;AAC7C,EAAE;AACF,sEAAsE;AACtE,oEAAoE;AACpE,2EAA2E;AAC3E,sEAAsE;AACtE,iCAAiC;AAEjC,cAAc,qBAAqB"}
@@ -4,6 +4,7 @@ interface AbsoluteTimeFormProps {
4
4
  initialTimeRange: AbsoluteTimeRange;
5
5
  onChange: (timeRange: AbsoluteTimeRange) => void;
6
6
  onCancel: () => void;
7
+ timeZone: string;
7
8
  }
8
9
  /**
9
10
  * Start and End datetime picker, allowing use to select a specific time range selecting two absolute dates and times.
@@ -14,6 +15,6 @@ interface AbsoluteTimeFormProps {
14
15
  * @param onCancel event received when user click on cancel
15
16
  * @constructor
16
17
  */
17
- export declare const DateTimeRangePicker: ({ initialTimeRange, onChange, onCancel }: AbsoluteTimeFormProps) => ReactElement;
18
+ export declare const DateTimeRangePicker: ({ initialTimeRange, onChange, onCancel, timeZone, }: AbsoluteTimeFormProps) => ReactElement;
18
19
  export {};
19
20
  //# sourceMappingURL=DateTimeRangePicker.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"DateTimeRangePicker.d.ts","sourceRoot":"","sources":["../../src/TimeRangeSelector/DateTimeRangePicker.tsx"],"names":[],"mappings":"AAaA,OAAO,EAAE,YAAY,EAAY,MAAM,OAAO,CAAC;AAI/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAMrD,UAAU,qBAAqB;IAC7B,gBAAgB,EAAE,iBAAiB,CAAC;IACpC,QAAQ,EAAE,CAAC,SAAS,EAAE,iBAAiB,KAAK,IAAI,CAAC;IACjD,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB;AAMD;;;;;;;;GAQG;AACH,eAAO,MAAM,mBAAmB,6CAA8C,qBAAqB,KAAG,YA0KrG,CAAC"}
1
+ {"version":3,"file":"DateTimeRangePicker.d.ts","sourceRoot":"","sources":["../../src/TimeRangeSelector/DateTimeRangePicker.tsx"],"names":[],"mappings":"AAaA,OAAO,EAAE,YAAY,EAAqB,MAAM,OAAO,CAAC;AAIxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAMrD,UAAU,qBAAqB;IAC7B,gBAAgB,EAAE,iBAAiB,CAAC;IACpC,QAAQ,EAAE,CAAC,SAAS,EAAE,iBAAiB,KAAK,IAAI,CAAC;IACjD,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAMD;;;;;;;;GAQG;AACH,eAAO,MAAM,mBAAmB,wDAK7B,qBAAqB,KAAG,YAsJ1B,CAAC"}
@@ -1,4 +1,4 @@
1
- // Copyright 2024 The Perses Authors
1
+ // Copyright The Perses Authors
2
2
  // Licensed under the Apache License, Version 2.0 (the "License");
3
3
  // you may not use this file except in compliance with the License.
4
4
  // You may obtain a copy of the License at
@@ -11,13 +11,13 @@
11
11
  // See the License for the specific language governing permissions and
12
12
  // limitations under the License.
13
13
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
14
- import { useState } from 'react';
14
+ import { useMemo, useState } from 'react';
15
15
  import { Box, Stack, Typography, Button } from '@mui/material';
16
16
  import { DateTimeField, LocalizationProvider, StaticDateTimePicker } from '@mui/x-date-pickers';
17
17
  import { AdapterDateFns } from '@mui/x-date-pickers/AdapterDateFnsV3';
18
- import { useTimeZone } from '../context';
19
18
  import { ErrorBoundary } from '../ErrorBoundary';
20
19
  import { ErrorAlert } from '../ErrorAlert';
20
+ import { formatWithTimeZone } from '../utils/format';
21
21
  import { DATE_TIME_FORMAT, validateDateRange } from './utils';
22
22
  /**
23
23
  * Start and End datetime picker, allowing use to select a specific time range selecting two absolute dates and times.
@@ -27,38 +27,27 @@ import { DATE_TIME_FORMAT, validateDateRange } from './utils';
27
27
  * @param onChange event received when start and end has been selected (click on apply)
28
28
  * @param onCancel event received when user click on cancel
29
29
  * @constructor
30
- */ export const DateTimeRangePicker = ({ initialTimeRange, onChange, onCancel })=>{
31
- const { formatWithUserTimeZone } = useTimeZone();
30
+ */ export const DateTimeRangePicker = ({ initialTimeRange, onChange, onCancel, timeZone })=>{
32
31
  // Time range values as dates that can be used as a time range.
33
32
  const [timeRange, setTimeRange] = useState(initialTimeRange);
34
- // Time range values as strings used to populate the text inputs. May not
35
- // be valid as dates when the user is typing.
36
- const [timeRangeInputs, setTimeRangeInputs] = useState({
37
- start: formatWithUserTimeZone(initialTimeRange.start, DATE_TIME_FORMAT),
38
- end: formatWithUserTimeZone(initialTimeRange.end, DATE_TIME_FORMAT)
39
- });
33
+ const timeRangeInputs = useMemo(()=>{
34
+ return {
35
+ start: formatWithTimeZone(timeRange.start, DATE_TIME_FORMAT, timeZone),
36
+ end: formatWithTimeZone(timeRange.end, DATE_TIME_FORMAT, timeZone)
37
+ };
38
+ }, [
39
+ timeRange.start,
40
+ timeRange.end,
41
+ timeZone
42
+ ]);
40
43
  const [showStartCalendar, setShowStartCalendar] = useState(true);
41
44
  const changeTimeRange = (newTime, segment)=>{
42
- const isInputChange = typeof newTime === 'string';
43
- const newInputTime = isInputChange ? newTime : formatWithUserTimeZone(newTime, DATE_TIME_FORMAT);
44
- setTimeRangeInputs((prevTimeRangeInputs)=>{
45
+ setTimeRange((prevTimeRange)=>{
45
46
  return {
46
- ...prevTimeRangeInputs,
47
- [segment]: newInputTime
47
+ ...prevTimeRange,
48
+ [segment]: newTime
48
49
  };
49
50
  });
50
- // When the change is a string from an input, do not try to convert it to
51
- // a date because there are likely to be interim stages of editing where it
52
- // is not valid as a date. When the change is a Date from the calendar/clock
53
- // interface, we can be sure it is a date.
54
- if (!isInputChange) {
55
- setTimeRange((prevTimeRange)=>{
56
- return {
57
- ...prevTimeRange,
58
- [segment]: newTime
59
- };
60
- });
61
- }
62
51
  };
63
52
  const onChangeStartTime = (newStartTime)=>{
64
53
  changeTimeRange(newStartTime, 'start');
@@ -68,12 +57,11 @@ import { DATE_TIME_FORMAT, validateDateRange } from './utils';
68
57
  };
69
58
  const updateDateRange = ()=>{
70
59
  const newDates = {
71
- start: new Date(timeRangeInputs.start),
72
- end: new Date(timeRangeInputs.end)
60
+ start: timeRange.start,
61
+ end: timeRange.end
73
62
  };
74
63
  const isValidDateRange = validateDateRange(newDates.start, newDates.end);
75
64
  if (isValidDateRange) {
76
- setTimeRange(newDates);
77
65
  return newDates;
78
66
  }
79
67
  };
@@ -109,7 +97,7 @@ import { DATE_TIME_FORMAT, validateDateRange } from './utils';
109
97
  displayStaticWrapperAs: "desktop",
110
98
  openTo: "day",
111
99
  disableHighlightToday: true,
112
- value: initialTimeRange.start,
100
+ value: timeRange.start,
113
101
  onChange: (newValue)=>{
114
102
  if (newValue === null) return;
115
103
  onChangeStartTime(newValue);
@@ -137,7 +125,7 @@ import { DATE_TIME_FORMAT, validateDateRange } from './utils';
137
125
  displayStaticWrapperAs: "desktop",
138
126
  openTo: "day",
139
127
  disableHighlightToday: true,
140
- value: initialTimeRange.end,
128
+ value: timeRange.end,
141
129
  minDateTime: timeRange.start,
142
130
  onChange: (newValue)=>{
143
131
  if (newValue === null) return;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/TimeRangeSelector/DateTimeRangePicker.tsx"],"sourcesContent":["// Copyright 2024 The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { ReactElement, useState } from 'react';\nimport { Box, Stack, Typography, Button } from '@mui/material';\nimport { DateTimeField, LocalizationProvider, StaticDateTimePicker } from '@mui/x-date-pickers';\nimport { AdapterDateFns } from '@mui/x-date-pickers/AdapterDateFnsV3';\nimport { AbsoluteTimeRange } from '@perses-dev/core';\nimport { useTimeZone } from '../context';\nimport { ErrorBoundary } from '../ErrorBoundary';\nimport { ErrorAlert } from '../ErrorAlert';\nimport { DATE_TIME_FORMAT, validateDateRange } from './utils';\n\ninterface AbsoluteTimeFormProps {\n initialTimeRange: AbsoluteTimeRange;\n onChange: (timeRange: AbsoluteTimeRange) => void;\n onCancel: () => void;\n}\n\ntype AbsoluteTimeRangeInputValue = {\n [Property in keyof AbsoluteTimeRange]: string;\n};\n\n/**\n * Start and End datetime picker, allowing use to select a specific time range selecting two absolute dates and times.\n * TODO: Use directly the MUI X ``DateTimePicker`` for datetime selection which is better. https://next.mui.com/x/react-date-pickers/date-time-picker/\n * Use ``DateTimeRangePicker`` directly would be cool but paid https://next.mui.com/x/react-date-pickers/date-time-range-picker/\n * @param initialTimeRange initial time range to pre-select.\n * @param onChange event received when start and end has been selected (click on apply)\n * @param onCancel event received when user click on cancel\n * @constructor\n */\nexport const DateTimeRangePicker = ({ initialTimeRange, onChange, onCancel }: AbsoluteTimeFormProps): ReactElement => {\n const { formatWithUserTimeZone } = useTimeZone();\n\n // Time range values as dates that can be used as a time range.\n const [timeRange, setTimeRange] = useState<AbsoluteTimeRange>(initialTimeRange);\n\n // Time range values as strings used to populate the text inputs. May not\n // be valid as dates when the user is typing.\n const [timeRangeInputs, setTimeRangeInputs] = useState<AbsoluteTimeRangeInputValue>({\n start: formatWithUserTimeZone(initialTimeRange.start, DATE_TIME_FORMAT),\n end: formatWithUserTimeZone(initialTimeRange.end, DATE_TIME_FORMAT),\n });\n\n const [showStartCalendar, setShowStartCalendar] = useState<boolean>(true);\n\n const changeTimeRange = (newTime: string | Date, segment: keyof AbsoluteTimeRange): void => {\n const isInputChange = typeof newTime === 'string';\n const newInputTime = isInputChange ? newTime : formatWithUserTimeZone(newTime, DATE_TIME_FORMAT);\n\n setTimeRangeInputs((prevTimeRangeInputs) => {\n return {\n ...prevTimeRangeInputs,\n [segment]: newInputTime,\n };\n });\n\n // When the change is a string from an input, do not try to convert it to\n // a date because there are likely to be interim stages of editing where it\n // is not valid as a date. When the change is a Date from the calendar/clock\n // interface, we can be sure it is a date.\n if (!isInputChange) {\n setTimeRange((prevTimeRange) => {\n return {\n ...prevTimeRange,\n [segment]: newTime,\n };\n });\n }\n };\n\n const onChangeStartTime = (newStartTime: string | Date): void => {\n changeTimeRange(newStartTime, 'start');\n };\n\n const onChangeEndTime = (newEndTime: string | Date): void => {\n changeTimeRange(newEndTime, 'end');\n };\n\n const updateDateRange = (): { start: Date; end: Date } | undefined => {\n const newDates = {\n start: new Date(timeRangeInputs.start),\n end: new Date(timeRangeInputs.end),\n };\n const isValidDateRange = validateDateRange(newDates.start, newDates.end);\n if (isValidDateRange) {\n setTimeRange(newDates);\n return newDates;\n }\n };\n\n const onApply = (): void => {\n const newDates = updateDateRange();\n if (newDates) {\n onChange(newDates);\n }\n };\n\n return (\n <LocalizationProvider dateAdapter={AdapterDateFns}>\n <Stack\n spacing={2}\n sx={(theme) => ({\n padding: theme.spacing(1, 0, 2),\n })}\n >\n {showStartCalendar && (\n <Box\n sx={(theme) => ({\n // TODO: create separate reusable calendar component\n '.MuiPickersLayout-contentWrapper': {\n backgroundColor: theme.palette.background.default,\n },\n })}\n >\n <Typography variant=\"h3\" padding={1} paddingLeft={2}>\n Select Start Time\n </Typography>\n <StaticDateTimePicker\n displayStaticWrapperAs=\"desktop\"\n openTo=\"day\"\n disableHighlightToday={true}\n value={initialTimeRange.start}\n onChange={(newValue) => {\n if (newValue === null) return;\n onChangeStartTime(newValue);\n }}\n onAccept={() => {\n setShowStartCalendar(false);\n }}\n />\n </Box>\n )}\n {!showStartCalendar && (\n <Box\n sx={(theme) => ({\n '.MuiPickersLayout-contentWrapper': {\n backgroundColor: theme.palette.background.default,\n },\n })}\n >\n <Typography variant=\"h3\" padding={1} paddingLeft={2}>\n Select End Time\n </Typography>\n <StaticDateTimePicker\n displayStaticWrapperAs=\"desktop\"\n openTo=\"day\"\n disableHighlightToday={true}\n value={initialTimeRange.end}\n minDateTime={timeRange.start}\n onChange={(newValue) => {\n if (newValue === null) return;\n onChangeEndTime(newValue);\n }}\n onAccept={(newValue) => {\n if (newValue === null) return;\n setShowStartCalendar(true);\n onChangeEndTime(newValue);\n }}\n />\n </Box>\n )}\n <Stack direction=\"row\" alignItems=\"center\" gap={1} pl={1} pr={1}>\n <ErrorBoundary FallbackComponent={ErrorAlert}>\n <DateTimeField\n label=\"Start Time\"\n value={new Date(timeRangeInputs.start)}\n onChange={(event: Date | null) => {\n if (event) {\n onChangeStartTime(event);\n }\n }}\n onBlur={() => updateDateRange()}\n format={DATE_TIME_FORMAT}\n />\n </ErrorBoundary>\n <ErrorBoundary FallbackComponent={ErrorAlert}>\n <DateTimeField\n label=\"End Time\"\n value={new Date(timeRangeInputs.end)}\n onChange={(event: Date | null) => {\n if (event) {\n onChangeEndTime(event);\n }\n }}\n onBlur={() => updateDateRange()}\n format={DATE_TIME_FORMAT}\n />\n </ErrorBoundary>\n </Stack>\n <Stack direction=\"row\" sx={{ padding: (theme) => theme.spacing(0, 1) }} gap={1}>\n <Button variant=\"contained\" onClick={() => onApply()} fullWidth>\n Apply\n </Button>\n <Button variant=\"outlined\" onClick={() => onCancel()} fullWidth>\n Cancel\n </Button>\n </Stack>\n </Stack>\n </LocalizationProvider>\n );\n};\n"],"names":["useState","Box","Stack","Typography","Button","DateTimeField","LocalizationProvider","StaticDateTimePicker","AdapterDateFns","useTimeZone","ErrorBoundary","ErrorAlert","DATE_TIME_FORMAT","validateDateRange","DateTimeRangePicker","initialTimeRange","onChange","onCancel","formatWithUserTimeZone","timeRange","setTimeRange","timeRangeInputs","setTimeRangeInputs","start","end","showStartCalendar","setShowStartCalendar","changeTimeRange","newTime","segment","isInputChange","newInputTime","prevTimeRangeInputs","prevTimeRange","onChangeStartTime","newStartTime","onChangeEndTime","newEndTime","updateDateRange","newDates","Date","isValidDateRange","onApply","dateAdapter","spacing","sx","theme","padding","backgroundColor","palette","background","default","variant","paddingLeft","displayStaticWrapperAs","openTo","disableHighlightToday","value","newValue","onAccept","minDateTime","direction","alignItems","gap","pl","pr","FallbackComponent","label","event","onBlur","format","onClick","fullWidth"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/TimeRangeSelector/DateTimeRangePicker.tsx"],"sourcesContent":["// Copyright The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { ReactElement, useMemo, useState } from 'react';\nimport { Box, Stack, Typography, Button } from '@mui/material';\nimport { DateTimeField, LocalizationProvider, StaticDateTimePicker } from '@mui/x-date-pickers';\nimport { AdapterDateFns } from '@mui/x-date-pickers/AdapterDateFnsV3';\nimport { AbsoluteTimeRange } from '@perses-dev/core';\nimport { ErrorBoundary } from '../ErrorBoundary';\nimport { ErrorAlert } from '../ErrorAlert';\nimport { formatWithTimeZone } from '../utils/format';\nimport { DATE_TIME_FORMAT, validateDateRange } from './utils';\n\ninterface AbsoluteTimeFormProps {\n initialTimeRange: AbsoluteTimeRange;\n onChange: (timeRange: AbsoluteTimeRange) => void;\n onCancel: () => void;\n timeZone: string;\n}\n\ntype AbsoluteTimeRangeInputValue = {\n [Property in keyof AbsoluteTimeRange]: string;\n};\n\n/**\n * Start and End datetime picker, allowing use to select a specific time range selecting two absolute dates and times.\n * TODO: Use directly the MUI X ``DateTimePicker`` for datetime selection which is better. https://next.mui.com/x/react-date-pickers/date-time-picker/\n * Use ``DateTimeRangePicker`` directly would be cool but paid https://next.mui.com/x/react-date-pickers/date-time-range-picker/\n * @param initialTimeRange initial time range to pre-select.\n * @param onChange event received when start and end has been selected (click on apply)\n * @param onCancel event received when user click on cancel\n * @constructor\n */\nexport const DateTimeRangePicker = ({\n initialTimeRange,\n onChange,\n onCancel,\n timeZone,\n}: AbsoluteTimeFormProps): ReactElement => {\n // Time range values as dates that can be used as a time range.\n const [timeRange, setTimeRange] = useState<AbsoluteTimeRange>(initialTimeRange);\n const timeRangeInputs = useMemo<AbsoluteTimeRangeInputValue>(() => {\n return {\n start: formatWithTimeZone(timeRange.start, DATE_TIME_FORMAT, timeZone),\n end: formatWithTimeZone(timeRange.end, DATE_TIME_FORMAT, timeZone),\n };\n }, [timeRange.start, timeRange.end, timeZone]);\n\n const [showStartCalendar, setShowStartCalendar] = useState<boolean>(true);\n\n const changeTimeRange = (newTime: Date, segment: keyof AbsoluteTimeRange): void => {\n setTimeRange((prevTimeRange) => {\n return {\n ...prevTimeRange,\n [segment]: newTime,\n };\n });\n };\n\n const onChangeStartTime = (newStartTime: Date): void => {\n changeTimeRange(newStartTime, 'start');\n };\n\n const onChangeEndTime = (newEndTime: Date): void => {\n changeTimeRange(newEndTime, 'end');\n };\n\n const updateDateRange = (): { start: Date; end: Date } | undefined => {\n const newDates = {\n start: timeRange.start,\n end: timeRange.end,\n };\n const isValidDateRange = validateDateRange(newDates.start, newDates.end);\n if (isValidDateRange) {\n return newDates;\n }\n };\n\n const onApply = (): void => {\n const newDates = updateDateRange();\n if (newDates) {\n onChange(newDates);\n }\n };\n\n return (\n <LocalizationProvider dateAdapter={AdapterDateFns}>\n <Stack\n spacing={2}\n sx={(theme) => ({\n padding: theme.spacing(1, 0, 2),\n })}\n >\n {showStartCalendar && (\n <Box\n sx={(theme) => ({\n // TODO: create separate reusable calendar component\n '.MuiPickersLayout-contentWrapper': {\n backgroundColor: theme.palette.background.default,\n },\n })}\n >\n <Typography variant=\"h3\" padding={1} paddingLeft={2}>\n Select Start Time\n </Typography>\n <StaticDateTimePicker\n displayStaticWrapperAs=\"desktop\"\n openTo=\"day\"\n disableHighlightToday={true}\n value={timeRange.start}\n onChange={(newValue) => {\n if (newValue === null) return;\n onChangeStartTime(newValue);\n }}\n onAccept={() => {\n setShowStartCalendar(false);\n }}\n />\n </Box>\n )}\n {!showStartCalendar && (\n <Box\n sx={(theme) => ({\n '.MuiPickersLayout-contentWrapper': {\n backgroundColor: theme.palette.background.default,\n },\n })}\n >\n <Typography variant=\"h3\" padding={1} paddingLeft={2}>\n Select End Time\n </Typography>\n <StaticDateTimePicker\n displayStaticWrapperAs=\"desktop\"\n openTo=\"day\"\n disableHighlightToday={true}\n value={timeRange.end}\n minDateTime={timeRange.start}\n onChange={(newValue) => {\n if (newValue === null) return;\n onChangeEndTime(newValue);\n }}\n onAccept={(newValue) => {\n if (newValue === null) return;\n setShowStartCalendar(true);\n onChangeEndTime(newValue);\n }}\n />\n </Box>\n )}\n <Stack direction=\"row\" alignItems=\"center\" gap={1} pl={1} pr={1}>\n <ErrorBoundary FallbackComponent={ErrorAlert}>\n <DateTimeField\n label=\"Start Time\"\n value={new Date(timeRangeInputs.start)}\n onChange={(event: Date | null) => {\n if (event) {\n onChangeStartTime(event);\n }\n }}\n onBlur={() => updateDateRange()}\n format={DATE_TIME_FORMAT}\n />\n </ErrorBoundary>\n <ErrorBoundary FallbackComponent={ErrorAlert}>\n <DateTimeField\n label=\"End Time\"\n value={new Date(timeRangeInputs.end)}\n onChange={(event: Date | null) => {\n if (event) {\n onChangeEndTime(event);\n }\n }}\n onBlur={() => updateDateRange()}\n format={DATE_TIME_FORMAT}\n />\n </ErrorBoundary>\n </Stack>\n <Stack direction=\"row\" sx={{ padding: (theme) => theme.spacing(0, 1) }} gap={1}>\n <Button variant=\"contained\" onClick={() => onApply()} fullWidth>\n Apply\n </Button>\n <Button variant=\"outlined\" onClick={() => onCancel()} fullWidth>\n Cancel\n </Button>\n </Stack>\n </Stack>\n </LocalizationProvider>\n );\n};\n"],"names":["useMemo","useState","Box","Stack","Typography","Button","DateTimeField","LocalizationProvider","StaticDateTimePicker","AdapterDateFns","ErrorBoundary","ErrorAlert","formatWithTimeZone","DATE_TIME_FORMAT","validateDateRange","DateTimeRangePicker","initialTimeRange","onChange","onCancel","timeZone","timeRange","setTimeRange","timeRangeInputs","start","end","showStartCalendar","setShowStartCalendar","changeTimeRange","newTime","segment","prevTimeRange","onChangeStartTime","newStartTime","onChangeEndTime","newEndTime","updateDateRange","newDates","isValidDateRange","onApply","dateAdapter","spacing","sx","theme","padding","backgroundColor","palette","background","default","variant","paddingLeft","displayStaticWrapperAs","openTo","disableHighlightToday","value","newValue","onAccept","minDateTime","direction","alignItems","gap","pl","pr","FallbackComponent","label","Date","event","onBlur","format","onClick","fullWidth"],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import { TimeRangeValue } from '@perses-dev/core';
2
2
  import { ReactElement } from 'react';
3
+ import { TimeZoneOption } from '../model/timeZoneOption';
3
4
  import { TimeOption } from '../model';
4
5
  interface TimeRangeSelectorProps {
5
6
  /**
@@ -24,6 +25,10 @@ interface TimeRangeSelectorProps {
24
25
  * Defaults to true.
25
26
  */
26
27
  showCustomTimeRange?: boolean;
28
+ /** Optional explicit timezone and change handler to enable changing tz from the selector */
29
+ timeZone?: string;
30
+ timeZoneOptions?: TimeZoneOption[];
31
+ onTimeZoneChange?: (timeZone: TimeZoneOption) => void;
27
32
  }
28
33
  /**
29
34
  * Date & time selection component to customize what data renders on dashboard.
@@ -31,6 +36,6 @@ interface TimeRangeSelectorProps {
31
36
  * @param props
32
37
  * @constructor
33
38
  */
34
- export declare function TimeRangeSelector({ value, timeOptions, onChange, height, showCustomTimeRange, }: TimeRangeSelectorProps): ReactElement;
39
+ export declare function TimeRangeSelector({ value, timeOptions, onChange, height, showCustomTimeRange, timeZone: timeZoneProp, timeZoneOptions, onTimeZoneChange, }: TimeRangeSelectorProps): ReactElement;
35
40
  export {};
36
41
  //# sourceMappingURL=TimeRangeSelector.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"TimeRangeSelector.d.ts","sourceRoot":"","sources":["../../src/TimeRangeSelector/TimeRangeSelector.tsx"],"names":[],"mappings":"AAeA,OAAO,EAAE,cAAc,EAA+D,MAAM,kBAAkB,CAAC;AAC/G,OAAO,EAAE,YAAY,EAA6B,MAAM,OAAO,CAAC;AAEhE,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAItC,UAAU,sBAAsB;IAC9B;;OAEG;IACH,KAAK,EAAE,cAAc,CAAC;IACtB;;;OAGG;IACH,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B;;OAEG;IACH,QAAQ,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,CAAC;IAC1C;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,EAChC,KAAK,EACL,WAAW,EACX,QAAQ,EACR,MAAM,EACN,mBAA0B,GAC3B,EAAE,sBAAsB,GAAG,YAAY,CAkGvC"}
1
+ {"version":3,"file":"TimeRangeSelector.d.ts","sourceRoot":"","sources":["../../src/TimeRangeSelector/TimeRangeSelector.tsx"],"names":[],"mappings":"AAgBA,OAAO,EAAE,cAAc,EAA+D,MAAM,kBAAkB,CAAC;AAC/G,OAAO,EAAE,YAAY,EAA6B,MAAM,OAAO,CAAC;AAEhE,OAAO,EAAE,cAAc,EAAsB,MAAM,yBAAyB,CAAC;AAC7E,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAKtC,UAAU,sBAAsB;IAC9B;;OAEG;IACH,KAAK,EAAE,cAAc,CAAC;IACtB;;;OAGG;IACH,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B;;OAEG;IACH,QAAQ,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,CAAC;IAC1C;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,4FAA4F;IAC5F,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,cAAc,EAAE,CAAC;IACnC,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,cAAc,KAAK,IAAI,CAAC;CACvD;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,EAChC,KAAK,EACL,WAAW,EACX,QAAQ,EACR,MAAM,EACN,mBAA0B,EAC1B,QAAQ,EAAE,YAAY,EACtB,eAAe,EACf,gBAAgB,GACjB,EAAE,sBAAsB,GAAG,YAAY,CA6IvC"}
@@ -1,4 +1,4 @@
1
- // Copyright 2024 The Perses Authors
1
+ // Copyright The Perses Authors
2
2
  // Licensed under the Apache License, Version 2.0 (the "License");
3
3
  // you may not use this file except in compliance with the License.
4
4
  // You may obtain a copy of the License at
@@ -11,11 +11,14 @@
11
11
  // See the License for the specific language governing permissions and
12
12
  // limitations under the License.
13
13
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
14
- import { Box, MenuItem, Popover, Select } from '@mui/material';
14
+ import { Box, MenuItem, Popover, Select, IconButton, TextField } from '@mui/material';
15
15
  import Calendar from 'mdi-material-ui/Calendar';
16
+ import EarthIcon from 'mdi-material-ui/Earth';
16
17
  import { isRelativeTimeRange, toAbsoluteTimeRange } from '@perses-dev/core';
17
18
  import { useMemo, useRef, useState } from 'react';
18
19
  import { useTimeZone } from '../context';
20
+ import { getTimeZoneOptions } from '../model/timeZoneOption';
21
+ import { SettingsAutocomplete } from '../SettingsAutocomplete';
19
22
  import { DateTimeRangePicker } from './DateTimeRangePicker';
20
23
  import { buildCustomTimeOption, formatTimeRange } from './utils';
21
24
  /**
@@ -23,33 +26,81 @@ import { buildCustomTimeOption, formatTimeRange } from './utils';
23
26
  * This includes relative shortcuts and the ability to pick absolute start and end times.
24
27
  * @param props
25
28
  * @constructor
26
- */ export function TimeRangeSelector({ value, timeOptions, onChange, height, showCustomTimeRange = true }) {
27
- const { timeZone } = useTimeZone();
28
- const anchorEl = useRef(); // Used to position the absolute time range picker
29
- // Control the open state of the absolute time range picker
29
+ */ export function TimeRangeSelector({ value, timeOptions, onChange, height, showCustomTimeRange = true, timeZone: timeZoneProp, timeZoneOptions, onTimeZoneChange }) {
30
+ const { timeZone: ctxTimeZone } = useTimeZone();
31
+ const timeZone = timeZoneProp ?? ctxTimeZone;
32
+ const anchorEl = useRef();
30
33
  const [showCustomDateSelector, setShowCustomDateSelector] = useState(false);
31
- // Build the initial value of the absolute time range picker
32
34
  const convertedTimeRange = useMemo(()=>{
33
35
  return isRelativeTimeRange(value) ? toAbsoluteTimeRange(value) : value;
34
36
  }, [
35
37
  value
36
38
  ]);
37
- // Last option is the absolute time range option (custom)
38
- // If the value is an absolute time range, we display this time range
39
- // If the value is a relative time range, we make a default CustomTimeOption built from undefined value
40
39
  const lastOption = useMemo(()=>buildCustomTimeOption(isRelativeTimeRange(value) ? undefined : value, timeZone), [
41
40
  value,
42
41
  timeZone
43
42
  ]);
44
- // Control the open state of the select component to prevent the menu from closing when the custom date picker is
45
- // opened.
46
- //
47
- // Note that the value state of the select is here for display only. The real value (the one from props) is managed
48
- // by click events on each menu item.
49
- // This is a trick to get around the limitation of select with menu item that doesn't support objects as value...
50
43
  const [open, setOpen] = useState(false);
44
+ const tzOptions = timeZoneOptions ?? getTimeZoneOptions();
45
+ const [tzAnchorEl, setTzAnchorEl] = useState(null);
46
+ const tzOpen = Boolean(tzAnchorEl);
47
+ const tzLabel = tzOptions.find((o)=>o.value === timeZone)?.display ?? timeZone;
48
+ const tzAutocompleteOptions = tzOptions.map((o)=>({
49
+ id: o.value,
50
+ label: o.display
51
+ }));
52
+ let tzAutocompleteValue = undefined;
53
+ {
54
+ const current = tzOptions.find((o)=>o.value === timeZone);
55
+ if (current) tzAutocompleteValue = {
56
+ id: current.value,
57
+ label: current.display
58
+ };
59
+ }
51
60
  return /*#__PURE__*/ _jsxs(_Fragment, {
52
61
  children: [
62
+ /*#__PURE__*/ _jsx(Popover, {
63
+ anchorEl: tzAnchorEl,
64
+ anchorOrigin: {
65
+ vertical: 'bottom',
66
+ horizontal: 'right'
67
+ },
68
+ transformOrigin: {
69
+ vertical: 'top',
70
+ horizontal: 'right'
71
+ },
72
+ open: tzOpen,
73
+ onClose: ()=>setTzAnchorEl(null),
74
+ sx: (theme)=>({
75
+ padding: theme.spacing(1)
76
+ }),
77
+ children: /*#__PURE__*/ _jsx(Box, {
78
+ sx: {
79
+ p: 1,
80
+ minWidth: 260
81
+ },
82
+ onClick: (e)=>{
83
+ e.stopPropagation();
84
+ },
85
+ children: /*#__PURE__*/ _jsx(SettingsAutocomplete, {
86
+ options: tzAutocompleteOptions,
87
+ value: tzAutocompleteValue,
88
+ onChange: (_e, option)=>{
89
+ if (option) {
90
+ const selected = tzOptions.find((o)=>o.value === option.id);
91
+ if (selected) onTimeZoneChange?.(selected);
92
+ }
93
+ setTzAnchorEl(null);
94
+ },
95
+ disableClearable: true,
96
+ renderInput: (params)=>/*#__PURE__*/ _jsx(TextField, {
97
+ ...params,
98
+ placeholder: "Search timezones",
99
+ size: "small"
100
+ })
101
+ })
102
+ })
103
+ }),
53
104
  /*#__PURE__*/ _jsx(Popover, {
54
105
  anchorEl: anchorEl.current,
55
106
  anchorOrigin: {
@@ -68,7 +119,8 @@ import { buildCustomTimeOption, formatTimeRange } from './utils';
68
119
  setShowCustomDateSelector(false);
69
120
  setOpen(false);
70
121
  },
71
- onCancel: ()=>setShowCustomDateSelector(false)
122
+ onCancel: ()=>setShowCustomDateSelector(false),
123
+ timeZone: timeZone
72
124
  })
73
125
  }),
74
126
  /*#__PURE__*/ _jsx(Box, {
@@ -82,12 +134,10 @@ import { buildCustomTimeOption, formatTimeRange } from './utils';
82
134
  'aria-label': `Select time range. Currently set to ${value}`
83
135
  },
84
136
  sx: {
85
- // `transform: none` prevents calendar icon from flipping over when menu is open
86
137
  '.MuiSelect-icon': {
87
138
  marginTop: '1px',
88
139
  transform: 'none'
89
140
  },
90
- // paddingRight creates more space for the calendar icon (it's a bigger icon)
91
141
  '.MuiSelect-select.MuiSelect-outlined.MuiInputBase-input': {
92
142
  paddingRight: '36px'
93
143
  },
@@ -97,6 +147,77 @@ import { buildCustomTimeOption, formatTimeRange } from './utils';
97
147
  } : {}
98
148
  },
99
149
  children: [
150
+ /*#__PURE__*/ _jsx(MenuItem, {
151
+ disableRipple: true,
152
+ onClick: (e)=>{
153
+ e.preventDefault();
154
+ e.stopPropagation();
155
+ },
156
+ sx: {
157
+ cursor: 'default',
158
+ '&:hover': {
159
+ backgroundColor: 'transparent'
160
+ },
161
+ py: 0.5,
162
+ px: 1
163
+ },
164
+ children: /*#__PURE__*/ _jsxs(Box, {
165
+ sx: {
166
+ display: 'flex',
167
+ alignItems: 'center',
168
+ width: '100%',
169
+ justifyContent: 'space-between'
170
+ },
171
+ children: [
172
+ /*#__PURE__*/ _jsxs(Box, {
173
+ sx: {
174
+ display: 'flex',
175
+ flexDirection: 'column',
176
+ alignItems: 'flex-start'
177
+ },
178
+ children: [
179
+ /*#__PURE__*/ _jsx(Box, {
180
+ sx: {
181
+ typography: 'subtitle1'
182
+ },
183
+ children: "Time Range"
184
+ }),
185
+ /*#__PURE__*/ _jsxs(Box, {
186
+ sx: {
187
+ color: 'text.secondary',
188
+ typography: 'caption',
189
+ mt: 0.25
190
+ },
191
+ children: [
192
+ "Timezone: ",
193
+ tzLabel
194
+ ]
195
+ })
196
+ ]
197
+ }),
198
+ /*#__PURE__*/ _jsx(Box, {
199
+ sx: {
200
+ display: 'flex',
201
+ alignItems: 'center',
202
+ pr: 1,
203
+ ml: 1.5
204
+ },
205
+ children: /*#__PURE__*/ _jsx(IconButton, {
206
+ size: "small",
207
+ "aria-label": "Select timezone",
208
+ onClick: (e)=>{
209
+ e.preventDefault();
210
+ e.stopPropagation();
211
+ setTzAnchorEl(e.currentTarget);
212
+ },
213
+ children: /*#__PURE__*/ _jsx(EarthIcon, {
214
+ fontSize: "small"
215
+ })
216
+ })
217
+ })
218
+ ]
219
+ })
220
+ }),
100
221
  timeOptions.map((item, idx)=>/*#__PURE__*/ _jsx(MenuItem, {
101
222
  value: formatTimeRange(item.value, timeZone),
102
223
  onClick: ()=>{
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/TimeRangeSelector/TimeRangeSelector.tsx"],"sourcesContent":["// Copyright 2024 The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { Box, MenuItem, Popover, Select } from '@mui/material';\nimport Calendar from 'mdi-material-ui/Calendar';\nimport { TimeRangeValue, isRelativeTimeRange, AbsoluteTimeRange, toAbsoluteTimeRange } from '@perses-dev/core';\nimport { ReactElement, useMemo, useRef, useState } from 'react';\nimport { useTimeZone } from '../context';\nimport { TimeOption } from '../model';\nimport { DateTimeRangePicker } from './DateTimeRangePicker';\nimport { buildCustomTimeOption, formatTimeRange } from './utils';\n\ninterface TimeRangeSelectorProps {\n /**\n * The current value of the time range.\n */\n value: TimeRangeValue;\n /**\n * The list of time options to display in the dropdown.\n * The component will automatically add the last two options as a zoom out x2 and a custom absolute time range.\n */\n timeOptions: TimeOption[];\n /**\n * The callback to call when the time range changes.\n */\n onChange: (value: TimeRangeValue) => void;\n /**\n * Custom line height for the select component.\n */\n height?: string;\n /**\n * Whether to show the custom time range option.\n * Defaults to true.\n */\n showCustomTimeRange?: boolean;\n}\n\n/**\n * Date & time selection component to customize what data renders on dashboard.\n * This includes relative shortcuts and the ability to pick absolute start and end times.\n * @param props\n * @constructor\n */\nexport function TimeRangeSelector({\n value,\n timeOptions,\n onChange,\n height,\n showCustomTimeRange = true,\n}: TimeRangeSelectorProps): ReactElement {\n const { timeZone } = useTimeZone();\n\n const anchorEl = useRef(); // Used to position the absolute time range picker\n\n // Control the open state of the absolute time range picker\n const [showCustomDateSelector, setShowCustomDateSelector] = useState(false);\n\n // Build the initial value of the absolute time range picker\n const convertedTimeRange = useMemo(() => {\n return isRelativeTimeRange(value) ? toAbsoluteTimeRange(value) : value;\n }, [value]);\n\n // Last option is the absolute time range option (custom)\n // If the value is an absolute time range, we display this time range\n // If the value is a relative time range, we make a default CustomTimeOption built from undefined value\n const lastOption = useMemo(\n () => buildCustomTimeOption(isRelativeTimeRange(value) ? undefined : value, timeZone),\n [value, timeZone]\n );\n\n // Control the open state of the select component to prevent the menu from closing when the custom date picker is\n // opened.\n //\n // Note that the value state of the select is here for display only. The real value (the one from props) is managed\n // by click events on each menu item.\n // This is a trick to get around the limitation of select with menu item that doesn't support objects as value...\n const [open, setOpen] = useState(false);\n\n return (\n <>\n <Popover\n anchorEl={anchorEl.current}\n anchorOrigin={{\n vertical: 'bottom',\n horizontal: 'center',\n }}\n open={showCustomDateSelector}\n onClose={() => setShowCustomDateSelector(false)}\n sx={(theme) => ({\n padding: theme.spacing(2),\n })}\n >\n <DateTimeRangePicker\n initialTimeRange={convertedTimeRange}\n onChange={(value: AbsoluteTimeRange) => {\n onChange(value);\n setShowCustomDateSelector(false);\n setOpen(false);\n }}\n onCancel={() => setShowCustomDateSelector(false)}\n />\n </Popover>\n <Box ref={anchorEl}>\n <Select\n open={open}\n value={formatTimeRange(value, timeZone)}\n onClick={() => setOpen(!open)}\n IconComponent={Calendar}\n inputProps={{\n 'aria-label': `Select time range. Currently set to ${value}`,\n }}\n sx={{\n // `transform: none` prevents calendar icon from flipping over when menu is open\n '.MuiSelect-icon': {\n marginTop: '1px',\n transform: 'none',\n },\n // paddingRight creates more space for the calendar icon (it's a bigger icon)\n '.MuiSelect-select.MuiSelect-outlined.MuiInputBase-input': {\n paddingRight: '36px',\n },\n '.MuiSelect-select': height ? { lineHeight: height, paddingY: 0 } : {},\n }}\n >\n {timeOptions.map((item, idx) => (\n <MenuItem\n key={idx}\n value={formatTimeRange(item.value, timeZone)}\n onClick={() => {\n onChange(item.value);\n }}\n >\n {item.display}\n </MenuItem>\n ))}\n {showCustomTimeRange && (\n <MenuItem\n value={formatTimeRange(lastOption.value, timeZone)}\n onClick={() => setShowCustomDateSelector(true)}\n >\n {lastOption.display}\n </MenuItem>\n )}\n </Select>\n </Box>\n </>\n );\n}\n"],"names":["Box","MenuItem","Popover","Select","Calendar","isRelativeTimeRange","toAbsoluteTimeRange","useMemo","useRef","useState","useTimeZone","DateTimeRangePicker","buildCustomTimeOption","formatTimeRange","TimeRangeSelector","value","timeOptions","onChange","height","showCustomTimeRange","timeZone","anchorEl","showCustomDateSelector","setShowCustomDateSelector","convertedTimeRange","lastOption","undefined","open","setOpen","current","anchorOrigin","vertical","horizontal","onClose","sx","theme","padding","spacing","initialTimeRange","onCancel","ref","onClick","IconComponent","inputProps","marginTop","transform","paddingRight","lineHeight","paddingY","map","item","idx","display"],"mappings":"AAAA,oCAAoC;AACpC,kEAAkE;AAClE,mEAAmE;AACnE,0CAA0C;AAC1C,EAAE;AACF,6CAA6C;AAC7C,EAAE;AACF,sEAAsE;AACtE,oEAAoE;AACpE,2EAA2E;AAC3E,sEAAsE;AACtE,iCAAiC;;AAEjC,SAASA,GAAG,EAAEC,QAAQ,EAAEC,OAAO,EAAEC,MAAM,QAAQ,gBAAgB;AAC/D,OAAOC,cAAc,2BAA2B;AAChD,SAAyBC,mBAAmB,EAAqBC,mBAAmB,QAAQ,mBAAmB;AAC/G,SAAuBC,OAAO,EAAEC,MAAM,EAAEC,QAAQ,QAAQ,QAAQ;AAChE,SAASC,WAAW,QAAQ,aAAa;AAEzC,SAASC,mBAAmB,QAAQ,wBAAwB;AAC5D,SAASC,qBAAqB,EAAEC,eAAe,QAAQ,UAAU;AA2BjE;;;;;CAKC,GACD,OAAO,SAASC,kBAAkB,EAChCC,KAAK,EACLC,WAAW,EACXC,QAAQ,EACRC,MAAM,EACNC,sBAAsB,IAAI,EACH;IACvB,MAAM,EAAEC,QAAQ,EAAE,GAAGV;IAErB,MAAMW,WAAWb,UAAU,kDAAkD;IAE7E,2DAA2D;IAC3D,MAAM,CAACc,wBAAwBC,0BAA0B,GAAGd,SAAS;IAErE,4DAA4D;IAC5D,MAAMe,qBAAqBjB,QAAQ;QACjC,OAAOF,oBAAoBU,SAAST,oBAAoBS,SAASA;IACnE,GAAG;QAACA;KAAM;IAEV,yDAAyD;IACzD,qEAAqE;IACrE,uGAAuG;IACvG,MAAMU,aAAalB,QACjB,IAAMK,sBAAsBP,oBAAoBU,SAASW,YAAYX,OAAOK,WAC5E;QAACL;QAAOK;KAAS;IAGnB,iHAAiH;IACjH,UAAU;IACV,EAAE;IACF,mHAAmH;IACnH,qCAAqC;IACrC,iHAAiH;IACjH,MAAM,CAACO,MAAMC,QAAQ,GAAGnB,SAAS;IAEjC,qBACE;;0BACE,KAACP;gBACCmB,UAAUA,SAASQ,OAAO;gBAC1BC,cAAc;oBACZC,UAAU;oBACVC,YAAY;gBACd;gBACAL,MAAML;gBACNW,SAAS,IAAMV,0BAA0B;gBACzCW,IAAI,CAACC,QAAW,CAAA;wBACdC,SAASD,MAAME,OAAO,CAAC;oBACzB,CAAA;0BAEA,cAAA,KAAC1B;oBACC2B,kBAAkBd;oBAClBP,UAAU,CAACF;wBACTE,SAASF;wBACTQ,0BAA0B;wBAC1BK,QAAQ;oBACV;oBACAW,UAAU,IAAMhB,0BAA0B;;;0BAG9C,KAACvB;gBAAIwC,KAAKnB;0BACR,cAAA,MAAClB;oBACCwB,MAAMA;oBACNZ,OAAOF,gBAAgBE,OAAOK;oBAC9BqB,SAAS,IAAMb,QAAQ,CAACD;oBACxBe,eAAetC;oBACfuC,YAAY;wBACV,cAAc,CAAC,oCAAoC,EAAE5B,OAAO;oBAC9D;oBACAmB,IAAI;wBACF,gFAAgF;wBAChF,mBAAmB;4BACjBU,WAAW;4BACXC,WAAW;wBACb;wBACA,6EAA6E;wBAC7E,2DAA2D;4BACzDC,cAAc;wBAChB;wBACA,qBAAqB5B,SAAS;4BAAE6B,YAAY7B;4BAAQ8B,UAAU;wBAAE,IAAI,CAAC;oBACvE;;wBAEChC,YAAYiC,GAAG,CAAC,CAACC,MAAMC,oBACtB,KAAClD;gCAECc,OAAOF,gBAAgBqC,KAAKnC,KAAK,EAAEK;gCACnCqB,SAAS;oCACPxB,SAASiC,KAAKnC,KAAK;gCACrB;0CAECmC,KAAKE,OAAO;+BANRD;wBASRhC,qCACC,KAAClB;4BACCc,OAAOF,gBAAgBY,WAAWV,KAAK,EAAEK;4BACzCqB,SAAS,IAAMlB,0BAA0B;sCAExCE,WAAW2B,OAAO;;;;;;;AAOjC"}
1
+ {"version":3,"sources":["../../src/TimeRangeSelector/TimeRangeSelector.tsx"],"sourcesContent":["// Copyright The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { Box, MenuItem, Popover, Select, IconButton, TextField } from '@mui/material';\nimport Calendar from 'mdi-material-ui/Calendar';\nimport EarthIcon from 'mdi-material-ui/Earth';\nimport { TimeRangeValue, isRelativeTimeRange, AbsoluteTimeRange, toAbsoluteTimeRange } from '@perses-dev/core';\nimport { ReactElement, useMemo, useRef, useState } from 'react';\nimport { useTimeZone } from '../context';\nimport { TimeZoneOption, getTimeZoneOptions } from '../model/timeZoneOption';\nimport { TimeOption } from '../model';\nimport { SettingsAutocomplete, SettingsAutocompleteOption } from '../SettingsAutocomplete';\nimport { DateTimeRangePicker } from './DateTimeRangePicker';\nimport { buildCustomTimeOption, formatTimeRange } from './utils';\n\ninterface TimeRangeSelectorProps {\n /**\n * The current value of the time range.\n */\n value: TimeRangeValue;\n /**\n * The list of time options to display in the dropdown.\n * The component will automatically add the last two options as a zoom out x2 and a custom absolute time range.\n */\n timeOptions: TimeOption[];\n /**\n * The callback to call when the time range changes.\n */\n onChange: (value: TimeRangeValue) => void;\n /**\n * Custom line height for the select component.\n */\n height?: string;\n /**\n * Whether to show the custom time range option.\n * Defaults to true.\n */\n showCustomTimeRange?: boolean;\n /** Optional explicit timezone and change handler to enable changing tz from the selector */\n timeZone?: string;\n timeZoneOptions?: TimeZoneOption[];\n onTimeZoneChange?: (timeZone: TimeZoneOption) => void;\n}\n\n/**\n * Date & time selection component to customize what data renders on dashboard.\n * This includes relative shortcuts and the ability to pick absolute start and end times.\n * @param props\n * @constructor\n */\nexport function TimeRangeSelector({\n value,\n timeOptions,\n onChange,\n height,\n showCustomTimeRange = true,\n timeZone: timeZoneProp,\n timeZoneOptions,\n onTimeZoneChange,\n}: TimeRangeSelectorProps): ReactElement {\n const { timeZone: ctxTimeZone } = useTimeZone();\n const timeZone = timeZoneProp ?? ctxTimeZone;\n\n const anchorEl = useRef();\n const [showCustomDateSelector, setShowCustomDateSelector] = useState(false);\n\n const convertedTimeRange = useMemo(() => {\n return isRelativeTimeRange(value) ? toAbsoluteTimeRange(value) : value;\n }, [value]);\n\n const lastOption = useMemo(\n () => buildCustomTimeOption(isRelativeTimeRange(value) ? undefined : value, timeZone),\n [value, timeZone]\n );\n\n const [open, setOpen] = useState(false);\n const tzOptions = timeZoneOptions ?? getTimeZoneOptions();\n const [tzAnchorEl, setTzAnchorEl] = useState<HTMLElement | null>(null);\n const tzOpen = Boolean(tzAnchorEl);\n const tzLabel = tzOptions.find((o) => o.value === timeZone)?.display ?? timeZone;\n const tzAutocompleteOptions = tzOptions.map((o) => ({ id: o.value, label: o.display }));\n let tzAutocompleteValue: SettingsAutocompleteOption | undefined = undefined;\n {\n const current = tzOptions.find((o) => o.value === timeZone);\n if (current) tzAutocompleteValue = { id: current.value, label: current.display };\n }\n\n return (\n <>\n <Popover\n anchorEl={tzAnchorEl}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'right' }}\n transformOrigin={{ vertical: 'top', horizontal: 'right' }}\n open={tzOpen}\n onClose={() => setTzAnchorEl(null)}\n sx={(theme) => ({ padding: theme.spacing(1) })}\n >\n <Box\n sx={{ p: 1, minWidth: 260 }}\n onClick={(e) => {\n e.stopPropagation();\n }}\n >\n <SettingsAutocomplete\n options={tzAutocompleteOptions}\n value={tzAutocompleteValue}\n onChange={(_e, option) => {\n if (option) {\n const selected = tzOptions.find((o) => o.value === option.id);\n if (selected) onTimeZoneChange?.(selected);\n }\n setTzAnchorEl(null);\n }}\n disableClearable\n renderInput={(params) => <TextField {...params} placeholder=\"Search timezones\" size=\"small\" />}\n />\n </Box>\n </Popover>\n <Popover\n anchorEl={anchorEl.current}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'center' }}\n open={showCustomDateSelector}\n onClose={() => setShowCustomDateSelector(false)}\n sx={(theme) => ({ padding: theme.spacing(2) })}\n >\n <DateTimeRangePicker\n initialTimeRange={convertedTimeRange}\n onChange={(value: AbsoluteTimeRange) => {\n onChange(value);\n setShowCustomDateSelector(false);\n setOpen(false);\n }}\n onCancel={() => setShowCustomDateSelector(false)}\n timeZone={timeZone}\n />\n </Popover>\n <Box ref={anchorEl}>\n <Select\n open={open}\n value={formatTimeRange(value, timeZone)}\n onClick={() => setOpen(!open)}\n IconComponent={Calendar}\n inputProps={{ 'aria-label': `Select time range. Currently set to ${value}` }}\n sx={{\n '.MuiSelect-icon': { marginTop: '1px', transform: 'none' },\n '.MuiSelect-select.MuiSelect-outlined.MuiInputBase-input': { paddingRight: '36px' },\n '.MuiSelect-select': height ? { lineHeight: height, paddingY: 0 } : {},\n }}\n >\n <MenuItem\n disableRipple\n onClick={(e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n }}\n sx={{ cursor: 'default', '&:hover': { backgroundColor: 'transparent' }, py: 0.5, px: 1 }}\n >\n <Box sx={{ display: 'flex', alignItems: 'center', width: '100%', justifyContent: 'space-between' }}>\n <Box sx={{ display: 'flex', flexDirection: 'column', alignItems: 'flex-start' }}>\n <Box sx={{ typography: 'subtitle1' }}>Time Range</Box>\n <Box sx={{ color: 'text.secondary', typography: 'caption', mt: 0.25 }}>Timezone: {tzLabel}</Box>\n </Box>\n <Box sx={{ display: 'flex', alignItems: 'center', pr: 1, ml: 1.5 }}>\n <IconButton\n size=\"small\"\n aria-label=\"Select timezone\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n setTzAnchorEl(e.currentTarget);\n }}\n >\n <EarthIcon fontSize=\"small\" />\n </IconButton>\n </Box>\n </Box>\n </MenuItem>\n {timeOptions.map((item, idx) => (\n <MenuItem\n key={idx}\n value={formatTimeRange(item.value, timeZone)}\n onClick={() => {\n onChange(item.value);\n }}\n >\n {item.display}\n </MenuItem>\n ))}\n {showCustomTimeRange && (\n <MenuItem\n value={formatTimeRange(lastOption.value, timeZone)}\n onClick={() => setShowCustomDateSelector(true)}\n >\n {lastOption.display}\n </MenuItem>\n )}\n </Select>\n </Box>\n </>\n );\n}\n"],"names":["Box","MenuItem","Popover","Select","IconButton","TextField","Calendar","EarthIcon","isRelativeTimeRange","toAbsoluteTimeRange","useMemo","useRef","useState","useTimeZone","getTimeZoneOptions","SettingsAutocomplete","DateTimeRangePicker","buildCustomTimeOption","formatTimeRange","TimeRangeSelector","value","timeOptions","onChange","height","showCustomTimeRange","timeZone","timeZoneProp","timeZoneOptions","onTimeZoneChange","ctxTimeZone","anchorEl","showCustomDateSelector","setShowCustomDateSelector","convertedTimeRange","lastOption","undefined","open","setOpen","tzOptions","tzAnchorEl","setTzAnchorEl","tzOpen","Boolean","tzLabel","find","o","display","tzAutocompleteOptions","map","id","label","tzAutocompleteValue","current","anchorOrigin","vertical","horizontal","transformOrigin","onClose","sx","theme","padding","spacing","p","minWidth","onClick","e","stopPropagation","options","_e","option","selected","disableClearable","renderInput","params","placeholder","size","initialTimeRange","onCancel","ref","IconComponent","inputProps","marginTop","transform","paddingRight","lineHeight","paddingY","disableRipple","preventDefault","cursor","backgroundColor","py","px","alignItems","width","justifyContent","flexDirection","typography","color","mt","pr","ml","aria-label","currentTarget","fontSize","item","idx"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- // Copyright 2024 The Perses Authors
1
+ // Copyright The Perses Authors
2
2
  // Licensed under the Apache License, Version 2.0 (the "License");
3
3
  // you may not use this file except in compliance with the License.
4
4
  // You may obtain a copy of the License at
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/TimeRangeSelector/index.ts"],"sourcesContent":["// Copyright 2024 The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nexport * from './TimeRangeSelector';\nexport * from './DateTimeRangePicker';\n"],"names":[],"mappings":"AAAA,oCAAoC;AACpC,kEAAkE;AAClE,mEAAmE;AACnE,0CAA0C;AAC1C,EAAE;AACF,6CAA6C;AAC7C,EAAE;AACF,sEAAsE;AACtE,oEAAoE;AACpE,2EAA2E;AAC3E,sEAAsE;AACtE,iCAAiC;AAEjC,cAAc,sBAAsB;AACpC,cAAc,wBAAwB"}
1
+ {"version":3,"sources":["../../src/TimeRangeSelector/index.ts"],"sourcesContent":["// Copyright The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nexport * from './TimeRangeSelector';\nexport * from './DateTimeRangePicker';\n"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,kEAAkE;AAClE,mEAAmE;AACnE,0CAA0C;AAC1C,EAAE;AACF,6CAA6C;AAC7C,EAAE;AACF,sEAAsE;AACtE,oEAAoE;AACpE,2EAA2E;AAC3E,sEAAsE;AACtE,iCAAiC;AAEjC,cAAc,sBAAsB;AACpC,cAAc,wBAAwB"}
@@ -1,4 +1,4 @@
1
- // Copyright 2024 The Perses Authors
1
+ // Copyright The Perses Authors
2
2
  // Licensed under the Apache License, Version 2.0 (the "License");
3
3
  // you may not use this file except in compliance with the License.
4
4
  // You may obtain a copy of the License at