@okta/odyssey-react-mui 1.32.0 → 1.32.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (458) hide show
  1. package/dist/cjs/theme/components.cjs +6 -0
  2. package/dist/cjs/theme/components.cjs.map +1 -1
  3. package/dist/cjs/ui-shell/SideNav/SideNav.cjs +2 -1
  4. package/dist/cjs/ui-shell/SideNav/SideNav.cjs.map +1 -1
  5. package/dist/cjs/ui-shell/SideNav/SideNavItemContent.cjs +36 -11
  6. package/dist/cjs/ui-shell/SideNav/SideNavItemContent.cjs.map +1 -1
  7. package/dist/cjs/ui-shell/SideNav/SideNavItemLinkContent.cjs +3 -1
  8. package/dist/cjs/ui-shell/SideNav/SideNavItemLinkContent.cjs.map +1 -1
  9. package/dist/cjs/ui-shell/SideNav/SideNavLogo.cjs +14 -2
  10. package/dist/cjs/ui-shell/SideNav/SideNavLogo.cjs.map +1 -1
  11. package/dist/cjs/ui-shell/SideNav/SideNavToggleButton.cjs +1 -1
  12. package/dist/cjs/ui-shell/SideNav/SideNavToggleButton.cjs.map +1 -1
  13. package/dist/cjs/ui-shell/SideNav/types.cjs.map +1 -1
  14. package/dist/cjs/ui-shell/UiShellContent.cjs +48 -32
  15. package/dist/cjs/ui-shell/UiShellContent.cjs.map +1 -1
  16. package/dist/cjs/ui-shell/index.cjs +9 -1
  17. package/dist/cjs/ui-shell/index.cjs.map +1 -1
  18. package/dist/cjs/useContrastMode.cjs +1 -1
  19. package/dist/cjs/useContrastMode.cjs.map +1 -1
  20. package/dist/esm/theme/components.js +6 -0
  21. package/dist/esm/theme/components.js.map +1 -1
  22. package/dist/esm/ui-shell/SideNav/SideNav.js +2 -1
  23. package/dist/esm/ui-shell/SideNav/SideNav.js.map +1 -1
  24. package/dist/esm/ui-shell/SideNav/SideNavItemContent.js +37 -12
  25. package/dist/esm/ui-shell/SideNav/SideNavItemContent.js.map +1 -1
  26. package/dist/esm/ui-shell/SideNav/SideNavItemLinkContent.js +3 -1
  27. package/dist/esm/ui-shell/SideNav/SideNavItemLinkContent.js.map +1 -1
  28. package/dist/esm/ui-shell/SideNav/SideNavLogo.js +14 -2
  29. package/dist/esm/ui-shell/SideNav/SideNavLogo.js.map +1 -1
  30. package/dist/esm/ui-shell/SideNav/SideNavToggleButton.js +1 -1
  31. package/dist/esm/ui-shell/SideNav/SideNavToggleButton.js.map +1 -1
  32. package/dist/esm/ui-shell/SideNav/types.js.map +1 -1
  33. package/dist/esm/ui-shell/UiShellContent.js +45 -31
  34. package/dist/esm/ui-shell/UiShellContent.js.map +1 -1
  35. package/dist/esm/ui-shell/index.js +1 -0
  36. package/dist/esm/ui-shell/index.js.map +1 -1
  37. package/dist/esm/useContrastMode.js +2 -2
  38. package/dist/esm/useContrastMode.js.map +1 -1
  39. package/dist/index.cjs +1 -1
  40. package/dist/index.mjs +1 -1
  41. package/dist/index.scss +1 -1
  42. package/dist/tsconfig.production.tsbuildinfo +1 -1
  43. package/dist/types/theme/components.d.ts.map +1 -1
  44. package/dist/types/ui-shell/SideNav/SideNav.d.ts.map +1 -1
  45. package/dist/types/ui-shell/SideNav/SideNavItemContent.d.ts +9 -7
  46. package/dist/types/ui-shell/SideNav/SideNavItemContent.d.ts.map +1 -1
  47. package/dist/types/ui-shell/SideNav/SideNavItemLinkContent.d.ts +1 -1
  48. package/dist/types/ui-shell/SideNav/SideNavItemLinkContent.d.ts.map +1 -1
  49. package/dist/types/ui-shell/SideNav/SideNavLogo.d.ts.map +1 -1
  50. package/dist/types/ui-shell/SideNav/types.d.ts +5 -1
  51. package/dist/types/ui-shell/SideNav/types.d.ts.map +1 -1
  52. package/dist/types/ui-shell/UiShellContent.d.ts +8 -2
  53. package/dist/types/ui-shell/UiShellContent.d.ts.map +1 -1
  54. package/dist/types/ui-shell/index.d.ts +1 -1
  55. package/dist/types/ui-shell/index.d.ts.map +1 -1
  56. package/package.json +4 -4
  57. package/.browserslistrc +0 -1
  58. package/.svgrrc.cjs +0 -13
  59. package/CHANGELOG.md +0 -1490
  60. package/babel.config.cjs +0 -112
  61. package/i18n.config.json +0 -10
  62. package/scripts/generateIconsIndex.ts +0 -49
  63. package/scripts/generateTestSelectorsJson.ts +0 -33
  64. package/scripts/properties-to-ts.ts +0 -111
  65. package/src/@types/i18next.d.ts +0 -24
  66. package/src/@types/properties.d.ts +0 -292
  67. package/src/@types/react-augment.d.ts +0 -22
  68. package/src/Accordion.tsx +0 -117
  69. package/src/Autocomplete.tsx +0 -321
  70. package/src/Badge.tsx +0 -112
  71. package/src/Banner.tsx +0 -112
  72. package/src/Box.tsx +0 -44
  73. package/src/Breadcrumbs.tsx +0 -221
  74. package/src/Buttons/BaseButton.tsx +0 -250
  75. package/src/Buttons/BaseMenuButton.tsx +0 -342
  76. package/src/Buttons/Button.tsx +0 -30
  77. package/src/Buttons/ButtonContext.tsx +0 -23
  78. package/src/Buttons/MenuButton.tsx +0 -33
  79. package/src/Buttons/MenuContext.ts +0 -25
  80. package/src/Buttons/MenuItem.tsx +0 -103
  81. package/src/Buttons/index.ts +0 -25
  82. package/src/Callout.tsx +0 -176
  83. package/src/Card.tsx +0 -186
  84. package/src/Checkbox.tsx +0 -261
  85. package/src/CheckboxGroup.tsx +0 -127
  86. package/src/CircularProgress.tsx +0 -42
  87. package/src/CssBaseline.tsx +0 -20
  88. package/src/DataTable/DataTable.tsx +0 -968
  89. package/src/DataTable/DataTableRowActions.tsx +0 -132
  90. package/src/DataTable/DataTableSettings.tsx +0 -136
  91. package/src/DataTable/constants.ts +0 -13
  92. package/src/DataTable/index.tsx +0 -28
  93. package/src/DataTable/reorderDataRowsLocally.tsx +0 -48
  94. package/src/DataTable/useRowReordering.tsx +0 -232
  95. package/src/DataTable/useScrollIndication.tsx +0 -125
  96. package/src/DatePickers/DateField.tsx +0 -267
  97. package/src/DatePickers/DateFieldActionBar.tsx +0 -65
  98. package/src/DatePickers/DateFieldLocalizationProvider.tsx +0 -46
  99. package/src/DatePickers/DatePicker.test.tsx +0 -66
  100. package/src/DatePickers/DatePicker.tsx +0 -299
  101. package/src/DatePickers/DatePicker.types.d.ts +0 -14
  102. package/src/DatePickers/TimeZonePicker.tsx +0 -59
  103. package/src/DatePickers/datePickerTheme.tsx +0 -377
  104. package/src/DatePickers/index.ts +0 -15
  105. package/src/DatePickers/useDateFieldsTranslations.ts +0 -94
  106. package/src/DatePickers/useOdysseyDateFields.ts +0 -303
  107. package/src/Dialog.tsx +0 -178
  108. package/src/Drawer.tsx +0 -255
  109. package/src/EmptyState.tsx +0 -79
  110. package/src/ErrorMessageList.tsx +0 -56
  111. package/src/Field.tsx +0 -189
  112. package/src/FieldComponentProps.ts +0 -66
  113. package/src/FieldError.tsx +0 -59
  114. package/src/FieldHint.tsx +0 -72
  115. package/src/FieldLabel.tsx +0 -67
  116. package/src/Fieldset.tsx +0 -116
  117. package/src/FieldsetContext.tsx +0 -23
  118. package/src/FileUploader/FileUploadIllustration.tsx +0 -66
  119. package/src/FileUploader/FileUploadPreview.tsx +0 -151
  120. package/src/FileUploader/FileUploader.tsx +0 -311
  121. package/src/FileUploader/index.ts +0 -13
  122. package/src/Form.tsx +0 -185
  123. package/src/FormCheckedProps.ts +0 -59
  124. package/src/HintLink.tsx +0 -28
  125. package/src/HtmlProps.ts +0 -112
  126. package/src/IconWithTooltip.tsx +0 -90
  127. package/src/Link.tsx +0 -115
  128. package/src/MuiPropsChild.tsx +0 -42
  129. package/src/MuiPropsContext.ts +0 -18
  130. package/src/NativeSelect.tsx +0 -249
  131. package/src/NullElement.tsx +0 -13
  132. package/src/OdysseyCacheProvider.test.tsx +0 -39
  133. package/src/OdysseyCacheProvider.tsx +0 -86
  134. package/src/OdysseyDesignTokensContext.tsx +0 -23
  135. package/src/OdysseyProvider.tsx +0 -92
  136. package/src/OdysseyThemeProvider.test.tsx +0 -211
  137. package/src/OdysseyThemeProvider.tsx +0 -109
  138. package/src/OdysseyTranslationProvider.test.tsx +0 -95
  139. package/src/OdysseyTranslationProvider.tsx +0 -77
  140. package/src/OdysseyTranslationProvider.types.ts +0 -47
  141. package/src/Pagination/Pagination.test.tsx +0 -327
  142. package/src/Pagination/Pagination.tsx +0 -417
  143. package/src/Pagination/constants.ts +0 -13
  144. package/src/Pagination/index.ts +0 -15
  145. package/src/Pagination/usePagination.ts +0 -45
  146. package/src/PasswordField.tsx +0 -253
  147. package/src/Radio.tsx +0 -199
  148. package/src/RadioGroup.tsx +0 -164
  149. package/src/ScreenReaderText.tsx +0 -53
  150. package/src/SearchField.tsx +0 -240
  151. package/src/Select.tsx +0 -576
  152. package/src/Stack.tsx +0 -56
  153. package/src/Status.tsx +0 -67
  154. package/src/Surface.tsx +0 -61
  155. package/src/SvgIcon.ts +0 -22
  156. package/src/Switch.tsx +0 -425
  157. package/src/Tabs.tsx +0 -259
  158. package/src/Tag.tsx +0 -317
  159. package/src/TagList.tsx +0 -55
  160. package/src/TagListContext.tsx +0 -23
  161. package/src/TextField.tsx +0 -298
  162. package/src/Toast.tsx +0 -151
  163. package/src/ToastStack.tsx +0 -43
  164. package/src/Tooltip.tsx +0 -61
  165. package/src/Typography.test.tsx +0 -26
  166. package/src/Typography.tsx +0 -474
  167. package/src/createContrastColors.ts +0 -112
  168. package/src/createUniqueAlphabeticalId.test.ts +0 -22
  169. package/src/createUniqueAlphabeticalId.ts +0 -17
  170. package/src/createUniqueId.test.ts +0 -22
  171. package/src/createUniqueId.ts +0 -17
  172. package/src/getTypedObjectKeys.ts +0 -15
  173. package/src/hexToRgb.ts +0 -40
  174. package/src/i18n.ts +0 -110
  175. package/src/icons.generated/Add.tsx +0 -44
  176. package/src/icons.generated/AddCircle.tsx +0 -46
  177. package/src/icons.generated/Apps.tsx +0 -44
  178. package/src/icons.generated/ArrowBottom.tsx +0 -46
  179. package/src/icons.generated/ArrowDown.tsx +0 -46
  180. package/src/icons.generated/ArrowLeft.tsx +0 -46
  181. package/src/icons.generated/ArrowLowerLeft.tsx +0 -46
  182. package/src/icons.generated/ArrowLowerRight.tsx +0 -46
  183. package/src/icons.generated/ArrowRight.tsx +0 -46
  184. package/src/icons.generated/ArrowTop.tsx +0 -46
  185. package/src/icons.generated/ArrowUnsorted.tsx +0 -46
  186. package/src/icons.generated/ArrowUp.tsx +0 -46
  187. package/src/icons.generated/ArrowUpperLeft.tsx +0 -46
  188. package/src/icons.generated/ArrowUpperRight.tsx +0 -46
  189. package/src/icons.generated/Bug.tsx +0 -44
  190. package/src/icons.generated/Calendar.tsx +0 -46
  191. package/src/icons.generated/Call.tsx +0 -44
  192. package/src/icons.generated/Chat.tsx +0 -44
  193. package/src/icons.generated/Check.tsx +0 -44
  194. package/src/icons.generated/CheckCircleFilled.tsx +0 -47
  195. package/src/icons.generated/ChevronDown.tsx +0 -46
  196. package/src/icons.generated/ChevronLeft.tsx +0 -46
  197. package/src/icons.generated/ChevronRight.tsx +0 -46
  198. package/src/icons.generated/ChevronUp.tsx +0 -46
  199. package/src/icons.generated/Clock.tsx +0 -44
  200. package/src/icons.generated/Close.tsx +0 -44
  201. package/src/icons.generated/CloseCircleFilled.tsx +0 -47
  202. package/src/icons.generated/CollapseLeft.tsx +0 -46
  203. package/src/icons.generated/CollapseRight.tsx +0 -46
  204. package/src/icons.generated/Copy.tsx +0 -44
  205. package/src/icons.generated/Custom.tsx +0 -50
  206. package/src/icons.generated/DangerDiamond.tsx +0 -46
  207. package/src/icons.generated/DangerDiamondFilled.tsx +0 -47
  208. package/src/icons.generated/Delete.tsx +0 -44
  209. package/src/icons.generated/Deny.tsx +0 -44
  210. package/src/icons.generated/Devices.tsx +0 -46
  211. package/src/icons.generated/Directory.tsx +0 -46
  212. package/src/icons.generated/Documentation.tsx +0 -46
  213. package/src/icons.generated/Download.tsx +0 -46
  214. package/src/icons.generated/DragIndicator.tsx +0 -46
  215. package/src/icons.generated/Duo.tsx +0 -62
  216. package/src/icons.generated/Edit.tsx +0 -44
  217. package/src/icons.generated/Email.tsx +0 -49
  218. package/src/icons.generated/ExpandLeft.tsx +0 -46
  219. package/src/icons.generated/ExpandRight.tsx +0 -46
  220. package/src/icons.generated/ExternalLink.tsx +0 -44
  221. package/src/icons.generated/Fido2.tsx +0 -72
  222. package/src/icons.generated/Filter.tsx +0 -44
  223. package/src/icons.generated/Folder.tsx +0 -44
  224. package/src/icons.generated/Globe.tsx +0 -44
  225. package/src/icons.generated/GoogleAuth.tsx +0 -70
  226. package/src/icons.generated/Grid.tsx +0 -47
  227. package/src/icons.generated/Group.tsx +0 -44
  228. package/src/icons.generated/Hide.tsx +0 -44
  229. package/src/icons.generated/Home.tsx +0 -44
  230. package/src/icons.generated/Idp.tsx +0 -54
  231. package/src/icons.generated/InformationCircle.tsx +0 -47
  232. package/src/icons.generated/InformationCircleFilled.tsx +0 -47
  233. package/src/icons.generated/Link.tsx +0 -44
  234. package/src/icons.generated/List.tsx +0 -44
  235. package/src/icons.generated/Lock.tsx +0 -44
  236. package/src/icons.generated/More.tsx +0 -44
  237. package/src/icons.generated/Notification.tsx +0 -46
  238. package/src/icons.generated/OktaVerify.tsx +0 -46
  239. package/src/icons.generated/OnPremMfa.tsx +0 -52
  240. package/src/icons.generated/OneTimePassword.tsx +0 -65
  241. package/src/icons.generated/Password.tsx +0 -80
  242. package/src/icons.generated/Pause.tsx +0 -44
  243. package/src/icons.generated/QuestionCircle.tsx +0 -46
  244. package/src/icons.generated/QuestionCircleFilled.tsx +0 -47
  245. package/src/icons.generated/Refresh.tsx +0 -46
  246. package/src/icons.generated/Reset.tsx +0 -44
  247. package/src/icons.generated/Resume.tsx +0 -44
  248. package/src/icons.generated/Search.tsx +0 -44
  249. package/src/icons.generated/SecurityQuestion.tsx +0 -51
  250. package/src/icons.generated/Server.tsx +0 -44
  251. package/src/icons.generated/Settings.tsx +0 -46
  252. package/src/icons.generated/Show.tsx +0 -44
  253. package/src/icons.generated/SmartCard.tsx +0 -65
  254. package/src/icons.generated/Sms.tsx +0 -55
  255. package/src/icons.generated/Subtract.tsx +0 -46
  256. package/src/icons.generated/SymantecVip.tsx +0 -52
  257. package/src/icons.generated/Sync.tsx +0 -44
  258. package/src/icons.generated/ThumbsDown.tsx +0 -46
  259. package/src/icons.generated/ThumbsUp.tsx +0 -46
  260. package/src/icons.generated/Unlock.tsx +0 -44
  261. package/src/icons.generated/Upload.tsx +0 -44
  262. package/src/icons.generated/User.tsx +0 -44
  263. package/src/icons.generated/Video.tsx +0 -44
  264. package/src/icons.generated/VoiceCall.tsx +0 -62
  265. package/src/icons.generated/Warning.tsx +0 -46
  266. package/src/icons.generated/WarningFilled.tsx +0 -46
  267. package/src/icons.generated/Yubikey.tsx +0 -44
  268. package/src/icons.generated/index.ts +0 -107
  269. package/src/index.ts +0 -118
  270. package/src/inputUtils.ts +0 -80
  271. package/src/labs/AppTile.tsx +0 -421
  272. package/src/labs/DataFilters.tsx +0 -871
  273. package/src/labs/DataTable.tsx +0 -877
  274. package/src/labs/DataTablePagination.tsx +0 -88
  275. package/src/labs/DataView/BulkActionsMenu.tsx +0 -98
  276. package/src/labs/DataView/CardLayoutContent.tsx +0 -272
  277. package/src/labs/DataView/DataCard.tsx +0 -357
  278. package/src/labs/DataView/DataTable.tsx +0 -128
  279. package/src/labs/DataView/DataView.test.tsx +0 -1168
  280. package/src/labs/DataView/DataView.tsx +0 -504
  281. package/src/labs/DataView/DetailPanel.tsx +0 -31
  282. package/src/labs/DataView/LayoutSwitcher.tsx +0 -72
  283. package/src/labs/DataView/RowActions.tsx +0 -125
  284. package/src/labs/DataView/TableLayoutContent.tsx +0 -500
  285. package/src/labs/DataView/TableSettings.tsx +0 -144
  286. package/src/labs/DataView/componentTypes.ts +0 -129
  287. package/src/labs/DataView/constants.tsx +0 -28
  288. package/src/labs/DataView/dataTypes.ts +0 -83
  289. package/src/labs/DataView/fetchData.ts +0 -49
  290. package/src/labs/DataView/index.ts +0 -19
  291. package/src/labs/DataView/tableConstants.tsx +0 -137
  292. package/src/labs/DataView/testSupportData.tsx +0 -301
  293. package/src/labs/DataView/useFilterConversion.ts +0 -88
  294. package/src/labs/DatePickers/DateTimeField.tsx +0 -267
  295. package/src/labs/DatePickers/DateTimePicker.test.tsx +0 -70
  296. package/src/labs/DatePickers/DateTimePicker.tsx +0 -303
  297. package/src/labs/DatePickers/dateTimePickerTheme.ts +0 -216
  298. package/src/labs/DatePickers/index.ts +0 -13
  299. package/src/labs/GroupPicker.tsx +0 -261
  300. package/src/labs/OdysseyPickers/ComposablePicker.test.tsx +0 -32
  301. package/src/labs/OdysseyPickers/ComposablePicker.tsx +0 -188
  302. package/src/labs/OdysseyPickers/Picker.tsx +0 -381
  303. package/src/labs/OdysseyPickers/PickerVirtualizationListBox.tsx +0 -192
  304. package/src/labs/OdysseyPickers/PickerWithOptionAdornment.tsx +0 -429
  305. package/src/labs/OdysseyPickers/index.ts +0 -15
  306. package/src/labs/PageTemplate/Layout.tsx +0 -85
  307. package/src/labs/PageTemplate/PageTemplate.tsx +0 -234
  308. package/src/labs/PageTemplate/index.ts +0 -14
  309. package/src/labs/PaginatedTable.tsx +0 -290
  310. package/src/labs/README.md +0 -46
  311. package/src/labs/StaticTable.tsx +0 -131
  312. package/src/labs/UserProfile.tsx +0 -104
  313. package/src/labs/UserProfileMenuButton.tsx +0 -86
  314. package/src/labs/index.ts +0 -47
  315. package/src/labs/materialReactTableTypes.tsx +0 -19
  316. package/src/properties/odyssey-react-mui.properties +0 -140
  317. package/src/properties/translations/odyssey-react-mui_cs.properties +0 -140
  318. package/src/properties/translations/odyssey-react-mui_da.properties +0 -140
  319. package/src/properties/translations/odyssey-react-mui_de.properties +0 -140
  320. package/src/properties/translations/odyssey-react-mui_el.properties +0 -140
  321. package/src/properties/translations/odyssey-react-mui_es.properties +0 -140
  322. package/src/properties/translations/odyssey-react-mui_fi.properties +0 -140
  323. package/src/properties/translations/odyssey-react-mui_fr.properties +0 -140
  324. package/src/properties/translations/odyssey-react-mui_ht.properties +0 -140
  325. package/src/properties/translations/odyssey-react-mui_hu.properties +0 -140
  326. package/src/properties/translations/odyssey-react-mui_id.properties +0 -140
  327. package/src/properties/translations/odyssey-react-mui_it.properties +0 -140
  328. package/src/properties/translations/odyssey-react-mui_ja.properties +0 -140
  329. package/src/properties/translations/odyssey-react-mui_ko.properties +0 -140
  330. package/src/properties/translations/odyssey-react-mui_ms.properties +0 -140
  331. package/src/properties/translations/odyssey-react-mui_nb.properties +0 -140
  332. package/src/properties/translations/odyssey-react-mui_nl_NL.properties +0 -140
  333. package/src/properties/translations/odyssey-react-mui_ok_PL.properties +0 -126
  334. package/src/properties/translations/odyssey-react-mui_ok_SK.properties +0 -126
  335. package/src/properties/translations/odyssey-react-mui_pl.properties +0 -140
  336. package/src/properties/translations/odyssey-react-mui_pt_BR.properties +0 -140
  337. package/src/properties/translations/odyssey-react-mui_ro.properties +0 -140
  338. package/src/properties/translations/odyssey-react-mui_ru.properties +0 -140
  339. package/src/properties/translations/odyssey-react-mui_sv.properties +0 -140
  340. package/src/properties/translations/odyssey-react-mui_th.properties +0 -140
  341. package/src/properties/translations/odyssey-react-mui_tr.properties +0 -140
  342. package/src/properties/translations/odyssey-react-mui_uk.properties +0 -140
  343. package/src/properties/translations/odyssey-react-mui_vi.properties +0 -140
  344. package/src/properties/translations/odyssey-react-mui_zh_CN.properties +0 -140
  345. package/src/properties/translations/odyssey-react-mui_zh_TW.properties +0 -140
  346. package/src/properties/ts/odyssey-react-mui.ts +0 -1
  347. package/src/properties/ts/odyssey-react-mui_cs.ts +0 -1
  348. package/src/properties/ts/odyssey-react-mui_da.ts +0 -1
  349. package/src/properties/ts/odyssey-react-mui_de.ts +0 -1
  350. package/src/properties/ts/odyssey-react-mui_el.ts +0 -1
  351. package/src/properties/ts/odyssey-react-mui_es.ts +0 -1
  352. package/src/properties/ts/odyssey-react-mui_fi.ts +0 -1
  353. package/src/properties/ts/odyssey-react-mui_fr.ts +0 -1
  354. package/src/properties/ts/odyssey-react-mui_ht.ts +0 -1
  355. package/src/properties/ts/odyssey-react-mui_hu.ts +0 -1
  356. package/src/properties/ts/odyssey-react-mui_id.ts +0 -1
  357. package/src/properties/ts/odyssey-react-mui_it.ts +0 -1
  358. package/src/properties/ts/odyssey-react-mui_ja.ts +0 -1
  359. package/src/properties/ts/odyssey-react-mui_ko.ts +0 -1
  360. package/src/properties/ts/odyssey-react-mui_ms.ts +0 -1
  361. package/src/properties/ts/odyssey-react-mui_nb.ts +0 -1
  362. package/src/properties/ts/odyssey-react-mui_nl_NL.ts +0 -1
  363. package/src/properties/ts/odyssey-react-mui_ok_PL.ts +0 -1
  364. package/src/properties/ts/odyssey-react-mui_ok_SK.ts +0 -1
  365. package/src/properties/ts/odyssey-react-mui_pl.ts +0 -1
  366. package/src/properties/ts/odyssey-react-mui_pt_BR.ts +0 -1
  367. package/src/properties/ts/odyssey-react-mui_ro.ts +0 -1
  368. package/src/properties/ts/odyssey-react-mui_ru.ts +0 -1
  369. package/src/properties/ts/odyssey-react-mui_sv.ts +0 -1
  370. package/src/properties/ts/odyssey-react-mui_th.ts +0 -1
  371. package/src/properties/ts/odyssey-react-mui_tr.ts +0 -1
  372. package/src/properties/ts/odyssey-react-mui_uk.ts +0 -1
  373. package/src/properties/ts/odyssey-react-mui_vi.ts +0 -1
  374. package/src/properties/ts/odyssey-react-mui_zh_CN.ts +0 -1
  375. package/src/properties/ts/odyssey-react-mui_zh_TW.ts +0 -1
  376. package/src/remUtils.ts +0 -27
  377. package/src/shadow-dom/index.ts +0 -13
  378. package/src/shadow-dom/shadow-dom.test.ts +0 -24
  379. package/src/shadow-dom/shadow-dom.ts +0 -54
  380. package/src/test-selectors/getByQuerySelector.ts +0 -176
  381. package/src/test-selectors/getComputedAccessibleErrorMessageText.ts +0 -52
  382. package/src/test-selectors/getComputedAccessibleText.ts +0 -36
  383. package/src/test-selectors/index.ts +0 -15
  384. package/src/test-selectors/interpolateString.ts +0 -41
  385. package/src/test-selectors/linkedHtmlSelectors.ts +0 -73
  386. package/src/test-selectors/queryOdysseySelector.ts +0 -36
  387. package/src/test-selectors/querySelector.ts +0 -249
  388. package/src/test-selectors/sanityChecks.ts +0 -53
  389. package/src/test-selectors/testSelector.ts +0 -143
  390. package/src/theme/components.tsx +0 -3275
  391. package/src/theme/components.types.ts +0 -111
  392. package/src/theme/createOdysseyMuiTheme.ts +0 -54
  393. package/src/theme/index.ts +0 -13
  394. package/src/theme/mixins.ts +0 -29
  395. package/src/theme/mixins.types.ts +0 -31
  396. package/src/theme/palette.ts +0 -112
  397. package/src/theme/palette.types.ts +0 -24
  398. package/src/theme/shape.ts +0 -31
  399. package/src/theme/spacing.ts +0 -34
  400. package/src/theme/theme.ts +0 -13
  401. package/src/theme/typography.ts +0 -137
  402. package/src/theme/typography.types.ts +0 -41
  403. package/src/theme/useContrastMode.test.tsx +0 -504
  404. package/src/ui-shell/AppSwitcher/AppSwitcher.tsx +0 -94
  405. package/src/ui-shell/AppSwitcher/AppSwitcherApp.tsx +0 -146
  406. package/src/ui-shell/AppSwitcher/OktaAura.tsx +0 -50
  407. package/src/ui-shell/AppSwitcher/index.ts +0 -13
  408. package/src/ui-shell/SideNav/CollapseIcon.tsx +0 -34
  409. package/src/ui-shell/SideNav/HandleIcon.tsx +0 -35
  410. package/src/ui-shell/SideNav/NavAccordion.tsx +0 -243
  411. package/src/ui-shell/SideNav/OktaLogo.tsx +0 -34
  412. package/src/ui-shell/SideNav/SideNav.test.tsx +0 -326
  413. package/src/ui-shell/SideNav/SideNav.tsx +0 -810
  414. package/src/ui-shell/SideNav/SideNavFooterContent.tsx +0 -85
  415. package/src/ui-shell/SideNav/SideNavHeader.tsx +0 -134
  416. package/src/ui-shell/SideNav/SideNavItemContent.tsx +0 -402
  417. package/src/ui-shell/SideNav/SideNavItemContentContext.tsx +0 -29
  418. package/src/ui-shell/SideNav/SideNavItemLinkContent.tsx +0 -90
  419. package/src/ui-shell/SideNav/SideNavLogo.tsx +0 -65
  420. package/src/ui-shell/SideNav/SideNavToggleButton.tsx +0 -272
  421. package/src/ui-shell/SideNav/SortableList/SortableItem.tsx +0 -237
  422. package/src/ui-shell/SideNav/SortableList/SortableList.tsx +0 -132
  423. package/src/ui-shell/SideNav/SortableList/SortableOverlay.tsx +0 -34
  424. package/src/ui-shell/SideNav/index.ts +0 -16
  425. package/src/ui-shell/SideNav/types.ts +0 -224
  426. package/src/ui-shell/TopNav/TopNav.tsx +0 -109
  427. package/src/ui-shell/TopNav/TopNavLinksList.tsx +0 -68
  428. package/src/ui-shell/TopNav/TopNavListItem.tsx +0 -209
  429. package/src/ui-shell/TopNav/index.ts +0 -13
  430. package/src/ui-shell/UiShell.test.tsx +0 -366
  431. package/src/ui-shell/UiShell.tsx +0 -153
  432. package/src/ui-shell/UiShellContent.tsx +0 -350
  433. package/src/ui-shell/UiShellProvider.tsx +0 -103
  434. package/src/ui-shell/bufferLatest.test.ts +0 -79
  435. package/src/ui-shell/bufferLatest.ts +0 -64
  436. package/src/ui-shell/createMessageBus.test.ts +0 -115
  437. package/src/ui-shell/createMessageBus.ts +0 -53
  438. package/src/ui-shell/createStore.test.ts +0 -103
  439. package/src/ui-shell/createStore.ts +0 -37
  440. package/src/ui-shell/index.ts +0 -21
  441. package/src/ui-shell/renderUiShell.test.tsx +0 -203
  442. package/src/ui-shell/renderUiShell.tsx +0 -158
  443. package/src/ui-shell/useHasUiShell.ts +0 -25
  444. package/src/ui-shell/useScrollState.ts +0 -59
  445. package/src/useAutocomplete.tsx +0 -184
  446. package/src/useContrastMode.tsx +0 -143
  447. package/src/useNormalizedKey.ts +0 -17
  448. package/src/useUniqueAlphabeticalId.ts +0 -21
  449. package/src/useUniqueId.ts +0 -21
  450. package/src/web-component/createReactRootElements.test.ts +0 -40
  451. package/src/web-component/createReactRootElements.ts +0 -39
  452. package/src/web-component/index.ts +0 -13
  453. package/src/web-component/renderReactInWebComponent.test.tsx +0 -128
  454. package/src/web-component/renderReactInWebComponent.ts +0 -135
  455. package/tsconfig.json +0 -16
  456. package/tsconfig.production.json +0 -13
  457. package/vitest.config.ts +0 -36
  458. package/vitest.setup.ts +0 -32
@@ -1,871 +0,0 @@
1
- /*!
2
- * Copyright (c) 2023-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
- MutableRefObject,
15
- ReactNode,
16
- memo,
17
- useCallback,
18
- useEffect,
19
- useMemo,
20
- useRef,
21
- useState,
22
- } from "react";
23
- import { Trans, useTranslation } from "react-i18next";
24
- import {
25
- IconButton as MuiIconButton,
26
- Menu as MuiMenu,
27
- MenuItem as MuiMenuItem,
28
- Popover as MuiPopover,
29
- Typography as MuiTypography,
30
- } from "@mui/material";
31
- import { MRT_ColumnDef, MRT_RowData } from "material-react-table";
32
- import styled from "@emotion/styled";
33
-
34
- import { Autocomplete } from "../Autocomplete.js";
35
- import { Box } from "../Box.js";
36
- import { Button } from "../Buttons/index.js";
37
- import { CheckboxGroup } from "../CheckboxGroup.js";
38
- import { Checkbox } from "../Checkbox.js";
39
- import {
40
- CheckIcon,
41
- ChevronRightIcon,
42
- CloseCircleFilledIcon,
43
- FilterIcon,
44
- } from "../icons.generated/index.js";
45
- import {
46
- DesignTokens,
47
- useOdysseyDesignTokens,
48
- } from "../OdysseyDesignTokensContext.js";
49
- import { RadioGroup } from "../RadioGroup.js";
50
- import { Radio } from "../Radio.js";
51
- import { SearchField } from "../SearchField.js";
52
- import { Tag } from "../Tag.js";
53
- import { TagList } from "../TagList.js";
54
- import { TextField } from "../TextField.js";
55
- import { Subordinate } from "../Typography.js";
56
-
57
- const AutocompleteOuterContainer = styled("div", {
58
- shouldForwardProp: (prop) => prop !== "odysseyDesignTokens",
59
- })<{ odysseyDesignTokens: DesignTokens }>(({ odysseyDesignTokens }) => ({
60
- display: "flex",
61
- alignItems: "flex-end",
62
- gap: odysseyDesignTokens.Spacing2,
63
- }));
64
-
65
- const AutocompleteInnerContainer = styled("div")({
66
- width: "100%",
67
- });
68
-
69
- type Option = {
70
- label: string;
71
- value: string;
72
- };
73
-
74
- export type DataFilterValue = string | string[] | Option[] | undefined;
75
-
76
- export type UpdateFiltersOrValues = ({
77
- filterId,
78
- value,
79
- }: {
80
- filterId: string;
81
- value: DataFilterValue;
82
- }) => void;
83
-
84
- // This is the shape of each individual filter
85
- export type DataFilter = {
86
- /**
87
- * A unique ID for the filter, typically the same id
88
- * as the column it'll be applied to.
89
- */
90
- id: Exclude<MRT_ColumnDef<MRT_RowData>["accessorKey"], undefined>;
91
- /**
92
- * `Autocomplete` normally only allows values that exist in the list box. This feature allows you to enter in any value in the text field and have that be the stored value in `Autocomplete`
93
- *
94
- * NOTE: This only applies when `variant` is `autocomplete`
95
- */
96
- isCustomValueAllowed?: boolean;
97
- /**
98
- * The human-friendly name of the filter.
99
- */
100
- label: string;
101
- /**
102
- * The type of filter, which determines which filtering control
103
- * is shown.
104
- */
105
- variant?: MRT_ColumnDef<MRT_RowData>["filterVariant"];
106
- /**
107
- * The current value of the filter. Typically a string, but
108
- * filters that allow for multiple selections (such as multi-select)
109
- * can accept an array.
110
- */
111
- value?: DataFilterValue;
112
- /**
113
- * If the filter control has preset options (such as a select or multi-select),
114
- * these are the options provided.
115
- */
116
- options?: Option[];
117
- /**
118
- * A callback which renders a custom filter control
119
- */
120
- render?: (updateFilters: UpdateFiltersOrValues) => ReactNode;
121
- };
122
-
123
- // This is the type of the DataFilters component itself
124
- export type DataFiltersProps = {
125
- /**
126
- * The callback that's fired when the search input changes
127
- * (either on change or on submit, based on the value of `hasSearchSubmitButton`).
128
- * If this is undefined, the search input will not be shown.
129
- */
130
- onChangeSearch?: (value: string) => void;
131
- /**
132
- * The callback that's fired when filter values change.
133
- */
134
- onChangeFilters?: (filters: Array<DataFilter>) => void;
135
- /**
136
- * If true, a Search button will be provided alongside the search input
137
- * and `onChangeSearch` will fire when the button is clicked, rather than
138
- * whenever the input value changes.
139
- */
140
- hasSearchSubmitButton?: boolean;
141
- /**
142
- * The debounce time, in milliseconds, for the search input firing
143
- * `onChangeSearch` when changed. If `hasSearchSubmitButton` is true,
144
- * this doesn't do anything.
145
- */
146
- searchDelayTime?: number;
147
- /**
148
- * The starting value of the search input
149
- */
150
- defaultSearchTerm?: string;
151
- /**
152
- * A slot for optional additional actions, like buttons, to be displayed
153
- * on the opposite side of the top row from the search and filter controls.
154
- */
155
- additionalActions?: ReactNode;
156
- /**
157
- * The filters available in the filter menu. If undefined,
158
- * the filter menu won't be shown.
159
- */
160
- filters?: Array<DataFilter>;
161
- /**
162
- * If true, the filter and search will be disabled
163
- */
164
- isDisabled?: boolean;
165
- };
166
-
167
- type FilterTagsProps = {
168
- activeFilters: DataFilter[];
169
- updateFilterAndInputValues: UpdateFiltersOrValues;
170
- };
171
-
172
- type FiltersToRender = {
173
- id: string;
174
- label: string;
175
- value: string;
176
- };
177
-
178
- const FilterTags = ({
179
- activeFilters,
180
- updateFilterAndInputValues,
181
- }: FilterTagsProps) => {
182
- const filtersWithValues = activeFilters.filter(
183
- (activeFilter: DataFilter) => activeFilter.value,
184
- );
185
- const filtersToRender: FiltersToRender[] = [];
186
-
187
- filtersWithValues.forEach((filter) => {
188
- if (Array.isArray(filter.value)) {
189
- filter.value.forEach((filterValue) => {
190
- const formattedValue =
191
- typeof filterValue === "string" ? filterValue : filterValue.value;
192
- filtersToRender.push({
193
- id: filter.id,
194
- label: filter.label,
195
- value: formattedValue,
196
- });
197
- });
198
- }
199
- if (typeof filter.value === "string") {
200
- filtersToRender.push({
201
- id: filter.id,
202
- label: filter.label,
203
- value: filter.value,
204
- });
205
- }
206
- });
207
-
208
- const getFilter = (id: string) =>
209
- filtersWithValues.find((filter) => filter.id === id);
210
-
211
- const removeValueFromFilterAndInput = (
212
- id: string,
213
- removedFilterValue: string,
214
- ) => {
215
- const currentFilter = getFilter(id);
216
-
217
- if (currentFilter) {
218
- const { value } = currentFilter;
219
-
220
- if (Array.isArray(value)) {
221
- const updatedValues = value.filter((currentValue) => {
222
- return (currentValue as Option).value !== removedFilterValue;
223
- });
224
- updateFilterAndInputValues({
225
- filterId: id,
226
- value:
227
- updatedValues.length > 0 ? (updatedValues as Option[]) : undefined,
228
- });
229
- }
230
-
231
- if (typeof value === "string") {
232
- updateFilterAndInputValues({
233
- filterId: id,
234
- value: undefined,
235
- });
236
- }
237
- }
238
- };
239
-
240
- return (
241
- <TagList>
242
- {filtersToRender.map((filter) => (
243
- <Tag
244
- key={`${filter.label}: ${filter.value}`}
245
- label={`${filter.label}: ${filter.value}`}
246
- onRemove={() =>
247
- removeValueFromFilterAndInput(filter.id, filter.value)
248
- }
249
- />
250
- ))}
251
- </TagList>
252
- );
253
- };
254
-
255
- const MemoizedFilterTags = memo(FilterTags);
256
- MemoizedFilterTags.displayName = "FilterTags";
257
-
258
- const DataFilters = ({
259
- onChangeSearch,
260
- onChangeFilters,
261
- hasSearchSubmitButton = false,
262
- searchDelayTime = 200,
263
- defaultSearchTerm = "",
264
- additionalActions,
265
- filters: filtersProp = [],
266
- isDisabled,
267
- }: DataFiltersProps) => {
268
- const [filters, setFilters] = useState<DataFilter[]>(filtersProp);
269
- const { t } = useTranslation();
270
- const odysseyDesignTokens = useOdysseyDesignTokens();
271
-
272
- const initialInputValues = useMemo(() => {
273
- return filtersProp.reduce(
274
- (accumulator, filter) => {
275
- accumulator[filter.id] = filter.value;
276
- return accumulator;
277
- },
278
- {} as Record<string, DataFilterValue>,
279
- );
280
- }, [filtersProp]);
281
-
282
- const [inputValues, setInputValues] = useState(initialInputValues);
283
-
284
- const [searchValue, setSearchValue] = useState<string>(defaultSearchTerm);
285
-
286
- const activeFilters = useMemo(() => {
287
- return filters.filter((filter) => filter.value);
288
- }, [filters]);
289
-
290
- const [isFiltersMenuOpen, setIsFiltersMenuOpen] = useState<boolean>(false);
291
-
292
- const [filtersMenuAnchorElement, setFiltersMenuAnchorElement] = useState<
293
- HTMLElement | undefined
294
- >();
295
-
296
- const [isFilterPopoverOpen, setIsFilterPopoverOpen] =
297
- useState<boolean>(false);
298
-
299
- const [filterPopoverAnchorElement, setFilterPopoverAnchorElement] = useState<
300
- HTMLElement | undefined
301
- >();
302
-
303
- const [filterPopoverCurrentFilter, setFilterPopoverCurrentFilter] = useState<
304
- DataFilter | undefined
305
- >();
306
-
307
- const menuRef = useRef<HTMLDivElement>();
308
-
309
- useEffect(() => {
310
- onChangeFilters?.(filters);
311
- }, [filters, onChangeFilters]);
312
-
313
- const debouncer = useRef<NodeJS.Timeout | undefined>(undefined);
314
-
315
- useEffect(() => {
316
- if (!hasSearchSubmitButton) {
317
- if (debouncer.current) {
318
- clearTimeout(debouncer.current);
319
- }
320
-
321
- debouncer.current = setTimeout(() => {
322
- onChangeSearch?.(searchValue ?? "");
323
- }, searchDelayTime);
324
- }
325
- }, [onChangeSearch, searchValue, searchDelayTime, hasSearchSubmitButton]);
326
-
327
- const autocompleteOptions = useMemo(() => {
328
- return filterPopoverCurrentFilter?.options || [];
329
- }, [filterPopoverCurrentFilter]);
330
-
331
- const updateInputValue = useCallback<UpdateFiltersOrValues>(
332
- ({ filterId, value }) => {
333
- setInputValues({ ...inputValues, [filterId]: value });
334
- },
335
- [inputValues],
336
- );
337
-
338
- const updateFilters = useCallback<UpdateFiltersOrValues>(
339
- ({ filterId, value }) => {
340
- setInputValues((prevInputValues) => ({
341
- ...prevInputValues,
342
- [filterId]: value,
343
- }));
344
- const updatedFilters = filtersProp.map((filter) => ({
345
- ...filter,
346
- value: filter.id === filterId ? value : inputValues[filter.id],
347
- }));
348
- setFilters(updatedFilters);
349
- },
350
- [inputValues, filtersProp],
351
- );
352
-
353
- const updateFilterAndInputValues = useCallback<UpdateFiltersOrValues>(
354
- ({ filterId, value }) => {
355
- updateInputValue({ filterId, value });
356
- updateFilters({ filterId, value });
357
- },
358
- [updateFilters, updateInputValue],
359
- );
360
-
361
- const handleCheckboxFilterAndInputValueChange = useCallback<
362
- (filterId: string, option: Option, checked: boolean) => void
363
- >(
364
- (filterId, option, checked) => {
365
- const currentValues = (inputValues[filterId] as Option[]) || [];
366
-
367
- const updatedValues = checked
368
- ? [...currentValues, option]
369
- : currentValues.filter(
370
- (inputValue) => inputValue.value !== option.value,
371
- );
372
-
373
- const normalizedUpdatedValues =
374
- updatedValues.length > 0 ? updatedValues : undefined;
375
-
376
- setInputValues({
377
- ...inputValues,
378
- [filterId]: normalizedUpdatedValues,
379
- });
380
-
381
- const updatedFilters = filters.map((filter) => ({
382
- ...filter,
383
- value:
384
- filter.id === filterId
385
- ? normalizedUpdatedValues
386
- : inputValues[filter.id],
387
- }));
388
-
389
- setFilters(updatedFilters);
390
- },
391
- [filters, inputValues],
392
- );
393
-
394
- const handleAutocompleteFilterChange = useCallback<
395
- (filterId: string, option: Option[]) => void
396
- >(
397
- (filterId, option) => {
398
- setInputValues({ ...inputValues, [filterId]: option });
399
- },
400
- [inputValues],
401
- );
402
-
403
- const clearAllFilters = useCallback(() => {
404
- const updatedInputValues = filtersProp.reduce(
405
- (accumulator, filter) => {
406
- accumulator[filter.id] = undefined;
407
- return accumulator;
408
- },
409
- {} as Record<string, DataFilterValue>,
410
- );
411
-
412
- setInputValues(updatedInputValues);
413
-
414
- const updatedFilters = filtersProp.map((filter) => ({
415
- ...filter,
416
- value: undefined,
417
- }));
418
-
419
- setFilters(updatedFilters);
420
- }, [filtersProp]);
421
-
422
- const handleFilterSubmit = useCallback(() => {
423
- const updatedFilters = filtersProp.map((filter) => ({
424
- ...filter,
425
- value: inputValues[filter.id],
426
- }));
427
-
428
- setFilters(updatedFilters);
429
- }, [inputValues, filtersProp]);
430
-
431
- const filterMenu = useMemo(
432
- () => (
433
- <>
434
- <Box>
435
- <Button
436
- ariaControls={isFiltersMenuOpen ? "filters-menu" : undefined}
437
- ariaExpanded={isFiltersMenuOpen ? "true" : undefined}
438
- ariaHasPopup="true"
439
- ariaLabel={t("filters.filters.arialabel")}
440
- isDisabled={isDisabled}
441
- endIcon={<FilterIcon />}
442
- onClick={(event) => {
443
- setFiltersMenuAnchorElement(event.currentTarget);
444
- setIsFiltersMenuOpen(true);
445
- }}
446
- variant="secondary"
447
- />
448
- </Box>
449
-
450
- <MuiMenu
451
- anchorOrigin={{ horizontal: "left", vertical: "bottom" }}
452
- transformOrigin={{ horizontal: "left", vertical: "top" }}
453
- id="filters-menu"
454
- anchorEl={filtersMenuAnchorElement}
455
- onClose={() => setIsFiltersMenuOpen(false)}
456
- open={isFiltersMenuOpen}
457
- PaperProps={{
458
- ref: menuRef as MutableRefObject<HTMLDivElement>,
459
- }}
460
- >
461
- {filtersProp.map((filter) => {
462
- // Unintuitively, we can't just use filter.value to grab the filter value.
463
- // `filter` is the initial set of filters provided to the comoponent, so its
464
- // value prop may not reflect the current value of the filter.
465
- const latestFilterValue = filters.find(
466
- (f) => f.id === filter.id,
467
- )?.value;
468
-
469
- return (
470
- <MuiMenuItem
471
- key={filter.id}
472
- aria-controls={isFilterPopoverOpen ? "filter-form" : undefined}
473
- onClick={(event) => {
474
- setIsFilterPopoverOpen(true);
475
- setFilterPopoverAnchorElement(event.currentTarget);
476
- setFilterPopoverCurrentFilter(filter);
477
- }}
478
- selected={
479
- filterPopoverCurrentFilter === filter &&
480
- isFilterPopoverOpen === true
481
- }
482
- className={
483
- filterPopoverCurrentFilter === filter &&
484
- isFilterPopoverOpen === true
485
- ? "isVisiblySelected"
486
- : undefined
487
- }
488
- >
489
- <Box
490
- sx={{
491
- display: "flex",
492
- alignItems: "center",
493
- justifyContent: "space-between",
494
- width: "100%",
495
- minWidth: 180,
496
- paddingBlock: 1,
497
- paddingInlineStart: 2,
498
- }}
499
- >
500
- <Box sx={{ marginRight: 2 }}>
501
- <MuiTypography fontWeight="500" sx={{ marginBlockEnd: 2 }}>
502
- {filter.label}
503
- </MuiTypography>
504
- <Subordinate component="div">
505
- {!latestFilterValue ||
506
- (Array.isArray(latestFilterValue) &&
507
- latestFilterValue.length === 0) ? (
508
- <Trans
509
- i18nKey="filters.menuitem.any"
510
- values={{
511
- label: filter.label.toLowerCase(),
512
- }}
513
- />
514
- ) : Array.isArray(latestFilterValue) ? (
515
- <Trans
516
- count={latestFilterValue.length}
517
- i18nKey="filters.menuitem.selected"
518
- values={{
519
- selected: latestFilterValue.length,
520
- }}
521
- />
522
- ) : (
523
- latestFilterValue
524
- )}
525
- </Subordinate>
526
- </Box>
527
- <ChevronRightIcon />
528
- </Box>
529
- </MuiMenuItem>
530
- );
531
- })}
532
- </MuiMenu>
533
- </>
534
- ),
535
- [
536
- isFiltersMenuOpen,
537
- isDisabled,
538
- filterPopoverCurrentFilter,
539
- isFilterPopoverOpen,
540
- filtersMenuAnchorElement,
541
- filtersProp,
542
- filters,
543
- t,
544
- ],
545
- );
546
-
547
- const autoCompleteValue = useMemo(
548
- () =>
549
- filterPopoverCurrentFilter?.id
550
- ? (inputValues[filterPopoverCurrentFilter.id] as Option[])
551
- : undefined,
552
- [filterPopoverCurrentFilter, inputValues],
553
- );
554
-
555
- return (
556
- <Box>
557
- {/* Upper section */}
558
- <Box sx={{ display: "flex", justifyContent: "space-between" }}>
559
- {/* Upper section left (filters and search) */}
560
- <Box sx={{ display: "flex", gap: 2, width: "50%", maxWidth: 480 }}>
561
- {/* Filter menu */}
562
- {filters.length > 0 && (
563
- <>
564
- {filterMenu}
565
- {/* Filter popover */}
566
- <MuiPopover
567
- id="filter-form"
568
- anchorEl={filterPopoverAnchorElement}
569
- // Positions the popover flush with the edge of the parent menu
570
- // and at the right shadow elevation. These magic values are simply
571
- // to match the default popover offset.
572
- elevation={2}
573
- sx={{ marginLeft: 2, marginTop: -1 }}
574
- open={isFilterPopoverOpen}
575
- anchorOrigin={{ vertical: "top", horizontal: "right" }}
576
- onClose={(ev: MouseEvent) => {
577
- if (menuRef.current) {
578
- const menuRect = menuRef.current.getBoundingClientRect();
579
- const clickInsideMenu =
580
- ev.clientX >= menuRect.left &&
581
- ev.clientX <= menuRect.right &&
582
- ev.clientY >= menuRect.top &&
583
- ev.clientY <= menuRect.bottom;
584
-
585
- if (!clickInsideMenu) {
586
- setIsFiltersMenuOpen(false);
587
- }
588
- }
589
- handleFilterSubmit();
590
- setIsFilterPopoverOpen(false);
591
- }}
592
- >
593
- <Box sx={{ padding: 4, minWidth: 320 }}>
594
- <form
595
- onSubmit={(ev) => {
596
- ev.preventDefault();
597
- handleFilterSubmit();
598
- setIsFilterPopoverOpen(false);
599
- setIsFiltersMenuOpen(false);
600
- }}
601
- noValidate
602
- >
603
- {filterPopoverCurrentFilter?.render ? (
604
- filterPopoverCurrentFilter.render(updateFilters)
605
- ) : (
606
- <>
607
- {/* Autocomplete */}
608
- {filterPopoverCurrentFilter?.variant ===
609
- "autocomplete" &&
610
- filterPopoverCurrentFilter?.options && (
611
- <AutocompleteOuterContainer
612
- odysseyDesignTokens={odysseyDesignTokens}
613
- >
614
- <AutocompleteInnerContainer>
615
- <Autocomplete
616
- hasMultipleChoices
617
- isCustomValueAllowed={
618
- filterPopoverCurrentFilter?.isCustomValueAllowed
619
- }
620
- label={filterPopoverCurrentFilter.label}
621
- value={autoCompleteValue}
622
- onChange={(_, value) => {
623
- handleAutocompleteFilterChange(
624
- filterPopoverCurrentFilter.id,
625
- value as Option[],
626
- );
627
- }}
628
- options={autocompleteOptions}
629
- />
630
- </AutocompleteInnerContainer>
631
- <Button
632
- variant="primary"
633
- endIcon={<CheckIcon />}
634
- type="submit"
635
- ariaLabel={t("filters.submit.label")}
636
- />
637
- </AutocompleteOuterContainer>
638
- )}
639
- {/* Text, Number, or undefined */}
640
- {(filterPopoverCurrentFilter?.variant === "text" ||
641
- filterPopoverCurrentFilter?.variant === "range" ||
642
- (filterPopoverCurrentFilter &&
643
- filterPopoverCurrentFilter?.variant ==
644
- undefined)) && (
645
- <Box
646
- sx={{
647
- display: "flex",
648
- gap: 2,
649
- alignItems: "flex-end",
650
- }}
651
- >
652
- <Box sx={{ width: "100%" }}>
653
- <TextField
654
- hasInitialFocus
655
- label={filterPopoverCurrentFilter.label}
656
- type={
657
- filterPopoverCurrentFilter.variant === "range"
658
- ? "number"
659
- : "text"
660
- }
661
- value={
662
- (inputValues[
663
- filterPopoverCurrentFilter.id
664
- ] as string) ?? ""
665
- }
666
- onChange={(ev) =>
667
- updateInputValue({
668
- filterId: filterPopoverCurrentFilter.id,
669
- value: ev.currentTarget.value,
670
- })
671
- }
672
- endAdornment={
673
- inputValues[
674
- filterPopoverCurrentFilter.id
675
- ] && (
676
- <MuiIconButton
677
- size="small"
678
- aria-label={t("filters.filter.clear")}
679
- onClick={() => {
680
- updateInputValue({
681
- filterId:
682
- filterPopoverCurrentFilter.id,
683
- value: undefined,
684
- });
685
-
686
- updateFilters({
687
- filterId:
688
- filterPopoverCurrentFilter.id,
689
- value: undefined,
690
- });
691
- }}
692
- >
693
- <CloseCircleFilledIcon />
694
- </MuiIconButton>
695
- )
696
- }
697
- />
698
- </Box>
699
- <Button
700
- variant="primary"
701
- endIcon={<CheckIcon />}
702
- type="submit"
703
- ariaLabel={t("filters.submit.label")}
704
- />
705
- </Box>
706
- )}
707
-
708
- {/* Checkbox */}
709
- {filterPopoverCurrentFilter?.variant ===
710
- "multi-select" &&
711
- filterPopoverCurrentFilter?.options && (
712
- <CheckboxGroup
713
- label={filterPopoverCurrentFilter.label}
714
- isRequired
715
- >
716
- {filterPopoverCurrentFilter.options.map(
717
- (option: { label: string; value: string }) => {
718
- const checkFilterInputValuesAsArray =
719
- (inputValues[
720
- filterPopoverCurrentFilter.id
721
- ] as Option[]) || [];
722
- const isOptionValueInInputValues =
723
- checkFilterInputValuesAsArray.some(
724
- (inputValue) =>
725
- inputValue.value === option.value,
726
- );
727
- return (
728
- <Checkbox
729
- key={option.value}
730
- label={option.label}
731
- value={option.value}
732
- isChecked={isOptionValueInInputValues}
733
- onChange={(_, checked) => {
734
- handleCheckboxFilterAndInputValueChange(
735
- filterPopoverCurrentFilter.id,
736
- option,
737
- checked,
738
- );
739
- }}
740
- />
741
- );
742
- },
743
- )}
744
- </CheckboxGroup>
745
- )}
746
-
747
- {/* Radio */}
748
- {filterPopoverCurrentFilter?.variant === "select" &&
749
- filterPopoverCurrentFilter?.options && (
750
- <RadioGroup
751
- label={filterPopoverCurrentFilter.label}
752
- onChange={(_, value) => {
753
- updateFilterAndInputValues({
754
- filterId: filterPopoverCurrentFilter.id,
755
- value,
756
- });
757
- }}
758
- >
759
- <Radio
760
- label={t("filters.filter.any")}
761
- value={""}
762
- isChecked={
763
- !inputValues[filterPopoverCurrentFilter.id]
764
- }
765
- />
766
- <>
767
- {filterPopoverCurrentFilter.options.map(
768
- (option: {
769
- label: string;
770
- value: string;
771
- }) => (
772
- <Radio
773
- key={option.value}
774
- label={option.label}
775
- value={option.value}
776
- isChecked={
777
- inputValues[
778
- filterPopoverCurrentFilter.id
779
- ] === option.value
780
- }
781
- />
782
- ),
783
- )}
784
- </>
785
- </RadioGroup>
786
- )}
787
- </>
788
- )}
789
- </form>
790
- </Box>
791
- </MuiPopover>
792
- </>
793
- )}
794
-
795
- {/* Search */}
796
- {onChangeSearch && (
797
- <form
798
- style={{ width: "100%" }}
799
- onSubmit={(event) => {
800
- event.preventDefault();
801
- if (hasSearchSubmitButton) {
802
- onChangeSearch(searchValue);
803
- }
804
- }}
805
- >
806
- <Box sx={{ display: "flex", gap: 2, width: "100%" }}>
807
- <SearchField
808
- value={searchValue}
809
- label={t("filters.search.label")}
810
- placeholder={t("filters.search.label")}
811
- isDisabled={isDisabled}
812
- onClear={() => {
813
- setSearchValue("");
814
- onChangeSearch("");
815
- }}
816
- onChange={(ev) => setSearchValue(ev.target.value)}
817
- />
818
- {hasSearchSubmitButton && (
819
- <Box>
820
- <Button
821
- variant="primary"
822
- label={t("filters.search.label")}
823
- onClick={() => onChangeSearch(searchValue)}
824
- />
825
- </Box>
826
- )}
827
- </Box>
828
- </form>
829
- )}
830
- </Box>
831
-
832
- {/* Upper section right (clear filters & additional actions) */}
833
- <Box sx={{ display: "flex", gap: 2 }}>
834
- {activeFilters.length > 0 && (
835
- <Box>
836
- <Button
837
- variant="secondary"
838
- label={t("filters.clear.label")}
839
- onClick={clearAllFilters}
840
- />
841
- </Box>
842
- )}
843
- {additionalActions}
844
- </Box>
845
- </Box>
846
-
847
- {/* Lower section */}
848
- {activeFilters.length > 0 && (
849
- <Box
850
- sx={{
851
- borderTopWidth: 1,
852
- borderTopColor: "#eeeeee",
853
- borderTopStyle: "solid",
854
- paddingTop: 4,
855
- marginTop: 4,
856
- }}
857
- >
858
- <MemoizedFilterTags
859
- activeFilters={activeFilters}
860
- updateFilterAndInputValues={updateFilterAndInputValues}
861
- />
862
- </Box>
863
- )}
864
- </Box>
865
- );
866
- };
867
-
868
- const MemoizedDataFilters = memo(DataFilters);
869
- MemoizedDataFilters.displayName = "DataFilters";
870
-
871
- export { MemoizedDataFilters as DataFilters };