@okta/odyssey-react-mui 1.28.1 → 1.29.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/CHANGELOG.md +8 -0
- package/dist/Breadcrumbs.js +1 -0
- package/dist/Breadcrumbs.js.map +1 -1
- package/dist/Buttons/MenuItem.js +1 -0
- package/dist/Buttons/MenuItem.js.map +1 -1
- package/dist/Checkbox.js +62 -35
- package/dist/Checkbox.js.map +1 -1
- package/dist/DataTable/reorderDataRowsLocally.js.map +1 -1
- package/dist/DataTable/useRowReordering.js.map +1 -1
- package/dist/HtmlProps.js.map +1 -1
- package/dist/Pagination/Pagination.js +2 -1
- package/dist/Pagination/Pagination.js.map +1 -1
- package/dist/Radio.js +65 -38
- package/dist/Radio.js.map +1 -1
- package/dist/Typography.js +20 -0
- package/dist/Typography.js.map +1 -1
- package/dist/index.scss +1 -1
- package/dist/labs/DataFilters.js +9 -5
- package/dist/labs/DataFilters.js.map +1 -1
- package/dist/labs/DataTable.js +7 -7
- package/dist/labs/DataTable.js.map +1 -1
- package/dist/labs/DataView/BulkActionsMenu.js.map +1 -1
- package/dist/labs/DataView/CardLayoutContent.js +6 -5
- package/dist/labs/DataView/CardLayoutContent.js.map +1 -1
- package/dist/labs/DataView/DataCard.js +1 -0
- package/dist/labs/DataView/DataCard.js.map +1 -1
- package/dist/labs/DataView/DataTable.js.map +1 -1
- package/dist/labs/DataView/DataView.js +2 -2
- package/dist/labs/DataView/DataView.js.map +1 -1
- package/dist/labs/DataView/DetailPanel.js.map +1 -1
- package/dist/labs/DataView/RowActions.js.map +1 -1
- package/dist/labs/DataView/TableLayoutContent.js +1 -1
- package/dist/labs/DataView/TableLayoutContent.js.map +1 -1
- package/dist/labs/DataView/TableSettings.js.map +1 -1
- package/dist/labs/DataView/componentTypes.js.map +1 -1
- package/dist/labs/DataView/dataTypes.js.map +1 -1
- package/dist/labs/DataView/fetchData.js.map +1 -1
- package/dist/labs/DataView/testSupportData.js +201 -0
- package/dist/labs/DataView/testSupportData.js.map +1 -0
- package/dist/labs/DataView/useFilterConversion.js.map +1 -1
- package/dist/labs/{DateField.js → DatePickers/DateField.js} +1 -1
- package/dist/labs/DatePickers/DateField.js.map +1 -0
- package/dist/labs/DatePickers/DateFieldActionBar.js +56 -0
- package/dist/labs/DatePickers/DateFieldActionBar.js.map +1 -0
- package/dist/labs/DatePickers/DateFieldLocalizationProvider.js +32 -0
- package/dist/labs/DatePickers/DateFieldLocalizationProvider.js.map +1 -0
- package/dist/labs/{DatePicker.js → DatePickers/DatePicker.js} +30 -73
- package/dist/labs/DatePickers/DatePicker.js.map +1 -0
- package/dist/labs/DatePickers/DatePicker.types.d.js.map +1 -0
- package/dist/labs/DatePickers/DateTimeField.js +166 -0
- package/dist/labs/DatePickers/DateTimeField.js.map +1 -0
- package/dist/labs/DatePickers/DateTimePicker.js +233 -0
- package/dist/labs/DatePickers/DateTimePicker.js.map +1 -0
- package/dist/labs/{datePickerTheme.js → DatePickers/datePickerTheme.js} +2 -2
- package/dist/labs/DatePickers/datePickerTheme.js.map +1 -0
- package/dist/labs/DatePickers/dateTimePickerTheme.js +230 -0
- package/dist/labs/DatePickers/dateTimePickerTheme.js.map +1 -0
- package/dist/labs/DatePickers/index.js +15 -0
- package/dist/labs/DatePickers/index.js.map +1 -0
- package/dist/labs/DatePickers/useDateFieldsTranslations.js.map +1 -0
- package/dist/labs/{useOdysseyDateFields.js → DatePickers/useOdysseyDateFields.js} +36 -3
- package/dist/labs/DatePickers/useOdysseyDateFields.js.map +1 -0
- package/dist/labs/PageTemplate.js +1 -1
- package/dist/labs/PageTemplate.js.map +1 -1
- package/dist/labs/SideNav/SideNav.js +40 -34
- package/dist/labs/SideNav/SideNav.js.map +1 -1
- package/dist/labs/SideNav/SideNavHeader.js +6 -4
- package/dist/labs/SideNav/SideNavHeader.js.map +1 -1
- package/dist/labs/SideNav/SideNavItemContent.js +11 -11
- package/dist/labs/SideNav/SideNavItemContent.js.map +1 -1
- package/dist/labs/SideNav/SideNavToggleButton.js +1 -1
- package/dist/labs/SideNav/SideNavToggleButton.js.map +1 -1
- package/dist/labs/SideNav/types.js.map +1 -1
- package/dist/labs/TimeZonePicker.js.map +1 -1
- package/dist/labs/index.js +1 -3
- package/dist/labs/index.js.map +1 -1
- package/dist/properties/ts/odyssey-react-mui.js +2 -0
- package/dist/properties/ts/odyssey-react-mui.js.map +1 -1
- package/dist/src/Breadcrumbs.d.ts.map +1 -1
- package/dist/src/Buttons/MenuItem.d.ts.map +1 -1
- package/dist/src/Checkbox.d.ts.map +1 -1
- package/dist/src/DataTable/reorderDataRowsLocally.d.ts +3 -3
- package/dist/src/DataTable/reorderDataRowsLocally.d.ts.map +1 -1
- package/dist/src/DataTable/useRowReordering.d.ts +10 -10
- package/dist/src/DataTable/useRowReordering.d.ts.map +1 -1
- package/dist/src/HtmlProps.d.ts +27 -0
- package/dist/src/HtmlProps.d.ts.map +1 -1
- package/dist/src/OdysseyTranslationProvider.d.ts +1 -1
- package/dist/src/OdysseyTranslationProvider.d.ts.map +1 -1
- package/dist/src/Radio.d.ts +1 -1
- package/dist/src/Radio.d.ts.map +1 -1
- package/dist/src/Typography.d.ts +11 -11
- package/dist/src/Typography.d.ts.map +1 -1
- package/dist/src/labs/DataFilters.d.ts.map +1 -1
- package/dist/src/labs/DataTable.d.ts +11 -11
- package/dist/src/labs/DataTable.d.ts.map +1 -1
- package/dist/src/labs/DataView/BulkActionsMenu.d.ts +3 -3
- package/dist/src/labs/DataView/BulkActionsMenu.d.ts.map +1 -1
- package/dist/src/labs/DataView/CardLayoutContent.d.ts +18 -15
- package/dist/src/labs/DataView/CardLayoutContent.d.ts.map +1 -1
- package/dist/src/labs/DataView/DataCard.d.ts +7 -4
- package/dist/src/labs/DataView/DataCard.d.ts.map +1 -1
- package/dist/src/labs/DataView/DataTable.d.ts +6 -2
- package/dist/src/labs/DataView/DataTable.d.ts.map +1 -1
- package/dist/src/labs/DataView/DataView.d.ts +6 -2
- package/dist/src/labs/DataView/DataView.d.ts.map +1 -1
- package/dist/src/labs/DataView/DetailPanel.d.ts +5 -5
- package/dist/src/labs/DataView/DetailPanel.d.ts.map +1 -1
- package/dist/src/labs/DataView/RowActions.d.ts +3 -3
- package/dist/src/labs/DataView/RowActions.d.ts.map +1 -1
- package/dist/src/labs/DataView/TableLayoutContent.d.ts +18 -15
- package/dist/src/labs/DataView/TableLayoutContent.d.ts.map +1 -1
- package/dist/src/labs/DataView/TableSettings.d.ts +7 -3
- package/dist/src/labs/DataView/TableSettings.d.ts.map +1 -1
- package/dist/src/labs/DataView/componentTypes.d.ts +17 -17
- package/dist/src/labs/DataView/componentTypes.d.ts.map +1 -1
- package/dist/src/labs/DataView/dataTypes.d.ts +6 -6
- package/dist/src/labs/DataView/dataTypes.d.ts.map +1 -1
- package/dist/src/labs/DataView/fetchData.d.ts +6 -6
- package/dist/src/labs/DataView/fetchData.d.ts.map +1 -1
- package/dist/src/labs/DataView/testSupportData.d.ts +33 -0
- package/dist/src/labs/DataView/testSupportData.d.ts.map +1 -0
- package/dist/src/labs/DataView/useFilterConversion.d.ts +5 -4
- package/dist/src/labs/DataView/useFilterConversion.d.ts.map +1 -1
- package/dist/src/labs/{DateField.d.ts → DatePickers/DateField.d.ts} +1 -1
- package/dist/src/labs/DatePickers/DateField.d.ts.map +1 -0
- package/dist/src/labs/DatePickers/DateFieldActionBar.d.ts +15 -0
- package/dist/src/labs/DatePickers/DateFieldActionBar.d.ts.map +1 -0
- package/dist/src/labs/DatePickers/DateFieldLocalizationProvider.d.ts +20 -0
- package/dist/src/labs/DatePickers/DateFieldLocalizationProvider.d.ts.map +1 -0
- package/dist/src/labs/DatePickers/DatePicker.d.ts +17 -0
- package/dist/src/labs/DatePickers/DatePicker.d.ts.map +1 -0
- package/dist/src/labs/DatePickers/DateTimeField.d.ts +20 -0
- package/dist/src/labs/DatePickers/DateTimeField.d.ts.map +1 -0
- package/dist/src/labs/DatePickers/DateTimePicker.d.ts +17 -0
- package/dist/src/labs/DatePickers/DateTimePicker.d.ts.map +1 -0
- package/dist/src/labs/DatePickers/datePickerTheme.d.ts +22 -0
- package/dist/src/labs/DatePickers/datePickerTheme.d.ts.map +1 -0
- package/dist/src/labs/{datePickerTheme.d.ts → DatePickers/dateTimePickerTheme.d.ts} +2 -2
- package/dist/src/labs/DatePickers/dateTimePickerTheme.d.ts.map +1 -0
- package/dist/src/labs/DatePickers/index.d.ts +15 -0
- package/dist/src/labs/DatePickers/index.d.ts.map +1 -0
- package/dist/src/labs/DatePickers/useDateFieldsTranslations.d.ts.map +1 -0
- package/dist/src/labs/{useOdysseyDateFields.d.ts → DatePickers/useOdysseyDateFields.d.ts} +49 -6
- package/dist/src/labs/DatePickers/useOdysseyDateFields.d.ts.map +1 -0
- package/dist/src/labs/SideNav/SideNav.d.ts.map +1 -1
- package/dist/src/labs/SideNav/SideNavHeader.d.ts.map +1 -1
- package/dist/src/labs/SideNav/SideNavItemContent.d.ts +1 -1
- package/dist/src/labs/SideNav/SideNavItemContent.d.ts.map +1 -1
- package/dist/src/labs/SideNav/types.d.ts +2 -2
- package/dist/src/labs/SideNav/types.d.ts.map +1 -1
- package/dist/src/labs/TimeZonePicker.d.ts +4 -1
- package/dist/src/labs/TimeZonePicker.d.ts.map +1 -1
- package/dist/src/labs/index.d.ts +1 -3
- package/dist/src/labs/index.d.ts.map +1 -1
- package/dist/src/properties/ts/odyssey-react-mui.d.ts +2 -0
- package/dist/src/properties/ts/odyssey-react-mui.d.ts.map +1 -1
- package/dist/src/theme/components.d.ts.map +1 -1
- package/dist/src/theme/mixins.d.ts.map +1 -1
- package/dist/src/theme/mixins.types.d.ts +2 -0
- package/dist/src/theme/mixins.types.d.ts.map +1 -1
- package/dist/src/{labs → ui-shell}/UiShell/UiShell.d.ts +2 -2
- package/dist/src/ui-shell/UiShell/UiShell.d.ts.map +1 -0
- package/dist/src/{labs → ui-shell}/UiShell/UiShellContent.d.ts +12 -8
- package/dist/src/ui-shell/UiShell/UiShellContent.d.ts.map +1 -0
- package/dist/src/ui-shell/UiShell/bufferLatest.d.ts.map +1 -0
- package/dist/src/ui-shell/UiShell/createMessageBus.d.ts.map +1 -0
- package/dist/src/ui-shell/UiShell/createStore.d.ts.map +1 -0
- package/dist/src/ui-shell/UiShell/index.d.ts.map +1 -0
- package/dist/src/{labs → ui-shell}/UiShell/renderUiShell.d.ts +3 -4
- package/dist/src/ui-shell/UiShell/renderUiShell.d.ts.map +1 -0
- package/dist/src/{labs → ui-shell}/UiShell/useHasUiShell.d.ts +1 -0
- package/dist/src/ui-shell/UiShell/useHasUiShell.d.ts.map +1 -0
- package/dist/src/ui-shell/UiShell/useScrollState.d.ts.map +1 -0
- package/dist/src/ui-shell/index.d.ts +14 -0
- package/dist/src/ui-shell/index.d.ts.map +1 -0
- package/dist/src/{web-component → ui-shell}/renderReactInWebComponent.d.ts +3 -23
- package/dist/src/ui-shell/renderReactInWebComponent.d.ts.map +1 -0
- package/dist/src/web-component/index.d.ts +0 -1
- package/dist/src/web-component/index.d.ts.map +1 -1
- package/dist/src/web-component/shadow-dom.d.ts +23 -2
- package/dist/src/web-component/shadow-dom.d.ts.map +1 -1
- package/dist/theme/components.js +38 -4
- package/dist/theme/components.js.map +1 -1
- package/dist/theme/mixins.js +2 -1
- package/dist/theme/mixins.js.map +1 -1
- package/dist/theme/mixins.types.js.map +1 -1
- package/dist/tsconfig.production.tsbuildinfo +1 -1
- package/dist/{labs → ui-shell}/UiShell/UiShell.js +2 -0
- package/dist/ui-shell/UiShell/UiShell.js.map +1 -0
- package/dist/{labs → ui-shell}/UiShell/UiShellContent.js +19 -11
- package/dist/ui-shell/UiShell/UiShellContent.js.map +1 -0
- package/dist/ui-shell/UiShell/bufferLatest.js.map +1 -0
- package/dist/ui-shell/UiShell/createMessageBus.js.map +1 -0
- package/dist/ui-shell/UiShell/createStore.js.map +1 -0
- package/dist/ui-shell/UiShell/index.js.map +1 -0
- package/dist/{labs → ui-shell}/UiShell/renderUiShell.js +4 -2
- package/dist/ui-shell/UiShell/renderUiShell.js.map +1 -0
- package/dist/{labs → ui-shell}/UiShell/useHasUiShell.js +1 -1
- package/dist/ui-shell/UiShell/useHasUiShell.js.map +1 -0
- package/dist/ui-shell/UiShell/useScrollState.js.map +1 -0
- package/dist/ui-shell/index.js +14 -0
- package/dist/ui-shell/index.js.map +1 -0
- package/dist/{web-component → ui-shell}/renderReactInWebComponent.js +7 -17
- package/dist/ui-shell/renderReactInWebComponent.js.map +1 -0
- package/dist/web-component/index.js +0 -1
- package/dist/web-component/index.js.map +1 -1
- package/dist/web-component/shadow-dom.js +12 -2
- package/dist/web-component/shadow-dom.js.map +1 -1
- package/package.json +10 -3
- package/src/Breadcrumbs.tsx +5 -1
- package/src/Buttons/MenuItem.tsx +1 -0
- package/src/Checkbox.tsx +86 -44
- package/src/DataTable/reorderDataRowsLocally.tsx +3 -3
- package/src/DataTable/useRowReordering.tsx +16 -23
- package/src/HtmlProps.ts +27 -0
- package/src/Pagination/Pagination.tsx +2 -2
- package/src/Radio.tsx +78 -39
- package/src/Typography.tsx +26 -1
- package/src/labs/DataFilters.tsx +7 -3
- package/src/labs/DataTable.tsx +41 -33
- package/src/labs/DataView/BulkActionsMenu.tsx +4 -4
- package/src/labs/DataView/CardLayoutContent.tsx +34 -28
- package/src/labs/DataView/DataCard.tsx +13 -6
- package/src/labs/DataView/DataTable.tsx +11 -4
- package/src/labs/DataView/DataView.test.tsx +1012 -87
- package/src/labs/DataView/DataView.tsx +18 -11
- package/src/labs/DataView/DetailPanel.tsx +4 -4
- package/src/labs/DataView/RowActions.tsx +4 -4
- package/src/labs/DataView/TableLayoutContent.tsx +30 -24
- package/src/labs/DataView/TableSettings.tsx +12 -6
- package/src/labs/DataView/componentTypes.ts +17 -17
- package/src/labs/DataView/dataTypes.ts +14 -8
- package/src/labs/DataView/fetchData.ts +9 -7
- package/src/labs/DataView/testSupportData.tsx +301 -0
- package/src/labs/DataView/useFilterConversion.ts +8 -8
- package/src/labs/{DateField.tsx → DatePickers/DateField.tsx} +2 -2
- package/src/labs/DatePickers/DateFieldActionBar.tsx +65 -0
- package/src/labs/DatePickers/DateFieldLocalizationProvider.tsx +46 -0
- package/src/labs/{DatePicker.tsx → DatePickers/DatePicker.tsx} +31 -136
- package/src/labs/DatePickers/DateTimeField.tsx +271 -0
- package/src/labs/DatePickers/DateTimePicker.test.tsx +66 -0
- package/src/labs/DatePickers/DateTimePicker.tsx +303 -0
- package/src/labs/{datePickerTheme.tsx → DatePickers/datePickerTheme.tsx} +2 -2
- package/src/labs/DatePickers/dateTimePickerTheme.ts +213 -0
- package/src/labs/DatePickers/index.ts +15 -0
- package/src/labs/{useOdysseyDateFields.ts → DatePickers/useOdysseyDateFields.ts} +112 -10
- package/src/labs/PageTemplate.tsx +1 -1
- package/src/labs/SideNav/SideNav.tsx +38 -39
- package/src/labs/SideNav/SideNavHeader.tsx +6 -4
- package/src/labs/SideNav/SideNavItemContent.tsx +21 -18
- package/src/labs/SideNav/SideNavToggleButton.tsx +1 -1
- package/src/labs/SideNav/types.ts +2 -2
- package/src/labs/TimeZonePicker.tsx +5 -1
- package/src/labs/index.ts +2 -3
- package/src/properties/odyssey-react-mui.properties +2 -0
- package/src/properties/ts/odyssey-react-mui.ts +1 -1
- package/src/theme/components.tsx +45 -4
- package/src/theme/mixins.ts +1 -0
- package/src/theme/mixins.types.ts +2 -0
- package/src/{labs → ui-shell}/UiShell/UiShell.tsx +3 -0
- package/src/{labs → ui-shell}/UiShell/UiShellContent.tsx +60 -31
- package/src/{labs → ui-shell}/UiShell/renderUiShell.test.tsx +16 -22
- package/src/{labs → ui-shell}/UiShell/renderUiShell.tsx +7 -4
- package/src/{labs → ui-shell}/UiShell/useHasUiShell.ts +1 -1
- package/src/ui-shell/index.ts +14 -0
- package/src/{web-component → ui-shell}/renderReactInWebComponent.test.tsx +1 -1
- package/src/{web-component → ui-shell}/renderReactInWebComponent.ts +9 -45
- package/src/web-component/index.ts +0 -1
- package/src/web-component/shadow-dom.ts +36 -3
- package/dist/labs/DateField.js.map +0 -1
- package/dist/labs/DatePicker.js.map +0 -1
- package/dist/labs/DatePicker.types.d.js.map +0 -1
- package/dist/labs/UiShell/UiShell.js.map +0 -1
- package/dist/labs/UiShell/UiShellContent.js.map +0 -1
- package/dist/labs/UiShell/bufferLatest.js.map +0 -1
- package/dist/labs/UiShell/createMessageBus.js.map +0 -1
- package/dist/labs/UiShell/createStore.js.map +0 -1
- package/dist/labs/UiShell/index.js.map +0 -1
- package/dist/labs/UiShell/renderUiShell.js.map +0 -1
- package/dist/labs/UiShell/useHasUiShell.js.map +0 -1
- package/dist/labs/UiShell/useScrollState.js.map +0 -1
- package/dist/labs/datePickerTheme.js.map +0 -1
- package/dist/labs/useDateFieldsTranslations.js.map +0 -1
- package/dist/labs/useOdysseyDateFields.js.map +0 -1
- package/dist/src/labs/DateField.d.ts.map +0 -1
- package/dist/src/labs/DatePicker.d.ts +0 -47
- package/dist/src/labs/DatePicker.d.ts.map +0 -1
- package/dist/src/labs/UiShell/UiShell.d.ts.map +0 -1
- package/dist/src/labs/UiShell/UiShellContent.d.ts.map +0 -1
- package/dist/src/labs/UiShell/bufferLatest.d.ts.map +0 -1
- package/dist/src/labs/UiShell/createMessageBus.d.ts.map +0 -1
- package/dist/src/labs/UiShell/createStore.d.ts.map +0 -1
- package/dist/src/labs/UiShell/index.d.ts.map +0 -1
- package/dist/src/labs/UiShell/renderUiShell.d.ts.map +0 -1
- package/dist/src/labs/UiShell/useHasUiShell.d.ts.map +0 -1
- package/dist/src/labs/UiShell/useScrollState.d.ts.map +0 -1
- package/dist/src/labs/datePickerTheme.d.ts.map +0 -1
- package/dist/src/labs/useDateFieldsTranslations.d.ts.map +0 -1
- package/dist/src/labs/useOdysseyDateFields.d.ts.map +0 -1
- package/dist/src/web-component/renderReactInWebComponent.d.ts.map +0 -1
- package/dist/web-component/renderReactInWebComponent.js.map +0 -1
- /package/dist/labs/{DatePicker.types.d.js → DatePickers/DatePicker.types.d.js} +0 -0
- /package/dist/labs/{useDateFieldsTranslations.js → DatePickers/useDateFieldsTranslations.js} +0 -0
- /package/dist/src/labs/{useDateFieldsTranslations.d.ts → DatePickers/useDateFieldsTranslations.d.ts} +0 -0
- /package/dist/src/{labs → ui-shell}/UiShell/bufferLatest.d.ts +0 -0
- /package/dist/src/{labs → ui-shell}/UiShell/createMessageBus.d.ts +0 -0
- /package/dist/src/{labs → ui-shell}/UiShell/createStore.d.ts +0 -0
- /package/dist/src/{labs → ui-shell}/UiShell/index.d.ts +0 -0
- /package/dist/src/{labs → ui-shell}/UiShell/useScrollState.d.ts +0 -0
- /package/dist/{labs → ui-shell}/UiShell/bufferLatest.js +0 -0
- /package/dist/{labs → ui-shell}/UiShell/createMessageBus.js +0 -0
- /package/dist/{labs → ui-shell}/UiShell/createStore.js +0 -0
- /package/dist/{labs → ui-shell}/UiShell/index.js +0 -0
- /package/dist/{labs → ui-shell}/UiShell/useScrollState.js +0 -0
- /package/src/labs/{DatePicker.types.d.ts → DatePickers/DatePicker.types.d.ts} +0 -0
- /package/src/labs/{useDateFieldsTranslations.ts → DatePickers/useDateFieldsTranslations.ts} +0 -0
- /package/src/{labs → ui-shell}/UiShell/UiShell.test.tsx +0 -0
- /package/src/{labs → ui-shell}/UiShell/bufferLatest.test.ts +0 -0
- /package/src/{labs → ui-shell}/UiShell/bufferLatest.ts +0 -0
- /package/src/{labs → ui-shell}/UiShell/createMessageBus.test.ts +0 -0
- /package/src/{labs → ui-shell}/UiShell/createMessageBus.ts +0 -0
- /package/src/{labs → ui-shell}/UiShell/createStore.test.ts +0 -0
- /package/src/{labs → ui-shell}/UiShell/createStore.ts +0 -0
- /package/src/{labs → ui-shell}/UiShell/index.ts +0 -0
- /package/src/{labs → ui-shell}/UiShell/useScrollState.ts +0 -0
|
@@ -10,49 +10,33 @@
|
|
|
10
10
|
* See the License for the specific language governing permissions and limitations under the License.
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
|
-
import {
|
|
14
|
-
FocusEventHandler,
|
|
15
|
-
memo,
|
|
16
|
-
useCallback,
|
|
17
|
-
useEffect,
|
|
18
|
-
useMemo,
|
|
19
|
-
useRef,
|
|
20
|
-
useState,
|
|
21
|
-
} from "react";
|
|
13
|
+
import { memo, useCallback, useEffect, useMemo, useRef } from "react";
|
|
22
14
|
import { useTranslation } from "react-i18next";
|
|
23
15
|
import {
|
|
24
16
|
type DatePickerSlots,
|
|
25
17
|
DatePicker as MuiDatePicker,
|
|
26
18
|
DatePickerProps as MuiDatePickerProps,
|
|
27
|
-
LocalizationProvider,
|
|
28
|
-
PickersActionBarProps,
|
|
29
19
|
DatePickerSlotProps,
|
|
30
20
|
} from "@mui/x-date-pickers";
|
|
31
21
|
import { DateTime } from "luxon";
|
|
32
|
-
import { AdapterLuxon } from "@mui/x-date-pickers/AdapterLuxon";
|
|
33
22
|
import styled from "@emotion/styled";
|
|
34
23
|
|
|
35
|
-
import { Button } from "
|
|
36
|
-
import {
|
|
37
|
-
ArrowLeftIcon,
|
|
38
|
-
ArrowRightIcon,
|
|
39
|
-
CalendarIcon,
|
|
40
|
-
ChevronDownIcon,
|
|
41
|
-
} from "../icons.generated";
|
|
24
|
+
import { Button } from "../../Buttons";
|
|
25
|
+
import { DateFieldActionBar } from "./DateFieldActionBar";
|
|
42
26
|
import { DateField, DateFieldProps } from "./DateField";
|
|
27
|
+
import { DateFieldLocalizationProvider } from "./DateFieldLocalizationProvider";
|
|
43
28
|
import { datePickerTheme } from "./datePickerTheme";
|
|
44
|
-
import { FieldComponentProps } from "
|
|
29
|
+
import { FieldComponentProps } from "../../FieldComponentProps";
|
|
45
30
|
import {
|
|
46
31
|
useOdysseyDesignTokens,
|
|
47
32
|
DesignTokens,
|
|
48
|
-
} from "
|
|
49
|
-
import { OdysseyThemeProvider } from "
|
|
50
|
-
import { TimeZonePicker
|
|
33
|
+
} from "../../OdysseyDesignTokensContext";
|
|
34
|
+
import { OdysseyThemeProvider } from "../../OdysseyThemeProvider";
|
|
35
|
+
import { TimeZonePicker } from "../TimeZonePicker";
|
|
51
36
|
|
|
52
37
|
import {
|
|
53
38
|
useOdysseyDateFields,
|
|
54
39
|
OdysseyDateFieldProps,
|
|
55
|
-
TimeZoneOption,
|
|
56
40
|
} from "./useOdysseyDateFields";
|
|
57
41
|
|
|
58
42
|
const DatePickerContainer = styled.div({
|
|
@@ -76,82 +60,12 @@ const TimeZonePickerContainer = styled("div", {
|
|
|
76
60
|
marginBlockStart: odysseyDesignTokens.Spacing3,
|
|
77
61
|
}));
|
|
78
62
|
|
|
79
|
-
const ActionContainer = styled.div<{ odysseyDesignTokens: DesignTokens }>(
|
|
80
|
-
({ odysseyDesignTokens }) => ({
|
|
81
|
-
display: "flex",
|
|
82
|
-
justifyContent: "flex-end",
|
|
83
|
-
paddingInline: odysseyDesignTokens.Spacing4,
|
|
84
|
-
paddingBlockEnd: odysseyDesignTokens.Spacing4,
|
|
85
|
-
}),
|
|
86
|
-
);
|
|
87
|
-
|
|
88
|
-
const ActionBar = ({ actions, onAccept, onCancel }: PickersActionBarProps) => {
|
|
89
|
-
const { t } = useTranslation();
|
|
90
|
-
const odysseyDesignTokens = useOdysseyDesignTokens();
|
|
91
|
-
|
|
92
|
-
// actions will be [] or ["accept", "cancel"]
|
|
93
|
-
if (actions && actions.length > 0) {
|
|
94
|
-
return (
|
|
95
|
-
<ActionContainer odysseyDesignTokens={odysseyDesignTokens}>
|
|
96
|
-
<Button
|
|
97
|
-
label={t("picker.labels.action.cancel")}
|
|
98
|
-
onClick={onCancel}
|
|
99
|
-
variant="floating"
|
|
100
|
-
/>
|
|
101
|
-
<Button
|
|
102
|
-
label={t("picker.labels.action.apply")}
|
|
103
|
-
onClick={onAccept}
|
|
104
|
-
variant="primary"
|
|
105
|
-
/>
|
|
106
|
-
</ActionContainer>
|
|
107
|
-
);
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
return null;
|
|
111
|
-
};
|
|
112
|
-
|
|
113
|
-
const MemoizedActionBar = memo(ActionBar);
|
|
114
|
-
MemoizedActionBar.displayName = "ActionBar";
|
|
115
|
-
|
|
116
|
-
const formatDayOfWeek = (date: DateTime) => date.toFormat("EEE");
|
|
117
|
-
|
|
118
63
|
type RenderDateFieldProps = {
|
|
119
64
|
defaultValue: DateFieldProps["defaultValue"];
|
|
120
65
|
value: DateFieldProps["value"];
|
|
121
66
|
} & MuiDatePickerProps<DateTime>;
|
|
122
67
|
|
|
123
|
-
export type DatePickerProps =
|
|
124
|
-
/**
|
|
125
|
-
* The label for the `input` element.
|
|
126
|
-
*/
|
|
127
|
-
label: string;
|
|
128
|
-
/**
|
|
129
|
-
* Callback fired when the a date field loses focus
|
|
130
|
-
*/
|
|
131
|
-
onBlur?: FocusEventHandler<HTMLInputElement>;
|
|
132
|
-
/**
|
|
133
|
-
* Callback fired when the a date is selected with the calendar.
|
|
134
|
-
*/
|
|
135
|
-
onCalendarDateChange?: ({
|
|
136
|
-
value,
|
|
137
|
-
timeZone,
|
|
138
|
-
}: {
|
|
139
|
-
value: string | undefined;
|
|
140
|
-
timeZone: string;
|
|
141
|
-
}) => void;
|
|
142
|
-
/**
|
|
143
|
-
* Callback fired when the date/text input changes.
|
|
144
|
-
*/
|
|
145
|
-
onInputChange?: (value: string) => void;
|
|
146
|
-
/**
|
|
147
|
-
* If provided, a `TimeZonePicker` will be rendered below the DatePicker. These options will populate as the Autocomplete options
|
|
148
|
-
*/
|
|
149
|
-
timeZoneOptions?: TimeZoneOption[];
|
|
150
|
-
/**
|
|
151
|
-
* label for `TimeZonePicker`
|
|
152
|
-
*/
|
|
153
|
-
timeZonePickerLabel?: TimeZonePickerProps["label"];
|
|
154
|
-
} & OdysseyDateFieldProps &
|
|
68
|
+
export type DatePickerProps = OdysseyDateFieldProps &
|
|
155
69
|
Pick<
|
|
156
70
|
FieldComponentProps,
|
|
157
71
|
| "errorMessage"
|
|
@@ -189,18 +103,25 @@ const DatePicker = ({
|
|
|
189
103
|
const odysseyDesignTokens = useOdysseyDesignTokens();
|
|
190
104
|
|
|
191
105
|
const {
|
|
106
|
+
closeCalendar,
|
|
107
|
+
commonIcons,
|
|
192
108
|
defaultedLanguageCode,
|
|
193
109
|
formatDateTimeToUtcIsoDateString,
|
|
110
|
+
formatDayOfWeek,
|
|
194
111
|
inputValues,
|
|
195
112
|
internalTimeZone,
|
|
196
|
-
|
|
113
|
+
isOpen,
|
|
197
114
|
localeText,
|
|
198
115
|
minDate,
|
|
199
116
|
maxDate,
|
|
200
|
-
|
|
117
|
+
onInputChange,
|
|
118
|
+
onTimeZoneChange,
|
|
119
|
+
popperElement,
|
|
120
|
+
setPopperElement,
|
|
201
121
|
shouldDisableDate,
|
|
202
122
|
shouldDisableMonth,
|
|
203
123
|
shouldDisableYear,
|
|
124
|
+
toggleCalendarVisibility,
|
|
204
125
|
} = useOdysseyDateFields({
|
|
205
126
|
defaultValue: defaultValueProp,
|
|
206
127
|
errorMessage,
|
|
@@ -209,18 +130,17 @@ const DatePicker = ({
|
|
|
209
130
|
isYearEnabled,
|
|
210
131
|
minDate: minDateProp,
|
|
211
132
|
maxDate: maxDateProp,
|
|
133
|
+
onInputChange: onInputChangeProp,
|
|
212
134
|
timeZone,
|
|
213
135
|
value: valueProp,
|
|
214
136
|
});
|
|
215
|
-
const [isOpen, setIsOpen] = useState(false);
|
|
216
|
-
const [popperElement, setPopperElement] = useState<HTMLInputElement | null>();
|
|
217
137
|
|
|
218
138
|
const { language } = i18n;
|
|
219
139
|
const containerRef = useRef<HTMLInputElement>(null);
|
|
220
140
|
|
|
221
141
|
useEffect(() => {
|
|
222
142
|
setPopperElement(containerRef.current);
|
|
223
|
-
}, []);
|
|
143
|
+
}, [setPopperElement]);
|
|
224
144
|
|
|
225
145
|
const formatDateTimeToJsDateStringOnCalendarSelection = useCallback<
|
|
226
146
|
NonNullable<MuiDatePickerProps<DateTime>["onChange"]>
|
|
@@ -240,22 +160,6 @@ const DatePicker = ({
|
|
|
240
160
|
[formatDateTimeToUtcIsoDateString, internalTimeZone, onCalendarDateChange],
|
|
241
161
|
);
|
|
242
162
|
|
|
243
|
-
const onInputChange = useCallback<(value: string) => void>(
|
|
244
|
-
(value) => {
|
|
245
|
-
onInputChangeProp?.(value);
|
|
246
|
-
},
|
|
247
|
-
[onInputChangeProp],
|
|
248
|
-
);
|
|
249
|
-
|
|
250
|
-
const toggleCalendarVisibility = useCallback(
|
|
251
|
-
() => setIsOpen(!isOpen),
|
|
252
|
-
[isOpen],
|
|
253
|
-
);
|
|
254
|
-
|
|
255
|
-
const resetIsOpen = useCallback(() => {
|
|
256
|
-
setIsOpen(false);
|
|
257
|
-
}, []);
|
|
258
|
-
|
|
259
163
|
const renderDateField = useCallback(
|
|
260
164
|
({ defaultValue, inputRef, value }: RenderDateFieldProps) => {
|
|
261
165
|
return (
|
|
@@ -267,7 +171,7 @@ const DatePicker = ({
|
|
|
267
171
|
label=""
|
|
268
172
|
onClick={toggleCalendarVisibility}
|
|
269
173
|
size="small"
|
|
270
|
-
startIcon={<CalendarIcon />}
|
|
174
|
+
startIcon={<commonIcons.CalendarIcon />}
|
|
271
175
|
variant="floating"
|
|
272
176
|
/>
|
|
273
177
|
}
|
|
@@ -289,6 +193,7 @@ const DatePicker = ({
|
|
|
289
193
|
);
|
|
290
194
|
},
|
|
291
195
|
[
|
|
196
|
+
commonIcons,
|
|
292
197
|
errorMessage,
|
|
293
198
|
hint,
|
|
294
199
|
HintLinkComponent,
|
|
@@ -308,13 +213,13 @@ const DatePicker = ({
|
|
|
308
213
|
|
|
309
214
|
const slots = useMemo<DatePickerSlots<DateTime>>(
|
|
310
215
|
() => ({
|
|
311
|
-
actionBar:
|
|
216
|
+
actionBar: DateFieldActionBar,
|
|
312
217
|
field: (muiProps) => renderDateField(muiProps),
|
|
313
|
-
leftArrowIcon: () => <ArrowLeftIcon />,
|
|
314
|
-
rightArrowIcon: () => <ArrowRightIcon />,
|
|
315
|
-
switchViewIcon: () => <ChevronDownIcon />,
|
|
218
|
+
leftArrowIcon: () => <commonIcons.ArrowLeftIcon />,
|
|
219
|
+
rightArrowIcon: () => <commonIcons.ArrowRightIcon />,
|
|
220
|
+
switchViewIcon: () => <commonIcons.ChevronDownIcon />,
|
|
316
221
|
}),
|
|
317
|
-
[renderDateField],
|
|
222
|
+
[commonIcons, renderDateField],
|
|
318
223
|
);
|
|
319
224
|
|
|
320
225
|
const slotProps = useMemo<DatePickerSlotProps<DateTime, false>>(
|
|
@@ -337,20 +242,10 @@ const DatePicker = ({
|
|
|
337
242
|
[popperElement],
|
|
338
243
|
);
|
|
339
244
|
|
|
340
|
-
const onTimeZoneChange = useCallback(
|
|
341
|
-
(timeZone: string | undefined) => {
|
|
342
|
-
if (timeZone && isValidTimeZone(timeZone)) {
|
|
343
|
-
setInternalTimeZone(timeZone);
|
|
344
|
-
}
|
|
345
|
-
},
|
|
346
|
-
[isValidTimeZone, setInternalTimeZone],
|
|
347
|
-
);
|
|
348
|
-
|
|
349
245
|
return (
|
|
350
246
|
<OdysseyThemeProvider themeOverride={datePickerTheme}>
|
|
351
|
-
<
|
|
352
|
-
|
|
353
|
-
adapterLocale={defaultedLanguageCode}
|
|
247
|
+
<DateFieldLocalizationProvider
|
|
248
|
+
defaultedLanguageCode={defaultedLanguageCode}
|
|
354
249
|
localeText={localeText}
|
|
355
250
|
>
|
|
356
251
|
<DatePickerContainer>
|
|
@@ -369,7 +264,7 @@ const DatePicker = ({
|
|
|
369
264
|
minDate={minDate}
|
|
370
265
|
maxDate={maxDate}
|
|
371
266
|
onChange={formatDateTimeToJsDateStringOnCalendarSelection}
|
|
372
|
-
onClose={
|
|
267
|
+
onClose={closeCalendar}
|
|
373
268
|
open={isOpen}
|
|
374
269
|
readOnly={isReadOnly}
|
|
375
270
|
shouldDisableDate={shouldDisableDate}
|
|
@@ -393,7 +288,7 @@ const DatePicker = ({
|
|
|
393
288
|
/>
|
|
394
289
|
</TimeZonePickerContainer>
|
|
395
290
|
)}
|
|
396
|
-
</
|
|
291
|
+
</DateFieldLocalizationProvider>
|
|
397
292
|
</OdysseyThemeProvider>
|
|
398
293
|
);
|
|
399
294
|
};
|
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) 2022-present, Okta, Inc. and/or its affiliates. All rights reserved.
|
|
3
|
+
* The Okta software accompanied by this notice is provided pursuant to the Apache License, Version 2.0 (the "License.")
|
|
4
|
+
*
|
|
5
|
+
* You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.
|
|
6
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
7
|
+
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
8
|
+
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
9
|
+
*
|
|
10
|
+
* See the License for the specific language governing permissions and limitations under the License.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import {
|
|
14
|
+
FocusEventHandler,
|
|
15
|
+
memo,
|
|
16
|
+
useCallback,
|
|
17
|
+
useEffect,
|
|
18
|
+
useImperativeHandle,
|
|
19
|
+
useRef,
|
|
20
|
+
useState,
|
|
21
|
+
} from "react";
|
|
22
|
+
import { InputAdornment } from "@mui/material";
|
|
23
|
+
import {
|
|
24
|
+
DateTimeField as MuiDateTimeField,
|
|
25
|
+
DateTimeFieldProps as MuiDateTimeFieldProps,
|
|
26
|
+
DateTimeValidationError,
|
|
27
|
+
} from "@mui/x-date-pickers";
|
|
28
|
+
import { DateTime } from "luxon";
|
|
29
|
+
import { useTranslation } from "react-i18next";
|
|
30
|
+
|
|
31
|
+
import { Field, RenderFieldComponentProps } from "../../Field";
|
|
32
|
+
import { TextFieldProps } from "../../TextField";
|
|
33
|
+
|
|
34
|
+
export type DateTimeFieldProps = {
|
|
35
|
+
onChange?: (value: string) => void;
|
|
36
|
+
} & Pick<
|
|
37
|
+
MuiDateTimeFieldProps<DateTime>,
|
|
38
|
+
"defaultValue" | "inputRef" | "minDate" | "maxDate" | "timezone" | "value"
|
|
39
|
+
> &
|
|
40
|
+
Pick<
|
|
41
|
+
TextFieldProps,
|
|
42
|
+
| "endAdornment"
|
|
43
|
+
| "errorMessage"
|
|
44
|
+
| "hasInitialFocus"
|
|
45
|
+
| "hint"
|
|
46
|
+
| "HintLinkComponent"
|
|
47
|
+
| "id"
|
|
48
|
+
| "isDisabled"
|
|
49
|
+
| "isOptional"
|
|
50
|
+
| "isReadOnly"
|
|
51
|
+
| "label"
|
|
52
|
+
| "onBlur"
|
|
53
|
+
| "onFocus"
|
|
54
|
+
>;
|
|
55
|
+
|
|
56
|
+
const useOdysseyDateError = () => {
|
|
57
|
+
const { t } = useTranslation();
|
|
58
|
+
|
|
59
|
+
return new Map<DateTimeValidationError, string>([
|
|
60
|
+
["invalidDate", t("picker.error.invalid")],
|
|
61
|
+
["maxDate", t("picker.error.maxdate")],
|
|
62
|
+
["minDate", t("picker.error.mindate")],
|
|
63
|
+
]);
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
const formatDateTimeToUtcIsoDateString = (value: DateTime) =>
|
|
67
|
+
value.toUTC().toISO();
|
|
68
|
+
|
|
69
|
+
const DateTimeField = ({
|
|
70
|
+
defaultValue,
|
|
71
|
+
endAdornment,
|
|
72
|
+
errorMessage,
|
|
73
|
+
hasInitialFocus,
|
|
74
|
+
hint,
|
|
75
|
+
HintLinkComponent,
|
|
76
|
+
id: idOverride,
|
|
77
|
+
inputRef,
|
|
78
|
+
isDisabled = false,
|
|
79
|
+
isOptional = false,
|
|
80
|
+
isReadOnly,
|
|
81
|
+
label,
|
|
82
|
+
minDate,
|
|
83
|
+
maxDate,
|
|
84
|
+
onBlur,
|
|
85
|
+
onChange,
|
|
86
|
+
onFocus,
|
|
87
|
+
timezone,
|
|
88
|
+
value,
|
|
89
|
+
}: DateTimeFieldProps) => {
|
|
90
|
+
const errorMap = useOdysseyDateError();
|
|
91
|
+
const [displayedErrorMessage, setDisplayedErrorMessage] =
|
|
92
|
+
useState(errorMessage);
|
|
93
|
+
|
|
94
|
+
const internalValidationError = useRef<string | undefined>();
|
|
95
|
+
const localInputRef = useRef<HTMLInputElement>(null);
|
|
96
|
+
|
|
97
|
+
useImperativeHandle(
|
|
98
|
+
inputRef,
|
|
99
|
+
() => {
|
|
100
|
+
return {
|
|
101
|
+
focus: () => {
|
|
102
|
+
localInputRef.current?.focus();
|
|
103
|
+
},
|
|
104
|
+
};
|
|
105
|
+
},
|
|
106
|
+
[],
|
|
107
|
+
);
|
|
108
|
+
|
|
109
|
+
const checkMinMaxValidity = useCallback(
|
|
110
|
+
(value: DateTime) => {
|
|
111
|
+
const hasMinError = minDate && value.toUTC() < minDate.toUTC();
|
|
112
|
+
const hasMaxError = maxDate && value.toUTC() > maxDate.toUTC();
|
|
113
|
+
|
|
114
|
+
if (hasMinError || hasMaxError) {
|
|
115
|
+
if (hasMinError) {
|
|
116
|
+
setDisplayedErrorMessage(errorMap.get("minDate"));
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
if (hasMaxError) {
|
|
120
|
+
setDisplayedErrorMessage(errorMap.get("maxDate"));
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
return false;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
return true;
|
|
127
|
+
},
|
|
128
|
+
[errorMap, minDate, maxDate],
|
|
129
|
+
);
|
|
130
|
+
|
|
131
|
+
useEffect(() => {
|
|
132
|
+
if (value) {
|
|
133
|
+
checkMinMaxValidity(value);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
if (defaultValue) {
|
|
137
|
+
checkMinMaxValidity(defaultValue);
|
|
138
|
+
}
|
|
139
|
+
}, [checkMinMaxValidity, defaultValue, minDate, maxDate, value]);
|
|
140
|
+
|
|
141
|
+
const clearErrorMessages = useCallback(() => {
|
|
142
|
+
setDisplayedErrorMessage(undefined);
|
|
143
|
+
internalValidationError.current = undefined;
|
|
144
|
+
}, [internalValidationError, setDisplayedErrorMessage]);
|
|
145
|
+
|
|
146
|
+
const validateAndCallOnChange = useCallback<
|
|
147
|
+
NonNullable<MuiDateTimeFieldProps<DateTime>["onChange"]>
|
|
148
|
+
>(
|
|
149
|
+
(value, validationContext) => {
|
|
150
|
+
clearErrorMessages();
|
|
151
|
+
const { validationError } = validationContext;
|
|
152
|
+
const hasEnteredFullYear = value?.year.toString().length === 4;
|
|
153
|
+
|
|
154
|
+
if (validationError) {
|
|
155
|
+
const odysseyValidationError = errorMap.get(validationError);
|
|
156
|
+
|
|
157
|
+
if (odysseyValidationError) {
|
|
158
|
+
internalValidationError.current = odysseyValidationError;
|
|
159
|
+
|
|
160
|
+
if (value?.isValid && hasEnteredFullYear) {
|
|
161
|
+
setDisplayedErrorMessage(odysseyValidationError);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
if (value?.isValid && !validationError) {
|
|
167
|
+
const dateStringFromDateTime = formatDateTimeToUtcIsoDateString(value);
|
|
168
|
+
|
|
169
|
+
if (dateStringFromDateTime && checkMinMaxValidity(value)) {
|
|
170
|
+
onChange?.(dateStringFromDateTime);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
},
|
|
174
|
+
[checkMinMaxValidity, clearErrorMessages, errorMap, onChange],
|
|
175
|
+
);
|
|
176
|
+
|
|
177
|
+
const checkFieldValidityAndSetError = useCallback<
|
|
178
|
+
FocusEventHandler<HTMLInputElement>
|
|
179
|
+
>(
|
|
180
|
+
(event) => {
|
|
181
|
+
if (internalValidationError?.current && !displayedErrorMessage) {
|
|
182
|
+
setDisplayedErrorMessage(internalValidationError.current);
|
|
183
|
+
}
|
|
184
|
+
onBlur?.(event);
|
|
185
|
+
},
|
|
186
|
+
[displayedErrorMessage, internalValidationError, onBlur],
|
|
187
|
+
);
|
|
188
|
+
|
|
189
|
+
const hasVisibleAdornment = !isReadOnly && !isDisabled;
|
|
190
|
+
|
|
191
|
+
const renderFieldComponent = useCallback(
|
|
192
|
+
({
|
|
193
|
+
ariaDescribedBy,
|
|
194
|
+
errorMessageElementId,
|
|
195
|
+
id,
|
|
196
|
+
labelElementId,
|
|
197
|
+
}: RenderFieldComponentProps) => (
|
|
198
|
+
<MuiDateTimeField
|
|
199
|
+
/* eslint-disable-next-line jsx-a11y/no-autofocus */
|
|
200
|
+
autoFocus={hasInitialFocus}
|
|
201
|
+
defaultValue={defaultValue}
|
|
202
|
+
disabled={isDisabled}
|
|
203
|
+
id={id}
|
|
204
|
+
inputProps={{
|
|
205
|
+
"aria-describedby": ariaDescribedBy,
|
|
206
|
+
"aria-errormessage": errorMessageElementId,
|
|
207
|
+
"aria-labelledby": labelElementId,
|
|
208
|
+
}}
|
|
209
|
+
InputProps={{
|
|
210
|
+
error: Boolean(displayedErrorMessage || errorMessage),
|
|
211
|
+
endAdornment: (
|
|
212
|
+
<>
|
|
213
|
+
{hasVisibleAdornment && (
|
|
214
|
+
<InputAdornment position="end">{endAdornment}</InputAdornment>
|
|
215
|
+
)}
|
|
216
|
+
</>
|
|
217
|
+
),
|
|
218
|
+
}}
|
|
219
|
+
inputRef={localInputRef}
|
|
220
|
+
minDate={minDate}
|
|
221
|
+
maxDate={maxDate}
|
|
222
|
+
name={id}
|
|
223
|
+
onBlur={checkFieldValidityAndSetError}
|
|
224
|
+
onChange={validateAndCallOnChange}
|
|
225
|
+
onFocus={onFocus}
|
|
226
|
+
readOnly={isReadOnly}
|
|
227
|
+
timezone={timezone}
|
|
228
|
+
value={value}
|
|
229
|
+
variant="standard"
|
|
230
|
+
/>
|
|
231
|
+
),
|
|
232
|
+
[
|
|
233
|
+
checkFieldValidityAndSetError,
|
|
234
|
+
defaultValue,
|
|
235
|
+
displayedErrorMessage,
|
|
236
|
+
endAdornment,
|
|
237
|
+
errorMessage,
|
|
238
|
+
hasInitialFocus,
|
|
239
|
+
hasVisibleAdornment,
|
|
240
|
+
isDisabled,
|
|
241
|
+
localInputRef,
|
|
242
|
+
minDate,
|
|
243
|
+
maxDate,
|
|
244
|
+
onFocus,
|
|
245
|
+
isReadOnly,
|
|
246
|
+
timezone,
|
|
247
|
+
validateAndCallOnChange,
|
|
248
|
+
value,
|
|
249
|
+
],
|
|
250
|
+
);
|
|
251
|
+
|
|
252
|
+
return (
|
|
253
|
+
<Field
|
|
254
|
+
errorMessage={displayedErrorMessage || errorMessage}
|
|
255
|
+
fieldType="single"
|
|
256
|
+
hasVisibleLabel
|
|
257
|
+
hint={hint}
|
|
258
|
+
HintLinkComponent={HintLinkComponent}
|
|
259
|
+
id={idOverride}
|
|
260
|
+
isDisabled={isDisabled}
|
|
261
|
+
isOptional={isOptional}
|
|
262
|
+
label={label}
|
|
263
|
+
renderFieldComponent={renderFieldComponent}
|
|
264
|
+
/>
|
|
265
|
+
);
|
|
266
|
+
};
|
|
267
|
+
|
|
268
|
+
const MemoizedDateTimeField = memo(DateTimeField);
|
|
269
|
+
MemoizedDateTimeField.displayName = "DateTimeField";
|
|
270
|
+
|
|
271
|
+
export { MemoizedDateTimeField as DateTimeField };
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) 2024-present, Okta, Inc. and/or its affiliates. All rights reserved.
|
|
3
|
+
* The Okta software accompanied by this notice is provided pursuant to the Apache License, Version 2.0 (the "License.")
|
|
4
|
+
*
|
|
5
|
+
* You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.
|
|
6
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
7
|
+
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
8
|
+
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
9
|
+
*
|
|
10
|
+
* See the License for the specific language governing permissions and limitations under the License.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import { render, screen } from "@testing-library/react";
|
|
14
|
+
import { DateTimePicker } from "./DateTimePicker";
|
|
15
|
+
|
|
16
|
+
jest.mock("react-i18next", () => ({
|
|
17
|
+
// this mock makes sure any components using the translate hook can use it without a warning being shown
|
|
18
|
+
useTranslation: () => {
|
|
19
|
+
return {
|
|
20
|
+
t: jest.fn((str) => str),
|
|
21
|
+
i18n: {
|
|
22
|
+
language: "en",
|
|
23
|
+
},
|
|
24
|
+
};
|
|
25
|
+
},
|
|
26
|
+
initReactI18next: {
|
|
27
|
+
type: "3rdParty",
|
|
28
|
+
init: () => {},
|
|
29
|
+
},
|
|
30
|
+
}));
|
|
31
|
+
|
|
32
|
+
describe("DateTimePicker", () => {
|
|
33
|
+
it("displays the DateTimePicker", async () => {
|
|
34
|
+
render(<DateTimePicker label="date time picker label" />);
|
|
35
|
+
|
|
36
|
+
const input = await screen.getByLabelText("date time picker label");
|
|
37
|
+
expect(input).toBeInTheDocument();
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
it("displays the correct date and time when a value is passed in ", async () => {
|
|
41
|
+
render(
|
|
42
|
+
<DateTimePicker
|
|
43
|
+
label="date time picker label"
|
|
44
|
+
value="2024-07-11T03:00:00.000Z"
|
|
45
|
+
timeZone="America/New_York"
|
|
46
|
+
/>,
|
|
47
|
+
);
|
|
48
|
+
|
|
49
|
+
const input = await screen.getByLabelText("date time picker label");
|
|
50
|
+
expect(input).toBeInTheDocument();
|
|
51
|
+
expect(input).toHaveDisplayValue("07/10/2024 11:00 PM");
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
it("displays the correct date and time when timezone is changed", async () => {
|
|
55
|
+
render(
|
|
56
|
+
<DateTimePicker
|
|
57
|
+
label="date time picker label"
|
|
58
|
+
value="2024-07-11T03:00:00.000Z"
|
|
59
|
+
timeZone="America/Los_Angeles"
|
|
60
|
+
/>,
|
|
61
|
+
);
|
|
62
|
+
|
|
63
|
+
const input = screen.getByLabelText("date time picker label");
|
|
64
|
+
expect(input).toHaveDisplayValue("07/10/2024 08:00 PM");
|
|
65
|
+
});
|
|
66
|
+
});
|