@okta/odyssey-react-mui 1.20.0 → 1.21.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 +43 -0
- package/dist/DataTable/DataTable.js +101 -63
- package/dist/DataTable/DataTable.js.map +1 -1
- package/dist/Pagination/Pagination.js +29 -20
- package/dist/Pagination/Pagination.js.map +1 -1
- package/dist/Pagination/usePagination.js +13 -22
- package/dist/Pagination/usePagination.js.map +1 -1
- package/dist/assertEnv.js +1 -1
- package/dist/index.scss +1 -1
- package/dist/labs/DataComponents/DataStack.js +6 -0
- package/dist/labs/DataComponents/DataStack.js.map +1 -1
- package/dist/labs/DataComponents/DataTable.js +6 -0
- package/dist/labs/DataComponents/DataTable.js.map +1 -1
- package/dist/labs/DataComponents/DataView.js +15 -1
- package/dist/labs/DataComponents/DataView.js.map +1 -1
- package/dist/labs/DataComponents/TableContent.js +49 -3
- package/dist/labs/DataComponents/TableContent.js.map +1 -1
- package/dist/labs/DataComponents/TableSettings.js +28 -38
- package/dist/labs/DataComponents/TableSettings.js.map +1 -1
- package/dist/labs/DataComponents/componentTypes.js.map +1 -1
- package/dist/labs/DataComponents/constants.js.map +1 -1
- package/dist/labs/DataComponents/tableConstants.js +0 -19
- package/dist/labs/DataComponents/tableConstants.js.map +1 -1
- package/dist/labs/DataComponents/useFilterConversion.js +8 -15
- package/dist/labs/DataComponents/useFilterConversion.js.map +1 -1
- package/dist/labs/DateField.js +97 -10
- package/dist/labs/DateField.js.map +1 -1
- package/dist/labs/DatePicker.js +113 -51
- package/dist/labs/DatePicker.js.map +1 -1
- package/dist/labs/TimeZonePicker.js +37 -0
- package/dist/labs/TimeZonePicker.js.map +1 -0
- package/dist/labs/TopNav.js +280 -0
- package/dist/labs/TopNav.js.map +1 -0
- package/dist/labs/datePickerTheme.js +8 -5
- package/dist/labs/datePickerTheme.js.map +1 -1
- package/dist/labs/index.js +1 -0
- package/dist/labs/index.js.map +1 -1
- package/dist/labs/{useDatePickerTranslations.js → useDateFieldsTranslations.js} +2 -2
- package/dist/labs/{useDatePickerTranslations.js.map → useDateFieldsTranslations.js.map} +1 -1
- package/dist/labs/useOdysseyDateFields.js +101 -0
- package/dist/labs/useOdysseyDateFields.js.map +1 -0
- package/dist/properties/ts/odyssey-react-mui.js +3 -0
- package/dist/properties/ts/odyssey-react-mui.js.map +1 -1
- package/dist/src/Autocomplete.d.ts +2 -1
- package/dist/src/Autocomplete.d.ts.map +1 -1
- package/dist/src/Badge.d.ts +0 -1
- package/dist/src/Badge.d.ts.map +1 -1
- package/dist/src/Banner.d.ts +0 -1
- package/dist/src/Banner.d.ts.map +1 -1
- package/dist/src/ButtonContext.d.ts +0 -1
- package/dist/src/ButtonContext.d.ts.map +1 -1
- package/dist/src/Checkbox.d.ts +0 -1
- package/dist/src/Checkbox.d.ts.map +1 -1
- package/dist/src/CircularProgress.d.ts +0 -1
- package/dist/src/CircularProgress.d.ts.map +1 -1
- package/dist/src/DataTable/DataTable.d.ts +14 -1
- package/dist/src/DataTable/DataTable.d.ts.map +1 -1
- package/dist/src/DataTable/useRowReordering.d.ts.map +1 -1
- package/dist/src/ErrorMessageList.d.ts +0 -1
- package/dist/src/ErrorMessageList.d.ts.map +1 -1
- package/dist/src/Field.d.ts.map +1 -1
- package/dist/src/FieldError.d.ts +0 -1
- package/dist/src/FieldError.d.ts.map +1 -1
- package/dist/src/FieldHint.d.ts +0 -1
- package/dist/src/FieldHint.d.ts.map +1 -1
- package/dist/src/FieldLabel.d.ts +0 -1
- package/dist/src/FieldLabel.d.ts.map +1 -1
- package/dist/src/FieldsetContext.d.ts +0 -1
- package/dist/src/FieldsetContext.d.ts.map +1 -1
- package/dist/src/HintLink.d.ts +0 -1
- package/dist/src/HintLink.d.ts.map +1 -1
- package/dist/src/MuiPropsContext.d.ts +0 -1
- package/dist/src/MuiPropsContext.d.ts.map +1 -1
- package/dist/src/NativeSelect.d.ts +4 -4
- package/dist/src/NativeSelect.d.ts.map +1 -1
- package/dist/src/OdysseyDesignTokensContext.d.ts +0 -1
- package/dist/src/OdysseyDesignTokensContext.d.ts.map +1 -1
- package/dist/src/OdysseyProvider.d.ts +2 -1
- package/dist/src/OdysseyProvider.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/Pagination/Pagination.d.ts +41 -26
- package/dist/src/Pagination/Pagination.d.ts.map +1 -1
- package/dist/src/Pagination/usePagination.d.ts +2 -1
- package/dist/src/Pagination/usePagination.d.ts.map +1 -1
- package/dist/src/PasswordField.d.ts +10 -10
- package/dist/src/PasswordField.d.ts.map +1 -1
- package/dist/src/Radio.d.ts +0 -1
- package/dist/src/Radio.d.ts.map +1 -1
- package/dist/src/SearchField.d.ts +11 -11
- package/dist/src/SearchField.d.ts.map +1 -1
- package/dist/src/Select.d.ts +0 -1
- package/dist/src/Select.d.ts.map +1 -1
- package/dist/src/Status.d.ts +0 -1
- package/dist/src/Status.d.ts.map +1 -1
- package/dist/src/Tabs.d.ts.map +1 -1
- package/dist/src/TagListContext.d.ts +0 -1
- package/dist/src/TagListContext.d.ts.map +1 -1
- package/dist/src/TextField.d.ts +12 -12
- package/dist/src/TextField.d.ts.map +1 -1
- package/dist/src/Toast.d.ts +0 -1
- package/dist/src/Toast.d.ts.map +1 -1
- package/dist/src/icons.generated/Add.d.ts +0 -1
- package/dist/src/icons.generated/Add.d.ts.map +1 -1
- package/dist/src/icons.generated/AddCircle.d.ts +0 -1
- package/dist/src/icons.generated/AddCircle.d.ts.map +1 -1
- package/dist/src/icons.generated/Apps.d.ts +0 -1
- package/dist/src/icons.generated/Apps.d.ts.map +1 -1
- package/dist/src/icons.generated/ArrowBottom.d.ts +0 -1
- package/dist/src/icons.generated/ArrowBottom.d.ts.map +1 -1
- package/dist/src/icons.generated/ArrowDown.d.ts +0 -1
- package/dist/src/icons.generated/ArrowDown.d.ts.map +1 -1
- package/dist/src/icons.generated/ArrowLeft.d.ts +0 -1
- package/dist/src/icons.generated/ArrowLeft.d.ts.map +1 -1
- package/dist/src/icons.generated/ArrowLowerLeft.d.ts +0 -1
- package/dist/src/icons.generated/ArrowLowerLeft.d.ts.map +1 -1
- package/dist/src/icons.generated/ArrowLowerRight.d.ts +0 -1
- package/dist/src/icons.generated/ArrowLowerRight.d.ts.map +1 -1
- package/dist/src/icons.generated/ArrowRight.d.ts +0 -1
- package/dist/src/icons.generated/ArrowRight.d.ts.map +1 -1
- package/dist/src/icons.generated/ArrowTop.d.ts +0 -1
- package/dist/src/icons.generated/ArrowTop.d.ts.map +1 -1
- package/dist/src/icons.generated/ArrowUnsorted.d.ts +0 -1
- package/dist/src/icons.generated/ArrowUnsorted.d.ts.map +1 -1
- package/dist/src/icons.generated/ArrowUp.d.ts +0 -1
- package/dist/src/icons.generated/ArrowUp.d.ts.map +1 -1
- package/dist/src/icons.generated/ArrowUpperLeft.d.ts +0 -1
- package/dist/src/icons.generated/ArrowUpperLeft.d.ts.map +1 -1
- package/dist/src/icons.generated/ArrowUpperRight.d.ts +0 -1
- package/dist/src/icons.generated/ArrowUpperRight.d.ts.map +1 -1
- package/dist/src/icons.generated/Bug.d.ts +0 -1
- package/dist/src/icons.generated/Bug.d.ts.map +1 -1
- package/dist/src/icons.generated/Calendar.d.ts +0 -1
- package/dist/src/icons.generated/Calendar.d.ts.map +1 -1
- package/dist/src/icons.generated/Call.d.ts +0 -1
- package/dist/src/icons.generated/Call.d.ts.map +1 -1
- package/dist/src/icons.generated/Chat.d.ts +0 -1
- package/dist/src/icons.generated/Chat.d.ts.map +1 -1
- package/dist/src/icons.generated/Check.d.ts +0 -1
- package/dist/src/icons.generated/Check.d.ts.map +1 -1
- package/dist/src/icons.generated/CheckCircleFilled.d.ts +0 -1
- package/dist/src/icons.generated/CheckCircleFilled.d.ts.map +1 -1
- package/dist/src/icons.generated/ChevronDown.d.ts +0 -1
- package/dist/src/icons.generated/ChevronDown.d.ts.map +1 -1
- package/dist/src/icons.generated/ChevronLeft.d.ts +0 -1
- package/dist/src/icons.generated/ChevronLeft.d.ts.map +1 -1
- package/dist/src/icons.generated/ChevronRight.d.ts +0 -1
- package/dist/src/icons.generated/ChevronRight.d.ts.map +1 -1
- package/dist/src/icons.generated/ChevronUp.d.ts +0 -1
- package/dist/src/icons.generated/ChevronUp.d.ts.map +1 -1
- package/dist/src/icons.generated/Clock.d.ts +0 -1
- package/dist/src/icons.generated/Clock.d.ts.map +1 -1
- package/dist/src/icons.generated/Close.d.ts +0 -1
- package/dist/src/icons.generated/Close.d.ts.map +1 -1
- package/dist/src/icons.generated/CloseCircleFilled.d.ts +0 -1
- package/dist/src/icons.generated/CloseCircleFilled.d.ts.map +1 -1
- package/dist/src/icons.generated/CollapseLeft.d.ts +0 -1
- package/dist/src/icons.generated/CollapseLeft.d.ts.map +1 -1
- package/dist/src/icons.generated/CollapseRight.d.ts +0 -1
- package/dist/src/icons.generated/CollapseRight.d.ts.map +1 -1
- package/dist/src/icons.generated/Copy.d.ts +0 -1
- package/dist/src/icons.generated/Copy.d.ts.map +1 -1
- package/dist/src/icons.generated/Custom.d.ts +0 -1
- package/dist/src/icons.generated/Custom.d.ts.map +1 -1
- package/dist/src/icons.generated/DangerDiamond.d.ts +0 -1
- package/dist/src/icons.generated/DangerDiamond.d.ts.map +1 -1
- package/dist/src/icons.generated/DangerDiamondFilled.d.ts +0 -1
- package/dist/src/icons.generated/DangerDiamondFilled.d.ts.map +1 -1
- package/dist/src/icons.generated/Delete.d.ts +0 -1
- package/dist/src/icons.generated/Delete.d.ts.map +1 -1
- package/dist/src/icons.generated/Deny.d.ts +0 -1
- package/dist/src/icons.generated/Deny.d.ts.map +1 -1
- package/dist/src/icons.generated/Devices.d.ts +0 -1
- package/dist/src/icons.generated/Devices.d.ts.map +1 -1
- package/dist/src/icons.generated/Directory.d.ts +0 -1
- package/dist/src/icons.generated/Directory.d.ts.map +1 -1
- package/dist/src/icons.generated/Documentation.d.ts +0 -1
- package/dist/src/icons.generated/Documentation.d.ts.map +1 -1
- package/dist/src/icons.generated/Download.d.ts +0 -1
- package/dist/src/icons.generated/Download.d.ts.map +1 -1
- package/dist/src/icons.generated/DragIndicator.d.ts +0 -1
- package/dist/src/icons.generated/DragIndicator.d.ts.map +1 -1
- package/dist/src/icons.generated/Duo.d.ts +0 -1
- package/dist/src/icons.generated/Duo.d.ts.map +1 -1
- package/dist/src/icons.generated/Edit.d.ts +0 -1
- package/dist/src/icons.generated/Edit.d.ts.map +1 -1
- package/dist/src/icons.generated/Email.d.ts +0 -1
- package/dist/src/icons.generated/Email.d.ts.map +1 -1
- package/dist/src/icons.generated/ExpandLeft.d.ts +0 -1
- package/dist/src/icons.generated/ExpandLeft.d.ts.map +1 -1
- package/dist/src/icons.generated/ExpandRight.d.ts +0 -1
- package/dist/src/icons.generated/ExpandRight.d.ts.map +1 -1
- package/dist/src/icons.generated/ExternalLink.d.ts +0 -1
- package/dist/src/icons.generated/ExternalLink.d.ts.map +1 -1
- package/dist/src/icons.generated/Fido2.d.ts +0 -1
- package/dist/src/icons.generated/Fido2.d.ts.map +1 -1
- package/dist/src/icons.generated/Filter.d.ts +0 -1
- package/dist/src/icons.generated/Filter.d.ts.map +1 -1
- package/dist/src/icons.generated/Folder.d.ts +0 -1
- package/dist/src/icons.generated/Folder.d.ts.map +1 -1
- package/dist/src/icons.generated/Globe.d.ts +0 -1
- package/dist/src/icons.generated/Globe.d.ts.map +1 -1
- package/dist/src/icons.generated/GoogleAuth.d.ts +0 -1
- package/dist/src/icons.generated/GoogleAuth.d.ts.map +1 -1
- package/dist/src/icons.generated/Grid.d.ts +0 -1
- package/dist/src/icons.generated/Grid.d.ts.map +1 -1
- package/dist/src/icons.generated/Group.d.ts +0 -1
- package/dist/src/icons.generated/Group.d.ts.map +1 -1
- package/dist/src/icons.generated/Hide.d.ts +0 -1
- package/dist/src/icons.generated/Hide.d.ts.map +1 -1
- package/dist/src/icons.generated/Home.d.ts +0 -1
- package/dist/src/icons.generated/Home.d.ts.map +1 -1
- package/dist/src/icons.generated/Idp.d.ts +0 -1
- package/dist/src/icons.generated/Idp.d.ts.map +1 -1
- package/dist/src/icons.generated/InformationCircle.d.ts +0 -1
- package/dist/src/icons.generated/InformationCircle.d.ts.map +1 -1
- package/dist/src/icons.generated/InformationCircleFilled.d.ts +0 -1
- package/dist/src/icons.generated/InformationCircleFilled.d.ts.map +1 -1
- package/dist/src/icons.generated/Link.d.ts +0 -1
- package/dist/src/icons.generated/Link.d.ts.map +1 -1
- package/dist/src/icons.generated/List.d.ts +0 -1
- package/dist/src/icons.generated/List.d.ts.map +1 -1
- package/dist/src/icons.generated/Lock.d.ts +0 -1
- package/dist/src/icons.generated/Lock.d.ts.map +1 -1
- package/dist/src/icons.generated/More.d.ts +0 -1
- package/dist/src/icons.generated/More.d.ts.map +1 -1
- package/dist/src/icons.generated/Notification.d.ts +0 -1
- package/dist/src/icons.generated/Notification.d.ts.map +1 -1
- package/dist/src/icons.generated/OktaVerify.d.ts +0 -1
- package/dist/src/icons.generated/OktaVerify.d.ts.map +1 -1
- package/dist/src/icons.generated/OnPremMfa.d.ts +0 -1
- package/dist/src/icons.generated/OnPremMfa.d.ts.map +1 -1
- package/dist/src/icons.generated/OneTimePassword.d.ts +0 -1
- package/dist/src/icons.generated/OneTimePassword.d.ts.map +1 -1
- package/dist/src/icons.generated/Password.d.ts +0 -1
- package/dist/src/icons.generated/Password.d.ts.map +1 -1
- package/dist/src/icons.generated/Pause.d.ts +0 -1
- package/dist/src/icons.generated/Pause.d.ts.map +1 -1
- package/dist/src/icons.generated/QuestionCircle.d.ts +0 -1
- package/dist/src/icons.generated/QuestionCircle.d.ts.map +1 -1
- package/dist/src/icons.generated/QuestionCircleFilled.d.ts +0 -1
- package/dist/src/icons.generated/QuestionCircleFilled.d.ts.map +1 -1
- package/dist/src/icons.generated/Refresh.d.ts +0 -1
- package/dist/src/icons.generated/Refresh.d.ts.map +1 -1
- package/dist/src/icons.generated/Reset.d.ts +0 -1
- package/dist/src/icons.generated/Reset.d.ts.map +1 -1
- package/dist/src/icons.generated/Resume.d.ts +0 -1
- package/dist/src/icons.generated/Resume.d.ts.map +1 -1
- package/dist/src/icons.generated/Search.d.ts +0 -1
- package/dist/src/icons.generated/Search.d.ts.map +1 -1
- package/dist/src/icons.generated/SecurityQuestion.d.ts +0 -1
- package/dist/src/icons.generated/SecurityQuestion.d.ts.map +1 -1
- package/dist/src/icons.generated/Server.d.ts +0 -1
- package/dist/src/icons.generated/Server.d.ts.map +1 -1
- package/dist/src/icons.generated/Settings.d.ts +0 -1
- package/dist/src/icons.generated/Settings.d.ts.map +1 -1
- package/dist/src/icons.generated/Show.d.ts +0 -1
- package/dist/src/icons.generated/Show.d.ts.map +1 -1
- package/dist/src/icons.generated/SmartCard.d.ts +0 -1
- package/dist/src/icons.generated/SmartCard.d.ts.map +1 -1
- package/dist/src/icons.generated/Sms.d.ts +0 -1
- package/dist/src/icons.generated/Sms.d.ts.map +1 -1
- package/dist/src/icons.generated/Subtract.d.ts +0 -1
- package/dist/src/icons.generated/Subtract.d.ts.map +1 -1
- package/dist/src/icons.generated/SymantecVip.d.ts +0 -1
- package/dist/src/icons.generated/SymantecVip.d.ts.map +1 -1
- package/dist/src/icons.generated/Sync.d.ts +0 -1
- package/dist/src/icons.generated/Sync.d.ts.map +1 -1
- package/dist/src/icons.generated/ThumbsDown.d.ts +0 -1
- package/dist/src/icons.generated/ThumbsDown.d.ts.map +1 -1
- package/dist/src/icons.generated/ThumbsUp.d.ts +0 -1
- package/dist/src/icons.generated/ThumbsUp.d.ts.map +1 -1
- package/dist/src/icons.generated/Unlock.d.ts +0 -1
- package/dist/src/icons.generated/Unlock.d.ts.map +1 -1
- package/dist/src/icons.generated/Upload.d.ts +0 -1
- package/dist/src/icons.generated/Upload.d.ts.map +1 -1
- package/dist/src/icons.generated/User.d.ts +0 -1
- package/dist/src/icons.generated/User.d.ts.map +1 -1
- package/dist/src/icons.generated/Video.d.ts +0 -1
- package/dist/src/icons.generated/Video.d.ts.map +1 -1
- package/dist/src/icons.generated/VoiceCall.d.ts +0 -1
- package/dist/src/icons.generated/VoiceCall.d.ts.map +1 -1
- package/dist/src/icons.generated/Warning.d.ts +0 -1
- package/dist/src/icons.generated/Warning.d.ts.map +1 -1
- package/dist/src/icons.generated/WarningFilled.d.ts +0 -1
- package/dist/src/icons.generated/WarningFilled.d.ts.map +1 -1
- package/dist/src/icons.generated/Yubikey.d.ts +0 -1
- package/dist/src/icons.generated/Yubikey.d.ts.map +1 -1
- package/dist/src/inputUtils.d.ts.map +1 -1
- package/dist/src/labs/DataComponents/DataStack.d.ts +1 -2
- package/dist/src/labs/DataComponents/DataStack.d.ts.map +1 -1
- package/dist/src/labs/DataComponents/DataTable.d.ts +1 -2
- package/dist/src/labs/DataComponents/DataTable.d.ts.map +1 -1
- package/dist/src/labs/DataComponents/DataView.d.ts +1 -2
- package/dist/src/labs/DataComponents/DataView.d.ts.map +1 -1
- package/dist/src/labs/DataComponents/DetailPanel.d.ts +0 -1
- package/dist/src/labs/DataComponents/DetailPanel.d.ts.map +1 -1
- package/dist/src/labs/DataComponents/TableContent.d.ts.map +1 -1
- package/dist/src/labs/DataComponents/TableSettings.d.ts.map +1 -1
- package/dist/src/labs/DataComponents/componentTypes.d.ts +5 -2
- package/dist/src/labs/DataComponents/componentTypes.d.ts.map +1 -1
- package/dist/src/labs/DataComponents/constants.d.ts +6 -4
- package/dist/src/labs/DataComponents/constants.d.ts.map +1 -1
- package/dist/src/labs/DataComponents/tableConstants.d.ts +6 -25
- package/dist/src/labs/DataComponents/tableConstants.d.ts.map +1 -1
- package/dist/src/labs/DataComponents/useFilterConversion.d.ts.map +1 -1
- package/dist/src/labs/DataTablePagination.d.ts +0 -1
- package/dist/src/labs/DataTablePagination.d.ts.map +1 -1
- package/dist/src/labs/DateField.d.ts +3 -6
- package/dist/src/labs/DateField.d.ts.map +1 -1
- package/dist/src/labs/DatePicker.d.ts +20 -19
- package/dist/src/labs/DatePicker.d.ts.map +1 -1
- package/dist/src/labs/FileUpload.d.ts +0 -1
- package/dist/src/labs/FileUpload.d.ts.map +1 -1
- package/dist/src/labs/FileUploadIllustration.d.ts +0 -1
- package/dist/src/labs/FileUploadIllustration.d.ts.map +1 -1
- package/dist/src/labs/FileUploadPreview.d.ts +0 -1
- package/dist/src/labs/FileUploadPreview.d.ts.map +1 -1
- package/dist/src/labs/GroupPicker.d.ts +2 -1
- package/dist/src/labs/GroupPicker.d.ts.map +1 -1
- package/dist/src/labs/PaginatedTable.d.ts +2 -1
- package/dist/src/labs/PaginatedTable.d.ts.map +1 -1
- package/dist/src/labs/StaticTable.d.ts +2 -1
- package/dist/src/labs/StaticTable.d.ts.map +1 -1
- package/dist/src/labs/Switch.d.ts +0 -1
- package/dist/src/labs/Switch.d.ts.map +1 -1
- package/dist/src/labs/TimeZonePicker.d.ts +22 -0
- package/dist/src/labs/TimeZonePicker.d.ts.map +1 -0
- package/dist/src/labs/TopNav.d.ts +77 -0
- package/dist/src/labs/TopNav.d.ts.map +1 -0
- package/dist/src/labs/datePickerTheme.d.ts.map +1 -1
- package/dist/src/labs/index.d.ts +1 -0
- package/dist/src/labs/index.d.ts.map +1 -1
- package/dist/src/labs/{useDatePickerTranslations.d.ts → useDateFieldsTranslations.d.ts} +3 -2
- package/dist/src/labs/useDateFieldsTranslations.d.ts.map +1 -0
- package/dist/src/labs/useOdysseyDateFields.d.ts +82 -0
- package/dist/src/labs/useOdysseyDateFields.d.ts.map +1 -0
- package/dist/src/properties/ts/odyssey-react-mui.d.ts +3 -0
- package/dist/src/properties/ts/odyssey-react-mui.d.ts.map +1 -1
- package/dist/src/test-selectors/querySelector.d.ts +2 -2
- package/dist/src/test-selectors/querySelector.d.ts.map +1 -1
- package/dist/src/theme/components.d.ts.map +1 -1
- package/dist/theme/components.js +44 -9
- package/dist/theme/components.js.map +1 -1
- package/dist/tsconfig.production.tsbuildinfo +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +3 -3
- package/src/DataTable/DataTable.tsx +118 -64
- package/src/Pagination/Pagination.tsx +82 -46
- package/src/Pagination/usePagination.ts +14 -18
- package/src/labs/DataComponents/DataStack.tsx +6 -0
- package/src/labs/DataComponents/DataTable.tsx +6 -0
- package/src/labs/DataComponents/DataView.tsx +16 -0
- package/src/labs/DataComponents/TableContent.tsx +66 -9
- package/src/labs/DataComponents/TableSettings.tsx +60 -60
- package/src/labs/DataComponents/componentTypes.ts +5 -6
- package/src/labs/DataComponents/constants.tsx +12 -4
- package/src/labs/DataComponents/tableConstants.tsx +0 -19
- package/src/labs/DataComponents/useFilterConversion.ts +14 -18
- package/src/labs/DateField.tsx +175 -26
- package/src/labs/DatePicker.tsx +155 -93
- package/src/labs/TimeZonePicker.tsx +55 -0
- package/src/labs/TopNav.tsx +394 -0
- package/src/labs/datePickerTheme.tsx +6 -4
- package/src/labs/index.ts +1 -0
- package/src/labs/{useDatePickerTranslations.ts → useDateFieldsTranslations.ts} +3 -1
- package/src/labs/useOdysseyDateFields.ts +201 -0
- package/src/properties/odyssey-react-mui.properties +3 -0
- package/src/properties/ts/odyssey-react-mui.ts +1 -1
- package/src/theme/components.tsx +50 -7
- package/dist/src/labs/useDatePickerTranslations.d.ts.map +0 -1
|
@@ -0,0 +1,394 @@
|
|
|
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 styled from "@emotion/styled";
|
|
14
|
+
import {
|
|
15
|
+
memo,
|
|
16
|
+
useMemo,
|
|
17
|
+
ReactElement,
|
|
18
|
+
useCallback,
|
|
19
|
+
MouseEventHandler,
|
|
20
|
+
KeyboardEventHandler,
|
|
21
|
+
} from "react";
|
|
22
|
+
|
|
23
|
+
import type { HtmlProps } from "../HtmlProps";
|
|
24
|
+
import { QuestionCircleIcon, SettingsIcon } from "../icons.generated";
|
|
25
|
+
import { Link } from "../Link";
|
|
26
|
+
import {
|
|
27
|
+
DesignTokens,
|
|
28
|
+
useOdysseyDesignTokens,
|
|
29
|
+
} from "../OdysseyDesignTokensContext";
|
|
30
|
+
import { Subordinate } from "../Typography";
|
|
31
|
+
|
|
32
|
+
export type TopNavLinkItem = {
|
|
33
|
+
id: string;
|
|
34
|
+
label: string;
|
|
35
|
+
/**
|
|
36
|
+
* link added to the nav item. if it is undefined, static text will be displayed.
|
|
37
|
+
* fires onClick event when it is passed
|
|
38
|
+
*/
|
|
39
|
+
href?: string;
|
|
40
|
+
/**
|
|
41
|
+
* determines whether the link item is diabled
|
|
42
|
+
*/
|
|
43
|
+
isDisabled?: boolean;
|
|
44
|
+
/**
|
|
45
|
+
* Event fired when the nav item is clicked
|
|
46
|
+
*/
|
|
47
|
+
onClick?: MouseEventHandler<HTMLAnchorElement> &
|
|
48
|
+
MouseEventHandler<HTMLDivElement> &
|
|
49
|
+
KeyboardEventHandler<HTMLDivElement>;
|
|
50
|
+
/**
|
|
51
|
+
* The link target prop. e.g., "_blank"
|
|
52
|
+
*/
|
|
53
|
+
target?: string;
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
export type UserProfileProps = {
|
|
57
|
+
/**
|
|
58
|
+
* Logged in user profile icon to be displayed in the top nav
|
|
59
|
+
*/
|
|
60
|
+
profileIcon?: ReactElement;
|
|
61
|
+
/**
|
|
62
|
+
* Logged in user info to be displayed in the top nav
|
|
63
|
+
*/
|
|
64
|
+
userName: string;
|
|
65
|
+
/**
|
|
66
|
+
* Org name of the logged in user
|
|
67
|
+
*/
|
|
68
|
+
orgName: string;
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
export type TopNavProps = {
|
|
72
|
+
/**
|
|
73
|
+
* Pass in a SearchField component with the variant="filled" prop set
|
|
74
|
+
*/
|
|
75
|
+
SearchFieldComponent?: ReactElement;
|
|
76
|
+
/**
|
|
77
|
+
* Nav links in the top nav
|
|
78
|
+
*/
|
|
79
|
+
topNavLinkItems: TopNavLinkItem[];
|
|
80
|
+
/**
|
|
81
|
+
* Pass in an additional component like `Button` that will be displayed after the nav link items
|
|
82
|
+
*/
|
|
83
|
+
AdditionalNavItemComponent?: ReactElement;
|
|
84
|
+
/**
|
|
85
|
+
* URL to settings page.
|
|
86
|
+
*/
|
|
87
|
+
settingsPageHref?: string;
|
|
88
|
+
/**
|
|
89
|
+
* URL to the help page.
|
|
90
|
+
*/
|
|
91
|
+
helpPageHref?: string;
|
|
92
|
+
/**
|
|
93
|
+
* Displays user account info
|
|
94
|
+
*/
|
|
95
|
+
userProfile?: UserProfileProps;
|
|
96
|
+
} & Pick<HtmlProps, "testId">;
|
|
97
|
+
|
|
98
|
+
const UserProfileContainer = styled("div", {
|
|
99
|
+
shouldForwardProp: (prop) => prop !== "odysseyDesignTokens",
|
|
100
|
+
})(({ odysseyDesignTokens }: { odysseyDesignTokens: DesignTokens }) => ({
|
|
101
|
+
display: "flex",
|
|
102
|
+
alignItems: "center",
|
|
103
|
+
paddingRight: odysseyDesignTokens.Spacing4,
|
|
104
|
+
}));
|
|
105
|
+
|
|
106
|
+
const UserProfileIconContainer = styled("div", {
|
|
107
|
+
shouldForwardProp: (prop) => prop !== "odysseyDesignTokens",
|
|
108
|
+
})(({ odysseyDesignTokens }: { odysseyDesignTokens: DesignTokens }) => ({
|
|
109
|
+
display: "flex",
|
|
110
|
+
paddingRight: odysseyDesignTokens.Spacing2,
|
|
111
|
+
}));
|
|
112
|
+
|
|
113
|
+
const UserProfileInfoContainer = styled("div")(() => ({
|
|
114
|
+
display: "flex",
|
|
115
|
+
flexDirection: "column",
|
|
116
|
+
}));
|
|
117
|
+
|
|
118
|
+
const UserProfile = ({ profileIcon, userName, orgName }: UserProfileProps) => {
|
|
119
|
+
const odysseyDesignTokens = useOdysseyDesignTokens();
|
|
120
|
+
|
|
121
|
+
return (
|
|
122
|
+
<UserProfileContainer odysseyDesignTokens={odysseyDesignTokens}>
|
|
123
|
+
{profileIcon && (
|
|
124
|
+
<UserProfileIconContainer odysseyDesignTokens={odysseyDesignTokens}>
|
|
125
|
+
{profileIcon}
|
|
126
|
+
</UserProfileIconContainer>
|
|
127
|
+
)}
|
|
128
|
+
<UserProfileInfoContainer>
|
|
129
|
+
<Subordinate color="textPrimary">{userName}</Subordinate>
|
|
130
|
+
<Subordinate color="textSecondary">{orgName}</Subordinate>
|
|
131
|
+
</UserProfileInfoContainer>
|
|
132
|
+
</UserProfileContainer>
|
|
133
|
+
);
|
|
134
|
+
};
|
|
135
|
+
|
|
136
|
+
const TopNavListContainer = styled("ul")(() => ({
|
|
137
|
+
padding: 0,
|
|
138
|
+
listStyle: "none",
|
|
139
|
+
listStyleType: "none",
|
|
140
|
+
display: "flex",
|
|
141
|
+
alignItems: "center",
|
|
142
|
+
}));
|
|
143
|
+
|
|
144
|
+
const TopNavItemLabelContainer = styled("div", {
|
|
145
|
+
shouldForwardProp: (prop) => prop !== "odysseyDesignTokens",
|
|
146
|
+
})<{
|
|
147
|
+
odysseyDesignTokens: DesignTokens;
|
|
148
|
+
}>(({ odysseyDesignTokens }) => ({
|
|
149
|
+
display: "flex",
|
|
150
|
+
flexWrap: "wrap",
|
|
151
|
+
alignItems: "center",
|
|
152
|
+
fontSize: odysseyDesignTokens.TypographyScale0,
|
|
153
|
+
fontWeight: odysseyDesignTokens.TypographyWeightHeading,
|
|
154
|
+
}));
|
|
155
|
+
|
|
156
|
+
const TopNavListItemContainer = styled("li", {
|
|
157
|
+
shouldForwardProp: (prop) =>
|
|
158
|
+
prop !== "odysseyDesignTokens" && prop !== "isDisabled",
|
|
159
|
+
})<{
|
|
160
|
+
odysseyDesignTokens: DesignTokens;
|
|
161
|
+
isDisabled?: boolean;
|
|
162
|
+
}>(({ odysseyDesignTokens, isDisabled }) => ({
|
|
163
|
+
display: "flex",
|
|
164
|
+
alignItems: "center",
|
|
165
|
+
cursor: isDisabled ? "default" : "pointer",
|
|
166
|
+
pointerEvents: isDisabled ? "none" : "auto",
|
|
167
|
+
color: `${isDisabled ? odysseyDesignTokens.TypographyColorDisabled : odysseyDesignTokens.TypographyColorHeading} !important`,
|
|
168
|
+
"& a": {
|
|
169
|
+
display: "flex",
|
|
170
|
+
alignItems: "center",
|
|
171
|
+
padding: `${odysseyDesignTokens.Spacing2} ${odysseyDesignTokens.Spacing4}`,
|
|
172
|
+
color: `${odysseyDesignTokens.TypographyColorHeading} !important`,
|
|
173
|
+
},
|
|
174
|
+
"& a:hover": {
|
|
175
|
+
textDecoration: "none",
|
|
176
|
+
backgroundColor: !isDisabled ? odysseyDesignTokens.HueNeutral50 : "inherit",
|
|
177
|
+
},
|
|
178
|
+
"& div[role='button']:hover": {
|
|
179
|
+
backgroundColor: !isDisabled ? odysseyDesignTokens.HueNeutral50 : "inherit",
|
|
180
|
+
},
|
|
181
|
+
"& a:focus-visible": {
|
|
182
|
+
outlineOffset: 0,
|
|
183
|
+
borderRadius: 0,
|
|
184
|
+
outlineWidth: odysseyDesignTokens.FocusOutlineWidthMain,
|
|
185
|
+
backgroundColor: !isDisabled ? odysseyDesignTokens.HueNeutral50 : "inherit",
|
|
186
|
+
},
|
|
187
|
+
}));
|
|
188
|
+
|
|
189
|
+
const NavItemContentClickContainer = styled("div", {
|
|
190
|
+
shouldForwardProp: (prop) => prop !== "odysseyDesignTokens",
|
|
191
|
+
})<{
|
|
192
|
+
odysseyDesignTokens: DesignTokens;
|
|
193
|
+
}>(({ odysseyDesignTokens }) => ({
|
|
194
|
+
display: "flex",
|
|
195
|
+
alignItems: "center",
|
|
196
|
+
width: "100%",
|
|
197
|
+
padding: `${odysseyDesignTokens.Spacing2} ${odysseyDesignTokens.Spacing4}`,
|
|
198
|
+
"&:focus-visible": {
|
|
199
|
+
borderRadius: 0,
|
|
200
|
+
outlineColor: odysseyDesignTokens.FocusOutlineColorPrimary,
|
|
201
|
+
outlineStyle: odysseyDesignTokens.FocusOutlineStyle,
|
|
202
|
+
outlineWidth: odysseyDesignTokens.FocusOutlineWidthMain,
|
|
203
|
+
backgroundColor: odysseyDesignTokens.HueNeutral50,
|
|
204
|
+
textDecoration: "none",
|
|
205
|
+
},
|
|
206
|
+
}));
|
|
207
|
+
|
|
208
|
+
const TopNavItemContent = ({
|
|
209
|
+
id,
|
|
210
|
+
label,
|
|
211
|
+
href,
|
|
212
|
+
target,
|
|
213
|
+
onClick,
|
|
214
|
+
isDisabled,
|
|
215
|
+
}: TopNavLinkItem) => {
|
|
216
|
+
const odysseyDesignTokens = useOdysseyDesignTokens();
|
|
217
|
+
|
|
218
|
+
const topNavItemContentKeyHandler = useCallback<
|
|
219
|
+
KeyboardEventHandler<HTMLDivElement>
|
|
220
|
+
>(
|
|
221
|
+
(event) => {
|
|
222
|
+
if (event?.key === "Enter") {
|
|
223
|
+
event.preventDefault();
|
|
224
|
+
event.stopPropagation();
|
|
225
|
+
onClick?.(event);
|
|
226
|
+
}
|
|
227
|
+
},
|
|
228
|
+
[onClick],
|
|
229
|
+
);
|
|
230
|
+
|
|
231
|
+
return (
|
|
232
|
+
<TopNavListItemContainer
|
|
233
|
+
id={id}
|
|
234
|
+
key={id}
|
|
235
|
+
aria-disabled={isDisabled}
|
|
236
|
+
isDisabled={isDisabled}
|
|
237
|
+
odysseyDesignTokens={odysseyDesignTokens}
|
|
238
|
+
>
|
|
239
|
+
{
|
|
240
|
+
// Use Link for nav items with links and div for disabled or non-link items
|
|
241
|
+
isDisabled ? (
|
|
242
|
+
<NavItemContentClickContainer
|
|
243
|
+
odysseyDesignTokens={odysseyDesignTokens}
|
|
244
|
+
>
|
|
245
|
+
<TopNavItemLabelContainer odysseyDesignTokens={odysseyDesignTokens}>
|
|
246
|
+
{label}
|
|
247
|
+
</TopNavItemLabelContainer>
|
|
248
|
+
</NavItemContentClickContainer>
|
|
249
|
+
) : !href ? (
|
|
250
|
+
<NavItemContentClickContainer
|
|
251
|
+
odysseyDesignTokens={odysseyDesignTokens}
|
|
252
|
+
role="button"
|
|
253
|
+
tabIndex={0}
|
|
254
|
+
onClick={onClick}
|
|
255
|
+
onKeyDown={topNavItemContentKeyHandler}
|
|
256
|
+
>
|
|
257
|
+
<TopNavItemLabelContainer odysseyDesignTokens={odysseyDesignTokens}>
|
|
258
|
+
{label}
|
|
259
|
+
</TopNavItemLabelContainer>
|
|
260
|
+
</NavItemContentClickContainer>
|
|
261
|
+
) : (
|
|
262
|
+
<Link href={href} target={target} onClick={onClick}>
|
|
263
|
+
<TopNavItemLabelContainer odysseyDesignTokens={odysseyDesignTokens}>
|
|
264
|
+
{label}
|
|
265
|
+
</TopNavItemLabelContainer>
|
|
266
|
+
</Link>
|
|
267
|
+
)
|
|
268
|
+
}
|
|
269
|
+
</TopNavListItemContainer>
|
|
270
|
+
);
|
|
271
|
+
};
|
|
272
|
+
|
|
273
|
+
const LinkAndProfileWrapper = styled("div")(() => ({
|
|
274
|
+
display: "flex",
|
|
275
|
+
alignItems: "center",
|
|
276
|
+
marginLeft: "auto",
|
|
277
|
+
}));
|
|
278
|
+
|
|
279
|
+
const AdditionalLinkContainerWithBorder = styled("div", {
|
|
280
|
+
shouldForwardProp: (prop) => prop !== "odysseyDesignTokens",
|
|
281
|
+
})<{
|
|
282
|
+
odysseyDesignTokens: DesignTokens;
|
|
283
|
+
}>(({ odysseyDesignTokens }) => ({
|
|
284
|
+
display: "flex",
|
|
285
|
+
alignItems: "center",
|
|
286
|
+
marginRight: odysseyDesignTokens.Spacing3,
|
|
287
|
+
borderRight: `${odysseyDesignTokens.BorderWidthMain} solid ${odysseyDesignTokens.HueNeutral200}`,
|
|
288
|
+
}));
|
|
289
|
+
|
|
290
|
+
const LinkContainer = styled("div", {
|
|
291
|
+
shouldForwardProp: (prop) => prop !== "odysseyDesignTokens",
|
|
292
|
+
})<{
|
|
293
|
+
odysseyDesignTokens: DesignTokens;
|
|
294
|
+
}>(({ odysseyDesignTokens }) => ({
|
|
295
|
+
paddingRight: odysseyDesignTokens.Spacing3,
|
|
296
|
+
"& a": {
|
|
297
|
+
color: `${odysseyDesignTokens.TypographyColorHeading} !important`,
|
|
298
|
+
},
|
|
299
|
+
}));
|
|
300
|
+
|
|
301
|
+
const TopNavContainer = styled("div", {
|
|
302
|
+
shouldForwardProp: (prop) => prop !== "odysseyDesignTokens",
|
|
303
|
+
})<{
|
|
304
|
+
odysseyDesignTokens: DesignTokens;
|
|
305
|
+
}>(({ odysseyDesignTokens }) => ({
|
|
306
|
+
display: "flex",
|
|
307
|
+
alignItems: "center",
|
|
308
|
+
backgroundColor: odysseyDesignTokens.HueNeutralWhite,
|
|
309
|
+
height: odysseyDesignTokens.Spacing9,
|
|
310
|
+
}));
|
|
311
|
+
|
|
312
|
+
const SearchFieldContainer = styled("div", {
|
|
313
|
+
shouldForwardProp: (prop) => prop !== "odysseyDesignTokens",
|
|
314
|
+
})<{
|
|
315
|
+
odysseyDesignTokens: DesignTokens;
|
|
316
|
+
}>(({ odysseyDesignTokens }) => ({
|
|
317
|
+
width: "350px",
|
|
318
|
+
padding: `${odysseyDesignTokens.Spacing2} ${odysseyDesignTokens.Spacing3}`,
|
|
319
|
+
}));
|
|
320
|
+
|
|
321
|
+
const AdditionalNavItemContainer = styled("div", {
|
|
322
|
+
shouldForwardProp: (prop) => prop !== "odysseyDesignTokens",
|
|
323
|
+
})<{
|
|
324
|
+
odysseyDesignTokens: DesignTokens;
|
|
325
|
+
}>(({ odysseyDesignTokens }) => ({
|
|
326
|
+
padding: `0 ${odysseyDesignTokens.Spacing3}`,
|
|
327
|
+
}));
|
|
328
|
+
|
|
329
|
+
const TopNav = ({
|
|
330
|
+
SearchFieldComponent,
|
|
331
|
+
topNavLinkItems,
|
|
332
|
+
AdditionalNavItemComponent,
|
|
333
|
+
settingsPageHref,
|
|
334
|
+
helpPageHref,
|
|
335
|
+
userProfile,
|
|
336
|
+
}: TopNavProps) => {
|
|
337
|
+
const odysseyDesignTokens = useOdysseyDesignTokens();
|
|
338
|
+
|
|
339
|
+
const processedNavItems = useMemo(
|
|
340
|
+
() =>
|
|
341
|
+
topNavLinkItems.map((item) => (
|
|
342
|
+
<TopNavItemContent {...item} key={item.id} />
|
|
343
|
+
)),
|
|
344
|
+
[topNavLinkItems],
|
|
345
|
+
);
|
|
346
|
+
|
|
347
|
+
return (
|
|
348
|
+
<TopNavContainer odysseyDesignTokens={odysseyDesignTokens}>
|
|
349
|
+
{SearchFieldComponent && (
|
|
350
|
+
<SearchFieldContainer odysseyDesignTokens={odysseyDesignTokens}>
|
|
351
|
+
{SearchFieldComponent}
|
|
352
|
+
</SearchFieldContainer>
|
|
353
|
+
)}
|
|
354
|
+
<TopNavListContainer>
|
|
355
|
+
{processedNavItems?.map((item) => item)}
|
|
356
|
+
</TopNavListContainer>
|
|
357
|
+
<LinkAndProfileWrapper>
|
|
358
|
+
{(AdditionalNavItemComponent || settingsPageHref || helpPageHref) && (
|
|
359
|
+
<AdditionalLinkContainerWithBorder
|
|
360
|
+
odysseyDesignTokens={odysseyDesignTokens}
|
|
361
|
+
>
|
|
362
|
+
{AdditionalNavItemComponent && (
|
|
363
|
+
<AdditionalNavItemContainer
|
|
364
|
+
odysseyDesignTokens={odysseyDesignTokens}
|
|
365
|
+
>
|
|
366
|
+
{AdditionalNavItemComponent}
|
|
367
|
+
</AdditionalNavItemContainer>
|
|
368
|
+
)}
|
|
369
|
+
{settingsPageHref && (
|
|
370
|
+
<LinkContainer odysseyDesignTokens={odysseyDesignTokens}>
|
|
371
|
+
<Link href={settingsPageHref} ariaLabel="settings page">
|
|
372
|
+
<SettingsIcon />
|
|
373
|
+
</Link>
|
|
374
|
+
</LinkContainer>
|
|
375
|
+
)}
|
|
376
|
+
{helpPageHref && (
|
|
377
|
+
<LinkContainer odysseyDesignTokens={odysseyDesignTokens}>
|
|
378
|
+
<Link href={helpPageHref} ariaLabel="help page">
|
|
379
|
+
<QuestionCircleIcon />
|
|
380
|
+
</Link>
|
|
381
|
+
</LinkContainer>
|
|
382
|
+
)}
|
|
383
|
+
</AdditionalLinkContainerWithBorder>
|
|
384
|
+
)}
|
|
385
|
+
{userProfile && <UserProfile {...userProfile} />}
|
|
386
|
+
</LinkAndProfileWrapper>
|
|
387
|
+
</TopNavContainer>
|
|
388
|
+
);
|
|
389
|
+
};
|
|
390
|
+
|
|
391
|
+
const MemoizedTopNav = memo(TopNav);
|
|
392
|
+
MemoizedTopNav.displayName = "TopNav";
|
|
393
|
+
|
|
394
|
+
export { MemoizedTopNav as TopNav };
|
|
@@ -143,15 +143,17 @@ export const datePickerTheme: ThemeOptions = {
|
|
|
143
143
|
},
|
|
144
144
|
MuiPickersLayout: {
|
|
145
145
|
styleOverrides: {
|
|
146
|
-
root: {
|
|
146
|
+
root: ({ theme }) => ({
|
|
147
147
|
display: "block",
|
|
148
|
-
|
|
148
|
+
// Matches Popper width
|
|
149
|
+
width: "calc(100vw - 64px)",
|
|
150
|
+
maxWidth: theme.mixins.maxWidth,
|
|
151
|
+
}),
|
|
149
152
|
contentWrapper: ({ theme }) => ({
|
|
150
|
-
width:
|
|
153
|
+
width: "100%",
|
|
151
154
|
paddingInline: theme.spacing(3),
|
|
152
155
|
|
|
153
156
|
"@media (pointer: fine)": {
|
|
154
|
-
width: `${352 / 14}rem`,
|
|
155
157
|
borderColor: theme.palette.divider,
|
|
156
158
|
borderStyle: theme.mixins.borderStyle,
|
|
157
159
|
borderWidth: theme.mixins.borderWidth,
|
package/src/labs/index.ts
CHANGED
|
@@ -14,7 +14,9 @@ import { PickersLocaleText } from "@mui/x-date-pickers";
|
|
|
14
14
|
import { DateTime } from "luxon";
|
|
15
15
|
import { useTranslation } from "react-i18next";
|
|
16
16
|
|
|
17
|
-
export
|
|
17
|
+
export type DateFieldsTranslations = PickersLocaleText<DateTime>;
|
|
18
|
+
|
|
19
|
+
export const useDateFieldsTranslations = (): DateFieldsTranslations => {
|
|
18
20
|
const { t } = useTranslation();
|
|
19
21
|
|
|
20
22
|
return {
|
|
@@ -0,0 +1,201 @@
|
|
|
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 { useCallback, useEffect, useMemo, useRef, useState } from "react";
|
|
14
|
+
import { DateTime } from "luxon";
|
|
15
|
+
import { useTranslation } from "react-i18next";
|
|
16
|
+
|
|
17
|
+
import { FieldComponentProps } from "../FieldComponentProps";
|
|
18
|
+
import { ComponentControlledState, getControlState } from "../inputUtils";
|
|
19
|
+
import { useDateFieldsTranslations } from "./useDateFieldsTranslations";
|
|
20
|
+
|
|
21
|
+
const { CONTROLLED } = ComponentControlledState;
|
|
22
|
+
|
|
23
|
+
const isValidDateTime = (dateTime: DateTime) => dateTime.isValid;
|
|
24
|
+
|
|
25
|
+
const utcDateTimeFromIsoString = (dateString: string) =>
|
|
26
|
+
DateTime.fromISO(dateString).toUTC();
|
|
27
|
+
|
|
28
|
+
export type TimeZoneOption = {
|
|
29
|
+
label: string;
|
|
30
|
+
value: string;
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
export type OdysseyDateFieldProps = {
|
|
34
|
+
/**
|
|
35
|
+
* default value when uncontrolled.
|
|
36
|
+
*
|
|
37
|
+
* NOTE: Must be a date string in ISO format
|
|
38
|
+
*/
|
|
39
|
+
defaultValue?: string;
|
|
40
|
+
/**
|
|
41
|
+
* Disable specific date(s).
|
|
42
|
+
*
|
|
43
|
+
* Warning: This function can be called multiple times (for example when rendering date calendar, checking if focus can be moved to a certain date, etc.). Expensive computations can impact performance.
|
|
44
|
+
*/
|
|
45
|
+
isDateEnabled?: (date: Date) => boolean;
|
|
46
|
+
/**
|
|
47
|
+
* Disable specific month(s).
|
|
48
|
+
*/
|
|
49
|
+
isMonthEnabled?: (date: Date) => boolean;
|
|
50
|
+
/**
|
|
51
|
+
* Disable specific year(s).
|
|
52
|
+
*/
|
|
53
|
+
isYearEnabled?: (date: Date) => boolean;
|
|
54
|
+
/**
|
|
55
|
+
* Minimum date allowed.
|
|
56
|
+
*
|
|
57
|
+
* NOTE: If not a valid date string in ISO format, `minDate` will not apply
|
|
58
|
+
*/
|
|
59
|
+
minDate?: string;
|
|
60
|
+
/**
|
|
61
|
+
* Maximum date allowed.
|
|
62
|
+
*
|
|
63
|
+
* NOTE: If not a valid date string in ISO format, `maxDate` will not apply
|
|
64
|
+
*/
|
|
65
|
+
maxDate?: string;
|
|
66
|
+
timeZone?: string;
|
|
67
|
+
/**
|
|
68
|
+
* value when controlled.
|
|
69
|
+
*
|
|
70
|
+
* NOTE: Must be a date string in ISO format or it will not be applied
|
|
71
|
+
*/
|
|
72
|
+
value?: string;
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
type FormatDateTimeToUtcIsoDateString = (value: DateTime) => string | undefined;
|
|
76
|
+
|
|
77
|
+
type ValidationDateRanges = {
|
|
78
|
+
minDate?: DateTime;
|
|
79
|
+
maxDate?: DateTime;
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
export const useOdysseyDateFields = ({
|
|
83
|
+
defaultValue,
|
|
84
|
+
isDateEnabled = () => true,
|
|
85
|
+
isMonthEnabled = () => true,
|
|
86
|
+
isYearEnabled = () => true,
|
|
87
|
+
minDate: minDateProp,
|
|
88
|
+
maxDate: maxDateProp,
|
|
89
|
+
timeZone = "system",
|
|
90
|
+
value,
|
|
91
|
+
}: OdysseyDateFieldProps & Pick<FieldComponentProps, "errorMessage">) => {
|
|
92
|
+
const internalValueRef = useRef<DateTime | null>(null);
|
|
93
|
+
const [internalTimeZone, setInternalTimeZone] = useState(timeZone);
|
|
94
|
+
|
|
95
|
+
const [validationDateRanges, setValidationDateRanges] =
|
|
96
|
+
useState<ValidationDateRanges>({
|
|
97
|
+
minDate: undefined,
|
|
98
|
+
maxDate: undefined,
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
useEffect(() => {
|
|
102
|
+
const minDate = minDateProp ? DateTime.fromISO(minDateProp) : undefined;
|
|
103
|
+
const maxDate = maxDateProp ? DateTime.fromISO(maxDateProp) : undefined;
|
|
104
|
+
|
|
105
|
+
setValidationDateRanges({
|
|
106
|
+
minDate:
|
|
107
|
+
minDate && isValidDateTime(minDate)
|
|
108
|
+
? minDate.startOf("day")
|
|
109
|
+
: undefined,
|
|
110
|
+
maxDate:
|
|
111
|
+
maxDate && isValidDateTime(maxDate)
|
|
112
|
+
? maxDate.startOf("day")
|
|
113
|
+
: undefined,
|
|
114
|
+
});
|
|
115
|
+
}, [minDateProp, maxDateProp]);
|
|
116
|
+
|
|
117
|
+
const { i18n } = useTranslation();
|
|
118
|
+
const { language } = i18n;
|
|
119
|
+
|
|
120
|
+
const invalidLocales = ["ok_PL", "ok_SK"];
|
|
121
|
+
// In the Applitools env the language code is `en-us@posix`. Need to check for that
|
|
122
|
+
const isInvalidLocale =
|
|
123
|
+
invalidLocales.includes(language) || language.includes("@");
|
|
124
|
+
|
|
125
|
+
const localeText = useDateFieldsTranslations();
|
|
126
|
+
|
|
127
|
+
const controlledStateRef = useRef(
|
|
128
|
+
getControlState({
|
|
129
|
+
controlledValue: value,
|
|
130
|
+
uncontrolledValue: defaultValue,
|
|
131
|
+
}),
|
|
132
|
+
);
|
|
133
|
+
|
|
134
|
+
const defaultedLanguageCode = isInvalidLocale
|
|
135
|
+
? "en-US"
|
|
136
|
+
: language.replaceAll("_", "-");
|
|
137
|
+
|
|
138
|
+
const isValidTimeZone = (timeZone: string) =>
|
|
139
|
+
DateTime.local().setZone(timeZone).isValid;
|
|
140
|
+
|
|
141
|
+
const formatDateTimeToUtcIsoDateString =
|
|
142
|
+
useCallback<FormatDateTimeToUtcIsoDateString>(
|
|
143
|
+
(value) => value.toUTC().toISO() || undefined,
|
|
144
|
+
[],
|
|
145
|
+
);
|
|
146
|
+
|
|
147
|
+
const shouldDisableDate = useCallback(
|
|
148
|
+
(date: DateTime) => !isDateEnabled(new Date(date?.toJSDate())) || false,
|
|
149
|
+
[isDateEnabled],
|
|
150
|
+
);
|
|
151
|
+
|
|
152
|
+
const shouldDisableMonth = useCallback(
|
|
153
|
+
(date: DateTime) => !isMonthEnabled(new Date(date?.toJSDate())) || false,
|
|
154
|
+
[isMonthEnabled],
|
|
155
|
+
);
|
|
156
|
+
|
|
157
|
+
const shouldDisableYear = useCallback(
|
|
158
|
+
(date: DateTime) => !isYearEnabled(new Date(date?.toJSDate())) || false,
|
|
159
|
+
[isYearEnabled],
|
|
160
|
+
);
|
|
161
|
+
|
|
162
|
+
const inputValues = useMemo(() => {
|
|
163
|
+
if (value && controlledStateRef.current === CONTROLLED) {
|
|
164
|
+
const valueAsUTCDateTime = utcDateTimeFromIsoString(value);
|
|
165
|
+
|
|
166
|
+
if (isValidDateTime(valueAsUTCDateTime)) {
|
|
167
|
+
return {
|
|
168
|
+
value: valueAsUTCDateTime,
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
if (defaultValue) {
|
|
174
|
+
const defaultValueAsUTCDateTime = utcDateTimeFromIsoString(defaultValue);
|
|
175
|
+
|
|
176
|
+
if (isValidDateTime(defaultValueAsUTCDateTime)) {
|
|
177
|
+
return {
|
|
178
|
+
defaultValue: defaultValueAsUTCDateTime,
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
return null;
|
|
184
|
+
}, [defaultValue, validationDateRanges, value]);
|
|
185
|
+
|
|
186
|
+
return {
|
|
187
|
+
defaultedLanguageCode,
|
|
188
|
+
formatDateTimeToUtcIsoDateString,
|
|
189
|
+
inputValues,
|
|
190
|
+
internalTimeZone,
|
|
191
|
+
internalValueRef,
|
|
192
|
+
isValidTimeZone,
|
|
193
|
+
localeText,
|
|
194
|
+
maxDate: validationDateRanges.maxDate,
|
|
195
|
+
minDate: validationDateRanges.minDate,
|
|
196
|
+
setInternalTimeZone,
|
|
197
|
+
shouldDisableDate,
|
|
198
|
+
shouldDisableMonth,
|
|
199
|
+
shouldDisableYear,
|
|
200
|
+
};
|
|
201
|
+
};
|
|
@@ -8,6 +8,9 @@ picker.calendar.navigation.previousmonth = Previous month
|
|
|
8
8
|
picker.date.toolbar.title = Selected date
|
|
9
9
|
picker.daterange.toolbar.title = Select date range
|
|
10
10
|
picker.datetime.toolbar.title = Select date & time
|
|
11
|
+
picker.error.invalid = Correct the date format or select the date from the calendar.
|
|
12
|
+
picker.error.mindate = Date entered is earlier than allowed dates. Select a date from the range available in the calendar.
|
|
13
|
+
picker.error.maxdate = Date entered is later than the allowed dates. Select a date from the range available in the calendar.
|
|
11
14
|
# placeholder text in date field
|
|
12
15
|
picker.field.placeholder.day = DD
|
|
13
16
|
# placeholder text in date/time field
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export const translation = {"breadcrumbs.home.text":"Home","breadcrumbs.label.text":"Breadcrumbs","close.text":"Close","clear.text":"Clear","open.text":"Open","picker.calendar.navigation.nextmonth":"Next month","picker.calendar.navigation.previousmonth":"Previous month","picker.date.toolbar.title":"Selected date","picker.daterange.toolbar.title":"Select date range","picker.datetime.toolbar.title":"Select date & time","picker.field.placeholder.day":"DD","picker.field.placeholder.hours":"hh","picker.field.placeholder.meridiem":"aa","picker.field.placeholder.minutes":"mm","picker.field.placeholder.month":"MM","picker.field.placeholder.seconds":"ss","picker.field.placeholder.year":"YYYY","picker.labels.action.apply":"Apply","picker.labels.action.cancel":"Cancel","picker.labels.action.today":"Today","picker.labels.clock.empty":"No time selected","picker.labels.clock.hours":"hours","picker.labels.clock.minutes":"seconds","picker.labels.clock.selected":"Selected time is","picker.labels.date.choose":"Choose date","picker.labels.date.selected":"Selected date is","picker.labels.empty":"Empty","picker.labels.field.clear":"Clear value","picker.labels.range.end":"End","picker.labels.range.enddate":"End date","picker.labels.range.endtime":"End time","picker.labels.range.start":"Start","picker.labels.range.startdate":"Start date","picker.labels.range.starttime":"Start time","picker.labels.select":"Select","picker.labels.table.date":"pick date","picker.labels.table.time":"pick time","picker.labels.time.choose":"Choose time","picker.time.toolbar.title":"Select time","picker.view.name.day":"Day","picker.view.name.hours":"Hours","picker.view.name.meridiem":"Meridiem","picker.view.name.minutes":"Minutes","picker.view.name.month":"Month","picker.view.name.seconds":"Seconds","picker.view.name.weekday":"Week day","picker.view.name.year":"Year","picker.view.navigation.open.nextview":"Open next view","picker.view.navigation.open.previousview":"Open previous view","picker.view.navigation.switch.calendarview":"year view is open, switch to calendar view","picker.view.navigation.switch.yearview":"calendar view is open, switch to year view","fielderror.screenreader.text":"Error","fieldlabel.optional.text":"Optional","fieldlabel.required.text":"Required","filters.clear.label":"Clear filters","filters.filter.any":"Any","filters.filter.clear":"Clear filter","filters.filters.arialabel":"Filters","filters.menuitem.any":"Any {{label}}","filters.menuitem.selected":"{{selected}} selected","filters.search.label":"Search","fileupload.button.text":"Add files","fileupload.prompt.text":"Drag and drop files here or click to add files","fileupload.removefile.text":"Remove file","passwordfield.icon.label.hide":"Hide password","passwordfield.icon.label.show":"Show password","severity.error":"error","severity.info":"info","severity.success":"success","severity.warning":"warning","switch.active":"Active","switch.inactive":"Inactive","table.columnvisibility.arialabel":"Show/hide columns","table.density.arialabel":"Table density","table.draghandle.arialabel":"Drag row to reorder. Or, press space or enter to start and stop reordering and esc to cancel.","table.draghandle.tooltip":"Drag row or press space/enter key to start and stop reordering","table.actions":"Actions","table.error":"Error loading data.","table.fetchedrows.text":"Fetched {{totalRows}} row","table.fetchedrows.text_plural":"Fetched {{totalRows}} total rows","table.moreactions.arialabel":"More actions","table.noresults.heading":"There are no results.","table.noresults.text":"Try a different query.","table.reorder.backward":"Send backward","table.reorder.forward":"Bring forward","table.reorder.toback":"Send to back","table.reorder.tofront":"Bring to front","table.rows.text":"{{totalRows}} row","table.rows.text_plural":"{{totalRows}} rows","pagination.loadmore":"Show more","pagination.next":"Next page","pagination.previous":"Previous page","pagination.page":"Page","pagination.rowsperpage":"Rows per page","pagination.rowswithtotal":"{{firstRow}}-{{lastRow}} of {{totalRows}} rows","pagination.rowswithouttotal":"{{firstRow}}-{{lastRow}} rows","table.actions.selectall":"Select all","table.actions.selectnone":"Select none","table.actions.selectsome":"{{selectedRowCount}} selected","table.rowexpansion.expand":"Expand","table.rowexpansion.expandall":"Expand all","table.rowexpansion.collapse":"Collapse","table.rowexpansion.collapseall":"Collapse all","dataview.layout.table":"Table","dataview.layout.grid":"Grid","dataview.layout.list":"List"};
|
|
1
|
+
export const translation = {"breadcrumbs.home.text":"Home","breadcrumbs.label.text":"Breadcrumbs","close.text":"Close","clear.text":"Clear","open.text":"Open","picker.calendar.navigation.nextmonth":"Next month","picker.calendar.navigation.previousmonth":"Previous month","picker.date.toolbar.title":"Selected date","picker.daterange.toolbar.title":"Select date range","picker.datetime.toolbar.title":"Select date & time","picker.error.invalid":"Correct the date format or select the date from the calendar.","picker.error.mindate":"Date entered is earlier than allowed dates. Select a date from the range available in the calendar.","picker.error.maxdate":"Date entered is later than the allowed dates. Select a date from the range available in the calendar.","picker.field.placeholder.day":"DD","picker.field.placeholder.hours":"hh","picker.field.placeholder.meridiem":"aa","picker.field.placeholder.minutes":"mm","picker.field.placeholder.month":"MM","picker.field.placeholder.seconds":"ss","picker.field.placeholder.year":"YYYY","picker.labels.action.apply":"Apply","picker.labels.action.cancel":"Cancel","picker.labels.action.today":"Today","picker.labels.clock.empty":"No time selected","picker.labels.clock.hours":"hours","picker.labels.clock.minutes":"seconds","picker.labels.clock.selected":"Selected time is","picker.labels.date.choose":"Choose date","picker.labels.date.selected":"Selected date is","picker.labels.empty":"Empty","picker.labels.field.clear":"Clear value","picker.labels.range.end":"End","picker.labels.range.enddate":"End date","picker.labels.range.endtime":"End time","picker.labels.range.start":"Start","picker.labels.range.startdate":"Start date","picker.labels.range.starttime":"Start time","picker.labels.select":"Select","picker.labels.table.date":"pick date","picker.labels.table.time":"pick time","picker.labels.time.choose":"Choose time","picker.time.toolbar.title":"Select time","picker.view.name.day":"Day","picker.view.name.hours":"Hours","picker.view.name.meridiem":"Meridiem","picker.view.name.minutes":"Minutes","picker.view.name.month":"Month","picker.view.name.seconds":"Seconds","picker.view.name.weekday":"Week day","picker.view.name.year":"Year","picker.view.navigation.open.nextview":"Open next view","picker.view.navigation.open.previousview":"Open previous view","picker.view.navigation.switch.calendarview":"year view is open, switch to calendar view","picker.view.navigation.switch.yearview":"calendar view is open, switch to year view","fielderror.screenreader.text":"Error","fieldlabel.optional.text":"Optional","fieldlabel.required.text":"Required","filters.clear.label":"Clear filters","filters.filter.any":"Any","filters.filter.clear":"Clear filter","filters.filters.arialabel":"Filters","filters.menuitem.any":"Any {{label}}","filters.menuitem.selected":"{{selected}} selected","filters.search.label":"Search","fileupload.button.text":"Add files","fileupload.prompt.text":"Drag and drop files here or click to add files","fileupload.removefile.text":"Remove file","passwordfield.icon.label.hide":"Hide password","passwordfield.icon.label.show":"Show password","severity.error":"error","severity.info":"info","severity.success":"success","severity.warning":"warning","switch.active":"Active","switch.inactive":"Inactive","table.columnvisibility.arialabel":"Show/hide columns","table.density.arialabel":"Table density","table.draghandle.arialabel":"Drag row to reorder. Or, press space or enter to start and stop reordering and esc to cancel.","table.draghandle.tooltip":"Drag row or press space/enter key to start and stop reordering","table.actions":"Actions","table.error":"Error loading data.","table.fetchedrows.text":"Fetched {{totalRows}} row","table.fetchedrows.text_plural":"Fetched {{totalRows}} total rows","table.moreactions.arialabel":"More actions","table.noresults.heading":"There are no results.","table.noresults.text":"Try a different query.","table.reorder.backward":"Send backward","table.reorder.forward":"Bring forward","table.reorder.toback":"Send to back","table.reorder.tofront":"Bring to front","table.rows.text":"{{totalRows}} row","table.rows.text_plural":"{{totalRows}} rows","pagination.loadmore":"Show more","pagination.next":"Next page","pagination.previous":"Previous page","pagination.page":"Page","pagination.rowsperpage":"Rows per page","pagination.rowswithtotal":"{{firstRow}}-{{lastRow}} of {{totalRows}} rows","pagination.rowswithouttotal":"{{firstRow}}-{{lastRow}} rows","table.actions.selectall":"Select all","table.actions.selectnone":"Select none","table.actions.selectsome":"{{selectedRowCount}} selected","table.rowexpansion.expand":"Expand","table.rowexpansion.expandall":"Expand all","table.rowexpansion.collapse":"Collapse","table.rowexpansion.collapseall":"Collapse all","dataview.layout.table":"Table","dataview.layout.grid":"Grid","dataview.layout.list":"List"};
|