@variocube/app-ui 1.14.5 → 1.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (323) hide show
  1. package/esm/AppShell/AppShell.js +12 -12
  2. package/esm/AppShell/AppShell.js.map +1 -1
  3. package/esm/AppShell/index.js.map +1 -1
  4. package/esm/Input/ActionsMenu.js +1 -1
  5. package/esm/Input/ActionsMenu.js.map +1 -1
  6. package/esm/Input/EmailSenderField.js +3 -3
  7. package/esm/Input/EmailSenderField.js.map +1 -1
  8. package/esm/Input/Selector.js +2 -2
  9. package/esm/Input/Selector.js.map +1 -1
  10. package/esm/Paging/Paging.d.ts +1 -1
  11. package/esm/Paging/Paging.js +5 -5
  12. package/esm/Paging/Paging.js.map +1 -1
  13. package/esm/Paging/index.d.ts +2 -1
  14. package/esm/Paging/index.js.map +1 -1
  15. package/esm/VCThemeProvider/JetbrainsMonoFont.js +8 -8
  16. package/esm/VCThemeProvider/JetbrainsMonoFont.js.map +1 -1
  17. package/esm/VCThemeProvider/RobotoFont.js +8 -8
  18. package/esm/VCThemeProvider/RobotoFont.js.map +1 -1
  19. package/esm/VCThemeProvider/ThemeModeSwitcher.js +5 -5
  20. package/esm/VCThemeProvider/ThemeModeSwitcher.js.map +1 -1
  21. package/esm/VCThemeProvider/VCThemeProvider.d.ts +1 -1
  22. package/esm/VCThemeProvider/VCThemeProvider.js +21 -21
  23. package/esm/VCThemeProvider/VCThemeProvider.js.map +1 -1
  24. package/esm/audit/AuditChanges.js +9 -5
  25. package/esm/audit/AuditChanges.js.map +1 -1
  26. package/esm/audit/AuditTimeline.js +1 -1
  27. package/esm/audit/AuditTimeline.js.map +1 -1
  28. package/esm/audit/AuditTimelineItem.js +3 -3
  29. package/esm/audit/AuditTimelineItem.js.map +1 -1
  30. package/esm/audit/index.d.ts +1 -1
  31. package/esm/audit/index.js +1 -1
  32. package/esm/audit/index.js.map +1 -1
  33. package/esm/breadcrumbs.d.ts +2 -2
  34. package/esm/breadcrumbs.js +3 -3
  35. package/esm/breadcrumbs.js.map +1 -1
  36. package/esm/code/CodeBlock.d.ts +1 -1
  37. package/esm/code/CodeBlock.js +1 -1
  38. package/esm/code/CodeBlock.js.map +1 -1
  39. package/esm/confirm/ConfirmButton.js.map +1 -1
  40. package/esm/confirm/ConfirmDialog.js +1 -1
  41. package/esm/confirm/ConfirmDialog.js.map +1 -1
  42. package/esm/confirm/ConfirmMenuItem.js +1 -1
  43. package/esm/confirm/ConfirmMenuItem.js.map +1 -1
  44. package/esm/container/ContainerLayout.d.ts +1 -1
  45. package/esm/container/ContainerLayout.js +5 -5
  46. package/esm/container/ContainerLayout.js.map +1 -1
  47. package/esm/container/ContainerSettingsContext.d.ts +2 -2
  48. package/esm/container/ContainerSettingsContext.js +6 -6
  49. package/esm/container/ContainerSettingsContext.js.map +1 -1
  50. package/esm/container/ContainerWidthControl.js +2 -2
  51. package/esm/container/ContainerWidthControl.js.map +1 -1
  52. package/esm/container/index.d.ts +1 -1
  53. package/esm/container/index.js +1 -1
  54. package/esm/container/index.js.map +1 -1
  55. package/esm/content-table/ContentTable.d.ts +1 -1
  56. package/esm/content-table/ContentTable.js +26 -19
  57. package/esm/content-table/ContentTable.js.map +1 -1
  58. package/esm/content-table/UndrawEmpty.js.map +1 -1
  59. package/esm/content-table/index.js.map +1 -1
  60. package/esm/country/country-select.js.map +1 -1
  61. package/esm/country/index.d.ts +3 -3
  62. package/esm/country/index.js +3 -3
  63. package/esm/country/index.js.map +1 -1
  64. package/esm/country/locale-select.js +1 -1
  65. package/esm/country/locale-select.js.map +1 -1
  66. package/esm/country/locales.js +1 -1
  67. package/esm/country/locales.js.map +1 -1
  68. package/esm/country/phone-prefix-select.js +1 -1
  69. package/esm/country/phone-prefix-select.js.map +1 -1
  70. package/esm/cube/accessibility.js +2 -1
  71. package/esm/cube/accessibility.js.map +1 -1
  72. package/esm/data-table/DataTableColumnSettings.d.ts +1 -1
  73. package/esm/data-table/DataTableColumnSettings.js +2 -2
  74. package/esm/data-table/DataTableColumnSettings.js.map +1 -1
  75. package/esm/data-table/DataTableHeader.js +1 -1
  76. package/esm/data-table/DataTableHeader.js.map +1 -1
  77. package/esm/data-table/DataTableToolbar.js +1 -1
  78. package/esm/data-table/DataTableToolbar.js.map +1 -1
  79. package/esm/data-table/index.d.ts +4 -4
  80. package/esm/data-table/index.js +4 -4
  81. package/esm/data-table/index.js.map +1 -1
  82. package/esm/data-table/useDataTableColumnStorage.d.ts +9 -1
  83. package/esm/data-table/useDataTableColumnStorage.js +12 -5
  84. package/esm/data-table/useDataTableColumnStorage.js.map +1 -1
  85. package/esm/data-table/useDataTableStorage.d.ts +31 -6
  86. package/esm/data-table/useDataTableStorage.js +25 -5
  87. package/esm/data-table/useDataTableStorage.js.map +1 -1
  88. package/esm/date-pickers/PlainAdapterCommon.d.ts +1 -1
  89. package/esm/date-pickers/PlainAdapterCommon.js.map +1 -1
  90. package/esm/date-pickers/PlainDateAdapter.js.map +1 -1
  91. package/esm/date-pickers/PlainDatePicker.js +1 -1
  92. package/esm/date-pickers/PlainDatePicker.js.map +1 -1
  93. package/esm/date-pickers/PlainDatePicker.spec.js +2 -2
  94. package/esm/date-pickers/PlainDatePicker.spec.js.map +1 -1
  95. package/esm/date-pickers/PlainDateTimeAdapter.js.map +1 -1
  96. package/esm/date-pickers/PlainDateTimePicker.js +2 -2
  97. package/esm/date-pickers/PlainDateTimePicker.js.map +1 -1
  98. package/esm/date-pickers/PlainDateTimePicker.spec.js +2 -2
  99. package/esm/date-pickers/PlainDateTimePicker.spec.js.map +1 -1
  100. package/esm/date-pickers/PlainTimeAdapter.js.map +1 -1
  101. package/esm/date-pickers/PlainTimePicker.js +2 -2
  102. package/esm/date-pickers/PlainTimePicker.js.map +1 -1
  103. package/esm/date-pickers/PlainTimePicker.spec.js +2 -2
  104. package/esm/date-pickers/PlainTimePicker.spec.js.map +1 -1
  105. package/esm/date-pickers/TemporalAdapter.d.ts +1 -1
  106. package/esm/date-pickers/TemporalAdapter.js +1 -1
  107. package/esm/date-pickers/TemporalAdapter.js.map +1 -1
  108. package/esm/date-pickers/TimezoneSelect.js +348 -348
  109. package/esm/date-pickers/TimezoneSelect.js.map +1 -1
  110. package/esm/date-pickers/getFormatString.js.map +1 -1
  111. package/esm/date-pickers/index.d.ts +2 -1
  112. package/esm/date-pickers/index.js +1 -1
  113. package/esm/date-pickers/index.js.map +1 -1
  114. package/esm/date-pickers/parse.js.map +1 -1
  115. package/esm/date-pickers/timeframe-picker.js +7 -7
  116. package/esm/date-pickers/timeframe-picker.js.map +1 -1
  117. package/esm/date-pickers/useLocale.js.map +1 -1
  118. package/esm/date-pickers/useRenderInput.js +5 -3
  119. package/esm/date-pickers/useRenderInput.js.map +1 -1
  120. package/esm/fetch.d.ts +2 -3
  121. package/esm/fetch.js +4 -4
  122. package/esm/fetch.js.map +1 -1
  123. package/esm/formats/CompactFormat.js +1 -1
  124. package/esm/formats/CompactFormat.js.map +1 -1
  125. package/esm/formats/CompactFormat.spec.js +1 -1
  126. package/esm/formats/CompactFormat.spec.js.map +1 -1
  127. package/esm/formats/CurrencyFormat.js +1 -1
  128. package/esm/formats/CurrencyFormat.js.map +1 -1
  129. package/esm/formats/CurrencyFormat.spec.js +1 -1
  130. package/esm/formats/CurrencyFormat.spec.js.map +1 -1
  131. package/esm/formats/DecimalFormat.js +1 -1
  132. package/esm/formats/DecimalFormat.js.map +1 -1
  133. package/esm/formats/DecimalFormat.spec.js +1 -1
  134. package/esm/formats/DecimalFormat.spec.js.map +1 -1
  135. package/esm/formats/DurationFormat.js +2 -2
  136. package/esm/formats/DurationFormat.js.map +1 -1
  137. package/esm/formats/DurationFormat.spec.js +2 -2
  138. package/esm/formats/DurationFormat.spec.js.map +1 -1
  139. package/esm/formats/TemporalFormat.spec.js +2 -2
  140. package/esm/formats/TemporalFormat.spec.js.map +1 -1
  141. package/esm/formats/TemporalRangeFormat.js +1 -1
  142. package/esm/formats/TemporalRangeFormat.js.map +1 -1
  143. package/esm/formats/TemporalRangeFormat.spec.js +2 -2
  144. package/esm/formats/TemporalRangeFormat.spec.js.map +1 -1
  145. package/esm/formats/useDateTimeFormat.js +5 -2
  146. package/esm/formats/useDateTimeFormat.js.map +1 -1
  147. package/esm/formats/useNumberFormat.js +1 -1
  148. package/esm/formats/useNumberFormat.js.map +1 -1
  149. package/esm/formats/useRelativeTimeFormat.js +4 -2
  150. package/esm/formats/useRelativeTimeFormat.js.map +1 -1
  151. package/esm/forms/SearchForm.js +1 -1
  152. package/esm/forms/SearchForm.js.map +1 -1
  153. package/esm/getNavigatorLanguages.js.map +1 -1
  154. package/esm/getSupportedFormatLocale.js.map +1 -1
  155. package/esm/help/HelpDrawer.js +12 -8
  156. package/esm/help/HelpDrawer.js.map +1 -1
  157. package/esm/help/index.d.ts +1 -1
  158. package/esm/help/index.js +1 -1
  159. package/esm/help/index.js.map +1 -1
  160. package/esm/icons.d.ts +13 -13
  161. package/esm/icons.js +13 -13
  162. package/esm/icons.js.map +1 -1
  163. package/esm/layout/ErrorBoundary.js +36 -36
  164. package/esm/layout/ErrorBoundary.js.map +1 -1
  165. package/esm/layout/NotFound.js +6 -6
  166. package/esm/layout/NotFound.js.map +1 -1
  167. package/esm/layout/NotFoundSvg.js.map +1 -1
  168. package/esm/layout/UserNav.js +18 -18
  169. package/esm/layout/UserNav.js.map +1 -1
  170. package/esm/layout/index.d.ts +2 -2
  171. package/esm/layout/index.js +2 -2
  172. package/esm/layout/index.js.map +1 -1
  173. package/esm/logo/Logo.js +2 -2
  174. package/esm/logo/Logo.js.map +1 -1
  175. package/esm/logo/VCAppLogo.js +1 -1
  176. package/esm/logo/VCAppLogo.js.map +1 -1
  177. package/esm/logo/index.d.ts +3 -3
  178. package/esm/logo/index.js +3 -3
  179. package/esm/logo/index.js.map +1 -1
  180. package/esm/splash/index.js +2 -2
  181. package/esm/splash/index.js.map +1 -1
  182. package/esm/storage/MemoryStorage.d.ts +6 -4
  183. package/esm/storage/MemoryStorage.js +13 -4
  184. package/esm/storage/MemoryStorage.js.map +1 -1
  185. package/esm/storage/index.d.ts +2 -1
  186. package/esm/storage/index.js +1 -1
  187. package/esm/storage/index.js.map +1 -1
  188. package/esm/storage/storage.d.ts +6 -4
  189. package/esm/storage/storage.js +35 -15
  190. package/esm/storage/storage.js.map +1 -1
  191. package/esm/storage/types.d.ts +6 -0
  192. package/esm/storage/types.js +2 -0
  193. package/esm/storage/types.js.map +1 -0
  194. package/esm/storage/useStorage.d.ts +10 -1
  195. package/esm/storage/useStorage.js +18 -6
  196. package/esm/storage/useStorage.js.map +1 -1
  197. package/esm/tabs/Tabs.d.ts +2 -2
  198. package/esm/tabs/Tabs.js +15 -15
  199. package/esm/tabs/Tabs.js.map +1 -1
  200. package/esm/tabs/index.js.map +1 -1
  201. package/esm/temporal/index.d.ts +1 -1
  202. package/esm/temporal/index.js +1 -1
  203. package/esm/temporal/index.js.map +1 -1
  204. package/esm/temporal/parse.js.map +1 -1
  205. package/esm/temporal/polyfill.d.ts +1 -1
  206. package/esm/temporal/polyfill.js +3 -3
  207. package/esm/temporal/polyfill.js.map +1 -1
  208. package/esm/utils/defined.js.map +1 -1
  209. package/esm/utils/index.d.ts +1 -1
  210. package/esm/utils/index.js +1 -1
  211. package/esm/utils/index.js.map +1 -1
  212. package/esm/utils/useFlag.js.map +1 -1
  213. package/esm/utils/useIsMounted.js.map +1 -1
  214. package/package.json +8 -9
  215. package/src/AppShell/AppShell.tsx +147 -140
  216. package/src/AppShell/index.tsx +1 -1
  217. package/src/Input/ActionsMenu.tsx +70 -73
  218. package/src/Input/EmailSenderField.tsx +59 -52
  219. package/src/Input/Selector.tsx +15 -15
  220. package/src/LanguageSwitcher/index.ts +1 -1
  221. package/src/Paging/Paging.ts +56 -57
  222. package/src/Paging/index.ts +2 -1
  223. package/src/VCThemeProvider/JetbrainsMonoFont.tsx +52 -42
  224. package/src/VCThemeProvider/RobotoFont.tsx +47 -39
  225. package/src/VCThemeProvider/ThemeModeSwitcher.tsx +17 -17
  226. package/src/VCThemeProvider/VCThemeProvider.tsx +149 -145
  227. package/src/audit/AuditChanges.tsx +18 -12
  228. package/src/audit/AuditTimeline.tsx +16 -17
  229. package/src/audit/AuditTimelineItem.tsx +58 -61
  230. package/src/audit/index.ts +2 -2
  231. package/src/audit/types.ts +27 -28
  232. package/src/breadcrumbs.tsx +11 -15
  233. package/src/code/CodeBlock.tsx +10 -10
  234. package/src/confirm/ConfirmButton.tsx +56 -56
  235. package/src/confirm/ConfirmDialog.tsx +54 -54
  236. package/src/confirm/ConfirmMenuItem.tsx +51 -53
  237. package/src/container/ContainerLayout.tsx +7 -8
  238. package/src/container/ContainerSettingsContext.tsx +49 -46
  239. package/src/container/ContainerWidthControl.tsx +11 -9
  240. package/src/container/index.ts +8 -3
  241. package/src/content-table/ContentTable.tsx +235 -197
  242. package/src/content-table/UndrawEmpty.tsx +281 -281
  243. package/src/content-table/index.ts +1 -1
  244. package/src/country/country-select.tsx +0 -1
  245. package/src/country/index.ts +3 -3
  246. package/src/country/locale-select.tsx +36 -36
  247. package/src/country/locales.ts +185 -187
  248. package/src/country/phone-prefix-select.tsx +4 -5
  249. package/src/cube/accessibility.tsx +2 -1
  250. package/src/data-table/DataTableColumnSettings.tsx +181 -181
  251. package/src/data-table/DataTableHeader.tsx +6 -6
  252. package/src/data-table/DataTableToolbar.tsx +6 -6
  253. package/src/data-table/index.tsx +4 -4
  254. package/src/data-table/useDataTableColumnStorage.ts +30 -19
  255. package/src/data-table/useDataTableStorage.spec.ts +108 -0
  256. package/src/data-table/useDataTableStorage.ts +91 -36
  257. package/src/date-pickers/PlainAdapterCommon.ts +118 -120
  258. package/src/date-pickers/PlainDateAdapter.spec.ts +44 -46
  259. package/src/date-pickers/PlainDateAdapter.ts +130 -132
  260. package/src/date-pickers/PlainDatePicker.spec.tsx +17 -18
  261. package/src/date-pickers/PlainDatePicker.tsx +33 -36
  262. package/src/date-pickers/PlainDateTimeAdapter.spec.ts +44 -46
  263. package/src/date-pickers/PlainDateTimeAdapter.ts +141 -134
  264. package/src/date-pickers/PlainDateTimePicker.spec.tsx +17 -18
  265. package/src/date-pickers/PlainDateTimePicker.tsx +35 -36
  266. package/src/date-pickers/PlainTimeAdapter.ts +219 -221
  267. package/src/date-pickers/PlainTimePicker.spec.tsx +17 -18
  268. package/src/date-pickers/PlainTimePicker.tsx +35 -34
  269. package/src/date-pickers/TemporalAdapter.ts +110 -111
  270. package/src/date-pickers/TimezoneSelect.tsx +375 -375
  271. package/src/date-pickers/getFormatString.ts +29 -29
  272. package/src/date-pickers/index.ts +6 -5
  273. package/src/date-pickers/parse.spec.ts +37 -40
  274. package/src/date-pickers/parse.ts +44 -47
  275. package/src/date-pickers/timeframe-picker.tsx +16 -17
  276. package/src/date-pickers/useLocale.ts +1 -1
  277. package/src/date-pickers/useRenderInput.tsx +24 -15
  278. package/src/fetch.ts +4 -5
  279. package/src/formats/CompactFormat.spec.tsx +18 -20
  280. package/src/formats/CompactFormat.tsx +30 -30
  281. package/src/formats/CurrencyFormat.spec.tsx +18 -20
  282. package/src/formats/CurrencyFormat.tsx +52 -52
  283. package/src/formats/DecimalFormat.spec.tsx +18 -20
  284. package/src/formats/DecimalFormat.tsx +47 -47
  285. package/src/formats/DurationFormat.spec.tsx +48 -49
  286. package/src/formats/DurationFormat.tsx +51 -51
  287. package/src/formats/TemporalFormat.spec.tsx +93 -95
  288. package/src/formats/TemporalRangeFormat.spec.tsx +143 -144
  289. package/src/formats/TemporalRangeFormat.tsx +54 -54
  290. package/src/formats/types.ts +1 -3
  291. package/src/formats/useDateTimeFormat.ts +5 -2
  292. package/src/formats/useNumberFormat.ts +3 -3
  293. package/src/formats/useRelativeTimeFormat.ts +5 -3
  294. package/src/forms/SearchForm.tsx +37 -38
  295. package/src/getNavigatorLanguages.ts +4 -5
  296. package/src/getSupportedFormatLocale.ts +10 -10
  297. package/src/help/HelpDrawer.tsx +76 -55
  298. package/src/help/index.ts +3 -3
  299. package/src/icons.ts +21 -21
  300. package/src/layout/ErrorBoundary.tsx +226 -215
  301. package/src/layout/NotFound.tsx +36 -39
  302. package/src/layout/NotFoundSvg.tsx +193 -169
  303. package/src/layout/UserNav.tsx +98 -98
  304. package/src/layout/index.ts +3 -3
  305. package/src/logo/Logo.tsx +6 -7
  306. package/src/logo/VCAppLogo.tsx +22 -20
  307. package/src/logo/index.tsx +3 -3
  308. package/src/splash/index.tsx +25 -25
  309. package/src/storage/MemoryStorage.ts +22 -15
  310. package/src/storage/index.ts +2 -1
  311. package/src/storage/storage.spec.ts +184 -0
  312. package/src/storage/storage.ts +37 -15
  313. package/src/storage/types.ts +6 -0
  314. package/src/storage/useStorage.ts +21 -6
  315. package/src/tabs/Tabs.tsx +172 -170
  316. package/src/tabs/index.ts +1 -1
  317. package/src/temporal/index.ts +1 -1
  318. package/src/temporal/parse.ts +1 -2
  319. package/src/temporal/polyfill.ts +11 -11
  320. package/src/utils/defined.ts +2 -3
  321. package/src/utils/index.ts +1 -1
  322. package/src/utils/useFlag.ts +5 -5
  323. package/src/utils/useIsMounted.ts +9 -9
package/src/tabs/Tabs.tsx CHANGED
@@ -1,187 +1,189 @@
1
- import React, {Fragment, SyntheticEvent, useEffect, useRef, useState} from "react";
1
+ import MoreHorizIcon from "@mui/icons-material/MoreHoriz";
2
2
  import {IconButton, ListItemIcon, ListItemText, Menu, MenuItem, Stack} from "@mui/material";
3
- import MuiTabs, {TabsProps as MuiTabsProps} from "@mui/material/Tabs";
4
- import MoreHorizIcon from '@mui/icons-material/MoreHoriz';
5
3
  import MuiTab, {TabProps as MuiTabProps} from "@mui/material/Tab";
4
+ import MuiTabs, {TabsProps as MuiTabsProps} from "@mui/material/Tabs";
5
+ import React, {Fragment, SyntheticEvent, useEffect, useRef, useState} from "react";
6
6
 
7
7
  interface TabItem {
8
- index: number;
9
- width: number;
8
+ index: number;
9
+ width: number;
10
10
  }
11
11
 
12
12
  interface TabProps extends MuiTabProps<React.ElementType> {
13
13
  }
14
14
 
15
15
  interface TabsProps extends MuiTabsProps {
16
- items: TabProps [];
16
+ items: TabProps[];
17
17
  }
18
18
 
19
19
  const hiddenSx = {
20
- visibility: 'hidden',
21
- height: 0,
22
- maxHeight: 'unset',
23
- minHeight: 'unset',
24
- padding: 0
25
- }
20
+ visibility: "hidden",
21
+ height: 0,
22
+ maxHeight: "unset",
23
+ minHeight: "unset",
24
+ padding: 0,
25
+ };
26
26
 
27
27
  export function Tabs(props: TabsProps) {
28
- const {
29
- orientation = "horizontal",
30
- scrollButtons = "auto",
31
- allowScrollButtonsMobile = true,
32
- sx,
33
- onChange,
34
- items: inItems,
35
- value,
36
- ...rest
37
- } = props;
38
-
39
- const items = inItems.map((item, i) => ({
40
- ...item,
41
- value: typeof item.value == "undefined" ? i : item.value
42
- } as TabProps));
43
-
44
- const ref = useRef(null);
45
- const [dropdownEl, setDropdownEl] = useState<null|HTMLElement>(null);
46
-
47
- const [overflowIndex, setOverflowIndex] = useState<number>(items.length);
48
-
49
- const selectedIndex = items.findIndex((item) => item.value == value);
50
-
51
- function handleTabOverflow(root: Element, items: TabItem[]) {
52
- // clientWidth: what the user can see
53
- // scrollWidth: actual size of the DOM object
54
- const {clientWidth} = root;
55
-
56
- // this basically loop through each item size and adding up the width of all items
57
- // if the width exceed the clientWidth of the root node, item will be hidden from the horizontal tab display
58
- // else the item remains visible and its ref from the dropdown list will be hidden otherwise
59
- let overflowIndex = 0;
60
- let itemsWidth = 0;
61
- for (let i = 0; i < items.length; i++) {
62
- itemsWidth += items[i].width;
63
- if (itemsWidth < clientWidth) {
64
- overflowIndex++;
65
- }
66
- }
67
- setOverflowIndex(overflowIndex);
68
- }
69
-
70
- useEffect(() => {
71
- if (ref.current) {
72
- // fetch the root node of tabs
73
- const root = Array.from((ref.current as HTMLButtonElement).children).find(e => e.className.includes('tabRoot'));
74
- if (root) {
75
- // from the root node, traverse down to list node of tab items
76
- const list = Array.from(root.children).find(e => e.className.includes('tabList'));
77
- const items = list ? Array.from(list.children).map((e, index) => ({ index, width: e.clientWidth })) : [];
78
-
79
- // apply the resize observer to the root node and watch for the size changes
80
- const resizeObserver = new ResizeObserver(() => handleTabOverflow(root, items));
81
- resizeObserver.observe(root);
82
- return () => resizeObserver.disconnect();
83
- }
84
- }
85
- }, [ref])
86
-
87
- return (
88
- <Stack
89
- flex={1}
90
- direction="row"
91
- alignItems="center"
92
- sx={{
93
- borderBottom: 1,
94
- borderColor: "divider"
95
- }}
96
- >
97
- <MuiTabs
98
- ref={ref}
99
- orientation="horizontal"
100
- visibleScrollbar={false}
101
- scrollButtons={false}
102
- allowScrollButtonsMobile={false}
103
- sx={{
104
- ...sx,
105
- flex: 1,
106
- }}
107
- classes={{
108
- scroller: 'tabRoot',
109
- flexContainer: 'tabList'
110
- }}
111
- value={value}
112
- onChange={onChange}
113
- {...rest}
114
- >
115
- {items
116
- .map((tabProps, i) => (
117
- <MuiTab
118
- key={'muiTab-' + i}
119
- iconPosition="start"
120
- {...tabProps}
121
- sx={{
122
- ...tabProps.sx,
123
- ...(i >= overflowIndex ? {display: "none"} : undefined),
124
- minHeight: 48,
125
- }}
126
- />
127
- ))}
128
- </MuiTabs>
129
- {(overflowIndex < items.length) && (
130
- <Fragment>
131
- <IconButton
132
- sx={{
133
- ml: 1
134
- }}
135
- onClick={ev => setDropdownEl(ev.currentTarget)}
136
- color={selectedIndex >= overflowIndex ? "primary" : "default"}
137
- >
138
- <MoreHorizIcon fontSize="inherit" />
139
- </IconButton>
140
- <Menu
141
- anchorEl={dropdownEl}
142
- open={!!dropdownEl}
143
- onClose={() => setDropdownEl(null)}
144
- >
145
- {items
146
- .map((tabProps, i) => {
147
- const {
148
- label,
149
- icon,
150
- onClick,
151
- component,
152
- value: itemValue,
153
- ...rest
154
- } = tabProps;
155
-
156
- const selected = value == itemValue;
157
-
158
- function handleClick(ev: SyntheticEvent) {
28
+ const {
29
+ orientation = "horizontal",
30
+ scrollButtons = "auto",
31
+ allowScrollButtonsMobile = true,
32
+ sx,
33
+ onChange,
34
+ items: inItems,
35
+ value,
36
+ ...rest
37
+ } = props;
38
+
39
+ const items = inItems.map((item, i) => ({
40
+ ...item,
41
+ value: typeof item.value == "undefined" ? i : item.value,
42
+ } as TabProps));
43
+
44
+ const ref = useRef(null);
45
+ const [dropdownEl, setDropdownEl] = useState<null | HTMLElement>(null);
46
+
47
+ const [overflowIndex, setOverflowIndex] = useState<number>(items.length);
48
+
49
+ const selectedIndex = items.findIndex((item) => item.value == value);
50
+
51
+ function handleTabOverflow(root: Element, items: TabItem[]) {
52
+ // clientWidth: what the user can see
53
+ // scrollWidth: actual size of the DOM object
54
+ const {clientWidth} = root;
55
+
56
+ // this basically loop through each item size and adding up the width of all items
57
+ // if the width exceed the clientWidth of the root node, item will be hidden from the horizontal tab display
58
+ // else the item remains visible and its ref from the dropdown list will be hidden otherwise
59
+ let overflowIndex = 0;
60
+ let itemsWidth = 0;
61
+ for (let i = 0; i < items.length; i++) {
62
+ itemsWidth += items[i].width;
63
+ if (itemsWidth < clientWidth) {
64
+ overflowIndex++;
65
+ }
66
+ }
67
+ setOverflowIndex(overflowIndex);
68
+ }
69
+
70
+ useEffect(() => {
71
+ if (ref.current) {
72
+ // fetch the root node of tabs
73
+ const root = Array.from((ref.current as HTMLButtonElement).children).find(e =>
74
+ e.className.includes("tabRoot")
75
+ );
76
+ if (root) {
77
+ // from the root node, traverse down to list node of tab items
78
+ const list = Array.from(root.children).find(e => e.className.includes("tabList"));
79
+ const items = list ? Array.from(list.children).map((e, index) => ({index, width: e.clientWidth})) : [];
80
+
81
+ // apply the resize observer to the root node and watch for the size changes
82
+ const resizeObserver = new ResizeObserver(() => handleTabOverflow(root, items));
83
+ resizeObserver.observe(root);
84
+ return () => resizeObserver.disconnect();
85
+ }
86
+ }
87
+ }, [ref]);
88
+
89
+ return (
90
+ <Stack
91
+ flex={1}
92
+ direction="row"
93
+ alignItems="center"
94
+ sx={{
95
+ borderBottom: 1,
96
+ borderColor: "divider",
97
+ }}
98
+ >
99
+ <MuiTabs
100
+ ref={ref}
101
+ orientation="horizontal"
102
+ visibleScrollbar={false}
103
+ scrollButtons={false}
104
+ allowScrollButtonsMobile={false}
105
+ sx={{
106
+ ...sx,
107
+ flex: 1,
108
+ }}
109
+ classes={{
110
+ scroller: "tabRoot",
111
+ flexContainer: "tabList",
112
+ }}
113
+ value={value}
114
+ onChange={onChange}
115
+ {...rest}
116
+ >
117
+ {items
118
+ .map((tabProps, i) => (
119
+ <MuiTab
120
+ key={"muiTab-" + i}
121
+ iconPosition="start"
122
+ {...tabProps}
123
+ sx={{
124
+ ...tabProps.sx,
125
+ ...(i >= overflowIndex ? {display: "none"} : undefined),
126
+ minHeight: 48,
127
+ }}
128
+ />
129
+ ))}
130
+ </MuiTabs>
131
+ {(overflowIndex < items.length) && (
132
+ <Fragment>
133
+ <IconButton
134
+ sx={{
135
+ ml: 1,
136
+ }}
137
+ onClick={ev => setDropdownEl(ev.currentTarget)}
138
+ color={selectedIndex >= overflowIndex ? "primary" : "default"}
139
+ >
140
+ <MoreHorizIcon fontSize="inherit" />
141
+ </IconButton>
142
+ <Menu
143
+ anchorEl={dropdownEl}
144
+ open={!!dropdownEl}
145
+ onClose={() => setDropdownEl(null)}
146
+ >
147
+ {items
148
+ .map((tabProps, i) => {
149
+ const {
150
+ label,
151
+ icon,
152
+ onClick,
153
+ component,
154
+ value: itemValue,
155
+ ...rest
156
+ } = tabProps;
157
+
158
+ const selected = value == itemValue;
159
+
160
+ function handleClick(ev: SyntheticEvent) {
159
161
  if (!selected && onChange) {
160
- onChange(ev, itemValue);
161
- }
162
- if (onClick) {
163
- onClick(ev);
164
- }
165
- setDropdownEl(null);
166
- }
167
-
168
- return (
169
- <MenuItem
170
- key={'dropdownItem-' + i}
171
- onClick={handleClick}
172
- component={component ?? "li"}
173
- sx={i < overflowIndex ? hiddenSx : {}}
174
- selected={selected}
175
- {...rest}
176
- >
177
- {icon && <ListItemIcon>{icon}</ListItemIcon>}
178
- <ListItemText>{label}</ListItemText>
179
- </MenuItem>
180
- )
181
- })}
182
- </Menu>
183
- </Fragment>
184
- )}
185
- </Stack>
186
- );
162
+ onChange(ev, itemValue);
163
+ }
164
+ if (onClick) {
165
+ onClick(ev);
166
+ }
167
+ setDropdownEl(null);
168
+ }
169
+
170
+ return (
171
+ <MenuItem
172
+ key={"dropdownItem-" + i}
173
+ onClick={handleClick}
174
+ component={component ?? "li"}
175
+ sx={i < overflowIndex ? hiddenSx : {}}
176
+ selected={selected}
177
+ {...rest}
178
+ >
179
+ {icon && <ListItemIcon>{icon}</ListItemIcon>}
180
+ <ListItemText>{label}</ListItemText>
181
+ </MenuItem>
182
+ );
183
+ })}
184
+ </Menu>
185
+ </Fragment>
186
+ )}
187
+ </Stack>
188
+ );
187
189
  }
package/src/tabs/index.ts CHANGED
@@ -1 +1 @@
1
- export {Tabs} from "./Tabs";
1
+ export { Tabs } from "./Tabs";
@@ -1,2 +1,2 @@
1
- export * from "./polyfill";
2
1
  export * from "./parse";
2
+ export * from "./polyfill";
@@ -20,8 +20,7 @@ function tryParseString<T>(value: string | undefined | null, parseFn: (value: st
20
20
  if (value) {
21
21
  try {
22
22
  return parseFn(value);
23
- }
24
- catch (error) {
23
+ } catch (error) {
25
24
  // ignore parse error
26
25
  }
27
26
  }
@@ -4,17 +4,17 @@
4
4
  * switch to a conditional polyfill or using the browser built-ins.
5
5
  */
6
6
 
7
- import {Temporal, Intl, toTemporalInstant} from '@js-temporal/polyfill';
7
+ import {Intl, Temporal, toTemporalInstant} from "@js-temporal/polyfill";
8
8
 
9
9
  export const {
10
- Instant,
11
- ZonedDateTime,
12
- PlainDateTime,
13
- PlainDate,
14
- PlainTime,
15
- Now,
16
- Duration,
17
- TimeZone
10
+ Instant,
11
+ ZonedDateTime,
12
+ PlainDateTime,
13
+ PlainDate,
14
+ PlainTime,
15
+ Now,
16
+ Duration,
17
+ TimeZone,
18
18
  } = Temporal;
19
19
 
20
20
  export type Instant = Temporal.Instant;
@@ -26,11 +26,11 @@ export type Duration = Temporal.Duration;
26
26
  export type TimeZone = Temporal.TimeZone;
27
27
 
28
28
  export const {
29
- DateTimeFormat
29
+ DateTimeFormat,
30
30
  } = Intl;
31
31
 
32
32
  export type DateTimeFormat = Intl.DateTimeFormat;
33
33
  export type DateTimeFormatOptions = Intl.DateTimeFormatOptions;
34
34
  export type Formattable = Intl.Formattable;
35
35
 
36
- export {toTemporalInstant};
36
+ export { toTemporalInstant };
@@ -1,4 +1,3 @@
1
-
2
1
  export function defined<T>(x: T | undefined): x is T {
3
- return x !== undefined;
4
- }
2
+ return x !== undefined;
3
+ }
@@ -1,3 +1,3 @@
1
+ export * from "./defined";
1
2
  export * from "./useFlag";
2
3
  export * from "./useIsMounted";
3
- export * from "./defined";
@@ -1,9 +1,9 @@
1
1
  import {useCallback, useState} from "react";
2
2
 
3
3
  export function useFlag(initialValue: boolean) {
4
- const [flag, setFlag] = useState(initialValue);
5
- const set = useCallback(() => setFlag(true), []);
6
- const clear = useCallback(() => setFlag(false), []);
7
- const toggle = useCallback(() => setFlag(prev => !prev), []);
8
- return [flag, set, clear, toggle] as const;
4
+ const [flag, setFlag] = useState(initialValue);
5
+ const set = useCallback(() => setFlag(true), []);
6
+ const clear = useCallback(() => setFlag(false), []);
7
+ const toggle = useCallback(() => setFlag(prev => !prev), []);
8
+ return [flag, set, clear, toggle] as const;
9
9
  }
@@ -1,12 +1,12 @@
1
1
  import {useEffect, useRef} from "react";
2
2
 
3
3
  export function useIsMounted() {
4
- const isMounted = useRef(false);
5
- useEffect(() => {
6
- isMounted.current = true;
7
- return () => {
8
- isMounted.current = false;
9
- }
10
- }, []);
11
- return isMounted.current;
12
- }
4
+ const isMounted = useRef(false);
5
+ useEffect(() => {
6
+ isMounted.current = true;
7
+ return () => {
8
+ isMounted.current = false;
9
+ };
10
+ }, []);
11
+ return isMounted.current;
12
+ }