@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.
- package/.gather/skills/write-stories/SKILL.md +207 -271
- package/.storybook/preview.ts +5 -0
- package/CHANGELOG.md +17 -0
- package/README.md +8 -0
- package/component-library.md +144 -13
- package/dist/components/articleCard/ArticleCard.stories.d.ts +137 -11
- package/dist/components/articleCard/ArticleCard.stories.d.ts.map +1 -1
- package/dist/components/articleCard/ArticleCard.stories.js +358 -91
- package/dist/components/articleCard/ArticleCard.stories.js.map +1 -1
- package/dist/components/avatar/Avatar.stories.d.ts +6 -6
- package/dist/components/avatar/Avatar.stories.d.ts.map +1 -1
- package/dist/components/avatar/Avatar.stories.js +393 -49
- package/dist/components/avatar/Avatar.stories.js.map +1 -1
- package/dist/components/avatarGroup/AvatarGroup.stories.d.ts +9 -7
- package/dist/components/avatarGroup/AvatarGroup.stories.d.ts.map +1 -1
- package/dist/components/avatarGroup/AvatarGroup.stories.js +688 -65
- package/dist/components/avatarGroup/AvatarGroup.stories.js.map +1 -1
- package/dist/components/banner/Banner.stories.d.ts.map +1 -1
- package/dist/components/banner/Banner.stories.js +7 -3
- package/dist/components/banner/Banner.stories.js.map +1 -1
- package/dist/components/card/Card.stories.d.ts +105 -4
- package/dist/components/card/Card.stories.d.ts.map +1 -1
- package/dist/components/card/Card.stories.js +336 -18
- package/dist/components/card/Card.stories.js.map +1 -1
- package/dist/components/combobox/Combobox.stories.d.ts +134 -21
- package/dist/components/combobox/Combobox.stories.d.ts.map +1 -1
- package/dist/components/combobox/Combobox.stories.js +676 -175
- package/dist/components/combobox/Combobox.stories.js.map +1 -1
- package/dist/components/datePicker/DatePicker.stories.d.ts +119 -27
- package/dist/components/datePicker/DatePicker.stories.d.ts.map +1 -1
- package/dist/components/datePicker/DatePicker.stories.js +575 -47
- package/dist/components/datePicker/DatePicker.stories.js.map +1 -1
- package/dist/components/dateTimePicker/DateTimePicker.stories.d.ts +155 -39
- package/dist/components/dateTimePicker/DateTimePicker.stories.d.ts.map +1 -1
- package/dist/components/dateTimePicker/DateTimePicker.stories.js +674 -103
- package/dist/components/dateTimePicker/DateTimePicker.stories.js.map +1 -1
- package/dist/components/editableText/EditableText.stories.d.ts +53 -12
- package/dist/components/editableText/EditableText.stories.d.ts.map +1 -1
- package/dist/components/editableText/EditableText.stories.js +401 -64
- package/dist/components/editableText/EditableText.stories.js.map +1 -1
- package/dist/components/formField/FormField.d.ts +4 -0
- package/dist/components/formField/FormField.d.ts.map +1 -1
- package/dist/components/formField/FormField.js +2 -1
- package/dist/components/formField/FormField.js.map +1 -1
- package/dist/components/formField/FormField.test.js +5 -0
- package/dist/components/formField/FormField.test.js.map +1 -1
- package/dist/components/formField/fieldset/Fieldset.stories.d.ts +56 -4
- package/dist/components/formField/fieldset/Fieldset.stories.d.ts.map +1 -1
- package/dist/components/formField/fieldset/Fieldset.stories.js +534 -28
- package/dist/components/formField/fieldset/Fieldset.stories.js.map +1 -1
- package/dist/components/formField/inputs/checkbox/CheckboxGroup.d.ts +3 -1
- package/dist/components/formField/inputs/checkbox/CheckboxGroup.d.ts.map +1 -1
- package/dist/components/formField/inputs/checkbox/CheckboxInput.js +1 -1
- package/dist/components/formField/inputs/checkbox/CheckboxInput.js.map +1 -1
- package/dist/components/formField/inputs/colourPickerDropdown/ColourPickerDropdown.stories.d.ts +95 -1
- package/dist/components/formField/inputs/colourPickerDropdown/ColourPickerDropdown.stories.d.ts.map +1 -1
- package/dist/components/formField/inputs/colourPickerDropdown/ColourPickerDropdown.stories.js +386 -9
- package/dist/components/formField/inputs/colourPickerDropdown/ColourPickerDropdown.stories.js.map +1 -1
- package/dist/components/formField/inputs/radio/RadioButtonGroup.d.ts +6 -2
- package/dist/components/formField/inputs/radio/RadioButtonGroup.d.ts.map +1 -1
- package/dist/components/formField/inputs/radio/RadioButtonGroup.js.map +1 -1
- package/dist/components/formField/inputs/radio/RadioButtonInput.stories.d.ts.map +1 -1
- package/dist/components/formField/inputs/radio/RadioButtonInput.stories.js +61 -49
- package/dist/components/formField/inputs/radio/RadioButtonInput.stories.js.map +1 -1
- package/dist/components/formField/inputs/selectDropdown/SelectDropdown.stories.d.ts +188 -166
- package/dist/components/formField/inputs/selectDropdown/SelectDropdown.stories.d.ts.map +1 -1
- package/dist/components/formField/inputs/selectDropdown/SelectDropdown.stories.js +821 -160
- package/dist/components/formField/inputs/selectDropdown/SelectDropdown.stories.js.map +1 -1
- package/dist/components/formField/inputs/time/TimeInput.stories.d.ts +176 -22
- package/dist/components/formField/inputs/time/TimeInput.stories.d.ts.map +1 -1
- package/dist/components/formField/inputs/time/TimeInput.stories.js +851 -92
- package/dist/components/formField/inputs/time/TimeInput.stories.js.map +1 -1
- package/dist/components/formField/label/Label.stories.d.ts +54 -5
- package/dist/components/formField/label/Label.stories.d.ts.map +1 -1
- package/dist/components/formField/label/Label.stories.js +238 -4
- package/dist/components/formField/label/Label.stories.js.map +1 -1
- package/dist/components/icoText/IcoText.stories.d.ts +32 -6
- package/dist/components/icoText/IcoText.stories.d.ts.map +1 -1
- package/dist/components/icoText/IcoText.stories.js +309 -14
- package/dist/components/icoText/IcoText.stories.js.map +1 -1
- package/dist/components/kpiCard/KPICard.stories.d.ts +100 -2
- package/dist/components/kpiCard/KPICard.stories.d.ts.map +1 -1
- package/dist/components/kpiCard/KPICard.stories.js +354 -10
- package/dist/components/kpiCard/KPICard.stories.js.map +1 -1
- package/dist/components/kvpList/KVPList.stories.d.ts +57 -4
- package/dist/components/kvpList/KVPList.stories.d.ts.map +1 -1
- package/dist/components/kvpList/KVPList.stories.js +403 -10
- package/dist/components/kvpList/KVPList.stories.js.map +1 -1
- package/dist/components/modal/Modal.stories.d.ts +113 -9
- package/dist/components/modal/Modal.stories.d.ts.map +1 -1
- package/dist/components/modal/Modal.stories.js +633 -13
- package/dist/components/modal/Modal.stories.js.map +1 -1
- package/dist/components/modal/modalManager/ModalManager.stories.d.ts +34 -10
- package/dist/components/modal/modalManager/ModalManager.stories.d.ts.map +1 -1
- package/dist/components/modal/modalManager/ModalManager.stories.js +463 -85
- package/dist/components/modal/modalManager/ModalManager.stories.js.map +1 -1
- package/dist/components/pill/Pill.d.ts.map +1 -1
- package/dist/components/pill/Pill.js +1 -1
- package/dist/components/pill/Pill.js.map +1 -1
- package/dist/components/pill/Pill.stories.d.ts.map +1 -1
- package/dist/components/pill/Pill.stories.js +11 -13
- package/dist/components/pill/Pill.stories.js.map +1 -1
- package/dist/components/row/Row.stories.d.ts +1 -2
- package/dist/components/row/Row.stories.d.ts.map +1 -1
- package/dist/components/row/Row.stories.js +360 -50
- package/dist/components/row/Row.stories.js.map +1 -1
- package/dist/components/searchBar/SearchBar.stories.d.ts +52 -4
- package/dist/components/searchBar/SearchBar.stories.d.ts.map +1 -1
- package/dist/components/searchBar/SearchBar.stories.js +428 -36
- package/dist/components/searchBar/SearchBar.stories.js.map +1 -1
- package/dist/components/section/Section.stories.d.ts +11 -41
- package/dist/components/section/Section.stories.d.ts.map +1 -1
- package/dist/components/section/Section.stories.js +494 -56
- package/dist/components/section/Section.stories.js.map +1 -1
- package/dist/components/singleUser/SingleUser.stories.d.ts +5 -4
- package/dist/components/singleUser/SingleUser.stories.d.ts.map +1 -1
- package/dist/components/singleUser/SingleUser.stories.js +303 -31
- package/dist/components/singleUser/SingleUser.stories.js.map +1 -1
- package/dist/components/slideoverManager/SlideoverManager.stories.d.ts +32 -11
- package/dist/components/slideoverManager/SlideoverManager.stories.d.ts.map +1 -1
- package/dist/components/slideoverManager/SlideoverManager.stories.js +380 -84
- package/dist/components/slideoverManager/SlideoverManager.stories.js.map +1 -1
- package/dist/components/table/DSDefaultColDef.d.ts.map +1 -1
- package/dist/components/table/DSDefaultColDef.js +4 -3
- package/dist/components/table/DSDefaultColDef.js.map +1 -1
- package/dist/components/table/Table.d.ts +6 -1
- package/dist/components/table/Table.d.ts.map +1 -1
- package/dist/components/table/Table.js +8 -3
- package/dist/components/table/Table.js.map +1 -1
- package/dist/components/table/Table.stories.d.ts +2 -0
- package/dist/components/table/Table.stories.d.ts.map +1 -1
- package/dist/components/table/Table.stories.js +357 -3
- package/dist/components/table/Table.stories.js.map +1 -1
- package/dist/components/table/TableFooter.stories.d.ts +49 -0
- package/dist/components/table/TableFooter.stories.d.ts.map +1 -0
- package/dist/components/table/TableFooter.stories.js +137 -0
- package/dist/components/table/TableFooter.stories.js.map +1 -0
- package/dist/components/table/TableHeader.stories.d.ts +93 -0
- package/dist/components/table/TableHeader.stories.d.ts.map +1 -0
- package/dist/components/table/TableHeader.stories.js +176 -0
- package/dist/components/table/TableHeader.stories.js.map +1 -0
- package/dist/components/table/cellEditors/DateCellEditor.stories.d.ts +44 -0
- package/dist/components/table/cellEditors/DateCellEditor.stories.d.ts.map +1 -0
- package/dist/components/table/cellEditors/DateCellEditor.stories.js +186 -0
- package/dist/components/table/cellEditors/DateCellEditor.stories.js.map +1 -0
- package/dist/components/table/cellRenderers/BooleanCellRenderer.stories.d.ts +40 -0
- package/dist/components/table/cellRenderers/BooleanCellRenderer.stories.d.ts.map +1 -0
- package/dist/components/table/cellRenderers/BooleanCellRenderer.stories.js +209 -0
- package/dist/components/table/cellRenderers/BooleanCellRenderer.stories.js.map +1 -0
- package/dist/components/table/cellRenderers/ButtonCellRenderer.stories.d.ts +48 -0
- package/dist/components/table/cellRenderers/ButtonCellRenderer.stories.d.ts.map +1 -0
- package/dist/components/table/cellRenderers/ButtonCellRenderer.stories.js +244 -0
- package/dist/components/table/cellRenderers/ButtonCellRenderer.stories.js.map +1 -0
- package/dist/components/table/cellRenderers/CheckboxCellRenderer.d.ts.map +1 -1
- package/dist/components/table/cellRenderers/CheckboxCellRenderer.js +3 -1
- package/dist/components/table/cellRenderers/CheckboxCellRenderer.js.map +1 -1
- package/dist/components/table/cellRenderers/CheckboxCellRenderer.stories.d.ts +64 -0
- package/dist/components/table/cellRenderers/CheckboxCellRenderer.stories.d.ts.map +1 -0
- package/dist/components/table/cellRenderers/CheckboxCellRenderer.stories.js +241 -0
- package/dist/components/table/cellRenderers/CheckboxCellRenderer.stories.js.map +1 -0
- package/dist/components/table/cellRenderers/DefaultCellRenderer.stories.d.ts +55 -0
- package/dist/components/table/cellRenderers/DefaultCellRenderer.stories.d.ts.map +1 -0
- package/dist/components/table/cellRenderers/DefaultCellRenderer.stories.js +245 -0
- package/dist/components/table/cellRenderers/DefaultCellRenderer.stories.js.map +1 -0
- package/dist/components/table/cellRenderers/InlineTextCellRenderer.stories.d.ts +67 -0
- package/dist/components/table/cellRenderers/InlineTextCellRenderer.stories.d.ts.map +1 -0
- package/dist/components/table/cellRenderers/InlineTextCellRenderer.stories.js +221 -0
- package/dist/components/table/cellRenderers/InlineTextCellRenderer.stories.js.map +1 -0
- package/dist/components/table/cellRenderers/SelectDropdownCellRenderer.stories.d.ts +75 -0
- package/dist/components/table/cellRenderers/SelectDropdownCellRenderer.stories.d.ts.map +1 -0
- package/dist/components/table/cellRenderers/SelectDropdownCellRenderer.stories.js +270 -0
- package/dist/components/table/cellRenderers/SelectDropdownCellRenderer.stories.js.map +1 -0
- package/dist/components/table/columnFilters/BooleanFilter.stories.d.ts +57 -0
- package/dist/components/table/columnFilters/BooleanFilter.stories.d.ts.map +1 -0
- package/dist/components/table/columnFilters/BooleanFilter.stories.js +198 -0
- package/dist/components/table/columnFilters/BooleanFilter.stories.js.map +1 -0
- package/dist/components/table/columnFilters/TimeFilter.stories.d.ts +58 -0
- package/dist/components/table/columnFilters/TimeFilter.stories.d.ts.map +1 -0
- package/dist/components/table/columnFilters/TimeFilter.stories.js +207 -0
- package/dist/components/table/columnFilters/TimeFilter.stories.js.map +1 -0
- package/dist/components/table/pagination/PaginationPanel.stories.d.ts +113 -0
- package/dist/components/table/pagination/PaginationPanel.stories.d.ts.map +1 -0
- package/dist/components/table/pagination/PaginationPanel.stories.js +272 -0
- package/dist/components/table/pagination/PaginationPanel.stories.js.map +1 -0
- package/dist/components/table/tableControls/TableControls.stories.d.ts +151 -0
- package/dist/components/table/tableControls/TableControls.stories.d.ts.map +1 -0
- package/dist/components/table/tableControls/TableControls.stories.js +356 -0
- package/dist/components/table/tableControls/TableControls.stories.js.map +1 -0
- package/dist/components/table/tableControls/TableSettingsDropdown.d.ts +27 -1
- package/dist/components/table/tableControls/TableSettingsDropdown.d.ts.map +1 -1
- package/dist/components/table/tableControls/TableSettingsDropdown.js +53 -26
- package/dist/components/table/tableControls/TableSettingsDropdown.js.map +1 -1
- package/dist/components/table/tableControls/TableSettingsDropdown.test.d.ts +2 -0
- package/dist/components/table/tableControls/TableSettingsDropdown.test.d.ts.map +1 -0
- package/dist/components/table/tableControls/TableSettingsDropdown.test.js +178 -0
- package/dist/components/table/tableControls/TableSettingsDropdown.test.js.map +1 -0
- package/dist/components/tabs/Tabs.stories.d.ts +22 -4
- package/dist/components/tabs/Tabs.stories.d.ts.map +1 -1
- package/dist/components/tabs/Tabs.stories.js +398 -22
- package/dist/components/tabs/Tabs.stories.js.map +1 -1
- package/dist/components/tabs/TabsItem.stories.d.ts +54 -1
- package/dist/components/tabs/TabsItem.stories.d.ts.map +1 -1
- package/dist/components/tabs/TabsItem.stories.js +61 -9
- package/dist/components/tabs/TabsItem.stories.js.map +1 -1
- package/dist/components/toast/Toast.stories.d.ts +103 -10
- package/dist/components/toast/Toast.stories.d.ts.map +1 -1
- package/dist/components/toast/Toast.stories.js +409 -47
- package/dist/components/toast/Toast.stories.js.map +1 -1
- package/dist/components/toggle/Toggle.stories.d.ts +61 -46
- package/dist/components/toggle/Toggle.stories.d.ts.map +1 -1
- package/dist/components/toggle/Toggle.stories.js +311 -122
- package/dist/components/toggle/Toggle.stories.js.map +1 -1
- package/dist/components/tooltip/Tooltip.stories.d.ts +78 -6
- package/dist/components/tooltip/Tooltip.stories.d.ts.map +1 -1
- package/dist/components/tooltip/Tooltip.stories.js +413 -7
- package/dist/components/tooltip/Tooltip.stories.js.map +1 -1
- package/dist/components/tooltip/TooltipWrapper.stories.d.ts +71 -7
- package/dist/components/tooltip/TooltipWrapper.stories.d.ts.map +1 -1
- package/dist/components/tooltip/TooltipWrapper.stories.js +238 -10
- package/dist/components/tooltip/TooltipWrapper.stories.js.map +1 -1
- package/dist/index.css +8 -0
- package/dist/index.css.map +1 -1
- package/dist/utils/PopupParentContext.stories.d.ts +17 -0
- package/dist/utils/PopupParentContext.stories.d.ts.map +1 -0
- package/dist/utils/PopupParentContext.stories.js +266 -0
- package/dist/utils/PopupParentContext.stories.js.map +1 -0
- package/dist/utils/getDefaultPopupParent.d.ts.map +1 -1
- package/dist/utils/getDefaultPopupParent.js +6 -0
- package/dist/utils/getDefaultPopupParent.js.map +1 -1
- package/package.json +1 -1
- package/src/components/articleCard/ArticleCard.stories.tsx +524 -111
- package/src/components/avatar/Avatar.stories.tsx +504 -59
- package/src/components/avatarGroup/AvatarGroup.stories.tsx +977 -175
- package/src/components/banner/Banner.stories.tsx +7 -3
- package/src/components/card/Card.stories.tsx +466 -36
- package/src/components/combobox/Combobox.stories.tsx +867 -260
- package/src/components/datePicker/DatePicker.stories.tsx +777 -60
- package/src/components/dateTimePicker/DateTimePicker.stories.tsx +910 -132
- package/src/components/editableText/EditableText.stories.tsx +567 -91
- package/src/components/formField/FormField.test.tsx +6 -0
- package/src/components/formField/FormField.tsx +5 -0
- package/src/components/formField/fieldset/Fieldset.stories.tsx +761 -51
- package/src/components/formField/inputs/checkbox/CheckboxGroup.tsx +1 -1
- package/src/components/formField/inputs/checkbox/CheckboxInput.tsx +1 -1
- package/src/components/formField/inputs/colourPickerDropdown/ColourPickerDropdown.stories.tsx +504 -11
- package/src/components/formField/inputs/radio/RadioButtonGroup.tsx +17 -4
- package/src/components/formField/inputs/radio/RadioButtonInput.stories.tsx +71 -59
- package/src/components/formField/inputs/selectDropdown/SelectDropdown.stories.tsx +1079 -168
- package/src/components/formField/inputs/time/TimeInput.stories.tsx +1140 -104
- package/src/components/formField/label/Label.stories.tsx +317 -8
- package/src/components/icoText/IcoText.stories.tsx +442 -31
- package/src/components/kpiCard/KPICard.stories.tsx +475 -30
- package/src/components/kvpList/KVPList.stories.tsx +593 -26
- package/src/components/modal/Modal.stories.tsx +963 -26
- package/src/components/modal/modalManager/ModalManager.stories.tsx +612 -454
- package/src/components/pill/Pill.stories.tsx +11 -13
- package/src/components/pill/Pill.tsx +1 -0
- package/src/components/row/Row.stories.tsx +474 -58
- package/src/components/searchBar/SearchBar.stories.tsx +570 -38
- package/src/components/section/Section.stories.tsx +723 -70
- package/src/components/singleUser/SingleUser.stories.tsx +393 -34
- package/src/components/slideoverManager/SlideoverManager.stories.tsx +572 -342
- package/src/components/table/DSDefaultColDef.ts +25 -5
- package/src/components/table/Table.stories.tsx +411 -3
- package/src/components/table/Table.tsx +9 -2
- package/src/components/table/TableFooter.stories.tsx +196 -0
- package/src/components/table/TableHeader.stories.tsx +251 -0
- package/src/components/table/cellEditors/DateCellEditor.stories.tsx +245 -0
- package/src/components/table/cellRenderers/BooleanCellRenderer.stories.tsx +278 -0
- package/src/components/table/cellRenderers/ButtonCellRenderer.stories.tsx +333 -0
- package/src/components/table/cellRenderers/CheckboxCellRenderer.stories.tsx +337 -0
- package/src/components/table/cellRenderers/CheckboxCellRenderer.tsx +5 -1
- package/src/components/table/cellRenderers/DefaultCellRenderer.stories.tsx +342 -0
- package/src/components/table/cellRenderers/InlineTextCellRenderer.stories.tsx +292 -0
- package/src/components/table/cellRenderers/SelectDropdownCellRenderer.stories.tsx +369 -0
- package/src/components/table/columnFilters/BooleanFilter.stories.tsx +268 -0
- package/src/components/table/columnFilters/TimeFilter.stories.tsx +281 -0
- package/src/components/table/pagination/PaginationPanel.stories.tsx +327 -0
- package/src/components/table/tableControls/TableControls.stories.tsx +415 -0
- package/src/components/table/tableControls/TableSettingsDropdown.test.tsx +207 -0
- package/src/components/table/tableControls/TableSettingsDropdown.tsx +103 -39
- package/src/components/tabs/Tabs.stories.tsx +540 -60
- package/src/components/tabs/TabsItem.stories.tsx +82 -8
- package/src/components/toast/Toast.stories.tsx +539 -77
- package/src/components/toggle/Toggle.stories.tsx +371 -135
- package/src/components/tooltip/Tooltip.stories.tsx +606 -15
- package/src/components/tooltip/TooltipWrapper.stories.tsx +348 -12
- package/src/docs/Contributing.mdx +241 -0
- package/src/docs/UsingComponents.mdx +93 -0
- package/src/docs/Welcome.mdx +68 -0
- package/src/global.scss +7 -0
- package/src/utils/PopupParentContext.stories.tsx +367 -0
- package/src/utils/getDefaultPopupParent.ts +6 -0
- package/.ralph/storybook-upgrade/knowledge.md +0 -308
- package/.ralph/storybook-upgrade/prd.json +0 -777
- package/.ralph/storybook-upgrade/progress.md +0 -342
- package/src/components/table/TableWIP.mdx +0 -3
|
@@ -0,0 +1,337 @@
|
|
|
1
|
+
import { useState } 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 type { CustomCellRendererProps } from 'ag-grid-react';
|
|
13
|
+
import { CheckboxCellRenderer } from './CheckboxCellRenderer';
|
|
14
|
+
import { Table } from 'Components/table/Table';
|
|
15
|
+
|
|
16
|
+
// ---------------------------------------------------------------------------
|
|
17
|
+
// Docs page content
|
|
18
|
+
// ---------------------------------------------------------------------------
|
|
19
|
+
|
|
20
|
+
const DESCRIPTION_INTRO = [
|
|
21
|
+
'`CheckboxCellRenderer` is an AG Grid cell renderer that renders an editable Arbor `CheckboxInput`',
|
|
22
|
+
'inside a table cell. On toggle, it calls `node.setDataValue` to update the row data in-place.',
|
|
23
|
+
'',
|
|
24
|
+
'Register it via the string key `dsCheckboxCellRenderer` (pre-registered by Arbor\'s `Table`) or by importing the component directly.',
|
|
25
|
+
].join('\n');
|
|
26
|
+
|
|
27
|
+
const USAGE_GUIDANCE = [
|
|
28
|
+
'### When to use',
|
|
29
|
+
'',
|
|
30
|
+
'- On boolean columns that the user needs to toggle directly in the table without opening a form',
|
|
31
|
+
'- "Active", "Enrolled", "Consent given" columns where inline editing is expected',
|
|
32
|
+
'',
|
|
33
|
+
'---',
|
|
34
|
+
'',
|
|
35
|
+
'### When NOT to use',
|
|
36
|
+
'',
|
|
37
|
+
'| Situation | Use instead |',
|
|
38
|
+
'|---|---|',
|
|
39
|
+
'| Display-only boolean (no editing) | `BooleanCellRenderer` (`dsBooleanCellRenderer`) |',
|
|
40
|
+
'| Toggling the value requires confirmation or a side effect | Handle in a modal; do not edit inline |',
|
|
41
|
+
].join('\n');
|
|
42
|
+
|
|
43
|
+
const DEVELOPER_NOTES = [
|
|
44
|
+
'### Critical usage patterns',
|
|
45
|
+
'',
|
|
46
|
+
'**`column` must be provided for changes to persist.**',
|
|
47
|
+
'On toggle, the renderer calls `node.setDataValue(column, !value)`. If `column` is not available in',
|
|
48
|
+
'props (which should not happen inside a real AG Grid), the change is silently ignored.',
|
|
49
|
+
'',
|
|
50
|
+
'**`aria-label` is derived from `colDef.headerName`.**',
|
|
51
|
+
'Always set `headerName` on the column definition — without it, the checkbox has no accessible label.',
|
|
52
|
+
'Override with `cellRendererParams: { "aria-label": "..." }` if needed.',
|
|
53
|
+
'',
|
|
54
|
+
'**Pass extra `CheckboxInput` props via `cellRendererParams`.**',
|
|
55
|
+
'The renderer spreads `cellRendererParams` onto `CheckboxInput`, so you can pass `disabled`, `className`, etc.',
|
|
56
|
+
'',
|
|
57
|
+
'```tsx',
|
|
58
|
+
"import { Table } from '@arbor-education/design-system.components';",
|
|
59
|
+
'',
|
|
60
|
+
'const colDefs = [',
|
|
61
|
+
' {',
|
|
62
|
+
" field: 'isEnrolled',",
|
|
63
|
+
" headerName: 'Enrolled',",
|
|
64
|
+
" cellRenderer: 'dsCheckboxCellRenderer',",
|
|
65
|
+
' // optional extra CheckboxInput props:',
|
|
66
|
+
' cellRendererParams: { disabled: isReadOnly },',
|
|
67
|
+
' },',
|
|
68
|
+
'];',
|
|
69
|
+
'```',
|
|
70
|
+
'',
|
|
71
|
+
'---',
|
|
72
|
+
'',
|
|
73
|
+
'### Accessibility',
|
|
74
|
+
'',
|
|
75
|
+
'The `aria-label` is set to `"Checkbox: {headerName}"` when `headerName` is defined. Without it,',
|
|
76
|
+
'the checkbox has no accessible label — WCAG 2.1 failure (1.3.1 Info and Relationships).',
|
|
77
|
+
'',
|
|
78
|
+
'---',
|
|
79
|
+
'',
|
|
80
|
+
'### TypeScript types',
|
|
81
|
+
'',
|
|
82
|
+
'```ts',
|
|
83
|
+
"import { CheckboxCellRenderer } from '@arbor-education/design-system.components';",
|
|
84
|
+
'```',
|
|
85
|
+
'',
|
|
86
|
+
'`CheckboxCellRenderer` accepts `CustomCellRendererProps` from AG Grid.',
|
|
87
|
+
'`value` should be a `boolean`. Additional `CheckboxInput` props can be passed via `colDef.cellRendererParams`.',
|
|
88
|
+
].join('\n');
|
|
89
|
+
|
|
90
|
+
const RELATED_COMPONENTS = [
|
|
91
|
+
'## Related components',
|
|
92
|
+
'',
|
|
93
|
+
'[Table](?path=/docs/components-table--docs) · [BooleanCellRenderer](?path=/docs/components-table-cellrenderers-booleancellrenderer--docs) · [CheckboxInput](?path=/docs/components-checkboxinput--docs)',
|
|
94
|
+
].join('\n');
|
|
95
|
+
|
|
96
|
+
const PROPS_INTRO = 'The preview below uses a mock AG Grid row node — click the checkbox to see it toggle. `node.setDataValue` is wired to local state in this preview; in a real table it updates the row data directly.';
|
|
97
|
+
|
|
98
|
+
// ---------------------------------------------------------------------------
|
|
99
|
+
// Custom DocsPage
|
|
100
|
+
// ---------------------------------------------------------------------------
|
|
101
|
+
|
|
102
|
+
function CheckboxCellRendererDocsPage() {
|
|
103
|
+
return (
|
|
104
|
+
<>
|
|
105
|
+
<Title />
|
|
106
|
+
<Subtitle />
|
|
107
|
+
<Markdown>{DESCRIPTION_INTRO}</Markdown>
|
|
108
|
+
<DocHeading>Interactive example</DocHeading>
|
|
109
|
+
<Markdown>{PROPS_INTRO}</Markdown>
|
|
110
|
+
<DocPrimary />
|
|
111
|
+
<Controls />
|
|
112
|
+
<DocHeading>Usage guidance</DocHeading>
|
|
113
|
+
<Markdown>{USAGE_GUIDANCE}</Markdown>
|
|
114
|
+
<DocHeading>Developer notes</DocHeading>
|
|
115
|
+
<Markdown>{DEVELOPER_NOTES}</Markdown>
|
|
116
|
+
<DocHeading>Examples</DocHeading>
|
|
117
|
+
<Stories title="" />
|
|
118
|
+
<Markdown>{RELATED_COMPONENTS}</Markdown>
|
|
119
|
+
</>
|
|
120
|
+
);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// ---------------------------------------------------------------------------
|
|
124
|
+
// Meta
|
|
125
|
+
// ---------------------------------------------------------------------------
|
|
126
|
+
|
|
127
|
+
const meta = {
|
|
128
|
+
title: 'Components/Table/CellRenderers/CheckboxCellRenderer',
|
|
129
|
+
component: CheckboxCellRenderer,
|
|
130
|
+
tags: ['autodocs'],
|
|
131
|
+
parameters: {
|
|
132
|
+
layout: 'padded',
|
|
133
|
+
docs: { page: CheckboxCellRendererDocsPage },
|
|
134
|
+
},
|
|
135
|
+
argTypes: {
|
|
136
|
+
value: {
|
|
137
|
+
control: false,
|
|
138
|
+
description: 'The current boolean state of the checkbox. On toggle, the renderer calls `node.setDataValue(column, !value)`.',
|
|
139
|
+
table: {
|
|
140
|
+
type: { summary: 'boolean' },
|
|
141
|
+
defaultValue: { summary: 'false' },
|
|
142
|
+
},
|
|
143
|
+
},
|
|
144
|
+
node: {
|
|
145
|
+
control: false,
|
|
146
|
+
description: 'AG Grid row node. The renderer calls `node.setDataValue` on toggle.',
|
|
147
|
+
table: { type: { summary: 'IRowNode' } },
|
|
148
|
+
},
|
|
149
|
+
column: {
|
|
150
|
+
control: false,
|
|
151
|
+
description: 'AG Grid column instance. Passed as the first argument to `node.setDataValue`.',
|
|
152
|
+
table: { type: { summary: 'Column | null' } },
|
|
153
|
+
},
|
|
154
|
+
colDef: {
|
|
155
|
+
control: false,
|
|
156
|
+
description: '`headerName` is used as the basis of the checkbox `aria-label`. Extra `CheckboxInput` props can be passed via `cellRendererParams`.',
|
|
157
|
+
table: { type: { summary: 'ColDef' } },
|
|
158
|
+
},
|
|
159
|
+
},
|
|
160
|
+
} satisfies Meta<typeof CheckboxCellRenderer>;
|
|
161
|
+
|
|
162
|
+
export default meta;
|
|
163
|
+
type Story = StoryObj<typeof CheckboxCellRenderer>;
|
|
164
|
+
|
|
165
|
+
// ---------------------------------------------------------------------------
|
|
166
|
+
// Helper: attach a per-story description to docs
|
|
167
|
+
// ---------------------------------------------------------------------------
|
|
168
|
+
|
|
169
|
+
const withDescription = (story: Story, description: string): Story => ({
|
|
170
|
+
...story,
|
|
171
|
+
parameters: {
|
|
172
|
+
...story.parameters,
|
|
173
|
+
docs: { ...story.parameters?.docs, description: { story: description } },
|
|
174
|
+
},
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
// ---------------------------------------------------------------------------
|
|
178
|
+
// Template components
|
|
179
|
+
// ---------------------------------------------------------------------------
|
|
180
|
+
|
|
181
|
+
const InteractiveTemplate = () => {
|
|
182
|
+
const [checked, setChecked] = useState(false);
|
|
183
|
+
const mockNode = { setDataValue: (_: unknown, val: boolean) => setChecked(val) } as CustomCellRendererProps['node'];
|
|
184
|
+
const mockColumn = {} as CustomCellRendererProps['column'];
|
|
185
|
+
|
|
186
|
+
return (
|
|
187
|
+
<CheckboxCellRenderer
|
|
188
|
+
{...({} as unknown as CustomCellRendererProps)}
|
|
189
|
+
value={checked}
|
|
190
|
+
node={mockNode}
|
|
191
|
+
column={mockColumn}
|
|
192
|
+
colDef={{ headerName: 'Enrolled' }}
|
|
193
|
+
/>
|
|
194
|
+
);
|
|
195
|
+
};
|
|
196
|
+
|
|
197
|
+
const DisabledTemplate = ({ checked }: { checked: boolean }) => (
|
|
198
|
+
<CheckboxCellRenderer
|
|
199
|
+
{...({} as unknown as CustomCellRendererProps)}
|
|
200
|
+
value={checked}
|
|
201
|
+
node={{ setDataValue: () => {} } as unknown as CustomCellRendererProps['node']}
|
|
202
|
+
column={{} as CustomCellRendererProps['column']}
|
|
203
|
+
colDef={{ headerName: 'Enrolled', cellRendererParams: { disabled: true } }}
|
|
204
|
+
/>
|
|
205
|
+
);
|
|
206
|
+
|
|
207
|
+
// ---------------------------------------------------------------------------
|
|
208
|
+
// Stories
|
|
209
|
+
// ---------------------------------------------------------------------------
|
|
210
|
+
|
|
211
|
+
export const Default: Story = withDescription(
|
|
212
|
+
{
|
|
213
|
+
parameters: { controls: { disable: true } },
|
|
214
|
+
render: InteractiveTemplate,
|
|
215
|
+
},
|
|
216
|
+
'An interactive `CheckboxInput` backed by a mock row node. Click to toggle — `node.setDataValue` updates local state in this preview; in a real table it updates the AG Grid row data in-place.',
|
|
217
|
+
);
|
|
218
|
+
|
|
219
|
+
export const Checked: Story = withDescription(
|
|
220
|
+
{
|
|
221
|
+
parameters: {
|
|
222
|
+
controls: { disable: true },
|
|
223
|
+
docs: {
|
|
224
|
+
source: {
|
|
225
|
+
language: 'tsx',
|
|
226
|
+
code: `
|
|
227
|
+
import { Table } from '@arbor-education/design-system.components';
|
|
228
|
+
|
|
229
|
+
const colDefs = [
|
|
230
|
+
{
|
|
231
|
+
field: 'isEnrolled',
|
|
232
|
+
headerName: 'Enrolled',
|
|
233
|
+
cellRenderer: 'dsCheckboxCellRenderer',
|
|
234
|
+
},
|
|
235
|
+
];
|
|
236
|
+
`.trim(),
|
|
237
|
+
},
|
|
238
|
+
},
|
|
239
|
+
},
|
|
240
|
+
render: () => <DisabledTemplate checked={true} />,
|
|
241
|
+
},
|
|
242
|
+
'Checked state — `value={true}`. The `aria-label` is derived from `colDef.headerName` ("Checkbox: Enrolled").',
|
|
243
|
+
);
|
|
244
|
+
|
|
245
|
+
export const Unchecked: Story = withDescription(
|
|
246
|
+
{
|
|
247
|
+
parameters: { controls: { disable: true } },
|
|
248
|
+
render: () => <DisabledTemplate checked={false} />,
|
|
249
|
+
},
|
|
250
|
+
'Unchecked state — `value={false}`.',
|
|
251
|
+
);
|
|
252
|
+
|
|
253
|
+
export const DisabledChecked: Story = withDescription(
|
|
254
|
+
{
|
|
255
|
+
parameters: { controls: { disable: true } },
|
|
256
|
+
render: () => (
|
|
257
|
+
<CheckboxCellRenderer
|
|
258
|
+
{...({} as unknown as CustomCellRendererProps)}
|
|
259
|
+
value={true}
|
|
260
|
+
node={{ setDataValue: () => {} } as unknown as CustomCellRendererProps['node']}
|
|
261
|
+
column={{} as CustomCellRendererProps['column']}
|
|
262
|
+
colDef={{ headerName: 'Enrolled', cellRendererParams: { disabled: true } }}
|
|
263
|
+
/>
|
|
264
|
+
),
|
|
265
|
+
},
|
|
266
|
+
'Disabled state — pass `disabled: true` via `cellRendererParams` to prevent the user from toggling the value. Useful for read-only rows or conditional editing logic.',
|
|
267
|
+
);
|
|
268
|
+
|
|
269
|
+
const CHECKBOX_IN_TABLE_DATA = [
|
|
270
|
+
{ name: 'Alice Johnson', enrolled: true },
|
|
271
|
+
{ name: 'Bob Smith', enrolled: false },
|
|
272
|
+
{ name: 'Charlie Brown', enrolled: true },
|
|
273
|
+
{ name: 'Diana Prince', enrolled: false },
|
|
274
|
+
];
|
|
275
|
+
|
|
276
|
+
export const InATable: Story = withDescription(
|
|
277
|
+
{
|
|
278
|
+
parameters: {
|
|
279
|
+
controls: { disable: true },
|
|
280
|
+
docs: {
|
|
281
|
+
source: {
|
|
282
|
+
language: 'tsx',
|
|
283
|
+
code: `
|
|
284
|
+
import { Table } from '@arbor-education/design-system.components';
|
|
285
|
+
|
|
286
|
+
const rowData = [
|
|
287
|
+
{ name: 'Alice Johnson', enrolled: true },
|
|
288
|
+
{ name: 'Bob Smith', enrolled: false },
|
|
289
|
+
{ name: 'Charlie Brown', enrolled: true },
|
|
290
|
+
{ name: 'Diana Prince', enrolled: false },
|
|
291
|
+
];
|
|
292
|
+
|
|
293
|
+
function CheckboxCellRendererExample() {
|
|
294
|
+
return (
|
|
295
|
+
<Table
|
|
296
|
+
rowData={rowData}
|
|
297
|
+
columnDefs={[
|
|
298
|
+
{ field: 'name', headerName: 'Name', flex: 2 },
|
|
299
|
+
{
|
|
300
|
+
field: 'enrolled',
|
|
301
|
+
headerName: 'Enrolled',
|
|
302
|
+
flex: 1,
|
|
303
|
+
editable: false,
|
|
304
|
+
cellRenderer: 'dsCheckboxCellRenderer',
|
|
305
|
+
},
|
|
306
|
+
]}
|
|
307
|
+
defaultColDef={{ flex: 1, minWidth: 120 }}
|
|
308
|
+
domLayout="autoHeight"
|
|
309
|
+
/>
|
|
310
|
+
);
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
export default CheckboxCellRendererExample;
|
|
314
|
+
`.trim(),
|
|
315
|
+
},
|
|
316
|
+
},
|
|
317
|
+
},
|
|
318
|
+
render: () => (
|
|
319
|
+
<Table
|
|
320
|
+
rowData={CHECKBOX_IN_TABLE_DATA}
|
|
321
|
+
columnDefs={[
|
|
322
|
+
{ field: 'name', headerName: 'Name', flex: 2 },
|
|
323
|
+
{
|
|
324
|
+
field: 'enrolled',
|
|
325
|
+
headerName: 'Enrolled',
|
|
326
|
+
flex: 1,
|
|
327
|
+
editable: false,
|
|
328
|
+
cellRenderer: 'dsCheckboxCellRenderer',
|
|
329
|
+
},
|
|
330
|
+
]}
|
|
331
|
+
defaultColDef={{ flex: 1, minWidth: 120 }}
|
|
332
|
+
domLayout="autoHeight"
|
|
333
|
+
/>
|
|
334
|
+
),
|
|
335
|
+
},
|
|
336
|
+
'`dsCheckboxCellRenderer` wired up inside a full `Table`. Click a checkbox to toggle the value — AG Grid calls `node.setDataValue` which updates the row data in-place. The `headerName` ("Enrolled") becomes the checkbox `aria-label`.',
|
|
337
|
+
);
|
|
@@ -11,6 +11,10 @@ export const CheckboxCellRenderer = (props: CustomCellRendererProps) => {
|
|
|
11
11
|
|
|
12
12
|
const { cellRendererParams, headerName } = colDef;
|
|
13
13
|
|
|
14
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
15
|
+
const { suppressCellFocusAndFocusFirstElement, suppressMouseEventHandling, ...checkboxParams }
|
|
16
|
+
= (cellRendererParams ?? {}) as Record<string, unknown>;
|
|
17
|
+
|
|
14
18
|
return (
|
|
15
19
|
<div className="ds-checkbox-cell-renderer">
|
|
16
20
|
<CheckboxInput
|
|
@@ -21,7 +25,7 @@ export const CheckboxCellRenderer = (props: CustomCellRendererProps) => {
|
|
|
21
25
|
node.setDataValue(column, !value);
|
|
22
26
|
}
|
|
23
27
|
}}
|
|
24
|
-
{...
|
|
28
|
+
{...checkboxParams}
|
|
25
29
|
/>
|
|
26
30
|
</div>
|
|
27
31
|
);
|
|
@@ -0,0 +1,342 @@
|
|
|
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 type { CustomCellRendererProps } from 'ag-grid-react';
|
|
12
|
+
import { DefaultCellRenderer } from './DefaultCellRenderer';
|
|
13
|
+
import { Table } from 'Components/table/Table';
|
|
14
|
+
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
// Docs page content
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
|
|
19
|
+
const DESCRIPTION_INTRO = [
|
|
20
|
+
'`DefaultCellRenderer` is the internal default cell renderer used by Arbor\'s `Table`. It renders',
|
|
21
|
+
'`valueFormatted` when available, falls back to `value.value`, and renders an empty `div` for',
|
|
22
|
+
'`null` or `undefined`. It also supports an optional `dataTestId` via `colDef.cellRendererParams`.',
|
|
23
|
+
'',
|
|
24
|
+
'**You rarely need to register this renderer explicitly.** AG Grid uses it automatically for all',
|
|
25
|
+
'columns in an Arbor Table.',
|
|
26
|
+
].join('\n');
|
|
27
|
+
|
|
28
|
+
const USAGE_GUIDANCE = [
|
|
29
|
+
'### When to use',
|
|
30
|
+
'',
|
|
31
|
+
'- When you need to add a `dataTestId` to a cell for automated testing',
|
|
32
|
+
'- When you want to be explicit about using the default renderer in a column definition',
|
|
33
|
+
'',
|
|
34
|
+
'---',
|
|
35
|
+
'',
|
|
36
|
+
'### When NOT to use',
|
|
37
|
+
'',
|
|
38
|
+
'| Situation | Use instead |',
|
|
39
|
+
'|---|---|',
|
|
40
|
+
'| The column needs interactive controls | `CheckboxCellRenderer`, `ButtonCellRenderer`, or `SelectDropdownCellRenderer` |',
|
|
41
|
+
'| The column renders a boolean flag | `BooleanCellRenderer` |',
|
|
42
|
+
'| You want formatted text output | A `valueFormatter` on the column — `DefaultCellRenderer` renders `valueFormatted` automatically |',
|
|
43
|
+
].join('\n');
|
|
44
|
+
|
|
45
|
+
const DEVELOPER_NOTES = [
|
|
46
|
+
'### Critical usage patterns',
|
|
47
|
+
'',
|
|
48
|
+
'**Value resolution order:**',
|
|
49
|
+
'1. Uses `valueFormatted` if it exists and is NOT the string `"[object Object]"`',
|
|
50
|
+
'2. Falls back to `value.value`',
|
|
51
|
+
'3. Renders an empty `<div>` for `null` or `undefined`',
|
|
52
|
+
'',
|
|
53
|
+
'This means a `valueFormatter` on the column will always take precedence over the raw value.',
|
|
54
|
+
'',
|
|
55
|
+
'**`dataTestId` must be passed via `colDef.cellRendererParams`** — it is not a direct prop.',
|
|
56
|
+
'',
|
|
57
|
+
'```tsx',
|
|
58
|
+
"import { Table } from '@arbor-education/design-system.components';",
|
|
59
|
+
'',
|
|
60
|
+
'const colDefs = [',
|
|
61
|
+
' {',
|
|
62
|
+
" field: 'name',",
|
|
63
|
+
" headerName: 'Name',",
|
|
64
|
+
' // Explicit registration — only needed when you want a dataTestId:',
|
|
65
|
+
' cellRenderer: DefaultCellRenderer,',
|
|
66
|
+
' cellRendererParams: {',
|
|
67
|
+
" dataTestId: 'student-name-cell',",
|
|
68
|
+
' },',
|
|
69
|
+
' },',
|
|
70
|
+
'];',
|
|
71
|
+
'```',
|
|
72
|
+
'',
|
|
73
|
+
'---',
|
|
74
|
+
'',
|
|
75
|
+
'### Accessibility',
|
|
76
|
+
'',
|
|
77
|
+
'No specific accessibility requirements — this renderer renders plain text. Ensure your `valueFormatter`',
|
|
78
|
+
'returns a human-readable string, not a raw object (which would produce `"[object Object]"`).',
|
|
79
|
+
'',
|
|
80
|
+
'---',
|
|
81
|
+
'',
|
|
82
|
+
'### TypeScript types',
|
|
83
|
+
'',
|
|
84
|
+
'```ts',
|
|
85
|
+
"import { DefaultCellRenderer } from '@arbor-education/design-system.components';",
|
|
86
|
+
'```',
|
|
87
|
+
'',
|
|
88
|
+
'`DefaultCellRenderer` accepts `CustomCellRendererProps` from AG Grid.',
|
|
89
|
+
].join('\n');
|
|
90
|
+
|
|
91
|
+
const RELATED_COMPONENTS = [
|
|
92
|
+
'## Related components',
|
|
93
|
+
'',
|
|
94
|
+
'[Table](?path=/docs/components-table--docs) · [BooleanCellRenderer](?path=/docs/components-table-cellrenderers-booleancellrenderer--docs)',
|
|
95
|
+
].join('\n');
|
|
96
|
+
|
|
97
|
+
const PROPS_INTRO = 'The preview below shows `DefaultCellRenderer` in its various value states. This renderer is used internally by Arbor\'s Table — its Controls are not individually wired to the grid runtime.';
|
|
98
|
+
|
|
99
|
+
// ---------------------------------------------------------------------------
|
|
100
|
+
// Custom DocsPage
|
|
101
|
+
// ---------------------------------------------------------------------------
|
|
102
|
+
|
|
103
|
+
function DefaultCellRendererDocsPage() {
|
|
104
|
+
return (
|
|
105
|
+
<>
|
|
106
|
+
<Title />
|
|
107
|
+
<Subtitle />
|
|
108
|
+
<Markdown>{DESCRIPTION_INTRO}</Markdown>
|
|
109
|
+
<DocHeading>Interactive example</DocHeading>
|
|
110
|
+
<Markdown>{PROPS_INTRO}</Markdown>
|
|
111
|
+
<DocPrimary />
|
|
112
|
+
<Controls />
|
|
113
|
+
<DocHeading>Usage guidance</DocHeading>
|
|
114
|
+
<Markdown>{USAGE_GUIDANCE}</Markdown>
|
|
115
|
+
<DocHeading>Developer notes</DocHeading>
|
|
116
|
+
<Markdown>{DEVELOPER_NOTES}</Markdown>
|
|
117
|
+
<DocHeading>Examples</DocHeading>
|
|
118
|
+
<Stories title="" />
|
|
119
|
+
<Markdown>{RELATED_COMPONENTS}</Markdown>
|
|
120
|
+
</>
|
|
121
|
+
);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// ---------------------------------------------------------------------------
|
|
125
|
+
// Meta
|
|
126
|
+
// ---------------------------------------------------------------------------
|
|
127
|
+
|
|
128
|
+
const MOCK_CELL_PROPS = {} as unknown as CustomCellRendererProps;
|
|
129
|
+
|
|
130
|
+
const meta = {
|
|
131
|
+
title: 'Components/Table/CellRenderers/DefaultCellRenderer',
|
|
132
|
+
component: DefaultCellRenderer,
|
|
133
|
+
tags: ['autodocs'],
|
|
134
|
+
parameters: {
|
|
135
|
+
layout: 'padded',
|
|
136
|
+
docs: { page: DefaultCellRendererDocsPage },
|
|
137
|
+
},
|
|
138
|
+
argTypes: {
|
|
139
|
+
valueFormatted: {
|
|
140
|
+
control: false,
|
|
141
|
+
description: 'String produced by AG Grid\'s `valueFormatter`. Takes precedence over `value.value` unless it equals `"[object Object]"`.',
|
|
142
|
+
table: {
|
|
143
|
+
type: { summary: 'string | undefined' },
|
|
144
|
+
defaultValue: { summary: 'undefined' },
|
|
145
|
+
},
|
|
146
|
+
},
|
|
147
|
+
value: {
|
|
148
|
+
control: false,
|
|
149
|
+
description: 'The raw cell value from AG Grid. The renderer reads `value.value` as a fallback when `valueFormatted` is not set.',
|
|
150
|
+
table: {
|
|
151
|
+
type: { summary: '{ value: string | number | null | undefined } | any' },
|
|
152
|
+
},
|
|
153
|
+
},
|
|
154
|
+
colDef: {
|
|
155
|
+
control: false,
|
|
156
|
+
description: 'Pass `cellRendererParams: { dataTestId: "..." }` to add a test ID to the cell `div`.',
|
|
157
|
+
table: {
|
|
158
|
+
type: { summary: 'ColDef' },
|
|
159
|
+
},
|
|
160
|
+
},
|
|
161
|
+
},
|
|
162
|
+
} satisfies Meta<typeof DefaultCellRenderer>;
|
|
163
|
+
|
|
164
|
+
export default meta;
|
|
165
|
+
type Story = StoryObj<typeof DefaultCellRenderer>;
|
|
166
|
+
|
|
167
|
+
// ---------------------------------------------------------------------------
|
|
168
|
+
// Helper: attach a per-story description to docs
|
|
169
|
+
// ---------------------------------------------------------------------------
|
|
170
|
+
|
|
171
|
+
const withDescription = (story: Story, description: string): Story => ({
|
|
172
|
+
...story,
|
|
173
|
+
parameters: {
|
|
174
|
+
...story.parameters,
|
|
175
|
+
docs: { ...story.parameters?.docs, description: { story: description } },
|
|
176
|
+
},
|
|
177
|
+
});
|
|
178
|
+
|
|
179
|
+
// ---------------------------------------------------------------------------
|
|
180
|
+
// Stories
|
|
181
|
+
// ---------------------------------------------------------------------------
|
|
182
|
+
|
|
183
|
+
export const Default: Story = withDescription(
|
|
184
|
+
{
|
|
185
|
+
parameters: { controls: { disable: true } },
|
|
186
|
+
render: () => (
|
|
187
|
+
<DefaultCellRenderer
|
|
188
|
+
{...MOCK_CELL_PROPS}
|
|
189
|
+
valueFormatted="Smith, Alice"
|
|
190
|
+
value={{ value: 'smith-alice' }}
|
|
191
|
+
colDef={{}}
|
|
192
|
+
/>
|
|
193
|
+
),
|
|
194
|
+
},
|
|
195
|
+
'`valueFormatted` takes precedence — the renderer displays "Smith, Alice" (the formatted value) rather than "smith-alice" (the raw value).',
|
|
196
|
+
);
|
|
197
|
+
|
|
198
|
+
export const RawValueFallback: Story = withDescription(
|
|
199
|
+
{
|
|
200
|
+
parameters: { controls: { disable: true } },
|
|
201
|
+
render: () => (
|
|
202
|
+
<DefaultCellRenderer
|
|
203
|
+
{...MOCK_CELL_PROPS}
|
|
204
|
+
valueFormatted={undefined}
|
|
205
|
+
value={{ value: 'Unformatted cell value' }}
|
|
206
|
+
colDef={{}}
|
|
207
|
+
/>
|
|
208
|
+
),
|
|
209
|
+
},
|
|
210
|
+
'When `valueFormatted` is not set, the renderer falls back to `value.value`.',
|
|
211
|
+
);
|
|
212
|
+
|
|
213
|
+
export const Empty: Story = withDescription(
|
|
214
|
+
{
|
|
215
|
+
parameters: { controls: { disable: true } },
|
|
216
|
+
render: () => (
|
|
217
|
+
<DefaultCellRenderer
|
|
218
|
+
{...MOCK_CELL_PROPS}
|
|
219
|
+
valueFormatted={undefined}
|
|
220
|
+
value={{ value: null }}
|
|
221
|
+
colDef={{}}
|
|
222
|
+
/>
|
|
223
|
+
),
|
|
224
|
+
},
|
|
225
|
+
'`null` or `undefined` resolved values render an empty `<div>`. The cell is blank but the DOM element is present (useful for `dataTestId` targeting).',
|
|
226
|
+
);
|
|
227
|
+
|
|
228
|
+
export const WithDataTestId: Story = withDescription(
|
|
229
|
+
{
|
|
230
|
+
parameters: {
|
|
231
|
+
controls: { disable: true },
|
|
232
|
+
docs: {
|
|
233
|
+
source: {
|
|
234
|
+
language: 'tsx',
|
|
235
|
+
code: `
|
|
236
|
+
import { DefaultCellRenderer } from '@arbor-education/design-system.components';
|
|
237
|
+
|
|
238
|
+
const colDefs = [
|
|
239
|
+
{
|
|
240
|
+
field: 'name',
|
|
241
|
+
headerName: 'Name',
|
|
242
|
+
cellRenderer: DefaultCellRenderer,
|
|
243
|
+
cellRendererParams: {
|
|
244
|
+
dataTestId: 'student-name-cell',
|
|
245
|
+
},
|
|
246
|
+
},
|
|
247
|
+
];
|
|
248
|
+
`.trim(),
|
|
249
|
+
},
|
|
250
|
+
},
|
|
251
|
+
},
|
|
252
|
+
render: () => (
|
|
253
|
+
<DefaultCellRenderer
|
|
254
|
+
{...MOCK_CELL_PROPS}
|
|
255
|
+
valueFormatted="Smith, Alice"
|
|
256
|
+
value={{ value: 'smith-alice' }}
|
|
257
|
+
colDef={{ cellRendererParams: { dataTestId: 'student-name-cell' } }}
|
|
258
|
+
/>
|
|
259
|
+
),
|
|
260
|
+
},
|
|
261
|
+
'Pass `dataTestId` via `colDef.cellRendererParams` to add a `data-testid` attribute to the cell `div`. Inspect the rendered element to see `data-testid="student-name-cell"`.',
|
|
262
|
+
);
|
|
263
|
+
|
|
264
|
+
const DEFAULT_IN_TABLE_DATA = [
|
|
265
|
+
{ name: { value: 'Alice Johnson' }, role: { value: 'Developer' } },
|
|
266
|
+
{ name: { value: 'Bob Smith' }, role: { value: 'Designer' } },
|
|
267
|
+
{ name: { value: 'Charlie Brown' }, role: { value: 'Manager' } },
|
|
268
|
+
];
|
|
269
|
+
|
|
270
|
+
export const InATable: Story = withDescription(
|
|
271
|
+
{
|
|
272
|
+
parameters: {
|
|
273
|
+
controls: { disable: true },
|
|
274
|
+
docs: {
|
|
275
|
+
source: {
|
|
276
|
+
language: 'tsx',
|
|
277
|
+
code: `
|
|
278
|
+
import { Table, DefaultCellRenderer } from '@arbor-education/design-system.components';
|
|
279
|
+
|
|
280
|
+
const rowData = [
|
|
281
|
+
{ name: { value: 'Alice Johnson' }, role: { value: 'Developer' } },
|
|
282
|
+
{ name: { value: 'Bob Smith' }, role: { value: 'Designer' } },
|
|
283
|
+
{ name: { value: 'Charlie Brown' }, role: { value: 'Manager' } },
|
|
284
|
+
];
|
|
285
|
+
|
|
286
|
+
function DefaultCellRendererExample() {
|
|
287
|
+
return (
|
|
288
|
+
<Table
|
|
289
|
+
rowData={rowData}
|
|
290
|
+
columnDefs={[
|
|
291
|
+
{
|
|
292
|
+
field: 'name',
|
|
293
|
+
headerName: 'Name',
|
|
294
|
+
flex: 2,
|
|
295
|
+
cellRenderer: DefaultCellRenderer,
|
|
296
|
+
cellRendererParams: { dataTestId: 'name-cell' },
|
|
297
|
+
valueFormatter: Table.DefaultValueFormatter,
|
|
298
|
+
},
|
|
299
|
+
{
|
|
300
|
+
field: 'role',
|
|
301
|
+
headerName: 'Role',
|
|
302
|
+
flex: 1,
|
|
303
|
+
valueFormatter: Table.DefaultValueFormatter,
|
|
304
|
+
},
|
|
305
|
+
]}
|
|
306
|
+
defaultColDef={{ flex: 1, minWidth: 120 }}
|
|
307
|
+
domLayout="autoHeight"
|
|
308
|
+
/>
|
|
309
|
+
);
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
export default DefaultCellRendererExample;
|
|
313
|
+
`.trim(),
|
|
314
|
+
},
|
|
315
|
+
},
|
|
316
|
+
},
|
|
317
|
+
render: () => (
|
|
318
|
+
<Table
|
|
319
|
+
rowData={DEFAULT_IN_TABLE_DATA}
|
|
320
|
+
columnDefs={[
|
|
321
|
+
{
|
|
322
|
+
field: 'name',
|
|
323
|
+
headerName: 'Name',
|
|
324
|
+
flex: 2,
|
|
325
|
+
cellRenderer: DefaultCellRenderer,
|
|
326
|
+
cellRendererParams: { dataTestId: 'name-cell' },
|
|
327
|
+
valueFormatter: Table.DefaultValueFormatter,
|
|
328
|
+
},
|
|
329
|
+
{
|
|
330
|
+
field: 'role',
|
|
331
|
+
headerName: 'Role',
|
|
332
|
+
flex: 1,
|
|
333
|
+
valueFormatter: Table.DefaultValueFormatter,
|
|
334
|
+
},
|
|
335
|
+
]}
|
|
336
|
+
defaultColDef={{ flex: 1, minWidth: 120 }}
|
|
337
|
+
domLayout="autoHeight"
|
|
338
|
+
/>
|
|
339
|
+
),
|
|
340
|
+
},
|
|
341
|
+
'`DefaultCellRenderer` registered explicitly on the Name column to attach a `dataTestId`. Row data uses the `{ value: string }` object shape — `Table.DefaultValueFormatter` formats it for display, and `DefaultCellRenderer` reads `value.value` as its fallback. Inspect the Name cells in DevTools to see `data-testid="name-cell"`.',
|
|
342
|
+
);
|