@geotab/zenith 3.9.2 → 3.10.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 (244) hide show
  1. package/README.md +15 -3
  2. package/dist/absolute/absolute.d.ts +7 -1
  3. package/dist/absolute/absolute.js +8 -4
  4. package/dist/alertRaw/alertRaw.js +4 -4
  5. package/dist/alertRaw/components/alertAnimation.js +2 -2
  6. package/dist/banner/bannerMultipLine.js +4 -4
  7. package/dist/banner/bannerSingleLine.js +4 -4
  8. package/dist/betaPill/betaPill.d.ts +4 -9
  9. package/dist/betaPill/betaPill.js +7 -8
  10. package/dist/bookmark/bookmark.d.ts +2 -1
  11. package/dist/bookmark/bookmark.js +4 -2
  12. package/dist/card/components/cardButton/cardButton.d.ts +2 -1
  13. package/dist/card/components/cardButton/cardButton.js +3 -3
  14. package/dist/checkbox/checkbox.js +2 -2
  15. package/dist/commonStyles/rangeFieldMixin.less +9 -9
  16. package/dist/controlledPopup/controlledPopup.d.ts +2 -1
  17. package/dist/controlledPopup/controlledPopup.js +2 -2
  18. package/dist/dataFeed/hooks/useVisibleColumns.js +1 -1
  19. package/dist/dataGrid/extensions/toBasicColumn.js +2 -1
  20. package/dist/dataGrid/listColumn.d.ts +1 -0
  21. package/dist/dataGrid/withFlexibleColumns/components/columnSettingsList.d.ts +2 -2
  22. package/dist/dataGrid/withFlexibleColumns/components/columnSettingsList.js +5 -5
  23. package/dist/dataGrid/withFlexibleColumns/withFlexibleColumns.js +15 -6
  24. package/dist/dialog/dialogContent.js +4 -4
  25. package/dist/dropdownRaw/dropdownHelper.d.ts +4 -1
  26. package/dist/dropdownRaw/dropdownHelper.js +2 -1
  27. package/dist/dropdownRaw/dropdownRaw.js +2 -2
  28. package/dist/dropdownRaw/dropdownTrigger.d.ts +1 -1
  29. package/dist/dropdownRaw/dropdownTrigger.js +1 -1
  30. package/dist/fileUpload/components/uploadedFilesSection.js +3 -3
  31. package/dist/filters/components/filtersSavedChipComponent.js +3 -3
  32. package/dist/filters/components/filtersSearchItemData.js +3 -3
  33. package/dist/filters/components/filtersSidePanel.js +4 -4
  34. package/dist/filtersBar/filtersBarSidePanel/filtersBarSidePanel.js +4 -4
  35. package/dist/formGroup/components/reviewListToggle/reviewListToggle.js +13 -13
  36. package/dist/groupsFilterRaw/groupsFilterInitialState.js +1 -1
  37. package/dist/headerTitle/headerTitle.d.ts +3 -9
  38. package/dist/headerTitle/headerTitle.js +2 -3
  39. package/dist/icons/iconAlignLeft.js +3 -1
  40. package/dist/icons/iconAlignmentLeft.js +3 -1
  41. package/dist/icons/iconAlignmentRight.js +3 -1
  42. package/dist/icons/iconArrowBottomLeft.js +3 -1
  43. package/dist/icons/iconArrowBottomRight.js +3 -1
  44. package/dist/icons/iconArrowLeftPath.js +3 -1
  45. package/dist/icons/iconArrowRight.js +3 -1
  46. package/dist/icons/iconArrowRightCircle.js +3 -1
  47. package/dist/icons/iconArrowRightPath.js +3 -1
  48. package/dist/icons/iconArrowTopLeft.js +3 -1
  49. package/dist/icons/iconArrowTopRight.js +3 -1
  50. package/dist/icons/iconChevronDoubleRight.js +3 -1
  51. package/dist/icons/iconChevronRight.js +3 -1
  52. package/dist/icons/iconChevronRightSmall.js +3 -1
  53. package/dist/icons/iconCornerDownLeft.js +3 -1
  54. package/dist/icons/iconCornerDownRight.js +3 -1
  55. package/dist/icons/iconCornerLeftDown.js +3 -1
  56. package/dist/icons/iconCornerLeftUp.js +3 -1
  57. package/dist/icons/iconCornerRightDown.js +3 -1
  58. package/dist/icons/iconCornerRightUp.js +3 -1
  59. package/dist/icons/iconCornerUpLeft.js +3 -1
  60. package/dist/icons/iconCornerUpRight.js +3 -1
  61. package/dist/icons/iconLayoutSidebar.js +3 -1
  62. package/dist/icons/iconPinFilled.d.ts +3 -0
  63. package/dist/icons/iconPinFilled.js +12 -0
  64. package/dist/icons/iconSidebar.js +3 -1
  65. package/dist/icons/iconUndock.js +3 -1
  66. package/dist/index.css +556 -504
  67. package/dist/index.d.ts +1 -0
  68. package/dist/index.js +8 -6
  69. package/dist/list/listItem/listItem.d.ts +3 -1
  70. package/dist/list/listItem/listItem.js +4 -2
  71. package/dist/menu/controlledMenu.d.ts +1 -0
  72. package/dist/menu/controlledMenu.js +2 -2
  73. package/dist/mobileSheet/mobileSheet.js +4 -4
  74. package/dist/modal/modal.js +4 -4
  75. package/dist/nav/nav.d.ts +7 -1
  76. package/dist/nav/nav.js +11 -6
  77. package/dist/nav/navEmpty/navEmpty.d.ts +10 -0
  78. package/dist/nav/navEmpty/navEmpty.js +7 -0
  79. package/dist/notification/notification.js +4 -4
  80. package/dist/notification/pushNotification/pushNotification.js +1 -1
  81. package/dist/pill/components/pillNonActionable/pillNonActionable.js +4 -4
  82. package/dist/pillExpandable/pillExpandable.js +4 -4
  83. package/dist/table/detailPanel/detailPanelHeader.js +4 -4
  84. package/dist/table/flexible/columnsList.d.ts +1 -2
  85. package/dist/table/flexible/columnsList.js +6 -5
  86. package/dist/table/flexible/columnsPopup.js +0 -3
  87. package/dist/table/flexible/useFlexibleColumns.d.ts +1 -0
  88. package/dist/table/flexible/useFlexibleColumns.js +4 -3
  89. package/dist/table/loading/useLoading.d.ts +1 -0
  90. package/dist/table/loading/useLoading.js +1 -1
  91. package/dist/table/nested/useNestedRows.d.ts +1 -0
  92. package/dist/table/selectable/useSelectableRows.js +23 -5
  93. package/dist/table/table.d.ts +1 -0
  94. package/dist/table/table.js +7 -2
  95. package/dist/tabs/tabItem/tabItem.d.ts +2 -1
  96. package/dist/tabs/tabItem/tabItem.js +4 -2
  97. package/dist/tabs/tabs.d.ts +1 -0
  98. package/dist/tabs/tabs.js +2 -1
  99. package/dist/toastRaw/components/toastAnimation.js +2 -2
  100. package/dist/toastRaw/toastRaw.js +4 -4
  101. package/dist/toggleButtonRaw/toggleButtonRaw.js +13 -13
  102. package/dist/tooltip/tooltip.js +4 -4
  103. package/dist/utils/localization/flipAlignment.d.ts +2 -0
  104. package/dist/utils/localization/flipAlignment.js +19 -0
  105. package/dist/utils/localization/makeLanguageWrapper.d.ts +8 -0
  106. package/dist/utils/localization/makeLanguageWrapper.js +11 -0
  107. package/dist/utils/localization/translations/cs.json +2 -2
  108. package/dist/utils/localization/translations/da-DK.json +2 -2
  109. package/dist/utils/localization/translations/es.json +2 -2
  110. package/dist/utils/localization/translations/fi-FI.json +1 -1
  111. package/dist/utils/localization/translations/hu-HU.json +2 -2
  112. package/dist/utils/localization/translations/ko-KR.json +2 -2
  113. package/dist/utils/localization/translations/ms.json +1 -1
  114. package/dist/utils/localization/translations/nb-NO.json +1 -1
  115. package/dist/utils/localization/translations/pt-BR.json +2 -2
  116. package/dist/utils/localization/translations/pt-PT.json +3 -3
  117. package/dist/utils/localization/translations/ro-RO.json +5 -5
  118. package/dist/utils/localization/translations/sk-SK.json +1 -1
  119. package/dist/utils/localization/translations/zh-Hans.json +1 -1
  120. package/dist/utils/localization/useIsRTL.d.ts +1 -0
  121. package/dist/utils/localization/useIsRTL.js +6 -0
  122. package/dist/utils/localization/useRTLAlignment.d.ts +2 -0
  123. package/dist/utils/localization/useRTLAlignment.js +10 -0
  124. package/esm/absolute/absolute.d.ts +7 -1
  125. package/esm/absolute/absolute.js +8 -4
  126. package/esm/alertRaw/alertRaw.js +4 -4
  127. package/esm/alertRaw/components/alertAnimation.js +2 -2
  128. package/esm/banner/bannerMultipLine.js +4 -4
  129. package/esm/banner/bannerSingleLine.js +4 -4
  130. package/esm/betaPill/betaPill.d.ts +4 -9
  131. package/esm/betaPill/betaPill.js +7 -8
  132. package/esm/bookmark/bookmark.d.ts +2 -1
  133. package/esm/bookmark/bookmark.js +4 -2
  134. package/esm/card/components/cardButton/cardButton.d.ts +2 -1
  135. package/esm/card/components/cardButton/cardButton.js +3 -3
  136. package/esm/checkbox/checkbox.js +2 -2
  137. package/esm/controlledPopup/controlledPopup.d.ts +2 -1
  138. package/esm/controlledPopup/controlledPopup.js +2 -2
  139. package/esm/dataFeed/hooks/useVisibleColumns.js +1 -1
  140. package/esm/dataGrid/extensions/toBasicColumn.js +2 -1
  141. package/esm/dataGrid/listColumn.d.ts +1 -0
  142. package/esm/dataGrid/withFlexibleColumns/components/columnSettingsList.d.ts +2 -2
  143. package/esm/dataGrid/withFlexibleColumns/components/columnSettingsList.js +5 -5
  144. package/esm/dataGrid/withFlexibleColumns/withFlexibleColumns.js +15 -6
  145. package/esm/dialog/dialogContent.js +4 -4
  146. package/esm/dropdownRaw/dropdownHelper.d.ts +4 -1
  147. package/esm/dropdownRaw/dropdownHelper.js +2 -1
  148. package/esm/dropdownRaw/dropdownRaw.js +2 -2
  149. package/esm/dropdownRaw/dropdownTrigger.d.ts +1 -1
  150. package/esm/dropdownRaw/dropdownTrigger.js +1 -1
  151. package/esm/fileUpload/components/uploadedFilesSection.js +3 -3
  152. package/esm/filters/components/filtersSavedChipComponent.js +3 -3
  153. package/esm/filters/components/filtersSearchItemData.js +3 -3
  154. package/esm/filters/components/filtersSidePanel.js +4 -4
  155. package/esm/filtersBar/filtersBarSidePanel/filtersBarSidePanel.js +4 -4
  156. package/esm/formGroup/components/reviewListToggle/reviewListToggle.js +13 -13
  157. package/esm/groupsFilterRaw/groupsFilterInitialState.js +1 -1
  158. package/esm/headerTitle/headerTitle.d.ts +3 -9
  159. package/esm/headerTitle/headerTitle.js +2 -3
  160. package/esm/icons/iconAlignLeft.js +3 -1
  161. package/esm/icons/iconAlignmentLeft.js +3 -1
  162. package/esm/icons/iconAlignmentRight.js +3 -1
  163. package/esm/icons/iconArrowBottomLeft.js +3 -1
  164. package/esm/icons/iconArrowBottomRight.js +3 -1
  165. package/esm/icons/iconArrowLeftPath.js +3 -1
  166. package/esm/icons/iconArrowRight.js +3 -1
  167. package/esm/icons/iconArrowRightCircle.js +3 -1
  168. package/esm/icons/iconArrowRightPath.js +3 -1
  169. package/esm/icons/iconArrowTopLeft.js +3 -1
  170. package/esm/icons/iconArrowTopRight.js +3 -1
  171. package/esm/icons/iconChevronDoubleRight.js +3 -1
  172. package/esm/icons/iconChevronRight.js +3 -1
  173. package/esm/icons/iconChevronRightSmall.js +3 -1
  174. package/esm/icons/iconCornerDownLeft.js +3 -1
  175. package/esm/icons/iconCornerDownRight.js +3 -1
  176. package/esm/icons/iconCornerLeftDown.js +3 -1
  177. package/esm/icons/iconCornerLeftUp.js +3 -1
  178. package/esm/icons/iconCornerRightDown.js +3 -1
  179. package/esm/icons/iconCornerRightUp.js +3 -1
  180. package/esm/icons/iconCornerUpLeft.js +3 -1
  181. package/esm/icons/iconCornerUpRight.js +3 -1
  182. package/esm/icons/iconLayoutSidebar.js +3 -1
  183. package/esm/icons/iconPinFilled.d.ts +3 -0
  184. package/esm/icons/iconPinFilled.js +8 -0
  185. package/esm/icons/iconSidebar.js +3 -1
  186. package/esm/icons/iconUndock.js +3 -1
  187. package/esm/index.d.ts +1 -0
  188. package/esm/index.js +1 -0
  189. package/esm/list/listItem/listItem.d.ts +3 -1
  190. package/esm/list/listItem/listItem.js +4 -2
  191. package/esm/menu/controlledMenu.d.ts +1 -0
  192. package/esm/menu/controlledMenu.js +2 -2
  193. package/esm/mobileSheet/mobileSheet.js +4 -4
  194. package/esm/modal/modal.js +4 -4
  195. package/esm/nav/nav.d.ts +7 -1
  196. package/esm/nav/nav.js +11 -6
  197. package/esm/nav/navEmpty/navEmpty.d.ts +10 -0
  198. package/esm/nav/navEmpty/navEmpty.js +3 -0
  199. package/esm/notification/notification.js +4 -4
  200. package/esm/notification/pushNotification/pushNotification.js +1 -1
  201. package/esm/pill/components/pillNonActionable/pillNonActionable.js +4 -4
  202. package/esm/pillExpandable/pillExpandable.js +4 -4
  203. package/esm/table/detailPanel/detailPanelHeader.js +4 -4
  204. package/esm/table/flexible/columnsList.d.ts +1 -2
  205. package/esm/table/flexible/columnsList.js +6 -5
  206. package/esm/table/flexible/columnsPopup.js +0 -3
  207. package/esm/table/flexible/useFlexibleColumns.d.ts +1 -0
  208. package/esm/table/flexible/useFlexibleColumns.js +4 -3
  209. package/esm/table/loading/useLoading.d.ts +1 -0
  210. package/esm/table/loading/useLoading.js +1 -1
  211. package/esm/table/nested/useNestedRows.d.ts +1 -0
  212. package/esm/table/selectable/useSelectableRows.js +23 -5
  213. package/esm/table/table.d.ts +1 -0
  214. package/esm/table/table.js +7 -2
  215. package/esm/tabs/tabItem/tabItem.d.ts +2 -1
  216. package/esm/tabs/tabItem/tabItem.js +4 -2
  217. package/esm/tabs/tabs.d.ts +1 -0
  218. package/esm/tabs/tabs.js +2 -1
  219. package/esm/toastRaw/components/toastAnimation.js +2 -2
  220. package/esm/toastRaw/toastRaw.js +4 -4
  221. package/esm/toggleButtonRaw/toggleButtonRaw.js +13 -13
  222. package/esm/tooltip/tooltip.js +4 -4
  223. package/esm/utils/localization/flipAlignment.d.ts +2 -0
  224. package/esm/utils/localization/flipAlignment.js +15 -0
  225. package/esm/utils/localization/makeLanguageWrapper.d.ts +8 -0
  226. package/esm/utils/localization/makeLanguageWrapper.js +7 -0
  227. package/esm/utils/localization/translations/cs.json +2 -2
  228. package/esm/utils/localization/translations/da-DK.json +2 -2
  229. package/esm/utils/localization/translations/es.json +2 -2
  230. package/esm/utils/localization/translations/fi-FI.json +1 -1
  231. package/esm/utils/localization/translations/hu-HU.json +2 -2
  232. package/esm/utils/localization/translations/ko-KR.json +2 -2
  233. package/esm/utils/localization/translations/ms.json +1 -1
  234. package/esm/utils/localization/translations/nb-NO.json +1 -1
  235. package/esm/utils/localization/translations/pt-BR.json +2 -2
  236. package/esm/utils/localization/translations/pt-PT.json +3 -3
  237. package/esm/utils/localization/translations/ro-RO.json +5 -5
  238. package/esm/utils/localization/translations/sk-SK.json +1 -1
  239. package/esm/utils/localization/translations/zh-Hans.json +1 -1
  240. package/esm/utils/localization/useIsRTL.d.ts +1 -0
  241. package/esm/utils/localization/useIsRTL.js +2 -0
  242. package/esm/utils/localization/useRTLAlignment.d.ts +2 -0
  243. package/esm/utils/localization/useRTLAlignment.js +6 -0
  244. package/package.json +1 -1
@@ -20,7 +20,7 @@ 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";
23
- export const ControlledMenu = ({ children, isOpen, setIsOpen, triggerRef, ariaLabel, ariaLabelledby, id, title, className = "", listClassName = "", paddingX = 0, paddingY = 0, alignment }) => {
23
+ export const ControlledMenu = ({ children, isOpen, setIsOpen, triggerRef, ariaLabel, ariaLabelledby, id, title, className = "", listClassName = "", paddingX = 0, paddingY = 0, alignment, closeOnScroll = true }) => {
24
24
  const [deviceType, setDeviceType] = useState(DeviceType.Desktop);
25
25
  const isMobile = deviceType === DeviceType.Mobile;
26
26
  const memoizedOnChange = useCallback(setIsOpen, [setIsOpen]);
@@ -215,7 +215,7 @@ export const ControlledMenu = ({ children, isOpen, setIsOpen, triggerRef, ariaLa
215
215
  if (isMobile) {
216
216
  return (_jsx(_Fragment, { children: _jsx(PathProvider, { path: path, onOpenBranch: onOpenBranch, closeBranch: closeBranch, navigatedViaKeyboardRef: navigatedViaKeyboardRef, keyboardActiveRef: keyboardActiveRef, children: _jsxs(MobileSheet, { label: title, isOpen: isOpen, triggerRef: triggerRef, onHidePanel: hideMenu, onCloseClick: hideMenu, children: [_jsx(MobileSheet.Title, { children: title }), _jsx(MobileSheet.Content, { children: renderMenuList() })] }) }) }));
217
217
  }
218
- return (_jsx(_Fragment, { children: _jsx(PathProvider, { path: path, onOpenBranch: onOpenBranch, closeBranch: closeBranch, navigatedViaKeyboardRef: navigatedViaKeyboardRef, keyboardActiveRef: keyboardActiveRef, children: _jsx(ControlledPopup, { id: id, useTrapFocusWithTrigger: "on", className: classNames(["zen-controlled-menu", className]), onOpenChange: memoizedOnChange, isOpen: isOpen, triggerRef: triggerRef, paddingX: paddingX, paddingY: paddingY, alignment: alignment, ariaLabelledby: ariaLabelledby, ariaLabel: ariaLabel || title, recalculateOnScroll: true,
218
+ return (_jsx(_Fragment, { children: _jsx(PathProvider, { path: path, onOpenBranch: onOpenBranch, closeBranch: closeBranch, navigatedViaKeyboardRef: navigatedViaKeyboardRef, keyboardActiveRef: keyboardActiveRef, children: _jsx(ControlledPopup, { id: id, useTrapFocusWithTrigger: "on", className: classNames(["zen-controlled-menu", className]), onOpenChange: memoizedOnChange, isOpen: isOpen, triggerRef: triggerRef, paddingX: paddingX, paddingY: paddingY, alignment: alignment, ariaLabelledby: ariaLabelledby, ariaLabel: ariaLabel || title, closeOnScroll: closeOnScroll,
219
219
  // focusOnOpen is false - ControlledMenu handles focus based on input method
220
220
  // (keyboard vs mouse) in its own useEffect
221
221
  focusOnOpen: false, children: renderMenuList() }) }) }));
@@ -51,10 +51,10 @@ injectString("da-DK", "Close", "Luk");
51
51
  injectString("de", "Close", "Schlie\xDFen");
52
52
  injectString("en", "Close", "Close");
53
53
  injectString("es", "Close", "Cerrar");
54
- injectString("fi-FI", "Close", "Sulje");
54
+ injectString("fi-FI", "Close", "Sulkea");
55
55
  injectString("fr", "Close", "Fermer");
56
56
  injectString("fr-FR", "Close", "Fermer");
57
- injectString("hu-HU", "Close", "Z\xE1rd be.");
57
+ injectString("hu-HU", "Close", "Bez\xE1r\xE1s");
58
58
  injectString("id", "Close", "Tutup");
59
59
  injectString("it", "Close", "Chiudere");
60
60
  injectString("ja", "Close", "\u9589\u3058\u308B");
@@ -65,13 +65,13 @@ injectString("nl", "Close", "Sluiten");
65
65
  injectString("pl", "Close", "Zamknij");
66
66
  injectString("pt-BR", "Close", "Fechar");
67
67
  injectString("pt-PT", "Close", "Fechar");
68
- injectString("sk-SK", "Close", "Zatvor");
68
+ injectString("sk-SK", "Close", "Zatvori\u0165");
69
69
  injectString("sv", "Close", "St\xE4ng");
70
70
  injectString("th", "Close", "\u0E1B\u0E34\u0E14");
71
71
  injectString("tr", "Close", "Kapat");
72
72
  injectString("zh-Hans", "Close", "\u5173\u95ED");
73
73
  injectString("zh-TW", "Close", "\u95DC\u9589");
74
- injectString("ro-RO", "Close", "\xCEnchide\u021Bi");
74
+ injectString("ro-RO", "Close", "\xCEnchide");
75
75
  injectString("ar-SA", "Close", "\u0625\u063A\u0644\u0627\u0642");
76
76
  export const MobileSheet = ({
77
77
  /* eslint-enable @typescript-eslint/naming-convention */
@@ -27,10 +27,10 @@ injectString("da-DK", "Close", "Luk");
27
27
  injectString("de", "Close", "Schlie\xDFen");
28
28
  injectString("en", "Close", "Close");
29
29
  injectString("es", "Close", "Cerrar");
30
- injectString("fi-FI", "Close", "Sulje");
30
+ injectString("fi-FI", "Close", "Sulkea");
31
31
  injectString("fr", "Close", "Fermer");
32
32
  injectString("fr-FR", "Close", "Fermer");
33
- injectString("hu-HU", "Close", "Z\xE1rd be.");
33
+ injectString("hu-HU", "Close", "Bez\xE1r\xE1s");
34
34
  injectString("id", "Close", "Tutup");
35
35
  injectString("it", "Close", "Chiudere");
36
36
  injectString("ja", "Close", "\u9589\u3058\u308B");
@@ -41,13 +41,13 @@ injectString("nl", "Close", "Sluiten");
41
41
  injectString("pl", "Close", "Zamknij");
42
42
  injectString("pt-BR", "Close", "Fechar");
43
43
  injectString("pt-PT", "Close", "Fechar");
44
- injectString("sk-SK", "Close", "Zatvor");
44
+ injectString("sk-SK", "Close", "Zatvori\u0165");
45
45
  injectString("sv", "Close", "St\xE4ng");
46
46
  injectString("th", "Close", "\u0E1B\u0E34\u0E14");
47
47
  injectString("tr", "Close", "Kapat");
48
48
  injectString("zh-Hans", "Close", "\u5173\u95ED");
49
49
  injectString("zh-TW", "Close", "\u95DC\u9589");
50
- injectString("ro-RO", "Close", "\xCEnchide\u021Bi");
50
+ injectString("ro-RO", "Close", "\xCEnchide");
51
51
  injectString("ar-SA", "Close", "\u0625\u063A\u0644\u0627\u0642");
52
52
  export const Modal = ({
53
53
  isOpen,
package/esm/nav/nav.d.ts CHANGED
@@ -1,5 +1,7 @@
1
1
  import { IZenComponentProps } from "../commonHelpers/zenComponent";
2
2
  import "./nav.less";
3
+ import { FC } from "react";
4
+ import { NavEmpty } from "./navEmpty/navEmpty";
3
5
  export interface INav extends IZenComponentProps {
4
6
  mobileBarContainer: HTMLElement | null;
5
7
  collapsed?: boolean;
@@ -8,8 +10,12 @@ export interface INav extends IZenComponentProps {
8
10
  isMobileMenuOpen?: boolean;
9
11
  onIsMobileMenuOpenToggle?: (isOpen: boolean) => void;
10
12
  onEditModeToggle?: (isEdit: boolean) => void;
13
+ showEmptyState?: boolean;
14
+ showSectionDividers?: boolean;
11
15
  }
12
16
  /**
13
17
  * @beta This component is not fully ready yet and may change in future releases.
14
18
  */
15
- export declare const Nav: ({ children, className, collapsed, onCollapseToggle, onMenuVisibilityToggle, mobileBarContainer, isMobileMenuOpen, onIsMobileMenuOpenToggle, onEditModeToggle }: INav) => import("react/jsx-runtime").JSX.Element;
19
+ export declare const Nav: FC<INav> & {
20
+ Empty: typeof NavEmpty;
21
+ };
package/esm/nav/nav.js CHANGED
@@ -10,6 +10,8 @@ import { NavMobileBar } from "./navMobileBar/navMobileBar";
10
10
  import { useMobile } from "../commonHelpers/hooks/useMobile";
11
11
  import { FOCUSABLE_SELECTOR } from "../utils/focusableSelector";
12
12
  import { zen } from "../utils/zen";
13
+ import { EmptyState } from "../emptyState/emptyState";
14
+ import { NavEmpty } from "./navEmpty/navEmpty";
13
15
  const NavContent = ({ children }) => {
14
16
  const { isEditState } = useNavContext();
15
17
  const contentRef = useRef(null);
@@ -51,7 +53,8 @@ const NavContent = ({ children }) => {
51
53
  /**
52
54
  * @beta This component is not fully ready yet and may change in future releases.
53
55
  */
54
- export const Nav = ({ children, className, collapsed = false, onCollapseToggle, onMenuVisibilityToggle, mobileBarContainer, isMobileMenuOpen = false, onIsMobileMenuOpenToggle, onEditModeToggle
56
+ // eslint-disable-next-line @typescript-eslint/naming-convention
57
+ export const Nav = ({ children, className, collapsed = false, onCollapseToggle, onMenuVisibilityToggle, mobileBarContainer, isMobileMenuOpen = false, onIsMobileMenuOpenToggle, onEditModeToggle, showEmptyState = false, showSectionDividers = true
55
58
  // eslint-disable-next-line complexity
56
59
  }) => {
57
60
  const menuRef = useRef(null);
@@ -88,8 +91,11 @@ export const Nav = ({ children, className, collapsed = false, onCollapseToggle,
88
91
  const secondaryFooter = footer && filterPrimaryNavItems(footer, true);
89
92
  const primaryFooter = footer && filterPrimaryNavItems(footer, false);
90
93
  const footerToRender = isEditState ? editFooter : isMobile ? secondaryFooter : footer;
94
+ const isCollapsedEmptyState = !isEditState && showEmptyState && collapsed && !isMobile;
95
+ const shouldRenderEmptyState = !isEditState && showEmptyState && !isCollapsedEmptyState;
91
96
  const primaryItems = [...primarySections, ...(primaryFooter ? [primaryFooter] : [])].flatMap(e => collectNavItems(e));
92
97
  const editListItems = childrenArray.find(child => { var _a; return ((_a = child.type) === null || _a === void 0 ? void 0 : _a.displayName) === "NavEditSection"; });
98
+ const navEmptyChild = childrenArray.find(child => { var _a; return ((_a = child.type) === null || _a === void 0 ? void 0 : _a.displayName) === "NavEmpty"; });
93
99
  const onSearchOpen = useCallback((isOpen) => {
94
100
  isOpen && onCollapseToggle && onCollapseToggle(false);
95
101
  setIsSearchOpen(isOpen || isMobile);
@@ -151,9 +157,8 @@ export const Nav = ({ children, className, collapsed = false, onCollapseToggle,
151
157
  className || ""
152
158
  ]), children: [header
153
159
  ? cloneElement(header, Object.assign(Object.assign({}, header.props), { className: classNames(["zen-nav__header", header.props.className || ""]) }))
154
- : null, _jsx(NavContent, { children: isEditState
155
- ? editListItems
156
- : sectionsToRender.map((section, index) => (_jsxs(Fragment, { children: [cloneElement(section, {
157
- className: classNames(["zen-nav__section", section.props.className || ""])
158
- }), isMobile || index < sectionsToRender.length - 1 ? _jsx(NavDivider, {}) : null] }, index))) }), footerToRender] })) : null, mobileBarContainer && isMobile && navMobileBarPortal] }));
160
+ : null, _jsx(NavContent, { children: isEditState ? (editListItems) : isCollapsedEmptyState ? null : shouldRenderEmptyState ? (_jsx("div", { className: "zen-nav__empty-state", children: _jsx(EmptyState, { description: navEmptyChild === null || navEmptyChild === void 0 ? void 0 : navEmptyChild.props.description, image: navEmptyChild === null || navEmptyChild === void 0 ? void 0 : navEmptyChild.props.image, children: navEmptyChild === null || navEmptyChild === void 0 ? void 0 : navEmptyChild.props.children }) })) : (sectionsToRender.map((section, index) => (_jsxs(Fragment, { children: [cloneElement(section, {
161
+ className: classNames(["zen-nav__section", section.props.className || ""])
162
+ }), showSectionDividers && (isMobile || index < sectionsToRender.length - 1) ? _jsx(NavDivider, {}) : null] }, index)))) }), footerToRender] })) : null, mobileBarContainer && isMobile && navMobileBarPortal] }));
159
163
  };
164
+ Nav.Empty = NavEmpty;
@@ -0,0 +1,10 @@
1
+ import { ReactNode } from "react";
2
+ export interface INavEmpty {
3
+ description?: string;
4
+ image?: ReactNode | React.FC;
5
+ children?: ReactNode;
6
+ }
7
+ export declare const NavEmpty: {
8
+ (_: INavEmpty): import("react/jsx-runtime").JSX.Element;
9
+ displayName: string;
10
+ };
@@ -0,0 +1,3 @@
1
+ import { Fragment as _Fragment, jsx as _jsx } from "react/jsx-runtime";
2
+ export const NavEmpty = (_) => _jsx(_Fragment, {});
3
+ NavEmpty.displayName = "NavEmpty";
@@ -16,10 +16,10 @@ injectString("da-DK", "Close", "Luk");
16
16
  injectString("de", "Close", "Schlie\xDFen");
17
17
  injectString("en", "Close", "Close");
18
18
  injectString("es", "Close", "Cerrar");
19
- injectString("fi-FI", "Close", "Sulje");
19
+ injectString("fi-FI", "Close", "Sulkea");
20
20
  injectString("fr", "Close", "Fermer");
21
21
  injectString("fr-FR", "Close", "Fermer");
22
- injectString("hu-HU", "Close", "Z\xE1rd be.");
22
+ injectString("hu-HU", "Close", "Bez\xE1r\xE1s");
23
23
  injectString("id", "Close", "Tutup");
24
24
  injectString("it", "Close", "Chiudere");
25
25
  injectString("ja", "Close", "\u9589\u3058\u308B");
@@ -30,13 +30,13 @@ injectString("nl", "Close", "Sluiten");
30
30
  injectString("pl", "Close", "Zamknij");
31
31
  injectString("pt-BR", "Close", "Fechar");
32
32
  injectString("pt-PT", "Close", "Fechar");
33
- injectString("sk-SK", "Close", "Zatvor");
33
+ injectString("sk-SK", "Close", "Zatvori\u0165");
34
34
  injectString("sv", "Close", "St\xE4ng");
35
35
  injectString("th", "Close", "\u0E1B\u0E34\u0E14");
36
36
  injectString("tr", "Close", "Kapat");
37
37
  injectString("zh-Hans", "Close", "\u5173\u95ED");
38
38
  injectString("zh-TW", "Close", "\u95DC\u9589");
39
- injectString("ro-RO", "Close", "\xCEnchide\u021Bi");
39
+ injectString("ro-RO", "Close", "\xCEnchide");
40
40
  injectString("ar-SA", "Close", "\u0625\u063A\u0644\u0627\u0642");
41
41
  export const Notification = ({
42
42
  id,
@@ -6,7 +6,7 @@ export const PushNotification = ({ children, isOpen }) => {
6
6
  if (!ref.current || !isOpen) {
7
7
  return;
8
8
  }
9
- ref.current.animate([{ left: "120%" }, { left: "0%" }], {
9
+ ref.current.animate([{ insetInlineStart: "120%" }, { insetInlineStart: "0%" }], {
10
10
  duration: 150,
11
11
  iterations: 1,
12
12
  delay: 0
@@ -13,10 +13,10 @@ injectString("da-DK", "Close", "Luk");
13
13
  injectString("de", "Close", "Schlie\xDFen");
14
14
  injectString("en", "Close", "Close");
15
15
  injectString("es", "Close", "Cerrar");
16
- injectString("fi-FI", "Close", "Sulje");
16
+ injectString("fi-FI", "Close", "Sulkea");
17
17
  injectString("fr", "Close", "Fermer");
18
18
  injectString("fr-FR", "Close", "Fermer");
19
- injectString("hu-HU", "Close", "Z\xE1rd be.");
19
+ injectString("hu-HU", "Close", "Bez\xE1r\xE1s");
20
20
  injectString("id", "Close", "Tutup");
21
21
  injectString("it", "Close", "Chiudere");
22
22
  injectString("ja", "Close", "\u9589\u3058\u308B");
@@ -27,13 +27,13 @@ injectString("nl", "Close", "Sluiten");
27
27
  injectString("pl", "Close", "Zamknij");
28
28
  injectString("pt-BR", "Close", "Fechar");
29
29
  injectString("pt-PT", "Close", "Fechar");
30
- injectString("sk-SK", "Close", "Zatvor");
30
+ injectString("sk-SK", "Close", "Zatvori\u0165");
31
31
  injectString("sv", "Close", "St\xE4ng");
32
32
  injectString("th", "Close", "\u0E1B\u0E34\u0E14");
33
33
  injectString("tr", "Close", "Kapat");
34
34
  injectString("zh-Hans", "Close", "\u5173\u95ED");
35
35
  injectString("zh-TW", "Close", "\u95DC\u9589");
36
- injectString("ro-RO", "Close", "\xCEnchide\u021Bi");
36
+ injectString("ro-RO", "Close", "\xCEnchide");
37
37
  injectString("ar-SA", "Close", "\u0625\u063A\u0644\u0627\u0642");
38
38
  export const NonActionablePill = ({
39
39
  icon,
@@ -27,24 +27,24 @@ injectString("es", "View all", "Ver todo");
27
27
  injectString("fi-FI", "View all", "N\xE4yt\xE4 kaikki");
28
28
  injectString("fr", "View all", "Afficher tout");
29
29
  injectString("fr-FR", "View all", "Tout afficher");
30
- injectString("hu-HU", "View all", "Mutasd az \xF6sszeset.");
30
+ injectString("hu-HU", "View all", "\xD6sszes megtekint\xE9se");
31
31
  injectString("id", "View all", "Lihat semua");
32
32
  injectString("it", "View all", "Visualizzare tutto");
33
33
  injectString("ja", "View all", "\u3059\u3079\u3066\u8868\u793A");
34
34
  injectString("ko-KR", "View all", "\uC804\uCCB4 \uBCF4\uAE30");
35
35
  injectString("ms", "View all", "Lihat semua");
36
- injectString("nb-NO", "View all", "Se alle");
36
+ injectString("nb-NO", "View all", "Vis alle");
37
37
  injectString("nl", "View all", "Alles weergeven");
38
38
  injectString("pl", "View all", "Wy\u015Bwietl wszystkie");
39
39
  injectString("pt-BR", "View all", "Visualizar tudo");
40
- injectString("pt-PT", "View all", "Visualizar tudo");
40
+ injectString("pt-PT", "View all", "Ver tudo");
41
41
  injectString("sk-SK", "View all", "Zobrazi\u0165 v\u0161etko");
42
42
  injectString("sv", "View all", "Visa alla");
43
43
  injectString("th", "View all", "\u0E14\u0E39\u0E17\u0E31\u0E49\u0E07\u0E2B\u0E21\u0E14");
44
44
  injectString("tr", "View all", "T\xFCm\xFCn\xFC g\xF6r\xFCnt\xFCle");
45
45
  injectString("zh-Hans", "View all", "\u67E5\u770B\u5168\u90E8");
46
46
  injectString("zh-TW", "View all", "\u6AA2\u8996\u5168\u90E8");
47
- injectString("ro-RO", "View all", "Afi\u0219a\u021Bi tot");
47
+ injectString("ro-RO", "View all", "Vezi tot");
48
48
  injectString("ar-SA", "View all", "\u0639\u0631\u0636 \u0627\u0644\u0643\u0644");
49
49
  injectString("cs", "Expand", "Rozbalit");
50
50
  injectString("da-DK", "Expand", "Udvid");
@@ -37,10 +37,10 @@ injectString("da-DK", "Close", "Luk");
37
37
  injectString("de", "Close", "Schlie\xDFen");
38
38
  injectString("en", "Close", "Close");
39
39
  injectString("es", "Close", "Cerrar");
40
- injectString("fi-FI", "Close", "Sulje");
40
+ injectString("fi-FI", "Close", "Sulkea");
41
41
  injectString("fr", "Close", "Fermer");
42
42
  injectString("fr-FR", "Close", "Fermer");
43
- injectString("hu-HU", "Close", "Z\xE1rd be.");
43
+ injectString("hu-HU", "Close", "Bez\xE1r\xE1s");
44
44
  injectString("id", "Close", "Tutup");
45
45
  injectString("it", "Close", "Chiudere");
46
46
  injectString("ja", "Close", "\u9589\u3058\u308B");
@@ -51,13 +51,13 @@ injectString("nl", "Close", "Sluiten");
51
51
  injectString("pl", "Close", "Zamknij");
52
52
  injectString("pt-BR", "Close", "Fechar");
53
53
  injectString("pt-PT", "Close", "Fechar");
54
- injectString("sk-SK", "Close", "Zatvor");
54
+ injectString("sk-SK", "Close", "Zatvori\u0165");
55
55
  injectString("sv", "Close", "St\xE4ng");
56
56
  injectString("th", "Close", "\u0E1B\u0E34\u0E14");
57
57
  injectString("tr", "Close", "Kapat");
58
58
  injectString("zh-Hans", "Close", "\u5173\u95ED");
59
59
  injectString("zh-TW", "Close", "\u95DC\u9589");
60
- injectString("ro-RO", "Close", "\xCEnchide\u021Bi");
60
+ injectString("ro-RO", "Close", "\xCEnchide");
61
61
  injectString("ar-SA", "Close", "\u0625\u063A\u0644\u0627\u0642");
62
62
  export const DetailPanelHeader = ({
63
63
  id,
@@ -16,10 +16,9 @@ export interface IColumnsGroup {
16
16
  interface IColumnSettingsList<T extends IRowEntity<N>, N extends IEntityWithId> extends IZenComponentProps {
17
17
  columns: IListColumn<T, N>[];
18
18
  settings: Map<string, boolean>;
19
- firstColumn: string;
20
19
  onChange?: (newState: Map<string, boolean>) => void;
21
20
  sortGroups?: (a: string, b: string) => number;
22
21
  sortColumns?: (a: string, b: string) => number;
23
22
  }
24
- export declare function ColumnSettingsList<T extends IRowEntity<N>, N extends IEntityWithId>({ columns, settings, firstColumn, onChange, sortGroups, sortColumns }: IColumnSettingsList<T, N>): import("react/jsx-runtime").JSX.Element[];
23
+ export declare function ColumnSettingsList<T extends IRowEntity<N>, N extends IEntityWithId>({ columns, settings, onChange, sortGroups, sortColumns }: IColumnSettingsList<T, N>): import("react/jsx-runtime").JSX.Element[];
25
24
  export {};
@@ -36,7 +36,7 @@ const SubColumnsList = ({
36
36
  title,
37
37
  columns,
38
38
  settings,
39
- firstColumn,
39
+ lastVisibleColumnId,
40
40
  onChange,
41
41
  sortColumns
42
42
  }) => {
@@ -53,10 +53,10 @@ const SubColumnsList = ({
53
53
  const items = useMemo(() => columns.sort(sortColumnsInt).map(c => ({
54
54
  id: c.id,
55
55
  title: c.title,
56
- disabled: c.id === firstColumn,
56
+ disabled: !!c.alwaysVisible || c.id === lastVisibleColumnId,
57
57
  showCheckbox: true,
58
58
  children: c.title
59
- })), [columns, firstColumn, sortColumnsInt]);
59
+ })), [columns, sortColumnsInt, lastVisibleColumnId]);
60
60
  const state = columns.reduce((res, c) => {
61
61
  res.set(c.id, settings.get(c.id) !== false ? CheckboxState.On : CheckboxState.Off);
62
62
  return res;
@@ -92,7 +92,6 @@ const SubColumnsList = ({
92
92
  export function ColumnSettingsList({
93
93
  columns,
94
94
  settings,
95
- firstColumn,
96
95
  onChange,
97
96
  sortGroups,
98
97
  sortColumns
@@ -104,11 +103,13 @@ export function ColumnSettingsList({
104
103
  }
105
104
  return 0;
106
105
  }, [sortGroups]);
106
+ const visibleColumns = columns.filter(c => settings.get(c.id) !== false);
107
+ const lastVisibleColumnId = visibleColumns.length === 1 ? visibleColumns[0].id : undefined;
107
108
  return Array.from(groupped.entries()).sort(sortGroupsInt).map(([title, cs]) => _jsx(SubColumnsList, {
108
109
  title: title,
109
110
  columns: cs,
110
111
  settings: settings,
111
- firstColumn: firstColumn,
112
+ lastVisibleColumnId: lastVisibleColumnId,
112
113
  onChange: onChange,
113
114
  sortColumns: sortColumns
114
115
  }, cs.map(c => c.id).join("-")));
@@ -48,13 +48,10 @@ export const ColumnsPopup = ({
48
48
  translate
49
49
  } = useLanguage();
50
50
  const listOfColumns = useMemo(() => {
51
- var _a;
52
- const firstColumn = ((_a = columns[0]) === null || _a === void 0 ? void 0 : _a.id) || "";
53
51
  const columnSettingsMap = new Map(columnSettings.map(s => [s.name, s.visible]));
54
52
  return _jsx(ColumnSettingsList, {
55
53
  columns: columns.filter(c => c.title),
56
54
  settings: columnSettingsMap,
57
- firstColumn: firstColumn,
58
55
  onChange: newSettings => {
59
56
  const settings = columnSettings.map(s => {
60
57
  const visible = newSettings.get(s.name) !== false;
@@ -17,4 +17,5 @@ export declare const getColumnSettings: (pageName: string, defaultValue?: IColum
17
17
  export declare const useFlexibleColumns: <T extends IRowEntity<N>, N extends IEntityWithId>(columns: IListColumn<T, N>[], flexible: IFlexibleColumnsOptions | undefined, gridRef: RefObject<HTMLElement | null>, columnsPopupRef: RefObject<HTMLElement | null> | undefined, isFeed: boolean) => {
18
18
  flexibleColumns: IListColumn<T, N>[];
19
19
  columnsPopup: import("react/jsx-runtime").JSX.Element | null;
20
+ allColumnsHidden: boolean;
20
21
  };
@@ -112,11 +112,12 @@ export const useFlexibleColumns = (columns, flexible, gridRef, columnsPopupRef,
112
112
  if (flexible.columnsPopup === false) {
113
113
  return null;
114
114
  }
115
- if (flexibleColumns.length === 0) {
115
+ const configurableColumns = columns.filter(c => c.title && !(c.columnComponent instanceof ActionsColumn));
116
+ if (configurableColumns.length === 0 || configurableColumns.every(c => c.alwaysVisible)) {
116
117
  return null;
117
118
  }
118
119
  return (_jsx(ColumnsPopup, { columns: columns.filter(c => !(c.columnComponent instanceof ActionsColumn)), columnSettings: columnSettings, triggerRef: columnsPopupRef, sortGroups: flexible.sortGroups, sortColumns: flexible.sortColumns, onReset: onResetListener, onChange: onChangeListener }));
119
- }, [columnSettings, columns, columnsPopupRef, flexible, flexibleColumns.length, onChangeListener, onResetListener]);
120
+ }, [columnSettings, columns, columnsPopupRef, flexible, onChangeListener, onResetListener]);
120
121
  const onReorderListener = useCallback(async ([from, to]) => {
121
122
  if (from === to) {
122
123
  return;
@@ -173,5 +174,5 @@ export const useFlexibleColumns = (columns, flexible, gridRef, columnsPopupRef,
173
174
  return;
174
175
  };
175
176
  }, [onResizeColumn, onReorderListener, gridRef, flexibleColumns, isFeed, isDraggable]);
176
- return { flexibleColumns, columnsPopup };
177
+ return { flexibleColumns, columnsPopup, allColumnsHidden: !!flexible && flexibleColumns.length === 0 };
177
178
  };
@@ -31,6 +31,7 @@ export declare const useLoading: <T extends IRowEntity<N>, N extends IEntityWith
31
31
  wrappers?: import("../table").IListColumnWrapper<T, N>[] | undefined;
32
32
  sortable?: boolean | undefined;
33
33
  draggable?: boolean | undefined;
34
+ alwaysVisible?: boolean | undefined;
34
35
  colspan?: number | ((entity: T | N) => number | undefined) | undefined;
35
36
  group?: string | undefined;
36
37
  visible?: boolean | undefined;
@@ -6,7 +6,7 @@ import { Skeleton } from "../../skeleton/skeleton";
6
6
  export const DEFAULT_LOADING_ROWS = 50;
7
7
  const LoadingCell = ({ width, className }) => _jsx(Skeleton, { width: width, className: className });
8
8
  export const useLoading = (columns, entities, isLoading, loading) => {
9
- const sampleEntity = useMemo(() => columns.map(column => ({ [column.id]: column.title })).reduce((acc, el) => (Object.assign(Object.assign({}, acc), el))), [columns]);
9
+ const sampleEntity = useMemo(() => columns.map(column => ({ [column.id]: column.title })).reduce((acc, el) => (Object.assign(Object.assign({}, acc), el)), {}), [columns]);
10
10
  // Cache skeleton entities with stable IDs - only regenerate when rows count or columns change
11
11
  // This prevents skeletons from flickering when unrelated Table props change
12
12
  const skeletonEntities = useMemo(() => new Array((loading === null || loading === void 0 ? void 0 : loading.rows) || DEFAULT_LOADING_ROWS).fill(undefined).map(() => (Object.assign(Object.assign({}, sampleEntity), { isLoading: true, id: generateId() }))), [loading === null || loading === void 0 ? void 0 : loading.rows, sampleEntity]);
@@ -12,6 +12,7 @@ export declare const useNestedRows: <T extends IRowEntity<N>, N extends IEntityW
12
12
  meta?: import("../../dataGrid/listColumn").IListColumnMeta<T, N> | undefined;
13
13
  columnComponent?: import("../../dataGrid/listColumn").IColumnComponent<T, N> | undefined;
14
14
  wrappers?: import("../../dataGrid/listColumn").IListColumnWrapper<T, N>[] | undefined;
15
+ alwaysVisible?: boolean | undefined;
15
16
  colspan?: number | ((entity: T | N) => number | undefined) | undefined;
16
17
  }[];
17
18
  nestedFeedWrapper: (primaryData: ReactNode, secondaryData: ReactNode, entity: T | N, isNested: boolean) => [ReactNode, ReactNode];
@@ -140,6 +140,7 @@ export const useSelectableRows = (columns, entities, isMobile, selectMode, setSe
140
140
  setSelectMode(newValue.all || newValue.selected.length > 0);
141
141
  }, [checkboxDisabled, checkboxVisible, entities, selectable, setSelectMode, setState, getNewSelection]);
142
142
  const onChangeSelectionState = useCallback(newState => {
143
+ var _a, _b;
143
144
  if (newState === SelectionState.All) {
144
145
  (selectable === null || selectable === void 0 ? void 0 : selectable.onSelect) && selectable.onSelect({
145
146
  selected: [],
@@ -158,8 +159,10 @@ export const useSelectableRows = (columns, entities, isMobile, selectMode, setSe
158
159
  }
159
160
  const newSelections = getCurrentPageSelection(entities, selectable);
160
161
  setState(newState);
162
+ const previousSelections = (_b = (_a = selectable === null || selectable === void 0 ? void 0 : selectable.selection) === null || _a === void 0 ? void 0 : _a.selected) !== null && _b !== void 0 ? _b : [];
163
+ const mergedSelections = new Set([...previousSelections, ...newSelections]);
161
164
  const newValue = {
162
- selected: [...newSelections],
165
+ selected: [...mergedSelections],
163
166
  all: false
164
167
  };
165
168
  selectable === null || selectable === void 0 ? void 0 : selectable.onSelect(newValue);
@@ -219,9 +222,24 @@ export const useSelectableRows = (columns, entities, isMobile, selectMode, setSe
219
222
  checked: state === SelectionState.CurrentPage || state === SelectionState.All,
220
223
  indeterminate: state === SelectionState.Partial,
221
224
  onChange: newValue => {
222
- const newState = newValue ? selectable.turnOffSelectAll ? SelectionState.CurrentPage : SelectionState.All : SelectionState.None;
223
- setState(newState);
224
- onChangeSelectionState(newState);
225
+ var _a, _b;
226
+ if (newValue) {
227
+ const newState = selectable.turnOffSelectAll ? SelectionState.CurrentPage : SelectionState.All;
228
+ setState(newState);
229
+ onChangeSelectionState(newState);
230
+ } else {
231
+ // Intentionally different from onSelect(None) ("Deselect all" menu item, which clears everything).
232
+ // Unchecking the header checkbox only removes the current page from the selection, preserving other pages.
233
+ const currentPageIds = getCurrentPageSelection(entities, selectable);
234
+ const remaining = ((_b = (_a = selectable.selection) === null || _a === void 0 ? void 0 : _a.selected) !== null && _b !== void 0 ? _b : []).filter(id => !currentPageIds.has(id));
235
+ const newState = remaining.length > 0 ? SelectionState.Partial : SelectionState.None;
236
+ setState(newState);
237
+ selectable.onSelect({
238
+ selected: remaining,
239
+ all: false
240
+ });
241
+ setSelectMode(remaining.length > 0);
242
+ }
225
243
  },
226
244
  calculateSelectionState: () => selectableState,
227
245
  checkboxInHeader: selectable.checkboxInHeader !== undefined ? selectable.checkboxInHeader : selectable.selectionLimit !== undefined ? false : undefined,
@@ -235,7 +253,7 @@ export const useSelectableRows = (columns, entities, isMobile, selectMode, setSe
235
253
  return cell;
236
254
  }
237
255
  };
238
- }, [checkboxDisabled, checkboxTitle, checkboxVisible, headerTitle, onChangeSelectionState, onSelectListener, selectable, selectableState, state, isMobile, checkboxPlaceholder, isEntityChecked]);
256
+ }, [checkboxDisabled, checkboxTitle, checkboxVisible, headerTitle, onChangeSelectionState, onSelectListener, selectable, selectableState, state, isMobile, checkboxPlaceholder, isEntityChecked, entities, setSelectMode]);
239
257
  const selectableFeedWrapper = useCallback((primaryData, secondaryData, entity, isNested) => {
240
258
  // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
241
259
  if (!entity) {
@@ -41,6 +41,7 @@ export interface IListColumn<T extends IRowEntity<N>, N extends IEntityWithId =
41
41
  wrappers?: IListColumnWrapper<T, N>[];
42
42
  sortable?: boolean;
43
43
  draggable?: boolean;
44
+ alwaysVisible?: boolean;
44
45
  colspan?: undefined | number | ((entity: T | N) => number | undefined);
45
46
  group?: string;
46
47
  visible?: boolean;
@@ -8,6 +8,7 @@ import { useSortableColumns } from "./sortable/useSortableColumns";
8
8
  import { useFlexibleColumns } from "./flexible/useFlexibleColumns";
9
9
  import { useActions } from "./actions/useActions";
10
10
  import { useLoading } from "./loading/useLoading";
11
+ import { EmptySearchList } from "../dataGrid/emptySearchList/emptySearchList";
11
12
  import { EntitiesListActions } from "../dataGrid/entitiesListActions/entitiesListActions";
12
13
  import { DataFeedSelectPanel } from "../dataFeed/dataFeedSelectPanel/dataFeedSelectPanel";
13
14
  import { ColumnsListButton } from "../dataGrid/entitiesListActions/actions/columnsListButton";
@@ -143,7 +144,8 @@ const TableInner = ({
143
144
  } = useSortableColumns(selectableColumns, sortable, isMobile);
144
145
  const {
145
146
  flexibleColumns,
146
- columnsPopup
147
+ columnsPopup,
148
+ allColumnsHidden
147
149
  } = useFlexibleColumns(sortableColumns, flexible, gridRef, columnsPopupRef, isMobile);
148
150
  const {
149
151
  columnsWithActions,
@@ -250,7 +252,10 @@ const TableInner = ({
250
252
  className: "zen-table__content",
251
253
  children: [_jsx("div", {
252
254
  className: "zen-table__table",
253
- children: isMobile ? _jsxs(DataFeed, {
255
+ children: allColumnsHidden ? _jsx("div", {
256
+ className: "zen-data-grid__empty",
257
+ children: _jsx(EmptySearchList, {})
258
+ }) : isMobile ? _jsxs(DataFeed, {
254
259
  columns: loadingColumns,
255
260
  feedWrappers: [nestedFeedWrapper, selectableFeedWrapper],
256
261
  entities: loadingEntities,
@@ -9,5 +9,6 @@ export interface ITabItem extends IZenComponentProps {
9
9
  active: boolean;
10
10
  ariaControl?: string;
11
11
  handleButtonClick: (e: React.MouseEvent<HTMLElement>) => void;
12
+ dataAnalyticsId?: string;
12
13
  }
13
- export declare const TabItem: ({ tabId, tabName, icon, active, handleButtonClick, ariaControl, quantity }: ITabItem) => import("react/jsx-runtime").JSX.Element;
14
+ export declare const TabItem: ({ tabId, tabName, icon, active, handleButtonClick, ariaControl, quantity, dataAnalyticsId }: ITabItem) => import("react/jsx-runtime").JSX.Element;
@@ -2,8 +2,10 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { classNames } from "../../commonHelpers/classNames/classNames";
3
3
  import { useDriveClassName } from "../../utils/theme/useDriveClassName";
4
4
  import { useMobileClassName } from "../../utils/theme/useMobileClassName";
5
- export const TabItem = ({ tabId, tabName, icon, active, handleButtonClick, ariaControl, quantity }) => {
5
+ import { toKebabCase } from "../../utils/toKebabCase";
6
+ export const TabItem = ({ tabId, tabName, icon, active, handleButtonClick, ariaControl, quantity, dataAnalyticsId }) => {
6
7
  const driveClassname = useDriveClassName("zen-tab-item");
7
8
  const mobileClassname = useMobileClassName("zen-tab-item");
8
- return (_jsx("button", { id: tabId, type: "button", className: classNames(["zen-tab-item", driveClassname || mobileClassname || "", active ? "zen-tab-item--active" : ""]), role: "tab", "aria-controls": ariaControl, "aria-selected": active ? "true" : "false", "aria-label": tabName, title: tabName, onClick: handleButtonClick, children: _jsxs("div", { className: "zen-tab-item__content", children: [icon && (_jsx("span", { className: classNames(["zen-tab-item__content-icon", active ? "zen-tab-item__content-icon--active" : ""]), children: icon })), _jsx("span", { className: "zen-tab-item__content-text", children: tabName }), quantity && _jsx("div", { className: "zen-tab-item__content-quantity", children: quantity })] }) }));
9
+ const analyticsId = dataAnalyticsId || `tab-${toKebabCase(tabName)}`;
10
+ return (_jsx("button", { id: tabId, type: "button", className: classNames(["zen-tab-item", driveClassname || mobileClassname || "", active ? "zen-tab-item--active" : ""]), role: "tab", "aria-controls": ariaControl, "aria-selected": active ? "true" : "false", "aria-label": tabName, title: tabName, onClick: handleButtonClick, "data-analytics-id": analyticsId, children: _jsxs("div", { className: "zen-tab-item__content", children: [icon && (_jsx("span", { className: classNames(["zen-tab-item__content-icon", active ? "zen-tab-item__content-icon--active" : ""]), children: icon })), _jsx("span", { className: "zen-tab-item__content-text", children: tabName }), quantity && _jsx("div", { className: "zen-tab-item__content-quantity", children: quantity })] }) }));
9
11
  };
@@ -8,6 +8,7 @@ export interface ITabElement {
8
8
  icon?: React.ReactElement | React.FC<IIcon>;
9
9
  id: string;
10
10
  quantity?: number;
11
+ dataAnalyticsId?: string;
11
12
  }
12
13
  export interface ITabs extends IZenComponentProps {
13
14
  tabs: ITabElement[];
package/esm/tabs/tabs.js CHANGED
@@ -235,7 +235,8 @@ export const Tabs = ({
235
235
  quantity: tab.quantity,
236
236
  active: activeTabId === tab.id,
237
237
  ariaControl: `panel-${tab.id}`,
238
- handleButtonClick: handleButtonClick
238
+ handleButtonClick: handleButtonClick,
239
+ dataAnalyticsId: tab.dataAnalyticsId
239
240
  }, tab.id))
240
241
  })
241
242
  }), scrollButtonType === "end" || scrollButtonType === "both" ? _jsxs(_Fragment, {
@@ -30,7 +30,7 @@ export const ToastAnimation = ({ id, children, isOpen, animation }) => {
30
30
  return;
31
31
  }
32
32
  if (animation === "left-right") {
33
- ref.current.animate([{ left: "0%" }, { left: "120%" }], {
33
+ ref.current.animate([{ insetInlineStart: "0%" }, { insetInlineStart: "120%" }], {
34
34
  duration: 300,
35
35
  iterations: 1,
36
36
  delay: 0,
@@ -40,7 +40,7 @@ export const ToastAnimation = ({ id, children, isOpen, animation }) => {
40
40
  };
41
41
  return;
42
42
  }
43
- ref.current.animate([{ left: "120%" }, { left: "0%" }], {
43
+ ref.current.animate([{ insetInlineStart: "120%" }, { insetInlineStart: "0%" }], {
44
44
  duration: 300,
45
45
  iterations: 1,
46
46
  delay: 0