@arbor-education/design-system.components 0.15.0 → 0.16.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 (304) hide show
  1. package/.gather/skills/write-stories/SKILL.md +207 -271
  2. package/.storybook/preview.ts +5 -0
  3. package/CHANGELOG.md +23 -0
  4. package/README.md +8 -0
  5. package/component-library.md +144 -13
  6. package/dist/components/articleCard/ArticleCard.stories.d.ts +137 -11
  7. package/dist/components/articleCard/ArticleCard.stories.d.ts.map +1 -1
  8. package/dist/components/articleCard/ArticleCard.stories.js +358 -91
  9. package/dist/components/articleCard/ArticleCard.stories.js.map +1 -1
  10. package/dist/components/avatar/Avatar.stories.d.ts +6 -6
  11. package/dist/components/avatar/Avatar.stories.d.ts.map +1 -1
  12. package/dist/components/avatar/Avatar.stories.js +393 -49
  13. package/dist/components/avatar/Avatar.stories.js.map +1 -1
  14. package/dist/components/avatarGroup/AvatarGroup.stories.d.ts +9 -7
  15. package/dist/components/avatarGroup/AvatarGroup.stories.d.ts.map +1 -1
  16. package/dist/components/avatarGroup/AvatarGroup.stories.js +688 -65
  17. package/dist/components/avatarGroup/AvatarGroup.stories.js.map +1 -1
  18. package/dist/components/banner/Banner.stories.d.ts.map +1 -1
  19. package/dist/components/banner/Banner.stories.js +7 -3
  20. package/dist/components/banner/Banner.stories.js.map +1 -1
  21. package/dist/components/card/Card.stories.d.ts +105 -4
  22. package/dist/components/card/Card.stories.d.ts.map +1 -1
  23. package/dist/components/card/Card.stories.js +336 -18
  24. package/dist/components/card/Card.stories.js.map +1 -1
  25. package/dist/components/combobox/Combobox.stories.d.ts +134 -21
  26. package/dist/components/combobox/Combobox.stories.d.ts.map +1 -1
  27. package/dist/components/combobox/Combobox.stories.js +676 -175
  28. package/dist/components/combobox/Combobox.stories.js.map +1 -1
  29. package/dist/components/datePicker/DatePicker.stories.d.ts +119 -27
  30. package/dist/components/datePicker/DatePicker.stories.d.ts.map +1 -1
  31. package/dist/components/datePicker/DatePicker.stories.js +575 -47
  32. package/dist/components/datePicker/DatePicker.stories.js.map +1 -1
  33. package/dist/components/dateTimePicker/DateTimePicker.stories.d.ts +155 -39
  34. package/dist/components/dateTimePicker/DateTimePicker.stories.d.ts.map +1 -1
  35. package/dist/components/dateTimePicker/DateTimePicker.stories.js +674 -103
  36. package/dist/components/dateTimePicker/DateTimePicker.stories.js.map +1 -1
  37. package/dist/components/editableText/EditableText.stories.d.ts +53 -12
  38. package/dist/components/editableText/EditableText.stories.d.ts.map +1 -1
  39. package/dist/components/editableText/EditableText.stories.js +401 -64
  40. package/dist/components/editableText/EditableText.stories.js.map +1 -1
  41. package/dist/components/formField/FormField.d.ts +4 -0
  42. package/dist/components/formField/FormField.d.ts.map +1 -1
  43. package/dist/components/formField/FormField.js +2 -1
  44. package/dist/components/formField/FormField.js.map +1 -1
  45. package/dist/components/formField/FormField.test.js +5 -0
  46. package/dist/components/formField/FormField.test.js.map +1 -1
  47. package/dist/components/formField/fieldset/Fieldset.stories.d.ts +56 -4
  48. package/dist/components/formField/fieldset/Fieldset.stories.d.ts.map +1 -1
  49. package/dist/components/formField/fieldset/Fieldset.stories.js +534 -28
  50. package/dist/components/formField/fieldset/Fieldset.stories.js.map +1 -1
  51. package/dist/components/formField/inputs/checkbox/CheckboxGroup.d.ts +3 -1
  52. package/dist/components/formField/inputs/checkbox/CheckboxGroup.d.ts.map +1 -1
  53. package/dist/components/formField/inputs/checkbox/CheckboxInput.js +1 -1
  54. package/dist/components/formField/inputs/checkbox/CheckboxInput.js.map +1 -1
  55. package/dist/components/formField/inputs/colourPickerDropdown/ColourPickerDropdown.stories.d.ts +95 -1
  56. package/dist/components/formField/inputs/colourPickerDropdown/ColourPickerDropdown.stories.d.ts.map +1 -1
  57. package/dist/components/formField/inputs/colourPickerDropdown/ColourPickerDropdown.stories.js +386 -9
  58. package/dist/components/formField/inputs/colourPickerDropdown/ColourPickerDropdown.stories.js.map +1 -1
  59. package/dist/components/formField/inputs/radio/RadioButtonGroup.d.ts +6 -2
  60. package/dist/components/formField/inputs/radio/RadioButtonGroup.d.ts.map +1 -1
  61. package/dist/components/formField/inputs/radio/RadioButtonGroup.js.map +1 -1
  62. package/dist/components/formField/inputs/radio/RadioButtonInput.stories.d.ts.map +1 -1
  63. package/dist/components/formField/inputs/radio/RadioButtonInput.stories.js +61 -49
  64. package/dist/components/formField/inputs/radio/RadioButtonInput.stories.js.map +1 -1
  65. package/dist/components/formField/inputs/selectDropdown/SelectDropdown.stories.d.ts +188 -166
  66. package/dist/components/formField/inputs/selectDropdown/SelectDropdown.stories.d.ts.map +1 -1
  67. package/dist/components/formField/inputs/selectDropdown/SelectDropdown.stories.js +821 -160
  68. package/dist/components/formField/inputs/selectDropdown/SelectDropdown.stories.js.map +1 -1
  69. package/dist/components/formField/inputs/time/TimeInput.stories.d.ts +176 -22
  70. package/dist/components/formField/inputs/time/TimeInput.stories.d.ts.map +1 -1
  71. package/dist/components/formField/inputs/time/TimeInput.stories.js +851 -92
  72. package/dist/components/formField/inputs/time/TimeInput.stories.js.map +1 -1
  73. package/dist/components/formField/label/Label.stories.d.ts +54 -5
  74. package/dist/components/formField/label/Label.stories.d.ts.map +1 -1
  75. package/dist/components/formField/label/Label.stories.js +238 -4
  76. package/dist/components/formField/label/Label.stories.js.map +1 -1
  77. package/dist/components/icoText/IcoText.stories.d.ts +32 -6
  78. package/dist/components/icoText/IcoText.stories.d.ts.map +1 -1
  79. package/dist/components/icoText/IcoText.stories.js +309 -14
  80. package/dist/components/icoText/IcoText.stories.js.map +1 -1
  81. package/dist/components/kpiCard/KPICard.stories.d.ts +100 -2
  82. package/dist/components/kpiCard/KPICard.stories.d.ts.map +1 -1
  83. package/dist/components/kpiCard/KPICard.stories.js +354 -10
  84. package/dist/components/kpiCard/KPICard.stories.js.map +1 -1
  85. package/dist/components/kvpList/KVPList.stories.d.ts +57 -4
  86. package/dist/components/kvpList/KVPList.stories.d.ts.map +1 -1
  87. package/dist/components/kvpList/KVPList.stories.js +403 -10
  88. package/dist/components/kvpList/KVPList.stories.js.map +1 -1
  89. package/dist/components/modal/Modal.stories.d.ts +113 -9
  90. package/dist/components/modal/Modal.stories.d.ts.map +1 -1
  91. package/dist/components/modal/Modal.stories.js +633 -13
  92. package/dist/components/modal/Modal.stories.js.map +1 -1
  93. package/dist/components/modal/modalManager/ModalManager.stories.d.ts +34 -10
  94. package/dist/components/modal/modalManager/ModalManager.stories.d.ts.map +1 -1
  95. package/dist/components/modal/modalManager/ModalManager.stories.js +463 -85
  96. package/dist/components/modal/modalManager/ModalManager.stories.js.map +1 -1
  97. package/dist/components/pill/Pill.d.ts.map +1 -1
  98. package/dist/components/pill/Pill.js +1 -1
  99. package/dist/components/pill/Pill.js.map +1 -1
  100. package/dist/components/pill/Pill.stories.d.ts.map +1 -1
  101. package/dist/components/pill/Pill.stories.js +11 -13
  102. package/dist/components/pill/Pill.stories.js.map +1 -1
  103. package/dist/components/row/Row.stories.d.ts +1 -2
  104. package/dist/components/row/Row.stories.d.ts.map +1 -1
  105. package/dist/components/row/Row.stories.js +360 -50
  106. package/dist/components/row/Row.stories.js.map +1 -1
  107. package/dist/components/searchBar/SearchBar.stories.d.ts +52 -4
  108. package/dist/components/searchBar/SearchBar.stories.d.ts.map +1 -1
  109. package/dist/components/searchBar/SearchBar.stories.js +428 -36
  110. package/dist/components/searchBar/SearchBar.stories.js.map +1 -1
  111. package/dist/components/section/Section.stories.d.ts +11 -41
  112. package/dist/components/section/Section.stories.d.ts.map +1 -1
  113. package/dist/components/section/Section.stories.js +494 -56
  114. package/dist/components/section/Section.stories.js.map +1 -1
  115. package/dist/components/singleUser/SingleUser.stories.d.ts +5 -4
  116. package/dist/components/singleUser/SingleUser.stories.d.ts.map +1 -1
  117. package/dist/components/singleUser/SingleUser.stories.js +303 -31
  118. package/dist/components/singleUser/SingleUser.stories.js.map +1 -1
  119. package/dist/components/slideoverManager/SlideoverManager.stories.d.ts +32 -11
  120. package/dist/components/slideoverManager/SlideoverManager.stories.d.ts.map +1 -1
  121. package/dist/components/slideoverManager/SlideoverManager.stories.js +380 -84
  122. package/dist/components/slideoverManager/SlideoverManager.stories.js.map +1 -1
  123. package/dist/components/table/DSDefaultColDef.d.ts.map +1 -1
  124. package/dist/components/table/DSDefaultColDef.js +4 -3
  125. package/dist/components/table/DSDefaultColDef.js.map +1 -1
  126. package/dist/components/table/Table.d.ts +6 -1
  127. package/dist/components/table/Table.d.ts.map +1 -1
  128. package/dist/components/table/Table.js +8 -3
  129. package/dist/components/table/Table.js.map +1 -1
  130. package/dist/components/table/Table.stories.d.ts +3 -0
  131. package/dist/components/table/Table.stories.d.ts.map +1 -1
  132. package/dist/components/table/Table.stories.js +384 -5
  133. package/dist/components/table/Table.stories.js.map +1 -1
  134. package/dist/components/table/Table.test.js +30 -0
  135. package/dist/components/table/Table.test.js.map +1 -1
  136. package/dist/components/table/TableFooter.stories.d.ts +49 -0
  137. package/dist/components/table/TableFooter.stories.d.ts.map +1 -0
  138. package/dist/components/table/TableFooter.stories.js +137 -0
  139. package/dist/components/table/TableFooter.stories.js.map +1 -0
  140. package/dist/components/table/TableHeader.stories.d.ts +93 -0
  141. package/dist/components/table/TableHeader.stories.d.ts.map +1 -0
  142. package/dist/components/table/TableHeader.stories.js +176 -0
  143. package/dist/components/table/TableHeader.stories.js.map +1 -0
  144. package/dist/components/table/cellEditors/DateCellEditor.stories.d.ts +44 -0
  145. package/dist/components/table/cellEditors/DateCellEditor.stories.d.ts.map +1 -0
  146. package/dist/components/table/cellEditors/DateCellEditor.stories.js +186 -0
  147. package/dist/components/table/cellEditors/DateCellEditor.stories.js.map +1 -0
  148. package/dist/components/table/cellRenderers/BooleanCellRenderer.stories.d.ts +40 -0
  149. package/dist/components/table/cellRenderers/BooleanCellRenderer.stories.d.ts.map +1 -0
  150. package/dist/components/table/cellRenderers/BooleanCellRenderer.stories.js +209 -0
  151. package/dist/components/table/cellRenderers/BooleanCellRenderer.stories.js.map +1 -0
  152. package/dist/components/table/cellRenderers/ButtonCellRenderer.stories.d.ts +48 -0
  153. package/dist/components/table/cellRenderers/ButtonCellRenderer.stories.d.ts.map +1 -0
  154. package/dist/components/table/cellRenderers/ButtonCellRenderer.stories.js +244 -0
  155. package/dist/components/table/cellRenderers/ButtonCellRenderer.stories.js.map +1 -0
  156. package/dist/components/table/cellRenderers/CheckboxCellRenderer.d.ts.map +1 -1
  157. package/dist/components/table/cellRenderers/CheckboxCellRenderer.js +3 -1
  158. package/dist/components/table/cellRenderers/CheckboxCellRenderer.js.map +1 -1
  159. package/dist/components/table/cellRenderers/CheckboxCellRenderer.stories.d.ts +64 -0
  160. package/dist/components/table/cellRenderers/CheckboxCellRenderer.stories.d.ts.map +1 -0
  161. package/dist/components/table/cellRenderers/CheckboxCellRenderer.stories.js +241 -0
  162. package/dist/components/table/cellRenderers/CheckboxCellRenderer.stories.js.map +1 -0
  163. package/dist/components/table/cellRenderers/DefaultCellRenderer.stories.d.ts +55 -0
  164. package/dist/components/table/cellRenderers/DefaultCellRenderer.stories.d.ts.map +1 -0
  165. package/dist/components/table/cellRenderers/DefaultCellRenderer.stories.js +245 -0
  166. package/dist/components/table/cellRenderers/DefaultCellRenderer.stories.js.map +1 -0
  167. package/dist/components/table/cellRenderers/InlineTextCellRenderer.stories.d.ts +67 -0
  168. package/dist/components/table/cellRenderers/InlineTextCellRenderer.stories.d.ts.map +1 -0
  169. package/dist/components/table/cellRenderers/InlineTextCellRenderer.stories.js +221 -0
  170. package/dist/components/table/cellRenderers/InlineTextCellRenderer.stories.js.map +1 -0
  171. package/dist/components/table/cellRenderers/SelectDropdownCellRenderer.stories.d.ts +75 -0
  172. package/dist/components/table/cellRenderers/SelectDropdownCellRenderer.stories.d.ts.map +1 -0
  173. package/dist/components/table/cellRenderers/SelectDropdownCellRenderer.stories.js +270 -0
  174. package/dist/components/table/cellRenderers/SelectDropdownCellRenderer.stories.js.map +1 -0
  175. package/dist/components/table/columnFilters/BooleanFilter.stories.d.ts +57 -0
  176. package/dist/components/table/columnFilters/BooleanFilter.stories.d.ts.map +1 -0
  177. package/dist/components/table/columnFilters/BooleanFilter.stories.js +198 -0
  178. package/dist/components/table/columnFilters/BooleanFilter.stories.js.map +1 -0
  179. package/dist/components/table/columnFilters/TimeFilter.stories.d.ts +58 -0
  180. package/dist/components/table/columnFilters/TimeFilter.stories.d.ts.map +1 -0
  181. package/dist/components/table/columnFilters/TimeFilter.stories.js +207 -0
  182. package/dist/components/table/columnFilters/TimeFilter.stories.js.map +1 -0
  183. package/dist/components/table/pagination/PaginationPanel.stories.d.ts +113 -0
  184. package/dist/components/table/pagination/PaginationPanel.stories.d.ts.map +1 -0
  185. package/dist/components/table/pagination/PaginationPanel.stories.js +272 -0
  186. package/dist/components/table/pagination/PaginationPanel.stories.js.map +1 -0
  187. package/dist/components/table/tableControls/HideColumnsDropdown.d.ts.map +1 -1
  188. package/dist/components/table/tableControls/HideColumnsDropdown.js +9 -3
  189. package/dist/components/table/tableControls/HideColumnsDropdown.js.map +1 -1
  190. package/dist/components/table/tableControls/TableControls.stories.d.ts +151 -0
  191. package/dist/components/table/tableControls/TableControls.stories.d.ts.map +1 -0
  192. package/dist/components/table/tableControls/TableControls.stories.js +356 -0
  193. package/dist/components/table/tableControls/TableControls.stories.js.map +1 -0
  194. package/dist/components/table/tableControls/TableSettingsDropdown.d.ts +27 -1
  195. package/dist/components/table/tableControls/TableSettingsDropdown.d.ts.map +1 -1
  196. package/dist/components/table/tableControls/TableSettingsDropdown.js +53 -26
  197. package/dist/components/table/tableControls/TableSettingsDropdown.js.map +1 -1
  198. package/dist/components/table/tableControls/TableSettingsDropdown.test.d.ts +2 -0
  199. package/dist/components/table/tableControls/TableSettingsDropdown.test.d.ts.map +1 -0
  200. package/dist/components/table/tableControls/TableSettingsDropdown.test.js +178 -0
  201. package/dist/components/table/tableControls/TableSettingsDropdown.test.js.map +1 -0
  202. package/dist/components/tabs/Tabs.stories.d.ts +22 -4
  203. package/dist/components/tabs/Tabs.stories.d.ts.map +1 -1
  204. package/dist/components/tabs/Tabs.stories.js +398 -22
  205. package/dist/components/tabs/Tabs.stories.js.map +1 -1
  206. package/dist/components/tabs/TabsItem.stories.d.ts +54 -1
  207. package/dist/components/tabs/TabsItem.stories.d.ts.map +1 -1
  208. package/dist/components/tabs/TabsItem.stories.js +61 -9
  209. package/dist/components/tabs/TabsItem.stories.js.map +1 -1
  210. package/dist/components/toast/Toast.stories.d.ts +103 -10
  211. package/dist/components/toast/Toast.stories.d.ts.map +1 -1
  212. package/dist/components/toast/Toast.stories.js +409 -47
  213. package/dist/components/toast/Toast.stories.js.map +1 -1
  214. package/dist/components/toggle/Toggle.stories.d.ts +61 -46
  215. package/dist/components/toggle/Toggle.stories.d.ts.map +1 -1
  216. package/dist/components/toggle/Toggle.stories.js +311 -122
  217. package/dist/components/toggle/Toggle.stories.js.map +1 -1
  218. package/dist/components/tooltip/Tooltip.stories.d.ts +78 -6
  219. package/dist/components/tooltip/Tooltip.stories.d.ts.map +1 -1
  220. package/dist/components/tooltip/Tooltip.stories.js +413 -7
  221. package/dist/components/tooltip/Tooltip.stories.js.map +1 -1
  222. package/dist/components/tooltip/TooltipWrapper.stories.d.ts +71 -7
  223. package/dist/components/tooltip/TooltipWrapper.stories.d.ts.map +1 -1
  224. package/dist/components/tooltip/TooltipWrapper.stories.js +238 -10
  225. package/dist/components/tooltip/TooltipWrapper.stories.js.map +1 -1
  226. package/dist/index.css +8 -0
  227. package/dist/index.css.map +1 -1
  228. package/dist/utils/PopupParentContext.stories.d.ts +17 -0
  229. package/dist/utils/PopupParentContext.stories.d.ts.map +1 -0
  230. package/dist/utils/PopupParentContext.stories.js +266 -0
  231. package/dist/utils/PopupParentContext.stories.js.map +1 -0
  232. package/dist/utils/getDefaultPopupParent.d.ts.map +1 -1
  233. package/dist/utils/getDefaultPopupParent.js +6 -0
  234. package/dist/utils/getDefaultPopupParent.js.map +1 -1
  235. package/package.json +1 -1
  236. package/src/components/articleCard/ArticleCard.stories.tsx +524 -111
  237. package/src/components/avatar/Avatar.stories.tsx +504 -59
  238. package/src/components/avatarGroup/AvatarGroup.stories.tsx +977 -175
  239. package/src/components/banner/Banner.stories.tsx +7 -3
  240. package/src/components/card/Card.stories.tsx +466 -36
  241. package/src/components/combobox/Combobox.stories.tsx +867 -260
  242. package/src/components/datePicker/DatePicker.stories.tsx +777 -60
  243. package/src/components/dateTimePicker/DateTimePicker.stories.tsx +910 -132
  244. package/src/components/editableText/EditableText.stories.tsx +567 -91
  245. package/src/components/formField/FormField.test.tsx +6 -0
  246. package/src/components/formField/FormField.tsx +5 -0
  247. package/src/components/formField/fieldset/Fieldset.stories.tsx +761 -51
  248. package/src/components/formField/inputs/checkbox/CheckboxGroup.tsx +1 -1
  249. package/src/components/formField/inputs/checkbox/CheckboxInput.tsx +1 -1
  250. package/src/components/formField/inputs/colourPickerDropdown/ColourPickerDropdown.stories.tsx +504 -11
  251. package/src/components/formField/inputs/radio/RadioButtonGroup.tsx +17 -4
  252. package/src/components/formField/inputs/radio/RadioButtonInput.stories.tsx +71 -59
  253. package/src/components/formField/inputs/selectDropdown/SelectDropdown.stories.tsx +1079 -168
  254. package/src/components/formField/inputs/time/TimeInput.stories.tsx +1140 -104
  255. package/src/components/formField/label/Label.stories.tsx +317 -8
  256. package/src/components/icoText/IcoText.stories.tsx +442 -31
  257. package/src/components/kpiCard/KPICard.stories.tsx +475 -30
  258. package/src/components/kvpList/KVPList.stories.tsx +593 -26
  259. package/src/components/modal/Modal.stories.tsx +963 -26
  260. package/src/components/modal/modalManager/ModalManager.stories.tsx +612 -454
  261. package/src/components/pill/Pill.stories.tsx +11 -13
  262. package/src/components/pill/Pill.tsx +1 -0
  263. package/src/components/row/Row.stories.tsx +474 -58
  264. package/src/components/searchBar/SearchBar.stories.tsx +570 -38
  265. package/src/components/section/Section.stories.tsx +723 -70
  266. package/src/components/singleUser/SingleUser.stories.tsx +393 -34
  267. package/src/components/slideoverManager/SlideoverManager.stories.tsx +572 -342
  268. package/src/components/table/DSDefaultColDef.ts +25 -5
  269. package/src/components/table/Table.stories.tsx +460 -5
  270. package/src/components/table/Table.test.tsx +53 -0
  271. package/src/components/table/Table.tsx +9 -2
  272. package/src/components/table/TableFooter.stories.tsx +196 -0
  273. package/src/components/table/TableHeader.stories.tsx +251 -0
  274. package/src/components/table/cellEditors/DateCellEditor.stories.tsx +245 -0
  275. package/src/components/table/cellRenderers/BooleanCellRenderer.stories.tsx +278 -0
  276. package/src/components/table/cellRenderers/ButtonCellRenderer.stories.tsx +333 -0
  277. package/src/components/table/cellRenderers/CheckboxCellRenderer.stories.tsx +337 -0
  278. package/src/components/table/cellRenderers/CheckboxCellRenderer.tsx +5 -1
  279. package/src/components/table/cellRenderers/DefaultCellRenderer.stories.tsx +342 -0
  280. package/src/components/table/cellRenderers/InlineTextCellRenderer.stories.tsx +292 -0
  281. package/src/components/table/cellRenderers/SelectDropdownCellRenderer.stories.tsx +369 -0
  282. package/src/components/table/columnFilters/BooleanFilter.stories.tsx +268 -0
  283. package/src/components/table/columnFilters/TimeFilter.stories.tsx +281 -0
  284. package/src/components/table/pagination/PaginationPanel.stories.tsx +327 -0
  285. package/src/components/table/tableControls/HideColumnsDropdown.tsx +11 -2
  286. package/src/components/table/tableControls/TableControls.stories.tsx +415 -0
  287. package/src/components/table/tableControls/TableSettingsDropdown.test.tsx +207 -0
  288. package/src/components/table/tableControls/TableSettingsDropdown.tsx +103 -39
  289. package/src/components/tabs/Tabs.stories.tsx +540 -60
  290. package/src/components/tabs/TabsItem.stories.tsx +82 -8
  291. package/src/components/toast/Toast.stories.tsx +539 -77
  292. package/src/components/toggle/Toggle.stories.tsx +371 -135
  293. package/src/components/tooltip/Tooltip.stories.tsx +606 -15
  294. package/src/components/tooltip/TooltipWrapper.stories.tsx +348 -12
  295. package/src/docs/Contributing.mdx +241 -0
  296. package/src/docs/UsingComponents.mdx +93 -0
  297. package/src/docs/Welcome.mdx +68 -0
  298. package/src/global.scss +7 -0
  299. package/src/utils/PopupParentContext.stories.tsx +367 -0
  300. package/src/utils/getDefaultPopupParent.ts +6 -0
  301. package/.ralph/storybook-upgrade/knowledge.md +0 -308
  302. package/.ralph/storybook-upgrade/prd.json +0 -777
  303. package/.ralph/storybook-upgrade/progress.md +0 -342
  304. package/src/components/table/TableWIP.mdx +0 -3
@@ -1,4 +1,10 @@
1
- import type { CellClassParams, CellFocusedParams, ColDef, SuppressMouseEventHandlingParams, ValueFormatterFunc } from 'ag-grid-community';
1
+ import type {
2
+ CellClassParams,
3
+ CellFocusedParams,
4
+ ColDef,
5
+ SuppressMouseEventHandlingParams,
6
+ ValueFormatterFunc,
7
+ } from 'ag-grid-community';
2
8
  import { cellColorStyles } from './cellColorStyles';
3
9
 
4
10
  // checks if the value is wrapped in a object with a value property
@@ -15,17 +21,28 @@ export const defaultValueFormatter: ValueFormatterFunc = (params) => {
15
21
  return value;
16
22
  };
17
23
 
18
- export const shouldSuppressFocus = (params: SuppressMouseEventHandlingParams | CellClassParams | CellFocusedParams) => {
24
+ export const shouldSuppressFocus = (
25
+ params:
26
+ | SuppressMouseEventHandlingParams
27
+ | CellClassParams
28
+ | CellFocusedParams,
29
+ ) => {
19
30
  if (typeof params.column !== 'object') {
20
31
  return false;
21
32
  }
22
- return params.column?.getColDef().cellRendererParams.suppressCellFocusAndFocusFirstElement ?? false;
33
+ return (
34
+ params.column?.getColDef()?.cellRendererParams
35
+ ?.suppressCellFocusAndFocusFirstElement ?? false
36
+ );
23
37
  };
24
38
 
25
39
  export const DSDefaultColDef: ColDef = {
26
40
  cellStyle: cellColorStyles,
27
41
  valueGetter: (params) => {
28
- const { data, colDef: { field } } = params;
42
+ const {
43
+ data,
44
+ colDef: { field },
45
+ } = params;
29
46
  if (data == null || field == null) {
30
47
  return undefined;
31
48
  }
@@ -33,7 +50,10 @@ export const DSDefaultColDef: ColDef = {
33
50
  },
34
51
  valueFormatter: defaultValueFormatter,
35
52
  filterValueGetter: (params) => {
36
- const { data, colDef: { field } } = params;
53
+ const {
54
+ data,
55
+ colDef: { field },
56
+ } = params;
37
57
  if (data == null || field == null) {
38
58
  return undefined;
39
59
  }
@@ -1,4 +1,14 @@
1
1
  import type { Meta, StoryObj } from '@storybook/react-vite';
2
+ import { fn } from '@storybook/test';
3
+ import {
4
+ Controls,
5
+ Heading as DocHeading,
6
+ Markdown,
7
+ Primary as DocPrimary,
8
+ Stories,
9
+ Subtitle,
10
+ Title,
11
+ } from '@storybook/addon-docs/blocks';
2
12
  import { type Column, type ColDef, type ColGroupDef } from 'ag-grid-enterprise';
3
13
  import { Table } from './Table';
4
14
  import { Button } from 'Components/button/Button';
@@ -24,15 +34,344 @@ import type { CustomCellRendererProps } from 'ag-grid-react';
24
34
 
25
35
  type TableProps = ComponentProps<typeof Table>;
26
36
 
37
+ // ---------------------------------------------------------------------------
38
+ // Content strings for the custom DocsPage
39
+ // ---------------------------------------------------------------------------
40
+
41
+ const DESCRIPTION_INTRO = [
42
+ '`Table` is an enterprise-grade data table built on top of [AG Grid React](https://www.ag-grid.com/react-data-grid/).',
43
+ 'It wraps `AgGridReact` with Arbor design tokens, a custom theme, built-in search, pagination, bulk actions,',
44
+ 'hide-columns, and a suite of custom cell renderers and column filters.',
45
+ 'All AG Grid props pass through via `...rest`, so the full AG Grid API is available.',
46
+ ].join(' ');
47
+
48
+ const PROPS_INTRO
49
+ = 'The preview below is wired to the **Controls** panel — tweak any DS-specific prop to see the story update in real time.';
50
+
51
+ const USAGE_GUIDANCE = [
52
+ '### When to use',
53
+ '',
54
+ '- Displaying large, structured datasets where users need to sort, filter, search, or paginate.',
55
+ '- Any screen in Arbor that renders rows of records (pupil lists, staff registers, attendance grids, marksheets).',
56
+ '- When cells need interactive controls — buttons, dropdowns, checkboxes, date pickers.',
57
+ '- When column visibility, row selection, and bulk actions are required.',
58
+ '',
59
+ '---',
60
+ '',
61
+ '### When NOT to use',
62
+ '',
63
+ '| Situation | Use instead |',
64
+ '|---|---|',
65
+ '| A small read-only list of key–value pairs | [`Section`](?path=/docs/components-section--docs) with [`Row`](?path=/docs/components-row--docs) components |',
66
+ '| A two-column data summary (label + value) | [`Row`](?path=/docs/components-row--docs) inside a `Section` |',
67
+ '| Simple static HTML tables | Native `<table>` with semantic markup |',
68
+ '| A handful of rows that never change | Native `<table>` — AG Grid has overhead |',
69
+ ].join('\n');
70
+
71
+ const DEVELOPER_NOTES = [
72
+ '### AG Grid license',
73
+ '',
74
+ '`setAgGridLicenseKey()` is called automatically inside the `Table` component.',
75
+ 'You do **not** need to call it yourself.',
76
+ '',
77
+ '---',
78
+ '',
79
+ '### Registered cell renderers',
80
+ '',
81
+ 'These string keys are pre-registered and available in any `cellRenderer` or `cellRendererParams`:',
82
+ '',
83
+ '| Key | Component | Purpose |',
84
+ '|---|---|---|',
85
+ '| `dsButtonCellRenderer` | `Table.ButtonCellRenderer` | Renders a `Button` inside a cell |',
86
+ '| `dsInlineTextCellRenderer` | `Table.InlineTextCellRenderer` | Inline text editing with expand/collapse support |',
87
+ '| `dsSelectDropdownCellRenderer` | `Table.SelectDropdownCellRenderer` | Renders a `SelectDropdown` in a cell |',
88
+ '| `dsBooleanCellRenderer` | `Table.BooleanCellRenderer` | Read-only boolean display |',
89
+ '| `dsCheckboxCellRenderer` | `Table.CheckboxCellRenderer` | Editable boolean checkbox |',
90
+ '| `dsDateCellEditor` | `Table.DateCellEditor` | Date picker cell editor |',
91
+ '',
92
+ '---',
93
+ '',
94
+ '### Registered column filters',
95
+ '',
96
+ '| Import | `doesFilterPass` helper | Use case |',
97
+ '|---|---|---|',
98
+ '| `BooleanFilter` | `doesBooleanFilterPass` | Filtering boolean / active columns |',
99
+ '| `TimeFilter` | `doesTimeFilterPass` | Filtering time string columns |',
100
+ '',
101
+ '---',
102
+ '',
103
+ '### Header and footer slots',
104
+ '',
105
+ '- `headerContent` — pass any `ReactNode` here; the `<TableHeader>` wraps it with a built-in search bar.',
106
+ ' Use `Table.TableControls` for the standard toolbar (bulk actions, hide columns, settings, download, help, expand).',
107
+ '- `hasSearch` (default `true`) — controls whether the search bar is rendered inside the header.',
108
+ ' Set to `false` when the header has no search functionality.',
109
+ '- `footerContent` — pass any `ReactNode` here; the `<TableFooter>` wraps it.',
110
+ ' Use `Table.PaginationPanel` for standard pagination.',
111
+ '',
112
+ '---',
113
+ '',
114
+ '### TableSettingsDropdown customisation',
115
+ '',
116
+ '`Table.TableSettingsDropdown` accepts an optional `items` prop to control which controls are shown and in what order.',
117
+ 'Omit `items` (or omit any key) to hide that control entirely.',
118
+ '',
119
+ '```tsx',
120
+ '// Built-in keys — use any subset in any order:',
121
+ '<Table.TableSettingsDropdown items={[\'tableSpacing\', \'separator\', \'style\']} />',
122
+ '',
123
+ '// Custom checkbox group:',
124
+ '<Table.TableSettingsDropdown items={[',
125
+ ' \'tableSpacing\',',
126
+ ' { type: \'checkboxGroup\', legend: \'View options\', options: [',
127
+ ' { label: \'Show inactive\', checked: showInactive, onChange: setShowInactive },',
128
+ ' ] },',
129
+ ']} />',
130
+ '',
131
+ '// Custom radio group:',
132
+ '<Table.TableSettingsDropdown items={[',
133
+ ' { type: \'radioGroup\', legend: \'Display\', name: \'display\', checkedValue: view, onChange: setView,',
134
+ ' options: [{ label: \'Compact\', value: \'compact\' }, { label: \'Default\', value: \'default\' }] },',
135
+ ']} />',
136
+ '```',
137
+ '',
138
+ 'Use `Table.SettingsItems` to access the default items array and extend it:',
139
+ '',
140
+ '```tsx',
141
+ 'const myItems = [...Table.SettingsItems, { type: \'checkboxGroup\', options: [...] }];',
142
+ '<Table.TableSettingsDropdown items={myItems} />',
143
+ '```',
144
+ '',
145
+ 'Use `onTableSettingsReset` on `Table` to reset your custom state when the reset button is clicked.',
146
+ '',
147
+ '---',
148
+ '',
149
+ '### Themes',
150
+ '',
151
+ '| Value | Description |',
152
+ '|---|---|',
153
+ '| _(omit)_ | Default Arbor table theme with full spacing and borders |',
154
+ '| `"tidy"` | Compact theme for dense layouts like marksheets. Suppresses expand/collapse icons. |',
155
+ '',
156
+ '---',
157
+ '',
158
+ '### Table spacing',
159
+ '',
160
+ 'Use `Table.Spacing` (enum `TABLE_SPACING`) when handling `onTableSpacingChanged`:',
161
+ '',
162
+ '```ts',
163
+ "import { Table } from '@arbor-education/design-system.components';",
164
+ '',
165
+ '// Table.Spacing values:',
166
+ '// Table.Spacing.XS → 0',
167
+ '// Table.Spacing.S → var(--spacing-xsmall)',
168
+ '// Table.Spacing.M → var(--spacing-small) ← default',
169
+ '// Table.Spacing.L → var(--spacing-medium)',
170
+ '```',
171
+ '',
172
+ '---',
173
+ '',
174
+ '### GridApiContext',
175
+ '',
176
+ 'Child components that need the AG Grid `GridApi` can consume `Table.GridApiContext`:',
177
+ '',
178
+ '```tsx',
179
+ "import { useContext } from 'react';",
180
+ "import { Table } from '@arbor-education/design-system.components';",
181
+ '',
182
+ 'function MyTableChild() {',
183
+ ' const gridApi = useContext(Table.GridApiContext);',
184
+ ' return <button onClick={() => gridApi?.exportDataAsCsv()}>Export</button>;',
185
+ '}',
186
+ '```',
187
+ '',
188
+ '---',
189
+ '',
190
+ '### DefaultColDef and DefaultValueFormatter',
191
+ '',
192
+ '`Table.DefaultColDef` contains Arbor defaults (editable, sortable, resizable, min-width, flex).',
193
+ 'Spread it into your `defaultColDef` and add overrides:',
194
+ '',
195
+ '```ts',
196
+ 'const defaultColDef = {',
197
+ ' ...Table.DefaultColDef,',
198
+ ' editable: false, // override',
199
+ '};',
200
+ '```',
201
+ '',
202
+ '`Table.DefaultValueFormatter` handles the `{ value: string }` cell data shape.',
203
+ 'Any column using the object cell shape (`{ value, backgroundColor, foregroundColor, semanticColor }`) **must** use this formatter.',
204
+ '',
205
+ '---',
206
+ '',
207
+ '### TypeScript types',
208
+ '',
209
+ '```ts',
210
+ "import { Table } from '@arbor-education/design-system.components';",
211
+ "import type { TableProps, TableControlsProps, BulkAction, HideColumnsProps } from '@arbor-education/design-system.components';",
212
+ '',
213
+ '// or via namespace:',
214
+ 'type MyTableProps = Table.Props;',
215
+ 'type MyControlsProps = Table.ControlsProps;',
216
+ 'type MyBulkAction = Table.BulkAction;',
217
+ 'type MySpacing = Table.Spacing;',
218
+ '',
219
+ '// Table.SettingsItems — the default settings items array (spread to extend):',
220
+ 'const myItems = [...Table.SettingsItems, { type: \'checkboxGroup\' as const, options: [] }];',
221
+ '```',
222
+ ].join('\n');
223
+
224
+ const RELATED_COMPONENTS = [
225
+ '## Related components',
226
+ '',
227
+ '[Section](?path=/docs/components-section--docs) · [Row](?path=/docs/components-row--docs) · [Button](?path=/docs/components-button--docs) · [SelectDropdown](?path=/docs/components-selectdropdown--docs)',
228
+ ].join('\n');
229
+
230
+ // ---------------------------------------------------------------------------
231
+ // Custom DocsPage
232
+ // ---------------------------------------------------------------------------
233
+
234
+ function TableDocsPage() {
235
+ return (
236
+ <>
237
+ <Title />
238
+ <Subtitle />
239
+ <Markdown>{DESCRIPTION_INTRO}</Markdown>
240
+ <DocHeading>Interactive example</DocHeading>
241
+ <Markdown>{PROPS_INTRO}</Markdown>
242
+ <DocPrimary />
243
+ <Controls />
244
+ <DocHeading>Usage guidance</DocHeading>
245
+ <Markdown>{USAGE_GUIDANCE}</Markdown>
246
+ <DocHeading>Developer notes</DocHeading>
247
+ <Markdown>{DEVELOPER_NOTES}</Markdown>
248
+ <DocHeading>Examples</DocHeading>
249
+ <Stories title="" />
250
+ <Markdown>{RELATED_COMPONENTS}</Markdown>
251
+ </>
252
+ );
253
+ }
254
+
255
+ // ---------------------------------------------------------------------------
256
+ // Meta
257
+ // ---------------------------------------------------------------------------
258
+
27
259
  const meta: Meta<TableProps> = {
28
260
  title: 'Components/Table',
29
261
  component: Table,
30
262
  tags: ['autodocs'],
31
263
  parameters: {
264
+ layout: 'padded',
32
265
  docs: {
33
- description: {
34
- component:
35
- 'The Table component is a wrapper around the ag-grid-react component. It provides a set of props that can be used to configure the table.',
266
+ page: TableDocsPage,
267
+ },
268
+ },
269
+ argTypes: {
270
+ wrapperClassName: {
271
+ description: 'Additional CSS class names applied to the root `<section>` wrapper.',
272
+ control: 'text',
273
+ table: {
274
+ type: { summary: 'string' },
275
+ defaultValue: { summary: 'undefined' },
276
+ },
277
+ },
278
+ hasSearch: {
279
+ description: [
280
+ 'When `true` (the default) a quick-filter search bar is rendered inside the header area.',
281
+ 'Set to `false` when using `headerContent` without a search requirement,',
282
+ 'or when you want to suppress the search bar entirely.',
283
+ ].join(' '),
284
+ control: 'boolean',
285
+ table: {
286
+ type: { summary: 'boolean' },
287
+ defaultValue: { summary: 'true' },
288
+ },
289
+ },
290
+ headerContent: {
291
+ description: [
292
+ 'ReactNode rendered inside the `<TableHeader>` above the grid.',
293
+ 'Use `Table.TableControls` for the standard composed toolbar.',
294
+ 'The built-in search bar appears here when `hasSearch` is `true`.',
295
+ ].join(' '),
296
+ control: false,
297
+ table: {
298
+ type: { summary: 'ReactNode' },
299
+ defaultValue: { summary: 'undefined' },
300
+ },
301
+ },
302
+ footerContent: {
303
+ description: [
304
+ 'ReactNode rendered inside the `<TableFooter>` below the grid.',
305
+ 'Use `Table.PaginationPanel` for standard client-side or server-side pagination.',
306
+ ].join(' '),
307
+ control: false,
308
+ table: {
309
+ type: { summary: 'ReactNode' },
310
+ defaultValue: { summary: 'undefined' },
311
+ },
312
+ },
313
+ tableTheme: {
314
+ description: [
315
+ 'Visual theme for the grid.',
316
+ 'Pass `"tidy"` for the compact marksheet-style theme.',
317
+ 'Omit (or pass `undefined`) for the default Arbor table theme.',
318
+ ].join(' '),
319
+ control: 'select',
320
+ options: [undefined, 'tidy'],
321
+ table: {
322
+ type: { summary: "'tidy' | undefined" },
323
+ defaultValue: { summary: 'undefined' },
324
+ },
325
+ },
326
+ enableSimultaneousRangeAndRowSelection: {
327
+ description: [
328
+ 'When `true`, allows both cell-range selection and row selection to be active at the same time.',
329
+ 'Default `false` — drag selection clears row selection.',
330
+ ].join(' '),
331
+ control: 'boolean',
332
+ table: {
333
+ type: { summary: 'boolean' },
334
+ defaultValue: { summary: 'false' },
335
+ },
336
+ },
337
+ disableDragSelect: {
338
+ description: 'When `true`, disables drag-to-select behaviour on cell range selection.',
339
+ control: 'boolean',
340
+ table: {
341
+ type: { summary: 'boolean' },
342
+ defaultValue: { summary: 'false' },
343
+ },
344
+ },
345
+ onTableSettingsChanged: {
346
+ description: 'Fired when the user changes table settings (column borders, spacing, cell colours) via the settings dropdown.',
347
+ control: false,
348
+ table: {
349
+ type: { summary: '(settings: TableSettings) => void' },
350
+ defaultValue: { summary: 'undefined' },
351
+ },
352
+ },
353
+ onTableSpacingChanged: {
354
+ description: 'Fired when the user changes row spacing. Receives a `Table.Spacing` (TABLE_SPACING) enum value.',
355
+ control: false,
356
+ table: {
357
+ type: { summary: '(val: TABLE_SPACING) => void' },
358
+ defaultValue: { summary: 'undefined' },
359
+ },
360
+ },
361
+ onColumnBordersChanged: {
362
+ description: 'Fired when the user toggles column borders on or off via the settings dropdown.',
363
+ control: false,
364
+ table: {
365
+ type: { summary: '(hasBorders: boolean) => void' },
366
+ defaultValue: { summary: 'undefined' },
367
+ },
368
+ },
369
+ onTableSettingsReset: {
370
+ description: 'Fired when the user resets all table settings to their defaults.',
371
+ control: false,
372
+ table: {
373
+ type: { summary: '() => void' },
374
+ defaultValue: { summary: 'undefined' },
36
375
  },
37
376
  },
38
377
  },
@@ -505,7 +844,53 @@ export const WithHideColumnsDropdown: Story = {
505
844
  headerContent={(
506
845
  <HideColumnsDropdown
507
846
  overrideColumnHiding={overrideColumnHiding}
508
- onSelectionChanged={console.log}
847
+ onSelectionChanged={fn()}
848
+ />
849
+ )}
850
+ />
851
+ );
852
+ },
853
+ };
854
+
855
+ export const WithInitiallyHiddenColumns: Story = {
856
+ parameters: {
857
+ docs: {
858
+ description: {
859
+ story:
860
+ 'Use AG Grid initial state to start with selected columns hidden. This example hides the email and role columns on first render.',
861
+ },
862
+ },
863
+ },
864
+ args: {
865
+ rowData: sampleData,
866
+ columnDefs: sampleColumnDefs,
867
+ defaultColDef,
868
+ domLayout: 'autoHeight',
869
+ initialState: {
870
+ columnVisibility: {
871
+ hiddenColIds: ['email', 'role'],
872
+ },
873
+ },
874
+ },
875
+ render: (args) => {
876
+ const {
877
+ rowData,
878
+ columnDefs,
879
+ defaultColDef,
880
+ domLayout,
881
+ initialState,
882
+ } = args;
883
+
884
+ return (
885
+ <Table
886
+ rowData={rowData}
887
+ columnDefs={columnDefs}
888
+ defaultColDef={defaultColDef}
889
+ domLayout={domLayout}
890
+ initialState={initialState}
891
+ headerContent={(
892
+ <HideColumnsDropdown
893
+ onSelectionChanged={fn()}
509
894
  />
510
895
  )}
511
896
  />
@@ -557,7 +942,7 @@ export const WithRestrictedHideColumnsDropdown: Story = {
557
942
  headerContent={(
558
943
  <HideColumnsDropdown
559
944
  overrideColumnHiding={overrideColumnHiding}
560
- onSelectionChanged={console.log}
945
+ onSelectionChanged={fn()}
561
946
  columns={columns}
562
947
  />
563
948
  )}
@@ -1754,6 +2139,76 @@ const checkboxColumnDefs: ColDef[] = [
1754
2139
  },
1755
2140
  ];
1756
2141
 
2142
+ export const WithTableSettingsDropdownItems: Story = {
2143
+ parameters: {
2144
+ docs: {
2145
+ description: {
2146
+ story:
2147
+ 'Pass an `items` array to control exactly which controls appear. Only the items you include will be shown. Available keys: `tableSpacing`, `separator`, `style`.',
2148
+ },
2149
+ },
2150
+ },
2151
+ args: {
2152
+ rowData: sampleData,
2153
+ columnDefs: sampleColumnDefs,
2154
+ defaultColDef,
2155
+ domLayout: 'autoHeight',
2156
+ headerContent: (
2157
+ <Table.TableSettingsDropdown
2158
+ items={['tableSpacing']}
2159
+ />
2160
+ ),
2161
+ },
2162
+ };
2163
+
2164
+ export const WithTableSettingsDropdownCustomItems: Story = {
2165
+ parameters: {
2166
+ docs: {
2167
+ description: {
2168
+ story:
2169
+ 'Pass an `items` array with any mix of built-in keys and custom item objects in any order. Built-in keys: `tableSpacing`, `separator`, `style`. For custom items, use `{ type: "checkboxGroup", legend?, options }` for a group of toggles or `{ type: "radioGroup", legend?, name, checkedValue, onChange, options }` for mutually exclusive options. Custom item state is managed externally. Use `onTableSettingsReset` on the Table to reset custom state when the reset button is clicked.',
2170
+ },
2171
+ },
2172
+ },
2173
+ args: {
2174
+ rowData: sampleData,
2175
+ columnDefs: sampleColumnDefs,
2176
+ defaultColDef,
2177
+ domLayout: 'autoHeight',
2178
+ },
2179
+ render: (args) => {
2180
+ const [showInactive, setShowInactive] = useState(false);
2181
+ const filteredData = showInactive
2182
+ ? args.rowData
2183
+ : args.rowData?.filter((row: RowData) => row.active);
2184
+
2185
+ return (
2186
+ <Table
2187
+ {...args}
2188
+ rowData={filteredData}
2189
+ onTableSettingsReset={() => setShowInactive(false)}
2190
+ headerContent={(
2191
+ <Table.TableSettingsDropdown
2192
+ items={[
2193
+ 'tableSpacing',
2194
+ 'separator',
2195
+ 'style',
2196
+ 'separator',
2197
+ {
2198
+ type: 'checkboxGroup',
2199
+ legend: 'View options',
2200
+ options: [
2201
+ { label: 'Show inactive users', checked: showInactive, onChange: setShowInactive },
2202
+ ],
2203
+ },
2204
+ ]}
2205
+ />
2206
+ )}
2207
+ />
2208
+ );
2209
+ },
2210
+ };
2211
+
1757
2212
  export const WithCheckboxCellRenderer: Story = {
1758
2213
  parameters: {
1759
2214
  docs: {
@@ -7,6 +7,7 @@ import { HideColumnsDropdown } from 'Components/table/tableControls/HideColumnsD
7
7
  import { TableSettingsDropdown } from './tableControls/TableSettingsDropdown';
8
8
  import userEvent from '@testing-library/user-event';
9
9
  import type { GridApi } from 'ag-grid-enterprise';
10
+ import type { Column } from 'ag-grid-community';
10
11
  import * as focusFirstFocusableElementModule from 'Utils/focusFirstFocusableElement';
11
12
 
12
13
  describe('Table', () => {
@@ -385,6 +386,25 @@ describe('Table', () => {
385
386
  });
386
387
  });
387
388
 
389
+ test('reflects initially hidden columns in dropdown text', async () => {
390
+ render(
391
+ <Table
392
+ columnDefs={columnDefs}
393
+ rowData={rowData}
394
+ initialState={{
395
+ columnVisibility: {
396
+ hiddenColIds: ['email'],
397
+ },
398
+ }}
399
+ headerContent={<HideColumnsDropdown />}
400
+ />,
401
+ );
402
+
403
+ await waitFor(() => {
404
+ expect(screen.getByText('Hide (1)')).toBeInTheDocument();
405
+ });
406
+ });
407
+
388
408
  test('works with custom columns prop', async () => {
389
409
  const mockColumn = {
390
410
  getColDef: () => ({ headerName: 'Custom Column' }),
@@ -417,6 +437,39 @@ describe('Table', () => {
417
437
  expect(menuItems[0]).toHaveTextContent('Custom Column');
418
438
  });
419
439
 
440
+ test('reflects initially hidden state when using custom columns prop', async () => {
441
+ const visibleColumn = {
442
+ getColDef: () => ({ headerName: 'Visible Column' }),
443
+ isVisible: () => true,
444
+ getColId: () => 'visible',
445
+ };
446
+
447
+ const hiddenColumn = {
448
+ getColDef: () => ({ headerName: 'Hidden Column' }),
449
+ isVisible: () => false,
450
+ getColId: () => 'hidden',
451
+ };
452
+
453
+ render(
454
+ <div>
455
+ <HideColumnsDropdown
456
+ columns={[visibleColumn, hiddenColumn] as unknown as Column[]}
457
+ overrideColumnHiding
458
+ />
459
+ </div>,
460
+ );
461
+
462
+ await waitFor(() => expect(screen.getByText('Hide (1)')).toBeInTheDocument());
463
+ await userEvent.click(screen.getByText('Hide (1)'));
464
+
465
+ const menuItems = await screen.findAllByRole('menuitemcheckbox');
466
+ const visibleColumnItem = menuItems.find(item => item.textContent === 'Visible Column');
467
+ const hiddenColumnItem = menuItems.find(item => item.textContent === 'Hidden Column');
468
+
469
+ expect(visibleColumnItem).toHaveAttribute('aria-checked', 'false');
470
+ expect(hiddenColumnItem).toHaveAttribute('aria-checked', 'true');
471
+ });
472
+
420
473
  test('returns null when no columns are available', () => {
421
474
  const { container } = render(
422
475
  <div><HideColumnsDropdown columns={[]} /></div>,
@@ -2,7 +2,7 @@ import { AllEnterpriseModule, ModuleRegistry, type GridApi } from 'ag-grid-enter
2
2
  import { AgGridReact, type AgGridReactProps } from 'ag-grid-react';
3
3
  import { defaultTheme } from './theme/defaultTheme';
4
4
  import classNames from 'classnames';
5
- import { useRef, useState, type ReactNode } from 'react';
5
+ import { useContext, useRef, useState, type ReactNode } from 'react';
6
6
  import { TableFooter } from './TableFooter';
7
7
  import { TableHeader } from './TableHeader';
8
8
  import { GridApiContext } from './GridApiContext';
@@ -14,6 +14,7 @@ import { BulkActionsDropdown } from './tableControls/BulkActionsDropdown';
14
14
  import { HideColumnsDropdown } from './tableControls/HideColumnsDropdown';
15
15
  import { useTableSettings, type UseTableSettingsParams } from './useTableSettings';
16
16
  import { setAgGridLicenseKey } from 'Utils/setAgGridLicenseKey';
17
+ import { PopupParentContext } from 'Utils/PopupParentContext';
17
18
  import { toggleRowSelectionInCurrentRange } from './toggleRowSelectionInCurrentRange';
18
19
  import { defaultValueFormatter, DSDefaultColDef, shouldSuppressFocus } from './DSDefaultColDef';
19
20
  import { NumberCellEditor } from './cellEditors/NumberCellEditor';
@@ -25,7 +26,7 @@ import { focusFirstFocusableElement } from 'Utils/focusFirstFocusableElement';
25
26
  import { BooleanFilter } from './columnFilters/BooleanFilter/BooleanFilter';
26
27
  import { TimeFilter } from './columnFilters/TimeFilter/TimeFilter';
27
28
  import { DateCellEditor } from './cellEditors/DateCellEditor';
28
- import { TableSettingsDropdown } from './tableControls/TableSettingsDropdown';
29
+ import { TableSettingsDropdown, TABLE_SETTINGS_ITEMS } from './tableControls/TableSettingsDropdown';
29
30
  import { TableControls, type TableControlsProps, type BulkAction as BulkActionType } from './tableControls/TableControls';
30
31
  import type { HideColumnsDropdownProps } from './tableControls/HideColumnsDropdown';
31
32
  import { TABLE_SPACING } from './tableConsts';
@@ -87,6 +88,8 @@ export const Table = (props: TableProps) => {
87
88
 
88
89
  const [searchValue, setSearchValue] = useState('');
89
90
 
91
+ const popupParentRef = useContext(PopupParentContext);
92
+
90
93
  const {
91
94
  settings,
92
95
  resetSettings,
@@ -150,6 +153,7 @@ export const Table = (props: TableProps) => {
150
153
  )}
151
154
  <AgGridReact
152
155
  theme={getTheme()}
156
+ popupParent={popupParentRef.current}
153
157
  onGridReady={(event) => {
154
158
  const { api } = event;
155
159
  setGridApi(api);
@@ -217,6 +221,8 @@ Table.RowCountInfo = RowCountInfo;
217
221
  Table.BulkActionsDropdown = BulkActionsDropdown;
218
222
  Table.HideColumnsDropdown = HideColumnsDropdown;
219
223
  Table.ButtonCellRenderer = ButtonCellRenderer;
224
+ Table.InlineTextCellRenderer = InlineTextCellRenderer;
225
+ Table.SelectDropdownCellRenderer = SelectDropdownCellRenderer;
220
226
  Table.BooleanCellRenderer = BooleanCellRenderer;
221
227
  Table.DefaultCellRenderer = DefaultCellRenderer;
222
228
  Table.DateCellEditor = DateCellEditor;
@@ -228,6 +234,7 @@ Table.TableSettingsDropdown = TableSettingsDropdown;
228
234
  Table.TableControls = TableControls;
229
235
 
230
236
  Table.Spacing = TABLE_SPACING;
237
+ Table.SettingsItems = TABLE_SETTINGS_ITEMS;
231
238
 
232
239
  export namespace Table {
233
240
  // eslint-disable-next-line @typescript-eslint/no-explicit-any