@auth0/quantum-product 2.6.0 → 2.7.0

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.
@@ -36,6 +36,15 @@ var __read = (this && this.__read) || function (o, n) {
36
36
  }
37
37
  return ar;
38
38
  };
39
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
40
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
41
+ if (ar || !(i in from)) {
42
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
43
+ ar[i] = from[i];
44
+ }
45
+ }
46
+ return to.concat(ar || Array.prototype.slice.call(from));
47
+ };
39
48
  import 'react-day-picker/style.css';
40
49
  import * as React from 'react';
41
50
  import { DayPicker } from 'react-day-picker';
@@ -46,9 +55,9 @@ import { DropdownMenuList, DropdownMenuListItem } from '../dropdown-menu';
46
55
  import { Popover } from '../popover';
47
56
  import { styled } from '../styled';
48
57
  import { useMergedClasses } from '../styles/classes';
49
- import { TextField } from '../text-field';
50
58
  import clsx from '../utils/clsx';
51
59
  import { datePickerPopoverClasses, datePickerPopoverComponentName, getDatePickerPopoverUtilityClass, } from './date-picker-classes';
60
+ import { DatePickerTimeInput } from './date-picker-time-input';
52
61
  import { applyTimeToDate, extractTimeComponents, formatDate, formatDateRange, parseDate, parseDateRange, } from './date-picker-utils';
53
62
  var Root = styled(Popover, { name: datePickerPopoverComponentName, slot: 'Root' })(function (_a) {
54
63
  var theme = _a.theme;
@@ -142,6 +151,7 @@ var CalendarWrapper = styled('div', { name: datePickerPopoverComponentName, slot
142
151
  '.rdp-day_button': {
143
152
  width: theme.spacing(4),
144
153
  height: theme.spacing(4),
154
+ borderRadius: theme.spacing(0.5),
145
155
  },
146
156
  '.rdp-range_start .rdp-day_button': {
147
157
  backgroundColor: theme.tokens.color_bg_button_primary,
@@ -189,153 +199,127 @@ var ButtonContainer = styled(Box, { name: datePickerPopoverComponentName, slot:
189
199
  borderTop: "1px solid ".concat(theme.tokens.color_border_default),
190
200
  });
191
201
  });
192
- var TimeInputContainer = styled('div', { name: datePickerPopoverComponentName, slot: 'TimeInput' })(function (_a) {
193
- var theme = _a.theme;
194
- return ({
195
- display: 'flex',
196
- justifyContent: 'flex-start',
197
- gap: theme.spacing(0.5),
198
- padding: theme.spacing(1),
199
- alignItems: 'center',
200
- borderTop: "1px solid ".concat(theme.tokens.color_border_default),
201
- });
202
- });
203
- var EndTimeInputContainer = styled('div', { name: datePickerPopoverComponentName, slot: 'EndTimeInput' })(function (_a) {
204
- var theme = _a.theme;
205
- return ({
206
- display: 'flex',
207
- justifyContent: 'flex-start',
208
- gap: theme.spacing(0.5),
209
- alignItems: 'center',
210
- marginLeft: theme.spacing(2),
211
- });
212
- });
213
- var TimeInput = styled(TextField, { name: datePickerPopoverComponentName, slot: 'TimeInputField' })({
214
- width: '3rem',
215
- });
216
- var TimeInputLabel = styled('span', { name: datePickerPopoverComponentName, slot: 'TimeInputLabel' })(function (_a) {
217
- var theme = _a.theme;
218
- return ({
219
- color: theme.tokens.color_fg_default,
220
- fontSize: theme.typography.caption.fontSize,
221
- });
222
- });
223
202
  export var DatePickerPopover = React.forwardRef(function (props, ref) {
224
- var anchorEl = props.anchorEl, open = props.open, onClose = props.onClose, onDateSelect = props.onDateSelect, options = props.options, value = props.value, _a = props.dateFormat, dateFormat = _a === void 0 ? 'MM/dd/yyyy' : _a, _b = props.timeFormat, timeFormat = _b === void 0 ? 'HH:mm:ss' : _b, PopoverProps = props.PopoverProps, _c = props.showTwoMonths, showTwoMonths = _c === void 0 ? false : _c, _d = props.isRangeSelection, isRangeSelection = _d === void 0 ? false : _d, _e = props.showTimeInput, showTimeInput = _e === void 0 ? false : _e, propClasses = props.classes, rootProps = __rest(props, ["anchorEl", "open", "onClose", "onDateSelect", "options", "value", "dateFormat", "timeFormat", "PopoverProps", "showTwoMonths", "isRangeSelection", "showTimeInput", "classes"]);
203
+ var anchorEl = props.anchorEl, open = props.open, onClose = props.onClose, onDateSelect = props.onDateSelect, options = props.options, value = props.value, _a = props.dateFormat, dateFormat = _a === void 0 ? 'MM/dd/yyyy' : _a, _b = props.timeFormat, timeFormat = _b === void 0 ? 'HH:mm:ss' : _b, minDate = props.minDate, maxDate = props.maxDate, PopoverProps = props.PopoverProps, _c = props.showTwoMonths, showTwoMonths = _c === void 0 ? false : _c, _d = props.isRangeSelection, isRangeSelection = _d === void 0 ? false : _d, _e = props.showTimeInput, showTimeInput = _e === void 0 ? false : _e, propClasses = props.classes, rootProps = __rest(props, ["anchorEl", "open", "onClose", "onDateSelect", "options", "value", "dateFormat", "timeFormat", "minDate", "maxDate", "PopoverProps", "showTwoMonths", "isRangeSelection", "showTimeInput", "classes"]);
225
204
  var classes = useMergedClasses(datePickerPopoverClasses, getDatePickerPopoverUtilityClass, propClasses);
226
- // State to track the current view: 'options' or 'calendar'
227
205
  var _f = __read(React.useState(options ? 'options' : 'calendar'), 2), currentView = _f[0], setCurrentView = _f[1];
228
- // State to track the current range selection
229
206
  var _g = __read(React.useState({}), 2), rangeSelection = _g[0], setRangeSelection = _g[1];
230
- // Time state for single date or range start/end
231
- var _h = __read(React.useState('00'), 2), hours = _h[0], setHours = _h[1];
232
- var _j = __read(React.useState('00'), 2), minutes = _j[0], setMinutes = _j[1];
233
- var _k = __read(React.useState('00'), 2), seconds = _k[0], setSeconds = _k[1];
234
- // For range selection - end time
235
- var _l = __read(React.useState('00'), 2), endHours = _l[0], setEndHours = _l[1];
236
- var _m = __read(React.useState('00'), 2), endMinutes = _m[0], setEndMinutes = _m[1];
237
- var _o = __read(React.useState('00'), 2), endSeconds = _o[0], setEndSeconds = _o[1];
238
- // Reset selection and view when popover opens/closes
207
+ var _h = __read(React.useState({ hours: '00', minutes: '00', seconds: '00' }), 2), startTime = _h[0], setStartTime = _h[1];
208
+ var _j = __read(React.useState({ hours: '00', minutes: '00', seconds: '00' }), 2), endTime = _j[0], setEndTime = _j[1];
209
+ var shouldAutoFocusTimeInput = React.useRef(false);
210
+ // Reset state when popover closes
239
211
  React.useEffect(function () {
240
212
  if (!open) {
241
213
  setRangeSelection({});
242
- // Reset the view to options if there are options available
243
214
  if (options) {
244
215
  setCurrentView('options');
245
216
  }
246
217
  }
247
- else if (value) {
248
- if (isRangeSelection && value.includes('-')) {
249
- // Parse range selection
250
- var _a = parseDateRange(value, dateFormat, showTimeInput ? timeFormat : undefined), from = _a.from, to = _a.to;
251
- if (from) {
252
- // Extract time components for range start
253
- var _b = extractTimeComponents(from), h = _b.hours, m = _b.minutes, s = _b.seconds;
254
- setHours(h);
255
- setMinutes(m);
256
- setSeconds(s);
218
+ }, [open, options]);
219
+ // Parse and set single date selection when value changes
220
+ React.useEffect(function () {
221
+ if (!value || isRangeSelection || !open)
222
+ return;
223
+ var formatString = showTimeInput ? "".concat(dateFormat, " ").concat(timeFormat) : dateFormat;
224
+ var date = parseDate(value, formatString);
225
+ if (date) {
226
+ setRangeSelection({ from: date });
227
+ if (showTimeInput) {
228
+ var timeComponents = extractTimeComponents(date);
229
+ setStartTime(timeComponents);
230
+ }
231
+ }
232
+ }, [open, value, isRangeSelection, dateFormat, timeFormat, showTimeInput]);
233
+ // Parse and set range selection when value changes
234
+ React.useEffect(function () {
235
+ if (!open || !value || !isRangeSelection || !value.includes('-'))
236
+ return;
237
+ var _a = parseDateRange(value, dateFormat, showTimeInput ? timeFormat : undefined), from = _a.from, to = _a.to;
238
+ if (from && to) {
239
+ setRangeSelection({ from: from, to: to });
240
+ var startTimeComponents = extractTimeComponents(from);
241
+ setStartTime(startTimeComponents);
242
+ var endTimeComponents = extractTimeComponents(to);
243
+ setEndTime(endTimeComponents);
244
+ }
245
+ }, [open, value, isRangeSelection, dateFormat, timeFormat, showTimeInput]);
246
+ React.useEffect(function () {
247
+ if (open && showTimeInput && currentView === 'calendar') {
248
+ shouldAutoFocusTimeInput.current = true;
249
+ }
250
+ }, [open, showTimeInput, currentView]);
251
+ var handleCalendarSelect = function (selection) {
252
+ if (!selection)
253
+ return;
254
+ if (!isRangeSelection) {
255
+ var selectedDate = void 0;
256
+ if (selection.from && !selection.to) {
257
+ selectedDate = selection.from;
258
+ }
259
+ else if (selection.from && selection.to) {
260
+ var previousDate = rangeSelection.from;
261
+ if (previousDate && previousDate.getTime() === selection.from.getTime()) {
262
+ selectedDate = selection.to;
257
263
  }
258
- if (to) {
259
- // Extract time components for range end
260
- var _c = extractTimeComponents(to), h = _c.hours, m = _c.minutes, s = _c.seconds;
261
- setEndHours(h);
262
- setEndMinutes(m);
263
- setEndSeconds(s);
264
+ else if (previousDate && selection.to && previousDate.getTime() === selection.to.getTime()) {
265
+ selectedDate = selection.from;
264
266
  }
265
- if (from && to) {
266
- setRangeSelection({ from: from, to: to });
267
+ else {
268
+ selectedDate = selection.to;
267
269
  }
268
270
  }
269
- else if (!isRangeSelection) {
270
- // For single date, try to parse with time format first if showTimeInput is enabled
271
- var formatString = showTimeInput ? "".concat(dateFormat, " ").concat(timeFormat) : dateFormat;
272
- var date = parseDate(value, formatString);
273
- if (date) {
274
- setRangeSelection({ from: date });
275
- if (showTimeInput) {
276
- // Extract time components
277
- var _d = extractTimeComponents(date), h = _d.hours, m = _d.minutes, s = _d.seconds;
278
- setHours(h);
279
- setMinutes(m);
280
- setSeconds(s);
281
- }
271
+ // Apply the selected date if found
272
+ if (selectedDate) {
273
+ if (showTimeInput) {
274
+ var newDate = applyTimeToDate(selectedDate, startTime);
275
+ setRangeSelection({ from: newDate });
276
+ }
277
+ else {
278
+ setRangeSelection({ from: selectedDate });
279
+ applySelection(selectedDate);
282
280
  }
283
281
  }
282
+ return;
284
283
  }
285
- }, [open, value, isRangeSelection, dateFormat, timeFormat, options, showTimeInput]);
286
- // Handle calendar selections
287
- var handleCalendarSelect = function (selection) {
288
- if (!selection)
284
+ // Handle range selection mode - with early returns to reduce nesting
285
+ if (!selection.from)
289
286
  return;
290
- // Keep the time values when date changes
291
- if (selection.from && !selection.to) {
292
- // Single date or range start
287
+ if (!selection.to) {
293
288
  if (showTimeInput) {
294
- var newFrom = applyTimeToDate(selection.from, { hours: hours, minutes: minutes, seconds: seconds });
289
+ var newFrom = applyTimeToDate(selection.from, startTime);
295
290
  setRangeSelection({ from: newFrom });
296
291
  }
297
292
  else {
298
293
  setRangeSelection({ from: selection.from });
299
294
  }
295
+ return;
300
296
  }
301
- else if (selection.from && selection.to) {
302
- // Range selection
303
- if (showTimeInput) {
304
- var newFrom = applyTimeToDate(selection.from, { hours: hours, minutes: minutes, seconds: seconds });
305
- var newTo = applyTimeToDate(selection.to, { hours: endHours, minutes: endMinutes, seconds: endSeconds });
306
- setRangeSelection({ from: newFrom, to: newTo });
307
- }
308
- else {
309
- setRangeSelection(selection);
310
- }
297
+ if (showTimeInput) {
298
+ var newFrom = applyTimeToDate(selection.from, startTime);
299
+ var newTo = applyTimeToDate(selection.to, endTime);
300
+ setRangeSelection({ from: newFrom, to: newTo });
311
301
  }
312
- // Only auto-apply selection for non-range selection mode and when not showing time input
313
- if (!isRangeSelection && !showTimeInput) {
314
- applySelection(selection.from);
302
+ else {
303
+ setRangeSelection(selection);
315
304
  }
316
- // For range selection or time input, we'll wait for user to click Apply
317
305
  };
318
- var handleTimeChange = function (value, setter, max) {
319
- var numValue = value.replace(/\D/g, '');
320
- var parsed = parseInt(numValue, 10);
321
- if (!isNaN(parsed) && parsed >= 0 && parsed <= max) {
322
- setter(parsed.toString().padStart(2, '0'));
323
- }
324
- else if (value === '') {
325
- setter('00');
326
- }
327
- updateDateWithTime();
306
+ var handleStartTimeChange = function (time) {
307
+ setStartTime(time);
308
+ updateDateWithTime(time, endTime);
328
309
  };
329
- var updateDateWithTime = function () {
310
+ var handleEndTimeChange = function (time) {
311
+ setEndTime(time);
312
+ updateDateWithTime(startTime, time);
313
+ };
314
+ var handleTimeClear = function () {
315
+ shouldAutoFocusTimeInput.current = true;
316
+ };
317
+ var updateDateWithTime = function (startTimeValue, endTimeValue) {
330
318
  if (!rangeSelection.from)
331
319
  return;
332
- var newFrom = applyTimeToDate(rangeSelection.from, { hours: hours, minutes: minutes, seconds: seconds });
320
+ var newFrom = applyTimeToDate(rangeSelection.from, startTimeValue);
333
321
  if (isRangeSelection && rangeSelection.to) {
334
- var newTo = applyTimeToDate(rangeSelection.to, {
335
- hours: endHours,
336
- minutes: endMinutes,
337
- seconds: endSeconds,
338
- });
322
+ var newTo = applyTimeToDate(rangeSelection.to, endTimeValue);
339
323
  setRangeSelection({ from: newFrom, to: newTo });
340
324
  }
341
325
  else {
@@ -355,9 +339,16 @@ export var DatePickerPopover = React.forwardRef(function (props, ref) {
355
339
  var formatString = showTimeInput ? "".concat(dateFormat, " ").concat(timeFormat) : dateFormat;
356
340
  var formattedDate = formatDate(dateToFormat, formatString);
357
341
  onDateSelect(formattedDate, true);
342
+ onClose();
358
343
  }
359
344
  }
360
345
  };
346
+ var clearSelection = function () {
347
+ setRangeSelection({});
348
+ setStartTime({ hours: '00', minutes: '00', seconds: '00' });
349
+ setEndTime({ hours: '00', minutes: '00', seconds: '00' });
350
+ onDateSelect('', true);
351
+ };
361
352
  var cancelSelection = function () {
362
353
  if (options) {
363
354
  setCurrentView('options');
@@ -381,13 +372,12 @@ export var DatePickerPopover = React.forwardRef(function (props, ref) {
381
372
  var formatString = showTimeInput ? "".concat(dateFormat, " ").concat(timeFormat) : dateFormat;
382
373
  var parsedDate = parseDate(value, formatString);
383
374
  if (parsedDate) {
384
- selectedValue = parsedDate;
375
+ selectedValue = { from: parsedDate };
385
376
  }
386
377
  }
387
- // Determine if we should show the action buttons - now for both range selection and time input
388
378
  var showActionButtons = isRangeSelection || showTimeInput;
389
- var canApply = isRangeSelection ? rangeSelection.from && rangeSelection.to : !!rangeSelection.from;
390
- var _p = __read(React.useState(null), 2), inputWidth = _p[0], setInputWidth = _p[1];
379
+ var canApplyDate = isRangeSelection ? rangeSelection.from && rangeSelection.to : !!rangeSelection.from;
380
+ var _k = __read(React.useState(null), 2), inputWidth = _k[0], setInputWidth = _k[1];
391
381
  React.useEffect(function () {
392
382
  if (open && anchorEl) {
393
383
  var width = anchorEl.getBoundingClientRect().width;
@@ -404,26 +394,13 @@ export var DatePickerPopover = React.forwardRef(function (props, ref) {
404
394
  }, transformOrigin: {
405
395
  vertical: 'top',
406
396
  horizontal: 'left',
407
- }, marginThreshold: 30, style: { marginTop: '-24px' } }, PopoverProps, rootProps),
397
+ }, marginThreshold: 0, style: { marginTop: '-24px' } }, PopoverProps, rootProps),
408
398
  React.createElement(Content, { className: classes.content, ownerState: __assign(__assign({}, ownerState), { inputWidth: inputWidth, currentView: currentView }) }, currentView === 'options' && options ? (React.createElement(DropdownMenuList, null, options.map(function (option, index) { return (React.createElement(DropdownMenuListItem, { key: index, title: option.text, selected: option.value === value, onClick: function () { return handleOptionSelect(option.value); } })); }))) : (React.createElement(React.Fragment, null,
409
399
  React.createElement(CalendarWrapper, { className: classes.calendarWrapper },
410
- React.createElement(DayPicker, { mode: "range", selected: selectedValue, onSelect: handleCalendarSelect, showOutsideDays: true, numberOfMonths: showTwoMonths ? 2 : 1, pagedNavigation: showTwoMonths })),
411
- showTimeInput && (React.createElement(React.Fragment, null,
412
- React.createElement(TimeInputContainer, null,
413
- React.createElement(TimeInputLabel, null, "Time:"),
414
- React.createElement(TimeInput, { size: "small", value: hours, onChange: function (e) { return handleTimeChange(e.target.value, setHours, 23); }, placeholder: "HH" }),
415
- React.createElement("span", null, ":"),
416
- React.createElement(TimeInput, { size: "small", value: minutes, onChange: function (e) { return handleTimeChange(e.target.value, setMinutes, 59); }, placeholder: "MM" }),
417
- React.createElement("span", null, ":"),
418
- React.createElement(TimeInput, { size: "small", value: seconds, onChange: function (e) { return handleTimeChange(e.target.value, setSeconds, 59); }, placeholder: "SS" }),
419
- isRangeSelection && (React.createElement(EndTimeInputContainer, null,
420
- React.createElement(TimeInputLabel, null, "End Time:"),
421
- React.createElement(TimeInput, { size: "small", value: endHours, onChange: function (e) { return handleTimeChange(e.target.value, setEndHours, 23); }, placeholder: "HH" }),
422
- React.createElement("span", null, ":"),
423
- React.createElement(TimeInput, { size: "small", value: endMinutes, onChange: function (e) { return handleTimeChange(e.target.value, setEndMinutes, 59); }, placeholder: "MM" }),
424
- React.createElement("span", null, ":"),
425
- React.createElement(TimeInput, { size: "small", value: endSeconds, onChange: function (e) { return handleTimeChange(e.target.value, setEndSeconds, 59); }, placeholder: "SS" })))))),
400
+ React.createElement(DayPicker, { mode: "range", selected: selectedValue, onSelect: handleCalendarSelect, showOutsideDays: true, numberOfMonths: showTwoMonths ? 2 : 1, pagedNavigation: showTwoMonths, disabled: __spreadArray(__spreadArray([], __read((minDate ? [{ before: new Date(minDate) }] : [])), false), __read((maxDate ? [{ after: new Date(maxDate) }] : [])), false) })),
401
+ showTimeInput && (React.createElement(DatePickerTimeInput, { startTime: startTime, endTime: endTime, isRangeSelection: isRangeSelection, onStartTimeChange: handleStartTimeChange, onEndTimeChange: handleEndTimeChange, onClear: handleTimeClear })),
426
402
  showActionButtons && (React.createElement(ButtonContainer, { className: classes.buttonContainer },
403
+ React.createElement(Button, { size: "small", variant: "link", onClick: clearSelection, style: { marginRight: 'auto' } }, "Clear"),
427
404
  React.createElement(Button, { size: "small", variant: "outlined", onClick: cancelSelection, style: { marginRight: 8 } }, "Cancel"),
428
- React.createElement(Button, { size: "small", variant: "contained", color: "primary", onClick: function () { return applySelection(); }, disabled: !canApply }, "Apply"))))))));
405
+ React.createElement(Button, { size: "small", variant: "contained", color: "primary", onClick: function () { return applySelection(); }, disabled: !canApplyDate }, "Apply"))))))));
429
406
  });