@geotab/zenith 3.8.0 → 3.9.0-beta.1

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 (200) hide show
  1. package/README.md +11 -12
  2. package/dist/button/button.d.ts +2 -1
  3. package/dist/button/button.js +3 -3
  4. package/dist/calendar/calendar.js +200 -3
  5. package/dist/card/card.d.ts +1 -1
  6. package/dist/card/card.js +1 -1
  7. package/dist/card/components/cardButton/cardButton.d.ts +2 -1
  8. package/dist/card/components/cardButton/cardButton.js +5 -3
  9. package/dist/card/helpers/getIconTypeFromStatus.d.ts +1 -1
  10. package/dist/chart/barChart/getBarLegendItems.js +3 -5
  11. package/dist/chart/lineChart/getLineLegendItems.js +7 -7
  12. package/dist/chart/pieChart/centerTextPlugin.js +13 -5
  13. package/dist/chart/pieChart/getPieLegendItems.js +8 -12
  14. package/dist/chart/pieChart.js +13 -11
  15. package/dist/chart/plugins/legend/interfaces.d.ts +1 -1
  16. package/dist/commonHelpers/generateId.d.ts +8 -0
  17. package/dist/commonHelpers/generateId.js +8 -0
  18. package/dist/commonHelpers/hooks/ssrProvider.d.ts +14 -0
  19. package/dist/commonHelpers/hooks/ssrProvider.js +12 -0
  20. package/dist/commonHelpers/hooks/useClientReady.js +3 -1
  21. package/dist/commonHelpers/hooks/useDeviceType.js +6 -2
  22. package/dist/commonHelpers/hooks/useIsomorphicLayoutEffect.d.ts +2 -0
  23. package/dist/commonHelpers/hooks/useIsomorphicLayoutEffect.js +6 -0
  24. package/dist/commonHelpers/hooks/useMobile.js +4 -3
  25. package/dist/commonHelpers/hooks/usePortal.js +2 -5
  26. package/dist/commonHelpers/isDomEnv.js +1 -2
  27. package/dist/commonHelpers/useUniqueId.d.ts +6 -0
  28. package/dist/commonHelpers/useUniqueId.js +8 -2
  29. package/dist/commonHelpers/utils.d.ts +0 -1
  30. package/dist/commonHelpers/utils.js +1 -3
  31. package/dist/commonStyles/common.less +13 -1
  32. package/dist/commonStyles/fonts/notosarabic/LICENSE.txt +93 -0
  33. package/dist/commonStyles/fonts/notosarabic/NotoSansArabic-Bold.woff +0 -0
  34. package/dist/commonStyles/fonts/notosarabic/NotoSansArabic-Bold.woff2 +0 -0
  35. package/dist/commonStyles/fonts/notosarabic/NotoSansArabic-Medium.woff +0 -0
  36. package/dist/commonStyles/fonts/notosarabic/NotoSansArabic-Medium.woff2 +0 -0
  37. package/dist/commonStyles/fonts/notosarabic/NotoSansArabic-Regular.woff +0 -0
  38. package/dist/commonStyles/fonts/notosarabic/NotoSansArabic-Regular.woff2 +0 -0
  39. package/dist/commonStyles/fonts/notosarabic/NotoSansArabic-SemiBold.woff +0 -0
  40. package/dist/commonStyles/fonts/notosarabic/NotoSansArabic-SemiBold.woff2 +0 -0
  41. package/dist/commonStyles/fonts/notosarabic.less +43 -0
  42. package/dist/commonStyles/pillStyles/pillContent.less +2 -3
  43. package/dist/commonStyles/pillStyles/pillStyles.less +1 -2
  44. package/dist/commonStyles/pillStyles/pillTextContent.less +2 -2
  45. package/dist/commonStyles/typography/typography.less +617 -249
  46. package/dist/dataGrid/withSelectableRows/components/bulkActions/bulkActions.d.ts +5 -3
  47. package/dist/dataGrid/withSelectableRows/components/bulkActions/bulkActions.js +2 -38
  48. package/dist/dateInputInner/dateInputInnerControlBlock.js +12 -8
  49. package/dist/dateRangeRaw/dateRangeRaw.js +5 -1
  50. package/dist/dialog/dialog.js +4 -3
  51. package/dist/feedbackContainer/feedbackContainer.js +4 -4
  52. package/dist/fileUpload/fileUpload.js +21 -12
  53. package/dist/filters/components/filtersSidePanel.d.ts +1 -1
  54. package/dist/filters/components/filtersSidePanel.js +123 -116
  55. package/dist/filters/filters.js +1 -2
  56. package/dist/filtersBar/filtersBar.d.ts +2 -0
  57. package/dist/filtersBar/filtersBar.js +5 -3
  58. package/dist/filtersBar/filtersBarActions/filtersBarActions.js +3 -1
  59. package/dist/filtersBar/filtersBarSidePanel/components/filtersBarSidePanelRange/filtersBarSidePanelRange.js +3 -0
  60. package/dist/filtersBar/filtersBarSidePanel/filtersBarSidePanel.d.ts +1 -1
  61. package/dist/filtersBar/filtersBarSidePanel/filtersBarSidePanel.js +86 -80
  62. package/dist/formFieldError/formFieldError.d.ts +2 -1
  63. package/dist/formFieldError/formFieldError.js +2 -2
  64. package/dist/header/components/collapsedItemsControl/utils/handleCustomMenuWrapper.js +1 -1
  65. package/dist/index.css +3707 -2151
  66. package/dist/index.d.ts +3 -5
  67. package/dist/index.js +24 -29
  68. package/dist/menu/components/menuItem.js +4 -4
  69. package/dist/menu/controlledMenu.js +4 -4
  70. package/dist/nav/nav.js +10 -5
  71. package/dist/nav/navAddMenu/navAddMenu.js +1 -2
  72. package/dist/nav/navEditList/navEditListUtils.d.ts +1 -1
  73. package/dist/nav/navEditList/navEditListUtils.js +2 -1
  74. package/dist/nav/navItem/navActionItem.js +3 -3
  75. package/dist/nav/navItem/navItem.js +1 -2
  76. package/dist/pageHeader/pageHeaderActions.js +4 -3
  77. package/dist/rangeRaw/rangeRaw.js +7 -1
  78. package/dist/selectList/selectList.js +11 -7
  79. package/dist/selectRaw/selectRaw.js +1 -1
  80. package/dist/shield/shield.js +5 -3
  81. package/dist/sidePanel/sidePanel.js +9 -8
  82. package/dist/table/children/useTableChildren.d.ts +1 -1
  83. package/dist/table/children/useTableChildren.js +3 -3
  84. package/dist/table/flexible/useFlexibleColumns.js +39 -1
  85. package/dist/table/nested/useNestedRows.d.ts +1 -0
  86. package/dist/table/nested/useNestedRows.js +3 -3
  87. package/dist/table/selectable/useSelectableRows.d.ts +9 -0
  88. package/dist/table/selectable/useSelectableRows.js +18 -11
  89. package/dist/table/table.js +1 -7
  90. package/dist/{card/components → title}/title.d.ts +1 -1
  91. package/dist/title/title.js +27 -0
  92. package/dist/toggleButtonRaw/toggleButtonRaw.js +3 -1
  93. package/dist/toggleButtonRaw/types.d.ts +1 -0
  94. package/dist/tooltip/tooltip.d.ts +2 -1
  95. package/dist/tooltip/tooltip.js +68 -64
  96. package/dist/utils/localization/directionContext.d.ts +3 -0
  97. package/dist/utils/localization/directionContext.js +5 -0
  98. package/dist/utils/localization/getTextDirection.d.ts +2 -0
  99. package/dist/utils/localization/getTextDirection.js +6 -0
  100. package/dist/utils/localization/languageProvider.js +15 -1
  101. package/dist/utils/localization/translations/en-json.d.ts +2 -0
  102. package/dist/utils/localization/translations/en-json.js +3 -1
  103. package/dist/utils/localization/translations/en.json +3 -0
  104. package/dist/utils/localization/useDirection.d.ts +2 -0
  105. package/dist/utils/localization/useDirection.js +7 -0
  106. package/esm/button/button.d.ts +2 -1
  107. package/esm/button/button.js +3 -3
  108. package/esm/calendar/calendar.js +200 -3
  109. package/esm/card/card.d.ts +1 -1
  110. package/esm/card/card.js +1 -1
  111. package/esm/card/components/cardButton/cardButton.d.ts +2 -1
  112. package/esm/card/components/cardButton/cardButton.js +5 -3
  113. package/esm/card/helpers/getIconTypeFromStatus.d.ts +1 -1
  114. package/esm/chart/barChart/getBarLegendItems.js +3 -5
  115. package/esm/chart/lineChart/getLineLegendItems.js +7 -7
  116. package/esm/chart/pieChart/centerTextPlugin.js +13 -5
  117. package/esm/chart/pieChart/getPieLegendItems.js +8 -12
  118. package/esm/chart/pieChart.js +14 -12
  119. package/esm/chart/plugins/legend/interfaces.d.ts +1 -1
  120. package/esm/commonHelpers/generateId.d.ts +8 -0
  121. package/esm/commonHelpers/generateId.js +8 -0
  122. package/esm/commonHelpers/hooks/ssrProvider.d.ts +14 -0
  123. package/esm/commonHelpers/hooks/ssrProvider.js +6 -0
  124. package/esm/commonHelpers/hooks/useClientReady.js +4 -2
  125. package/esm/commonHelpers/hooks/useDeviceType.js +7 -3
  126. package/esm/commonHelpers/hooks/useIsomorphicLayoutEffect.d.ts +2 -0
  127. package/esm/commonHelpers/hooks/useIsomorphicLayoutEffect.js +3 -0
  128. package/esm/commonHelpers/hooks/useMobile.js +4 -3
  129. package/esm/commonHelpers/hooks/usePortal.js +2 -5
  130. package/esm/commonHelpers/isDomEnv.js +1 -2
  131. package/esm/commonHelpers/useUniqueId.d.ts +6 -0
  132. package/esm/commonHelpers/useUniqueId.js +7 -1
  133. package/esm/commonHelpers/utils.d.ts +0 -1
  134. package/esm/commonHelpers/utils.js +0 -1
  135. package/esm/dataGrid/withSelectableRows/components/bulkActions/bulkActions.d.ts +5 -3
  136. package/esm/dataGrid/withSelectableRows/components/bulkActions/bulkActions.js +2 -38
  137. package/esm/dateInputInner/dateInputInnerControlBlock.js +13 -9
  138. package/esm/dateRangeRaw/dateRangeRaw.js +5 -1
  139. package/esm/dialog/dialog.js +4 -3
  140. package/esm/feedbackContainer/feedbackContainer.js +4 -4
  141. package/esm/fileUpload/fileUpload.js +21 -12
  142. package/esm/filters/components/filtersSidePanel.d.ts +1 -1
  143. package/esm/filters/components/filtersSidePanel.js +123 -116
  144. package/esm/filters/filters.js +2 -3
  145. package/esm/filtersBar/filtersBar.d.ts +2 -0
  146. package/esm/filtersBar/filtersBar.js +5 -3
  147. package/esm/filtersBar/filtersBarActions/filtersBarActions.js +3 -1
  148. package/esm/filtersBar/filtersBarSidePanel/components/filtersBarSidePanelRange/filtersBarSidePanelRange.js +3 -0
  149. package/esm/filtersBar/filtersBarSidePanel/filtersBarSidePanel.d.ts +1 -1
  150. package/esm/filtersBar/filtersBarSidePanel/filtersBarSidePanel.js +86 -80
  151. package/esm/formFieldError/formFieldError.d.ts +2 -1
  152. package/esm/formFieldError/formFieldError.js +2 -2
  153. package/esm/header/components/collapsedItemsControl/utils/handleCustomMenuWrapper.js +1 -1
  154. package/esm/index.d.ts +3 -5
  155. package/esm/index.js +3 -5
  156. package/esm/menu/components/menuItem.js +1 -1
  157. package/esm/menu/controlledMenu.js +1 -1
  158. package/esm/nav/nav.js +10 -5
  159. package/esm/nav/navAddMenu/navAddMenu.js +2 -3
  160. package/esm/nav/navEditList/navEditListUtils.d.ts +1 -1
  161. package/esm/nav/navEditList/navEditListUtils.js +2 -1
  162. package/esm/nav/navItem/navActionItem.js +3 -2
  163. package/esm/nav/navItem/navItem.js +2 -3
  164. package/esm/pageHeader/pageHeaderActions.js +4 -3
  165. package/esm/rangeRaw/rangeRaw.js +7 -1
  166. package/esm/selectList/selectList.js +11 -7
  167. package/esm/selectRaw/selectRaw.js +1 -1
  168. package/esm/shield/shield.js +5 -3
  169. package/esm/sidePanel/sidePanel.js +9 -8
  170. package/esm/table/children/useTableChildren.d.ts +1 -1
  171. package/esm/table/children/useTableChildren.js +3 -3
  172. package/esm/table/flexible/useFlexibleColumns.js +39 -1
  173. package/esm/table/nested/useNestedRows.d.ts +1 -0
  174. package/esm/table/nested/useNestedRows.js +1 -1
  175. package/esm/table/selectable/useSelectableRows.d.ts +9 -0
  176. package/esm/table/selectable/useSelectableRows.js +15 -8
  177. package/esm/table/table.js +1 -7
  178. package/esm/{card/components → title}/title.d.ts +1 -1
  179. package/esm/title/title.js +23 -0
  180. package/esm/toggleButtonRaw/toggleButtonRaw.js +3 -1
  181. package/esm/toggleButtonRaw/types.d.ts +1 -0
  182. package/esm/tooltip/tooltip.d.ts +2 -1
  183. package/esm/tooltip/tooltip.js +68 -64
  184. package/esm/utils/localization/directionContext.d.ts +3 -0
  185. package/esm/utils/localization/directionContext.js +2 -0
  186. package/esm/utils/localization/getTextDirection.d.ts +2 -0
  187. package/esm/utils/localization/getTextDirection.js +2 -0
  188. package/esm/utils/localization/languageProvider.js +15 -1
  189. package/esm/utils/localization/translations/en-json.d.ts +2 -0
  190. package/esm/utils/localization/translations/en-json.js +3 -1
  191. package/esm/utils/localization/translations/en.json +3 -0
  192. package/esm/utils/localization/useDirection.d.ts +2 -0
  193. package/esm/utils/localization/useDirection.js +3 -0
  194. package/package.json +33 -31
  195. package/dist/card/components/title.js +0 -22
  196. package/dist/commonHelpers/hooks/deviceProvider.d.ts +0 -7
  197. package/dist/commonHelpers/hooks/deviceProvider.js +0 -11
  198. package/esm/card/components/title.js +0 -18
  199. package/esm/commonHelpers/hooks/deviceProvider.d.ts +0 -7
  200. package/esm/commonHelpers/hooks/deviceProvider.js +0 -4
package/esm/index.d.ts CHANGED
@@ -20,7 +20,6 @@ export { type ICardButton, CardButton } from "./card/components/cardButton/cardB
20
20
  export { type ICardToggle, CardToggle } from "./card/components/cardToggle/cardToggle";
21
21
  export { type IContent, Content } from "./card/components/content";
22
22
  export { type TCardStatus, Status } from "./card/components/status";
23
- export { Title } from "./card/components/title";
24
23
  export { TitleLink } from "./card/components/titleLink";
25
24
  export { getDefaultFullWidthValue } from "./card/helpers/getDefaultFullWidthValue";
26
25
  export { getIconFromStatus } from "./card/helpers/getIconFromStatus";
@@ -48,8 +47,8 @@ export { classNames } from "./commonHelpers/classNames/classNames";
48
47
  export { hexToRGBA } from "./commonHelpers/colorUtils";
49
48
  export { type IEntityWithId } from "./commonHelpers/entity";
50
49
  export { generateId } from "./commonHelpers/generateId";
51
- export { DeviceContext, DeviceProvider } from "./commonHelpers/hooks/deviceProvider";
52
50
  export { DeviceType } from "./commonHelpers/hooks/deviceType";
51
+ export { SSRProvider } from "./commonHelpers/hooks/ssrProvider";
53
52
  export { useDebounce } from "./commonHelpers/hooks/useDebounce";
54
53
  export { useDebouncedMemo } from "./commonHelpers/hooks/useDebouncedMemo";
55
54
  export { useDeviceType } from "./commonHelpers/hooks/useDeviceType";
@@ -74,8 +73,6 @@ export { useDropdownState } from "./dropdown/useDropdownState";
74
73
  export { type IEmptyState, EmptyState } from "./emptyState/emptyState";
75
74
  export { type IFavoriteButton, FavoriteButton } from "./favoriteButton/favoriteButton";
76
75
  export { FeedbackProvider } from "./feedbackProvider/feedbackProvider";
77
- export { TemplateDownloadSection } from "./fileUpload/components/templateDownloadSection";
78
- export { UploadedFilesSection } from "./fileUpload/components/uploadedFilesSection";
79
76
  export { FileUpload } from "./fileUpload/fileUpload";
80
77
  export { type IUploadedFile, type ITemplateDownload, type IFileUploadMeta, type IFileUpload } from "./fileUpload/fileUploadType";
81
78
  export { type TFilterButton, type IFilterButton, FilterButton } from "./filterButton/filterButton";
@@ -760,6 +757,7 @@ export { type ITextInputRaw, TextInputRaw } from "./textInputRaw/textInputRaw";
760
757
  export { type ITextarea, Textarea } from "./textarea/textarea";
761
758
  export { type ITextareaRaw, TextareaRaw } from "./textareaRaw/textareaRaw";
762
759
  export { type ITimePicker, type TTimePicker, TimePicker } from "./timePicker/timePicker";
760
+ export { Title } from "./title/title";
763
761
  export { type IShowToast, useToast } from "./toast/hooks/useToast";
764
762
  export { type IToast, Toast } from "./toast/toast";
765
763
  export { type IToggleButton, type TToggleButton, ToggleButton } from "./toggleButton/toggleButton";
@@ -773,7 +771,7 @@ export { HeaderButtonsProvider } from "./utils/headerButtons/headerButtonsProvid
773
771
  export { getNewFocusableItem, getFirstFocusableItem } from "./utils/keyboardHelpers";
774
772
  export { LanguageProvider } from "./utils/localization/languageProvider";
775
773
  export { dictionaries, injectString } from "./utils/localization/translationsDictionary";
776
- export { useLanguage } from "./utils/localization/useLanguage";
774
+ export { useDirection } from "./utils/localization/useDirection";
777
775
  export { ThemeDark } from "./utils/theme/themeDark";
778
776
  export { ThemeDrive } from "./utils/theme/themeDrive";
779
777
  export { ThemeProvider } from "./utils/theme/themeProvider";
package/esm/index.js CHANGED
@@ -21,7 +21,6 @@ export { CardButton } from "./card/components/cardButton/cardButton";
21
21
  export { CardToggle } from "./card/components/cardToggle/cardToggle";
22
22
  export { Content } from "./card/components/content";
23
23
  export { Status } from "./card/components/status";
24
- export { Title } from "./card/components/title";
25
24
  export { TitleLink } from "./card/components/titleLink";
26
25
  export { getDefaultFullWidthValue } from "./card/helpers/getDefaultFullWidthValue";
27
26
  export { getIconFromStatus } from "./card/helpers/getIconFromStatus";
@@ -48,8 +47,8 @@ export { getCheckboxState } from "./checkbox/checkboxUtils";
48
47
  export { classNames } from "./commonHelpers/classNames/classNames";
49
48
  export { hexToRGBA } from "./commonHelpers/colorUtils";
50
49
  export { generateId } from "./commonHelpers/generateId";
51
- export { DeviceContext, DeviceProvider } from "./commonHelpers/hooks/deviceProvider";
52
50
  export { DeviceType } from "./commonHelpers/hooks/deviceType";
51
+ export { SSRProvider } from "./commonHelpers/hooks/ssrProvider";
53
52
  export { useDebounce } from "./commonHelpers/hooks/useDebounce";
54
53
  export { useDebouncedMemo } from "./commonHelpers/hooks/useDebouncedMemo";
55
54
  export { useDeviceType } from "./commonHelpers/hooks/useDeviceType";
@@ -73,8 +72,6 @@ export { useDropdownState } from "./dropdown/useDropdownState";
73
72
  export { EmptyState } from "./emptyState/emptyState";
74
73
  export { FavoriteButton } from "./favoriteButton/favoriteButton";
75
74
  export { FeedbackProvider } from "./feedbackProvider/feedbackProvider";
76
- export { TemplateDownloadSection } from "./fileUpload/components/templateDownloadSection";
77
- export { UploadedFilesSection } from "./fileUpload/components/uploadedFilesSection";
78
75
  export { FileUpload } from "./fileUpload/fileUpload";
79
76
  export { FilterButton } from "./filterButton/filterButton";
80
77
  export { FiltersChip } from "./filters/components/filtersChip";
@@ -745,6 +742,7 @@ export { TextInputRaw } from "./textInputRaw/textInputRaw";
745
742
  export { Textarea } from "./textarea/textarea";
746
743
  export { TextareaRaw } from "./textareaRaw/textareaRaw";
747
744
  export { TimePicker } from "./timePicker/timePicker";
745
+ export { Title } from "./title/title";
748
746
  export { useToast } from "./toast/hooks/useToast";
749
747
  export { Toast } from "./toast/toast";
750
748
  export { ToggleButton } from "./toggleButton/toggleButton";
@@ -757,7 +755,7 @@ export { HeaderButtonsProvider } from "./utils/headerButtons/headerButtonsProvid
757
755
  export { getNewFocusableItem, getFirstFocusableItem } from "./utils/keyboardHelpers";
758
756
  export { LanguageProvider } from "./utils/localization/languageProvider";
759
757
  export { dictionaries, injectString } from "./utils/localization/translationsDictionary";
760
- export { useLanguage } from "./utils/localization/useLanguage";
758
+ export { useDirection } from "./utils/localization/useDirection";
761
759
  export { ThemeDark } from "./utils/theme/themeDark";
762
760
  export { ThemeDrive } from "./utils/theme/themeDrive";
763
761
  export { ThemeProvider } from "./utils/theme/themeProvider";
@@ -6,7 +6,7 @@ import { ControlledMenu } from "../controlledMenu";
6
6
  import { ControlledPopup } from "../../controlledPopup/controlledPopup";
7
7
  import { PathContext } from "../contexts/pathContext";
8
8
  import { classNames } from "../../commonHelpers/classNames/classNames";
9
- import { generateId } from "../../commonHelpers/utils";
9
+ import { generateId } from "../../commonHelpers/generateId";
10
10
  import { MenuAlignmentContext } from "../../header/headerContext";
11
11
  import { isSeparator } from "./menuSeparator";
12
12
  export const isMenuItem = (element) => {
@@ -16,7 +16,7 @@ import { ControlledPopup } from "../controlledPopup/controlledPopup";
16
16
  import { MobileSheet } from "../mobileSheet/mobileSheet";
17
17
  import { DeviceType } from "../commonHelpers/hooks/deviceType";
18
18
  import { useDeviceType } from "../commonHelpers/hooks/useDeviceType";
19
- import { generateId } from "../commonHelpers/utils";
19
+ import { generateId } from "../commonHelpers/generateId";
20
20
  import { PathProvider } from "./contexts/pathProvider";
21
21
  import { isSeparator, MenuSeparator } from "./components/menuSeparator";
22
22
  import { FOCUSABLE_SELECTOR } from "../utils/focusableSelector";
package/esm/nav/nav.js CHANGED
@@ -5,7 +5,7 @@ import { Children, cloneElement, Fragment, useCallback, useEffect, useLayoutEffe
5
5
  import { NavDivider } from "./navDivider/navDivider";
6
6
  import { detectOverlayScrollbar, filterPrimaryNavItems, collectNavItems } from "./utils/navUtils";
7
7
  import { useResize } from "../commonHelpers/hooks/useResize";
8
- import { createPortal } from "react-dom";
8
+ import { usePortal } from "../commonHelpers/hooks/usePortal";
9
9
  import { NavMobileBar } from "./navMobileBar/navMobileBar";
10
10
  import { useMobile } from "../commonHelpers/hooks/useMobile";
11
11
  import { FOCUSABLE_SELECTOR } from "../utils/focusableSelector";
@@ -132,6 +132,7 @@ export const Nav = ({ children, className, collapsed = false, onCollapseToggle,
132
132
  useEffect(() => {
133
133
  onMenuVisibilityToggle === null || onMenuVisibilityToggle === void 0 ? void 0 : onMenuVisibilityToggle(!isMobile || isMobileMenuOpen);
134
134
  }, [isMobile, isMobileMenuOpen, onMenuVisibilityToggle]);
135
+ const navMobileBarPortal = usePortal(_jsx(NavMobileBar, { onMenuToggle: onMobileMenuToggle, isMenuOpen: isMobileMenuOpen, children: isEditState ? editListItems : primaryItems }), mobileBarContainer !== null && mobileBarContainer !== void 0 ? mobileBarContainer : undefined);
135
136
  return (_jsxs(NavContext, { value: {
136
137
  collapsed,
137
138
  onCollapseToggle,
@@ -142,13 +143,17 @@ export const Nav = ({ children, className, collapsed = false, onCollapseToggle,
142
143
  searchTerm,
143
144
  onSearch: setSearchTerm,
144
145
  onNavigate: () => onIsMobileMenuOpenToggle && onIsMobileMenuOpenToggle(false)
145
- }, children: [!isMobile || isMobileMenuOpen ? (_jsxs("div", { ref: menuRef, className: classNames(["zen-nav", isMobile ? "zen-nav--mobile" : "", collapsed ? "zen-nav--collapsed" : "", className || ""]), children: [header
146
+ }, children: [!isMobile || isMobileMenuOpen ? (_jsxs("div", { ref: menuRef, className: classNames([
147
+ "zen-nav",
148
+ isMobile ? "zen-nav--mobile" : "",
149
+ isMobile && isEditState ? "zen-nav--mobile-edit" : "",
150
+ collapsed ? "zen-nav--collapsed" : "",
151
+ className || ""
152
+ ]), children: [header
146
153
  ? cloneElement(header, Object.assign(Object.assign({}, header.props), { className: classNames(["zen-nav__header", header.props.className || ""]) }))
147
154
  : null, _jsx(NavContent, { children: isEditState
148
155
  ? editListItems
149
156
  : sectionsToRender.map((section, index) => (_jsxs(Fragment, { children: [cloneElement(section, {
150
157
  className: classNames(["zen-nav__section", section.props.className || ""])
151
- }), isMobile || index < sectionsToRender.length - 1 ? _jsx(NavDivider, {}) : null] }, index))) }), footerToRender] })) : null, mobileBarContainer &&
152
- isMobile &&
153
- createPortal(_jsx(NavMobileBar, { onMenuToggle: onMobileMenuToggle, isMenuOpen: isMobileMenuOpen, children: isEditState ? editListItems : primaryItems }), mobileBarContainer)] }));
158
+ }), isMobile || index < sectionsToRender.length - 1 ? _jsx(NavDivider, {}) : null] }, index))) }), footerToRender] })) : null, mobileBarContainer && isMobile && navMobileBarPortal] }));
154
159
  };
@@ -1,5 +1,5 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { Children, cloneElement, useRef, useState } from "react";
2
+ import { Children, cloneElement, useId, useRef, useState } from "react";
3
3
  import { classNames } from "../../commonHelpers/classNames/classNames";
4
4
  import { NavItemContext } from "../navItem/navItem";
5
5
  import { useMobile } from "../../commonHelpers/hooks/useMobile";
@@ -9,13 +9,12 @@ import { IconClose } from "../../icons/iconClose";
9
9
  import { IconPlus } from "../../icons/iconPlus";
10
10
  import { Tooltip } from "../../tooltip/tooltip";
11
11
  import { useNavContext } from "../context/nav.context";
12
- import { generateId } from "../../commonHelpers/utils";
13
12
  export const NavAddMenu = ({ title, alignment, className, children }) => {
14
13
  const [isOpen, setIsOpen] = useState(false);
15
14
  const isMobile = useMobile();
16
15
  const { collapsed } = useNavContext();
17
16
  const triggerRef = useRef(null);
18
- const triggerId = generateId();
17
+ const triggerId = useId();
19
18
  const validChildren = Children.toArray(children)
20
19
  .filter((child) => {
21
20
  const element = child;
@@ -1,3 +1,3 @@
1
1
  import { PointerEvent, ReactElement } from "react";
2
2
  import { INavActionItem } from "../navItem/navActionItem";
3
- export declare const attachDndHandler: (item: ReactElement<INavActionItem>, onPointerDown: (e: PointerEvent<HTMLElement>) => void) => ReactElement<INavActionItem, string | import("react").JSXElementConstructor<any>>;
3
+ export declare const attachDndHandler: (item: ReactElement<INavActionItem>, onPointerDown: (e: PointerEvent<HTMLDivElement>) => void) => ReactElement<INavActionItem>;
@@ -4,7 +4,8 @@ import { NavActionItem } from "../navItem/navActionItem";
4
4
  import { IconGrab } from "../../icons/iconGrab";
5
5
  export const attachDndHandler = (item, onPointerDown) => {
6
6
  if (item.type === NavActionItem) {
7
- return cloneElement(item, Object.assign(Object.assign({}, item.props), { startNode: (_jsx("div", { className: "zen-nav-item__dnd", onPointerDown: onPointerDown, children: _jsx(IconGrab, { size: "large" }) })) }));
7
+ const navActionItem = item;
8
+ return cloneElement(navActionItem, Object.assign(Object.assign({}, navActionItem.props), { onLeftContentPointerDown: onPointerDown, startNode: (_jsx("div", { className: "zen-nav-item__dnd", children: _jsx(IconGrab, { size: "large" }) })) }));
8
9
  }
9
10
  return item;
10
11
  };
@@ -1,9 +1,10 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { classNames } from "../../commonHelpers/classNames/classNames";
3
- export const NavActionItem = ({ title, id, icon, className, startNode, endButtonIcon, endButtonTitle, onEndButtonClick }) => {
3
+ const NavActionItemComponent = ({ title, id, icon, className, startNode, endButtonIcon, endButtonTitle, onEndButtonClick, onLeftContentPointerDown }) => {
4
4
  const PrimaryIconComponent = typeof icon === "function" ? icon : null;
5
5
  const EndButtonIconComponent = typeof endButtonIcon === "function" ? endButtonIcon : null;
6
6
  const itemClasses = classNames(["zen-nav-item", className || ""]);
7
- return (_jsxs("div", { className: itemClasses, id: id, children: [_jsx("div", { className: "zen-nav-item__main", children: _jsxs("div", { className: "zen-nav-item__content-left", children: [startNode ? _jsx("span", { className: "zen-nav-item__icon", children: startNode }) : null, PrimaryIconComponent ? _jsx(PrimaryIconComponent, { size: "huge" }) : null, _jsx("span", { className: "zen-nav-item__title", children: _jsx("span", { className: "zen-nav-item__title-text", children: title }) })] }) }), EndButtonIconComponent && endButtonTitle && onEndButtonClick ? (_jsx("button", { type: "button", className: "zen-nav-item__action", "aria-label": endButtonTitle, title: endButtonTitle, onClick: onEndButtonClick, children: _jsx(EndButtonIconComponent, { size: "huge" }) })) : null] }));
7
+ return (_jsxs("div", { className: itemClasses, id: id, children: [_jsx("div", { className: "zen-nav-item__main", children: _jsxs("div", { className: "zen-nav-item__content-left", onPointerDown: onLeftContentPointerDown, children: [startNode ? _jsx("span", { className: "zen-nav-item__icon", children: startNode }) : null, PrimaryIconComponent ? _jsx(PrimaryIconComponent, { size: "huge" }) : null, _jsx("span", { className: "zen-nav-item__title", children: _jsx("span", { className: "zen-nav-item__title-text", children: title }) })] }) }), EndButtonIconComponent && endButtonTitle && onEndButtonClick ? (_jsx("button", { type: "button", className: "zen-nav-item__action", "aria-label": endButtonTitle, title: endButtonTitle, onClick: onEndButtonClick, children: _jsx(EndButtonIconComponent, { size: "huge" }) })) : null] }));
8
8
  };
9
+ export const NavActionItem = NavActionItemComponent;
9
10
  NavActionItem.displayName = "NavActionItem";
@@ -11,7 +11,7 @@ var __rest = (this && this.__rest) || function (s, e) {
11
11
  };
12
12
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
13
13
  import { classNames } from "../../commonHelpers/classNames/classNames";
14
- import { useRef, useState, useEffect, Children, cloneElement, createContext, useContext } from "react";
14
+ import { useRef, useState, useEffect, Children, cloneElement, createContext, useContext, useId } from "react";
15
15
  import { IconBeta } from "../../icons/iconBeta";
16
16
  import { IconChevronRight } from "../../icons/iconChevronRight";
17
17
  import { IconOpen2 } from "../../icons/iconOpen2";
@@ -19,7 +19,6 @@ import { Tooltip } from "../../tooltip/tooltip";
19
19
  import { ControlledMenu } from "../../menu/controlledMenu";
20
20
  import { useNavContext } from "../context/nav.context";
21
21
  import { useMobile } from "../../commonHelpers/hooks/useMobile";
22
- import { generateId } from "../../commonHelpers/utils";
23
22
  const ICON_SIZE = "huge";
24
23
  const SUBMENU_ICON_SIZE = "large";
25
24
  export const NavItemContext = createContext({ parentLevel: 0 });
@@ -101,7 +100,7 @@ const ButtonNavItem = (_a) => {
101
100
  };
102
101
  const isMobile = useMobile();
103
102
  const isActive = active || (hasNestedItems && menuOpen);
104
- const triggerId = generateId();
103
+ const triggerId = useId();
105
104
  const buttonElement = (_jsx("button", { id: triggerId, ref: triggerRef, "aria-label": title, title: title, tabIndex: tabIndex, role: isMenuItem ? "menuitem" : undefined, className: "zen-nav-item__main", onClick: handleClick, onKeyDown: handleKeyPress, children: _jsx(NavItemContent, Object.assign({ title: title, collapsed: collapsed, hasSubmenu: hasNestedItems, level: currentLevel }, rest, { children: _jsx("span", { className: "zen-nav-item__title-text", children: title }) })) }));
106
105
  const trigger = collapsed ? (_jsx(Tooltip, { trigger: buttonElement, alignment: tooltipAlignment, children: title })) : (buttonElement);
107
106
  if (hasNestedItems) {
@@ -8,7 +8,7 @@ import { PageToolbarCollapsedItemsControl } from "../header/components/collapsed
8
8
  import { PageHeaderButtonDisplayName } from "./pageHeaderButton";
9
9
  import { PageHeaderMenuDisplayName } from "./pageHeaderMenu";
10
10
  import { getItemsFromFragments } from "./pageHeaderHelpers";
11
- import { createPortal } from "react-dom";
11
+ import { usePortal } from "../commonHelpers/hooks/usePortal";
12
12
  import { zen } from "../utils/zen";
13
13
  export const PageHeaderActions = ({ className = "", children }) => {
14
14
  var _a, _b;
@@ -32,10 +32,11 @@ export const PageHeaderActions = ({ className = "", children }) => {
32
32
  isMobile ? "zen-page-header-component__actions--mobile-portal" : "",
33
33
  className
34
34
  ]), children: [nonFittingElements.length > 0 ? moreButton : null, fittingElements] })) : null;
35
+ const modalRoot = ((_a = zen.document) === null || _a === void 0 ? void 0 : _a.fullscreenElement) || ((_b = zen.document) === null || _b === void 0 ? void 0 : _b.body);
36
+ const portal = usePortal(actionsContent, modalRoot);
35
37
  // For mobile, render actions in a portal at the bottom center of viewport
36
38
  if (isMobile && actionsContent) {
37
- const modalRoot = ((_a = zen.document) === null || _a === void 0 ? void 0 : _a.fullscreenElement) || ((_b = zen.document) === null || _b === void 0 ? void 0 : _b.body);
38
- return createPortal(actionsContent, modalRoot);
39
+ return portal;
39
40
  }
40
41
  return actionsContent;
41
42
  };
@@ -252,6 +252,9 @@ export const RangeRaw = props => {
252
252
  } else {
253
253
  defaultValueInner = defaultValue;
254
254
  }
255
+ const generatedId = useId();
256
+ const intId = id || generatedId;
257
+ const rangeErrorId = `${intId}-error`;
255
258
  const [isOpen, setIsOpen] = useState(false);
256
259
  const [currentValue, setCurrentValue] = useState(value);
257
260
  const [errorType, setErrorType] = useState(undefined);
@@ -400,14 +403,17 @@ export const RangeRaw = props => {
400
403
  const memoizedContent = useMemo(() => _jsxs("div", {
401
404
  className: "zen-range__fields-wrapper",
402
405
  children: [_jsxs("div", {
406
+ id: intId,
403
407
  ref: setFieldsContainerRef,
408
+ "aria-describedby": errorType !== undefined && directionState === "row" ? rangeErrorId : undefined,
404
409
  className: classNames(["zen-range__fields-container", directionState === "row" ? "zen-range__fields-container--row" : "zen-range__fields-container--column"]),
405
410
  children: [memoizedMinRangeField, memoizedMaxRangeField]
406
411
  }), errorType !== undefined && directionState === "row" ? _jsx(FormFieldError, {
412
+ id: rangeErrorId,
407
413
  className: "zen-range__error",
408
414
  error: [getErrorString("min", currentValue.min, translate, errorType, min, max) || "", getErrorString("max", currentValue.max, translate, errorType, min, max) || ""]
409
415
  }) : null]
410
- }), [setFieldsContainerRef, directionState, memoizedMinRangeField, memoizedMaxRangeField, errorType, currentValue.min, currentValue.max, translate, min, max]);
416
+ }), [setFieldsContainerRef, directionState, memoizedMinRangeField, memoizedMaxRangeField, errorType, currentValue.min, currentValue.max, translate, min, max, intId, rangeErrorId]);
411
417
  const memoizedDesktopView = useMemo(() => _jsx(ControlledPopup, {
412
418
  isOpen: isOpen,
413
419
  className: classNames(["zen-range-popup zen-shadow-dropdown-default", className ? className : ""]),
@@ -45,7 +45,7 @@ export const SelectList = (_a) => {
45
45
  dispatchState({ type: ListAction.Reset, payload: { items, value: new Map(parsedValue), multiselect } });
46
46
  }, [innerValue, multiselect, items]);
47
47
  useEffect(() => {
48
- if (!multiselect) {
48
+ if (!multiselect && selectItemOnFocus) {
49
49
  dispatchState({ type: ListAction.FocusFirst, payload: { items } });
50
50
  }
51
51
  dispatchState({ type: ListAction.Focus, payload: { items, multiselect } });
@@ -56,14 +56,18 @@ export const SelectList = (_a) => {
56
56
  const onChangeItem = useCallback((updatedId, updatedState) => {
57
57
  dispatchState({ type: ListAction.ChangeItemState, payload: { updatedId, updatedState, multiselect } });
58
58
  }, [multiselect]);
59
+ const hasScrolledToInitial = useRef(false);
59
60
  useEffect(() => {
60
61
  var _a;
61
- if (state.activeIndex >= 0 &&
62
- ((_a = zen.document) === null || _a === void 0 ? void 0 : _a.activeElement) &&
63
- listRef.current &&
64
- isChildOf(zen.document.activeElement, listRef.current)) {
65
- const itemEl = listRef.current.querySelector(`.zen-select-list__item:nth-child(${state.activeIndex + 1})`);
66
- itemEl === null || itemEl === void 0 ? void 0 : itemEl.scrollIntoView({ block: "nearest" });
62
+ if (state.activeIndex >= 0 && listRef.current) {
63
+ const isFocusInList = ((_a = zen.document) === null || _a === void 0 ? void 0 : _a.activeElement) && isChildOf(zen.document.activeElement, listRef.current);
64
+ if (isFocusInList || !hasScrolledToInitial.current) {
65
+ const itemEl = listRef.current.querySelector(`.zen-select-list__item:nth-child(${state.activeIndex + 1})`);
66
+ itemEl === null || itemEl === void 0 ? void 0 : itemEl.scrollIntoView({ block: "nearest" });
67
+ if (itemEl) {
68
+ hasScrolledToInitial.current = true;
69
+ }
70
+ }
67
71
  }
68
72
  }, [state.activeIndex]);
69
73
  useEffect(() => {
@@ -147,6 +147,6 @@ export const SelectRaw = (props) => {
147
147
  "zen-ellipsis",
148
148
  "zen-caption__content",
149
149
  !selectValue ? "zen-select__text--placeholder" : ""
150
- ]), children: text }), _jsx(IconChevronDownSmall, { className: "zen-select__arrow zen-caption__post-content", size: "large" })] }), _jsx(Absolute, { recalculateOnScroll: true, className: classNames(["zen-select__popup", classNamePopup || ""]), triggerRef: innerTriggerRef, id: popupId, isOpen: isOpen, onOpenChange: onPopupVisibilityChange, children: _jsx(PassiveSelectListComp, { id: listId, title: title, disabled: disabled, multiselect: false, items: items.map(item => (Object.assign(Object.assign({}, item), { state: selectValue === item.id ? CheckboxState.On : CheckboxState.Off }))), value: new Map(items.map(item => [item.id, selectValue === item.id ? CheckboxState.On : CheckboxState.Off])), activeIndex: state.activeIndex, size: pageSize, onChangeItem: onChangeItem, style: { width, minWidth, maxWidth } }) })] }));
150
+ ]), children: text }), _jsx(IconChevronDownSmall, { className: "zen-select__arrow zen-caption__post-content", size: "large" })] }), _jsx(Absolute, { recalculateOnScroll: true, className: classNames(["zen-select__popup", classNamePopup || ""]), triggerRef: innerTriggerRef, id: popupId, isOpen: isOpen, onOpenChange: onPopupVisibilityChange, focusOnOpen: false, children: _jsx(PassiveSelectListComp, { id: listId, title: title, disabled: disabled, multiselect: false, items: items.map(item => (Object.assign(Object.assign({}, item), { state: selectValue === item.id ? CheckboxState.On : CheckboxState.Off }))), value: new Map(items.map(item => [item.id, selectValue === item.id ? CheckboxState.On : CheckboxState.Off])), activeIndex: state.activeIndex, size: pageSize, onChangeItem: onChangeItem, style: { width, minWidth, maxWidth } }) })] }));
151
151
  };
152
152
  SelectRaw.displayName = "SelectRaw";
@@ -2,16 +2,18 @@ import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { useEffect } from "react";
3
3
  import { classNames } from "../commonHelpers/classNames/classNames";
4
4
  import { useFadeComponent } from "../utils/useFadeComponent";
5
- import { createPortal } from "react-dom";
5
+ import { usePortal } from "../commonHelpers/hooks/usePortal";
6
6
  import { zen } from "../utils/zen";
7
7
  export const Shield = ({ className, dataShieldId, isVisible }) => {
8
- var _a, _b;
8
+ var _a, _b, _c, _d;
9
9
  const { renderComponent, showContent, setIsOpen, handleTransitionEnd } = useFadeComponent(isVisible || false);
10
+ const container = (_d = (_b = (_a = zen.document) === null || _a === void 0 ? void 0 : _a.fullscreenElement) !== null && _b !== void 0 ? _b : (_c = zen.document) === null || _c === void 0 ? void 0 : _c.body) !== null && _d !== void 0 ? _d : undefined;
11
+ const portal = usePortal(_jsx("div", { onTransitionEnd: handleTransitionEnd, className: classNames(["zen-shield", "zen-shield-faded", showContent ? "zen-shield-faded--visible" : "", className !== null && className !== void 0 ? className : ""]), "data-shield-id": dataShieldId || "" }), container);
10
12
  useEffect(() => {
11
13
  setIsOpen(isVisible || false);
12
14
  }, [isVisible, setIsOpen]);
13
15
  if (!renderComponent && !isVisible) {
14
16
  return isVisible === undefined ? (_jsx("div", { className: classNames(["zen-shield", className !== null && className !== void 0 ? className : ""]), "data-shield-id": dataShieldId || "" })) : null;
15
17
  }
16
- return createPortal(_jsx("div", { onTransitionEnd: handleTransitionEnd, className: classNames(["zen-shield", "zen-shield-faded", showContent ? "zen-shield-faded--visible" : "", className !== null && className !== void 0 ? className : ""]), "data-shield-id": dataShieldId || "" }), ((_a = zen.document) === null || _a === void 0 ? void 0 : _a.fullscreenElement) || ((_b = zen.document) === null || _b === void 0 ? void 0 : _b.body));
18
+ return portal;
17
19
  };
@@ -18,7 +18,7 @@ import { isModalTarget } from "../modal/utils/isModalTarget";
18
18
  import { isBannerTarget } from "../banner/utils/isBannerTarget";
19
19
  import { useClientReady } from "../commonHelpers/hooks/useClientReady";
20
20
  import { zen } from "../utils/zen";
21
- import { createPortal } from "react-dom";
21
+ import { usePortal } from "../commonHelpers/hooks/usePortal";
22
22
  /* eslint-enable @typescript-eslint/naming-convention */
23
23
  const OVERLAY_TARGET_CHECKS = [isAlertTarget, isToastTarget, isModalTarget, isBannerTarget];
24
24
  export const isChildPopup = (target, stopElement) => {
@@ -171,14 +171,8 @@ export const SidePanel = ({ label, className, id, isOpen, onHidePanel, children,
171
171
  }
172
172
  return attributes;
173
173
  }, [role, label]);
174
- if (!renderComponent && !isOpen) {
175
- return null;
176
- }
177
- if (!isClientReady) {
178
- return undefined;
179
- }
180
174
  const portalContainer = ((_a = zen.document) === null || _a === void 0 ? void 0 : _a.fullscreenElement) || ((_b = zen.document) === null || _b === void 0 ? void 0 : _b.body);
181
- return createPortal(_jsx("div", Object.assign({ ref: sidePanelRef, id: popupId }, memoizedStyles, roleAttributes, { onTransitionEnd: handleTransitionEnd, className: classNames([
175
+ const portal = usePortal(_jsx("div", Object.assign({ ref: sidePanelRef, id: popupId }, memoizedStyles, roleAttributes, { onTransitionEnd: handleTransitionEnd, className: classNames([
182
176
  "zen-side-panel",
183
177
  driveClassName || "",
184
178
  dark ? "zen-dark" : "",
@@ -186,5 +180,12 @@ export const SidePanel = ({ label, className, id, isOpen, onHidePanel, children,
186
180
  positioningClass,
187
181
  className !== null && className !== void 0 ? className : ""
188
182
  ]), children: memoizedChildForRender })), portalContainer);
183
+ if (!renderComponent && !isOpen) {
184
+ return null;
185
+ }
186
+ if (!isClientReady) {
187
+ return undefined;
188
+ }
189
+ return portal;
189
190
  };
190
191
  SidePanel.Cell = SidePanelCell;
@@ -1,5 +1,5 @@
1
1
  import { ReactElement, ReactNode, RefObject } from "react";
2
- export declare const useTableChildren: (children: ReactNode, isMobile: boolean, selected: number, allSelected: boolean, clearSelection: () => void, selectAll: () => void, turnOffSelectAll?: boolean, activeId?: string, gridRef?: RefObject<HTMLElement | null>, onCloseDetailPanel?: () => void) => {
2
+ export declare const useTableChildren: (children: ReactNode, isMobile: boolean, selected: number, allSelected: boolean, clearSelection: () => void, activeId?: string, gridRef?: RefObject<HTMLElement | null>, onCloseDetailPanel?: () => void) => {
3
3
  bulkActions: ReactElement<unknown, string | import("react").JSXElementConstructor<any>> | undefined;
4
4
  pagination: ReactElement<unknown, string | import("react").JSXElementConstructor<any>> | undefined;
5
5
  activePage: number | undefined;
@@ -24,7 +24,7 @@ const isChildElement = function (child, expectedType) {
24
24
  }
25
25
  return false;
26
26
  };
27
- export const useTableChildren = (children, isMobile, selected, allSelected, clearSelection, selectAll, turnOffSelectAll, activeId, gridRef, onCloseDetailPanel) => useMemo(() => {
27
+ export const useTableChildren = (children, isMobile, selected, allSelected, clearSelection, activeId, gridRef, onCloseDetailPanel) => useMemo(() => {
28
28
  let bulkActions = undefined;
29
29
  let tablePagination = undefined;
30
30
  let activePage = undefined;
@@ -39,7 +39,7 @@ export const useTableChildren = (children, isMobile, selected, allSelected, clea
39
39
  }
40
40
  if (isChildElement(child, TableBulkActions.displayName)) {
41
41
  const bulkActionButtons = child.props.children || [];
42
- bulkActions = (_jsx(BulkActions, { gridType: isMobile ? DeviceType.Mobile : DeviceType.Desktop, selected: selected, allSelected: allSelected, onClearSelection: clearSelection, onSelectAll: selectAll, turnOffSelectAll: turnOffSelectAll, children: bulkActionButtons }));
42
+ bulkActions = (_jsx(BulkActions, { gridType: isMobile ? DeviceType.Mobile : DeviceType.Desktop, selected: selected, allSelected: allSelected, onClearSelection: clearSelection, children: bulkActionButtons }));
43
43
  return;
44
44
  }
45
45
  if (isChildElement(child, TablePagination.displayName)) {
@@ -100,4 +100,4 @@ export const useTableChildren = (children, isMobile, selected, allSelected, clea
100
100
  detailPanel: detailPanel,
101
101
  other: other
102
102
  };
103
- }, [children, clearSelection, isMobile, selected, gridRef, allSelected, selectAll, turnOffSelectAll, activeId, onCloseDetailPanel]);
103
+ }, [children, clearSelection, isMobile, selected, gridRef, allSelected, activeId, onCloseDetailPanel]);
@@ -10,6 +10,8 @@ import { ColumnSettingsStorage } from "./columnSettingsStorage";
10
10
  import { ActionsColumn } from "../../dataGrid/columns/actionsColumn/actionsColumn";
11
11
  import { mergeColumnsSettings } from "./mergeColumnSettings";
12
12
  import { zen } from "../../utils/zen";
13
+ import { SelectableWrapperName } from "../selectable/useSelectableRows";
14
+ import { NestedWrapperName } from "../nested/useNestedRows";
13
15
  export const getColumnSettings = (pageName, defaultValue) => {
14
16
  // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
15
17
  const storage = new ColumnSettingsStorage(pageName || "", zen === null || zen === void 0 ? void 0 : zen.localStorage, defaultValue);
@@ -42,11 +44,12 @@ export const useFlexibleColumns = (columns, flexible, gridRef, columnsPopupRef,
42
44
  onChangeColumnSettings(newSettings);
43
45
  }, [onChangeColumnSettings, saveSettingsToTheStorage]);
44
46
  const flexibleColumns = useMemo(() => {
47
+ var _a, _b, _c, _d, _e;
45
48
  if (!flexible) {
46
49
  return columns;
47
50
  }
48
51
  const visibleColumnsMap = new Map(columns.map(c => [c.id, c]));
49
- return columnSettings
52
+ const result = columnSettings
50
53
  .map((s, index) => {
51
54
  var _a;
52
55
  const column = visibleColumnsMap.get(s.name);
@@ -63,6 +66,41 @@ export const useFlexibleColumns = (columns, flexible, gridRef, columnsPopupRef,
63
66
  return Object.assign(Object.assign({}, column), { meta: Object.assign(Object.assign({}, (column.meta || {})), { defaultWidth: width }), wrappers: [...wrappers, wrapper] });
64
67
  })
65
68
  .filter(c => c !== undefined);
69
+ // Ensure selectable and nested wrappers are always on the first visible column
70
+ if (result.length > 0) {
71
+ const pinnedWrapperWidth = 32;
72
+ let widthDelta = 0;
73
+ let donorCol = undefined;
74
+ for (const wrapperName of [NestedWrapperName, SelectableWrapperName]) {
75
+ if ((_a = result[0].wrappers) === null || _a === void 0 ? void 0 : _a.some(w => w.name === wrapperName)) {
76
+ continue;
77
+ }
78
+ let pinnedWrapper;
79
+ for (const col of result.slice(1)) {
80
+ if (col.wrappers) {
81
+ const found = col.wrappers.find(w => w.name === wrapperName);
82
+ if (found) {
83
+ pinnedWrapper = found;
84
+ donorCol = donorCol !== null && donorCol !== void 0 ? donorCol : col;
85
+ widthDelta += pinnedWrapperWidth;
86
+ col.wrappers = col.wrappers.filter(w => w.name !== wrapperName);
87
+ break;
88
+ }
89
+ }
90
+ }
91
+ if (pinnedWrapper) {
92
+ result[0].wrappers = [...(result[0].wrappers || []), pinnedWrapper];
93
+ }
94
+ }
95
+ if (widthDelta > 0) {
96
+ result[0] = Object.assign(Object.assign({}, result[0]), { meta: Object.assign(Object.assign({}, (result[0].meta || {})), { defaultWidth: ((_c = (_b = result[0].meta) === null || _b === void 0 ? void 0 : _b.defaultWidth) !== null && _c !== void 0 ? _c : 0) + widthDelta }) });
97
+ if (donorCol) {
98
+ const donorIndex = result.indexOf(donorCol);
99
+ result[donorIndex] = Object.assign(Object.assign({}, donorCol), { meta: Object.assign(Object.assign({}, (donorCol.meta || {})), { defaultWidth: Math.max(0, ((_e = (_d = donorCol.meta) === null || _d === void 0 ? void 0 : _d.defaultWidth) !== null && _e !== void 0 ? _e : 0) - widthDelta) }) });
100
+ }
101
+ }
102
+ }
103
+ return result;
66
104
  }, [columnSettings, columns, flexible]);
67
105
  const columnsPopup = useMemo(() => {
68
106
  if (!flexible) {
@@ -3,6 +3,7 @@ import { IListColumn } from "../../dataGrid/listColumn";
3
3
  import { IRowEntity } from "../../dataGrid/row/row";
4
4
  import "./nestedButton.less";
5
5
  import { IEntityWithId } from "../../commonHelpers/entity";
6
+ export declare const NestedWrapperName = "Nested";
6
7
  export declare const useNestedRows: <T extends IRowEntity<N>, N extends IEntityWithId>(expandedRows: string[] | undefined, onExpand: ((id: string, isExpanded: boolean) => void) | undefined, columns: IListColumn<T, N>[], isMobile: boolean) => {
7
8
  nestedColumns: {
8
9
  id: string;
@@ -58,7 +58,7 @@ injectString("zh-Hans", "Expand", "\u5C55\u5F00");
58
58
  injectString("zh-TW", "Expand", "\u5C55\u958B");
59
59
  injectString("ro-RO", "Expand", "Extinde\u021Bi");
60
60
  injectString("ar-SA", "Expand", "\u062A\u0648\u0633\u064A\u0639");
61
- const NestedWrapperName = "Nested";
61
+ export const NestedWrapperName = "Nested";
62
62
  export const useNestedRows = (expandedRows, onExpand, columns, isMobile) => {
63
63
  const {
64
64
  translate
@@ -16,6 +16,14 @@ export interface ISelectableRowsOptions<T extends IRowEntity<N>, N extends IEnti
16
16
  checkboxTitle?: (entity: T | N) => string;
17
17
  headerTitle?: (state: SelectionState) => string;
18
18
  turnOffSelectAll?: boolean;
19
+ /**
20
+ * When `true`, the header checkbox emits the current page's IDs instead of `{ all: true }`.
21
+ * When `undefined`, falls back to `turnOffSelectAll` for backward compatibility.
22
+ *
23
+ * Note: avoid setting this to `false` alongside `turnOffSelectAll: true` — the checkbox
24
+ * will emit `{ all: true }` while the dropdown hides the "Select all" option, which is inconsistent.
25
+ */
26
+ checkboxSelectsCurrentPage?: boolean;
19
27
  checkboxPlaceholder?: boolean;
20
28
  strategy?: TSelectionStrategy;
21
29
  selectAll?: boolean;
@@ -24,6 +32,7 @@ export declare const getEmptySelection: () => {
24
32
  all: boolean;
25
33
  selected: string[];
26
34
  };
35
+ export declare const SelectableWrapperName = "Selectable";
27
36
  export declare const useSelectableRows: <T extends IRowEntity<N>, N extends IEntityWithId>(columns: IListColumn<T, N>[], entities: T[], isMobile: boolean, selectMode: boolean, setSelectMode: (value: boolean) => void, selectable?: ISelectableRowsOptions<T, N>) => {
28
37
  selectableColumns: IListColumn<T, N>[];
29
38
  selectableFeedWrapper: (primaryData: ReactNode, secondaryData: ReactNode, entity: T | N, isNested: boolean) => [ReactNode, ReactNode];
@@ -68,7 +68,7 @@ export const getEmptySelection = () => ({
68
68
  all: false,
69
69
  selected: []
70
70
  });
71
- const SelectableWrapperName = "Selectable";
71
+ export const SelectableWrapperName = "Selectable";
72
72
  export const useSelectableRows = (columns, entities, isMobile, selectMode, setSelectMode, selectable) => {
73
73
  var _a;
74
74
  const {
@@ -157,7 +157,6 @@ export const useSelectableRows = (columns, entities, isMobile, selectMode, setSe
157
157
  return;
158
158
  }
159
159
  const newSelections = getCurrentPageSelection(entities, selectable);
160
- setState(newState);
161
160
  const newValue = {
162
161
  selected: [...newSelections],
163
162
  all: false
@@ -176,8 +175,16 @@ export const useSelectableRows = (columns, entities, isMobile, selectMode, setSe
176
175
  return translate("Deselect all");
177
176
  }, [selectable, selectableState, state, translate]);
178
177
  const isEntityChecked = useCallback((entity, isNested) => isRowChecked(selections, state, selectable === null || selectable === void 0 ? void 0 : selectable.strategy, entity, isNested), [selections, state, selectable === null || selectable === void 0 ? void 0 : selectable.strategy]);
178
+ const hasSelectable = !!selectable;
179
+ const selectableCheckboxSelectsCurrentPage = selectable === null || selectable === void 0 ? void 0 : selectable.checkboxSelectsCurrentPage;
180
+ const selectableTurnOffSelectAll = selectable === null || selectable === void 0 ? void 0 : selectable.turnOffSelectAll;
181
+ const selectableCheckboxInHeader = selectable === null || selectable === void 0 ? void 0 : selectable.checkboxInHeader;
182
+ const selectableSelectionLimit = selectable === null || selectable === void 0 ? void 0 : selectable.selectionLimit;
183
+ const selectableHeader = selectable === null || selectable === void 0 ? void 0 : selectable.header;
184
+ const checkboxEmitsCurrentPage = selectableCheckboxSelectsCurrentPage !== null && selectableCheckboxSelectsCurrentPage !== void 0 ? selectableCheckboxSelectsCurrentPage : selectableTurnOffSelectAll;
185
+ const checkboxInHeaderValue = selectableCheckboxInHeader !== undefined ? selectableCheckboxInHeader : selectableSelectionLimit !== undefined ? false : undefined;
179
186
  const wrapper = useMemo(() => {
180
- if (!selectable) {
187
+ if (!hasSelectable) {
181
188
  return null;
182
189
  }
183
190
  return {
@@ -219,23 +226,23 @@ export const useSelectableRows = (columns, entities, isMobile, selectMode, setSe
219
226
  checked: state === SelectionState.CurrentPage || state === SelectionState.All,
220
227
  indeterminate: state === SelectionState.Partial,
221
228
  onChange: newValue => {
222
- const newState = newValue ? selectable.turnOffSelectAll ? SelectionState.CurrentPage : SelectionState.All : SelectionState.None;
229
+ const newState = newValue ? checkboxEmitsCurrentPage ? SelectionState.CurrentPage : SelectionState.All : SelectionState.None;
223
230
  setState(newState);
224
231
  onChangeSelectionState(newState);
225
232
  },
226
233
  calculateSelectionState: () => selectableState,
227
- checkboxInHeader: selectable.checkboxInHeader !== undefined ? selectable.checkboxInHeader : selectable.selectionLimit !== undefined ? false : undefined,
228
- header: selectable.header,
234
+ checkboxInHeader: checkboxInHeaderValue,
235
+ header: selectableHeader,
229
236
  onSelect: newState => {
230
237
  setState(newState);
231
238
  onChangeSelectionState(newState);
232
239
  },
233
- turnOffSelectAll: selectable.turnOffSelectAll
240
+ turnOffSelectAll: selectableTurnOffSelectAll
234
241
  });
235
242
  return cell;
236
243
  }
237
244
  };
238
- }, [checkboxDisabled, checkboxTitle, checkboxVisible, headerTitle, onChangeSelectionState, onSelectListener, selectable, selectableState, state, isMobile, checkboxPlaceholder, isEntityChecked]);
245
+ }, [checkboxDisabled, checkboxTitle, checkboxVisible, headerTitle, onChangeSelectionState, onSelectListener, hasSelectable, checkboxEmitsCurrentPage, checkboxInHeaderValue, selectableHeader, selectableTurnOffSelectAll, selectableState, state, isMobile, checkboxPlaceholder, isEntityChecked]);
239
246
  const selectableFeedWrapper = useCallback((primaryData, secondaryData, entity, isNested) => {
240
247
  // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
241
248
  if (!entity) {