@osdk/react-components 0.12.0 → 0.13.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.
- package/AGENTS.md +4 -0
- package/CHANGELOG.md +11 -0
- package/build/browser/action-form/ActionForm.js +19 -11
- package/build/browser/action-form/ActionForm.js.map +1 -1
- package/build/browser/action-form/ActionFormApi.js.map +1 -1
- package/build/browser/action-form/BaseForm.js +19 -13
- package/build/browser/action-form/BaseForm.js.map +1 -1
- package/build/browser/action-form/BaseForm.module.css +7 -7
- package/build/browser/action-form/FormField.js +5 -2
- package/build/browser/action-form/FormField.js.map +1 -1
- package/build/browser/action-form/FormField.module.css +6 -1
- package/build/browser/action-form/FormField.module.css.js +1 -0
- package/build/browser/action-form/FormFieldApi.js +7 -1
- package/build/browser/action-form/FormFieldApi.js.map +1 -1
- package/build/browser/action-form/FormHeader.module.css +2 -2
- package/build/browser/action-form/fields/DateCalendar.js +41 -3
- package/build/browser/action-form/fields/DateCalendar.js.map +1 -1
- package/build/browser/action-form/fields/DateCalendar.module.css +59 -10
- package/build/browser/action-form/fields/DateCalendar.module.css.js +5 -1
- package/build/browser/action-form/fields/DateRangeCalendar.js +8 -5
- package/build/browser/action-form/fields/DateRangeCalendar.js.map +1 -1
- package/build/browser/action-form/fields/DateRangeInputField.js +76 -61
- package/build/browser/action-form/fields/DateRangeInputField.js.map +1 -1
- package/build/browser/action-form/fields/DateRangeInputField.module.css +0 -15
- package/build/browser/action-form/fields/DateRangeInputField.module.css.js +1 -2
- package/build/browser/action-form/fields/DatetimePickerField.js +74 -40
- package/build/browser/action-form/fields/DatetimePickerField.js.map +1 -1
- package/build/browser/action-form/fields/DatetimePickerField.module.css +2 -9
- package/build/browser/action-form/fields/FieldBridge.js +1 -1
- package/build/browser/action-form/fields/FieldBridge.js.map +1 -1
- package/build/browser/action-form/fields/FilePickerField.js +47 -39
- package/build/browser/action-form/fields/FilePickerField.js.map +1 -1
- package/build/browser/action-form/fields/FilePickerField.module.css +43 -31
- package/build/browser/action-form/fields/FilePickerField.module.css.js +2 -2
- package/build/browser/action-form/fields/FormFieldRenderer.js +9 -0
- package/build/browser/action-form/fields/FormFieldRenderer.js.map +1 -1
- package/build/browser/action-form/fields/RadioButtonsField.module.css +3 -3
- package/build/browser/action-form/fields/SwitchField.js +34 -0
- package/build/browser/action-form/fields/SwitchField.js.map +1 -0
- package/build/browser/action-form/fields/TimePicker.js +165 -26
- package/build/browser/action-form/fields/TimePicker.js.map +1 -1
- package/build/browser/action-form/fields/TimePicker.module.css +27 -2
- package/build/browser/action-form/fields/TimePicker.module.css.js +3 -1
- package/build/browser/action-form/fields/calendarShared.js +5 -0
- package/build/browser/action-form/fields/calendarShared.js.map +1 -1
- package/build/browser/action-form/fields/useDateEditState.js +3 -4
- package/build/browser/action-form/fields/useDateEditState.js.map +1 -1
- package/build/browser/base-components/action-button/ActionButton.js +2 -1
- package/build/browser/base-components/action-button/ActionButton.js.map +1 -1
- package/build/browser/base-components/action-button/ActionButton.module.css +19 -0
- package/build/browser/base-components/action-button/ActionButton.module.css.js +2 -1
- package/build/browser/base-components/combobox/Combobox.module.css +31 -3
- package/build/browser/base-components/select/Select.module.css +18 -0
- package/build/browser/base-components/switch/Switch.module.css +18 -6
- package/build/browser/filter-list/base/inputs/ListogramInput.js +34 -6
- package/build/browser/filter-list/base/inputs/ListogramInput.js.map +1 -1
- package/build/browser/filter-list/base/inputs/ListogramInput.module.css +11 -5
- package/build/browser/filter-list/base/inputs/ListogramInput.module.css.js +1 -1
- package/build/browser/filter-list/base/inputs/MultiSelectInput.js +20 -12
- package/build/browser/filter-list/base/inputs/MultiSelectInput.js.map +1 -1
- package/build/browser/filter-list/base/inputs/NoValueLabel.js +36 -0
- package/build/browser/filter-list/base/inputs/NoValueLabel.js.map +1 -0
- package/build/browser/filter-list/base/inputs/NoValueLabel.module.css +20 -0
- package/build/browser/filter-list/base/inputs/NoValueLabel.module.css.js +6 -0
- package/build/browser/filter-list/base/inputs/NullValueWrapper.js +4 -3
- package/build/browser/filter-list/base/inputs/NullValueWrapper.js.map +1 -1
- package/build/browser/filter-list/base/inputs/NullValueWrapper.module.css +10 -7
- package/build/browser/filter-list/base/inputs/NullValueWrapper.module.css.js +1 -1
- package/build/browser/filter-list/base/inputs/SingleSelectInput.js +13 -8
- package/build/browser/filter-list/base/inputs/SingleSelectInput.js.map +1 -1
- package/build/browser/filter-list/base/inputs/TextTagsInput.js +6 -2
- package/build/browser/filter-list/base/inputs/TextTagsInput.js.map +1 -1
- package/build/browser/filter-list/hooks/useFilterListState.js +7 -6
- package/build/browser/filter-list/hooks/useFilterListState.js.map +1 -1
- package/build/browser/filter-list/hooks/useStableMapEntries.js +35 -0
- package/build/browser/filter-list/hooks/useStableMapEntries.js.map +1 -0
- package/build/browser/filter-list/utils/filterValues.js +13 -0
- package/build/browser/filter-list/utils/filterValues.js.map +1 -1
- package/build/browser/object-table/DefaultCellRenderer.js +12 -2
- package/build/browser/object-table/DefaultCellRenderer.js.map +1 -1
- package/build/browser/object-table/EditableCell.js +14 -4
- package/build/browser/object-table/EditableCell.js.map +1 -1
- package/build/browser/object-table/EditableCell.module.css +4 -0
- package/build/browser/object-table/EditableCell.module.css.js +1 -0
- package/build/browser/object-table/ObjectTable.js +3 -1
- package/build/browser/object-table/ObjectTable.js.map +1 -1
- package/build/browser/object-table/ObjectTableApi.js.map +1 -1
- package/build/browser/object-table/Table.js +8 -4
- package/build/browser/object-table/Table.js.map +1 -1
- package/build/browser/object-table/TableBody.js +4 -2
- package/build/browser/object-table/TableBody.js.map +1 -1
- package/build/browser/object-table/TableRow.js +12 -4
- package/build/browser/object-table/TableRow.js.map +1 -1
- package/build/browser/object-table/hooks/useColumnDefs.js.map +1 -1
- package/build/browser/object-table/utils/editableUtils.js +39 -0
- package/build/browser/object-table/utils/editableUtils.js.map +1 -0
- package/build/browser/object-table/utils/shouldShowEditableCell.js +1 -1
- package/build/browser/object-table/utils/shouldShowEditableCell.js.map +1 -1
- package/build/browser/object-table/utils/types.js.map +1 -1
- package/build/browser/styles.css +331 -130
- package/build/browser/tokens/component-tokens/button.css +15 -0
- package/build/browser/tokens/component-tokens/combobox.css +9 -0
- package/build/browser/tokens/component-tokens/datetime-picker.css +2 -2
- package/build/browser/tokens/component-tokens/file-picker.css +0 -10
- package/build/browser/tokens/component-tokens/filter-list.css +9 -6
- package/build/browser/tokens/component-tokens/form-section.css +1 -1
- package/build/browser/tokens/component-tokens/form.css +9 -5
- package/build/browser/tokens/component-tokens/table.css +3 -5
- package/build/browser/tokens.css +1 -0
- package/build/browser/util/UserAgent.js +1 -1
- package/build/cjs/{DateCalendar-2W4QHEEI.css → DateCalendar-G7RC2FCG.css} +105 -8
- package/build/cjs/DateCalendar-G7RC2FCG.css.map +1 -0
- package/build/cjs/DateCalendar-RX7HP2XP.cjs +26 -0
- package/build/cjs/{DateCalendar-QGSYBWJB.cjs.map → DateCalendar-RX7HP2XP.cjs.map} +1 -1
- package/build/cjs/{DateRangeCalendar-M63S2LLG.css → DateRangeCalendar-JBVYJDBJ.css} +105 -8
- package/build/cjs/DateRangeCalendar-JBVYJDBJ.css.map +1 -0
- package/build/cjs/DateRangeCalendar-OHT4IUWQ.cjs +54 -0
- package/build/cjs/DateRangeCalendar-OHT4IUWQ.cjs.map +1 -0
- package/build/cjs/{chunk-T7I6O43T.cjs → chunk-6SPXSFPI.cjs} +237 -85
- package/build/cjs/chunk-6SPXSFPI.cjs.map +1 -0
- package/build/cjs/{chunk-SZXVBDSA.cjs → chunk-6UDBHYSO.cjs} +3 -3
- package/build/cjs/{chunk-SZXVBDSA.cjs.map → chunk-6UDBHYSO.cjs.map} +1 -1
- package/build/cjs/{chunk-YBDS5WQP.cjs → chunk-7H6WXQ35.cjs} +4 -4
- package/build/cjs/{chunk-YBDS5WQP.cjs.map → chunk-7H6WXQ35.cjs.map} +1 -1
- package/build/cjs/{chunk-VVJFMOZI.cjs → chunk-I3OSD6CF.cjs} +19 -45
- package/build/cjs/chunk-I3OSD6CF.cjs.map +1 -0
- package/build/cjs/chunk-MD4KDE44.cjs +41 -0
- package/build/cjs/chunk-MD4KDE44.cjs.map +1 -0
- package/build/cjs/{chunk-YPXTSEE7.cjs → chunk-MLFMSZJQ.cjs} +85 -38
- package/build/cjs/chunk-MLFMSZJQ.cjs.map +1 -0
- package/build/cjs/chunk-MQYOHGPY.cjs +52 -0
- package/build/cjs/chunk-MQYOHGPY.cjs.map +1 -0
- package/build/cjs/{chunk-BJDCC446.cjs → chunk-PTTCWNZZ.cjs} +417 -364
- package/build/cjs/chunk-PTTCWNZZ.cjs.map +1 -0
- package/build/cjs/{chunk-B2GRQRWU.cjs → chunk-TOJSJN3L.cjs} +44 -8
- package/build/cjs/chunk-TOJSJN3L.cjs.map +1 -0
- package/build/cjs/{chunk-JLESWL47.cjs → chunk-V7XWTJV7.cjs} +4 -2
- package/build/cjs/chunk-V7XWTJV7.cjs.map +1 -0
- package/build/cjs/{chunk-L5LPFCXT.cjs → chunk-W2IASYE4.cjs} +163 -125
- package/build/cjs/chunk-W2IASYE4.cjs.map +1 -0
- package/build/cjs/chunk-X337DNCW.cjs +45 -0
- package/build/cjs/chunk-X337DNCW.cjs.map +1 -0
- package/build/cjs/{chunk-SB2VTP67.cjs → chunk-Z7VHLTKD.cjs} +2 -64
- package/build/cjs/chunk-Z7VHLTKD.cjs.map +1 -0
- package/build/cjs/public/experimental/action-form.cjs +11 -9
- package/build/cjs/public/experimental/action-form.css +223 -68
- package/build/cjs/public/experimental/action-form.css.map +1 -1
- package/build/cjs/public/experimental/action-form.d.cts +83 -74
- package/build/cjs/public/experimental/filter-list.cjs +9 -8
- package/build/cjs/public/experimental/filter-list.css +38 -19
- package/build/cjs/public/experimental/filter-list.css.map +1 -1
- package/build/cjs/public/experimental/object-table.cjs +14 -12
- package/build/cjs/public/experimental/object-table.css +152 -59
- package/build/cjs/public/experimental/object-table.css.map +1 -1
- package/build/cjs/public/experimental/object-table.d.cts +39 -20
- package/build/cjs/public/experimental/pdf-viewer.cjs +24 -24
- package/build/cjs/public/experimental.cjs +46 -44
- package/build/cjs/public/experimental.css +242 -139
- package/build/cjs/public/experimental.css.map +1 -1
- package/build/cjs/public/primitives.cjs +8 -7
- package/build/cjs/public/primitives.css +15 -0
- package/build/cjs/public/primitives.css.map +1 -1
- package/build/cjs/public/primitives.d.cts +1 -0
- package/build/esm/action-form/ActionForm.js +19 -11
- package/build/esm/action-form/ActionForm.js.map +1 -1
- package/build/esm/action-form/ActionFormApi.js.map +1 -1
- package/build/esm/action-form/BaseForm.js +19 -13
- package/build/esm/action-form/BaseForm.js.map +1 -1
- package/build/esm/action-form/BaseForm.module.css +7 -7
- package/build/esm/action-form/FormField.js +5 -2
- package/build/esm/action-form/FormField.js.map +1 -1
- package/build/esm/action-form/FormField.module.css +6 -1
- package/build/esm/action-form/FormFieldApi.js +7 -1
- package/build/esm/action-form/FormFieldApi.js.map +1 -1
- package/build/esm/action-form/FormHeader.module.css +2 -2
- package/build/esm/action-form/fields/DateCalendar.js +41 -3
- package/build/esm/action-form/fields/DateCalendar.js.map +1 -1
- package/build/esm/action-form/fields/DateCalendar.module.css +59 -10
- package/build/esm/action-form/fields/DateRangeCalendar.js +8 -5
- package/build/esm/action-form/fields/DateRangeCalendar.js.map +1 -1
- package/build/esm/action-form/fields/DateRangeInputField.js +76 -61
- package/build/esm/action-form/fields/DateRangeInputField.js.map +1 -1
- package/build/esm/action-form/fields/DateRangeInputField.module.css +0 -15
- package/build/esm/action-form/fields/DatetimePickerField.js +74 -40
- package/build/esm/action-form/fields/DatetimePickerField.js.map +1 -1
- package/build/esm/action-form/fields/DatetimePickerField.module.css +2 -9
- package/build/esm/action-form/fields/FieldBridge.js +1 -1
- package/build/esm/action-form/fields/FieldBridge.js.map +1 -1
- package/build/esm/action-form/fields/FilePickerField.js +47 -39
- package/build/esm/action-form/fields/FilePickerField.js.map +1 -1
- package/build/esm/action-form/fields/FilePickerField.module.css +43 -31
- package/build/esm/action-form/fields/FormFieldRenderer.js +9 -0
- package/build/esm/action-form/fields/FormFieldRenderer.js.map +1 -1
- package/build/esm/action-form/fields/RadioButtonsField.module.css +3 -3
- package/build/esm/action-form/fields/SwitchField.js +34 -0
- package/build/esm/action-form/fields/SwitchField.js.map +1 -0
- package/build/esm/action-form/fields/TimePicker.js +165 -26
- package/build/esm/action-form/fields/TimePicker.js.map +1 -1
- package/build/esm/action-form/fields/TimePicker.module.css +27 -2
- package/build/esm/action-form/fields/calendarShared.js +5 -0
- package/build/esm/action-form/fields/calendarShared.js.map +1 -1
- package/build/esm/action-form/fields/useDateEditState.js +3 -4
- package/build/esm/action-form/fields/useDateEditState.js.map +1 -1
- package/build/esm/base-components/action-button/ActionButton.js +2 -1
- package/build/esm/base-components/action-button/ActionButton.js.map +1 -1
- package/build/esm/base-components/action-button/ActionButton.module.css +19 -0
- package/build/esm/base-components/combobox/Combobox.module.css +31 -3
- package/build/esm/base-components/select/Select.module.css +18 -0
- package/build/esm/base-components/switch/Switch.module.css +18 -6
- package/build/esm/filter-list/base/inputs/ListogramInput.js +34 -6
- package/build/esm/filter-list/base/inputs/ListogramInput.js.map +1 -1
- package/build/esm/filter-list/base/inputs/ListogramInput.module.css +11 -5
- package/build/esm/filter-list/base/inputs/MultiSelectInput.js +20 -12
- package/build/esm/filter-list/base/inputs/MultiSelectInput.js.map +1 -1
- package/build/esm/filter-list/base/inputs/NoValueLabel.js +36 -0
- package/build/esm/filter-list/base/inputs/NoValueLabel.js.map +1 -0
- package/build/esm/filter-list/base/inputs/NoValueLabel.module.css +20 -0
- package/build/esm/filter-list/base/inputs/NullValueWrapper.js +4 -3
- package/build/esm/filter-list/base/inputs/NullValueWrapper.js.map +1 -1
- package/build/esm/filter-list/base/inputs/NullValueWrapper.module.css +10 -7
- package/build/esm/filter-list/base/inputs/SingleSelectInput.js +13 -8
- package/build/esm/filter-list/base/inputs/SingleSelectInput.js.map +1 -1
- package/build/esm/filter-list/base/inputs/TextTagsInput.js +6 -2
- package/build/esm/filter-list/base/inputs/TextTagsInput.js.map +1 -1
- package/build/esm/filter-list/hooks/useFilterListState.js +7 -6
- package/build/esm/filter-list/hooks/useFilterListState.js.map +1 -1
- package/build/esm/filter-list/hooks/useStableMapEntries.js +35 -0
- package/build/esm/filter-list/hooks/useStableMapEntries.js.map +1 -0
- package/build/esm/filter-list/utils/filterValues.js +13 -0
- package/build/esm/filter-list/utils/filterValues.js.map +1 -1
- package/build/esm/object-table/DefaultCellRenderer.js +12 -2
- package/build/esm/object-table/DefaultCellRenderer.js.map +1 -1
- package/build/esm/object-table/EditableCell.js +14 -4
- package/build/esm/object-table/EditableCell.js.map +1 -1
- package/build/esm/object-table/EditableCell.module.css +4 -0
- package/build/esm/object-table/ObjectTable.js +3 -1
- package/build/esm/object-table/ObjectTable.js.map +1 -1
- package/build/esm/object-table/ObjectTableApi.js.map +1 -1
- package/build/esm/object-table/Table.js +8 -4
- package/build/esm/object-table/Table.js.map +1 -1
- package/build/esm/object-table/TableBody.js +4 -2
- package/build/esm/object-table/TableBody.js.map +1 -1
- package/build/esm/object-table/TableRow.js +12 -4
- package/build/esm/object-table/TableRow.js.map +1 -1
- package/build/esm/object-table/hooks/useColumnDefs.js.map +1 -1
- package/build/esm/object-table/utils/editableUtils.js +39 -0
- package/build/esm/object-table/utils/editableUtils.js.map +1 -0
- package/build/esm/object-table/utils/shouldShowEditableCell.js +1 -1
- package/build/esm/object-table/utils/shouldShowEditableCell.js.map +1 -1
- package/build/esm/object-table/utils/types.js.map +1 -1
- package/build/esm/tokens/component-tokens/button.css +15 -0
- package/build/esm/tokens/component-tokens/combobox.css +9 -0
- package/build/esm/tokens/component-tokens/datetime-picker.css +2 -2
- package/build/esm/tokens/component-tokens/file-picker.css +0 -10
- package/build/esm/tokens/component-tokens/filter-list.css +9 -6
- package/build/esm/tokens/component-tokens/form-section.css +1 -1
- package/build/esm/tokens/component-tokens/form.css +9 -5
- package/build/esm/tokens/component-tokens/table.css +3 -5
- package/build/esm/tokens.css +1 -0
- package/build/esm/util/UserAgent.js +1 -1
- package/build/types/action-form/ActionFormApi.d.ts +8 -8
- package/build/types/action-form/ActionFormApi.d.ts.map +1 -1
- package/build/types/action-form/BaseForm.d.ts.map +1 -1
- package/build/types/action-form/FormFieldApi.d.ts +29 -22
- package/build/types/action-form/FormFieldApi.d.ts.map +1 -1
- package/build/types/action-form/fields/DateCalendar.d.ts +6 -1
- package/build/types/action-form/fields/DateCalendar.d.ts.map +1 -1
- package/build/types/action-form/fields/DateRangeCalendar.d.ts.map +1 -1
- package/build/types/action-form/fields/DateRangeInputField.d.ts.map +1 -1
- package/build/types/action-form/fields/DatetimePickerField.d.ts.map +1 -1
- package/build/types/action-form/fields/FieldBridge.d.ts.map +1 -1
- package/build/types/action-form/fields/FilePickerField.d.ts.map +1 -1
- package/build/types/action-form/fields/FormFieldRenderer.d.ts.map +1 -1
- package/build/types/action-form/fields/SwitchField.d.ts +7 -0
- package/build/types/action-form/fields/SwitchField.d.ts.map +1 -0
- package/build/types/action-form/fields/TimePicker.d.ts +4 -5
- package/build/types/action-form/fields/TimePicker.d.ts.map +1 -1
- package/build/types/action-form/fields/useDateEditState.d.ts +2 -2
- package/build/types/base-components/action-button/ActionButton.d.ts +1 -0
- package/build/types/base-components/action-button/ActionButton.d.ts.map +1 -1
- package/build/types/filter-list/base/inputs/ListogramInput.d.ts.map +1 -1
- package/build/types/filter-list/base/inputs/MultiSelectInput.d.ts.map +1 -1
- package/build/types/filter-list/base/inputs/NoValueLabel.d.ts +15 -0
- package/build/types/filter-list/base/inputs/NoValueLabel.d.ts.map +1 -0
- package/build/types/filter-list/base/inputs/NullValueWrapper.d.ts.map +1 -1
- package/build/types/filter-list/base/inputs/SingleSelectInput.d.ts.map +1 -1
- package/build/types/filter-list/base/inputs/TextTagsInput.d.ts.map +1 -1
- package/build/types/filter-list/hooks/useFilterListState.d.ts.map +1 -1
- package/build/types/filter-list/hooks/useStableMapEntries.d.ts +9 -0
- package/build/types/filter-list/hooks/useStableMapEntries.d.ts.map +1 -0
- package/build/types/filter-list/utils/filterValues.d.ts +7 -0
- package/build/types/filter-list/utils/filterValues.d.ts.map +1 -1
- package/build/types/object-table/DefaultCellRenderer.d.ts.map +1 -1
- package/build/types/object-table/EditableCell.d.ts +1 -1
- package/build/types/object-table/EditableCell.d.ts.map +1 -1
- package/build/types/object-table/ObjectTableApi.d.ts +26 -7
- package/build/types/object-table/ObjectTableApi.d.ts.map +1 -1
- package/build/types/object-table/Table.d.ts +9 -2
- package/build/types/object-table/Table.d.ts.map +1 -1
- package/build/types/object-table/TableBody.d.ts +2 -1
- package/build/types/object-table/TableBody.d.ts.map +1 -1
- package/build/types/object-table/TableRow.d.ts +2 -1
- package/build/types/object-table/TableRow.d.ts.map +1 -1
- package/build/types/object-table/utils/editableUtils.d.ts +16 -0
- package/build/types/object-table/utils/editableUtils.d.ts.map +1 -0
- package/build/types/object-table/utils/shouldShowEditableCell.d.ts +2 -1
- package/build/types/object-table/utils/shouldShowEditableCell.d.ts.map +1 -1
- package/build/types/object-table/utils/types.d.ts +4 -11
- package/build/types/object-table/utils/types.d.ts.map +1 -1
- package/docs/ActionForm.md +176 -0
- package/docs/CSSVariables.md +31 -30
- package/docs/ObjectTable.md +141 -16
- package/package.json +6 -5
- package/build/cjs/DateCalendar-2W4QHEEI.css.map +0 -1
- package/build/cjs/DateCalendar-QGSYBWJB.cjs +0 -24
- package/build/cjs/DateRangeCalendar-JHO2BF3Z.cjs +0 -48
- package/build/cjs/DateRangeCalendar-JHO2BF3Z.cjs.map +0 -1
- package/build/cjs/DateRangeCalendar-M63S2LLG.css.map +0 -1
- package/build/cjs/chunk-B2GRQRWU.cjs.map +0 -1
- package/build/cjs/chunk-BJDCC446.cjs.map +0 -1
- package/build/cjs/chunk-JLESWL47.cjs.map +0 -1
- package/build/cjs/chunk-L5LPFCXT.cjs.map +0 -1
- package/build/cjs/chunk-SB2VTP67.cjs.map +0 -1
- package/build/cjs/chunk-T7I6O43T.cjs.map +0 -1
- package/build/cjs/chunk-UCTQICPR.cjs +0 -10
- package/build/cjs/chunk-UCTQICPR.cjs.map +0 -1
- package/build/cjs/chunk-VVJFMOZI.cjs.map +0 -1
- package/build/cjs/chunk-YPXTSEE7.cjs.map +0 -1
|
@@ -19,7 +19,7 @@ import { Input } from "@base-ui/react/input";
|
|
|
19
19
|
import { Popover } from "@base-ui/react/popover";
|
|
20
20
|
import classnames from "classnames";
|
|
21
21
|
import React, { useCallback, useId, useRef, useState } from "react";
|
|
22
|
-
import {
|
|
22
|
+
import { formatDateForInput, formatDatetimeForInput, parseDateFromInput, parseDatetimeFromInput } from "../../shared/dateUtils.js";
|
|
23
23
|
import { EMPTY_RANGE } from "../FormFieldApi.js";
|
|
24
24
|
import { stopPropagation } from "./calendarShared.js";
|
|
25
25
|
import commonStyles from "./DatePickerCommon.module.css";
|
|
@@ -54,6 +54,10 @@ export const DateRangeInputField = /*#__PURE__*/React.memo(function ({
|
|
|
54
54
|
}) {
|
|
55
55
|
const shouldCloseOnSelection = !showTime;
|
|
56
56
|
const popoverId = useId();
|
|
57
|
+
// The range container anchors the shared popover without becoming a trigger.
|
|
58
|
+
// Each input is its own Popover.Trigger so the comboboxes are not nested in an
|
|
59
|
+
// interactive wrapper.
|
|
60
|
+
const triggerRef = useRef(null);
|
|
57
61
|
const startInputRef = useRef(null);
|
|
58
62
|
const endInputRef = useRef(null);
|
|
59
63
|
const popoverRef = useRef(null);
|
|
@@ -69,9 +73,10 @@ export const DateRangeInputField = /*#__PURE__*/React.memo(function ({
|
|
|
69
73
|
const [startDate, endDate] = value ?? EMPTY_RANGE;
|
|
70
74
|
|
|
71
75
|
// editFormatFn produces a parsable string for typing (e.g. "2024-01-15" or "2024-01-15 14:30").
|
|
72
|
-
// displayFormatFn produces
|
|
76
|
+
// displayFormatFn produces the idle string. Defaults stay deterministic so
|
|
77
|
+
// users in different browser locales see the same date in form inputs.
|
|
73
78
|
const editFormatFn = showTime ? formatDatetimeForInput : formatDateForInput;
|
|
74
|
-
const displayFormatFn = formatDate ?? (showTime ? formatDatetimeForInput :
|
|
79
|
+
const displayFormatFn = formatDate ?? (showTime ? formatDatetimeForInput : formatDateForInput);
|
|
75
80
|
const parseFn = parseDate ?? (showTime ? parseDatetimeFromInput : parseDateFromInput);
|
|
76
81
|
|
|
77
82
|
// Wrap onChange to handle tuple construction and overlap rejection.
|
|
@@ -171,6 +176,18 @@ export const DateRangeInputField = /*#__PURE__*/React.memo(function ({
|
|
|
171
176
|
stopEndEditing();
|
|
172
177
|
getActiveInputRef().current?.focus();
|
|
173
178
|
}, [getActiveInputRef, stopStartEditing, stopEndEditing]);
|
|
179
|
+
const handleStartPointerDown = useCallback(() => {
|
|
180
|
+
// Opening from pointer-down keeps mouse interactions in sync with focus
|
|
181
|
+
// editing before Base UI's later click trigger handler runs.
|
|
182
|
+
startInputRef.current?.focus();
|
|
183
|
+
handleStartFocus();
|
|
184
|
+
}, [handleStartFocus]);
|
|
185
|
+
const handleEndPointerDown = useCallback(() => {
|
|
186
|
+
// Opening from pointer-down keeps mouse interactions in sync with focus
|
|
187
|
+
// editing before Base UI's later click trigger handler runs.
|
|
188
|
+
endInputRef.current?.focus();
|
|
189
|
+
handleEndFocus();
|
|
190
|
+
}, [handleEndFocus]);
|
|
174
191
|
|
|
175
192
|
// --- Blur handlers ---
|
|
176
193
|
|
|
@@ -280,26 +297,14 @@ export const DateRangeInputField = /*#__PURE__*/React.memo(function ({
|
|
|
280
297
|
|
|
281
298
|
// --- Time handlers ---
|
|
282
299
|
|
|
283
|
-
const handleStartTimeChange = useCallback(
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
setStartDateValue(base);
|
|
292
|
-
}, [startDate, endDate, onChange, setStartDateValue]);
|
|
293
|
-
const handleEndTimeChange = useCallback(timeString => {
|
|
294
|
-
const {
|
|
295
|
-
hours,
|
|
296
|
-
minutes
|
|
297
|
-
} = parseTimeString(timeString);
|
|
298
|
-
const base = endDate != null ? new Date(endDate.getTime()) : new Date();
|
|
299
|
-
base.setHours(hours, minutes, 0, 0);
|
|
300
|
-
onChange?.([startDate ?? null, base]);
|
|
301
|
-
setEndDateValue(base);
|
|
302
|
-
}, [startDate, endDate, onChange, setEndDateValue]);
|
|
300
|
+
const handleStartTimeChange = useCallback(time => {
|
|
301
|
+
onChange?.([time, endDate ?? null]);
|
|
302
|
+
setStartDateValue(time);
|
|
303
|
+
}, [endDate, onChange, setStartDateValue]);
|
|
304
|
+
const handleEndTimeChange = useCallback(time => {
|
|
305
|
+
onChange?.([startDate ?? null, time]);
|
|
306
|
+
setEndDateValue(time);
|
|
307
|
+
}, [startDate, onChange, setEndDateValue]);
|
|
303
308
|
|
|
304
309
|
// --- Focus boundary handlers ---
|
|
305
310
|
// Visually-hidden sentinels at the top/bottom of the popover that trap Tab
|
|
@@ -334,14 +339,12 @@ export const DateRangeInputField = /*#__PURE__*/React.memo(function ({
|
|
|
334
339
|
from: startDate ?? undefined,
|
|
335
340
|
to: endDate ?? undefined
|
|
336
341
|
} : undefined;
|
|
337
|
-
const timeFooter = showTime ? /*#__PURE__*/React.createElement(
|
|
338
|
-
|
|
339
|
-
}, /*#__PURE__*/React.createElement(TimePicker, {
|
|
340
|
-
value: getTimeValue(startDate),
|
|
342
|
+
const timeFooter = showTime ? /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(TimePicker, {
|
|
343
|
+
value: startDate,
|
|
341
344
|
onChange: handleStartTimeChange,
|
|
342
345
|
label: "Start time"
|
|
343
346
|
}), /*#__PURE__*/React.createElement(TimePicker, {
|
|
344
|
-
value:
|
|
347
|
+
value: endDate,
|
|
345
348
|
onChange: handleEndTimeChange,
|
|
346
349
|
label: "End time"
|
|
347
350
|
})) : undefined;
|
|
@@ -349,6 +352,10 @@ export const DateRangeInputField = /*#__PURE__*/React.memo(function ({
|
|
|
349
352
|
...SHARED_INPUT_PROPS,
|
|
350
353
|
"aria-controls": popoverId
|
|
351
354
|
};
|
|
355
|
+
|
|
356
|
+
// Keep Popover.Trigger on each input itself. Moving it to the range wrapper
|
|
357
|
+
// would make click handling simpler, but it would also nest interactive
|
|
358
|
+
// comboboxes inside an interactive trigger and reintroduce the axe violation.
|
|
352
359
|
return /*#__PURE__*/React.createElement(Popover.Root, {
|
|
353
360
|
open: isOpen,
|
|
354
361
|
onOpenChange: handleOpenChange
|
|
@@ -356,45 +363,52 @@ export const DateRangeInputField = /*#__PURE__*/React.memo(function ({
|
|
|
356
363
|
// is not reinterpreted after the portal dismiss layer appears.
|
|
357
364
|
,
|
|
358
365
|
modal: "trap-focus"
|
|
359
|
-
}, /*#__PURE__*/React.createElement(
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
className: styles.osdkDateRangeContainer
|
|
363
|
-
})
|
|
366
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
367
|
+
ref: triggerRef,
|
|
368
|
+
className: styles.osdkDateRangeContainer
|
|
364
369
|
}, /*#__PURE__*/React.createElement("div", {
|
|
365
370
|
className: classnames(commonStyles.osdkDatePickerInputWrapper, styles.osdkDateRangeInputWrapper, startInvalid && commonStyles.osdkDatePickerInputWrapperError)
|
|
366
|
-
}, /*#__PURE__*/React.createElement(
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
371
|
+
}, /*#__PURE__*/React.createElement(Popover.Trigger, {
|
|
372
|
+
nativeButton: false,
|
|
373
|
+
render: /*#__PURE__*/React.createElement(Input, _extends({
|
|
374
|
+
ref: startInputRef,
|
|
375
|
+
id: id != null ? `${id}-start` : undefined,
|
|
376
|
+
value: displayedStart,
|
|
377
|
+
onValueChange: setStartInputValue,
|
|
378
|
+
onFocus: handleStartFocus,
|
|
379
|
+
onPointerDown: handleStartPointerDown,
|
|
380
|
+
onBlur: handleStartBlur,
|
|
381
|
+
onKeyDown: handleStartKeyDown,
|
|
382
|
+
placeholder: placeholderStart,
|
|
383
|
+
"aria-expanded": isOpen && activeBoundary === "start",
|
|
384
|
+
"aria-label": "Start date",
|
|
385
|
+
"aria-invalid": startInvalid || undefined
|
|
386
|
+
}, sharedInputProps))
|
|
387
|
+
})), /*#__PURE__*/React.createElement("div", {
|
|
379
388
|
className: classnames(commonStyles.osdkDatePickerInputWrapper, styles.osdkDateRangeInputWrapper, endInvalid && commonStyles.osdkDatePickerInputWrapperError)
|
|
380
|
-
}, /*#__PURE__*/React.createElement(
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
389
|
+
}, /*#__PURE__*/React.createElement(Popover.Trigger, {
|
|
390
|
+
nativeButton: false,
|
|
391
|
+
render: /*#__PURE__*/React.createElement(Input, _extends({
|
|
392
|
+
ref: endInputRef,
|
|
393
|
+
id: id != null ? `${id}-end` : undefined,
|
|
394
|
+
value: displayedEnd,
|
|
395
|
+
onValueChange: setEndInputValue,
|
|
396
|
+
onBlur: handleEndBlur,
|
|
397
|
+
onKeyDown: handleEndKeyDown,
|
|
398
|
+
onFocus: handleEndFocus,
|
|
399
|
+
onPointerDown: handleEndPointerDown,
|
|
400
|
+
placeholder: placeholderEnd,
|
|
401
|
+
"aria-expanded": isOpen && activeBoundary === "end",
|
|
402
|
+
"aria-label": "End date",
|
|
403
|
+
"aria-invalid": endInvalid || undefined
|
|
404
|
+
}, sharedInputProps))
|
|
405
|
+
}))), /*#__PURE__*/React.createElement(Popover.Portal, {
|
|
393
406
|
container: portalContainer
|
|
394
407
|
}, /*#__PURE__*/React.createElement(PortalDismissLayer, {
|
|
395
408
|
className: commonStyles.osdkDatePickerDismissLayer,
|
|
396
409
|
onDismiss: closePopover
|
|
397
410
|
}), /*#__PURE__*/React.createElement(Popover.Positioner, {
|
|
411
|
+
anchor: triggerRef,
|
|
398
412
|
className: commonStyles.osdkDatePickerPositioner,
|
|
399
413
|
sideOffset: 4
|
|
400
414
|
}, /*#__PURE__*/React.createElement(Popover.Popup, {
|
|
@@ -416,8 +430,9 @@ export const DateRangeInputField = /*#__PURE__*/React.memo(function ({
|
|
|
416
430
|
selected: calendarSelected,
|
|
417
431
|
onSelect: handleRangeSelect,
|
|
418
432
|
min: min,
|
|
419
|
-
max: max
|
|
420
|
-
|
|
433
|
+
max: max,
|
|
434
|
+
footer: timeFooter
|
|
435
|
+
}), /*#__PURE__*/React.createElement("div", {
|
|
421
436
|
onFocus: handleEndFocusBoundary,
|
|
422
437
|
tabIndex: 0,
|
|
423
438
|
"aria-label": "End of date range picker dialog",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DateRangeInputField.js","names":["Input","Popover","classnames","React","useCallback","useId","useRef","useState","formatDateForDisplay","formatDateForInput","formatDatetimeForInput","getTimeValue","parseDateFromInput","parseDatetimeFromInput","parseTimeString","EMPTY_RANGE","stopPropagation","commonStyles","styles","LazyDateRangeCalendar","PortalDismissLayer","TimePicker","useDateEditState","SHARED_INPUT_PROPS","className","osdkDatePickerInput","type","onClick","autoComplete","role","DateRangeInputField","memo","id","value","onChange","min","max","placeholderStart","placeholderEnd","allowSingleDayRange","showTime","formatDate","parseDate","portalContainer","shouldCloseOnSelection","popoverId","startInputRef","endInputRef","popoverRef","isOpen","setIsOpen","skipReopenRef","activeBoundary","setActiveBoundary","startDate","endDate","editFormatFn","displayFormatFn","parseFn","startOnChange","date","isOverlapping","endOnChange","isEditing","isEditingStart","dateValue","startParsedValue","inputError","startInputError","displayedValue","displayedStart","startEditing","beginStartEditing","stopEditing","stopStartEditing","commitAndStopEditing","commitStartAndStopEditing","setInputValue","setStartInputValue","setDateValue","setStartDateValue","isEditingEnd","endParsedValue","endInputError","displayedEnd","beginEndEditing","stopEndEditing","commitEndAndStopEditing","setEndInputValue","setEndDateValue","hasOverlapError","effectiveStart","undefined","effectiveEnd","startInvalid","endInvalid","getActiveInputRef","beginEditing","boundary","handleInputFocus","current","handleStartFocus","handleEndFocus","closePopoverForBoundaryExit","focus","handleStartBlur","e","related","relatedTarget","document","activeElement","contains","handleEndBlur","closePopover","blur","handleStartKeyDown","key","preventDefault","shiftKey","handleEndKeyDown","firstButton","querySelector","handleOpenChange","nextOpen","handleRangeSelect","range","newStart","from","newEnd","to","handleStartTimeChange","timeString","hours","minutes","base","Date","getTime","setHours","handleEndTimeChange","handleStartFocusBoundary","handleEndFocusBoundary","buttons","querySelectorAll","lastButton","length","calendarSelected","timeFooter","createElement","osdkDateRangeTimeRow","label","sharedInputProps","Root","open","onOpenChange","modal","Trigger","nativeButton","render","osdkDateRangeContainer","osdkDatePickerInputWrapper","osdkDateRangeInputWrapper","osdkDatePickerInputWrapperError","_extends","ref","onValueChange","onFocus","onBlur","onKeyDown","placeholder","Portal","container","osdkDatePickerDismissLayer","onDismiss","Positioner","osdkDatePickerPositioner","sideOffset","Popup","osdkDatePickerPopover","finalFocus","tabIndex","osdkDatePickerFocusBoundary","selected","onSelect","start","end"],"sources":["DateRangeInputField.tsx"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\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 */\n\nimport { Input } from \"@base-ui/react/input\";\nimport { Popover } from \"@base-ui/react/popover\";\nimport classnames from \"classnames\";\nimport React, { useCallback, useId, useRef, useState } from \"react\";\nimport type { DateRange as RdpDateRange } from \"react-day-picker\";\nimport {\n formatDateForDisplay,\n formatDateForInput,\n formatDatetimeForInput,\n getTimeValue,\n parseDateFromInput,\n parseDatetimeFromInput,\n parseTimeString,\n} from \"../../shared/dateUtils.js\";\nimport { type DateRangeInputFieldProps, EMPTY_RANGE } from \"../FormFieldApi.js\";\nimport { stopPropagation } from \"./calendarShared.js\";\nimport commonStyles from \"./DatePickerCommon.module.css\";\nimport styles from \"./DateRangeInputField.module.css\";\nimport { LazyDateRangeCalendar } from \"./LazyDateRangeCalendar.js\";\nimport { PortalDismissLayer } from \"./PortalDismissLayer.js\";\nimport { TimePicker } from \"./TimePicker.js\";\nimport { useDateEditState } from \"./useDateEditState.js\";\n\ntype ActiveBoundary = \"start\" | \"end\";\n\n// Shared props for both start/end inputs. role=\"combobox\" because each input\n// triggers a shared popup (the calendar popover) — matching WAI-ARIA combobox pattern.\nconst SHARED_INPUT_PROPS = {\n className: commonStyles.osdkDatePickerInput,\n type: \"text\" as const,\n onClick: stopPropagation,\n autoComplete: \"off\" as const,\n role: \"combobox\" as const,\n \"aria-haspopup\": \"dialog\" as const,\n} as const;\n\nexport const DateRangeInputField: React.NamedExoticComponent<\n DateRangeInputFieldProps\n> = React.memo(function DateRangeInputField({\n id,\n value,\n onChange,\n min,\n max,\n placeholderStart,\n placeholderEnd,\n allowSingleDayRange = true,\n showTime = false,\n formatDate,\n parseDate,\n portalContainer,\n}: DateRangeInputFieldProps) {\n const shouldCloseOnSelection = !showTime;\n const popoverId = useId();\n const startInputRef = useRef<HTMLInputElement>(null);\n const endInputRef = useRef<HTMLInputElement>(null);\n const popoverRef = useRef<HTMLDivElement>(null);\n\n const [isOpen, setIsOpen] = useState(false);\n // When focus returns to an input after Tab exits the popover boundary, the\n // next input focus should not reopen the calendar before native Tab can\n // continue to the following form field.\n const skipReopenRef = useRef(false);\n // Tracks which input (start/end) owns the shared calendar popover.\n // Used to restore focus to the correct input when Tab-cycling through\n // focus boundaries and when the calendar selects a range endpoint.\n const [activeBoundary, setActiveBoundary] = useState<ActiveBoundary>(\"start\");\n\n const [startDate, endDate] = value ?? EMPTY_RANGE;\n\n // editFormatFn produces a parsable string for typing (e.g. \"2024-01-15\" or \"2024-01-15 14:30\").\n // displayFormatFn produces a human-readable string for idle state (e.g. \"Jan 15, 2024\").\n const editFormatFn = showTime ? formatDatetimeForInput : formatDateForInput;\n const displayFormatFn = formatDate\n ?? (showTime ? formatDatetimeForInput : formatDateForDisplay);\n const parseFn = parseDate\n ?? (showTime ? parseDatetimeFromInput : parseDateFromInput);\n\n // Wrap onChange to handle tuple construction and overlap rejection.\n // Clearing (null) is always allowed; overlap is checked for non-null dates.\n const startOnChange = useCallback(\n (date: Date | null) => {\n if (date != null && isOverlapping(date, endDate, allowSingleDayRange)) {\n return;\n }\n onChange?.([date, endDate ?? null]);\n },\n [endDate, onChange, allowSingleDayRange],\n );\n\n const endOnChange = useCallback(\n (date: Date | null) => {\n if (date != null && isOverlapping(startDate, date, allowSingleDayRange)) {\n return;\n }\n onChange?.([startDate ?? null, date]);\n },\n [startDate, onChange, allowSingleDayRange],\n );\n\n const {\n isEditing: isEditingStart,\n dateValue: startParsedValue,\n inputError: startInputError,\n displayedValue: displayedStart,\n startEditing: beginStartEditing,\n stopEditing: stopStartEditing,\n commitAndStopEditing: commitStartAndStopEditing,\n setInputValue: setStartInputValue,\n setDateValue: setStartDateValue,\n } = useDateEditState({\n value: startDate,\n displayFormatFn,\n editFormatFn,\n parseFn,\n min,\n max,\n onChange: startOnChange,\n });\n const {\n isEditing: isEditingEnd,\n dateValue: endParsedValue,\n inputError: endInputError,\n displayedValue: displayedEnd,\n startEditing: beginEndEditing,\n stopEditing: stopEndEditing,\n commitAndStopEditing: commitEndAndStopEditing,\n setInputValue: setEndInputValue,\n setDateValue: setEndDateValue,\n } = useDateEditState({\n value: endDate,\n displayFormatFn,\n editFormatFn,\n parseFn,\n min,\n max,\n onChange: endOnChange,\n });\n\n // --- Cross-input error: overlapping range (live feedback while typing) ---\n // Blur/Enter handlers prevent overlapping values from being committed,\n // so this only fires during editing for immediate red-border feedback.\n const hasOverlapError = (() => {\n if (!isEditingStart && !isEditingEnd) return false;\n const effectiveStart = isEditingStart\n ? startParsedValue\n : (startDate ?? undefined);\n const effectiveEnd = isEditingEnd\n ? endParsedValue\n : (endDate ?? undefined);\n return isOverlapping(effectiveStart, effectiveEnd, allowSingleDayRange);\n })();\n\n const startInvalid = startInputError != null || hasOverlapError;\n const endInvalid = endInputError != null || hasOverlapError;\n\n // --- Focus handlers ---\n\n const getActiveInputRef = useCallback(\n () => activeBoundary === \"start\" ? startInputRef : endInputRef,\n [activeBoundary],\n );\n\n const beginEditing = useCallback(\n (boundary: ActiveBoundary) => {\n if (boundary === \"start\") {\n beginStartEditing();\n } else {\n beginEndEditing();\n }\n setActiveBoundary(boundary);\n },\n [beginStartEditing, beginEndEditing],\n );\n\n const handleInputFocus = useCallback(\n (boundary: ActiveBoundary) => {\n beginEditing(boundary);\n if (skipReopenRef.current) {\n skipReopenRef.current = false;\n return;\n }\n setIsOpen(true);\n },\n [beginEditing],\n );\n\n const handleStartFocus = useCallback(() => {\n handleInputFocus(\"start\");\n }, [handleInputFocus]);\n\n const handleEndFocus = useCallback(() => {\n handleInputFocus(\"end\");\n }, [handleInputFocus]);\n\n const closePopoverForBoundaryExit = useCallback(() => {\n skipReopenRef.current = true;\n setIsOpen(false);\n stopStartEditing();\n stopEndEditing();\n getActiveInputRef().current?.focus();\n }, [getActiveInputRef, stopStartEditing, stopEndEditing]);\n\n // --- Blur handlers ---\n\n const handleStartBlur = useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n const related = e.relatedTarget ?? document.activeElement;\n if (popoverRef.current?.contains(related as Node)) {\n // Focus moved into the popover portal — the field is still logically\n // active, so suppress the blur from bubbling to parent containers.\n e.stopPropagation();\n return;\n }\n if (endInputRef.current === related) {\n return;\n }\n commitStartAndStopEditing();\n },\n [commitStartAndStopEditing],\n );\n\n const handleEndBlur = useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n const related = e.relatedTarget ?? document.activeElement;\n if (popoverRef.current?.contains(related as Node)) {\n e.stopPropagation();\n return;\n }\n if (startInputRef.current === related) {\n return;\n }\n commitEndAndStopEditing();\n },\n [commitEndAndStopEditing],\n );\n\n // --- Popover helpers ---\n\n // Shared close sequence: dismiss the popover, reset both editing states,\n // and blur both inputs so focus doesn't linger after the calendar disappears.\n const closePopover = useCallback(() => {\n setIsOpen(false);\n stopStartEditing();\n stopEndEditing();\n startInputRef.current?.blur();\n endInputRef.current?.blur();\n }, [stopStartEditing, stopEndEditing]);\n\n // --- Keyboard handlers ---\n\n const handleStartKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n commitStartAndStopEditing();\n // Auto-advance to end\n endInputRef.current?.focus();\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n closePopover();\n } else if (e.key === \"Tab\" && e.shiftKey) {\n setIsOpen(false);\n }\n },\n [commitStartAndStopEditing, closePopover],\n );\n\n const handleEndKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n commitEndAndStopEditing();\n closePopover();\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n closePopover();\n } else if (e.key === \"Tab\" && !e.shiftKey && isOpen) {\n // Tab from the end input bridges focus into the popover. The popover\n // doesn't auto-focus on open (to keep the cursor in the input for typing),\n // so we manually focus the first interactive element (nav button or select).\n const firstButton = popoverRef.current?.querySelector<HTMLElement>(\n \"button, select\",\n );\n if (firstButton != null) {\n e.preventDefault();\n firstButton.focus();\n }\n }\n },\n [commitEndAndStopEditing, closePopover, isOpen],\n );\n\n // Called by base-ui when the popover opens or closes (e.g. click outside, Escape).\n const handleOpenChange = useCallback(\n (nextOpen: boolean) => {\n if (nextOpen) {\n setIsOpen(true);\n } else {\n closePopover();\n }\n },\n [closePopover],\n );\n\n // --- Calendar handlers ---\n\n const handleRangeSelect = useCallback(\n (range: RdpDateRange | undefined) => {\n const newStart = range?.from ?? null;\n const newEnd = range?.to ?? null;\n\n onChange?.([newStart, newEnd]);\n\n if (newStart != null && newEnd == null) {\n // Start selected — commit the start and advance to end.\n // displayedValue handles the display format after stopEditing.\n stopStartEditing();\n setActiveBoundary(\"end\");\n endInputRef.current?.focus();\n } else if (\n newStart != null\n && newEnd != null\n && shouldCloseOnSelection\n ) {\n // Full range selected — close and blur.\n closePopover();\n } else if (newStart != null && newEnd != null) {\n // Full range selected but popover stays open (showTime) —\n // inputs remain in editing mode, so update with editFormatFn.\n setStartDateValue(newStart);\n setEndDateValue(newEnd);\n }\n },\n [\n onChange,\n shouldCloseOnSelection,\n closePopover,\n stopStartEditing,\n setStartDateValue,\n setEndDateValue,\n ],\n );\n\n // --- Time handlers ---\n\n const handleStartTimeChange = useCallback(\n (timeString: string) => {\n const { hours, minutes } = parseTimeString(timeString);\n const base = startDate != null\n ? new Date(startDate.getTime())\n : new Date();\n base.setHours(hours, minutes, 0, 0);\n onChange?.([base, endDate ?? null]);\n setStartDateValue(base);\n },\n [startDate, endDate, onChange, setStartDateValue],\n );\n\n const handleEndTimeChange = useCallback(\n (timeString: string) => {\n const { hours, minutes } = parseTimeString(timeString);\n const base = endDate != null ? new Date(endDate.getTime()) : new Date();\n base.setHours(hours, minutes, 0, 0);\n onChange?.([startDate ?? null, base]);\n setEndDateValue(base);\n },\n [startDate, endDate, onChange, setEndDateValue],\n );\n\n // --- Focus boundary handlers ---\n // Visually-hidden sentinels at the top/bottom of the popover that trap Tab\n // cycling between the text inputs and calendar.\n\n // Start boundary (top): Shift+Tab past the first calendar element redirects\n // focus to whichever input is currently active.\n const handleStartFocusBoundary = useCallback(() => {\n getActiveInputRef().current?.focus();\n }, [getActiveInputRef]);\n\n // End boundary (bottom): Two cases —\n // (1) Tab past the last calendar element (focus came from inside the popover)\n // → close the popover and return focus to the active input so the next\n // native Tab continues to the next form field.\n // (2) Focus entered from outside the popover (e.g. reverse Tab from the page)\n // → redirect to the last interactive element inside the popover.\n const handleEndFocusBoundary = useCallback(\n (e: React.FocusEvent<HTMLDivElement>) => {\n const related = e.relatedTarget ?? document.activeElement;\n if (popoverRef.current?.contains(related as Node)) {\n closePopoverForBoundaryExit();\n } else {\n const buttons = popoverRef.current?.querySelectorAll<HTMLElement>(\n \"button, select\",\n );\n const lastButton = buttons?.[buttons.length - 1];\n lastButton?.focus();\n }\n },\n [closePopoverForBoundaryExit],\n );\n\n // --- Calendar selected range ---\n\n const calendarSelected: RdpDateRange | undefined =\n startDate != null || endDate != null\n ? { from: startDate ?? undefined, to: endDate ?? undefined }\n : undefined;\n\n const timeFooter = showTime\n ? (\n <div className={styles.osdkDateRangeTimeRow}>\n <TimePicker\n value={getTimeValue(startDate)}\n onChange={handleStartTimeChange}\n label=\"Start time\"\n />\n <TimePicker\n value={getTimeValue(endDate)}\n onChange={handleEndTimeChange}\n label=\"End time\"\n />\n </div>\n )\n : undefined;\n\n const sharedInputProps = {\n ...SHARED_INPUT_PROPS,\n \"aria-controls\": popoverId,\n };\n\n return (\n <Popover.Root\n open={isOpen}\n onOpenChange={handleOpenChange}\n // Uses pointer-down outside dismissal so the click that opens the picker\n // is not reinterpreted after the portal dismiss layer appears.\n modal=\"trap-focus\"\n >\n <Popover.Trigger\n nativeButton={false}\n render={<div className={styles.osdkDateRangeContainer} />}\n >\n <div\n className={classnames(\n commonStyles.osdkDatePickerInputWrapper,\n styles.osdkDateRangeInputWrapper,\n startInvalid && commonStyles.osdkDatePickerInputWrapperError,\n )}\n >\n <Input\n ref={startInputRef}\n id={id != null ? `${id}-start` : undefined}\n value={displayedStart}\n onValueChange={setStartInputValue}\n onFocus={handleStartFocus}\n onBlur={handleStartBlur}\n onKeyDown={handleStartKeyDown}\n placeholder={placeholderStart}\n aria-expanded={isOpen && activeBoundary === \"start\"}\n aria-label=\"Start date\"\n aria-invalid={startInvalid || undefined}\n {...sharedInputProps}\n />\n </div>\n <div\n className={classnames(\n commonStyles.osdkDatePickerInputWrapper,\n styles.osdkDateRangeInputWrapper,\n endInvalid && commonStyles.osdkDatePickerInputWrapperError,\n )}\n >\n <Input\n ref={endInputRef}\n id={id != null ? `${id}-end` : undefined}\n value={displayedEnd}\n onValueChange={setEndInputValue}\n onFocus={handleEndFocus}\n onBlur={handleEndBlur}\n onKeyDown={handleEndKeyDown}\n placeholder={placeholderEnd}\n aria-expanded={isOpen && activeBoundary === \"end\"}\n aria-label=\"End date\"\n aria-invalid={endInvalid || undefined}\n {...sharedInputProps}\n />\n </div>\n </Popover.Trigger>\n <Popover.Portal container={portalContainer}>\n <PortalDismissLayer\n className={commonStyles.osdkDatePickerDismissLayer}\n onDismiss={closePopover}\n />\n <Popover.Positioner\n className={commonStyles.osdkDatePickerPositioner}\n sideOffset={4}\n >\n <Popover.Popup\n ref={popoverRef}\n className={commonStyles.osdkDatePickerPopover}\n id={popoverId}\n role=\"dialog\"\n aria-label=\"date range picker\"\n // Disable base-ui's automatic focus restoration to the trigger on close.\n // We manage focus ourselves via closePopover() which blurs the inputs.\n finalFocus={false}\n >\n <div\n onFocus={handleStartFocusBoundary}\n tabIndex={0}\n aria-label=\"Start of date range picker dialog\"\n className={commonStyles.osdkDatePickerFocusBoundary}\n />\n <LazyDateRangeCalendar\n selected={calendarSelected}\n onSelect={handleRangeSelect}\n min={min}\n max={max}\n />\n {timeFooter}\n <div\n onFocus={handleEndFocusBoundary}\n tabIndex={0}\n aria-label=\"End of date range picker dialog\"\n className={commonStyles.osdkDatePickerFocusBoundary}\n />\n </Popover.Popup>\n </Popover.Positioner>\n </Popover.Portal>\n </Popover.Root>\n );\n});\n\n/** True when the end boundary is before (or same-day when disallowed) the start. */\nfunction isOverlapping(\n start: Date | null | undefined,\n end: Date | null | undefined,\n allowSingleDayRange: boolean,\n): boolean {\n if (start == null || end == null) return false;\n if (!allowSingleDayRange && end.getTime() === start.getTime()) return true;\n return end.getTime() < start.getTime();\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"DateRangeInputField.js","names":["Input","Popover","classnames","React","useCallback","useId","useRef","useState","formatDateForInput","formatDatetimeForInput","parseDateFromInput","parseDatetimeFromInput","EMPTY_RANGE","stopPropagation","commonStyles","styles","LazyDateRangeCalendar","PortalDismissLayer","TimePicker","useDateEditState","SHARED_INPUT_PROPS","className","osdkDatePickerInput","type","onClick","autoComplete","role","DateRangeInputField","memo","id","value","onChange","min","max","placeholderStart","placeholderEnd","allowSingleDayRange","showTime","formatDate","parseDate","portalContainer","shouldCloseOnSelection","popoverId","triggerRef","startInputRef","endInputRef","popoverRef","isOpen","setIsOpen","skipReopenRef","activeBoundary","setActiveBoundary","startDate","endDate","editFormatFn","displayFormatFn","parseFn","startOnChange","date","isOverlapping","endOnChange","isEditing","isEditingStart","dateValue","startParsedValue","inputError","startInputError","displayedValue","displayedStart","startEditing","beginStartEditing","stopEditing","stopStartEditing","commitAndStopEditing","commitStartAndStopEditing","setInputValue","setStartInputValue","setDateValue","setStartDateValue","isEditingEnd","endParsedValue","endInputError","displayedEnd","beginEndEditing","stopEndEditing","commitEndAndStopEditing","setEndInputValue","setEndDateValue","hasOverlapError","effectiveStart","undefined","effectiveEnd","startInvalid","endInvalid","getActiveInputRef","beginEditing","boundary","handleInputFocus","current","handleStartFocus","handleEndFocus","closePopoverForBoundaryExit","focus","handleStartPointerDown","handleEndPointerDown","handleStartBlur","e","related","relatedTarget","document","activeElement","contains","handleEndBlur","closePopover","blur","handleStartKeyDown","key","preventDefault","shiftKey","handleEndKeyDown","firstButton","querySelector","handleOpenChange","nextOpen","handleRangeSelect","range","newStart","from","newEnd","to","handleStartTimeChange","time","handleEndTimeChange","handleStartFocusBoundary","handleEndFocusBoundary","buttons","querySelectorAll","lastButton","length","calendarSelected","timeFooter","createElement","Fragment","label","sharedInputProps","Root","open","onOpenChange","modal","ref","osdkDateRangeContainer","osdkDatePickerInputWrapper","osdkDateRangeInputWrapper","osdkDatePickerInputWrapperError","Trigger","nativeButton","render","_extends","onValueChange","onFocus","onPointerDown","onBlur","onKeyDown","placeholder","Portal","container","osdkDatePickerDismissLayer","onDismiss","Positioner","anchor","osdkDatePickerPositioner","sideOffset","Popup","osdkDatePickerPopover","finalFocus","tabIndex","osdkDatePickerFocusBoundary","selected","onSelect","footer","start","end","getTime"],"sources":["DateRangeInputField.tsx"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\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 */\n\nimport { Input } from \"@base-ui/react/input\";\nimport { Popover } from \"@base-ui/react/popover\";\nimport classnames from \"classnames\";\nimport React, { useCallback, useId, useRef, useState } from \"react\";\nimport type { DateRange as RdpDateRange } from \"react-day-picker\";\nimport {\n formatDateForInput,\n formatDatetimeForInput,\n parseDateFromInput,\n parseDatetimeFromInput,\n} from \"../../shared/dateUtils.js\";\nimport { type DateRangeInputFieldProps, EMPTY_RANGE } from \"../FormFieldApi.js\";\nimport { stopPropagation } from \"./calendarShared.js\";\nimport commonStyles from \"./DatePickerCommon.module.css\";\nimport styles from \"./DateRangeInputField.module.css\";\nimport { LazyDateRangeCalendar } from \"./LazyDateRangeCalendar.js\";\nimport { PortalDismissLayer } from \"./PortalDismissLayer.js\";\nimport { TimePicker } from \"./TimePicker.js\";\nimport { useDateEditState } from \"./useDateEditState.js\";\n\ntype ActiveBoundary = \"start\" | \"end\";\n\n// Shared props for both start/end inputs. role=\"combobox\" because each input\n// triggers a shared popup (the calendar popover) — matching WAI-ARIA combobox pattern.\nconst SHARED_INPUT_PROPS = {\n className: commonStyles.osdkDatePickerInput,\n type: \"text\" as const,\n onClick: stopPropagation,\n autoComplete: \"off\" as const,\n role: \"combobox\" as const,\n \"aria-haspopup\": \"dialog\" as const,\n} as const;\n\nexport const DateRangeInputField: React.NamedExoticComponent<\n DateRangeInputFieldProps\n> = React.memo(function DateRangeInputField({\n id,\n value,\n onChange,\n min,\n max,\n placeholderStart,\n placeholderEnd,\n allowSingleDayRange = true,\n showTime = false,\n formatDate,\n parseDate,\n portalContainer,\n}: DateRangeInputFieldProps) {\n const shouldCloseOnSelection = !showTime;\n const popoverId = useId();\n // The range container anchors the shared popover without becoming a trigger.\n // Each input is its own Popover.Trigger so the comboboxes are not nested in an\n // interactive wrapper.\n const triggerRef = useRef<HTMLDivElement>(null);\n const startInputRef = useRef<HTMLInputElement>(null);\n const endInputRef = useRef<HTMLInputElement>(null);\n const popoverRef = useRef<HTMLDivElement>(null);\n\n const [isOpen, setIsOpen] = useState(false);\n // When focus returns to an input after Tab exits the popover boundary, the\n // next input focus should not reopen the calendar before native Tab can\n // continue to the following form field.\n const skipReopenRef = useRef(false);\n // Tracks which input (start/end) owns the shared calendar popover.\n // Used to restore focus to the correct input when Tab-cycling through\n // focus boundaries and when the calendar selects a range endpoint.\n const [activeBoundary, setActiveBoundary] = useState<ActiveBoundary>(\"start\");\n\n const [startDate, endDate] = value ?? EMPTY_RANGE;\n\n // editFormatFn produces a parsable string for typing (e.g. \"2024-01-15\" or \"2024-01-15 14:30\").\n // displayFormatFn produces the idle string. Defaults stay deterministic so\n // users in different browser locales see the same date in form inputs.\n const editFormatFn = showTime ? formatDatetimeForInput : formatDateForInput;\n const displayFormatFn = formatDate\n ?? (showTime ? formatDatetimeForInput : formatDateForInput);\n const parseFn = parseDate\n ?? (showTime ? parseDatetimeFromInput : parseDateFromInput);\n\n // Wrap onChange to handle tuple construction and overlap rejection.\n // Clearing (null) is always allowed; overlap is checked for non-null dates.\n const startOnChange = useCallback(\n (date: Date | null) => {\n if (date != null && isOverlapping(date, endDate, allowSingleDayRange)) {\n return;\n }\n onChange?.([date, endDate ?? null]);\n },\n [endDate, onChange, allowSingleDayRange],\n );\n\n const endOnChange = useCallback(\n (date: Date | null) => {\n if (date != null && isOverlapping(startDate, date, allowSingleDayRange)) {\n return;\n }\n onChange?.([startDate ?? null, date]);\n },\n [startDate, onChange, allowSingleDayRange],\n );\n\n const {\n isEditing: isEditingStart,\n dateValue: startParsedValue,\n inputError: startInputError,\n displayedValue: displayedStart,\n startEditing: beginStartEditing,\n stopEditing: stopStartEditing,\n commitAndStopEditing: commitStartAndStopEditing,\n setInputValue: setStartInputValue,\n setDateValue: setStartDateValue,\n } = useDateEditState({\n value: startDate,\n displayFormatFn,\n editFormatFn,\n parseFn,\n min,\n max,\n onChange: startOnChange,\n });\n const {\n isEditing: isEditingEnd,\n dateValue: endParsedValue,\n inputError: endInputError,\n displayedValue: displayedEnd,\n startEditing: beginEndEditing,\n stopEditing: stopEndEditing,\n commitAndStopEditing: commitEndAndStopEditing,\n setInputValue: setEndInputValue,\n setDateValue: setEndDateValue,\n } = useDateEditState({\n value: endDate,\n displayFormatFn,\n editFormatFn,\n parseFn,\n min,\n max,\n onChange: endOnChange,\n });\n\n // --- Cross-input error: overlapping range (live feedback while typing) ---\n // Blur/Enter handlers prevent overlapping values from being committed,\n // so this only fires during editing for immediate red-border feedback.\n const hasOverlapError = (() => {\n if (!isEditingStart && !isEditingEnd) return false;\n const effectiveStart = isEditingStart\n ? startParsedValue\n : (startDate ?? undefined);\n const effectiveEnd = isEditingEnd\n ? endParsedValue\n : (endDate ?? undefined);\n return isOverlapping(effectiveStart, effectiveEnd, allowSingleDayRange);\n })();\n\n const startInvalid = startInputError != null || hasOverlapError;\n const endInvalid = endInputError != null || hasOverlapError;\n\n // --- Focus handlers ---\n\n const getActiveInputRef = useCallback(\n () => activeBoundary === \"start\" ? startInputRef : endInputRef,\n [activeBoundary],\n );\n\n const beginEditing = useCallback(\n (boundary: ActiveBoundary) => {\n if (boundary === \"start\") {\n beginStartEditing();\n } else {\n beginEndEditing();\n }\n setActiveBoundary(boundary);\n },\n [beginStartEditing, beginEndEditing],\n );\n\n const handleInputFocus = useCallback(\n (boundary: ActiveBoundary) => {\n beginEditing(boundary);\n if (skipReopenRef.current) {\n skipReopenRef.current = false;\n return;\n }\n setIsOpen(true);\n },\n [beginEditing],\n );\n\n const handleStartFocus = useCallback(() => {\n handleInputFocus(\"start\");\n }, [handleInputFocus]);\n\n const handleEndFocus = useCallback(() => {\n handleInputFocus(\"end\");\n }, [handleInputFocus]);\n\n const closePopoverForBoundaryExit = useCallback(() => {\n skipReopenRef.current = true;\n setIsOpen(false);\n stopStartEditing();\n stopEndEditing();\n getActiveInputRef().current?.focus();\n }, [getActiveInputRef, stopStartEditing, stopEndEditing]);\n\n const handleStartPointerDown = useCallback(() => {\n // Opening from pointer-down keeps mouse interactions in sync with focus\n // editing before Base UI's later click trigger handler runs.\n startInputRef.current?.focus();\n handleStartFocus();\n }, [handleStartFocus]);\n\n const handleEndPointerDown = useCallback(() => {\n // Opening from pointer-down keeps mouse interactions in sync with focus\n // editing before Base UI's later click trigger handler runs.\n endInputRef.current?.focus();\n handleEndFocus();\n }, [handleEndFocus]);\n\n // --- Blur handlers ---\n\n const handleStartBlur = useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n const related = e.relatedTarget ?? document.activeElement;\n if (popoverRef.current?.contains(related as Node)) {\n // Focus moved into the popover portal — the field is still logically\n // active, so suppress the blur from bubbling to parent containers.\n e.stopPropagation();\n return;\n }\n if (endInputRef.current === related) {\n return;\n }\n commitStartAndStopEditing();\n },\n [commitStartAndStopEditing],\n );\n\n const handleEndBlur = useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n const related = e.relatedTarget ?? document.activeElement;\n if (popoverRef.current?.contains(related as Node)) {\n e.stopPropagation();\n return;\n }\n if (startInputRef.current === related) {\n return;\n }\n commitEndAndStopEditing();\n },\n [commitEndAndStopEditing],\n );\n\n // --- Popover helpers ---\n\n // Shared close sequence: dismiss the popover, reset both editing states,\n // and blur both inputs so focus doesn't linger after the calendar disappears.\n const closePopover = useCallback(() => {\n setIsOpen(false);\n stopStartEditing();\n stopEndEditing();\n startInputRef.current?.blur();\n endInputRef.current?.blur();\n }, [stopStartEditing, stopEndEditing]);\n\n // --- Keyboard handlers ---\n\n const handleStartKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n commitStartAndStopEditing();\n // Auto-advance to end\n endInputRef.current?.focus();\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n closePopover();\n } else if (e.key === \"Tab\" && e.shiftKey) {\n setIsOpen(false);\n }\n },\n [commitStartAndStopEditing, closePopover],\n );\n\n const handleEndKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n commitEndAndStopEditing();\n closePopover();\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n closePopover();\n } else if (e.key === \"Tab\" && !e.shiftKey && isOpen) {\n // Tab from the end input bridges focus into the popover. The popover\n // doesn't auto-focus on open (to keep the cursor in the input for typing),\n // so we manually focus the first interactive element (nav button or select).\n const firstButton = popoverRef.current?.querySelector<HTMLElement>(\n \"button, select\",\n );\n if (firstButton != null) {\n e.preventDefault();\n firstButton.focus();\n }\n }\n },\n [commitEndAndStopEditing, closePopover, isOpen],\n );\n\n // Called by base-ui when the popover opens or closes (e.g. click outside, Escape).\n const handleOpenChange = useCallback(\n (nextOpen: boolean) => {\n if (nextOpen) {\n setIsOpen(true);\n } else {\n closePopover();\n }\n },\n [closePopover],\n );\n\n // --- Calendar handlers ---\n\n const handleRangeSelect = useCallback(\n (range: RdpDateRange | undefined) => {\n const newStart = range?.from ?? null;\n const newEnd = range?.to ?? null;\n\n onChange?.([newStart, newEnd]);\n\n if (newStart != null && newEnd == null) {\n // Start selected — commit the start and advance to end.\n // displayedValue handles the display format after stopEditing.\n stopStartEditing();\n setActiveBoundary(\"end\");\n endInputRef.current?.focus();\n } else if (\n newStart != null\n && newEnd != null\n && shouldCloseOnSelection\n ) {\n // Full range selected — close and blur.\n closePopover();\n } else if (newStart != null && newEnd != null) {\n // Full range selected but popover stays open (showTime) —\n // inputs remain in editing mode, so update with editFormatFn.\n setStartDateValue(newStart);\n setEndDateValue(newEnd);\n }\n },\n [\n onChange,\n shouldCloseOnSelection,\n closePopover,\n stopStartEditing,\n setStartDateValue,\n setEndDateValue,\n ],\n );\n\n // --- Time handlers ---\n\n const handleStartTimeChange = useCallback(\n (time: Date) => {\n onChange?.([time, endDate ?? null]);\n setStartDateValue(time);\n },\n [endDate, onChange, setStartDateValue],\n );\n\n const handleEndTimeChange = useCallback(\n (time: Date) => {\n onChange?.([startDate ?? null, time]);\n setEndDateValue(time);\n },\n [startDate, onChange, setEndDateValue],\n );\n\n // --- Focus boundary handlers ---\n // Visually-hidden sentinels at the top/bottom of the popover that trap Tab\n // cycling between the text inputs and calendar.\n\n // Start boundary (top): Shift+Tab past the first calendar element redirects\n // focus to whichever input is currently active.\n const handleStartFocusBoundary = useCallback(() => {\n getActiveInputRef().current?.focus();\n }, [getActiveInputRef]);\n\n // End boundary (bottom): Two cases —\n // (1) Tab past the last calendar element (focus came from inside the popover)\n // → close the popover and return focus to the active input so the next\n // native Tab continues to the next form field.\n // (2) Focus entered from outside the popover (e.g. reverse Tab from the page)\n // → redirect to the last interactive element inside the popover.\n const handleEndFocusBoundary = useCallback(\n (e: React.FocusEvent<HTMLDivElement>) => {\n const related = e.relatedTarget ?? document.activeElement;\n if (popoverRef.current?.contains(related as Node)) {\n closePopoverForBoundaryExit();\n } else {\n const buttons = popoverRef.current?.querySelectorAll<HTMLElement>(\n \"button, select\",\n );\n const lastButton = buttons?.[buttons.length - 1];\n lastButton?.focus();\n }\n },\n [closePopoverForBoundaryExit],\n );\n\n // --- Calendar selected range ---\n\n const calendarSelected: RdpDateRange | undefined =\n startDate != null || endDate != null\n ? { from: startDate ?? undefined, to: endDate ?? undefined }\n : undefined;\n\n const timeFooter = showTime\n ? (\n <>\n <TimePicker\n value={startDate}\n onChange={handleStartTimeChange}\n label=\"Start time\"\n />\n <TimePicker\n value={endDate}\n onChange={handleEndTimeChange}\n label=\"End time\"\n />\n </>\n )\n : undefined;\n\n const sharedInputProps = {\n ...SHARED_INPUT_PROPS,\n \"aria-controls\": popoverId,\n };\n\n // Keep Popover.Trigger on each input itself. Moving it to the range wrapper\n // would make click handling simpler, but it would also nest interactive\n // comboboxes inside an interactive trigger and reintroduce the axe violation.\n return (\n <Popover.Root\n open={isOpen}\n onOpenChange={handleOpenChange}\n // Uses pointer-down outside dismissal so the click that opens the picker\n // is not reinterpreted after the portal dismiss layer appears.\n modal=\"trap-focus\"\n >\n <div\n ref={triggerRef}\n className={styles.osdkDateRangeContainer}\n >\n <div\n className={classnames(\n commonStyles.osdkDatePickerInputWrapper,\n styles.osdkDateRangeInputWrapper,\n startInvalid && commonStyles.osdkDatePickerInputWrapperError,\n )}\n >\n <Popover.Trigger\n nativeButton={false}\n render={\n <Input\n ref={startInputRef}\n id={id != null ? `${id}-start` : undefined}\n value={displayedStart}\n onValueChange={setStartInputValue}\n onFocus={handleStartFocus}\n onPointerDown={handleStartPointerDown}\n onBlur={handleStartBlur}\n onKeyDown={handleStartKeyDown}\n placeholder={placeholderStart}\n aria-expanded={isOpen && activeBoundary === \"start\"}\n aria-label=\"Start date\"\n aria-invalid={startInvalid || undefined}\n {...sharedInputProps}\n />\n }\n />\n </div>\n <div\n className={classnames(\n commonStyles.osdkDatePickerInputWrapper,\n styles.osdkDateRangeInputWrapper,\n endInvalid && commonStyles.osdkDatePickerInputWrapperError,\n )}\n >\n <Popover.Trigger\n nativeButton={false}\n render={\n <Input\n ref={endInputRef}\n id={id != null ? `${id}-end` : undefined}\n value={displayedEnd}\n onValueChange={setEndInputValue}\n onBlur={handleEndBlur}\n onKeyDown={handleEndKeyDown}\n onFocus={handleEndFocus}\n onPointerDown={handleEndPointerDown}\n placeholder={placeholderEnd}\n aria-expanded={isOpen && activeBoundary === \"end\"}\n aria-label=\"End date\"\n aria-invalid={endInvalid || undefined}\n {...sharedInputProps}\n />\n }\n />\n </div>\n </div>\n <Popover.Portal container={portalContainer}>\n <PortalDismissLayer\n className={commonStyles.osdkDatePickerDismissLayer}\n onDismiss={closePopover}\n />\n <Popover.Positioner\n anchor={triggerRef}\n className={commonStyles.osdkDatePickerPositioner}\n sideOffset={4}\n >\n <Popover.Popup\n ref={popoverRef}\n className={commonStyles.osdkDatePickerPopover}\n id={popoverId}\n role=\"dialog\"\n aria-label=\"date range picker\"\n // Disable base-ui's automatic focus restoration to the trigger on close.\n // We manage focus ourselves via closePopover() which blurs the inputs.\n finalFocus={false}\n >\n <div\n onFocus={handleStartFocusBoundary}\n tabIndex={0}\n aria-label=\"Start of date range picker dialog\"\n className={commonStyles.osdkDatePickerFocusBoundary}\n />\n <LazyDateRangeCalendar\n selected={calendarSelected}\n onSelect={handleRangeSelect}\n min={min}\n max={max}\n footer={timeFooter}\n />\n <div\n onFocus={handleEndFocusBoundary}\n tabIndex={0}\n aria-label=\"End of date range picker dialog\"\n className={commonStyles.osdkDatePickerFocusBoundary}\n />\n </Popover.Popup>\n </Popover.Positioner>\n </Popover.Portal>\n </Popover.Root>\n );\n});\n\n/** True when the end boundary is before (or same-day when disallowed) the start. */\nfunction isOverlapping(\n start: Date | null | undefined,\n end: Date | null | undefined,\n allowSingleDayRange: boolean,\n): boolean {\n if (start == null || end == null) return false;\n if (!allowSingleDayRange && end.getTime() === start.getTime()) return true;\n return end.getTime() < start.getTime();\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -15,18 +15,3 @@
|
|
|
15
15
|
flex: 1;
|
|
16
16
|
min-width: 0;
|
|
17
17
|
}
|
|
18
|
-
|
|
19
|
-
/* Two TimePickers side-by-side, each centered under its calendar month.
|
|
20
|
-
Negative horizontal margin counters the popover padding so the border-top
|
|
21
|
-
spans the full width of the popover. */
|
|
22
|
-
.osdkDateRangeTimeRow {
|
|
23
|
-
display: flex;
|
|
24
|
-
gap: var(--osdk-time-picker-gap);
|
|
25
|
-
padding-top: var(--osdk-time-picker-padding-top);
|
|
26
|
-
padding-left: var(--osdk-datetime-popover-padding);
|
|
27
|
-
padding-right: var(--osdk-datetime-popover-padding);
|
|
28
|
-
margin-top: var(--osdk-time-picker-margin-top);
|
|
29
|
-
margin-left: calc(var(--osdk-datetime-popover-padding) * -1);
|
|
30
|
-
margin-right: calc(var(--osdk-datetime-popover-padding) * -1);
|
|
31
|
-
border-top: var(--osdk-time-picker-border-top);
|
|
32
|
-
}
|
|
@@ -18,7 +18,7 @@ import { Input } from "@base-ui/react/input";
|
|
|
18
18
|
import { Popover } from "@base-ui/react/popover";
|
|
19
19
|
import classnames from "classnames";
|
|
20
20
|
import React, { useCallback, useId, useRef, useState } from "react";
|
|
21
|
-
import {
|
|
21
|
+
import { formatDateForInput, formatDatetimeForInput, isDateInRange, parseDateFromInput, parseDatetimeFromInput } from "../../shared/dateUtils.js";
|
|
22
22
|
import { stopPropagation } from "./calendarShared.js";
|
|
23
23
|
import commonStyles from "./DatePickerCommon.module.css";
|
|
24
24
|
import styles from "./DatetimePickerField.module.css";
|
|
@@ -43,9 +43,17 @@ export const DatetimePickerField = /*#__PURE__*/React.memo(function ({
|
|
|
43
43
|
}) {
|
|
44
44
|
const shouldCloseOnSelection = closeOnSelection ?? !showTime;
|
|
45
45
|
const popoverId = useId();
|
|
46
|
+
// The wrapper is only a visual/positioning anchor. The input itself remains
|
|
47
|
+
// the Popover.Trigger so axe does not see an interactive wrapper around an
|
|
48
|
+
// interactive combobox.
|
|
49
|
+
const wrapperRef = useRef(null);
|
|
46
50
|
const inputRef = useRef(null);
|
|
47
51
|
const popoverRef = useRef(null);
|
|
48
52
|
const [isOpen, setIsOpen] = useState(false);
|
|
53
|
+
// activeDateValue is the selected/typed date; visibleCalendarMonth is only
|
|
54
|
+
// the calendar viewport. Keeping the viewport separate lets typed dates jump
|
|
55
|
+
// the calendar while next/previous month navigation still works.
|
|
56
|
+
const [visibleCalendarMonth, setVisibleCalendarMonth] = useState(value ?? new Date());
|
|
49
57
|
// When true, the next handleFocus call skips reopening the popover.
|
|
50
58
|
// Set before focusing the input from a popover boundary exit so that
|
|
51
59
|
// Tab/Shift-Tab proceeds to the adjacent form field naturally.
|
|
@@ -53,13 +61,16 @@ export const DatetimePickerField = /*#__PURE__*/React.memo(function ({
|
|
|
53
61
|
|
|
54
62
|
// Format/parse: pick between date-only and datetime variants.
|
|
55
63
|
// editFormatFn produces a parsable string for typing (e.g. "2024-01-15" or "2024-01-15 14:30").
|
|
56
|
-
// displayFormatFn produces
|
|
64
|
+
// displayFormatFn produces the idle string. Defaults stay deterministic so
|
|
65
|
+
// users in different browser locales see the same date in form inputs.
|
|
57
66
|
const editFormatFn = showTime ? formatDatetimeForInput : formatDateForInput;
|
|
58
|
-
const displayFormatFn = formatDate ?? (showTime ? formatDatetimeForInput :
|
|
67
|
+
const displayFormatFn = formatDate ?? (showTime ? formatDatetimeForInput : formatDateForInput);
|
|
59
68
|
const parseFn = parseDate ?? (showTime ? parseDatetimeFromInput : parseDateFromInput);
|
|
60
69
|
const {
|
|
70
|
+
isEditing,
|
|
61
71
|
displayedValue,
|
|
62
72
|
inputError,
|
|
73
|
+
dateValue,
|
|
63
74
|
startEditing,
|
|
64
75
|
stopEditing,
|
|
65
76
|
commitAndStopEditing,
|
|
@@ -84,8 +95,22 @@ export const DatetimePickerField = /*#__PURE__*/React.memo(function ({
|
|
|
84
95
|
return;
|
|
85
96
|
}
|
|
86
97
|
startEditing();
|
|
98
|
+
setVisibleCalendarMonth(value ?? undefined);
|
|
87
99
|
setIsOpen(true);
|
|
88
|
-
}, [startEditing]);
|
|
100
|
+
}, [startEditing, value]);
|
|
101
|
+
const handlePointerDown = useCallback(() => {
|
|
102
|
+
// Opening from pointer-down keeps mouse interactions in sync with focus
|
|
103
|
+
// editing before Base UI's later click trigger handler runs.
|
|
104
|
+
inputRef.current?.focus();
|
|
105
|
+
handleFocus();
|
|
106
|
+
}, [handleFocus]);
|
|
107
|
+
const handleInputValueChange = useCallback(nextValue => {
|
|
108
|
+
setInputValue(nextValue);
|
|
109
|
+
const parsedDate = nextValue !== "" ? parseFn(nextValue) : undefined;
|
|
110
|
+
if (parsedDate != null && isDateInRange(parsedDate, min, max)) {
|
|
111
|
+
setVisibleCalendarMonth(parsedDate);
|
|
112
|
+
}
|
|
113
|
+
}, [max, min, parseFn, setInputValue]);
|
|
89
114
|
const handleBlur = useCallback(e => {
|
|
90
115
|
const relatedTarget = e.relatedTarget ?? document.activeElement;
|
|
91
116
|
if (popoverRef.current?.contains(relatedTarget)) {
|
|
@@ -155,20 +180,19 @@ export const DatetimePickerField = /*#__PURE__*/React.memo(function ({
|
|
|
155
180
|
}
|
|
156
181
|
onChange?.(date);
|
|
157
182
|
setDateValue(date);
|
|
183
|
+
setVisibleCalendarMonth(date);
|
|
158
184
|
if (shouldCloseOnSelection) {
|
|
159
185
|
closePopover();
|
|
160
186
|
}
|
|
161
187
|
}, [onChange, showTime, value, shouldCloseOnSelection, setDateValue, setInputValue, closePopover]);
|
|
162
|
-
const handleTimeChange = useCallback(
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
setDateValue(base);
|
|
171
|
-
}, [value, onChange, setDateValue]);
|
|
188
|
+
const handleTimeChange = useCallback(time => {
|
|
189
|
+
onChange?.(time);
|
|
190
|
+
setDateValue(time);
|
|
191
|
+
}, [onChange, setDateValue]);
|
|
192
|
+
const handleCalendarClear = useCallback(() => {
|
|
193
|
+
onChange?.(null);
|
|
194
|
+
setDateValue(null);
|
|
195
|
+
}, [onChange, setDateValue]);
|
|
172
196
|
|
|
173
197
|
// --- Focus boundary handlers ---
|
|
174
198
|
// Visually-hidden elements at the start/end of the popover that trap Tab
|
|
@@ -195,16 +219,20 @@ export const DatetimePickerField = /*#__PURE__*/React.memo(function ({
|
|
|
195
219
|
}
|
|
196
220
|
}, [stopEditing]);
|
|
197
221
|
|
|
198
|
-
// --- Time picker
|
|
199
|
-
// so the border-top can span the full popover width via negative margins) ---
|
|
222
|
+
// --- Time picker ---
|
|
200
223
|
|
|
224
|
+
const activeDateValue = isEditing && inputError == null ? dateValue : value ?? undefined;
|
|
201
225
|
const timeFooter = showTime ? /*#__PURE__*/React.createElement("div", {
|
|
202
226
|
className: styles.osdkDatetimeTimeFooter
|
|
203
227
|
}, /*#__PURE__*/React.createElement(TimePicker, {
|
|
204
|
-
value:
|
|
228
|
+
value: activeDateValue ?? null,
|
|
205
229
|
onChange: handleTimeChange
|
|
206
230
|
})) : undefined;
|
|
207
231
|
const wrapperClassName = classnames(commonStyles.osdkDatePickerInputWrapper, styles.osdkDatetimeInputWrapper, inputError != null && commonStyles.osdkDatePickerInputWrapperError);
|
|
232
|
+
|
|
233
|
+
// Keep Popover.Trigger on the input itself. Moving it to the wrapper would
|
|
234
|
+
// make click handling simpler, but it would also nest an interactive combobox
|
|
235
|
+
// inside an interactive trigger and reintroduce the axe violation.
|
|
208
236
|
return /*#__PURE__*/React.createElement(Popover.Root, {
|
|
209
237
|
open: isOpen,
|
|
210
238
|
onOpenChange: handleOpenChange
|
|
@@ -212,29 +240,30 @@ export const DatetimePickerField = /*#__PURE__*/React.memo(function ({
|
|
|
212
240
|
// is not reinterpreted after the portal dismiss layer appears.
|
|
213
241
|
,
|
|
214
242
|
modal: "trap-focus"
|
|
243
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
244
|
+
ref: wrapperRef,
|
|
245
|
+
className: wrapperClassName
|
|
215
246
|
}, /*#__PURE__*/React.createElement(Popover.Trigger, {
|
|
216
247
|
nativeButton: false,
|
|
217
|
-
render: /*#__PURE__*/React.createElement(
|
|
218
|
-
|
|
219
|
-
|
|
248
|
+
render: /*#__PURE__*/React.createElement(Input, {
|
|
249
|
+
ref: inputRef,
|
|
250
|
+
id: id,
|
|
251
|
+
className: commonStyles.osdkDatePickerInput,
|
|
252
|
+
type: "text",
|
|
253
|
+
value: displayedValue,
|
|
254
|
+
onValueChange: handleInputValueChange,
|
|
255
|
+
onFocus: handleFocus,
|
|
256
|
+
onPointerDown: handlePointerDown,
|
|
257
|
+
onBlur: handleBlur,
|
|
258
|
+
onClick: stopPropagation,
|
|
259
|
+
onKeyDown: handleKeyDown,
|
|
260
|
+
placeholder: placeholder,
|
|
261
|
+
autoComplete: "off",
|
|
262
|
+
role: "combobox",
|
|
263
|
+
"aria-expanded": isOpen,
|
|
264
|
+
"aria-controls": popoverId,
|
|
265
|
+
"aria-haspopup": "dialog"
|
|
220
266
|
})
|
|
221
|
-
}, /*#__PURE__*/React.createElement(Input, {
|
|
222
|
-
ref: inputRef,
|
|
223
|
-
id: id,
|
|
224
|
-
className: commonStyles.osdkDatePickerInput,
|
|
225
|
-
type: "text",
|
|
226
|
-
value: displayedValue,
|
|
227
|
-
onValueChange: setInputValue,
|
|
228
|
-
onFocus: handleFocus,
|
|
229
|
-
onBlur: handleBlur,
|
|
230
|
-
onClick: stopPropagation,
|
|
231
|
-
onKeyDown: handleKeyDown,
|
|
232
|
-
placeholder: placeholder,
|
|
233
|
-
autoComplete: "off",
|
|
234
|
-
role: "combobox",
|
|
235
|
-
"aria-expanded": isOpen,
|
|
236
|
-
"aria-controls": popoverId,
|
|
237
|
-
"aria-haspopup": "dialog"
|
|
238
267
|
})), /*#__PURE__*/React.createElement(Popover.Portal, {
|
|
239
268
|
ref: portalRef,
|
|
240
269
|
container: portalContainer
|
|
@@ -242,6 +271,7 @@ export const DatetimePickerField = /*#__PURE__*/React.memo(function ({
|
|
|
242
271
|
className: commonStyles.osdkDatePickerDismissLayer,
|
|
243
272
|
onDismiss: closePopover
|
|
244
273
|
}), /*#__PURE__*/React.createElement(Popover.Positioner, {
|
|
274
|
+
anchor: wrapperRef,
|
|
245
275
|
className: commonStyles.osdkDatePickerPositioner,
|
|
246
276
|
sideOffset: 4
|
|
247
277
|
}, /*#__PURE__*/React.createElement(Popover.Popup, {
|
|
@@ -260,11 +290,15 @@ export const DatetimePickerField = /*#__PURE__*/React.memo(function ({
|
|
|
260
290
|
"aria-label": "Start of date picker dialog",
|
|
261
291
|
className: commonStyles.osdkDatePickerFocusBoundary
|
|
262
292
|
}), /*#__PURE__*/React.createElement(LazyDateCalendar, {
|
|
263
|
-
dateSelected:
|
|
293
|
+
dateSelected: activeDateValue,
|
|
264
294
|
onSelect: handleCalendarSelect,
|
|
295
|
+
onClear: handleCalendarClear,
|
|
296
|
+
month: visibleCalendarMonth,
|
|
297
|
+
onMonthChange: setVisibleCalendarMonth,
|
|
265
298
|
min: min,
|
|
266
|
-
max: max
|
|
267
|
-
|
|
299
|
+
max: max,
|
|
300
|
+
footer: timeFooter
|
|
301
|
+
}), /*#__PURE__*/React.createElement("div", {
|
|
268
302
|
onFocus: handleEndFocusBoundary,
|
|
269
303
|
tabIndex: 0,
|
|
270
304
|
"aria-label": "End of date picker dialog",
|