@perses-dev/components 0.55.1 → 0.56.0-beta.1

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 (201) hide show
  1. package/dist/AlignSelector/AlignSelector.js +115 -25
  2. package/dist/AlignSelector/AlignSelector.js.map +1 -1
  3. package/dist/CodeEditor/CodeEditor.d.ts +19 -0
  4. package/dist/CodeEditor/CodeEditor.d.ts.map +1 -0
  5. package/dist/CodeEditor/CodeEditor.js +122 -0
  6. package/dist/CodeEditor/CodeEditor.js.map +1 -0
  7. package/dist/ColorPicker/ColorPicker.js +153 -61
  8. package/dist/ColorPicker/ColorPicker.js.map +1 -1
  9. package/dist/ColorPicker/OptionsColorPicker.js +147 -52
  10. package/dist/ColorPicker/OptionsColorPicker.js.map +1 -1
  11. package/dist/ContentWithLegend/ContentWithLegend.js +144 -41
  12. package/dist/ContentWithLegend/ContentWithLegend.js.map +1 -1
  13. package/dist/DensitySelector/DensitySelector.js +53 -20
  14. package/dist/DensitySelector/DensitySelector.js.map +1 -1
  15. package/dist/Dialog/Dialog.d.ts +3 -2
  16. package/dist/Dialog/Dialog.d.ts.map +1 -1
  17. package/dist/Dialog/Dialog.js +202 -49
  18. package/dist/Dialog/Dialog.js.map +1 -1
  19. package/dist/Dialog/DiscardChangesConfirmationDialog.js +79 -27
  20. package/dist/Dialog/DiscardChangesConfirmationDialog.js.map +1 -1
  21. package/dist/DragAndDrop/DragAndDropList.js +184 -113
  22. package/dist/DragAndDrop/DragAndDropList.js.map +1 -1
  23. package/dist/DragAndDrop/DragButton.js +131 -52
  24. package/dist/DragAndDrop/DragButton.js.map +1 -1
  25. package/dist/DragAndDrop/DropIndicator.js +51 -26
  26. package/dist/DragAndDrop/DropIndicator.js.map +1 -1
  27. package/dist/Drawer/Drawer.js +75 -15
  28. package/dist/Drawer/Drawer.js.map +1 -1
  29. package/dist/EChart/EChart.js +179 -90
  30. package/dist/EChart/EChart.js.map +1 -1
  31. package/dist/ErrorAlert.js +14 -4
  32. package/dist/ErrorAlert.js.map +1 -1
  33. package/dist/ExemplarMetadata/ExemplarMetadataTooltip.js +463 -190
  34. package/dist/ExemplarMetadata/ExemplarMetadataTooltip.js.map +1 -1
  35. package/dist/FontSizeSelector/FontSizeSelector.js +82 -50
  36. package/dist/FontSizeSelector/FontSizeSelector.js.map +1 -1
  37. package/dist/FormEditor/FormActions.js +88 -14
  38. package/dist/FormEditor/FormActions.js.map +1 -1
  39. package/dist/FormatControls/FormatControls.js +246 -99
  40. package/dist/FormatControls/FormatControls.js.map +1 -1
  41. package/dist/FormatControls/UnitSelector.js +90 -25
  42. package/dist/FormatControls/UnitSelector.js.map +1 -1
  43. package/dist/InfoTooltip/InfoTooltip.js +105 -42
  44. package/dist/InfoTooltip/InfoTooltip.js.map +1 -1
  45. package/dist/JSONEditor.d.ts +2 -6
  46. package/dist/JSONEditor.d.ts.map +1 -1
  47. package/dist/JSONEditor.js +24 -37
  48. package/dist/JSONEditor.js.map +1 -1
  49. package/dist/Legend/CompactLegend.js +77 -27
  50. package/dist/Legend/CompactLegend.js.map +1 -1
  51. package/dist/Legend/Legend.js +184 -82
  52. package/dist/Legend/Legend.js.map +1 -1
  53. package/dist/Legend/LegendColorBadge.js +54 -9
  54. package/dist/Legend/LegendColorBadge.js.map +1 -1
  55. package/dist/Legend/ListLegend.js +46 -16
  56. package/dist/Legend/ListLegend.js.map +1 -1
  57. package/dist/Legend/ListLegendItem.js +184 -48
  58. package/dist/Legend/ListLegendItem.js.map +1 -1
  59. package/dist/Legend/TableLegend.d.ts.map +1 -1
  60. package/dist/Legend/TableLegend.js +90 -48
  61. package/dist/Legend/TableLegend.js.map +1 -1
  62. package/dist/Legend/legend-model.d.ts +2 -2
  63. package/dist/Legend/legend-model.d.ts.map +1 -1
  64. package/dist/Legend/legend-model.js.map +1 -1
  65. package/dist/LinksEditor/LinkEditorForm.js +148 -67
  66. package/dist/LinksEditor/LinkEditorForm.js.map +1 -1
  67. package/dist/ModeSelector/ModeSelector.js +61 -19
  68. package/dist/ModeSelector/ModeSelector.js.map +1 -1
  69. package/dist/OptionsEditorLayout/OptionsEditorColumn.js +20 -9
  70. package/dist/OptionsEditorLayout/OptionsEditorColumn.js.map +1 -1
  71. package/dist/OptionsEditorLayout/OptionsEditorControl.js +130 -54
  72. package/dist/OptionsEditorLayout/OptionsEditorControl.js.map +1 -1
  73. package/dist/OptionsEditorLayout/OptionsEditorGrid.js +17 -6
  74. package/dist/OptionsEditorLayout/OptionsEditorGrid.js.map +1 -1
  75. package/dist/OptionsEditorLayout/OptionsEditorGroup.js +76 -28
  76. package/dist/OptionsEditorLayout/OptionsEditorGroup.js.map +1 -1
  77. package/dist/Overlay/Overlay.js +71 -27
  78. package/dist/Overlay/Overlay.js.map +1 -1
  79. package/dist/RefreshIntervalPicker/RefreshIntervalPicker.js +96 -38
  80. package/dist/RefreshIntervalPicker/RefreshIntervalPicker.js.map +1 -1
  81. package/dist/RepeatGrid/RepeatGrid.js +117 -45
  82. package/dist/RepeatGrid/RepeatGrid.js.map +1 -1
  83. package/dist/SettingsAutocomplete/SettingsAutocomplete.js +99 -38
  84. package/dist/SettingsAutocomplete/SettingsAutocomplete.js.map +1 -1
  85. package/dist/SortSelector/SortSelector.js +51 -18
  86. package/dist/SortSelector/SortSelector.js.map +1 -1
  87. package/dist/SortSelector/SortSelectorButtons.js +109 -25
  88. package/dist/SortSelector/SortSelectorButtons.js.map +1 -1
  89. package/dist/Table/InnerTable.js +46 -15
  90. package/dist/Table/InnerTable.js.map +1 -1
  91. package/dist/Table/Table.d.ts +3 -1
  92. package/dist/Table/Table.d.ts.map +1 -1
  93. package/dist/Table/Table.js +410 -158
  94. package/dist/Table/Table.js.map +1 -1
  95. package/dist/Table/TableBody.js +15 -4
  96. package/dist/Table/TableBody.js.map +1 -1
  97. package/dist/Table/TableCell.js +294 -107
  98. package/dist/Table/TableCell.js.map +1 -1
  99. package/dist/Table/TableCheckbox.js +101 -32
  100. package/dist/Table/TableCheckbox.js.map +1 -1
  101. package/dist/Table/TableFoot.js +15 -4
  102. package/dist/Table/TableFoot.js.map +1 -1
  103. package/dist/Table/TableHead.js +15 -4
  104. package/dist/Table/TableHead.js.map +1 -1
  105. package/dist/Table/TableHeaderCell.js +119 -62
  106. package/dist/Table/TableHeaderCell.js.map +1 -1
  107. package/dist/Table/TableRow.js +33 -9
  108. package/dist/Table/TableRow.js.map +1 -1
  109. package/dist/Table/TableToolbar.d.ts +5 -4
  110. package/dist/Table/TableToolbar.d.ts.map +1 -1
  111. package/dist/Table/TableToolbar.js +172 -100
  112. package/dist/Table/TableToolbar.js.map +1 -1
  113. package/dist/Table/VirtualizedTable.d.ts +11 -11
  114. package/dist/Table/VirtualizedTable.d.ts.map +1 -1
  115. package/dist/Table/VirtualizedTable.js +442 -204
  116. package/dist/Table/VirtualizedTable.js.map +1 -1
  117. package/dist/Table/VirtualizedTableContainer.js +27 -7
  118. package/dist/Table/VirtualizedTableContainer.js.map +1 -1
  119. package/dist/Table/hooks/useFuzzySearch.d.ts +6 -5
  120. package/dist/Table/hooks/useFuzzySearch.d.ts.map +1 -1
  121. package/dist/Table/hooks/useFuzzySearch.js +57 -32
  122. package/dist/Table/hooks/useFuzzySearch.js.map +1 -1
  123. package/dist/Table/hooks/useTableKeyboardNav.js +115 -74
  124. package/dist/Table/hooks/useTableKeyboardNav.js.map +1 -1
  125. package/dist/Table/hooks/useVirtualizedTableKeyboardNav.d.ts +1 -1
  126. package/dist/Table/hooks/useVirtualizedTableKeyboardNav.d.ts.map +1 -1
  127. package/dist/Table/hooks/useVirtualizedTableKeyboardNav.js +86 -69
  128. package/dist/Table/hooks/useVirtualizedTableKeyboardNav.js.map +1 -1
  129. package/dist/Table/model/table-model.d.ts +44 -15
  130. package/dist/Table/model/table-model.d.ts.map +1 -1
  131. package/dist/Table/model/table-model.js +33 -1
  132. package/dist/Table/model/table-model.js.map +1 -1
  133. package/dist/ThresholdsEditor/ThresholdInput.js +137 -47
  134. package/dist/ThresholdsEditor/ThresholdInput.js.map +1 -1
  135. package/dist/ThresholdsEditor/ThresholdsEditor.js +341 -174
  136. package/dist/ThresholdsEditor/ThresholdsEditor.js.map +1 -1
  137. package/dist/TimeRangeSelector/DateTimeRangePicker.js +368 -162
  138. package/dist/TimeRangeSelector/DateTimeRangePicker.js.map +1 -1
  139. package/dist/TimeRangeSelector/TimeRangeSelector.js +580 -210
  140. package/dist/TimeRangeSelector/TimeRangeSelector.js.map +1 -1
  141. package/dist/TimeSeriesTooltip/SeriesInfo.js +189 -65
  142. package/dist/TimeSeriesTooltip/SeriesInfo.js.map +1 -1
  143. package/dist/TimeSeriesTooltip/SeriesLabelsStack.js +168 -78
  144. package/dist/TimeSeriesTooltip/SeriesLabelsStack.js.map +1 -1
  145. package/dist/TimeSeriesTooltip/SeriesMarker.js +38 -11
  146. package/dist/TimeSeriesTooltip/SeriesMarker.js.map +1 -1
  147. package/dist/TimeSeriesTooltip/TimeChartTooltip.js +229 -72
  148. package/dist/TimeSeriesTooltip/TimeChartTooltip.js.map +1 -1
  149. package/dist/TimeSeriesTooltip/TooltipContent.js +73 -27
  150. package/dist/TimeSeriesTooltip/TooltipContent.js.map +1 -1
  151. package/dist/TimeSeriesTooltip/TooltipHeader.js +221 -121
  152. package/dist/TimeSeriesTooltip/TooltipHeader.js.map +1 -1
  153. package/dist/TimeSeriesTooltip/tooltip-model.js +44 -38
  154. package/dist/TimeSeriesTooltip/tooltip-model.js.map +1 -1
  155. package/dist/TimeZoneSelector.js +131 -36
  156. package/dist/TimeZoneSelector.js.map +1 -1
  157. package/dist/ToolbarIconButton/ToolbarIconButton.js +18 -7
  158. package/dist/ToolbarIconButton/ToolbarIconButton.js.map +1 -1
  159. package/dist/TransformsEditor/TransformEditor.js +830 -334
  160. package/dist/TransformsEditor/TransformEditor.js.map +1 -1
  161. package/dist/TransformsEditor/TransformEditorContainer.js +252 -90
  162. package/dist/TransformsEditor/TransformEditorContainer.js.map +1 -1
  163. package/dist/TransformsEditor/TransformsEditor.js +170 -59
  164. package/dist/TransformsEditor/TransformsEditor.js.map +1 -1
  165. package/dist/ValueMappingEditor/ValueMappingEditor.js +800 -322
  166. package/dist/ValueMappingEditor/ValueMappingEditor.js.map +1 -1
  167. package/dist/ValueMappingEditor/ValueMappingsEditor.js +218 -91
  168. package/dist/ValueMappingEditor/ValueMappingsEditor.js.map +1 -1
  169. package/dist/YAMLEditor/YAMLEditor.d.ts +12 -0
  170. package/dist/YAMLEditor/YAMLEditor.d.ts.map +1 -0
  171. package/dist/YAMLEditor/YAMLEditor.js +41 -0
  172. package/dist/YAMLEditor/YAMLEditor.js.map +1 -0
  173. package/dist/YAMLEditor/index.d.ts +2 -0
  174. package/dist/YAMLEditor/index.d.ts.map +1 -0
  175. package/dist/YAMLEditor/index.js +15 -0
  176. package/dist/YAMLEditor/index.js.map +1 -0
  177. package/dist/YAMLEditor/yaml-utils.d.ts +11 -0
  178. package/dist/YAMLEditor/yaml-utils.d.ts.map +1 -0
  179. package/dist/YAMLEditor/yaml-utils.js +52 -0
  180. package/dist/YAMLEditor/yaml-utils.js.map +1 -0
  181. package/dist/YAxisLabel.js +64 -20
  182. package/dist/YAxisLabel.js.map +1 -1
  183. package/dist/context/ChartsProvider.js +32 -16
  184. package/dist/context/ChartsProvider.js.map +1 -1
  185. package/dist/context/ItemActionsProvider.js +110 -61
  186. package/dist/context/ItemActionsProvider.js.map +1 -1
  187. package/dist/context/SelectionProvider.js +170 -66
  188. package/dist/context/SelectionProvider.js.map +1 -1
  189. package/dist/context/SnackbarProvider.js +101 -44
  190. package/dist/context/SnackbarProvider.js.map +1 -1
  191. package/dist/context/TimeZoneProvider.js +35 -14
  192. package/dist/context/TimeZoneProvider.js.map +1 -1
  193. package/dist/controls/TextField.js +86 -25
  194. package/dist/controls/TextField.js.map +1 -1
  195. package/dist/index.d.ts +1 -0
  196. package/dist/index.d.ts.map +1 -1
  197. package/dist/index.js +1 -0
  198. package/dist/index.js.map +1 -1
  199. package/dist/utils/browser-storage.js +64 -34
  200. package/dist/utils/browser-storage.js.map +1 -1
  201. package/package.json +15 -8
@@ -1,4 +1,5 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { c as _c } from "react-compiler-runtime";
2
3
  // Copyright The Perses Authors
3
4
  // Licensed under the Apache License, Version 2.0 (the "License");
4
5
  // you may not use this file except in compliance with the License.
@@ -27,178 +28,383 @@ import { DATE_TIME_FORMAT, validateDateRange } from "./utils.js";
27
28
  * @param onChange event received when start and end has been selected (click on apply)
28
29
  * @param onCancel event received when user click on cancel
29
30
  * @constructor
30
- */ export const DateTimeRangePicker = ({ initialTimeRange, onChange, onCancel, timeZone })=>{
31
- const stdTimeZone = [
32
- 'local',
33
- 'browser'
34
- ].includes(timeZone.toLowerCase()) ? new Intl.DateTimeFormat().resolvedOptions().timeZone : timeZone;
31
+ */ export const DateTimeRangePicker = (t0)=>{
32
+ const $ = _c(56);
33
+ const { initialTimeRange, onChange, onCancel, timeZone } = t0;
34
+ let t1;
35
+ if ($[0] !== timeZone) {
36
+ t1 = [
37
+ "local",
38
+ "browser"
39
+ ].includes(timeZone.toLowerCase()) ? new Intl.DateTimeFormat().resolvedOptions().timeZone : timeZone;
40
+ $[0] = timeZone;
41
+ $[1] = t1;
42
+ } else {
43
+ t1 = $[1];
44
+ }
45
+ const stdTimeZone = t1;
35
46
  const [timeRange, setTimeRange] = useState(initialTimeRange);
36
47
  const [showStartCalendar, setShowStartCalendar] = useState(true);
37
- const changeTimeRange = (newTime, segment)=>{
38
- setTimeRange((prevTimeRange)=>{
39
- return {
40
- ...prevTimeRange,
41
- [segment]: newTime
48
+ let t2;
49
+ if ($[2] === Symbol.for("react.memo_cache_sentinel")) {
50
+ t2 = (newTime, segment)=>{
51
+ setTimeRange((prevTimeRange)=>({
52
+ ...prevTimeRange,
53
+ [segment]: newTime
54
+ }));
55
+ };
56
+ $[2] = t2;
57
+ } else {
58
+ t2 = $[2];
59
+ }
60
+ const changeTimeRange = t2;
61
+ let t3;
62
+ if ($[3] === Symbol.for("react.memo_cache_sentinel")) {
63
+ t3 = (newStartTime)=>{
64
+ changeTimeRange(newStartTime, "start");
65
+ };
66
+ $[3] = t3;
67
+ } else {
68
+ t3 = $[3];
69
+ }
70
+ const onChangeStartTime = t3;
71
+ let t4;
72
+ if ($[4] === Symbol.for("react.memo_cache_sentinel")) {
73
+ t4 = (newEndTime)=>{
74
+ changeTimeRange(newEndTime, "end");
75
+ };
76
+ $[4] = t4;
77
+ } else {
78
+ t4 = $[4];
79
+ }
80
+ const onChangeEndTime = t4;
81
+ let t5;
82
+ if ($[5] !== timeRange.end || $[6] !== timeRange.start) {
83
+ t5 = ()=>{
84
+ const newDates = {
85
+ start: timeRange.start,
86
+ end: timeRange.end
42
87
  };
43
- });
44
- };
45
- const onChangeStartTime = (newStartTime)=>{
46
- changeTimeRange(newStartTime, 'start');
47
- };
48
- const onChangeEndTime = (newEndTime)=>{
49
- changeTimeRange(newEndTime, 'end');
50
- };
51
- const updateDateRange = ()=>{
52
- const newDates = {
53
- start: timeRange.start,
54
- end: timeRange.end
88
+ const isValidDateRange = validateDateRange(newDates.start, newDates.end);
89
+ if (isValidDateRange) {
90
+ return newDates;
91
+ }
55
92
  };
56
- const isValidDateRange = validateDateRange(newDates.start, newDates.end);
57
- if (isValidDateRange) {
58
- return newDates;
59
- }
60
- };
61
- const onApply = ()=>{
62
- const newDates = updateDateRange();
63
- if (newDates) {
64
- onChange(newDates);
65
- }
66
- };
67
- return /*#__PURE__*/ _jsx(LocalizationProvider, {
68
- dateAdapter: AdapterDateFns,
69
- children: /*#__PURE__*/ _jsxs(Stack, {
70
- spacing: 2,
71
- sx: (theme)=>({
72
- padding: theme.spacing(1, 0, 2)
73
- }),
93
+ $[5] = timeRange.end;
94
+ $[6] = timeRange.start;
95
+ $[7] = t5;
96
+ } else {
97
+ t5 = $[7];
98
+ }
99
+ const updateDateRange = t5;
100
+ let t6;
101
+ if ($[8] !== onChange || $[9] !== updateDateRange) {
102
+ t6 = ()=>{
103
+ const newDates_0 = updateDateRange();
104
+ if (newDates_0) {
105
+ onChange(newDates_0);
106
+ }
107
+ };
108
+ $[8] = onChange;
109
+ $[9] = updateDateRange;
110
+ $[10] = t6;
111
+ } else {
112
+ t6 = $[10];
113
+ }
114
+ const onApply = t6;
115
+ let t7;
116
+ if ($[11] !== showStartCalendar || $[12] !== stdTimeZone || $[13] !== timeRange.start) {
117
+ t7 = showStartCalendar && /*#__PURE__*/ _jsxs(Box, {
118
+ sx: _temp2,
74
119
  children: [
75
- showStartCalendar && /*#__PURE__*/ _jsxs(Box, {
76
- sx: (theme)=>({
77
- // TODO: create separate reusable calendar component
78
- '.MuiPickersLayout-contentWrapper': {
79
- backgroundColor: theme.palette.background.default
80
- }
81
- }),
82
- children: [
83
- /*#__PURE__*/ _jsx(Typography, {
84
- variant: "h3",
85
- padding: 1,
86
- paddingLeft: 2,
87
- children: "Select Start Time"
88
- }),
89
- /*#__PURE__*/ _jsx(StaticDateTimePicker, {
90
- timezone: stdTimeZone,
91
- displayStaticWrapperAs: "desktop",
92
- openTo: "day",
93
- disableHighlightToday: true,
94
- value: new TZDate(timeRange.start, stdTimeZone),
95
- onChange: (newValue)=>{
96
- if (newValue === null) return;
97
- onChangeStartTime(newValue);
98
- },
99
- onAccept: ()=>{
100
- setShowStartCalendar(false);
101
- }
102
- })
103
- ]
120
+ /*#__PURE__*/ _jsx(Typography, {
121
+ variant: "h3",
122
+ padding: 1,
123
+ paddingLeft: 2,
124
+ children: "Select Start Time"
104
125
  }),
105
- !showStartCalendar && /*#__PURE__*/ _jsxs(Box, {
106
- sx: (theme)=>({
107
- '.MuiPickersLayout-contentWrapper': {
108
- backgroundColor: theme.palette.background.default
109
- }
110
- }),
111
- children: [
112
- /*#__PURE__*/ _jsx(Typography, {
113
- variant: "h3",
114
- padding: 1,
115
- paddingLeft: 2,
116
- children: "Select End Time"
117
- }),
118
- /*#__PURE__*/ _jsx(StaticDateTimePicker, {
119
- timezone: stdTimeZone,
120
- displayStaticWrapperAs: "desktop",
121
- openTo: "day",
122
- disableHighlightToday: true,
123
- value: new TZDate(timeRange.end, stdTimeZone),
124
- minDateTime: new TZDate(timeRange.start, stdTimeZone),
125
- onChange: (newValue)=>{
126
- if (newValue === null) return;
127
- onChangeEndTime(newValue);
128
- },
129
- onAccept: (newValue)=>{
130
- if (newValue === null) return;
131
- setShowStartCalendar(true);
132
- onChangeEndTime(newValue);
133
- }
134
- })
135
- ]
136
- }),
137
- /*#__PURE__*/ _jsxs(Stack, {
138
- direction: "row",
139
- alignItems: "center",
140
- gap: 1,
141
- pl: 1,
142
- pr: 1,
143
- children: [
144
- /*#__PURE__*/ _jsx(ErrorBoundary, {
145
- FallbackComponent: ErrorAlert,
146
- children: /*#__PURE__*/ _jsx(DateTimeField, {
147
- "data-testid": "start_time_input",
148
- timezone: stdTimeZone,
149
- label: "Start Time",
150
- value: new TZDate(timeRange.start, stdTimeZone),
151
- onChange: (event)=>{
152
- if (event) {
153
- onChangeStartTime(event);
154
- }
155
- },
156
- onBlur: ()=>updateDateRange(),
157
- format: DATE_TIME_FORMAT
158
- })
159
- }),
160
- /*#__PURE__*/ _jsx(ErrorBoundary, {
161
- FallbackComponent: ErrorAlert,
162
- children: /*#__PURE__*/ _jsx(DateTimeField, {
163
- "data-testid": "end_time_input",
164
- timezone: stdTimeZone,
165
- label: "End Time",
166
- value: new TZDate(timeRange.end, stdTimeZone),
167
- onChange: (event)=>{
168
- if (event) {
169
- onChangeEndTime(event);
170
- }
171
- },
172
- onBlur: ()=>updateDateRange(),
173
- format: DATE_TIME_FORMAT
174
- })
175
- })
176
- ]
126
+ /*#__PURE__*/ _jsx(StaticDateTimePicker, {
127
+ timezone: stdTimeZone,
128
+ displayStaticWrapperAs: "desktop",
129
+ openTo: "day",
130
+ disableHighlightToday: true,
131
+ value: new TZDate(timeRange.start, stdTimeZone),
132
+ onChange: (newValue)=>{
133
+ if (newValue === null) {
134
+ return;
135
+ }
136
+ onChangeStartTime(newValue);
137
+ },
138
+ onAccept: ()=>{
139
+ setShowStartCalendar(false);
140
+ }
141
+ })
142
+ ]
143
+ });
144
+ $[11] = showStartCalendar;
145
+ $[12] = stdTimeZone;
146
+ $[13] = timeRange.start;
147
+ $[14] = t7;
148
+ } else {
149
+ t7 = $[14];
150
+ }
151
+ let t8;
152
+ if ($[15] !== showStartCalendar || $[16] !== stdTimeZone || $[17] !== timeRange.end || $[18] !== timeRange.start) {
153
+ t8 = !showStartCalendar && /*#__PURE__*/ _jsxs(Box, {
154
+ sx: _temp3,
155
+ children: [
156
+ /*#__PURE__*/ _jsx(Typography, {
157
+ variant: "h3",
158
+ padding: 1,
159
+ paddingLeft: 2,
160
+ children: "Select End Time"
177
161
  }),
178
- /*#__PURE__*/ _jsxs(Stack, {
179
- direction: "row",
180
- sx: {
181
- padding: (theme)=>theme.spacing(0, 1)
162
+ /*#__PURE__*/ _jsx(StaticDateTimePicker, {
163
+ timezone: stdTimeZone,
164
+ displayStaticWrapperAs: "desktop",
165
+ openTo: "day",
166
+ disableHighlightToday: true,
167
+ value: new TZDate(timeRange.end, stdTimeZone),
168
+ minDateTime: new TZDate(timeRange.start, stdTimeZone),
169
+ onChange: (newValue_0)=>{
170
+ if (newValue_0 === null) {
171
+ return;
172
+ }
173
+ onChangeEndTime(newValue_0);
182
174
  },
183
- gap: 1,
184
- children: [
185
- /*#__PURE__*/ _jsx(Button, {
186
- variant: "contained",
187
- onClick: ()=>onApply(),
188
- fullWidth: true,
189
- children: "Apply"
190
- }),
191
- /*#__PURE__*/ _jsx(Button, {
192
- variant: "outlined",
193
- onClick: ()=>onCancel(),
194
- fullWidth: true,
195
- children: "Cancel"
196
- })
197
- ]
175
+ onAccept: (newValue_1)=>{
176
+ if (newValue_1 === null) {
177
+ return;
178
+ }
179
+ setShowStartCalendar(true);
180
+ onChangeEndTime(newValue_1);
181
+ }
198
182
  })
199
183
  ]
200
- })
201
- });
184
+ });
185
+ $[15] = showStartCalendar;
186
+ $[16] = stdTimeZone;
187
+ $[17] = timeRange.end;
188
+ $[18] = timeRange.start;
189
+ $[19] = t8;
190
+ } else {
191
+ t8 = $[19];
192
+ }
193
+ let t9;
194
+ if ($[20] !== stdTimeZone || $[21] !== timeRange.start) {
195
+ t9 = new TZDate(timeRange.start, stdTimeZone);
196
+ $[20] = stdTimeZone;
197
+ $[21] = timeRange.start;
198
+ $[22] = t9;
199
+ } else {
200
+ t9 = $[22];
201
+ }
202
+ let t10;
203
+ if ($[23] === Symbol.for("react.memo_cache_sentinel")) {
204
+ t10 = (event)=>{
205
+ if (event) {
206
+ onChangeStartTime(event);
207
+ }
208
+ };
209
+ $[23] = t10;
210
+ } else {
211
+ t10 = $[23];
212
+ }
213
+ let t11;
214
+ if ($[24] !== updateDateRange) {
215
+ t11 = ()=>updateDateRange();
216
+ $[24] = updateDateRange;
217
+ $[25] = t11;
218
+ } else {
219
+ t11 = $[25];
220
+ }
221
+ let t12;
222
+ if ($[26] !== stdTimeZone || $[27] !== t11 || $[28] !== t9) {
223
+ t12 = /*#__PURE__*/ _jsx(ErrorBoundary, {
224
+ FallbackComponent: ErrorAlert,
225
+ children: /*#__PURE__*/ _jsx(DateTimeField, {
226
+ "data-testid": "start_time_input",
227
+ timezone: stdTimeZone,
228
+ label: "Start Time",
229
+ value: t9,
230
+ onChange: t10,
231
+ onBlur: t11,
232
+ format: DATE_TIME_FORMAT
233
+ })
234
+ });
235
+ $[26] = stdTimeZone;
236
+ $[27] = t11;
237
+ $[28] = t9;
238
+ $[29] = t12;
239
+ } else {
240
+ t12 = $[29];
241
+ }
242
+ let t13;
243
+ if ($[30] !== stdTimeZone || $[31] !== timeRange.end) {
244
+ t13 = new TZDate(timeRange.end, stdTimeZone);
245
+ $[30] = stdTimeZone;
246
+ $[31] = timeRange.end;
247
+ $[32] = t13;
248
+ } else {
249
+ t13 = $[32];
250
+ }
251
+ let t14;
252
+ if ($[33] === Symbol.for("react.memo_cache_sentinel")) {
253
+ t14 = (event_0)=>{
254
+ if (event_0) {
255
+ onChangeEndTime(event_0);
256
+ }
257
+ };
258
+ $[33] = t14;
259
+ } else {
260
+ t14 = $[33];
261
+ }
262
+ let t15;
263
+ if ($[34] !== updateDateRange) {
264
+ t15 = ()=>updateDateRange();
265
+ $[34] = updateDateRange;
266
+ $[35] = t15;
267
+ } else {
268
+ t15 = $[35];
269
+ }
270
+ let t16;
271
+ if ($[36] !== stdTimeZone || $[37] !== t13 || $[38] !== t15) {
272
+ t16 = /*#__PURE__*/ _jsx(ErrorBoundary, {
273
+ FallbackComponent: ErrorAlert,
274
+ children: /*#__PURE__*/ _jsx(DateTimeField, {
275
+ "data-testid": "end_time_input",
276
+ timezone: stdTimeZone,
277
+ label: "End Time",
278
+ value: t13,
279
+ onChange: t14,
280
+ onBlur: t15,
281
+ format: DATE_TIME_FORMAT
282
+ })
283
+ });
284
+ $[36] = stdTimeZone;
285
+ $[37] = t13;
286
+ $[38] = t15;
287
+ $[39] = t16;
288
+ } else {
289
+ t16 = $[39];
290
+ }
291
+ let t17;
292
+ if ($[40] !== t12 || $[41] !== t16) {
293
+ t17 = /*#__PURE__*/ _jsxs(Stack, {
294
+ direction: "row",
295
+ alignItems: "center",
296
+ gap: 1,
297
+ pl: 1,
298
+ pr: 1,
299
+ children: [
300
+ t12,
301
+ t16
302
+ ]
303
+ });
304
+ $[40] = t12;
305
+ $[41] = t16;
306
+ $[42] = t17;
307
+ } else {
308
+ t17 = $[42];
309
+ }
310
+ let t18;
311
+ if ($[43] === Symbol.for("react.memo_cache_sentinel")) {
312
+ t18 = {
313
+ padding: _temp4
314
+ };
315
+ $[43] = t18;
316
+ } else {
317
+ t18 = $[43];
318
+ }
319
+ let t19;
320
+ if ($[44] !== onApply) {
321
+ t19 = /*#__PURE__*/ _jsx(Button, {
322
+ variant: "contained",
323
+ onClick: ()=>onApply(),
324
+ fullWidth: true,
325
+ children: "Apply"
326
+ });
327
+ $[44] = onApply;
328
+ $[45] = t19;
329
+ } else {
330
+ t19 = $[45];
331
+ }
332
+ let t20;
333
+ if ($[46] !== onCancel) {
334
+ t20 = /*#__PURE__*/ _jsx(Button, {
335
+ variant: "outlined",
336
+ onClick: ()=>onCancel(),
337
+ fullWidth: true,
338
+ children: "Cancel"
339
+ });
340
+ $[46] = onCancel;
341
+ $[47] = t20;
342
+ } else {
343
+ t20 = $[47];
344
+ }
345
+ let t21;
346
+ if ($[48] !== t19 || $[49] !== t20) {
347
+ t21 = /*#__PURE__*/ _jsxs(Stack, {
348
+ direction: "row",
349
+ sx: t18,
350
+ gap: 1,
351
+ children: [
352
+ t19,
353
+ t20
354
+ ]
355
+ });
356
+ $[48] = t19;
357
+ $[49] = t20;
358
+ $[50] = t21;
359
+ } else {
360
+ t21 = $[50];
361
+ }
362
+ let t22;
363
+ if ($[51] !== t17 || $[52] !== t21 || $[53] !== t7 || $[54] !== t8) {
364
+ t22 = /*#__PURE__*/ _jsx(LocalizationProvider, {
365
+ dateAdapter: AdapterDateFns,
366
+ children: /*#__PURE__*/ _jsxs(Stack, {
367
+ spacing: 2,
368
+ sx: _temp,
369
+ children: [
370
+ t7,
371
+ t8,
372
+ t17,
373
+ t21
374
+ ]
375
+ })
376
+ });
377
+ $[51] = t17;
378
+ $[52] = t21;
379
+ $[53] = t7;
380
+ $[54] = t8;
381
+ $[55] = t22;
382
+ } else {
383
+ t22 = $[55];
384
+ }
385
+ return t22;
202
386
  };
387
+ function _temp(theme) {
388
+ return {
389
+ padding: theme.spacing(1, 0, 2)
390
+ };
391
+ }
392
+ function _temp2(theme_0) {
393
+ return {
394
+ ".MuiPickersLayout-contentWrapper": {
395
+ backgroundColor: theme_0.palette.background.default
396
+ }
397
+ };
398
+ }
399
+ function _temp3(theme_1) {
400
+ return {
401
+ ".MuiPickersLayout-contentWrapper": {
402
+ backgroundColor: theme_1.palette.background.default
403
+ }
404
+ };
405
+ }
406
+ function _temp4(theme_2) {
407
+ return theme_2.spacing(0, 1);
408
+ }
203
409
 
204
410
  //# sourceMappingURL=DateTimeRangePicker.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/TimeRangeSelector/DateTimeRangePicker.tsx"],"sourcesContent":["// Copyright The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { TZDate } from '@date-fns/tz';\nimport { Box, Stack, Typography, Button } from '@mui/material';\nimport { DateTimeField, LocalizationProvider, StaticDateTimePicker } from '@mui/x-date-pickers';\nimport { AdapterDateFns } from '@mui/x-date-pickers/AdapterDateFnsV3';\nimport type { AbsoluteTimeRange } from '@perses-dev/spec';\nimport type { ReactElement } from 'react';\nimport { useState } from 'react';\n\nimport { ErrorAlert } from '../ErrorAlert';\nimport { ErrorBoundary } from '../ErrorBoundary';\nimport { DATE_TIME_FORMAT, validateDateRange } from './utils';\n\nexport interface AbsoluteTimeFormProps {\n initialTimeRange: AbsoluteTimeRange;\n onChange: (timeRange: AbsoluteTimeRange) => void;\n onCancel: () => void;\n timeZone: string;\n}\n\n/**\n * Start and End datetime picker, allowing use to select a specific time range selecting two absolute dates and times.\n * TODO: Use directly the MUI X ``DateTimePicker`` for datetime selection which is better. https://next.mui.com/x/react-date-pickers/date-time-picker/\n * Use ``DateTimeRangePicker`` directly would be cool but paid https://next.mui.com/x/react-date-pickers/date-time-range-picker/\n * @param initialTimeRange initial time range to pre-select.\n * @param onChange event received when start and end has been selected (click on apply)\n * @param onCancel event received when user click on cancel\n * @constructor\n */\nexport const DateTimeRangePicker = ({\n initialTimeRange,\n onChange,\n onCancel,\n timeZone,\n}: AbsoluteTimeFormProps): ReactElement => {\n const stdTimeZone = ['local', 'browser'].includes(timeZone.toLowerCase())\n ? new Intl.DateTimeFormat().resolvedOptions().timeZone\n : timeZone;\n const [timeRange, setTimeRange] = useState<AbsoluteTimeRange>(initialTimeRange);\n const [showStartCalendar, setShowStartCalendar] = useState<boolean>(true);\n\n const changeTimeRange = (newTime: Date, segment: keyof AbsoluteTimeRange): void => {\n setTimeRange((prevTimeRange) => {\n return {\n ...prevTimeRange,\n [segment]: newTime,\n };\n });\n };\n\n const onChangeStartTime = (newStartTime: Date): void => {\n changeTimeRange(newStartTime, 'start');\n };\n\n const onChangeEndTime = (newEndTime: Date): void => {\n changeTimeRange(newEndTime, 'end');\n };\n\n const updateDateRange = (): { start: Date; end: Date } | undefined => {\n const newDates = {\n start: timeRange.start,\n end: timeRange.end,\n };\n const isValidDateRange = validateDateRange(newDates.start, newDates.end);\n if (isValidDateRange) {\n return newDates;\n }\n };\n\n const onApply = (): void => {\n const newDates = updateDateRange();\n if (newDates) {\n onChange(newDates);\n }\n };\n\n return (\n <LocalizationProvider dateAdapter={AdapterDateFns}>\n <Stack\n spacing={2}\n sx={(theme) => ({\n padding: theme.spacing(1, 0, 2),\n })}\n >\n {showStartCalendar && (\n <Box\n sx={(theme) => ({\n // TODO: create separate reusable calendar component\n '.MuiPickersLayout-contentWrapper': {\n backgroundColor: theme.palette.background.default,\n },\n })}\n >\n <Typography variant=\"h3\" padding={1} paddingLeft={2}>\n Select Start Time\n </Typography>\n <StaticDateTimePicker\n timezone={stdTimeZone}\n displayStaticWrapperAs=\"desktop\"\n openTo=\"day\"\n disableHighlightToday={true}\n value={new TZDate(timeRange.start, stdTimeZone)}\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 timezone={stdTimeZone}\n displayStaticWrapperAs=\"desktop\"\n openTo=\"day\"\n disableHighlightToday={true}\n value={new TZDate(timeRange.end, stdTimeZone)}\n minDateTime={new TZDate(timeRange.start, stdTimeZone)}\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 data-testid=\"start_time_input\"\n timezone={stdTimeZone}\n label=\"Start Time\"\n value={new TZDate(timeRange.start, stdTimeZone)}\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 data-testid=\"end_time_input\"\n timezone={stdTimeZone}\n label=\"End Time\"\n value={new TZDate(timeRange.end, stdTimeZone)}\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":["TZDate","Box","Stack","Typography","Button","DateTimeField","LocalizationProvider","StaticDateTimePicker","AdapterDateFns","useState","ErrorAlert","ErrorBoundary","DATE_TIME_FORMAT","validateDateRange","DateTimeRangePicker","initialTimeRange","onChange","onCancel","timeZone","stdTimeZone","includes","toLowerCase","Intl","DateTimeFormat","resolvedOptions","timeRange","setTimeRange","showStartCalendar","setShowStartCalendar","changeTimeRange","newTime","segment","prevTimeRange","onChangeStartTime","newStartTime","onChangeEndTime","newEndTime","updateDateRange","newDates","start","end","isValidDateRange","onApply","dateAdapter","spacing","sx","theme","padding","backgroundColor","palette","background","default","variant","paddingLeft","timezone","displayStaticWrapperAs","openTo","disableHighlightToday","value","newValue","onAccept","minDateTime","direction","alignItems","gap","pl","pr","FallbackComponent","data-testid","label","event","onBlur","format","onClick","fullWidth"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/TimeRangeSelector/DateTimeRangePicker.tsx"],"sourcesContent":["// Copyright The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { TZDate } from '@date-fns/tz';\nimport { Box, Stack, Typography, Button } from '@mui/material';\nimport { DateTimeField, LocalizationProvider, StaticDateTimePicker } from '@mui/x-date-pickers';\nimport { AdapterDateFns } from '@mui/x-date-pickers/AdapterDateFnsV3';\nimport type { AbsoluteTimeRange } from '@perses-dev/spec';\nimport type { ReactElement } from 'react';\nimport { useState } from 'react';\n\nimport { ErrorAlert } from '../ErrorAlert';\nimport { ErrorBoundary } from '../ErrorBoundary';\nimport { DATE_TIME_FORMAT, validateDateRange } from './utils';\n\nexport interface AbsoluteTimeFormProps {\n initialTimeRange: AbsoluteTimeRange;\n onChange: (timeRange: AbsoluteTimeRange) => void;\n onCancel: () => void;\n timeZone: string;\n}\n\n/**\n * Start and End datetime picker, allowing use to select a specific time range selecting two absolute dates and times.\n * TODO: Use directly the MUI X ``DateTimePicker`` for datetime selection which is better. https://next.mui.com/x/react-date-pickers/date-time-picker/\n * Use ``DateTimeRangePicker`` directly would be cool but paid https://next.mui.com/x/react-date-pickers/date-time-range-picker/\n * @param initialTimeRange initial time range to pre-select.\n * @param onChange event received when start and end has been selected (click on apply)\n * @param onCancel event received when user click on cancel\n * @constructor\n */\nexport const DateTimeRangePicker = ({\n initialTimeRange,\n onChange,\n onCancel,\n timeZone,\n}: AbsoluteTimeFormProps): ReactElement => {\n const stdTimeZone = ['local', 'browser'].includes(timeZone.toLowerCase())\n ? new Intl.DateTimeFormat().resolvedOptions().timeZone\n : timeZone;\n const [timeRange, setTimeRange] = useState<AbsoluteTimeRange>(initialTimeRange);\n const [showStartCalendar, setShowStartCalendar] = useState<boolean>(true);\n\n const changeTimeRange = (newTime: Date, segment: keyof AbsoluteTimeRange): void => {\n setTimeRange((prevTimeRange) => {\n return {\n ...prevTimeRange,\n [segment]: newTime,\n };\n });\n };\n\n const onChangeStartTime = (newStartTime: Date): void => {\n changeTimeRange(newStartTime, 'start');\n };\n\n const onChangeEndTime = (newEndTime: Date): void => {\n changeTimeRange(newEndTime, 'end');\n };\n\n const updateDateRange = (): { start: Date; end: Date } | undefined => {\n const newDates = {\n start: timeRange.start,\n end: timeRange.end,\n };\n const isValidDateRange = validateDateRange(newDates.start, newDates.end);\n if (isValidDateRange) {\n return newDates;\n }\n };\n\n const onApply = (): void => {\n const newDates = updateDateRange();\n if (newDates) {\n onChange(newDates);\n }\n };\n\n return (\n <LocalizationProvider dateAdapter={AdapterDateFns}>\n <Stack\n spacing={2}\n sx={(theme) => ({\n padding: theme.spacing(1, 0, 2),\n })}\n >\n {showStartCalendar && (\n <Box\n sx={(theme) => ({\n // TODO: create separate reusable calendar component\n '.MuiPickersLayout-contentWrapper': {\n backgroundColor: theme.palette.background.default,\n },\n })}\n >\n <Typography variant=\"h3\" padding={1} paddingLeft={2}>\n Select Start Time\n </Typography>\n <StaticDateTimePicker\n timezone={stdTimeZone}\n displayStaticWrapperAs=\"desktop\"\n openTo=\"day\"\n disableHighlightToday={true}\n value={new TZDate(timeRange.start, stdTimeZone)}\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 timezone={stdTimeZone}\n displayStaticWrapperAs=\"desktop\"\n openTo=\"day\"\n disableHighlightToday={true}\n value={new TZDate(timeRange.end, stdTimeZone)}\n minDateTime={new TZDate(timeRange.start, stdTimeZone)}\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 data-testid=\"start_time_input\"\n timezone={stdTimeZone}\n label=\"Start Time\"\n value={new TZDate(timeRange.start, stdTimeZone)}\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 data-testid=\"end_time_input\"\n timezone={stdTimeZone}\n label=\"End Time\"\n value={new TZDate(timeRange.end, stdTimeZone)}\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":["TZDate","Box","Stack","Typography","Button","DateTimeField","LocalizationProvider","StaticDateTimePicker","AdapterDateFns","useState","ErrorAlert","ErrorBoundary","DATE_TIME_FORMAT","validateDateRange","DateTimeRangePicker"],"mappings":";;AAAA,+BAA+B;AAC/B,kEAAkE;AAClE,mEAAmE;AACnE,0CAA0C;AAC1C,EAAE;AACF,6CAA6C;AAC7C,EAAE;AACF,sEAAsE;AACtE,oEAAoE;AACpE,2EAA2E;AAC3E,sEAAsE;AACtE,iCAAiC;AAEjC,SAASA,MAAM,QAAQ,eAAe;AACtC,SAASC,GAAG,EAAEC,KAAK,EAAEC,UAAU,EAAEC,MAAM,QAAQ,gBAAgB;AAC/D,SAASC,aAAa,EAAEC,oBAAoB,EAAEC,oBAAoB,QAAQ,sBAAsB;AAChG,SAASC,cAAc,QAAQ,uCAAuC;AAGtE,SAASC,QAAQ,QAAQ,QAAQ;AAEjC,SAASC,UAAU,QAAQ,mBAAgB;AAC3C,SAASC,aAAa,QAAQ,sBAAmB;AACjD,SAASC,gBAAgB,EAAEC,iBAAiB,QAAQ,aAAU;AAS9D;;;;;;;;CAQC,GACD,OAAO,MAAMC,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4JjC"}