@arbor-education/design-system.components 0.15.0 → 0.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (297) hide show
  1. package/.gather/skills/write-stories/SKILL.md +207 -271
  2. package/.storybook/preview.ts +5 -0
  3. package/CHANGELOG.md +17 -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 +2 -0
  131. package/dist/components/table/Table.stories.d.ts.map +1 -1
  132. package/dist/components/table/Table.stories.js +357 -3
  133. package/dist/components/table/Table.stories.js.map +1 -1
  134. package/dist/components/table/TableFooter.stories.d.ts +49 -0
  135. package/dist/components/table/TableFooter.stories.d.ts.map +1 -0
  136. package/dist/components/table/TableFooter.stories.js +137 -0
  137. package/dist/components/table/TableFooter.stories.js.map +1 -0
  138. package/dist/components/table/TableHeader.stories.d.ts +93 -0
  139. package/dist/components/table/TableHeader.stories.d.ts.map +1 -0
  140. package/dist/components/table/TableHeader.stories.js +176 -0
  141. package/dist/components/table/TableHeader.stories.js.map +1 -0
  142. package/dist/components/table/cellEditors/DateCellEditor.stories.d.ts +44 -0
  143. package/dist/components/table/cellEditors/DateCellEditor.stories.d.ts.map +1 -0
  144. package/dist/components/table/cellEditors/DateCellEditor.stories.js +186 -0
  145. package/dist/components/table/cellEditors/DateCellEditor.stories.js.map +1 -0
  146. package/dist/components/table/cellRenderers/BooleanCellRenderer.stories.d.ts +40 -0
  147. package/dist/components/table/cellRenderers/BooleanCellRenderer.stories.d.ts.map +1 -0
  148. package/dist/components/table/cellRenderers/BooleanCellRenderer.stories.js +209 -0
  149. package/dist/components/table/cellRenderers/BooleanCellRenderer.stories.js.map +1 -0
  150. package/dist/components/table/cellRenderers/ButtonCellRenderer.stories.d.ts +48 -0
  151. package/dist/components/table/cellRenderers/ButtonCellRenderer.stories.d.ts.map +1 -0
  152. package/dist/components/table/cellRenderers/ButtonCellRenderer.stories.js +244 -0
  153. package/dist/components/table/cellRenderers/ButtonCellRenderer.stories.js.map +1 -0
  154. package/dist/components/table/cellRenderers/CheckboxCellRenderer.d.ts.map +1 -1
  155. package/dist/components/table/cellRenderers/CheckboxCellRenderer.js +3 -1
  156. package/dist/components/table/cellRenderers/CheckboxCellRenderer.js.map +1 -1
  157. package/dist/components/table/cellRenderers/CheckboxCellRenderer.stories.d.ts +64 -0
  158. package/dist/components/table/cellRenderers/CheckboxCellRenderer.stories.d.ts.map +1 -0
  159. package/dist/components/table/cellRenderers/CheckboxCellRenderer.stories.js +241 -0
  160. package/dist/components/table/cellRenderers/CheckboxCellRenderer.stories.js.map +1 -0
  161. package/dist/components/table/cellRenderers/DefaultCellRenderer.stories.d.ts +55 -0
  162. package/dist/components/table/cellRenderers/DefaultCellRenderer.stories.d.ts.map +1 -0
  163. package/dist/components/table/cellRenderers/DefaultCellRenderer.stories.js +245 -0
  164. package/dist/components/table/cellRenderers/DefaultCellRenderer.stories.js.map +1 -0
  165. package/dist/components/table/cellRenderers/InlineTextCellRenderer.stories.d.ts +67 -0
  166. package/dist/components/table/cellRenderers/InlineTextCellRenderer.stories.d.ts.map +1 -0
  167. package/dist/components/table/cellRenderers/InlineTextCellRenderer.stories.js +221 -0
  168. package/dist/components/table/cellRenderers/InlineTextCellRenderer.stories.js.map +1 -0
  169. package/dist/components/table/cellRenderers/SelectDropdownCellRenderer.stories.d.ts +75 -0
  170. package/dist/components/table/cellRenderers/SelectDropdownCellRenderer.stories.d.ts.map +1 -0
  171. package/dist/components/table/cellRenderers/SelectDropdownCellRenderer.stories.js +270 -0
  172. package/dist/components/table/cellRenderers/SelectDropdownCellRenderer.stories.js.map +1 -0
  173. package/dist/components/table/columnFilters/BooleanFilter.stories.d.ts +57 -0
  174. package/dist/components/table/columnFilters/BooleanFilter.stories.d.ts.map +1 -0
  175. package/dist/components/table/columnFilters/BooleanFilter.stories.js +198 -0
  176. package/dist/components/table/columnFilters/BooleanFilter.stories.js.map +1 -0
  177. package/dist/components/table/columnFilters/TimeFilter.stories.d.ts +58 -0
  178. package/dist/components/table/columnFilters/TimeFilter.stories.d.ts.map +1 -0
  179. package/dist/components/table/columnFilters/TimeFilter.stories.js +207 -0
  180. package/dist/components/table/columnFilters/TimeFilter.stories.js.map +1 -0
  181. package/dist/components/table/pagination/PaginationPanel.stories.d.ts +113 -0
  182. package/dist/components/table/pagination/PaginationPanel.stories.d.ts.map +1 -0
  183. package/dist/components/table/pagination/PaginationPanel.stories.js +272 -0
  184. package/dist/components/table/pagination/PaginationPanel.stories.js.map +1 -0
  185. package/dist/components/table/tableControls/TableControls.stories.d.ts +151 -0
  186. package/dist/components/table/tableControls/TableControls.stories.d.ts.map +1 -0
  187. package/dist/components/table/tableControls/TableControls.stories.js +356 -0
  188. package/dist/components/table/tableControls/TableControls.stories.js.map +1 -0
  189. package/dist/components/table/tableControls/TableSettingsDropdown.d.ts +27 -1
  190. package/dist/components/table/tableControls/TableSettingsDropdown.d.ts.map +1 -1
  191. package/dist/components/table/tableControls/TableSettingsDropdown.js +53 -26
  192. package/dist/components/table/tableControls/TableSettingsDropdown.js.map +1 -1
  193. package/dist/components/table/tableControls/TableSettingsDropdown.test.d.ts +2 -0
  194. package/dist/components/table/tableControls/TableSettingsDropdown.test.d.ts.map +1 -0
  195. package/dist/components/table/tableControls/TableSettingsDropdown.test.js +178 -0
  196. package/dist/components/table/tableControls/TableSettingsDropdown.test.js.map +1 -0
  197. package/dist/components/tabs/Tabs.stories.d.ts +22 -4
  198. package/dist/components/tabs/Tabs.stories.d.ts.map +1 -1
  199. package/dist/components/tabs/Tabs.stories.js +398 -22
  200. package/dist/components/tabs/Tabs.stories.js.map +1 -1
  201. package/dist/components/tabs/TabsItem.stories.d.ts +54 -1
  202. package/dist/components/tabs/TabsItem.stories.d.ts.map +1 -1
  203. package/dist/components/tabs/TabsItem.stories.js +61 -9
  204. package/dist/components/tabs/TabsItem.stories.js.map +1 -1
  205. package/dist/components/toast/Toast.stories.d.ts +103 -10
  206. package/dist/components/toast/Toast.stories.d.ts.map +1 -1
  207. package/dist/components/toast/Toast.stories.js +409 -47
  208. package/dist/components/toast/Toast.stories.js.map +1 -1
  209. package/dist/components/toggle/Toggle.stories.d.ts +61 -46
  210. package/dist/components/toggle/Toggle.stories.d.ts.map +1 -1
  211. package/dist/components/toggle/Toggle.stories.js +311 -122
  212. package/dist/components/toggle/Toggle.stories.js.map +1 -1
  213. package/dist/components/tooltip/Tooltip.stories.d.ts +78 -6
  214. package/dist/components/tooltip/Tooltip.stories.d.ts.map +1 -1
  215. package/dist/components/tooltip/Tooltip.stories.js +413 -7
  216. package/dist/components/tooltip/Tooltip.stories.js.map +1 -1
  217. package/dist/components/tooltip/TooltipWrapper.stories.d.ts +71 -7
  218. package/dist/components/tooltip/TooltipWrapper.stories.d.ts.map +1 -1
  219. package/dist/components/tooltip/TooltipWrapper.stories.js +238 -10
  220. package/dist/components/tooltip/TooltipWrapper.stories.js.map +1 -1
  221. package/dist/index.css +8 -0
  222. package/dist/index.css.map +1 -1
  223. package/dist/utils/PopupParentContext.stories.d.ts +17 -0
  224. package/dist/utils/PopupParentContext.stories.d.ts.map +1 -0
  225. package/dist/utils/PopupParentContext.stories.js +266 -0
  226. package/dist/utils/PopupParentContext.stories.js.map +1 -0
  227. package/dist/utils/getDefaultPopupParent.d.ts.map +1 -1
  228. package/dist/utils/getDefaultPopupParent.js +6 -0
  229. package/dist/utils/getDefaultPopupParent.js.map +1 -1
  230. package/package.json +1 -1
  231. package/src/components/articleCard/ArticleCard.stories.tsx +524 -111
  232. package/src/components/avatar/Avatar.stories.tsx +504 -59
  233. package/src/components/avatarGroup/AvatarGroup.stories.tsx +977 -175
  234. package/src/components/banner/Banner.stories.tsx +7 -3
  235. package/src/components/card/Card.stories.tsx +466 -36
  236. package/src/components/combobox/Combobox.stories.tsx +867 -260
  237. package/src/components/datePicker/DatePicker.stories.tsx +777 -60
  238. package/src/components/dateTimePicker/DateTimePicker.stories.tsx +910 -132
  239. package/src/components/editableText/EditableText.stories.tsx +567 -91
  240. package/src/components/formField/FormField.test.tsx +6 -0
  241. package/src/components/formField/FormField.tsx +5 -0
  242. package/src/components/formField/fieldset/Fieldset.stories.tsx +761 -51
  243. package/src/components/formField/inputs/checkbox/CheckboxGroup.tsx +1 -1
  244. package/src/components/formField/inputs/checkbox/CheckboxInput.tsx +1 -1
  245. package/src/components/formField/inputs/colourPickerDropdown/ColourPickerDropdown.stories.tsx +504 -11
  246. package/src/components/formField/inputs/radio/RadioButtonGroup.tsx +17 -4
  247. package/src/components/formField/inputs/radio/RadioButtonInput.stories.tsx +71 -59
  248. package/src/components/formField/inputs/selectDropdown/SelectDropdown.stories.tsx +1079 -168
  249. package/src/components/formField/inputs/time/TimeInput.stories.tsx +1140 -104
  250. package/src/components/formField/label/Label.stories.tsx +317 -8
  251. package/src/components/icoText/IcoText.stories.tsx +442 -31
  252. package/src/components/kpiCard/KPICard.stories.tsx +475 -30
  253. package/src/components/kvpList/KVPList.stories.tsx +593 -26
  254. package/src/components/modal/Modal.stories.tsx +963 -26
  255. package/src/components/modal/modalManager/ModalManager.stories.tsx +612 -454
  256. package/src/components/pill/Pill.stories.tsx +11 -13
  257. package/src/components/pill/Pill.tsx +1 -0
  258. package/src/components/row/Row.stories.tsx +474 -58
  259. package/src/components/searchBar/SearchBar.stories.tsx +570 -38
  260. package/src/components/section/Section.stories.tsx +723 -70
  261. package/src/components/singleUser/SingleUser.stories.tsx +393 -34
  262. package/src/components/slideoverManager/SlideoverManager.stories.tsx +572 -342
  263. package/src/components/table/DSDefaultColDef.ts +25 -5
  264. package/src/components/table/Table.stories.tsx +411 -3
  265. package/src/components/table/Table.tsx +9 -2
  266. package/src/components/table/TableFooter.stories.tsx +196 -0
  267. package/src/components/table/TableHeader.stories.tsx +251 -0
  268. package/src/components/table/cellEditors/DateCellEditor.stories.tsx +245 -0
  269. package/src/components/table/cellRenderers/BooleanCellRenderer.stories.tsx +278 -0
  270. package/src/components/table/cellRenderers/ButtonCellRenderer.stories.tsx +333 -0
  271. package/src/components/table/cellRenderers/CheckboxCellRenderer.stories.tsx +337 -0
  272. package/src/components/table/cellRenderers/CheckboxCellRenderer.tsx +5 -1
  273. package/src/components/table/cellRenderers/DefaultCellRenderer.stories.tsx +342 -0
  274. package/src/components/table/cellRenderers/InlineTextCellRenderer.stories.tsx +292 -0
  275. package/src/components/table/cellRenderers/SelectDropdownCellRenderer.stories.tsx +369 -0
  276. package/src/components/table/columnFilters/BooleanFilter.stories.tsx +268 -0
  277. package/src/components/table/columnFilters/TimeFilter.stories.tsx +281 -0
  278. package/src/components/table/pagination/PaginationPanel.stories.tsx +327 -0
  279. package/src/components/table/tableControls/TableControls.stories.tsx +415 -0
  280. package/src/components/table/tableControls/TableSettingsDropdown.test.tsx +207 -0
  281. package/src/components/table/tableControls/TableSettingsDropdown.tsx +103 -39
  282. package/src/components/tabs/Tabs.stories.tsx +540 -60
  283. package/src/components/tabs/TabsItem.stories.tsx +82 -8
  284. package/src/components/toast/Toast.stories.tsx +539 -77
  285. package/src/components/toggle/Toggle.stories.tsx +371 -135
  286. package/src/components/tooltip/Tooltip.stories.tsx +606 -15
  287. package/src/components/tooltip/TooltipWrapper.stories.tsx +348 -12
  288. package/src/docs/Contributing.mdx +241 -0
  289. package/src/docs/UsingComponents.mdx +93 -0
  290. package/src/docs/Welcome.mdx +68 -0
  291. package/src/global.scss +7 -0
  292. package/src/utils/PopupParentContext.stories.tsx +367 -0
  293. package/src/utils/getDefaultPopupParent.ts +6 -0
  294. package/.ralph/storybook-upgrade/knowledge.md +0 -308
  295. package/.ralph/storybook-upgrade/prd.json +0 -777
  296. package/.ralph/storybook-upgrade/progress.md +0 -342
  297. package/src/components/table/TableWIP.mdx +0 -3
@@ -0,0 +1,196 @@
1
+ import type { Meta, StoryObj } from '@storybook/react-vite';
2
+ import {
3
+ Controls,
4
+ Heading as DocHeading,
5
+ Markdown,
6
+ Primary as DocPrimary,
7
+ Stories,
8
+ Subtitle,
9
+ Title,
10
+ } from '@storybook/addon-docs/blocks';
11
+ import { fn } from 'storybook/test';
12
+ import { TableFooter } from './TableFooter';
13
+ import { PaginationPanel } from './pagination/PaginationPanel';
14
+
15
+ // ---------------------------------------------------------------------------
16
+ // Docs page content
17
+ // ---------------------------------------------------------------------------
18
+
19
+ const DESCRIPTION_INTRO = [
20
+ '`TableFooter` is the pre-composed footer slot for the Arbor data table.',
21
+ 'It renders a `<footer>` element and accepts any `children` (typically a `<PaginationPanel />` element).',
22
+ '',
23
+ 'Pass the entire `<TableFooter />` element as the `footerContent` prop of `<Table />`.',
24
+ ].join('\n');
25
+
26
+ const USAGE_GUIDANCE = [
27
+ '### When to use',
28
+ '',
29
+ '- As the `footerContent` of a `<Table />` when you need a standard footer region',
30
+ '- When you want to wrap `<PaginationPanel />` in the footer slot',
31
+ '- When you need custom footer content beyond pagination controls',
32
+ '',
33
+ '---',
34
+ '',
35
+ '### When NOT to use',
36
+ '',
37
+ '| Situation | Alternative |',
38
+ '|---|---|',
39
+ '| You only need pagination | Pass `<PaginationPanel />` directly as `footerContent` |',
40
+ '| The table has no footer | Omit `footerContent` entirely |',
41
+ '',
42
+ '---',
43
+ '',
44
+ '### Props summary',
45
+ '',
46
+ '| Prop | Description |',
47
+ '|---|---|',
48
+ '| `children` | Content rendered inside the footer — typically `<PaginationPanel />` |',
49
+ '| `className` | Additional CSS class name(s) on the root `<footer>` element |',
50
+ ].join('\n');
51
+
52
+ const DEVELOPER_NOTES = [
53
+ '### Wiring into `<Table />`',
54
+ '',
55
+ '```tsx',
56
+ "import { Table, TableFooter, PaginationPanel } from '@arbor-education/design-system.components';",
57
+ '',
58
+ 'function MyTable() {',
59
+ ' return (',
60
+ ' <Table',
61
+ ' rowData={rows}',
62
+ ' columnDefs={colDefs}',
63
+ ' footerContent={(',
64
+ ' <TableFooter>',
65
+ ' <PaginationPanel',
66
+ ' availableSizes={[10, 25, 50, 100]}',
67
+ ' initialPageSize={25}',
68
+ ' onPageSizeChange={setPageSize}',
69
+ ' />',
70
+ ' </TableFooter>',
71
+ ' )}',
72
+ ' />',
73
+ ' );',
74
+ '}',
75
+ '```',
76
+ '',
77
+ '---',
78
+ '',
79
+ '### `TableFooter` vs passing `<PaginationPanel />` directly',
80
+ '',
81
+ '`<TableFooter />` adds the `ds-table__footer` class and `<footer>` semantic element around its',
82
+ 'children. If you only need pagination, passing `<PaginationPanel />` directly as `footerContent`',
83
+ 'is also valid — `<Table />` renders `footerContent` inside its own footer region.',
84
+ ].join('\n');
85
+
86
+ const RELATED_COMPONENTS = [
87
+ '## Related components',
88
+ '',
89
+ '[Table](?path=/docs/components-table--docs) · [PaginationPanel](?path=/docs/components-table-paginationpanel--docs) · [TableHeader](?path=/docs/components-table-tableheader--docs)',
90
+ ].join('\n');
91
+
92
+ const PROPS_INTRO = 'The preview below is wired to the **Controls** panel. `TableFooter` is a thin layout wrapper — its main value is the semantic `<footer>` element and `ds-table__footer` class it applies around its children.';
93
+
94
+ // ---------------------------------------------------------------------------
95
+ // Custom DocsPage
96
+ // ---------------------------------------------------------------------------
97
+
98
+ function TableFooterDocsPage() {
99
+ return (
100
+ <>
101
+ <Title />
102
+ <Subtitle />
103
+ <Markdown>{DESCRIPTION_INTRO}</Markdown>
104
+ <DocHeading>Interactive example</DocHeading>
105
+ <Markdown>{PROPS_INTRO}</Markdown>
106
+ <DocPrimary />
107
+ <Controls />
108
+ <DocHeading>Usage guidance</DocHeading>
109
+ <Markdown>{USAGE_GUIDANCE}</Markdown>
110
+ <DocHeading>Developer notes</DocHeading>
111
+ <Markdown>{DEVELOPER_NOTES}</Markdown>
112
+ <DocHeading>Examples</DocHeading>
113
+ <Stories title="" />
114
+ <Markdown>{RELATED_COMPONENTS}</Markdown>
115
+ </>
116
+ );
117
+ }
118
+
119
+ // ---------------------------------------------------------------------------
120
+ // Meta
121
+ // ---------------------------------------------------------------------------
122
+
123
+ const meta = {
124
+ title: 'Components/Table/TableFooter',
125
+ component: TableFooter,
126
+ tags: ['autodocs'],
127
+ parameters: {
128
+ layout: 'padded',
129
+ docs: { page: TableFooterDocsPage },
130
+ },
131
+ argTypes: {
132
+ children: {
133
+ description: 'Content rendered inside the footer. Typically a `<PaginationPanel />` element.',
134
+ control: false,
135
+ table: { type: { summary: 'ReactNode' }, defaultValue: { summary: 'undefined' } },
136
+ },
137
+ className: {
138
+ description: 'Additional CSS class name(s) to apply to the root `<footer>` element.',
139
+ control: 'text',
140
+ table: { type: { summary: 'string' }, defaultValue: { summary: 'undefined' } },
141
+ },
142
+ },
143
+ } satisfies Meta<typeof TableFooter>;
144
+
145
+ export default meta;
146
+ type Story = StoryObj<typeof TableFooter>;
147
+
148
+ // ---------------------------------------------------------------------------
149
+ // Helper
150
+ // ---------------------------------------------------------------------------
151
+
152
+ const withDescription = (story: Story, description: string): Story => ({
153
+ ...story,
154
+ parameters: {
155
+ ...story.parameters,
156
+ docs: { ...story.parameters?.docs, description: { story: description } },
157
+ },
158
+ });
159
+
160
+ // ---------------------------------------------------------------------------
161
+ // Stories
162
+ // ---------------------------------------------------------------------------
163
+
164
+ export const Default: Story = withDescription(
165
+ {
166
+ args: {
167
+ children: (
168
+ <PaginationPanel
169
+ totalPages={10}
170
+ onPageChange={fn()}
171
+ availableSizes={[10, 25, 50, 100]}
172
+ initialPageSize={25}
173
+ onPageSizeChange={fn()}
174
+ />
175
+ ),
176
+ },
177
+ },
178
+ 'The canonical usage — `TableFooter` wrapping a `<PaginationPanel />`. '
179
+ + '`RowCountInfo` (the row count text) is not visible in this standalone preview because it '
180
+ + 'requires `GridApiContext` provided by a wrapping `<Table />`.',
181
+ );
182
+
183
+ export const WithCustomContent: Story = withDescription(
184
+ {
185
+ parameters: { controls: { disable: true } },
186
+ args: {
187
+ children: (
188
+ <span style={{ padding: '8px 16px', fontSize: '14px', color: 'var(--color-neutral-500)' }}>
189
+ Custom footer content — e.g. totals, status messages, or secondary actions
190
+ </span>
191
+ ),
192
+ },
193
+ },
194
+ '`TableFooter` accepts any `ReactNode` as `children` — not just `PaginationPanel`. '
195
+ + 'Use it to add totals rows, status messages, or any other custom footer content.',
196
+ );
@@ -0,0 +1,251 @@
1
+ import React from 'react';
2
+ import type { Meta, StoryObj } from '@storybook/react-vite';
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';
12
+ import { fn } from 'storybook/test';
13
+ import { TableHeader } from './TableHeader';
14
+ import { TableControls } from './tableControls/TableControls';
15
+
16
+ // ---------------------------------------------------------------------------
17
+ // Docs page content
18
+ // ---------------------------------------------------------------------------
19
+
20
+ const DESCRIPTION_INTRO = [
21
+ '`TableHeader` is the pre-composed header slot for the Arbor data table.',
22
+ 'It renders a `<header>` element and accepts any `children` (typically a `<TableControls />` element)',
23
+ 'plus an optional built-in `<SearchBar />` via the `hasSearch` prop.',
24
+ '',
25
+ 'Pass the entire `<TableHeader />` element as the `headerContent` prop of `<Table />`.',
26
+ ].join('\n');
27
+
28
+ const USAGE_GUIDANCE = [
29
+ '### When to use',
30
+ '',
31
+ '- As the `headerContent` of a `<Table />` when you need a standard header region',
32
+ '- When you want to combine a toolbar (`<TableControls />`) with a search bar in one slot',
33
+ '- When you need custom header content that is not covered by `<TableControls />`',
34
+ '',
35
+ '---',
36
+ '',
37
+ '### When NOT to use',
38
+ '',
39
+ '| Situation | Alternative |',
40
+ '|---|---|',
41
+ '| You only need a toolbar | Pass `<TableControls />` directly as `headerContent` |',
42
+ '| You only need a search bar | Pass `<SearchBar />` directly as `headerContent` |',
43
+ '| The table has no header | Omit `headerContent` entirely |',
44
+ '',
45
+ '---',
46
+ '',
47
+ '### Props summary',
48
+ '',
49
+ '| Prop | Description |',
50
+ '|---|---|',
51
+ '| `children` | Content rendered before the `SearchBar` — typically `<TableControls />` |',
52
+ '| `hasSearch` | When `true`, renders a `<SearchBar />` at the end of the header |',
53
+ '| `searchValue` | Controlled value for the `SearchBar` |',
54
+ '| `setSearchValue` | Called with the new search string when the user types |',
55
+ ].join('\n');
56
+
57
+ const DEVELOPER_NOTES = [
58
+ '### Wiring into `<Table />`',
59
+ '',
60
+ '```tsx',
61
+ "import { useState } from 'react';",
62
+ "import { Table, TableHeader, TableControls } from '@arbor-education/design-system.components';",
63
+ '',
64
+ 'function MyTable() {',
65
+ " const [search, setSearch] = useState('');",
66
+ '',
67
+ ' return (',
68
+ ' <Table',
69
+ ' rowData={rows}',
70
+ ' columnDefs={colDefs}',
71
+ ' quickFilterText={search}',
72
+ ' headerContent={(',
73
+ ' <TableHeader hasSearch searchValue={search} setSearchValue={setSearch}>',
74
+ ' <TableControls',
75
+ ' onUndo={handleUndo}',
76
+ ' onDownload={handleDownload}',
77
+ ' showSettings',
78
+ ' />',
79
+ ' </TableHeader>',
80
+ ' )}',
81
+ ' />',
82
+ ' );',
83
+ '}',
84
+ '```',
85
+ '',
86
+ '---',
87
+ '',
88
+ '### `hasSearch` vs passing `<SearchBar />` directly',
89
+ '',
90
+ 'Both approaches are equivalent. `TableHeader` with `hasSearch` is more concise when you already',
91
+ 'have `TableHeader` for the `children` slot. If you only need a search bar and no other header',
92
+ 'content, pass `<SearchBar />` directly as `headerContent` without wrapping it in `TableHeader`.',
93
+ ].join('\n');
94
+
95
+ const RELATED_COMPONENTS = [
96
+ '## Related components',
97
+ '',
98
+ '[Table](?path=/docs/components-table--docs) · [TableControls](?path=/docs/components-table-tablecontrols--docs) · [TableFooter](?path=/docs/components-table-tablefooter--docs) · [SearchBar](?path=/docs/components-searchbar--docs)',
99
+ ].join('\n');
100
+
101
+ const PROPS_INTRO = 'The preview below is wired to the **Controls** panel — toggle `hasSearch` to add or remove the search bar.';
102
+
103
+ // ---------------------------------------------------------------------------
104
+ // Custom DocsPage
105
+ // ---------------------------------------------------------------------------
106
+
107
+ function TableHeaderDocsPage() {
108
+ return (
109
+ <>
110
+ <Title />
111
+ <Subtitle />
112
+ <Markdown>{DESCRIPTION_INTRO}</Markdown>
113
+ <DocHeading>Interactive example</DocHeading>
114
+ <Markdown>{PROPS_INTRO}</Markdown>
115
+ <DocPrimary />
116
+ <Controls />
117
+ <DocHeading>Usage guidance</DocHeading>
118
+ <Markdown>{USAGE_GUIDANCE}</Markdown>
119
+ <DocHeading>Developer notes</DocHeading>
120
+ <Markdown>{DEVELOPER_NOTES}</Markdown>
121
+ <DocHeading>Examples</DocHeading>
122
+ <Stories title="" />
123
+ <Markdown>{RELATED_COMPONENTS}</Markdown>
124
+ </>
125
+ );
126
+ }
127
+
128
+ // ---------------------------------------------------------------------------
129
+ // Meta
130
+ // ---------------------------------------------------------------------------
131
+
132
+ const meta = {
133
+ title: 'Components/Table/TableHeader',
134
+ component: TableHeader,
135
+ tags: ['autodocs'],
136
+ parameters: {
137
+ layout: 'padded',
138
+ docs: { page: TableHeaderDocsPage },
139
+ },
140
+ argTypes: {
141
+ children: {
142
+ description: 'Content rendered inside the header before the `SearchBar`. Typically a `<TableControls />` element.',
143
+ control: false,
144
+ table: { type: { summary: 'ReactNode' }, defaultValue: { summary: 'undefined' } },
145
+ },
146
+ hasSearch: {
147
+ description: 'When `true`, renders a `<SearchBar />` at the end of the header.',
148
+ control: 'boolean',
149
+ table: { type: { summary: 'boolean' }, defaultValue: { summary: 'false' } },
150
+ },
151
+ searchValue: {
152
+ description: 'Controlled value for the `SearchBar`. Only used when `hasSearch` is `true`.',
153
+ control: 'text',
154
+ table: { type: { summary: 'string' }, defaultValue: { summary: 'undefined' } },
155
+ },
156
+ setSearchValue: {
157
+ description: 'Called with the new search string when the user types. Only used when `hasSearch` is `true`.',
158
+ control: false,
159
+ table: { type: { summary: '(searchValue: string) => void' }, defaultValue: { summary: 'undefined' } },
160
+ },
161
+ className: {
162
+ description: 'Additional CSS class name(s) to apply to the root `<header>` element.',
163
+ control: 'text',
164
+ table: { type: { summary: 'string' }, defaultValue: { summary: 'undefined' } },
165
+ },
166
+ },
167
+ args: {
168
+ setSearchValue: fn(),
169
+ },
170
+ } satisfies Meta<typeof TableHeader>;
171
+
172
+ export default meta;
173
+ type Story = StoryObj<typeof TableHeader>;
174
+
175
+ // ---------------------------------------------------------------------------
176
+ // Helper
177
+ // ---------------------------------------------------------------------------
178
+
179
+ const withDescription = (story: Story, description: string): Story => ({
180
+ ...story,
181
+ parameters: {
182
+ ...story.parameters,
183
+ docs: { ...story.parameters?.docs, description: { story: description } },
184
+ },
185
+ });
186
+
187
+ // ---------------------------------------------------------------------------
188
+ // Stories
189
+ // ---------------------------------------------------------------------------
190
+
191
+ export const Default: Story = withDescription(
192
+ {
193
+ args: {
194
+ hasSearch: false,
195
+ children: (
196
+ <TableControls
197
+ onUndo={fn()}
198
+ onRedo={fn()}
199
+ onDownload={fn()}
200
+ showSettings
201
+ onHelp={fn()}
202
+ onExpandToggle={fn()}
203
+ />
204
+ ),
205
+ },
206
+ },
207
+ 'The interactive canvas — `TableHeader` wrapping a `<TableControls />` element, which is the canonical usage. '
208
+ + 'Toggle `hasSearch` in the Controls panel to add the built-in `SearchBar`.',
209
+ );
210
+
211
+ export const WithSearch: Story = withDescription(
212
+ {
213
+ parameters: { controls: { disable: true } },
214
+ render: () => {
215
+ const [search, setSearch] = React.useState('');
216
+ return (
217
+ <TableHeader hasSearch searchValue={search} setSearchValue={setSearch}>
218
+ <TableControls
219
+ onUndo={fn()}
220
+ onRedo={fn()}
221
+ onDownload={fn()}
222
+ showSettings
223
+ />
224
+ </TableHeader>
225
+ );
226
+ },
227
+ },
228
+ '`hasSearch={true}` adds a `SearchBar` at the end of the header. '
229
+ + '`searchValue` and `setSearchValue` give you controlled access to the search string — '
230
+ + "pass it as `quickFilterText` to `<Table />` to drive AG Grid's built-in text filtering.",
231
+ );
232
+
233
+ export const ChildrenOnly: Story = withDescription(
234
+ {
235
+ parameters: { controls: { disable: true } },
236
+ args: {
237
+ children: (
238
+ <TableControls
239
+ bulkActions={[
240
+ { displayName: 'Export selected', callback: fn() },
241
+ { displayName: 'Delete selected', callback: fn(), disabled: true },
242
+ ]}
243
+ onUndo={fn()}
244
+ onRedo={fn()}
245
+ />
246
+ ),
247
+ },
248
+ },
249
+ 'The header slot with only `children` — no built-in search bar. '
250
+ + 'Any `ReactNode` is accepted as `children`; `<TableControls />` is the most common choice.',
251
+ );
@@ -0,0 +1,245 @@
1
+ import type { Meta, StoryObj } from '@storybook/react-vite';
2
+ import {
3
+ Controls,
4
+ Heading as DocHeading,
5
+ Markdown,
6
+ Primary as DocPrimary,
7
+ Stories,
8
+ Subtitle,
9
+ Title,
10
+ } from '@storybook/addon-docs/blocks';
11
+ import { fn } from 'storybook/test';
12
+ import type { CustomCellEditorProps } from 'ag-grid-react';
13
+ import { DateCellEditor } from './DateCellEditor';
14
+ import { Table } from 'Components/table/Table';
15
+
16
+ // ---------------------------------------------------------------------------
17
+ // Docs page content
18
+ // ---------------------------------------------------------------------------
19
+
20
+ const DESCRIPTION_INTRO = [
21
+ '`DateCellEditor` is an AG Grid cell editor component that renders an Arbor `DatePicker` inside a table cell.',
22
+ 'It is invoked when a user begins editing a date column (e.g. by pressing Enter or double-clicking the cell).',
23
+ '',
24
+ 'Register it via the AG Grid `cellEditor` column definition property.',
25
+ ].join('\n');
26
+
27
+ const USAGE_GUIDANCE = [
28
+ '### When to use',
29
+ '',
30
+ '- On date columns that need an inline date-picker editor',
31
+ '- When users should be able to edit a date value directly in the table without leaving the row',
32
+ '',
33
+ '---',
34
+ '',
35
+ '### Registration',
36
+ '',
37
+ '```tsx',
38
+ "import { DateCellEditor } from '@arbor-education/design-system.components';",
39
+ '',
40
+ 'const colDefs = [',
41
+ ' {',
42
+ " field: 'dob',",
43
+ " headerName: 'Date of birth',",
44
+ ' cellEditor: DateCellEditor,',
45
+ ' // or via string key:',
46
+ " cellEditor: 'dsDateCellEditor',",
47
+ ' },',
48
+ '];',
49
+ '```',
50
+ '',
51
+ '---',
52
+ '',
53
+ '### `cellEditorParams`',
54
+ '',
55
+ 'Any additional props to pass to the underlying `DatePicker` can be provided via `cellEditorParams`:',
56
+ '',
57
+ '```tsx',
58
+ 'cellEditorParams: {',
59
+ " placeholder: 'dd/mm/yyyy',",
60
+ ' disabled: false,',
61
+ '},',
62
+ '```',
63
+ '',
64
+ '---',
65
+ '',
66
+ '### Value format',
67
+ '',
68
+ 'The `value` and `onValueChange` use the same date format as the Arbor `DatePicker`.',
69
+ 'Refer to the [DatePicker docs](?path=/docs/components-datepicker--docs) for format details.',
70
+ ].join('\n');
71
+
72
+ const RELATED_COMPONENTS = [
73
+ '## Related components',
74
+ '',
75
+ '[Table](?path=/docs/components-table--docs) · [DatePicker](?path=/docs/components-datepicker--docs)',
76
+ ].join('\n');
77
+
78
+ const PROPS_INTRO = 'The preview below shows `DateCellEditor` rendering the Arbor `DatePicker` with a pre-set date value. In a real table this component is mounted by AG Grid when the user begins editing a date cell.';
79
+
80
+ // ---------------------------------------------------------------------------
81
+ // Custom DocsPage
82
+ // ---------------------------------------------------------------------------
83
+
84
+ function DateCellEditorDocsPage() {
85
+ return (
86
+ <>
87
+ <Title />
88
+ <Subtitle />
89
+ <Markdown>{DESCRIPTION_INTRO}</Markdown>
90
+ <DocHeading>Interactive example</DocHeading>
91
+ <Markdown>{PROPS_INTRO}</Markdown>
92
+ <DocPrimary />
93
+ <Controls />
94
+ <DocHeading>Usage guidance</DocHeading>
95
+ <Markdown>{USAGE_GUIDANCE}</Markdown>
96
+ <DocHeading>Examples</DocHeading>
97
+ <Stories title="" />
98
+ <Markdown>{RELATED_COMPONENTS}</Markdown>
99
+ </>
100
+ );
101
+ }
102
+
103
+ // ---------------------------------------------------------------------------
104
+ // Helpers
105
+ // ---------------------------------------------------------------------------
106
+
107
+ const makeEditorProps = (value: Date | undefined): CustomCellEditorProps => ({
108
+ value,
109
+ onValueChange: fn(),
110
+ colDef: { cellEditorParams: {} },
111
+ } as unknown as CustomCellEditorProps);
112
+
113
+ // ---------------------------------------------------------------------------
114
+ // Meta
115
+ // ---------------------------------------------------------------------------
116
+
117
+ const meta = {
118
+ title: 'Components/Table/CellEditors/DateCellEditor',
119
+ component: DateCellEditor,
120
+ tags: ['autodocs'],
121
+ parameters: {
122
+ layout: 'padded',
123
+ docs: { page: DateCellEditorDocsPage },
124
+ },
125
+ argTypes: {
126
+ value: {
127
+ description: 'The current date value of the cell being edited. Format matches the Arbor `DatePicker` value format.',
128
+ control: false,
129
+ table: { type: { summary: 'string' }, defaultValue: { summary: 'undefined' } },
130
+ },
131
+ onValueChange: {
132
+ description: 'Called by AG Grid when the editor value changes. Receives the new date value.',
133
+ control: false,
134
+ table: { type: { summary: '(value: string) => void' } },
135
+ },
136
+ },
137
+ } satisfies Meta<typeof DateCellEditor>;
138
+
139
+ export default meta;
140
+ type Story = StoryObj<typeof DateCellEditor>;
141
+
142
+ const withDescription = (story: Story, description: string): Story => ({
143
+ ...story,
144
+ parameters: {
145
+ ...story.parameters,
146
+ docs: { ...story.parameters?.docs, description: { story: description } },
147
+ },
148
+ });
149
+
150
+ // ---------------------------------------------------------------------------
151
+ // Stories
152
+ // ---------------------------------------------------------------------------
153
+
154
+ export const Default: Story = withDescription(
155
+ {
156
+ render: () => <DateCellEditor {...makeEditorProps(undefined)} />,
157
+ },
158
+ 'The `DateCellEditor` with no initial value — renders an empty `DatePicker` ready for input.',
159
+ );
160
+
161
+ export const WithExistingDate: Story = withDescription(
162
+ {
163
+ parameters: { controls: { disable: true } },
164
+ render: () => <DateCellEditor {...makeEditorProps(new Date('2024-09-01'))} />,
165
+ },
166
+ 'Pre-populated with an existing date value. In a table, AG Grid passes the cell\'s current value as `value` when the editor opens.',
167
+ );
168
+
169
+ const DATE_EDITOR_IN_TABLE_DATA = [
170
+ { name: 'Alice Johnson', dateOfBirth: new Date(1990, 0, 15) },
171
+ { name: 'Bob Smith', dateOfBirth: new Date(1985, 5, 20) },
172
+ { name: 'Charlie Brown', dateOfBirth: new Date(1992, 10, 3) },
173
+ { name: 'Diana Prince', dateOfBirth: new Date(1988, 3, 12) },
174
+ ];
175
+
176
+ export const InATable: Story = withDescription(
177
+ {
178
+ parameters: {
179
+ controls: { disable: true },
180
+ docs: {
181
+ source: {
182
+ language: 'tsx',
183
+ code: `
184
+ import { Table } from '@arbor-education/design-system.components';
185
+
186
+ const rowData = [
187
+ { name: 'Alice Johnson', dateOfBirth: new Date(1990, 0, 15) },
188
+ { name: 'Bob Smith', dateOfBirth: new Date(1985, 5, 20) },
189
+ { name: 'Charlie Brown', dateOfBirth: new Date(1992, 10, 3) },
190
+ { name: 'Diana Prince', dateOfBirth: new Date(1988, 3, 12) },
191
+ ];
192
+
193
+ function DateCellEditorExample() {
194
+ return (
195
+ <Table
196
+ rowData={rowData}
197
+ columnDefs={[
198
+ { field: 'name', headerName: 'Name', flex: 2, editable: false },
199
+ {
200
+ field: 'dateOfBirth',
201
+ headerName: 'Date of birth',
202
+ flex: 1,
203
+ editable: true,
204
+ cellEditor: 'dsDateCellEditor',
205
+ valueFormatter: (params) =>
206
+ params.value instanceof Date
207
+ ? params.value.toLocaleDateString('en-GB')
208
+ : params.value,
209
+ },
210
+ ]}
211
+ defaultColDef={{ flex: 1, minWidth: 120 }}
212
+ domLayout="autoHeight"
213
+ />
214
+ );
215
+ }
216
+
217
+ export default DateCellEditorExample;
218
+ `.trim(),
219
+ },
220
+ },
221
+ },
222
+ render: () => (
223
+ <Table
224
+ rowData={DATE_EDITOR_IN_TABLE_DATA}
225
+ columnDefs={[
226
+ { field: 'name', headerName: 'Name', flex: 2, editable: false },
227
+ {
228
+ field: 'dateOfBirth',
229
+ headerName: 'Date of birth',
230
+ flex: 1,
231
+ editable: true,
232
+ cellEditor: 'dsDateCellEditor',
233
+ valueFormatter: params =>
234
+ params.value instanceof Date
235
+ ? params.value.toLocaleDateString('en-GB')
236
+ : params.value,
237
+ },
238
+ ]}
239
+ defaultColDef={{ flex: 1, minWidth: 120 }}
240
+ domLayout="autoHeight"
241
+ />
242
+ ),
243
+ },
244
+ '`dsDateCellEditor` wired up inside a full `Table`. Double-click (or press F2/Enter) on a Date of birth cell to open the `DatePicker` editor — AG Grid mounts the editor component and passes the current cell value as `value`. The `valueFormatter` formats the stored `Date` object as a localised string for display.',
245
+ );