@auth0/quantum-product 2.5.9 → 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.
Files changed (39) hide show
  1. package/breadcrumbs/breadcrumbs-item/breadcrumbs-item.js +2 -2
  2. package/button/button.d.ts +1 -0
  3. package/button/button.js +2 -2
  4. package/card/card.d.ts +1 -0
  5. package/card/card.js +2 -2
  6. package/chip/chip.d.ts +1 -0
  7. package/chip/chip.js +2 -2
  8. package/date-picker/date-picker-context.d.ts +2 -0
  9. package/date-picker/date-picker-context.js +2 -0
  10. package/date-picker/date-picker-popover.js +114 -137
  11. package/date-picker/date-picker-time-input.d.ts +21 -0
  12. package/date-picker/date-picker-time-input.js +362 -0
  13. package/date-picker/date-picker-types.d.ts +4 -0
  14. package/date-picker/date-picker.js +4 -2
  15. package/esm/breadcrumbs/breadcrumbs-item/breadcrumbs-item.js +2 -2
  16. package/esm/button/button.js +2 -2
  17. package/esm/card/card.js +2 -2
  18. package/esm/chip/chip.js +2 -2
  19. package/esm/date-picker/date-picker-context.js +2 -0
  20. package/esm/date-picker/date-picker-popover.js +114 -137
  21. package/esm/date-picker/date-picker-time-input.js +336 -0
  22. package/esm/date-picker/date-picker.js +4 -2
  23. package/esm/icon-button/icon-button.js +2 -2
  24. package/esm/link/link.js +2 -2
  25. package/esm/panel/panel/panel-classes.js +1 -0
  26. package/esm/panel/panel/panel.js +1 -0
  27. package/esm/tabs/tab/tab.js +2 -2
  28. package/icon-button/icon-button.d.ts +1 -0
  29. package/icon-button/icon-button.js +2 -2
  30. package/link/link.d.ts +4 -0
  31. package/link/link.js +2 -2
  32. package/package.json +1 -1
  33. package/panel/panel/panel-classes.d.ts +1 -1
  34. package/panel/panel/panel-classes.js +1 -0
  35. package/panel/panel/panel.d.ts +1 -1
  36. package/panel/panel/panel.js +1 -0
  37. package/panel/panel-context.d.ts +1 -1
  38. package/tabs/tab/tab.d.ts +1 -0
  39. package/tabs/tab/tab.js +2 -2
@@ -95,9 +95,9 @@ var EndIcon = (0, styled_1.styled)('span', {
95
95
  });
96
96
  });
97
97
  exports.BreadcrumbsItem = React.forwardRef(function (props, ref) {
98
- var label = props.label, startIcon = props.startIcon, endIcon = props.endIcon, className = props.className, isCurrent = props.isCurrent, children = props.children, propClasses = props.classes, rootProps = __rest(props, ["label", "startIcon", "endIcon", "className", "isCurrent", "children", "classes"]);
98
+ var label = props.label, startIcon = props.startIcon, endIcon = props.endIcon, className = props.className, isCurrent = props.isCurrent, children = props.children, propClasses = props.classes, analyticsId = props.analyticsId, rootProps = __rest(props, ["label", "startIcon", "endIcon", "className", "isCurrent", "children", "classes", "analyticsId"]);
99
99
  var classes = (0, classes_1.useMergedClasses)(breadcrumbs_item_classes_1.breadcrumbsItemClasses, breadcrumbs_item_classes_1.getBreadcrumbsItemUtilityClass, propClasses);
100
- return (React.createElement(Root, __assign({ variant: "subtitle2", color: isCurrent ? 'textPrimary' : 'textSecondary', className: (0, clsx_1.default)(classes.root, isCurrent && classes.current, className), "aria-current": isCurrent ? 'page' : undefined, ref: ref }, rootProps),
100
+ return (React.createElement(Root, __assign({ variant: "subtitle2", color: isCurrent ? 'textPrimary' : 'textSecondary', className: (0, clsx_1.default)(classes.root, isCurrent && classes.current, className), "aria-current": isCurrent ? 'page' : undefined, ref: ref, analyticsId: analyticsId }, rootProps),
101
101
  !!startIcon && React.createElement(StartIcon, { className: (0, clsx_1.default)(classes.icon, classes.startIcon) }, startIcon),
102
102
  React.createElement("span", { className: classes.label }, label || children),
103
103
  !!endIcon && React.createElement(EndIcon, { className: (0, clsx_1.default)(classes.icon, classes.endIcon) }, endIcon)));
@@ -14,6 +14,7 @@ export interface IButtonTypeMap<P = {}, D extends React.ElementType = 'button'>
14
14
  label?: React.ReactNode;
15
15
  SpinnerProps?: Partial<ISpinnerProps>;
16
16
  maxWidth?: string;
17
+ analyticsId?: string;
17
18
  };
18
19
  defaultComponent: D;
19
20
  }
package/button/button.js CHANGED
@@ -86,14 +86,14 @@ var LabelSpan = (0, styled_1.styled)('span')(function (_a) {
86
86
  });
87
87
  });
88
88
  exports.Button = React.forwardRef(function (_a, ref) {
89
- var isLoading = _a.isLoading, label = _a.label, children = _a.children, disabled = _a.disabled, _b = _a.SpinnerProps, SpinnerProps = _b === void 0 ? {} : _b, _c = _a.color, color = _c === void 0 ? 'default' : _c, variant = _a.variant, maxWidth = _a.maxWidth, rootProps = __rest(_a, ["isLoading", "label", "children", "disabled", "SpinnerProps", "color", "variant", "maxWidth"]);
89
+ var isLoading = _a.isLoading, label = _a.label, children = _a.children, disabled = _a.disabled, _b = _a.SpinnerProps, SpinnerProps = _b === void 0 ? {} : _b, _c = _a.color, color = _c === void 0 ? 'default' : _c, variant = _a.variant, maxWidth = _a.maxWidth, analyticsId = _a.analyticsId, rootProps = __rest(_a, ["isLoading", "label", "children", "disabled", "SpinnerProps", "color", "variant", "maxWidth", "analyticsId"]);
90
90
  var title = label ||
91
91
  (typeof children === 'string'
92
92
  ? children
93
93
  : React.Children.toArray(children)
94
94
  .filter(function (child) { return typeof child === 'string'; })
95
95
  .join(''));
96
- return (React.createElement(Root, __assign({}, rootProps, { disabled: disabled || isLoading, ownerState: { isLoading: isLoading }, color: color, variant: variant, ref: ref, title: String(title) }),
96
+ return (React.createElement(Root, __assign({}, rootProps, { disabled: disabled || isLoading, ownerState: { isLoading: isLoading }, color: color, variant: variant, ref: ref, title: String(title) }, (analyticsId && { 'data-analytics-id': analyticsId })),
97
97
  React.createElement(LabelSpan, { style: { maxWidth: rootProps.fullWidth ? 'none' : maxWidth || '100%' } }, label || children),
98
98
  ' ',
99
99
  !!isLoading && React.createElement(ButtonSpinner, __assign({}, SpinnerProps))));
package/card/card.d.ts CHANGED
@@ -17,6 +17,7 @@ export interface ICardTypeMap<P = {}, D extends React.ElementType = 'div'> {
17
17
  * @default outlined
18
18
  */
19
19
  variant?: PaperProps['variant'];
20
+ analyticsId?: string;
20
21
  };
21
22
  defaultComponent: D;
22
23
  }
package/card/card.js CHANGED
@@ -121,7 +121,7 @@ var Root = (0, styled_1.styled)(Card_1.default, {
121
121
  exports.Card = React.forwardRef(function (props, ref) {
122
122
  var button = props.button, _a = props.component, component = _a === void 0 ? 'div' : _a, disabled = props.disabled, className = props.className, selected = props.selected, selectableButton = props.selectableButton, _b = props.size, size = _b === void 0 ? 'large' : _b,
123
123
  // remove to prevent passing through to the root
124
- propClasses = props.classes, rootProps = __rest(props, ["button", "component", "disabled", "className", "selected", "selectableButton", "size", "classes"]);
124
+ propClasses = props.classes, analyticsId = props.analyticsId, rootProps = __rest(props, ["button", "component", "disabled", "className", "selected", "selectableButton", "size", "classes", "analyticsId"]);
125
125
  return (React.createElement(card_context_1.CardContext.Provider, { value: { size: size } },
126
126
  React.createElement(Root, __assign({}, { component: component }, { ownerState: {
127
127
  size: size,
@@ -129,5 +129,5 @@ exports.Card = React.forwardRef(function (props, ref) {
129
129
  selectableButton: selectableButton,
130
130
  button: button,
131
131
  selected: selected,
132
- } }, rootProps, { className: className, role: button ? 'button' : undefined, tabIndex: button && !disabled ? 0 : undefined, "aria-disabled": disabled, ref: ref }))));
132
+ } }, (analyticsId && { 'data-analytics-id': analyticsId }), rootProps, { className: className, role: button ? 'button' : undefined, tabIndex: button && !disabled ? 0 : undefined, "aria-disabled": disabled, ref: ref }))));
133
133
  });
package/chip/chip.d.ts CHANGED
@@ -3,5 +3,6 @@ import { ChipProps } from '@mui/material/Chip';
3
3
  export declare const chipComponentName: "QuantumChip";
4
4
  export interface IChipProps extends Omit<ChipProps, 'color' | 'variant'> {
5
5
  selected?: boolean;
6
+ analyticsId?: string;
6
7
  }
7
8
  export declare const Chip: React.ForwardRefExoticComponent<Omit<IChipProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
package/chip/chip.js CHANGED
@@ -81,6 +81,6 @@ var Root = (0, styled_1.styled)(Chip_1.default, { name: exports.chipComponentNam
81
81
  _b))));
82
82
  });
83
83
  exports.Chip = React.forwardRef(function (props, ref) {
84
- var selected = props.selected, _a = props.deleteIcon, deleteIcon = _a === void 0 ? React.createElement(icon_1.XIcon, null) : _a, chipProps = __rest(props, ["selected", "deleteIcon"]);
85
- return (React.createElement(Root, __assign({ ref: ref, deleteIcon: deleteIcon, ownerState: { selected: selected } }, chipProps, { title: props === null || props === void 0 ? void 0 : props.label })));
84
+ var selected = props.selected, _a = props.deleteIcon, deleteIcon = _a === void 0 ? React.createElement(icon_1.XIcon, null) : _a, analyticsId = props.analyticsId, chipProps = __rest(props, ["selected", "deleteIcon", "analyticsId"]);
85
+ return (React.createElement(Root, __assign({ ref: ref, deleteIcon: deleteIcon, ownerState: { selected: selected } }, (analyticsId && { 'data-analytics-id': analyticsId }), chipProps, { title: props === null || props === void 0 ? void 0 : props.label })));
86
86
  });
@@ -2,6 +2,8 @@ import * as React from 'react';
2
2
  export interface IDatePickerContextValue {
3
3
  dateFormat: string;
4
4
  timeFormat?: string;
5
+ minDate?: string | number | Date;
6
+ maxDate?: string | number | Date;
5
7
  onSelectDate(date: string, shouldClose?: boolean): void;
6
8
  isRangeSelection?: boolean;
7
9
  showTimeInput?: boolean;
@@ -28,6 +28,8 @@ var React = __importStar(require("react"));
28
28
  exports.DatePickerContext = React.createContext({
29
29
  dateFormat: 'MM/dd/yyyy',
30
30
  timeFormat: 'HH:mm:ss',
31
+ minDate: undefined,
32
+ maxDate: undefined,
31
33
  onSelectDate: function () { return undefined; },
32
34
  isRangeSelection: false,
33
35
  showTimeInput: false,
@@ -60,6 +60,15 @@ var __read = (this && this.__read) || function (o, n) {
60
60
  }
61
61
  return ar;
62
62
  };
63
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
64
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
65
+ if (ar || !(i in from)) {
66
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
67
+ ar[i] = from[i];
68
+ }
69
+ }
70
+ return to.concat(ar || Array.prototype.slice.call(from));
71
+ };
63
72
  var __importDefault = (this && this.__importDefault) || function (mod) {
64
73
  return (mod && mod.__esModule) ? mod : { "default": mod };
65
74
  };
@@ -75,9 +84,9 @@ var dropdown_menu_1 = require("../dropdown-menu");
75
84
  var popover_1 = require("../popover");
76
85
  var styled_1 = require("../styled");
77
86
  var classes_1 = require("../styles/classes");
78
- var text_field_1 = require("../text-field");
79
87
  var clsx_1 = __importDefault(require("../utils/clsx"));
80
88
  var date_picker_classes_1 = require("./date-picker-classes");
89
+ var date_picker_time_input_1 = require("./date-picker-time-input");
81
90
  var date_picker_utils_1 = require("./date-picker-utils");
82
91
  var Root = (0, styled_1.styled)(popover_1.Popover, { name: date_picker_classes_1.datePickerPopoverComponentName, slot: 'Root' })(function (_a) {
83
92
  var theme = _a.theme;
@@ -171,6 +180,7 @@ var CalendarWrapper = (0, styled_1.styled)('div', { name: date_picker_classes_1.
171
180
  '.rdp-day_button': {
172
181
  width: theme.spacing(4),
173
182
  height: theme.spacing(4),
183
+ borderRadius: theme.spacing(0.5),
174
184
  },
175
185
  '.rdp-range_start .rdp-day_button': {
176
186
  backgroundColor: theme.tokens.color_bg_button_primary,
@@ -218,153 +228,127 @@ var ButtonContainer = (0, styled_1.styled)(box_1.Box, { name: date_picker_classe
218
228
  borderTop: "1px solid ".concat(theme.tokens.color_border_default),
219
229
  });
220
230
  });
221
- var TimeInputContainer = (0, styled_1.styled)('div', { name: date_picker_classes_1.datePickerPopoverComponentName, slot: 'TimeInput' })(function (_a) {
222
- var theme = _a.theme;
223
- return ({
224
- display: 'flex',
225
- justifyContent: 'flex-start',
226
- gap: theme.spacing(0.5),
227
- padding: theme.spacing(1),
228
- alignItems: 'center',
229
- borderTop: "1px solid ".concat(theme.tokens.color_border_default),
230
- });
231
- });
232
- var EndTimeInputContainer = (0, styled_1.styled)('div', { name: date_picker_classes_1.datePickerPopoverComponentName, slot: 'EndTimeInput' })(function (_a) {
233
- var theme = _a.theme;
234
- return ({
235
- display: 'flex',
236
- justifyContent: 'flex-start',
237
- gap: theme.spacing(0.5),
238
- alignItems: 'center',
239
- marginLeft: theme.spacing(2),
240
- });
241
- });
242
- var TimeInput = (0, styled_1.styled)(text_field_1.TextField, { name: date_picker_classes_1.datePickerPopoverComponentName, slot: 'TimeInputField' })({
243
- width: '3rem',
244
- });
245
- var TimeInputLabel = (0, styled_1.styled)('span', { name: date_picker_classes_1.datePickerPopoverComponentName, slot: 'TimeInputLabel' })(function (_a) {
246
- var theme = _a.theme;
247
- return ({
248
- color: theme.tokens.color_fg_default,
249
- fontSize: theme.typography.caption.fontSize,
250
- });
251
- });
252
231
  exports.DatePickerPopover = React.forwardRef(function (props, ref) {
253
- 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"]);
232
+ 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"]);
254
233
  var classes = (0, classes_1.useMergedClasses)(date_picker_classes_1.datePickerPopoverClasses, date_picker_classes_1.getDatePickerPopoverUtilityClass, propClasses);
255
- // State to track the current view: 'options' or 'calendar'
256
234
  var _f = __read(React.useState(options ? 'options' : 'calendar'), 2), currentView = _f[0], setCurrentView = _f[1];
257
- // State to track the current range selection
258
235
  var _g = __read(React.useState({}), 2), rangeSelection = _g[0], setRangeSelection = _g[1];
259
- // Time state for single date or range start/end
260
- var _h = __read(React.useState('00'), 2), hours = _h[0], setHours = _h[1];
261
- var _j = __read(React.useState('00'), 2), minutes = _j[0], setMinutes = _j[1];
262
- var _k = __read(React.useState('00'), 2), seconds = _k[0], setSeconds = _k[1];
263
- // For range selection - end time
264
- var _l = __read(React.useState('00'), 2), endHours = _l[0], setEndHours = _l[1];
265
- var _m = __read(React.useState('00'), 2), endMinutes = _m[0], setEndMinutes = _m[1];
266
- var _o = __read(React.useState('00'), 2), endSeconds = _o[0], setEndSeconds = _o[1];
267
- // Reset selection and view when popover opens/closes
236
+ var _h = __read(React.useState({ hours: '00', minutes: '00', seconds: '00' }), 2), startTime = _h[0], setStartTime = _h[1];
237
+ var _j = __read(React.useState({ hours: '00', minutes: '00', seconds: '00' }), 2), endTime = _j[0], setEndTime = _j[1];
238
+ var shouldAutoFocusTimeInput = React.useRef(false);
239
+ // Reset state when popover closes
268
240
  React.useEffect(function () {
269
241
  if (!open) {
270
242
  setRangeSelection({});
271
- // Reset the view to options if there are options available
272
243
  if (options) {
273
244
  setCurrentView('options');
274
245
  }
275
246
  }
276
- else if (value) {
277
- if (isRangeSelection && value.includes('-')) {
278
- // Parse range selection
279
- var _a = (0, date_picker_utils_1.parseDateRange)(value, dateFormat, showTimeInput ? timeFormat : undefined), from = _a.from, to = _a.to;
280
- if (from) {
281
- // Extract time components for range start
282
- var _b = (0, date_picker_utils_1.extractTimeComponents)(from), h = _b.hours, m = _b.minutes, s = _b.seconds;
283
- setHours(h);
284
- setMinutes(m);
285
- setSeconds(s);
247
+ }, [open, options]);
248
+ // Parse and set single date selection when value changes
249
+ React.useEffect(function () {
250
+ if (!value || isRangeSelection || !open)
251
+ return;
252
+ var formatString = showTimeInput ? "".concat(dateFormat, " ").concat(timeFormat) : dateFormat;
253
+ var date = (0, date_picker_utils_1.parseDate)(value, formatString);
254
+ if (date) {
255
+ setRangeSelection({ from: date });
256
+ if (showTimeInput) {
257
+ var timeComponents = (0, date_picker_utils_1.extractTimeComponents)(date);
258
+ setStartTime(timeComponents);
259
+ }
260
+ }
261
+ }, [open, value, isRangeSelection, dateFormat, timeFormat, showTimeInput]);
262
+ // Parse and set range selection when value changes
263
+ React.useEffect(function () {
264
+ if (!open || !value || !isRangeSelection || !value.includes('-'))
265
+ return;
266
+ var _a = (0, date_picker_utils_1.parseDateRange)(value, dateFormat, showTimeInput ? timeFormat : undefined), from = _a.from, to = _a.to;
267
+ if (from && to) {
268
+ setRangeSelection({ from: from, to: to });
269
+ var startTimeComponents = (0, date_picker_utils_1.extractTimeComponents)(from);
270
+ setStartTime(startTimeComponents);
271
+ var endTimeComponents = (0, date_picker_utils_1.extractTimeComponents)(to);
272
+ setEndTime(endTimeComponents);
273
+ }
274
+ }, [open, value, isRangeSelection, dateFormat, timeFormat, showTimeInput]);
275
+ React.useEffect(function () {
276
+ if (open && showTimeInput && currentView === 'calendar') {
277
+ shouldAutoFocusTimeInput.current = true;
278
+ }
279
+ }, [open, showTimeInput, currentView]);
280
+ var handleCalendarSelect = function (selection) {
281
+ if (!selection)
282
+ return;
283
+ if (!isRangeSelection) {
284
+ var selectedDate = void 0;
285
+ if (selection.from && !selection.to) {
286
+ selectedDate = selection.from;
287
+ }
288
+ else if (selection.from && selection.to) {
289
+ var previousDate = rangeSelection.from;
290
+ if (previousDate && previousDate.getTime() === selection.from.getTime()) {
291
+ selectedDate = selection.to;
286
292
  }
287
- if (to) {
288
- // Extract time components for range end
289
- var _c = (0, date_picker_utils_1.extractTimeComponents)(to), h = _c.hours, m = _c.minutes, s = _c.seconds;
290
- setEndHours(h);
291
- setEndMinutes(m);
292
- setEndSeconds(s);
293
+ else if (previousDate && selection.to && previousDate.getTime() === selection.to.getTime()) {
294
+ selectedDate = selection.from;
293
295
  }
294
- if (from && to) {
295
- setRangeSelection({ from: from, to: to });
296
+ else {
297
+ selectedDate = selection.to;
296
298
  }
297
299
  }
298
- else if (!isRangeSelection) {
299
- // For single date, try to parse with time format first if showTimeInput is enabled
300
- var formatString = showTimeInput ? "".concat(dateFormat, " ").concat(timeFormat) : dateFormat;
301
- var date = (0, date_picker_utils_1.parseDate)(value, formatString);
302
- if (date) {
303
- setRangeSelection({ from: date });
304
- if (showTimeInput) {
305
- // Extract time components
306
- var _d = (0, date_picker_utils_1.extractTimeComponents)(date), h = _d.hours, m = _d.minutes, s = _d.seconds;
307
- setHours(h);
308
- setMinutes(m);
309
- setSeconds(s);
310
- }
300
+ // Apply the selected date if found
301
+ if (selectedDate) {
302
+ if (showTimeInput) {
303
+ var newDate = (0, date_picker_utils_1.applyTimeToDate)(selectedDate, startTime);
304
+ setRangeSelection({ from: newDate });
305
+ }
306
+ else {
307
+ setRangeSelection({ from: selectedDate });
308
+ applySelection(selectedDate);
311
309
  }
312
310
  }
311
+ return;
313
312
  }
314
- }, [open, value, isRangeSelection, dateFormat, timeFormat, options, showTimeInput]);
315
- // Handle calendar selections
316
- var handleCalendarSelect = function (selection) {
317
- if (!selection)
313
+ // Handle range selection mode - with early returns to reduce nesting
314
+ if (!selection.from)
318
315
  return;
319
- // Keep the time values when date changes
320
- if (selection.from && !selection.to) {
321
- // Single date or range start
316
+ if (!selection.to) {
322
317
  if (showTimeInput) {
323
- var newFrom = (0, date_picker_utils_1.applyTimeToDate)(selection.from, { hours: hours, minutes: minutes, seconds: seconds });
318
+ var newFrom = (0, date_picker_utils_1.applyTimeToDate)(selection.from, startTime);
324
319
  setRangeSelection({ from: newFrom });
325
320
  }
326
321
  else {
327
322
  setRangeSelection({ from: selection.from });
328
323
  }
324
+ return;
329
325
  }
330
- else if (selection.from && selection.to) {
331
- // Range selection
332
- if (showTimeInput) {
333
- var newFrom = (0, date_picker_utils_1.applyTimeToDate)(selection.from, { hours: hours, minutes: minutes, seconds: seconds });
334
- var newTo = (0, date_picker_utils_1.applyTimeToDate)(selection.to, { hours: endHours, minutes: endMinutes, seconds: endSeconds });
335
- setRangeSelection({ from: newFrom, to: newTo });
336
- }
337
- else {
338
- setRangeSelection(selection);
339
- }
326
+ if (showTimeInput) {
327
+ var newFrom = (0, date_picker_utils_1.applyTimeToDate)(selection.from, startTime);
328
+ var newTo = (0, date_picker_utils_1.applyTimeToDate)(selection.to, endTime);
329
+ setRangeSelection({ from: newFrom, to: newTo });
340
330
  }
341
- // Only auto-apply selection for non-range selection mode and when not showing time input
342
- if (!isRangeSelection && !showTimeInput) {
343
- applySelection(selection.from);
331
+ else {
332
+ setRangeSelection(selection);
344
333
  }
345
- // For range selection or time input, we'll wait for user to click Apply
346
334
  };
347
- var handleTimeChange = function (value, setter, max) {
348
- var numValue = value.replace(/\D/g, '');
349
- var parsed = parseInt(numValue, 10);
350
- if (!isNaN(parsed) && parsed >= 0 && parsed <= max) {
351
- setter(parsed.toString().padStart(2, '0'));
352
- }
353
- else if (value === '') {
354
- setter('00');
355
- }
356
- updateDateWithTime();
335
+ var handleStartTimeChange = function (time) {
336
+ setStartTime(time);
337
+ updateDateWithTime(time, endTime);
357
338
  };
358
- var updateDateWithTime = function () {
339
+ var handleEndTimeChange = function (time) {
340
+ setEndTime(time);
341
+ updateDateWithTime(startTime, time);
342
+ };
343
+ var handleTimeClear = function () {
344
+ shouldAutoFocusTimeInput.current = true;
345
+ };
346
+ var updateDateWithTime = function (startTimeValue, endTimeValue) {
359
347
  if (!rangeSelection.from)
360
348
  return;
361
- var newFrom = (0, date_picker_utils_1.applyTimeToDate)(rangeSelection.from, { hours: hours, minutes: minutes, seconds: seconds });
349
+ var newFrom = (0, date_picker_utils_1.applyTimeToDate)(rangeSelection.from, startTimeValue);
362
350
  if (isRangeSelection && rangeSelection.to) {
363
- var newTo = (0, date_picker_utils_1.applyTimeToDate)(rangeSelection.to, {
364
- hours: endHours,
365
- minutes: endMinutes,
366
- seconds: endSeconds,
367
- });
351
+ var newTo = (0, date_picker_utils_1.applyTimeToDate)(rangeSelection.to, endTimeValue);
368
352
  setRangeSelection({ from: newFrom, to: newTo });
369
353
  }
370
354
  else {
@@ -384,9 +368,16 @@ exports.DatePickerPopover = React.forwardRef(function (props, ref) {
384
368
  var formatString = showTimeInput ? "".concat(dateFormat, " ").concat(timeFormat) : dateFormat;
385
369
  var formattedDate = (0, date_picker_utils_1.formatDate)(dateToFormat, formatString);
386
370
  onDateSelect(formattedDate, true);
371
+ onClose();
387
372
  }
388
373
  }
389
374
  };
375
+ var clearSelection = function () {
376
+ setRangeSelection({});
377
+ setStartTime({ hours: '00', minutes: '00', seconds: '00' });
378
+ setEndTime({ hours: '00', minutes: '00', seconds: '00' });
379
+ onDateSelect('', true);
380
+ };
390
381
  var cancelSelection = function () {
391
382
  if (options) {
392
383
  setCurrentView('options');
@@ -410,13 +401,12 @@ exports.DatePickerPopover = React.forwardRef(function (props, ref) {
410
401
  var formatString = showTimeInput ? "".concat(dateFormat, " ").concat(timeFormat) : dateFormat;
411
402
  var parsedDate = (0, date_picker_utils_1.parseDate)(value, formatString);
412
403
  if (parsedDate) {
413
- selectedValue = parsedDate;
404
+ selectedValue = { from: parsedDate };
414
405
  }
415
406
  }
416
- // Determine if we should show the action buttons - now for both range selection and time input
417
407
  var showActionButtons = isRangeSelection || showTimeInput;
418
- var canApply = isRangeSelection ? rangeSelection.from && rangeSelection.to : !!rangeSelection.from;
419
- var _p = __read(React.useState(null), 2), inputWidth = _p[0], setInputWidth = _p[1];
408
+ var canApplyDate = isRangeSelection ? rangeSelection.from && rangeSelection.to : !!rangeSelection.from;
409
+ var _k = __read(React.useState(null), 2), inputWidth = _k[0], setInputWidth = _k[1];
420
410
  React.useEffect(function () {
421
411
  if (open && anchorEl) {
422
412
  var width = anchorEl.getBoundingClientRect().width;
@@ -433,26 +423,13 @@ exports.DatePickerPopover = React.forwardRef(function (props, ref) {
433
423
  }, transformOrigin: {
434
424
  vertical: 'top',
435
425
  horizontal: 'left',
436
- }, marginThreshold: 30, style: { marginTop: '-24px' } }, PopoverProps, rootProps),
426
+ }, marginThreshold: 0, style: { marginTop: '-24px' } }, PopoverProps, rootProps),
437
427
  React.createElement(Content, { className: classes.content, ownerState: __assign(__assign({}, ownerState), { inputWidth: inputWidth, currentView: currentView }) }, currentView === 'options' && options ? (React.createElement(dropdown_menu_1.DropdownMenuList, null, options.map(function (option, index) { return (React.createElement(dropdown_menu_1.DropdownMenuListItem, { key: index, title: option.text, selected: option.value === value, onClick: function () { return handleOptionSelect(option.value); } })); }))) : (React.createElement(React.Fragment, null,
438
428
  React.createElement(CalendarWrapper, { className: classes.calendarWrapper },
439
- React.createElement(react_day_picker_1.DayPicker, { mode: "range", selected: selectedValue, onSelect: handleCalendarSelect, showOutsideDays: true, numberOfMonths: showTwoMonths ? 2 : 1, pagedNavigation: showTwoMonths })),
440
- showTimeInput && (React.createElement(React.Fragment, null,
441
- React.createElement(TimeInputContainer, null,
442
- React.createElement(TimeInputLabel, null, "Time:"),
443
- React.createElement(TimeInput, { size: "small", value: hours, onChange: function (e) { return handleTimeChange(e.target.value, setHours, 23); }, placeholder: "HH" }),
444
- React.createElement("span", null, ":"),
445
- React.createElement(TimeInput, { size: "small", value: minutes, onChange: function (e) { return handleTimeChange(e.target.value, setMinutes, 59); }, placeholder: "MM" }),
446
- React.createElement("span", null, ":"),
447
- React.createElement(TimeInput, { size: "small", value: seconds, onChange: function (e) { return handleTimeChange(e.target.value, setSeconds, 59); }, placeholder: "SS" }),
448
- isRangeSelection && (React.createElement(EndTimeInputContainer, null,
449
- React.createElement(TimeInputLabel, null, "End Time:"),
450
- React.createElement(TimeInput, { size: "small", value: endHours, onChange: function (e) { return handleTimeChange(e.target.value, setEndHours, 23); }, placeholder: "HH" }),
451
- React.createElement("span", null, ":"),
452
- React.createElement(TimeInput, { size: "small", value: endMinutes, onChange: function (e) { return handleTimeChange(e.target.value, setEndMinutes, 59); }, placeholder: "MM" }),
453
- React.createElement("span", null, ":"),
454
- React.createElement(TimeInput, { size: "small", value: endSeconds, onChange: function (e) { return handleTimeChange(e.target.value, setEndSeconds, 59); }, placeholder: "SS" })))))),
429
+ React.createElement(react_day_picker_1.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) })),
430
+ showTimeInput && (React.createElement(date_picker_time_input_1.DatePickerTimeInput, { startTime: startTime, endTime: endTime, isRangeSelection: isRangeSelection, onStartTimeChange: handleStartTimeChange, onEndTimeChange: handleEndTimeChange, onClear: handleTimeClear })),
455
431
  showActionButtons && (React.createElement(ButtonContainer, { className: classes.buttonContainer },
432
+ React.createElement(button_1.Button, { size: "small", variant: "link", onClick: clearSelection, style: { marginRight: 'auto' } }, "Clear"),
456
433
  React.createElement(button_1.Button, { size: "small", variant: "outlined", onClick: cancelSelection, style: { marginRight: 8 } }, "Cancel"),
457
- React.createElement(button_1.Button, { size: "small", variant: "contained", color: "primary", onClick: function () { return applySelection(); }, disabled: !canApply }, "Apply"))))))));
434
+ React.createElement(button_1.Button, { size: "small", variant: "contained", color: "primary", onClick: function () { return applySelection(); }, disabled: !canApplyDate }, "Apply"))))))));
458
435
  });
@@ -0,0 +1,21 @@
1
+ import * as React from 'react';
2
+ export interface ITimeValue {
3
+ hours: string;
4
+ minutes: string;
5
+ seconds: string;
6
+ }
7
+ export interface IDatePickerTimeInputProps {
8
+ /** Start time values */
9
+ startTime: ITimeValue;
10
+ /** End time values (only used when isRangeSelection is true) */
11
+ endTime?: ITimeValue;
12
+ /** Whether this is for range selection (shows both start and end time inputs) */
13
+ isRangeSelection?: boolean;
14
+ /** Called when start time values change */
15
+ onStartTimeChange: (time: ITimeValue) => void;
16
+ /** Called when end time values change (only used when isRangeSelection is true) */
17
+ onEndTimeChange?: (time: ITimeValue) => void;
18
+ /** Called when time values should be cleared */
19
+ onClear?: () => void;
20
+ }
21
+ export declare const DatePickerTimeInput: React.ForwardRefExoticComponent<IDatePickerTimeInputProps & React.RefAttributes<HTMLDivElement>>;