@perses-dev/components 0.0.0-snapshot-scatterplot-fix-imports-95e1b59 → 0.0.0-snapshot-explorer-plugin-c4a7621

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 (514) hide show
  1. package/dist/AlignSelector/AlignSelector.d.ts +9 -0
  2. package/dist/AlignSelector/AlignSelector.d.ts.map +1 -0
  3. package/dist/AlignSelector/AlignSelector.js +42 -0
  4. package/dist/AlignSelector/AlignSelector.js.map +1 -0
  5. package/dist/AlignSelector/index.d.ts +2 -0
  6. package/dist/AlignSelector/index.d.ts.map +1 -0
  7. package/dist/AlignSelector/index.js +15 -0
  8. package/dist/AlignSelector/index.js.map +1 -0
  9. package/dist/BarChart/BarChart.d.ts +2 -1
  10. package/dist/BarChart/BarChart.d.ts.map +1 -1
  11. package/dist/BarChart/BarChart.js +11 -6
  12. package/dist/BarChart/BarChart.js.map +1 -1
  13. package/dist/ColorPicker/ColorPicker.d.ts +3 -1
  14. package/dist/ColorPicker/ColorPicker.d.ts.map +1 -1
  15. package/dist/ColorPicker/ColorPicker.js +28 -13
  16. package/dist/ColorPicker/ColorPicker.js.map +1 -1
  17. package/dist/ColorPicker/OptionsColorPicker.d.ts +9 -0
  18. package/dist/ColorPicker/OptionsColorPicker.d.ts.map +1 -0
  19. package/dist/{ThresholdsEditor/ThresholdColorPicker.js → ColorPicker/OptionsColorPicker.js} +16 -13
  20. package/dist/ColorPicker/OptionsColorPicker.js.map +1 -0
  21. package/dist/ColorPicker/index.d.ts +1 -0
  22. package/dist/ColorPicker/index.d.ts.map +1 -1
  23. package/dist/ColorPicker/index.js +1 -0
  24. package/dist/ColorPicker/index.js.map +1 -1
  25. package/dist/ContentWithLegend/ContentWithLegend.d.ts +2 -1
  26. package/dist/ContentWithLegend/ContentWithLegend.d.ts.map +1 -1
  27. package/dist/ContentWithLegend/ContentWithLegend.js +8 -5
  28. package/dist/ContentWithLegend/ContentWithLegend.js.map +1 -1
  29. package/dist/ContentWithLegend/model/content-with-legend-model.js +2 -3
  30. package/dist/ContentWithLegend/model/content-with-legend-model.js.map +1 -1
  31. package/dist/DensitySelector/DensitySelector.d.ts +8 -0
  32. package/dist/DensitySelector/DensitySelector.d.ts.map +1 -0
  33. package/dist/DensitySelector/DensitySelector.js +46 -0
  34. package/dist/DensitySelector/DensitySelector.js.map +1 -0
  35. package/dist/DensitySelector/index.d.ts +2 -0
  36. package/dist/DensitySelector/index.d.ts.map +1 -0
  37. package/dist/DensitySelector/index.js +15 -0
  38. package/dist/DensitySelector/index.js.map +1 -0
  39. package/dist/Dialog/Dialog.d.ts +9 -14
  40. package/dist/Dialog/Dialog.d.ts.map +1 -1
  41. package/dist/Dialog/Dialog.js +7 -3
  42. package/dist/Dialog/Dialog.js.map +1 -1
  43. package/dist/Dialog/DiscardChangesConfirmationDialog.d.ts +2 -1
  44. package/dist/Dialog/DiscardChangesConfirmationDialog.d.ts.map +1 -1
  45. package/dist/Dialog/DiscardChangesConfirmationDialog.js.map +1 -1
  46. package/dist/DragAndDrop/DragAndDropList.d.ts +24 -0
  47. package/dist/DragAndDrop/DragAndDropList.d.ts.map +1 -0
  48. package/dist/DragAndDrop/DragAndDropList.js +153 -0
  49. package/dist/DragAndDrop/DragAndDropList.js.map +1 -0
  50. package/dist/DragAndDrop/DragButton.d.ts +13 -0
  51. package/dist/DragAndDrop/DragButton.d.ts.map +1 -0
  52. package/dist/DragAndDrop/DragButton.js +97 -0
  53. package/dist/DragAndDrop/DragButton.js.map +1 -0
  54. package/dist/DragAndDrop/DropIndicator.d.ts +3 -0
  55. package/dist/DragAndDrop/DropIndicator.d.ts.map +1 -0
  56. package/dist/DragAndDrop/DropIndicator.js +44 -0
  57. package/dist/DragAndDrop/DropIndicator.js.map +1 -0
  58. package/dist/DragAndDrop/index.d.ts +4 -0
  59. package/dist/DragAndDrop/index.d.ts.map +1 -0
  60. package/dist/DragAndDrop/index.js +17 -0
  61. package/dist/DragAndDrop/index.js.map +1 -0
  62. package/dist/DragAndDrop/model.d.ts +11 -0
  63. package/dist/DragAndDrop/model.d.ts.map +1 -0
  64. package/dist/DragAndDrop/model.js +17 -0
  65. package/dist/DragAndDrop/model.js.map +1 -0
  66. package/dist/Drawer/Drawer.d.ts +2 -1
  67. package/dist/Drawer/Drawer.d.ts.map +1 -1
  68. package/dist/Drawer/Drawer.js +1 -1
  69. package/dist/Drawer/Drawer.js.map +1 -1
  70. package/dist/EChart/EChart.d.ts +2 -2
  71. package/dist/EChart/EChart.d.ts.map +1 -1
  72. package/dist/EChart/EChart.js +5 -6
  73. package/dist/EChart/EChart.js.map +1 -1
  74. package/dist/ErrorAlert.d.ts +2 -1
  75. package/dist/ErrorAlert.d.ts.map +1 -1
  76. package/dist/ErrorAlert.js.map +1 -1
  77. package/dist/FontSizeSelector/FontSizeSelector.d.ts +2 -1
  78. package/dist/FontSizeSelector/FontSizeSelector.d.ts.map +1 -1
  79. package/dist/FontSizeSelector/FontSizeSelector.js.map +1 -1
  80. package/dist/FormEditor/FormActions.d.ts +16 -0
  81. package/dist/FormEditor/FormActions.d.ts.map +1 -0
  82. package/dist/FormEditor/FormActions.js +75 -0
  83. package/dist/FormEditor/FormActions.js.map +1 -0
  84. package/dist/FormEditor/index.d.ts +2 -0
  85. package/dist/FormEditor/index.d.ts.map +1 -0
  86. package/dist/FormEditor/index.js +15 -0
  87. package/dist/FormEditor/index.js.map +1 -0
  88. package/dist/FormatControls/FormatControls.d.ts +2 -1
  89. package/dist/FormatControls/FormatControls.d.ts.map +1 -1
  90. package/dist/FormatControls/FormatControls.js +2 -2
  91. package/dist/FormatControls/FormatControls.js.map +1 -1
  92. package/dist/GaugeChart/GaugeChart.d.ts +2 -1
  93. package/dist/GaugeChart/GaugeChart.d.ts.map +1 -1
  94. package/dist/GaugeChart/GaugeChart.js +4 -7
  95. package/dist/GaugeChart/GaugeChart.js.map +1 -1
  96. package/dist/InfoTooltip/InfoTooltip.d.ts +3 -3
  97. package/dist/InfoTooltip/InfoTooltip.d.ts.map +1 -1
  98. package/dist/InfoTooltip/InfoTooltip.js +3 -4
  99. package/dist/InfoTooltip/InfoTooltip.js.map +1 -1
  100. package/dist/JSONEditor.d.ts +2 -1
  101. package/dist/JSONEditor.d.ts.map +1 -1
  102. package/dist/JSONEditor.js.map +1 -1
  103. package/dist/Legend/CompactLegend.d.ts +2 -1
  104. package/dist/Legend/CompactLegend.d.ts.map +1 -1
  105. package/dist/Legend/CompactLegend.js.map +1 -1
  106. package/dist/Legend/Legend.d.ts +2 -1
  107. package/dist/Legend/Legend.d.ts.map +1 -1
  108. package/dist/Legend/Legend.js +8 -4
  109. package/dist/Legend/Legend.js.map +1 -1
  110. package/dist/Legend/LegendColorBadge.d.ts +2 -2
  111. package/dist/Legend/LegendColorBadge.d.ts.map +1 -1
  112. package/dist/Legend/LegendColorBadge.js +2 -2
  113. package/dist/Legend/LegendColorBadge.js.map +1 -1
  114. package/dist/Legend/ListLegend.d.ts +2 -1
  115. package/dist/Legend/ListLegend.d.ts.map +1 -1
  116. package/dist/Legend/ListLegend.js.map +1 -1
  117. package/dist/Legend/ListLegendItem.d.ts +5 -5
  118. package/dist/Legend/ListLegendItem.d.ts.map +1 -1
  119. package/dist/Legend/ListLegendItem.js +8 -12
  120. package/dist/Legend/ListLegendItem.js.map +1 -1
  121. package/dist/Legend/TableLegend.d.ts +2 -1
  122. package/dist/Legend/TableLegend.d.ts.map +1 -1
  123. package/dist/Legend/TableLegend.js +1 -0
  124. package/dist/Legend/TableLegend.js.map +1 -1
  125. package/dist/Legend/legend-model.d.ts.map +1 -1
  126. package/dist/Legend/legend-model.js.map +1 -1
  127. package/dist/LineChart/LineChart.d.ts +1 -1
  128. package/dist/LineChart/LineChart.d.ts.map +1 -1
  129. package/dist/LineChart/LineChart.js +6 -11
  130. package/dist/LineChart/LineChart.js.map +1 -1
  131. package/dist/LinksEditor/LinksEditor.d.ts +8 -0
  132. package/dist/LinksEditor/LinksEditor.d.ts.map +1 -0
  133. package/dist/LinksEditor/LinksEditor.js +161 -0
  134. package/dist/LinksEditor/LinksEditor.js.map +1 -0
  135. package/dist/LinksEditor/index.d.ts +2 -0
  136. package/dist/LinksEditor/index.d.ts.map +1 -0
  137. package/dist/LinksEditor/index.js +15 -0
  138. package/dist/LinksEditor/index.js.map +1 -0
  139. package/dist/ModeSelector/ModeSelector.d.ts +2 -1
  140. package/dist/ModeSelector/ModeSelector.d.ts.map +1 -1
  141. package/dist/ModeSelector/ModeSelector.js.map +1 -1
  142. package/dist/OptionsEditorLayout/OptionsEditorColumn.d.ts +2 -2
  143. package/dist/OptionsEditorLayout/OptionsEditorColumn.d.ts.map +1 -1
  144. package/dist/OptionsEditorLayout/OptionsEditorColumn.js.map +1 -1
  145. package/dist/OptionsEditorLayout/OptionsEditorControl.d.ts +2 -1
  146. package/dist/OptionsEditorLayout/OptionsEditorControl.d.ts.map +1 -1
  147. package/dist/OptionsEditorLayout/OptionsEditorControl.js.map +1 -1
  148. package/dist/OptionsEditorLayout/OptionsEditorGrid.d.ts +2 -2
  149. package/dist/OptionsEditorLayout/OptionsEditorGrid.d.ts.map +1 -1
  150. package/dist/OptionsEditorLayout/OptionsEditorGrid.js.map +1 -1
  151. package/dist/OptionsEditorLayout/OptionsEditorGroup.d.ts +2 -2
  152. package/dist/OptionsEditorLayout/OptionsEditorGroup.d.ts.map +1 -1
  153. package/dist/OptionsEditorLayout/OptionsEditorGroup.js.map +1 -1
  154. package/dist/Overlay/Overlay.d.ts +16 -0
  155. package/dist/Overlay/Overlay.d.ts.map +1 -0
  156. package/dist/Overlay/Overlay.js +52 -0
  157. package/dist/Overlay/Overlay.js.map +1 -0
  158. package/dist/Overlay/index.d.ts +2 -0
  159. package/dist/Overlay/index.d.ts.map +1 -0
  160. package/dist/Overlay/index.js +15 -0
  161. package/dist/Overlay/index.js.map +1 -0
  162. package/dist/PieChart/PieChart.d.ts +14 -0
  163. package/dist/PieChart/PieChart.d.ts.map +1 -0
  164. package/dist/PieChart/PieChart.js +92 -0
  165. package/dist/PieChart/PieChart.js.map +1 -0
  166. package/dist/PieChart/index.d.ts +2 -0
  167. package/dist/PieChart/index.d.ts.map +1 -0
  168. package/dist/PieChart/index.js +15 -0
  169. package/dist/PieChart/index.js.map +1 -0
  170. package/dist/RefreshIntervalPicker/RefreshIntervalPicker.d.ts +2 -1
  171. package/dist/RefreshIntervalPicker/RefreshIntervalPicker.d.ts.map +1 -1
  172. package/dist/RefreshIntervalPicker/RefreshIntervalPicker.js.map +1 -1
  173. package/dist/SettingsAutocomplete/SettingsAutocomplete.d.ts +2 -2
  174. package/dist/SettingsAutocomplete/SettingsAutocomplete.d.ts.map +1 -1
  175. package/dist/SettingsAutocomplete/SettingsAutocomplete.js +6 -5
  176. package/dist/SettingsAutocomplete/SettingsAutocomplete.js.map +1 -1
  177. package/dist/SortSelector/SortSelector.d.ts +2 -1
  178. package/dist/SortSelector/SortSelector.d.ts.map +1 -1
  179. package/dist/SortSelector/SortSelector.js.map +1 -1
  180. package/dist/SortSelector/SortSelectorButtons.d.ts +9 -0
  181. package/dist/SortSelector/SortSelectorButtons.d.ts.map +1 -0
  182. package/dist/SortSelector/SortSelectorButtons.js +42 -0
  183. package/dist/SortSelector/SortSelectorButtons.js.map +1 -0
  184. package/dist/SortSelector/index.d.ts +1 -0
  185. package/dist/SortSelector/index.d.ts.map +1 -1
  186. package/dist/SortSelector/index.js +2 -1
  187. package/dist/SortSelector/index.js.map +1 -1
  188. package/dist/StatChart/StatChart.d.ts +6 -5
  189. package/dist/StatChart/StatChart.d.ts.map +1 -1
  190. package/dist/StatChart/StatChart.js +10 -16
  191. package/dist/StatChart/StatChart.js.map +1 -1
  192. package/dist/StatChart/calculateFontSize.d.ts.map +1 -1
  193. package/dist/StatChart/calculateFontSize.js +2 -4
  194. package/dist/StatChart/calculateFontSize.js.map +1 -1
  195. package/dist/StatChart/utils/formatStatChartValue.d.ts +3 -0
  196. package/dist/StatChart/utils/formatStatChartValue.d.ts.map +1 -0
  197. package/dist/StatChart/utils/formatStatChartValue.js +26 -0
  198. package/dist/StatChart/utils/formatStatChartValue.js.map +1 -0
  199. package/dist/StatusHistoryChart/StatusHistoryChart.d.ts +27 -0
  200. package/dist/StatusHistoryChart/StatusHistoryChart.d.ts.map +1 -0
  201. package/dist/StatusHistoryChart/StatusHistoryChart.js +132 -0
  202. package/dist/StatusHistoryChart/StatusHistoryChart.js.map +1 -0
  203. package/dist/StatusHistoryChart/StatusHistoryTooltip.d.ts +13 -0
  204. package/dist/StatusHistoryChart/StatusHistoryTooltip.d.ts.map +1 -0
  205. package/dist/StatusHistoryChart/StatusHistoryTooltip.js +47 -0
  206. package/dist/StatusHistoryChart/StatusHistoryTooltip.js.map +1 -0
  207. package/dist/StatusHistoryChart/get-formatted-axis-label.d.ts +2 -0
  208. package/dist/StatusHistoryChart/get-formatted-axis-label.d.ts.map +1 -0
  209. package/dist/StatusHistoryChart/get-formatted-axis-label.js +41 -0
  210. package/dist/StatusHistoryChart/get-formatted-axis-label.js.map +1 -0
  211. package/dist/StatusHistoryChart/index.d.ts +3 -0
  212. package/dist/StatusHistoryChart/index.d.ts.map +1 -0
  213. package/dist/StatusHistoryChart/index.js +16 -0
  214. package/dist/StatusHistoryChart/index.js.map +1 -0
  215. package/dist/StatusHistoryChart/utils/get-color.d.ts +6 -0
  216. package/dist/StatusHistoryChart/utils/get-color.d.ts.map +1 -0
  217. package/dist/StatusHistoryChart/utils/get-color.js +100 -0
  218. package/dist/StatusHistoryChart/utils/get-color.js.map +1 -0
  219. package/dist/StatusHistoryChart/utils/get-tooltip-position.d.ts +3 -0
  220. package/dist/StatusHistoryChart/utils/get-tooltip-position.d.ts.map +1 -0
  221. package/dist/StatusHistoryChart/utils/get-tooltip-position.js +27 -0
  222. package/dist/StatusHistoryChart/utils/get-tooltip-position.js.map +1 -0
  223. package/dist/Table/InnerTable.d.ts.map +1 -1
  224. package/dist/Table/InnerTable.js +2 -1
  225. package/dist/Table/InnerTable.js.map +1 -1
  226. package/dist/Table/Table.d.ts +2 -1
  227. package/dist/Table/Table.d.ts.map +1 -1
  228. package/dist/Table/Table.js +10 -8
  229. package/dist/Table/Table.js.map +1 -1
  230. package/dist/Table/TableCell.d.ts +4 -2
  231. package/dist/Table/TableCell.d.ts.map +1 -1
  232. package/dist/Table/TableCell.js +28 -6
  233. package/dist/Table/TableCell.js.map +1 -1
  234. package/dist/Table/TableCheckbox.d.ts +2 -1
  235. package/dist/Table/TableCheckbox.d.ts.map +1 -1
  236. package/dist/Table/TableCheckbox.js.map +1 -1
  237. package/dist/Table/TableHeaderCell.d.ts +3 -2
  238. package/dist/Table/TableHeaderCell.d.ts.map +1 -1
  239. package/dist/Table/TableHeaderCell.js.map +1 -1
  240. package/dist/Table/VirtualizedTable.d.ts +5 -4
  241. package/dist/Table/VirtualizedTable.d.ts.map +1 -1
  242. package/dist/Table/VirtualizedTable.js +17 -14
  243. package/dist/Table/VirtualizedTable.js.map +1 -1
  244. package/dist/Table/hooks/useTableKeyboardNav.d.ts +2 -2
  245. package/dist/Table/hooks/useTableKeyboardNav.d.ts.map +1 -1
  246. package/dist/Table/hooks/useTableKeyboardNav.js +1 -1
  247. package/dist/Table/hooks/useTableKeyboardNav.js.map +1 -1
  248. package/dist/Table/hooks/useVirtualizedTableKeyboardNav.d.ts +10 -12
  249. package/dist/Table/hooks/useVirtualizedTableKeyboardNav.d.ts.map +1 -1
  250. package/dist/Table/hooks/useVirtualizedTableKeyboardNav.js +7 -13
  251. package/dist/Table/hooks/useVirtualizedTableKeyboardNav.js.map +1 -1
  252. package/dist/Table/index.d.ts +1 -2
  253. package/dist/Table/index.d.ts.map +1 -1
  254. package/dist/Table/index.js +1 -1
  255. package/dist/Table/index.js.map +1 -1
  256. package/dist/Table/model/table-model.d.ts +22 -2
  257. package/dist/Table/model/table-model.d.ts.map +1 -1
  258. package/dist/Table/model/table-model.js +27 -21
  259. package/dist/Table/model/table-model.js.map +1 -1
  260. package/dist/ThresholdsEditor/ThresholdInput.d.ts +2 -2
  261. package/dist/ThresholdsEditor/ThresholdInput.d.ts.map +1 -1
  262. package/dist/ThresholdsEditor/ThresholdInput.js +2 -2
  263. package/dist/ThresholdsEditor/ThresholdInput.js.map +1 -1
  264. package/dist/ThresholdsEditor/ThresholdsEditor.d.ts +2 -1
  265. package/dist/ThresholdsEditor/ThresholdsEditor.d.ts.map +1 -1
  266. package/dist/ThresholdsEditor/ThresholdsEditor.js +18 -26
  267. package/dist/ThresholdsEditor/ThresholdsEditor.js.map +1 -1
  268. package/dist/TimeChart/TimeChart.d.ts.map +1 -1
  269. package/dist/TimeChart/TimeChart.js +5 -8
  270. package/dist/TimeChart/TimeChart.js.map +1 -1
  271. package/dist/TimeRangeSelector/DateTimeRangePicker.d.ts +19 -0
  272. package/dist/TimeRangeSelector/DateTimeRangePicker.d.ts.map +1 -0
  273. package/dist/{DateTimeRangePicker/AbsoluteTimePicker.js → TimeRangeSelector/DateTimeRangePicker.js} +43 -28
  274. package/dist/TimeRangeSelector/DateTimeRangePicker.js.map +1 -0
  275. package/dist/TimeRangeSelector/TimeRangeSelector.d.ts +36 -0
  276. package/dist/TimeRangeSelector/TimeRangeSelector.d.ts.map +1 -0
  277. package/dist/TimeRangeSelector/TimeRangeSelector.js +119 -0
  278. package/dist/TimeRangeSelector/TimeRangeSelector.js.map +1 -0
  279. package/dist/{DateTimeRangePicker → TimeRangeSelector}/index.d.ts +1 -2
  280. package/dist/TimeRangeSelector/index.d.ts.map +1 -0
  281. package/dist/{DateTimeRangePicker → TimeRangeSelector}/index.js +2 -3
  282. package/dist/TimeRangeSelector/index.js.map +1 -0
  283. package/dist/TimeRangeSelector/utils.d.ts +25 -0
  284. package/dist/TimeRangeSelector/utils.d.ts.map +1 -0
  285. package/dist/{DateTimeRangePicker → TimeRangeSelector}/utils.js +23 -2
  286. package/dist/TimeRangeSelector/utils.js.map +1 -0
  287. package/dist/TimeSeriesTooltip/LineChartTooltip.d.ts +2 -2
  288. package/dist/TimeSeriesTooltip/LineChartTooltip.d.ts.map +1 -1
  289. package/dist/TimeSeriesTooltip/LineChartTooltip.js +6 -11
  290. package/dist/TimeSeriesTooltip/LineChartTooltip.js.map +1 -1
  291. package/dist/TimeSeriesTooltip/SeriesInfo.d.ts +2 -1
  292. package/dist/TimeSeriesTooltip/SeriesInfo.d.ts.map +1 -1
  293. package/dist/TimeSeriesTooltip/SeriesInfo.js +1 -2
  294. package/dist/TimeSeriesTooltip/SeriesInfo.js.map +1 -1
  295. package/dist/TimeSeriesTooltip/SeriesLabelsStack.d.ts +2 -1
  296. package/dist/TimeSeriesTooltip/SeriesLabelsStack.d.ts.map +1 -1
  297. package/dist/TimeSeriesTooltip/SeriesLabelsStack.js.map +1 -1
  298. package/dist/TimeSeriesTooltip/SeriesMarker.d.ts +2 -1
  299. package/dist/TimeSeriesTooltip/SeriesMarker.d.ts.map +1 -1
  300. package/dist/TimeSeriesTooltip/SeriesMarker.js.map +1 -1
  301. package/dist/TimeSeriesTooltip/TimeChartTooltip.d.ts +2 -2
  302. package/dist/TimeSeriesTooltip/TimeChartTooltip.d.ts.map +1 -1
  303. package/dist/TimeSeriesTooltip/TimeChartTooltip.js +2 -3
  304. package/dist/TimeSeriesTooltip/TimeChartTooltip.js.map +1 -1
  305. package/dist/TimeSeriesTooltip/TooltipContent.d.ts +2 -1
  306. package/dist/TimeSeriesTooltip/TooltipContent.d.ts.map +1 -1
  307. package/dist/TimeSeriesTooltip/TooltipContent.js.map +1 -1
  308. package/dist/TimeSeriesTooltip/TooltipHeader.d.ts.map +1 -1
  309. package/dist/TimeSeriesTooltip/TooltipHeader.js +6 -14
  310. package/dist/TimeSeriesTooltip/TooltipHeader.js.map +1 -1
  311. package/dist/TimeSeriesTooltip/nearby-series.d.ts.map +1 -1
  312. package/dist/TimeSeriesTooltip/nearby-series.js +15 -25
  313. package/dist/TimeSeriesTooltip/nearby-series.js.map +1 -1
  314. package/dist/TimeSeriesTooltip/tooltip-model.d.ts +8 -1
  315. package/dist/TimeSeriesTooltip/tooltip-model.d.ts.map +1 -1
  316. package/dist/TimeSeriesTooltip/tooltip-model.js +13 -2
  317. package/dist/TimeSeriesTooltip/tooltip-model.js.map +1 -1
  318. package/dist/TimeSeriesTooltip/utils.d.ts +1 -21
  319. package/dist/TimeSeriesTooltip/utils.d.ts.map +1 -1
  320. package/dist/TimeSeriesTooltip/utils.js +2 -4
  321. package/dist/TimeSeriesTooltip/utils.js.map +1 -1
  322. package/dist/ToolbarIconButton/ToolbarIconButton.js.map +1 -1
  323. package/dist/TransformsEditor/TransformEditor.d.ts +9 -0
  324. package/dist/TransformsEditor/TransformEditor.d.ts.map +1 -0
  325. package/dist/TransformsEditor/TransformEditor.js +289 -0
  326. package/dist/TransformsEditor/TransformEditor.js.map +1 -0
  327. package/dist/TransformsEditor/TransformEditorContainer.d.ts +10 -0
  328. package/dist/TransformsEditor/TransformEditorContainer.d.ts.map +1 -0
  329. package/dist/TransformsEditor/TransformEditorContainer.js +118 -0
  330. package/dist/TransformsEditor/TransformEditorContainer.js.map +1 -0
  331. package/dist/TransformsEditor/TransformsEditor.d.ts +9 -0
  332. package/dist/TransformsEditor/TransformsEditor.d.ts.map +1 -0
  333. package/dist/TransformsEditor/TransformsEditor.js +90 -0
  334. package/dist/TransformsEditor/TransformsEditor.js.map +1 -0
  335. package/dist/TransformsEditor/index.d.ts +2 -0
  336. package/dist/TransformsEditor/index.d.ts.map +1 -0
  337. package/dist/TransformsEditor/index.js +15 -0
  338. package/dist/TransformsEditor/index.js.map +1 -0
  339. package/dist/ValueMappingEditor/ValueMappingEditor.d.ts +10 -0
  340. package/dist/ValueMappingEditor/ValueMappingEditor.d.ts.map +1 -0
  341. package/dist/ValueMappingEditor/ValueMappingEditor.js +374 -0
  342. package/dist/ValueMappingEditor/ValueMappingEditor.js.map +1 -0
  343. package/dist/ValueMappingEditor/ValueMappingsEditor.d.ts +8 -0
  344. package/dist/ValueMappingEditor/ValueMappingsEditor.d.ts.map +1 -0
  345. package/dist/ValueMappingEditor/ValueMappingsEditor.js +118 -0
  346. package/dist/ValueMappingEditor/ValueMappingsEditor.js.map +1 -0
  347. package/dist/ValueMappingEditor/index.d.ts +2 -0
  348. package/dist/ValueMappingEditor/index.d.ts.map +1 -0
  349. package/dist/ValueMappingEditor/index.js +15 -0
  350. package/dist/ValueMappingEditor/index.js.map +1 -0
  351. package/dist/YAxisLabel.d.ts +2 -1
  352. package/dist/YAxisLabel.d.ts.map +1 -1
  353. package/dist/YAxisLabel.js +4 -2
  354. package/dist/YAxisLabel.js.map +1 -1
  355. package/dist/cjs/AlignSelector/AlignSelector.js +50 -0
  356. package/dist/cjs/AlignSelector/index.js +30 -0
  357. package/dist/cjs/BarChart/BarChart.js +12 -7
  358. package/dist/cjs/ColorPicker/ColorPicker.js +28 -54
  359. package/dist/cjs/{ThresholdsEditor/ThresholdColorPicker.js → ColorPicker/OptionsColorPicker.js} +18 -15
  360. package/dist/cjs/ColorPicker/index.js +1 -0
  361. package/dist/cjs/ContentWithLegend/ContentWithLegend.js +8 -10
  362. package/dist/cjs/ContentWithLegend/model/content-with-legend-model.js +2 -3
  363. package/dist/cjs/DensitySelector/DensitySelector.js +54 -0
  364. package/dist/cjs/DensitySelector/index.js +30 -0
  365. package/dist/cjs/Dialog/Dialog.js +7 -3
  366. package/dist/cjs/DragAndDrop/DragAndDropList.js +159 -0
  367. package/dist/cjs/DragAndDrop/DragButton.js +121 -0
  368. package/dist/cjs/DragAndDrop/DropIndicator.js +52 -0
  369. package/dist/cjs/DragAndDrop/index.js +32 -0
  370. package/dist/cjs/DragAndDrop/model.js +25 -0
  371. package/dist/cjs/Drawer/Drawer.js +1 -1
  372. package/dist/cjs/EChart/EChart.js +5 -47
  373. package/dist/cjs/FormEditor/FormActions.js +83 -0
  374. package/dist/cjs/FormEditor/index.js +30 -0
  375. package/dist/cjs/FormatControls/FormatControls.js +2 -2
  376. package/dist/cjs/GaugeChart/GaugeChart.js +5 -8
  377. package/dist/cjs/InfoTooltip/InfoTooltip.js +3 -9
  378. package/dist/cjs/Legend/Legend.js +8 -4
  379. package/dist/cjs/Legend/LegendColorBadge.js +2 -7
  380. package/dist/cjs/Legend/ListLegendItem.js +6 -50
  381. package/dist/cjs/Legend/TableLegend.js +1 -0
  382. package/dist/cjs/LineChart/LineChart.js +8 -13
  383. package/dist/cjs/LinksEditor/LinksEditor.js +174 -0
  384. package/dist/cjs/LinksEditor/index.js +30 -0
  385. package/dist/cjs/Overlay/Overlay.js +71 -0
  386. package/dist/cjs/Overlay/index.js +30 -0
  387. package/dist/cjs/PieChart/PieChart.js +100 -0
  388. package/dist/cjs/PieChart/index.js +30 -0
  389. package/dist/cjs/SettingsAutocomplete/SettingsAutocomplete.js +6 -5
  390. package/dist/cjs/SortSelector/SortSelectorButtons.js +50 -0
  391. package/dist/cjs/SortSelector/index.js +2 -1
  392. package/dist/cjs/StatChart/StatChart.js +13 -19
  393. package/dist/cjs/StatChart/calculateFontSize.js +2 -4
  394. package/dist/cjs/StatChart/utils/formatStatChartValue.js +34 -0
  395. package/dist/cjs/StatusHistoryChart/StatusHistoryChart.js +140 -0
  396. package/dist/cjs/StatusHistoryChart/StatusHistoryTooltip.js +55 -0
  397. package/dist/cjs/StatusHistoryChart/get-formatted-axis-label.js +48 -0
  398. package/dist/cjs/StatusHistoryChart/index.js +31 -0
  399. package/dist/cjs/StatusHistoryChart/utils/get-color.js +125 -0
  400. package/dist/cjs/StatusHistoryChart/utils/get-tooltip-position.js +35 -0
  401. package/dist/cjs/Table/InnerTable.js +2 -1
  402. package/dist/cjs/Table/Table.js +9 -7
  403. package/dist/cjs/Table/TableCell.js +28 -6
  404. package/dist/cjs/Table/VirtualizedTable.js +17 -14
  405. package/dist/cjs/Table/hooks/useTableKeyboardNav.js +1 -1
  406. package/dist/cjs/Table/hooks/useVirtualizedTableKeyboardNav.js +7 -13
  407. package/dist/cjs/Table/index.js +1 -7
  408. package/dist/cjs/Table/model/table-model.js +30 -21
  409. package/dist/cjs/ThresholdsEditor/ThresholdInput.js +2 -2
  410. package/dist/cjs/ThresholdsEditor/ThresholdsEditor.js +18 -26
  411. package/dist/cjs/TimeChart/TimeChart.js +5 -8
  412. package/dist/cjs/{DateTimeRangePicker/AbsoluteTimePicker.js → TimeRangeSelector/DateTimeRangePicker.js} +37 -30
  413. package/dist/cjs/TimeRangeSelector/TimeRangeSelector.js +127 -0
  414. package/dist/cjs/{DateTimeRangePicker → TimeRangeSelector}/index.js +2 -3
  415. package/dist/cjs/{DateTimeRangePicker → TimeRangeSelector}/utils.js +24 -1
  416. package/dist/cjs/TimeSeriesTooltip/LineChartTooltip.js +6 -11
  417. package/dist/cjs/TimeSeriesTooltip/SeriesInfo.js +1 -2
  418. package/dist/cjs/TimeSeriesTooltip/TimeChartTooltip.js +2 -3
  419. package/dist/cjs/TimeSeriesTooltip/TooltipHeader.js +6 -14
  420. package/dist/cjs/TimeSeriesTooltip/nearby-series.js +15 -25
  421. package/dist/cjs/TimeSeriesTooltip/tooltip-model.js +22 -2
  422. package/dist/cjs/TimeSeriesTooltip/utils.js +2 -4
  423. package/dist/cjs/TransformsEditor/TransformEditor.js +297 -0
  424. package/dist/cjs/TransformsEditor/TransformEditorContainer.js +131 -0
  425. package/dist/cjs/TransformsEditor/TransformsEditor.js +103 -0
  426. package/dist/cjs/TransformsEditor/index.js +30 -0
  427. package/dist/cjs/ValueMappingEditor/ValueMappingEditor.js +387 -0
  428. package/dist/cjs/ValueMappingEditor/ValueMappingsEditor.js +131 -0
  429. package/dist/cjs/ValueMappingEditor/index.js +30 -0
  430. package/dist/cjs/YAxisLabel.js +4 -2
  431. package/dist/cjs/context/TimeZoneProvider.js +1 -1
  432. package/dist/cjs/controls/TextField.js +54 -0
  433. package/dist/cjs/controls/index.js +30 -0
  434. package/dist/cjs/index.js +12 -1
  435. package/dist/cjs/model/timeOption.js +19 -1
  436. package/dist/cjs/theme/index.js +1 -0
  437. package/dist/cjs/theme/palette/background.js +2 -0
  438. package/dist/cjs/theme/theme.js +6 -6
  439. package/dist/cjs/utils/chart-actions.js +2 -3
  440. package/dist/cjs/utils/format.js +19 -1
  441. package/dist/cjs/utils/theme-gen.js +5 -7
  442. package/dist/context/ChartsProvider.d.ts +2 -2
  443. package/dist/context/ChartsProvider.d.ts.map +1 -1
  444. package/dist/context/ChartsProvider.js.map +1 -1
  445. package/dist/context/TimeZoneProvider.d.ts +4 -4
  446. package/dist/context/TimeZoneProvider.d.ts.map +1 -1
  447. package/dist/context/TimeZoneProvider.js +1 -1
  448. package/dist/context/TimeZoneProvider.js.map +1 -1
  449. package/dist/controls/TextField.d.ts +9 -0
  450. package/dist/controls/TextField.d.ts.map +1 -0
  451. package/dist/controls/TextField.js +41 -0
  452. package/dist/controls/TextField.js.map +1 -0
  453. package/dist/controls/index.d.ts +2 -0
  454. package/dist/controls/index.d.ts.map +1 -0
  455. package/dist/controls/index.js +15 -0
  456. package/dist/controls/index.js.map +1 -0
  457. package/dist/index.d.ts +12 -1
  458. package/dist/index.d.ts.map +1 -1
  459. package/dist/index.js +12 -1
  460. package/dist/index.js.map +1 -1
  461. package/dist/model/timeOption.d.ts +2 -1
  462. package/dist/model/timeOption.d.ts.map +1 -1
  463. package/dist/model/timeOption.js +13 -2
  464. package/dist/model/timeOption.js.map +1 -1
  465. package/dist/test/render.d.ts +3 -3
  466. package/dist/test/render.d.ts.map +1 -1
  467. package/dist/test/render.js.map +1 -1
  468. package/dist/theme/index.d.ts +2 -0
  469. package/dist/theme/index.d.ts.map +1 -1
  470. package/dist/theme/index.js +1 -0
  471. package/dist/theme/index.js.map +1 -1
  472. package/dist/theme/palette/background.d.ts.map +1 -1
  473. package/dist/theme/palette/background.js +2 -0
  474. package/dist/theme/palette/background.js.map +1 -1
  475. package/dist/theme/theme.d.ts +2 -2
  476. package/dist/theme/theme.d.ts.map +1 -1
  477. package/dist/theme/theme.js +5 -5
  478. package/dist/theme/theme.js.map +1 -1
  479. package/dist/utils/axis.d.ts +1 -7
  480. package/dist/utils/axis.d.ts.map +1 -1
  481. package/dist/utils/axis.js.map +1 -1
  482. package/dist/utils/chart-actions.d.ts.map +1 -1
  483. package/dist/utils/chart-actions.js +2 -3
  484. package/dist/utils/chart-actions.js.map +1 -1
  485. package/dist/utils/component-ids.d.ts.map +1 -1
  486. package/dist/utils/component-ids.js.map +1 -1
  487. package/dist/utils/format.d.ts +10 -4
  488. package/dist/utils/format.d.ts.map +1 -1
  489. package/dist/utils/format.js +16 -1
  490. package/dist/utils/format.js.map +1 -1
  491. package/dist/utils/theme-gen.js +5 -7
  492. package/dist/utils/theme-gen.js.map +1 -1
  493. package/package.json +12 -8
  494. package/dist/DateTimeRangePicker/AbsoluteTimePicker.d.ts +0 -9
  495. package/dist/DateTimeRangePicker/AbsoluteTimePicker.d.ts.map +0 -1
  496. package/dist/DateTimeRangePicker/AbsoluteTimePicker.js.map +0 -1
  497. package/dist/DateTimeRangePicker/DateTimeRangePicker.d.ts +0 -11
  498. package/dist/DateTimeRangePicker/DateTimeRangePicker.d.ts.map +0 -1
  499. package/dist/DateTimeRangePicker/DateTimeRangePicker.js +0 -80
  500. package/dist/DateTimeRangePicker/DateTimeRangePicker.js.map +0 -1
  501. package/dist/DateTimeRangePicker/TimeRangeSelector.d.ts +0 -13
  502. package/dist/DateTimeRangePicker/TimeRangeSelector.d.ts.map +0 -1
  503. package/dist/DateTimeRangePicker/TimeRangeSelector.js +0 -67
  504. package/dist/DateTimeRangePicker/TimeRangeSelector.js.map +0 -1
  505. package/dist/DateTimeRangePicker/index.d.ts.map +0 -1
  506. package/dist/DateTimeRangePicker/index.js.map +0 -1
  507. package/dist/DateTimeRangePicker/utils.d.ts +0 -7
  508. package/dist/DateTimeRangePicker/utils.d.ts.map +0 -1
  509. package/dist/DateTimeRangePicker/utils.js.map +0 -1
  510. package/dist/ThresholdsEditor/ThresholdColorPicker.d.ts +0 -3
  511. package/dist/ThresholdsEditor/ThresholdColorPicker.d.ts.map +0 -1
  512. package/dist/ThresholdsEditor/ThresholdColorPicker.js.map +0 -1
  513. package/dist/cjs/DateTimeRangePicker/DateTimeRangePicker.js +0 -88
  514. package/dist/cjs/DateTimeRangePicker/TimeRangeSelector.js +0 -80
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/TimeChart/TimeChart.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 { forwardRef, MouseEvent, useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react';\nimport { Box } from '@mui/material';\nimport merge from 'lodash/merge';\nimport isEqual from 'lodash/isEqual';\nimport { DatasetOption } from 'echarts/types/dist/shared';\nimport { utcToZonedTime } from 'date-fns-tz';\nimport { getCommonTimeScale, TimeScale, FormatOptions, TimeSeries } from '@perses-dev/core';\nimport type {\n EChartsCoreOption,\n GridComponentOption,\n LineSeriesOption,\n YAXisComponentOption,\n TooltipComponentOption,\n} from 'echarts';\nimport { ECharts as EChartsInstance, use } from 'echarts/core';\nimport { LineChart as EChartsLineChart, BarChart as EChartsBarChart } from 'echarts/charts';\nimport {\n GridComponent,\n DatasetComponent,\n DataZoomComponent,\n MarkAreaComponent,\n MarkLineComponent,\n MarkPointComponent,\n TitleComponent,\n ToolboxComponent,\n TooltipComponent,\n} from 'echarts/components';\nimport { CanvasRenderer } from 'echarts/renderers';\nimport { EChart, OnEventsType } from '../EChart';\nimport { ChartInstanceFocusOpts, ChartInstance, TimeChartSeriesMapping, DEFAULT_PINNED_CROSSHAIR } from '../model';\nimport { useChartsContext } from '../context/ChartsProvider';\nimport {\n clearHighlightedSeries,\n enableDataZoom,\n getClosestTimestamp,\n getFormattedAxisLabel,\n getPointInGrid,\n getFormattedAxis,\n restoreChart,\n ZoomEventData,\n} from '../utils';\nimport { CursorCoordinates, TimeChartTooltip, TooltipConfig, DEFAULT_TOOLTIP_CONFIG } from '../TimeSeriesTooltip';\nimport { useTimeZone } from '../context/TimeZoneProvider';\n\nuse([\n EChartsLineChart,\n EChartsBarChart,\n GridComponent,\n DatasetComponent,\n DataZoomComponent,\n MarkAreaComponent,\n MarkLineComponent,\n MarkPointComponent,\n TitleComponent,\n ToolboxComponent,\n TooltipComponent,\n CanvasRenderer,\n]);\n\nexport interface TimeChartProps {\n height: number;\n data: TimeSeries[];\n seriesMapping: TimeChartSeriesMapping;\n timeScale?: TimeScale;\n yAxis?: YAXisComponentOption;\n format?: FormatOptions;\n grid?: GridComponentOption;\n tooltipConfig?: TooltipConfig;\n noDataVariant?: 'chart' | 'message';\n syncGroup?: string;\n isStackedBar?: boolean;\n onDataZoom?: (e: ZoomEventData) => void;\n onDoubleClick?: (e: MouseEvent) => void;\n __experimentalEChartsOptionsOverride?: (options: EChartsCoreOption) => EChartsCoreOption;\n}\n\nexport const TimeChart = forwardRef<ChartInstance, TimeChartProps>(function TimeChart(\n {\n height,\n data,\n seriesMapping,\n timeScale: timeScaleProp,\n yAxis,\n format,\n grid,\n isStackedBar = false,\n tooltipConfig = DEFAULT_TOOLTIP_CONFIG,\n noDataVariant = 'message',\n syncGroup,\n onDataZoom,\n onDoubleClick,\n __experimentalEChartsOptionsOverride,\n },\n ref\n) {\n const { chartsTheme, enablePinning, lastTooltipPinnedCoords, setLastTooltipPinnedCoords } = useChartsContext();\n const isPinningEnabled = tooltipConfig.enablePinning && enablePinning;\n const chartRef = useRef<EChartsInstance>();\n const [showTooltip, setShowTooltip] = useState<boolean>(true);\n const [tooltipPinnedCoords, setTooltipPinnedCoords] = useState<CursorCoordinates | null>(null);\n const [pinnedCrosshair, setPinnedCrosshair] = useState<LineSeriesOption | null>(null);\n const [isDragging, setIsDragging] = useState(false);\n const [startX, setStartX] = useState(0);\n const { timeZone } = useTimeZone();\n let timeScale: TimeScale;\n if (timeScaleProp === undefined) {\n const commonTimeScale = getCommonTimeScale(data);\n if (commonTimeScale === undefined) {\n // set default to past 5 years\n const today = new Date();\n const pastDate = new Date(today);\n pastDate.setFullYear(today.getFullYear() - 5);\n const todayMs = today.getTime();\n const pastDateMs = pastDate.getTime();\n timeScale = { startMs: pastDateMs, endMs: todayMs, stepMs: 1, rangeMs: todayMs - pastDateMs };\n } else {\n timeScale = commonTimeScale;\n }\n } else {\n timeScale = timeScaleProp;\n }\n\n useImperativeHandle(\n ref,\n () => {\n return {\n highlightSeries({ name }: ChartInstanceFocusOpts) {\n if (!chartRef.current) {\n // when chart undef, do not highlight series when hovering over legend\n return;\n }\n\n chartRef.current.dispatchAction({ type: 'highlight', seriesId: name });\n },\n clearHighlightedSeries: () => {\n if (!chartRef.current) {\n // when chart undef, do not clear highlight series\n return;\n }\n clearHighlightedSeries(chartRef.current);\n },\n };\n },\n []\n );\n\n const handleEvents: OnEventsType<LineSeriesOption['data'] | unknown> = useMemo(() => {\n return {\n datazoom: (params) => {\n if (onDataZoom === undefined) {\n setTimeout(() => {\n // workaround so unpin happens after click event\n setTooltipPinnedCoords(null);\n }, 10);\n }\n if (onDataZoom === undefined || params.batch[0] === undefined) return;\n const xAxisStartValue = params.batch[0].startValue;\n const xAxisEndValue = params.batch[0].endValue;\n if (xAxisStartValue !== undefined && xAxisEndValue !== undefined) {\n const zoomEvent: ZoomEventData = {\n start: xAxisStartValue,\n end: xAxisEndValue,\n };\n onDataZoom(zoomEvent);\n }\n },\n finished: () => {\n if (chartRef.current !== undefined) {\n enableDataZoom(chartRef.current);\n }\n },\n };\n }, [onDataZoom, setTooltipPinnedCoords]);\n\n const { noDataOption } = chartsTheme;\n\n const option: EChartsCoreOption = useMemo(() => {\n // The \"chart\" `noDataVariant` is only used when the `timeSeries` is an\n // empty array because a `null` value will throw an error.\n if (data === null || (data.length === 0 && noDataVariant === 'message')) return noDataOption;\n\n // Utilizes ECharts dataset so raw data is separate from series option style properties\n // https://apache.github.io/echarts-handbook/en/concepts/dataset/\n const dataset: DatasetOption[] = [];\n const isLocalTimeZone = timeZone === 'local';\n data.map((d, index) => {\n const values = d.values.map(([timestamp, value]) => {\n const val: string | number = value === null ? '-' : value; // echarts use '-' to represent null data\n return [isLocalTimeZone ? timestamp : utcToZonedTime(timestamp, timeZone), val];\n });\n dataset.push({ id: index, source: [...values], dimensions: ['time', 'value'] });\n });\n\n const updatedSeriesMapping =\n enablePinning && pinnedCrosshair !== null ? [...seriesMapping, pinnedCrosshair] : seriesMapping;\n\n const option: EChartsCoreOption = {\n dataset: dataset,\n series: updatedSeriesMapping,\n xAxis: {\n type: 'time',\n min: isLocalTimeZone ? timeScale.startMs : utcToZonedTime(timeScale.startMs, timeZone),\n max: isLocalTimeZone ? timeScale.endMs : utcToZonedTime(timeScale.endMs, timeZone),\n axisLabel: {\n hideOverlap: true,\n formatter: getFormattedAxisLabel(timeScale.rangeMs ?? 0),\n },\n axisPointer: {\n snap: false, // important so shared crosshair does not lag\n },\n },\n yAxis: getFormattedAxis(yAxis, format),\n animation: false,\n tooltip: {\n show: true,\n // ECharts tooltip content hidden by default since we use custom tooltip instead.\n // Stacked bar uses ECharts tooltip so subgroup data shows correctly.\n showContent: isStackedBar,\n trigger: isStackedBar ? 'item' : 'axis',\n appendToBody: true,\n },\n // https://echarts.apache.org/en/option.html#axisPointer\n axisPointer: {\n type: 'line',\n z: 0, // ensure point symbol shows on top of dashed line\n triggerEmphasis: false, // https://github.com/apache/echarts/issues/18495\n triggerTooltip: false,\n snap: false, // xAxis.axisPointer.snap takes priority\n },\n toolbox: {\n feature: {\n dataZoom: {\n icon: null, // https://stackoverflow.com/a/67684076/17575201\n yAxisIndex: 'none',\n },\n },\n },\n grid,\n };\n\n if (__experimentalEChartsOptionsOverride) {\n return __experimentalEChartsOptionsOverride(option);\n }\n\n return option;\n }, [\n data,\n seriesMapping,\n timeScale,\n yAxis,\n format,\n grid,\n noDataOption,\n __experimentalEChartsOptionsOverride,\n noDataVariant,\n timeZone,\n isStackedBar,\n enablePinning,\n pinnedCrosshair,\n ]);\n\n // Update adjacent charts so tooltip is unpinned when current chart is clicked.\n useEffect(() => {\n // Only allow pinning one tooltip at a time, subsequent tooltip click unpins previous.\n // Multiple tooltips can only be pinned if Ctrl or Cmd key is pressed while clicking.\n const multipleTooltipsPinned = tooltipPinnedCoords !== null && lastTooltipPinnedCoords !== null;\n if (multipleTooltipsPinned) {\n if (!isEqual(lastTooltipPinnedCoords, tooltipPinnedCoords)) {\n setTooltipPinnedCoords(null);\n if (tooltipPinnedCoords !== null && pinnedCrosshair !== null) {\n setPinnedCrosshair(null);\n }\n }\n }\n // tooltipPinnedCoords CANNOT be in dep array or tooltip pinning breaks in the current chart's onClick\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [lastTooltipPinnedCoords, seriesMapping]);\n\n return (\n <Box\n sx={{ height }}\n // onContextMenu={(e) => {\n // // TODO: confirm tooltip pinning works correctly on Windows, should e.preventDefault() be added here\n // e.preventDefault(); // Prevent the default behaviour when right clicked\n // }}\n onClick={(e) => {\n // Allows user to opt-in to multi tooltip pinning when Ctrl or Cmd key held down\n const isControlKeyPressed = e.ctrlKey || e.metaKey;\n if (isControlKeyPressed) {\n e.preventDefault();\n }\n\n // Determine where on chart canvas to plot pinned crosshair as markLine.\n const pointInGrid = getPointInGrid(e.nativeEvent.offsetX, e.nativeEvent.offsetY, chartRef.current);\n if (pointInGrid === null) {\n return;\n }\n\n // Pin and unpin when clicking on chart canvas but not tooltip text.\n if (isPinningEnabled && e.target instanceof HTMLCanvasElement) {\n // Pin tooltip and update shared charts context to remember these coordinates.\n const pinnedPos: CursorCoordinates = {\n page: {\n x: e.pageX,\n y: e.pageY,\n },\n client: {\n x: e.clientX,\n y: e.clientY,\n },\n plotCanvas: {\n x: e.nativeEvent.offsetX,\n y: e.nativeEvent.offsetY,\n },\n target: e.target,\n };\n\n setTooltipPinnedCoords((current) => {\n if (current === null) {\n return pinnedPos;\n } else {\n setPinnedCrosshair(null);\n return null;\n }\n });\n\n setPinnedCrosshair((current) => {\n // Only add pinned crosshair line series when there is not one already in seriesMapping.\n if (current === null) {\n const cursorX = pointInGrid[0];\n\n // Only need to loop through first dataset source since getCommonTimeScale ensures xAxis timestamps are consistent\n const firstTimeSeriesValues = data[0]?.values;\n const closestTimestamp = getClosestTimestamp(firstTimeSeriesValues, cursorX);\n\n // Crosshair snaps to nearest timestamp since cursor may be slightly to left or right\n const pinnedCrosshair = merge({}, DEFAULT_PINNED_CROSSHAIR, {\n markLine: {\n data: [\n {\n xAxis: closestTimestamp,\n },\n ],\n },\n } as LineSeriesOption);\n return pinnedCrosshair;\n } else {\n // Clear previously set pinned crosshair\n return null;\n }\n });\n\n if (!isControlKeyPressed) {\n setLastTooltipPinnedCoords(pinnedPos);\n }\n }\n }}\n onMouseDown={(e) => {\n const { clientX } = e;\n setIsDragging(true);\n setStartX(clientX);\n }}\n onMouseMove={(e) => {\n // Allow clicking inside tooltip to copy labels.\n if (!(e.target instanceof HTMLCanvasElement)) {\n return;\n }\n const { clientX } = e;\n if (isDragging) {\n const deltaX = clientX - startX;\n if (deltaX > 0) {\n // Hide tooltip when user drags to zoom.\n setShowTooltip(false);\n }\n }\n }}\n onMouseUp={() => {\n setIsDragging(false);\n setStartX(0);\n setShowTooltip(true);\n }}\n onMouseLeave={() => {\n if (tooltipPinnedCoords === null) {\n setShowTooltip(false);\n }\n if (chartRef.current !== undefined) {\n clearHighlightedSeries(chartRef.current);\n }\n }}\n onMouseEnter={() => {\n setShowTooltip(true);\n if (chartRef.current !== undefined) {\n enableDataZoom(chartRef.current);\n }\n }}\n onDoubleClick={(e) => {\n setTooltipPinnedCoords(null);\n // either dispatch ECharts restore action to return to orig state or allow consumer to define behavior\n if (onDoubleClick === undefined) {\n if (chartRef.current !== undefined) {\n restoreChart(chartRef.current);\n }\n } else {\n onDoubleClick(e);\n }\n }}\n >\n {/* Allows overrides prop to hide custom tooltip and use the ECharts option.tooltip instead */}\n {showTooltip === true &&\n (option.tooltip as TooltipComponentOption)?.showContent === false &&\n tooltipConfig.hidden !== true && (\n <TimeChartTooltip\n containerId={chartsTheme.tooltipPortalContainerId}\n chartRef={chartRef}\n data={data}\n seriesMapping={seriesMapping}\n wrapLabels={tooltipConfig.wrapLabels}\n enablePinning={isPinningEnabled}\n pinnedPos={tooltipPinnedCoords}\n format={format}\n onUnpinClick={() => {\n // Unpins tooltip when clicking Pin icon in TooltipHeader.\n setTooltipPinnedCoords(null);\n // Clear previously set pinned crosshair.\n setPinnedCrosshair(null);\n }}\n />\n )}\n <EChart\n sx={{\n width: '100%',\n height: '100%',\n }}\n option={option}\n theme={chartsTheme.echartsTheme}\n onEvents={handleEvents}\n _instance={chartRef}\n syncGroup={syncGroup}\n />\n </Box>\n );\n});\n"],"names":["forwardRef","useEffect","useImperativeHandle","useMemo","useRef","useState","Box","merge","isEqual","utcToZonedTime","getCommonTimeScale","use","LineChart","EChartsLineChart","BarChart","EChartsBarChart","GridComponent","DatasetComponent","DataZoomComponent","MarkAreaComponent","MarkLineComponent","MarkPointComponent","TitleComponent","ToolboxComponent","TooltipComponent","CanvasRenderer","EChart","DEFAULT_PINNED_CROSSHAIR","useChartsContext","clearHighlightedSeries","enableDataZoom","getClosestTimestamp","getFormattedAxisLabel","getPointInGrid","getFormattedAxis","restoreChart","TimeChartTooltip","DEFAULT_TOOLTIP_CONFIG","useTimeZone","TimeChart","height","data","seriesMapping","timeScale","timeScaleProp","yAxis","format","grid","isStackedBar","tooltipConfig","noDataVariant","syncGroup","onDataZoom","onDoubleClick","__experimentalEChartsOptionsOverride","ref","option","chartsTheme","enablePinning","lastTooltipPinnedCoords","setLastTooltipPinnedCoords","isPinningEnabled","chartRef","showTooltip","setShowTooltip","tooltipPinnedCoords","setTooltipPinnedCoords","pinnedCrosshair","setPinnedCrosshair","isDragging","setIsDragging","startX","setStartX","timeZone","undefined","commonTimeScale","today","Date","pastDate","setFullYear","getFullYear","todayMs","getTime","pastDateMs","startMs","endMs","stepMs","rangeMs","highlightSeries","name","current","dispatchAction","type","seriesId","handleEvents","datazoom","params","setTimeout","batch","xAxisStartValue","startValue","xAxisEndValue","endValue","zoomEvent","start","end","finished","noDataOption","length","dataset","isLocalTimeZone","map","d","index","values","timestamp","value","val","push","id","source","dimensions","updatedSeriesMapping","series","xAxis","min","max","axisLabel","hideOverlap","formatter","axisPointer","snap","animation","tooltip","show","showContent","trigger","appendToBody","z","triggerEmphasis","triggerTooltip","toolbox","feature","dataZoom","icon","yAxisIndex","multipleTooltipsPinned","sx","onClick","e","isControlKeyPressed","ctrlKey","metaKey","preventDefault","pointInGrid","nativeEvent","offsetX","offsetY","target","HTMLCanvasElement","pinnedPos","page","x","pageX","y","pageY","client","clientX","clientY","plotCanvas","cursorX","firstTimeSeriesValues","closestTimestamp","markLine","onMouseDown","onMouseMove","deltaX","onMouseUp","onMouseLeave","onMouseEnter","hidden","containerId","tooltipPortalContainerId","wrapLabels","onUnpinClick","width","theme","echartsTheme","onEvents","_instance"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/TimeChart/TimeChart.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 { forwardRef, MouseEvent, useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react';\nimport { Box } from '@mui/material';\nimport merge from 'lodash/merge';\nimport isEqual from 'lodash/isEqual';\nimport { DatasetOption } from 'echarts/types/dist/shared';\nimport { utcToZonedTime } from 'date-fns-tz';\nimport { getCommonTimeScale, TimeScale, FormatOptions, TimeSeries } from '@perses-dev/core';\nimport type {\n EChartsCoreOption,\n GridComponentOption,\n LineSeriesOption,\n YAXisComponentOption,\n TooltipComponentOption,\n} from 'echarts';\nimport { ECharts as EChartsInstance, use } from 'echarts/core';\nimport { LineChart as EChartsLineChart, BarChart as EChartsBarChart } from 'echarts/charts';\nimport {\n GridComponent,\n DatasetComponent,\n DataZoomComponent,\n MarkAreaComponent,\n MarkLineComponent,\n MarkPointComponent,\n TitleComponent,\n ToolboxComponent,\n TooltipComponent,\n} from 'echarts/components';\nimport { CanvasRenderer } from 'echarts/renderers';\nimport { EChart, OnEventsType } from '../EChart';\nimport { ChartInstanceFocusOpts, ChartInstance, TimeChartSeriesMapping, DEFAULT_PINNED_CROSSHAIR } from '../model';\nimport { useChartsContext } from '../context/ChartsProvider';\nimport {\n clearHighlightedSeries,\n enableDataZoom,\n getClosestTimestamp,\n getFormattedAxisLabel,\n getPointInGrid,\n getFormattedAxis,\n restoreChart,\n ZoomEventData,\n} from '../utils';\nimport { CursorCoordinates, TimeChartTooltip, TooltipConfig, DEFAULT_TOOLTIP_CONFIG } from '../TimeSeriesTooltip';\nimport { useTimeZone } from '../context/TimeZoneProvider';\n\nuse([\n EChartsLineChart,\n EChartsBarChart,\n GridComponent,\n DatasetComponent,\n DataZoomComponent,\n MarkAreaComponent,\n MarkLineComponent,\n MarkPointComponent,\n TitleComponent,\n ToolboxComponent,\n TooltipComponent,\n CanvasRenderer,\n]);\n\nexport interface TimeChartProps {\n height: number;\n data: TimeSeries[];\n seriesMapping: TimeChartSeriesMapping;\n timeScale?: TimeScale;\n yAxis?: YAXisComponentOption;\n format?: FormatOptions;\n grid?: GridComponentOption;\n tooltipConfig?: TooltipConfig;\n noDataVariant?: 'chart' | 'message';\n syncGroup?: string;\n isStackedBar?: boolean;\n onDataZoom?: (e: ZoomEventData) => void;\n onDoubleClick?: (e: MouseEvent) => void;\n __experimentalEChartsOptionsOverride?: (options: EChartsCoreOption) => EChartsCoreOption;\n}\n\nexport const TimeChart = forwardRef<ChartInstance, TimeChartProps>(function TimeChart(\n {\n height,\n data,\n seriesMapping,\n timeScale: timeScaleProp,\n yAxis,\n format,\n grid,\n isStackedBar = false,\n tooltipConfig = DEFAULT_TOOLTIP_CONFIG,\n noDataVariant = 'message',\n syncGroup,\n onDataZoom,\n onDoubleClick,\n __experimentalEChartsOptionsOverride,\n },\n ref\n) {\n const { chartsTheme, enablePinning, lastTooltipPinnedCoords, setLastTooltipPinnedCoords } = useChartsContext();\n const isPinningEnabled = tooltipConfig.enablePinning && enablePinning;\n const chartRef = useRef<EChartsInstance>();\n const [showTooltip, setShowTooltip] = useState<boolean>(true);\n const [tooltipPinnedCoords, setTooltipPinnedCoords] = useState<CursorCoordinates | null>(null);\n const [pinnedCrosshair, setPinnedCrosshair] = useState<LineSeriesOption | null>(null);\n const [isDragging, setIsDragging] = useState(false);\n const [startX, setStartX] = useState(0);\n const { timeZone } = useTimeZone();\n let timeScale: TimeScale;\n if (timeScaleProp === undefined) {\n const commonTimeScale = getCommonTimeScale(data);\n if (commonTimeScale === undefined) {\n // set default to past 5 years\n const today = new Date();\n const pastDate = new Date(today);\n pastDate.setFullYear(today.getFullYear() - 5);\n const todayMs = today.getTime();\n const pastDateMs = pastDate.getTime();\n timeScale = { startMs: pastDateMs, endMs: todayMs, stepMs: 1, rangeMs: todayMs - pastDateMs };\n } else {\n timeScale = commonTimeScale;\n }\n } else {\n timeScale = timeScaleProp;\n }\n\n useImperativeHandle(ref, () => {\n return {\n highlightSeries({ name }: ChartInstanceFocusOpts): void {\n if (!chartRef.current) {\n // when chart undef, do not highlight series when hovering over legend\n return;\n }\n\n chartRef.current.dispatchAction({ type: 'highlight', seriesId: name });\n },\n clearHighlightedSeries: (): void => {\n if (!chartRef.current) {\n // when chart undef, do not clear highlight series\n return;\n }\n clearHighlightedSeries(chartRef.current);\n },\n };\n }, []);\n\n const handleEvents: OnEventsType<LineSeriesOption['data'] | unknown> = useMemo(() => {\n return {\n datazoom: (params): void => {\n if (onDataZoom === undefined) {\n setTimeout(() => {\n // workaround so unpin happens after click event\n setTooltipPinnedCoords(null);\n }, 10);\n }\n if (onDataZoom === undefined || params.batch[0] === undefined) return;\n const xAxisStartValue = params.batch[0].startValue;\n const xAxisEndValue = params.batch[0].endValue;\n if (xAxisStartValue !== undefined && xAxisEndValue !== undefined) {\n const zoomEvent: ZoomEventData = {\n start: xAxisStartValue,\n end: xAxisEndValue,\n };\n onDataZoom(zoomEvent);\n }\n },\n finished: (): void => {\n if (chartRef.current !== undefined) {\n enableDataZoom(chartRef.current);\n }\n },\n };\n }, [onDataZoom, setTooltipPinnedCoords]);\n\n const { noDataOption } = chartsTheme;\n\n const option: EChartsCoreOption = useMemo(() => {\n // The \"chart\" `noDataVariant` is only used when the `timeSeries` is an\n // empty array because a `null` value will throw an error.\n if (data === null || (data.length === 0 && noDataVariant === 'message')) return noDataOption;\n\n // Utilizes ECharts dataset so raw data is separate from series option style properties\n // https://apache.github.io/echarts-handbook/en/concepts/dataset/\n const dataset: DatasetOption[] = [];\n const isLocalTimeZone = timeZone === 'local';\n data.map((d, index) => {\n const values = d.values.map(([timestamp, value]) => {\n const val: string | number = value === null ? '-' : value; // echarts use '-' to represent null data\n return [isLocalTimeZone ? timestamp : utcToZonedTime(timestamp, timeZone), val];\n });\n dataset.push({ id: index, source: [...values], dimensions: ['time', 'value'] });\n });\n\n const updatedSeriesMapping =\n enablePinning && pinnedCrosshair !== null ? [...seriesMapping, pinnedCrosshair] : seriesMapping;\n\n const option: EChartsCoreOption = {\n dataset: dataset,\n series: updatedSeriesMapping,\n xAxis: {\n type: 'time',\n min: isLocalTimeZone ? timeScale.startMs : utcToZonedTime(timeScale.startMs, timeZone),\n max: isLocalTimeZone ? timeScale.endMs : utcToZonedTime(timeScale.endMs, timeZone),\n axisLabel: {\n hideOverlap: true,\n formatter: getFormattedAxisLabel(timeScale.rangeMs ?? 0),\n },\n axisPointer: {\n snap: false, // important so shared crosshair does not lag\n },\n },\n yAxis: getFormattedAxis(yAxis, format),\n animation: false,\n tooltip: {\n show: true,\n // ECharts tooltip content hidden by default since we use custom tooltip instead.\n // Stacked bar uses ECharts tooltip so subgroup data shows correctly.\n showContent: isStackedBar,\n trigger: isStackedBar ? 'item' : 'axis',\n appendToBody: isStackedBar,\n },\n // https://echarts.apache.org/en/option.html#axisPointer\n axisPointer: {\n type: 'line',\n z: 0, // ensure point symbol shows on top of dashed line\n triggerEmphasis: false, // https://github.com/apache/echarts/issues/18495\n triggerTooltip: false,\n snap: false, // xAxis.axisPointer.snap takes priority\n },\n toolbox: {\n feature: {\n dataZoom: {\n icon: null, // https://stackoverflow.com/a/67684076/17575201\n yAxisIndex: 'none',\n },\n },\n },\n grid,\n };\n\n if (__experimentalEChartsOptionsOverride) {\n return __experimentalEChartsOptionsOverride(option);\n }\n\n return option;\n }, [\n data,\n seriesMapping,\n timeScale,\n yAxis,\n format,\n grid,\n noDataOption,\n __experimentalEChartsOptionsOverride,\n noDataVariant,\n timeZone,\n isStackedBar,\n enablePinning,\n pinnedCrosshair,\n ]);\n\n // Update adjacent charts so tooltip is unpinned when current chart is clicked.\n useEffect(() => {\n // Only allow pinning one tooltip at a time, subsequent tooltip click unpins previous.\n // Multiple tooltips can only be pinned if Ctrl or Cmd key is pressed while clicking.\n const multipleTooltipsPinned = tooltipPinnedCoords !== null && lastTooltipPinnedCoords !== null;\n if (multipleTooltipsPinned) {\n if (!isEqual(lastTooltipPinnedCoords, tooltipPinnedCoords)) {\n setTooltipPinnedCoords(null);\n if (tooltipPinnedCoords !== null && pinnedCrosshair !== null) {\n setPinnedCrosshair(null);\n }\n }\n }\n // tooltipPinnedCoords CANNOT be in dep array or tooltip pinning breaks in the current chart's onClick\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [lastTooltipPinnedCoords, seriesMapping]);\n\n return (\n <Box\n style={{ height }}\n // onContextMenu={(e) => {\n // // TODO: confirm tooltip pinning works correctly on Windows, should e.preventDefault() be added here\n // e.preventDefault(); // Prevent the default behaviour when right clicked\n // }}\n onClick={(e) => {\n // Allows user to opt-in to multi tooltip pinning when Ctrl or Cmd key held down\n const isControlKeyPressed = e.ctrlKey || e.metaKey;\n if (isControlKeyPressed) {\n e.preventDefault();\n }\n\n // Determine where on chart canvas to plot pinned crosshair as markLine.\n const pointInGrid = getPointInGrid(e.nativeEvent.offsetX, e.nativeEvent.offsetY, chartRef.current);\n if (pointInGrid === null) {\n return;\n }\n\n // Pin and unpin when clicking on chart canvas but not tooltip text.\n if (isPinningEnabled && e.target instanceof HTMLCanvasElement) {\n // Pin tooltip and update shared charts context to remember these coordinates.\n const pinnedPos: CursorCoordinates = {\n page: {\n x: e.pageX,\n y: e.pageY,\n },\n client: {\n x: e.clientX,\n y: e.clientY,\n },\n plotCanvas: {\n x: e.nativeEvent.offsetX,\n y: e.nativeEvent.offsetY,\n },\n target: e.target,\n };\n\n setTooltipPinnedCoords((current) => {\n if (current === null) {\n return pinnedPos;\n } else {\n setPinnedCrosshair(null);\n return null;\n }\n });\n\n setPinnedCrosshair((current) => {\n // Only add pinned crosshair line series when there is not one already in seriesMapping.\n if (current === null) {\n const cursorX = pointInGrid[0];\n\n // Only need to loop through first dataset source since getCommonTimeScale ensures xAxis timestamps are consistent\n const firstTimeSeriesValues = data[0]?.values;\n const closestTimestamp = getClosestTimestamp(firstTimeSeriesValues, cursorX);\n\n // Crosshair snaps to nearest timestamp since cursor may be slightly to left or right\n const pinnedCrosshair = merge({}, DEFAULT_PINNED_CROSSHAIR, {\n markLine: {\n data: [\n {\n xAxis: closestTimestamp,\n },\n ],\n },\n } as LineSeriesOption);\n return pinnedCrosshair;\n } else {\n // Clear previously set pinned crosshair\n return null;\n }\n });\n\n if (!isControlKeyPressed) {\n setLastTooltipPinnedCoords(pinnedPos);\n }\n }\n }}\n onMouseDown={(e) => {\n const { clientX } = e;\n setIsDragging(true);\n setStartX(clientX);\n }}\n onMouseMove={(e) => {\n // Allow clicking inside tooltip to copy labels.\n if (!(e.target instanceof HTMLCanvasElement)) {\n return;\n }\n const { clientX } = e;\n if (isDragging) {\n const deltaX = clientX - startX;\n if (deltaX > 0) {\n // Hide tooltip when user drags to zoom.\n setShowTooltip(false);\n }\n }\n }}\n onMouseUp={() => {\n setIsDragging(false);\n setStartX(0);\n setShowTooltip(true);\n }}\n onMouseLeave={() => {\n if (tooltipPinnedCoords === null) {\n setShowTooltip(false);\n }\n if (chartRef.current !== undefined) {\n clearHighlightedSeries(chartRef.current);\n }\n }}\n onMouseEnter={() => {\n setShowTooltip(true);\n if (chartRef.current !== undefined) {\n enableDataZoom(chartRef.current);\n }\n }}\n onDoubleClick={(e) => {\n setTooltipPinnedCoords(null);\n // either dispatch ECharts restore action to return to orig state or allow consumer to define behavior\n if (onDoubleClick === undefined) {\n if (chartRef.current !== undefined) {\n restoreChart(chartRef.current);\n }\n } else {\n onDoubleClick(e);\n }\n }}\n >\n {/* Allows overrides prop to hide custom tooltip and use the ECharts option.tooltip instead */}\n {showTooltip === true &&\n (option.tooltip as TooltipComponentOption)?.showContent === false &&\n tooltipConfig.hidden !== true && (\n <TimeChartTooltip\n containerId={chartsTheme.tooltipPortalContainerId}\n chartRef={chartRef}\n data={data}\n seriesMapping={seriesMapping}\n wrapLabels={tooltipConfig.wrapLabels}\n enablePinning={isPinningEnabled}\n pinnedPos={tooltipPinnedCoords}\n format={format}\n onUnpinClick={() => {\n // Unpins tooltip when clicking Pin icon in TooltipHeader.\n setTooltipPinnedCoords(null);\n // Clear previously set pinned crosshair.\n setPinnedCrosshair(null);\n }}\n />\n )}\n <EChart\n sx={{\n width: '100%',\n height: '100%',\n }}\n option={option}\n theme={chartsTheme.echartsTheme}\n onEvents={handleEvents}\n _instance={chartRef}\n syncGroup={syncGroup}\n />\n </Box>\n );\n});\n"],"names":["forwardRef","useEffect","useImperativeHandle","useMemo","useRef","useState","Box","merge","isEqual","utcToZonedTime","getCommonTimeScale","use","LineChart","EChartsLineChart","BarChart","EChartsBarChart","GridComponent","DatasetComponent","DataZoomComponent","MarkAreaComponent","MarkLineComponent","MarkPointComponent","TitleComponent","ToolboxComponent","TooltipComponent","CanvasRenderer","EChart","DEFAULT_PINNED_CROSSHAIR","useChartsContext","clearHighlightedSeries","enableDataZoom","getClosestTimestamp","getFormattedAxisLabel","getPointInGrid","getFormattedAxis","restoreChart","TimeChartTooltip","DEFAULT_TOOLTIP_CONFIG","useTimeZone","TimeChart","height","data","seriesMapping","timeScale","timeScaleProp","yAxis","format","grid","isStackedBar","tooltipConfig","noDataVariant","syncGroup","onDataZoom","onDoubleClick","__experimentalEChartsOptionsOverride","ref","chartsTheme","enablePinning","lastTooltipPinnedCoords","setLastTooltipPinnedCoords","isPinningEnabled","chartRef","showTooltip","setShowTooltip","tooltipPinnedCoords","setTooltipPinnedCoords","pinnedCrosshair","setPinnedCrosshair","isDragging","setIsDragging","startX","setStartX","timeZone","undefined","commonTimeScale","today","Date","pastDate","setFullYear","getFullYear","todayMs","getTime","pastDateMs","startMs","endMs","stepMs","rangeMs","highlightSeries","name","current","dispatchAction","type","seriesId","handleEvents","datazoom","params","setTimeout","batch","xAxisStartValue","startValue","xAxisEndValue","endValue","zoomEvent","start","end","finished","noDataOption","option","length","dataset","isLocalTimeZone","map","d","index","values","timestamp","value","val","push","id","source","dimensions","updatedSeriesMapping","series","xAxis","min","max","axisLabel","hideOverlap","formatter","axisPointer","snap","animation","tooltip","show","showContent","trigger","appendToBody","z","triggerEmphasis","triggerTooltip","toolbox","feature","dataZoom","icon","yAxisIndex","multipleTooltipsPinned","style","onClick","e","isControlKeyPressed","ctrlKey","metaKey","preventDefault","pointInGrid","nativeEvent","offsetX","offsetY","target","HTMLCanvasElement","pinnedPos","page","x","pageX","y","pageY","client","clientX","clientY","plotCanvas","cursorX","firstTimeSeriesValues","closestTimestamp","markLine","onMouseDown","onMouseMove","deltaX","onMouseUp","onMouseLeave","onMouseEnter","hidden","containerId","tooltipPortalContainerId","wrapLabels","onUnpinClick","sx","width","theme","echartsTheme","onEvents","_instance"],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { ReactElement } from 'react';
2
+ import { AbsoluteTimeRange } from '@perses-dev/core';
3
+ interface AbsoluteTimeFormProps {
4
+ initialTimeRange: AbsoluteTimeRange;
5
+ onChange: (timeRange: AbsoluteTimeRange) => void;
6
+ onCancel: () => void;
7
+ }
8
+ /**
9
+ * Start and End datetime picker, allowing use to select a specific time range selecting two absolute dates and times.
10
+ * TODO: Use directly the MUI X ``DateTimePicker`` for datetime selection which is better. https://next.mui.com/x/react-date-pickers/date-time-picker/
11
+ * Use ``DateTimeRangePicker`` directly would be cool but paid https://next.mui.com/x/react-date-pickers/date-time-range-picker/
12
+ * @param initialTimeRange initial time range to pre-select.
13
+ * @param onChange event received when start and end has been selected (click on apply)
14
+ * @param onCancel event received when user click on cancel
15
+ * @constructor
16
+ */
17
+ export declare const DateTimeRangePicker: ({ initialTimeRange, onChange, onCancel }: AbsoluteTimeFormProps) => ReactElement;
18
+ export {};
19
+ //# sourceMappingURL=DateTimeRangePicker.d.ts.map
@@ -0,0 +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,4 +1,4 @@
1
- // Copyright 2023 The Perses Authors
1
+ // Copyright 2024 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
@@ -12,13 +12,22 @@
12
12
  // limitations under the License.
13
13
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
14
14
  import { useState } from 'react';
15
- import { Box, Stack, TextField, Typography, Button } from '@mui/material';
16
- import { LocalizationProvider, StaticDateTimePicker } from '@mui/x-date-pickers';
15
+ import { Box, Stack, Typography, Button } from '@mui/material';
16
+ import { DateTimeField, LocalizationProvider, StaticDateTimePicker } from '@mui/x-date-pickers';
17
17
  import { AdapterDateFns } from '@mui/x-date-pickers/AdapterDateFns';
18
- import { useTimeZone } from '../context/TimeZoneProvider';
19
- import { validateDateRange } from './utils';
20
- const DATE_TIME_FORMAT = 'yyyy-MM-dd HH:mm:ss';
21
- export const AbsoluteTimePicker = ({ initialTimeRange, onChange, onCancel })=>{
18
+ import { useTimeZone } from '../context';
19
+ import { ErrorBoundary } from '../ErrorBoundary';
20
+ import { ErrorAlert } from '../ErrorAlert';
21
+ import { DATE_TIME_FORMAT, validateDateRange } from './utils';
22
+ /**
23
+ * Start and End datetime picker, allowing use to select a specific time range selecting two absolute dates and times.
24
+ * TODO: Use directly the MUI X ``DateTimePicker`` for datetime selection which is better. https://next.mui.com/x/react-date-pickers/date-time-picker/
25
+ * Use ``DateTimeRangePicker`` directly would be cool but paid https://next.mui.com/x/react-date-pickers/date-time-range-picker/
26
+ * @param initialTimeRange initial time range to pre-select.
27
+ * @param onChange event received when start and end has been selected (click on apply)
28
+ * @param onCancel event received when user click on cancel
29
+ * @constructor
30
+ */ export const DateTimeRangePicker = ({ initialTimeRange, onChange, onCancel })=>{
22
31
  const { formatWithUserTimeZone } = useTimeZone();
23
32
  // Time range values as dates that can be used as a time range.
24
33
  const [timeRange, setTimeRange] = useState(initialTimeRange);
@@ -149,27 +158,33 @@ export const AbsoluteTimePicker = ({ initialTimeRange, onChange, onCancel })=>{
149
158
  pl: 1,
150
159
  pr: 1,
151
160
  children: [
152
- /*#__PURE__*/ _jsx(TextField, {
153
- onChange: (event)=>{
154
- // TODO: add helperText, fix validation after we decide on form state solution
155
- onChangeStartTime(event.target.value);
156
- },
157
- onBlur: ()=>updateDateRange(),
158
- value: timeRangeInputs.start,
159
- label: "Start Time",
160
- placeholder: DATE_TIME_FORMAT,
161
- // tel used to match MUI DateTimePicker, may change in future: https://github.com/mui/material-ui/issues/27590
162
- type: "tel"
161
+ /*#__PURE__*/ _jsx(ErrorBoundary, {
162
+ FallbackComponent: ErrorAlert,
163
+ children: /*#__PURE__*/ _jsx(DateTimeField, {
164
+ label: "Start Time",
165
+ value: new Date(timeRangeInputs.start),
166
+ onChange: (event)=>{
167
+ if (event) {
168
+ onChangeStartTime(event);
169
+ }
170
+ },
171
+ onBlur: ()=>updateDateRange(),
172
+ format: DATE_TIME_FORMAT
173
+ })
163
174
  }),
164
- /*#__PURE__*/ _jsx(TextField, {
165
- onChange: (event)=>{
166
- onChangeEndTime(event.target.value);
167
- },
168
- onBlur: ()=>updateDateRange(),
169
- value: timeRangeInputs.end,
170
- label: "End Time",
171
- placeholder: DATE_TIME_FORMAT,
172
- type: "tel"
175
+ /*#__PURE__*/ _jsx(ErrorBoundary, {
176
+ FallbackComponent: ErrorAlert,
177
+ children: /*#__PURE__*/ _jsx(DateTimeField, {
178
+ label: "End Time",
179
+ value: new Date(timeRangeInputs.end),
180
+ onChange: (event)=>{
181
+ if (event) {
182
+ onChangeEndTime(event);
183
+ }
184
+ },
185
+ onBlur: ()=>updateDateRange(),
186
+ format: DATE_TIME_FORMAT
187
+ })
173
188
  })
174
189
  ]
175
190
  }),
@@ -199,4 +214,4 @@ export const AbsoluteTimePicker = ({ initialTimeRange, onChange, onCancel })=>{
199
214
  });
200
215
  };
201
216
 
202
- //# sourceMappingURL=AbsoluteTimePicker.js.map
217
+ //# sourceMappingURL=DateTimeRangePicker.js.map
@@ -0,0 +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/AdapterDateFns';\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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"}
@@ -0,0 +1,36 @@
1
+ import { TimeRangeValue } from '@perses-dev/core';
2
+ import { ReactElement } from 'react';
3
+ import { TimeOption } from '../model';
4
+ interface TimeRangeSelectorProps {
5
+ /**
6
+ * The current value of the time range.
7
+ */
8
+ value: TimeRangeValue;
9
+ /**
10
+ * The list of time options to display in the dropdown.
11
+ * The component will automatically add the last option as a custom absolute time range.
12
+ */
13
+ timeOptions: TimeOption[];
14
+ /**
15
+ * The callback to call when the time range changes.
16
+ */
17
+ onChange: (value: TimeRangeValue) => void;
18
+ /**
19
+ * Custom line height for the select component.
20
+ */
21
+ height?: string;
22
+ /**
23
+ * Whether to show the custom time range option.
24
+ * Defaults to true.
25
+ */
26
+ showCustomTimeRange?: boolean;
27
+ }
28
+ /**
29
+ * Date & time selection component to customize what data renders on dashboard.
30
+ * This includes relative shortcuts and the ability to pick absolute start and end times.
31
+ * @param props
32
+ * @constructor
33
+ */
34
+ export declare function TimeRangeSelector({ value, timeOptions, onChange, height, showCustomTimeRange, }: TimeRangeSelectorProps): ReactElement;
35
+ export {};
36
+ //# sourceMappingURL=TimeRangeSelector.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,119 @@
1
+ // Copyright 2024 The Perses Authors
2
+ // Licensed under the Apache License, Version 2.0 (the "License");
3
+ // you may not use this file except in compliance with the License.
4
+ // You may obtain a copy of the License at
5
+ //
6
+ // http://www.apache.org/licenses/LICENSE-2.0
7
+ //
8
+ // Unless required by applicable law or agreed to in writing, software
9
+ // distributed under the License is distributed on an "AS IS" BASIS,
10
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11
+ // See the License for the specific language governing permissions and
12
+ // limitations under the License.
13
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
14
+ import { Box, MenuItem, Popover, Select } from '@mui/material';
15
+ import Calendar from 'mdi-material-ui/Calendar';
16
+ import { isRelativeTimeRange, toAbsoluteTimeRange } from '@perses-dev/core';
17
+ import { useMemo, useRef, useState } from 'react';
18
+ import { useTimeZone } from '../context';
19
+ import { DateTimeRangePicker } from './DateTimeRangePicker';
20
+ import { buildCustomTimeOption, formatTimeRange } from './utils';
21
+ /**
22
+ * Date & time selection component to customize what data renders on dashboard.
23
+ * This includes relative shortcuts and the ability to pick absolute start and end times.
24
+ * @param props
25
+ * @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
30
+ const [showCustomDateSelector, setShowCustomDateSelector] = useState(false);
31
+ // Build the initial value of the absolute time range picker
32
+ const convertedTimeRange = useMemo(()=>{
33
+ return isRelativeTimeRange(value) ? toAbsoluteTimeRange(value) : value;
34
+ }, [
35
+ value
36
+ ]);
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
+ const lastOption = useMemo(()=>buildCustomTimeOption(isRelativeTimeRange(value) ? undefined : value, timeZone), [
41
+ value,
42
+ timeZone
43
+ ]);
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
+ const [open, setOpen] = useState(false);
51
+ return /*#__PURE__*/ _jsxs(_Fragment, {
52
+ children: [
53
+ /*#__PURE__*/ _jsx(Popover, {
54
+ anchorEl: anchorEl.current,
55
+ anchorOrigin: {
56
+ vertical: 'bottom',
57
+ horizontal: 'center'
58
+ },
59
+ open: showCustomDateSelector,
60
+ onClose: ()=>setShowCustomDateSelector(false),
61
+ sx: (theme)=>({
62
+ padding: theme.spacing(2)
63
+ }),
64
+ children: /*#__PURE__*/ _jsx(DateTimeRangePicker, {
65
+ initialTimeRange: convertedTimeRange,
66
+ onChange: (value)=>{
67
+ onChange(value);
68
+ setShowCustomDateSelector(false);
69
+ setOpen(false);
70
+ },
71
+ onCancel: ()=>setShowCustomDateSelector(false)
72
+ })
73
+ }),
74
+ /*#__PURE__*/ _jsx(Box, {
75
+ ref: anchorEl,
76
+ children: /*#__PURE__*/ _jsxs(Select, {
77
+ open: open,
78
+ value: formatTimeRange(value, timeZone),
79
+ onClick: ()=>setOpen(!open),
80
+ IconComponent: Calendar,
81
+ inputProps: {
82
+ 'aria-label': `Select time range. Currently set to ${value}`
83
+ },
84
+ sx: {
85
+ // `transform: none` prevents calendar icon from flipping over when menu is open
86
+ '.MuiSelect-icon': {
87
+ marginTop: '1px',
88
+ transform: 'none'
89
+ },
90
+ // paddingRight creates more space for the calendar icon (it's a bigger icon)
91
+ '.MuiSelect-select.MuiSelect-outlined.MuiInputBase-input': {
92
+ paddingRight: '36px'
93
+ },
94
+ '.MuiSelect-select': height ? {
95
+ lineHeight: height,
96
+ paddingY: 0
97
+ } : {}
98
+ },
99
+ children: [
100
+ timeOptions.map((item, idx)=>/*#__PURE__*/ _jsx(MenuItem, {
101
+ value: formatTimeRange(item.value, timeZone),
102
+ onClick: ()=>{
103
+ onChange(item.value);
104
+ },
105
+ children: item.display
106
+ }, idx)),
107
+ showCustomTimeRange && /*#__PURE__*/ _jsx(MenuItem, {
108
+ value: formatTimeRange(lastOption.value, timeZone),
109
+ onClick: ()=>setShowCustomDateSelector(true),
110
+ children: lastOption.display
111
+ })
112
+ ]
113
+ })
114
+ })
115
+ ]
116
+ });
117
+ }
118
+
119
+ //# sourceMappingURL=TimeRangeSelector.js.map
@@ -0,0 +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 option as 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,MAAM,CAAC;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,4 +1,3 @@
1
- export * from './DateTimeRangePicker';
2
1
  export * from './TimeRangeSelector';
3
- export * from './AbsoluteTimePicker';
2
+ export * from './DateTimeRangePicker';
4
3
  //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/TimeRangeSelector/index.ts"],"names":[],"mappings":"AAaA,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC"}
@@ -1,4 +1,4 @@
1
- // Copyright 2023 The Perses Authors
1
+ // Copyright 2024 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
@@ -10,8 +10,7 @@
10
10
  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11
11
  // See the License for the specific language governing permissions and
12
12
  // limitations under the License.
13
- export * from './DateTimeRangePicker';
14
13
  export * from './TimeRangeSelector';
15
- export * from './AbsoluteTimePicker';
14
+ export * from './DateTimeRangePicker';
16
15
 
17
16
  //# sourceMappingURL=index.js.map
@@ -0,0 +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"}
@@ -0,0 +1,25 @@
1
+ import { AbsoluteTimeRange, TimeRangeValue } from '@perses-dev/core';
2
+ export declare const DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
3
+ export interface CustomTimeOption {
4
+ value: TimeRangeValue | undefined;
5
+ display: string;
6
+ }
7
+ export declare function buildCustomTimeOption(value: AbsoluteTimeRange | undefined, timeZone: string): CustomTimeOption;
8
+ /**
9
+ * Date validation and check if end is after start
10
+ */
11
+ export declare function validateDateRange(startDate: Date, endDate: Date): boolean;
12
+ /**
13
+ * Format start and end time based on provided date format
14
+ * @param timeRange absolute time range with a start and end datetime
15
+ * @param dateFormat date format string
16
+ * @param timeZone
17
+ */
18
+ export declare function formatAbsoluteRange(timeRange: AbsoluteTimeRange, dateFormat: string, timeZone?: string): string;
19
+ /**
20
+ * Format the time range for display purpose only (e.g. in the selector)
21
+ * @param value
22
+ * @param timeZone
23
+ */
24
+ export declare function formatTimeRange(value: TimeRangeValue | undefined, timeZone: string): string;
25
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/TimeRangeSelector/utils.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,iBAAiB,EAAuB,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAG1F,eAAO,MAAM,gBAAgB,wBAAwB,CAAC;AAEtD,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,cAAc,GAAG,SAAS,CAAC;IAClC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,iBAAiB,GAAG,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,gBAAgB,CAE9G;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,GAAG,OAAO,CAWzE;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAI/G;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,cAAc,GAAG,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAK3F"}
@@ -1,4 +1,4 @@
1
- // Copyright 2023 The Perses Authors
1
+ // Copyright 2024 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,8 +11,16 @@
11
11
  // See the License for the specific language governing permissions and
12
12
  // limitations under the License.
13
13
  import { isBefore, isValid } from 'date-fns';
14
+ import { isRelativeTimeRange } from '@perses-dev/core';
14
15
  import { formatWithTimeZone } from '../utils';
15
- /*
16
+ export const DATE_TIME_FORMAT = 'yyyy-MM-dd HH:mm:ss';
17
+ export function buildCustomTimeOption(value, timeZone) {
18
+ return {
19
+ value,
20
+ display: formatTimeRange(value, timeZone)
21
+ };
22
+ }
23
+ /**
16
24
  * Date validation and check if end is after start
17
25
  */ export function validateDateRange(startDate, endDate) {
18
26
  // TODO: display error as helperText
@@ -28,10 +36,23 @@ import { formatWithTimeZone } from '../utils';
28
36
  }
29
37
  /**
30
38
  * Format start and end time based on provided date format
39
+ * @param timeRange absolute time range with a start and end datetime
40
+ * @param dateFormat date format string
41
+ * @param timeZone
31
42
  */ export function formatAbsoluteRange(timeRange, dateFormat, timeZone) {
32
43
  const formattedStart = formatWithTimeZone(timeRange.start, dateFormat, timeZone);
33
44
  const formattedEnd = formatWithTimeZone(timeRange.end, dateFormat, timeZone);
34
45
  return `${formattedStart} - ${formattedEnd}`;
35
46
  }
47
+ /**
48
+ * Format the time range for display purpose only (e.g. in the selector)
49
+ * @param value
50
+ * @param timeZone
51
+ */ export function formatTimeRange(value, timeZone) {
52
+ if (!value) {
53
+ return 'Custom Time Range';
54
+ }
55
+ return !isRelativeTimeRange(value) ? formatAbsoluteRange(value, DATE_TIME_FORMAT, timeZone) : value.pastDuration;
56
+ }
36
57
 
37
58
  //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/TimeRangeSelector/utils.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\nimport { isBefore, isValid } from 'date-fns';\nimport { AbsoluteTimeRange, isRelativeTimeRange, TimeRangeValue } from '@perses-dev/core';\nimport { formatWithTimeZone } from '../utils';\n\nexport const DATE_TIME_FORMAT = 'yyyy-MM-dd HH:mm:ss';\n\nexport interface CustomTimeOption {\n value: TimeRangeValue | undefined;\n display: string;\n}\n\nexport function buildCustomTimeOption(value: AbsoluteTimeRange | undefined, timeZone: string): CustomTimeOption {\n return { value, display: formatTimeRange(value, timeZone) };\n}\n\n/**\n * Date validation and check if end is after start\n */\nexport function validateDateRange(startDate: Date, endDate: Date): boolean {\n // TODO: display error as helperText\n if (!isValid(startDate) || !isValid(endDate)) {\n console.error('Invalid Date');\n return false;\n }\n if (!isBefore(startDate, endDate)) {\n console.error('End Time is before Start Time');\n return false;\n }\n return true;\n}\n\n/**\n * Format start and end time based on provided date format\n * @param timeRange absolute time range with a start and end datetime\n * @param dateFormat date format string\n * @param timeZone\n */\nexport function formatAbsoluteRange(timeRange: AbsoluteTimeRange, dateFormat: string, timeZone?: string): string {\n const formattedStart = formatWithTimeZone(timeRange.start, dateFormat, timeZone);\n const formattedEnd = formatWithTimeZone(timeRange.end, dateFormat, timeZone);\n return `${formattedStart} - ${formattedEnd}`;\n}\n\n/**\n * Format the time range for display purpose only (e.g. in the selector)\n * @param value\n * @param timeZone\n */\nexport function formatTimeRange(value: TimeRangeValue | undefined, timeZone: string): string {\n if (!value) {\n return 'Custom Time Range';\n }\n return !isRelativeTimeRange(value) ? formatAbsoluteRange(value, DATE_TIME_FORMAT, timeZone) : value.pastDuration;\n}\n"],"names":["isBefore","isValid","isRelativeTimeRange","formatWithTimeZone","DATE_TIME_FORMAT","buildCustomTimeOption","value","timeZone","display","formatTimeRange","validateDateRange","startDate","endDate","console","error","formatAbsoluteRange","timeRange","dateFormat","formattedStart","start","formattedEnd","end","pastDuration"],"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,QAAQ,EAAEC,OAAO,QAAQ,WAAW;AAC7C,SAA4BC,mBAAmB,QAAwB,mBAAmB;AAC1F,SAASC,kBAAkB,QAAQ,WAAW;AAE9C,OAAO,MAAMC,mBAAmB,sBAAsB;AAOtD,OAAO,SAASC,sBAAsBC,KAAoC,EAAEC,QAAgB;IAC1F,OAAO;QAAED;QAAOE,SAASC,gBAAgBH,OAAOC;IAAU;AAC5D;AAEA;;CAEC,GACD,OAAO,SAASG,kBAAkBC,SAAe,EAAEC,OAAa;IAC9D,oCAAoC;IACpC,IAAI,CAACX,QAAQU,cAAc,CAACV,QAAQW,UAAU;QAC5CC,QAAQC,KAAK,CAAC;QACd,OAAO;IACT;IACA,IAAI,CAACd,SAASW,WAAWC,UAAU;QACjCC,QAAQC,KAAK,CAAC;QACd,OAAO;IACT;IACA,OAAO;AACT;AAEA;;;;;CAKC,GACD,OAAO,SAASC,oBAAoBC,SAA4B,EAAEC,UAAkB,EAAEV,QAAiB;IACrG,MAAMW,iBAAiBf,mBAAmBa,UAAUG,KAAK,EAAEF,YAAYV;IACvE,MAAMa,eAAejB,mBAAmBa,UAAUK,GAAG,EAAEJ,YAAYV;IACnE,OAAO,CAAC,EAAEW,eAAe,GAAG,EAAEE,aAAa,CAAC;AAC9C;AAEA;;;;CAIC,GACD,OAAO,SAASX,gBAAgBH,KAAiC,EAAEC,QAAgB;IACjF,IAAI,CAACD,OAAO;QACV,OAAO;IACT;IACA,OAAO,CAACJ,oBAAoBI,SAASS,oBAAoBT,OAAOF,kBAAkBG,YAAYD,MAAMgB,YAAY;AAClH"}
@@ -1,10 +1,10 @@
1
- /// <reference types="react" />
2
1
  import { FormatOptions } from '@perses-dev/core';
3
2
  import { ECharts as EChartsInstance } from 'echarts/core';
3
+ import { MutableRefObject } from 'react';
4
4
  import { EChartsDataFormat } from '../model';
5
5
  import { CursorCoordinates } from './tooltip-model';
6
6
  export interface TimeSeriesTooltipProps {
7
- chartRef: React.MutableRefObject<EChartsInstance | undefined>;
7
+ chartRef: MutableRefObject<EChartsInstance | undefined>;
8
8
  chartData: EChartsDataFormat;
9
9
  enablePinning?: boolean;
10
10
  wrapLabels?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"LineChartTooltip.d.ts","sourceRoot":"","sources":["../../src/TimeSeriesTooltip/LineChartTooltip.tsx"],"names":[],"mappings":";AAcA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,cAAc,CAAC;AAG1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAI7C,OAAO,EACL,iBAAiB,EAOlB,MAAM,iBAAiB,CAAC;AAGzB,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,KAAK,CAAC,gBAAgB,CAAC,eAAe,GAAG,SAAS,CAAC,CAAC;IAC9D,SAAS,EAAE,iBAAiB,CAAC;IAC7B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,SAAS,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACpC;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,eAAO,MAAM,gBAAgB,8DA6F3B,CAAC"}
1
+ {"version":3,"file":"LineChartTooltip.d.ts","sourceRoot":"","sources":["../../src/TimeSeriesTooltip/LineChartTooltip.tsx"],"names":[],"mappings":"AAcA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,EAAQ,gBAAgB,EAAkC,MAAM,OAAO,CAAC;AAE/E,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAI7C,OAAO,EACL,iBAAiB,EAOlB,MAAM,iBAAiB,CAAC;AAGzB,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,gBAAgB,CAAC,eAAe,GAAG,SAAS,CAAC,CAAC;IACxD,SAAS,EAAE,iBAAiB,CAAC;IAC7B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,SAAS,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACpC;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,eAAO,MAAM,gBAAgB,8DA6F3B,CAAC"}