@redsift/ds-mcp-server 12.4.0-muiv7 → 12.4.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/data/demos/patterns/_shared/columns.tsx +3 -3
- package/data/demos/patterns/_shared/defaults.ts +1 -1
- package/data/demos/patterns/_shared/filter-helpers.ts +1 -1
- package/data/demos/patterns/_shared/helpers.tsx +1 -1
- package/data/demos/patterns/_shared/server-logic.ts +1 -1
- package/data/demos/patterns/_shared/story-helpers.ts +5 -13
- package/data/demos/patterns/crossfiltered-datagrid-client-side/CrossfilteredDatagridClientSide.interaction.stories.tsx +2 -2
- package/data/demos/patterns/crossfiltered-datagrid-client-side/example.tsx +2 -2
- package/data/demos/patterns/crossfiltered-datagrid-server-side/CrossfilteredDatagridServerSide.interaction.stories.tsx +2 -2
- package/data/demos/patterns/crossfiltered-datagrid-server-side/example.tsx +5 -5
- package/data/demos/patterns/drilldowned-datagrid-client-side/DrilldownedDatagridClientSide.interaction.stories.tsx +2 -2
- package/data/demos/patterns/drilldowned-datagrid-client-side/example.tsx +1 -1
- package/data/demos/patterns/drilldowned-datagrid-server-side/DrilldownedDatagridServerSide.interaction.stories.tsx +2 -2
- package/data/demos/patterns/drilldowned-datagrid-server-side/example.tsx +1 -1
- package/data/demos/patterns/single-datagrid-client-side/SingleDatagridClientSide.interaction.stories.tsx +3 -3
- package/data/demos/patterns/single-datagrid-client-side/example.tsx +4 -4
- package/data/demos/patterns/single-datagrid-server-side/SingleDatagridServerSide.interaction.stories.tsx +3 -3
- package/data/demos/patterns/single-datagrid-server-side/example.tsx +4 -4
- package/data/demos/patterns/summary-dashboard/SummaryDashboard.interaction.stories.tsx +2 -2
- package/data/demos/patterns/tabbed-datagrid-client-side/TabbedDatagridClientSide.interaction.stories.tsx +2 -2
- package/data/demos/patterns/tabbed-datagrid-server-side/TabbedDatagridServerSide.interaction.stories.tsx +2 -2
- package/data/demos/patterns/tabbed-datagrid-server-side/example.tsx +1 -1
- package/data/docs/components/dashboard/Dashboard.json +2 -2
- package/data/docs/components/table/DataGrid.json +3 -30
- package/data/docs/components/table/StatefulDataGrid.json +3 -30
- package/data/docs/components-index.json +2 -2
- package/data/docs/components.json +10 -64
- package/data/docs/llms-full.txt +15 -21
- package/data/docs/llms.txt +6 -6
- package/data/docs/patterns-catalog.md +4 -4
- package/data/docs/patterns.json +4 -4
- package/data/metadata.json +2 -2
- package/data/patterns/crossfiltered-datagrid-server-side.mdx +1 -1
- package/data/patterns/drilldowned-datagrid-client-side.mdx +1 -1
- package/data/patterns/drilldowned-datagrid-server-side.mdx +1 -1
- package/data/patterns/single-datagrid-client-side.mdx +9 -9
- package/data/patterns/single-datagrid-server-side.mdx +7 -7
- package/package.json +2 -2
|
@@ -2,7 +2,7 @@ import React from 'react';
|
|
|
2
2
|
import { createColumn, TextCell } from '@redsift/table';
|
|
3
3
|
import { Flexbox, Icon, IconButtonLink, Pill } from '@redsift/design-system';
|
|
4
4
|
import { mdiArrowRight, mdiCheck, mdiClose } from '@redsift/icons';
|
|
5
|
-
import { GridColDef, GridRenderCellParams } from '@mui/x-data-grid-
|
|
5
|
+
import { GridColDef, GridRenderCellParams } from '@mui/x-data-grid-premium';
|
|
6
6
|
import { Row } from './data';
|
|
7
7
|
|
|
8
8
|
// -- Option constants -------------------------------------------------------
|
|
@@ -106,7 +106,7 @@ export const columns: GridColDef<Row>[] = [
|
|
|
106
106
|
headerName: 'Date',
|
|
107
107
|
width: 140,
|
|
108
108
|
...createColumn('date'),
|
|
109
|
-
valueGetter: (value:
|
|
109
|
+
valueGetter: (value: string) => parseDate(value),
|
|
110
110
|
renderCell: ({ value }: GridRenderCellParams) => <TextCell>{value ? formatDate(value as Date) : '—'}</TextCell>,
|
|
111
111
|
},
|
|
112
112
|
// DateTime
|
|
@@ -115,7 +115,7 @@ export const columns: GridColDef<Row>[] = [
|
|
|
115
115
|
headerName: 'Date & Time',
|
|
116
116
|
width: 180,
|
|
117
117
|
...createColumn('dateTime'),
|
|
118
|
-
valueGetter: (value:
|
|
118
|
+
valueGetter: (value: string) => parseDate(value),
|
|
119
119
|
renderCell: ({ value }: GridRenderCellParams) => <TextCell>{value ? formatDateTime(value as Date) : '—'}</TextCell>,
|
|
120
120
|
},
|
|
121
121
|
// Boolean — in stock
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { GridFilterModel, GridSortModel } from '@mui/x-data-grid-
|
|
1
|
+
import { GridFilterModel, GridSortModel } from '@mui/x-data-grid-premium';
|
|
2
2
|
import { Row, allRows } from './data';
|
|
3
3
|
import { Aggregates, computeAggregates, applyFilters } from './filter-helpers';
|
|
4
4
|
|
|
@@ -314,22 +314,14 @@ export const clickHeaderCheckbox = async (canvasElement: HTMLElement) => {
|
|
|
314
314
|
|
|
315
315
|
/** Click a row checkbox by row index (0-based, within the visible page). */
|
|
316
316
|
export const clickRowCheckbox = async (canvasElement: HTMLElement, rowIndex: number) => {
|
|
317
|
-
let checkbox!: HTMLInputElement;
|
|
318
317
|
await waitFor(() => {
|
|
319
|
-
const
|
|
320
|
-
expect(
|
|
321
|
-
checkbox = row!.querySelector('input[type="checkbox"]') as HTMLInputElement;
|
|
322
|
-
expect(checkbox).toBeTruthy();
|
|
318
|
+
const rows = canvasElement.querySelectorAll('.MuiDataGrid-row');
|
|
319
|
+
expect(rows.length).toBeGreaterThan(rowIndex);
|
|
323
320
|
});
|
|
324
|
-
const
|
|
321
|
+
const rows = canvasElement.querySelectorAll('.MuiDataGrid-row');
|
|
322
|
+
const checkbox = rows[rowIndex].querySelector('input[type="checkbox"]');
|
|
323
|
+
if (!checkbox) throw new Error(`Could not find checkbox in row ${rowIndex}`);
|
|
325
324
|
await userEvent.click(checkbox);
|
|
326
|
-
// Wait for the click to actually toggle the checkbox (needed for MUI v7 re-render timing)
|
|
327
|
-
await waitFor(() => {
|
|
328
|
-
const freshRow = canvasElement.querySelector(`.MuiDataGrid-row[data-rowindex="${rowIndex}"]`);
|
|
329
|
-
const freshCheckbox = freshRow?.querySelector('input[type="checkbox"]') as HTMLInputElement | null;
|
|
330
|
-
expect(freshCheckbox).toBeTruthy();
|
|
331
|
-
expect(freshCheckbox!.checked).toBe(!wasChecked);
|
|
332
|
-
});
|
|
333
325
|
};
|
|
334
326
|
|
|
335
327
|
// ---------------------------------------------------------------------------
|
|
@@ -85,9 +85,9 @@ import {
|
|
|
85
85
|
RU7_RM_PASTRY,
|
|
86
86
|
} from '../_shared/expected-values';
|
|
87
87
|
|
|
88
|
-
const meta: Meta
|
|
88
|
+
const meta: Meta = {
|
|
89
89
|
title: 'Patterns/Crossfiltered Datagrid (Client)',
|
|
90
|
-
component: Example,
|
|
90
|
+
component: Example as any,
|
|
91
91
|
};
|
|
92
92
|
export default meta;
|
|
93
93
|
type Story = StoryObj;
|
|
@@ -18,7 +18,7 @@ export default () => (
|
|
|
18
18
|
{/* Category card — two-way: counts update when other cards filter */}
|
|
19
19
|
<WithFilters
|
|
20
20
|
field="Category"
|
|
21
|
-
dimension={(d:
|
|
21
|
+
dimension={(d: any) => d.Category}
|
|
22
22
|
datagridCategoryDimFilter={{ field: 'Category', operator: 'isAnyOf' }}
|
|
23
23
|
syncMode="two-way"
|
|
24
24
|
>
|
|
@@ -51,7 +51,7 @@ export default () => (
|
|
|
51
51
|
{/* Allergens card — two-way */}
|
|
52
52
|
<WithFilters
|
|
53
53
|
field="Allergens"
|
|
54
|
-
dimension={(d:
|
|
54
|
+
dimension={(d: any) => d.Allergens}
|
|
55
55
|
isDimensionArray
|
|
56
56
|
datagridCategoryDimFilter={{ field: 'Allergens', operator: 'hasAnyOf' }}
|
|
57
57
|
syncMode="two-way"
|
|
@@ -84,9 +84,9 @@ import {
|
|
|
84
84
|
RU7_RM_PASTRY,
|
|
85
85
|
} from '../_shared/expected-values';
|
|
86
86
|
|
|
87
|
-
const meta: Meta
|
|
87
|
+
const meta: Meta = {
|
|
88
88
|
title: 'Patterns/Crossfiltered Datagrid (Server)',
|
|
89
|
-
component: Example,
|
|
89
|
+
component: Example as any,
|
|
90
90
|
parameters: {
|
|
91
91
|
msw: { handlers: bakeryHandlers },
|
|
92
92
|
},
|
|
@@ -4,7 +4,7 @@ import { Flexbox } from '@redsift/design-system';
|
|
|
4
4
|
import { DataCard, DataRow } from '@redsift/dashboard';
|
|
5
5
|
import { BarChart, PieChart, ArcDatum, BarDatum } from '@redsift/charts';
|
|
6
6
|
import { mdiShapeOutline, mdiToggleSwitch, mdiFoodOff } from '@redsift/icons';
|
|
7
|
-
import { GridFilterModel, GridSortModel } from '@mui/x-data-grid-
|
|
7
|
+
import { GridFilterModel, GridSortModel } from '@mui/x-data-grid-premium';
|
|
8
8
|
import { Row } from '../_shared/data';
|
|
9
9
|
import { columns, CATEGORY_OPTIONS, ALLERGEN_OPTIONS } from '../_shared/columns';
|
|
10
10
|
import { fetchBakeryData, FetchResult } from '../_shared/api-client';
|
|
@@ -208,7 +208,7 @@ export default () => {
|
|
|
208
208
|
data={itemsChartData}
|
|
209
209
|
sliceRole="option"
|
|
210
210
|
onSliceClick={(datum: ArcDatum) => {
|
|
211
|
-
const key = datum.data.key
|
|
211
|
+
const key = datum.data.key;
|
|
212
212
|
setFilterModel((prev) => {
|
|
213
213
|
const selected = getSelectedFromFilterModel(prev, 'Items');
|
|
214
214
|
const next = selected.includes(key) ? selected.filter((v) => v !== key) : [...selected, key];
|
|
@@ -217,7 +217,7 @@ export default () => {
|
|
|
217
217
|
setPage(0);
|
|
218
218
|
}}
|
|
219
219
|
isSliceSelected={(datum: ArcDatum) =>
|
|
220
|
-
itemsSelection.length === 0 || itemsSelection.includes(datum.data.key
|
|
220
|
+
itemsSelection.length === 0 || itemsSelection.includes(datum.data.key)
|
|
221
221
|
}
|
|
222
222
|
/>
|
|
223
223
|
|
|
@@ -239,7 +239,7 @@ export default () => {
|
|
|
239
239
|
data={tagsChartData}
|
|
240
240
|
barRole="option"
|
|
241
241
|
onBarClick={(datum: BarDatum) => {
|
|
242
|
-
const key = datum.data.key
|
|
242
|
+
const key = String(datum.data.key);
|
|
243
243
|
setFilterModel((prev) => {
|
|
244
244
|
const selected = getSelectedFromFilterModel(prev, 'Tags');
|
|
245
245
|
const next = selected.includes(key) ? selected.filter((v) => v !== key) : [...selected, key];
|
|
@@ -248,7 +248,7 @@ export default () => {
|
|
|
248
248
|
setPage(0);
|
|
249
249
|
}}
|
|
250
250
|
isBarSelected={(datum: BarDatum) =>
|
|
251
|
-
tagsSelection.length === 0 || tagsSelection.includes(datum.data.key
|
|
251
|
+
tagsSelection.length === 0 || tagsSelection.includes(String(datum.data.key))
|
|
252
252
|
}
|
|
253
253
|
/>
|
|
254
254
|
</Flexbox>
|
|
@@ -34,9 +34,9 @@ import {
|
|
|
34
34
|
ALLERGENS_HASANYOF_GLUTEN,
|
|
35
35
|
} from '../_shared/expected-values';
|
|
36
36
|
|
|
37
|
-
const meta: Meta
|
|
37
|
+
const meta: Meta = {
|
|
38
38
|
title: 'Patterns/Drilldowned Datagrid (Client)',
|
|
39
|
-
component: Example,
|
|
39
|
+
component: Example as any,
|
|
40
40
|
};
|
|
41
41
|
export default meta;
|
|
42
42
|
type Story = StoryObj;
|
|
@@ -3,7 +3,7 @@ import { DataGrid } from '@redsift/table';
|
|
|
3
3
|
import { Flexbox } from '@redsift/design-system';
|
|
4
4
|
import { DataCard, DataRow } from '@redsift/dashboard';
|
|
5
5
|
import { mdiShapeOutline, mdiToggleSwitch, mdiFoodOff } from '@redsift/icons';
|
|
6
|
-
import { GridFilterModel } from '@mui/x-data-grid-
|
|
6
|
+
import { GridFilterModel } from '@mui/x-data-grid-premium';
|
|
7
7
|
import { rows } from '../_shared/data';
|
|
8
8
|
import { columns, CATEGORY_OPTIONS, ALLERGEN_OPTIONS } from '../_shared/columns';
|
|
9
9
|
import { CustomToolbar } from '../_shared/helpers';
|
|
@@ -35,9 +35,9 @@ import {
|
|
|
35
35
|
ALLERGENS_HASANYOF_GLUTEN,
|
|
36
36
|
} from '../_shared/expected-values';
|
|
37
37
|
|
|
38
|
-
const meta: Meta
|
|
38
|
+
const meta: Meta = {
|
|
39
39
|
title: 'Patterns/Drilldowned Datagrid (Server)',
|
|
40
|
-
component: Example,
|
|
40
|
+
component: Example as any,
|
|
41
41
|
parameters: {
|
|
42
42
|
msw: { handlers: bakeryHandlers },
|
|
43
43
|
},
|
|
@@ -3,7 +3,7 @@ import { DataGrid } from '@redsift/table';
|
|
|
3
3
|
import { Flexbox } from '@redsift/design-system';
|
|
4
4
|
import { DataCard, DataRow } from '@redsift/dashboard';
|
|
5
5
|
import { mdiShapeOutline, mdiToggleSwitch, mdiFoodOff } from '@redsift/icons';
|
|
6
|
-
import { GridFilterModel, GridSortModel } from '@mui/x-data-grid-
|
|
6
|
+
import { GridFilterModel, GridSortModel } from '@mui/x-data-grid-premium';
|
|
7
7
|
import { Row } from '../_shared/data';
|
|
8
8
|
import { columns, CATEGORY_OPTIONS, ALLERGEN_OPTIONS } from '../_shared/columns';
|
|
9
9
|
import { fetchBakeryData, FetchResult } from '../_shared/api-client';
|
|
@@ -2,7 +2,7 @@ import React from 'react';
|
|
|
2
2
|
import type { Meta, StoryObj } from '@storybook/react';
|
|
3
3
|
import { within, userEvent } from '@storybook/testing-library';
|
|
4
4
|
import { expect } from '@storybook/jest';
|
|
5
|
-
import { GridFilterModel } from '@mui/x-data-grid-
|
|
5
|
+
import { GridFilterModel } from '@mui/x-data-grid-premium';
|
|
6
6
|
|
|
7
7
|
import Example from './example';
|
|
8
8
|
import WithLoadingExample from './with-loading';
|
|
@@ -35,9 +35,9 @@ import {
|
|
|
35
35
|
TAGS_HASANYOF_LOCAL_NEW,
|
|
36
36
|
} from '../_shared/expected-values';
|
|
37
37
|
|
|
38
|
-
const meta: Meta
|
|
38
|
+
const meta: Meta = {
|
|
39
39
|
title: 'Patterns/Single Datagrid (Client)',
|
|
40
|
-
component: Example,
|
|
40
|
+
component: Example as any,
|
|
41
41
|
};
|
|
42
42
|
export default meta;
|
|
43
43
|
type Story = StoryObj;
|
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
import React, { useState } from 'react';
|
|
2
|
-
import { DataGrid } from '@redsift/table';
|
|
2
|
+
import { DataGrid, EMPTY_ROW_SELECTION_MODEL, getSelectionCount } from '@redsift/table';
|
|
3
3
|
import { Flexbox } from '@redsift/design-system';
|
|
4
|
-
import { GridFilterModel, GridRowSelectionModel } from '@mui/x-data-grid-
|
|
4
|
+
import { GridFilterModel, GridRowSelectionModel } from '@mui/x-data-grid-premium';
|
|
5
5
|
import { rows } from '../_shared/data';
|
|
6
6
|
import { columns } from '../_shared/columns';
|
|
7
7
|
import { CustomToolbar, BulkActionBar } from '../_shared/helpers';
|
|
8
8
|
import { DEFAULT_FILTER_MODEL, DEFAULT_SORT_MODEL } from '../_shared/defaults';
|
|
9
9
|
|
|
10
10
|
export default ({ initialFilterModel }: { initialFilterModel?: GridFilterModel }) => {
|
|
11
|
-
const [selectionModel, setSelectionModel] = useState<GridRowSelectionModel>(
|
|
11
|
+
const [selectionModel, setSelectionModel] = useState<GridRowSelectionModel>(EMPTY_ROW_SELECTION_MODEL);
|
|
12
12
|
|
|
13
13
|
return (
|
|
14
14
|
<div style={{ width: '100%' }}>
|
|
15
15
|
<Flexbox flexDirection="column" gap="0px">
|
|
16
16
|
<BulkActionBar
|
|
17
|
-
count={selectionModel
|
|
17
|
+
count={getSelectionCount(selectionModel)}
|
|
18
18
|
onLog={() => console.log('Selected:', selectionModel)}
|
|
19
19
|
onDelete={() => console.log('Delete:', selectionModel)}
|
|
20
20
|
/>
|
|
@@ -2,7 +2,7 @@ import React from 'react';
|
|
|
2
2
|
import type { Meta, StoryObj } from '@storybook/react';
|
|
3
3
|
import { within } from '@storybook/testing-library';
|
|
4
4
|
import { expect } from '@storybook/jest';
|
|
5
|
-
import { GridFilterModel } from '@mui/x-data-grid-
|
|
5
|
+
import { GridFilterModel } from '@mui/x-data-grid-premium';
|
|
6
6
|
|
|
7
7
|
import Example from './example';
|
|
8
8
|
import WithLoadingExample from './with-loading';
|
|
@@ -27,9 +27,9 @@ import {
|
|
|
27
27
|
TAGS_HASANYOF_LOCAL_NEW,
|
|
28
28
|
} from '../_shared/expected-values';
|
|
29
29
|
|
|
30
|
-
const meta: Meta
|
|
30
|
+
const meta: Meta = {
|
|
31
31
|
title: 'Patterns/Single Datagrid (Server)',
|
|
32
|
-
component: Example,
|
|
32
|
+
component: Example as any,
|
|
33
33
|
parameters: {
|
|
34
34
|
msw: { handlers: bakeryHandlers },
|
|
35
35
|
},
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import React, { useCallback, useEffect, useRef, useState } from 'react';
|
|
2
|
-
import { DataGrid } from '@redsift/table';
|
|
2
|
+
import { DataGrid, EMPTY_ROW_SELECTION_MODEL, getSelectionCount } from '@redsift/table';
|
|
3
3
|
import { Flexbox } from '@redsift/design-system';
|
|
4
|
-
import { GridFilterModel, GridRowSelectionModel, GridSortModel } from '@mui/x-data-grid-
|
|
4
|
+
import { GridFilterModel, GridRowSelectionModel, GridSortModel } from '@mui/x-data-grid-premium';
|
|
5
5
|
import { Row } from '../_shared/data';
|
|
6
6
|
import { columns } from '../_shared/columns';
|
|
7
7
|
import { fetchBakeryData } from '../_shared/api-client';
|
|
@@ -16,7 +16,7 @@ export default ({ initialFilterModel }: { initialFilterModel?: GridFilterModel }
|
|
|
16
16
|
const [pageSize, setPageSize] = useState(10);
|
|
17
17
|
const [sortModel, setSortModel] = useState<GridSortModel>(DEFAULT_SORT_MODEL);
|
|
18
18
|
const [filterModel, setFilterModel] = useState<GridFilterModel>(initialFilterModel ?? DEFAULT_FILTER_MODEL);
|
|
19
|
-
const [selectionModel, setSelectionModel] = useState<GridRowSelectionModel>(
|
|
19
|
+
const [selectionModel, setSelectionModel] = useState<GridRowSelectionModel>(EMPTY_ROW_SELECTION_MODEL);
|
|
20
20
|
|
|
21
21
|
const quickFilterText = (filterModel as { quickFilterValues?: string[] }).quickFilterValues?.join(' ') || '';
|
|
22
22
|
const debounceRef = useRef<ReturnType<typeof setTimeout>>();
|
|
@@ -54,7 +54,7 @@ export default ({ initialFilterModel }: { initialFilterModel?: GridFilterModel }
|
|
|
54
54
|
<div style={{ width: '100%' }}>
|
|
55
55
|
<Flexbox flexDirection="column" gap="0px">
|
|
56
56
|
<BulkActionBar
|
|
57
|
-
count={selectionModel
|
|
57
|
+
count={getSelectionCount(selectionModel)}
|
|
58
58
|
onLog={() => console.log('Selected:', selectionModel)}
|
|
59
59
|
onDelete={() => console.log('Delete:', selectionModel)}
|
|
60
60
|
/>
|
|
@@ -24,9 +24,9 @@ import {
|
|
|
24
24
|
} from '../_shared/story-helpers';
|
|
25
25
|
import { AGG_CATEGORY, AGG_ALLERGENS } from '../_shared/expected-values';
|
|
26
26
|
|
|
27
|
-
const meta: Meta
|
|
27
|
+
const meta: Meta = {
|
|
28
28
|
title: 'Patterns/Summary Dashboard',
|
|
29
|
-
component: Example,
|
|
29
|
+
component: Example as any,
|
|
30
30
|
};
|
|
31
31
|
export default meta;
|
|
32
32
|
type Story = StoryObj;
|
|
@@ -16,9 +16,9 @@ import {
|
|
|
16
16
|
} from '../_shared/story-helpers';
|
|
17
17
|
import { TOTAL, CATEGORY_BAKERY, CATEGORY_BEVERAGE, CATEGORY_PASTRY, CATEGORY_OTHER } from '../_shared/expected-values';
|
|
18
18
|
|
|
19
|
-
const meta: Meta
|
|
19
|
+
const meta: Meta = {
|
|
20
20
|
title: 'Patterns/Tabbed Datagrid (Client)',
|
|
21
|
-
component: Example,
|
|
21
|
+
component: Example as any,
|
|
22
22
|
};
|
|
23
23
|
export default meta;
|
|
24
24
|
type Story = StoryObj;
|
|
@@ -18,9 +18,9 @@ import {
|
|
|
18
18
|
} from '../_shared/story-helpers';
|
|
19
19
|
import { TOTAL, CATEGORY_BAKERY, CATEGORY_BEVERAGE, CATEGORY_PASTRY, CATEGORY_OTHER } from '../_shared/expected-values';
|
|
20
20
|
|
|
21
|
-
const meta: Meta
|
|
21
|
+
const meta: Meta = {
|
|
22
22
|
title: 'Patterns/Tabbed Datagrid (Server)',
|
|
23
|
-
component: Example,
|
|
23
|
+
component: Example as any,
|
|
24
24
|
parameters: {
|
|
25
25
|
msw: { handlers: bakeryHandlers },
|
|
26
26
|
},
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import React, { useCallback, useEffect, useRef, useState } from 'react';
|
|
2
2
|
import { DataGrid } from '@redsift/table';
|
|
3
3
|
import { Flexbox, Pill, Number, Text, Tabs, Tab } from '@redsift/design-system';
|
|
4
|
-
import { GridFilterModel, GridSortModel } from '@mui/x-data-grid-
|
|
4
|
+
import { GridFilterModel, GridSortModel } from '@mui/x-data-grid-premium';
|
|
5
5
|
import { Row } from '../_shared/data';
|
|
6
6
|
import { columns, CATEGORY_OPTIONS } from '../_shared/columns';
|
|
7
7
|
import { fetchBakeryData } from '../_shared/api-client';
|
|
@@ -14,8 +14,8 @@
|
|
|
14
14
|
},
|
|
15
15
|
{
|
|
16
16
|
"name": "dataGridApiRef",
|
|
17
|
-
"description": "Datagrid API Ref.",
|
|
18
|
-
"type": "MutableRefObject<
|
|
17
|
+
"description": "Datagrid API Ref. MUI v8: can be null initially.",
|
|
18
|
+
"type": "MutableRefObject<GridApiPremium | null>",
|
|
19
19
|
"required": false,
|
|
20
20
|
"defaultValue": null,
|
|
21
21
|
"category": "props"
|
|
@@ -71,22 +71,6 @@
|
|
|
71
71
|
"defaultValue": null,
|
|
72
72
|
"category": "props"
|
|
73
73
|
},
|
|
74
|
-
{
|
|
75
|
-
"name": "className",
|
|
76
|
-
"description": "",
|
|
77
|
-
"type": "string",
|
|
78
|
-
"required": false,
|
|
79
|
-
"defaultValue": null,
|
|
80
|
-
"category": "props"
|
|
81
|
-
},
|
|
82
|
-
{
|
|
83
|
-
"name": "style",
|
|
84
|
-
"description": "",
|
|
85
|
-
"type": "CSSProperties",
|
|
86
|
-
"required": false,
|
|
87
|
-
"defaultValue": null,
|
|
88
|
-
"category": "props"
|
|
89
|
-
},
|
|
90
74
|
{
|
|
91
75
|
"name": "getTreeDataPath",
|
|
92
76
|
"description": "Determines the path of a row in the tree data.\nFor instance, a row with the path [\"A\", \"B\"] is the child of the row with the path [\"A\"].\nNote that all paths must contain at least one element.\n@template R\n@param row The row from which we want the path.\n@returns The path to the row.",
|
|
@@ -96,20 +80,9 @@
|
|
|
96
80
|
"category": "props"
|
|
97
81
|
},
|
|
98
82
|
{
|
|
99
|
-
"name": "
|
|
100
|
-
"description": "",
|
|
101
|
-
"type": [
|
|
102
|
-
"null",
|
|
103
|
-
"GridDataSourceCache"
|
|
104
|
-
],
|
|
105
|
-
"required": false,
|
|
106
|
-
"defaultValue": null,
|
|
107
|
-
"category": "props"
|
|
108
|
-
},
|
|
109
|
-
{
|
|
110
|
-
"name": "unstable_onDataSourceError",
|
|
111
|
-
"description": "",
|
|
112
|
-
"type": "(error: Error, params: GridGetRowsParams) => void",
|
|
83
|
+
"name": "setTreeDataPath",
|
|
84
|
+
"description": "Updates the tree path in a row model.\nUsed when reordering rows across different parents in tree data.\n@template R\n@param path The new path for the row.\n@param row The row model to update.\n@returns The updated row model with the new path.",
|
|
85
|
+
"type": "(path: string[], row: any) => any",
|
|
113
86
|
"required": false,
|
|
114
87
|
"defaultValue": null,
|
|
115
88
|
"category": "props"
|
|
@@ -95,22 +95,6 @@
|
|
|
95
95
|
"defaultValue": null,
|
|
96
96
|
"category": "props"
|
|
97
97
|
},
|
|
98
|
-
{
|
|
99
|
-
"name": "className",
|
|
100
|
-
"description": "",
|
|
101
|
-
"type": "string",
|
|
102
|
-
"required": false,
|
|
103
|
-
"defaultValue": null,
|
|
104
|
-
"category": "props"
|
|
105
|
-
},
|
|
106
|
-
{
|
|
107
|
-
"name": "style",
|
|
108
|
-
"description": "",
|
|
109
|
-
"type": "CSSProperties",
|
|
110
|
-
"required": false,
|
|
111
|
-
"defaultValue": null,
|
|
112
|
-
"category": "props"
|
|
113
|
-
},
|
|
114
98
|
{
|
|
115
99
|
"name": "getTreeDataPath",
|
|
116
100
|
"description": "Determines the path of a row in the tree data.\nFor instance, a row with the path [\"A\", \"B\"] is the child of the row with the path [\"A\"].\nNote that all paths must contain at least one element.\n@template R\n@param row The row from which we want the path.\n@returns The path to the row.",
|
|
@@ -120,20 +104,9 @@
|
|
|
120
104
|
"category": "props"
|
|
121
105
|
},
|
|
122
106
|
{
|
|
123
|
-
"name": "
|
|
124
|
-
"description": "",
|
|
125
|
-
"type": [
|
|
126
|
-
"null",
|
|
127
|
-
"GridDataSourceCache"
|
|
128
|
-
],
|
|
129
|
-
"required": false,
|
|
130
|
-
"defaultValue": null,
|
|
131
|
-
"category": "props"
|
|
132
|
-
},
|
|
133
|
-
{
|
|
134
|
-
"name": "unstable_onDataSourceError",
|
|
135
|
-
"description": "",
|
|
136
|
-
"type": "(error: Error, params: GridGetRowsParams) => void",
|
|
107
|
+
"name": "setTreeDataPath",
|
|
108
|
+
"description": "Updates the tree path in a row model.\nUsed when reordering rows across different parents in tree data.\n@template R\n@param path The new path for the row.\n@param row The row model to update.\n@returns The updated row model with the new path.",
|
|
109
|
+
"type": "(path: string[], row: any) => any",
|
|
137
110
|
"required": false,
|
|
138
111
|
"defaultValue": null,
|
|
139
112
|
"category": "props"
|
|
@@ -1011,7 +1011,7 @@
|
|
|
1011
1011
|
"name": "DataGrid",
|
|
1012
1012
|
"package": "@redsift/table",
|
|
1013
1013
|
"description": "DataGrid displays tabular data with sorting, filtering, pagination, and row selection.",
|
|
1014
|
-
"propsCount":
|
|
1014
|
+
"propsCount": 9,
|
|
1015
1015
|
"hasExamples": false
|
|
1016
1016
|
},
|
|
1017
1017
|
{
|
|
@@ -1039,7 +1039,7 @@
|
|
|
1039
1039
|
"name": "StatefulDataGrid",
|
|
1040
1040
|
"package": "@redsift/table",
|
|
1041
1041
|
"description": "StatefulDataGrid extends DataGrid with automatic state persistence to localStorage.",
|
|
1042
|
-
"propsCount":
|
|
1042
|
+
"propsCount": 12,
|
|
1043
1043
|
"hasExamples": false
|
|
1044
1044
|
},
|
|
1045
1045
|
{
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
3
|
"name": "Red Sift Design System",
|
|
4
|
-
"version": "12.3.0
|
|
5
|
-
"generated": "2026-04-
|
|
4
|
+
"version": "12.3.0",
|
|
5
|
+
"generated": "2026-04-01T15:04:59.444Z",
|
|
6
6
|
"repository": "https://github.com/redsift/design-system",
|
|
7
7
|
"documentation": "https://design-system.redsift.io",
|
|
8
8
|
"packages": [
|
|
@@ -55184,22 +55184,6 @@
|
|
|
55184
55184
|
"defaultValue": null,
|
|
55185
55185
|
"category": "props"
|
|
55186
55186
|
},
|
|
55187
|
-
{
|
|
55188
|
-
"name": "className",
|
|
55189
|
-
"description": "",
|
|
55190
|
-
"type": "string",
|
|
55191
|
-
"required": false,
|
|
55192
|
-
"defaultValue": null,
|
|
55193
|
-
"category": "props"
|
|
55194
|
-
},
|
|
55195
|
-
{
|
|
55196
|
-
"name": "style",
|
|
55197
|
-
"description": "",
|
|
55198
|
-
"type": "CSSProperties",
|
|
55199
|
-
"required": false,
|
|
55200
|
-
"defaultValue": null,
|
|
55201
|
-
"category": "props"
|
|
55202
|
-
},
|
|
55203
55187
|
{
|
|
55204
55188
|
"name": "getTreeDataPath",
|
|
55205
55189
|
"description": "Determines the path of a row in the tree data.\nFor instance, a row with the path [\"A\", \"B\"] is the child of the row with the path [\"A\"].\nNote that all paths must contain at least one element.\n@template R\n@param row The row from which we want the path.\n@returns The path to the row.",
|
|
@@ -55209,20 +55193,9 @@
|
|
|
55209
55193
|
"category": "props"
|
|
55210
55194
|
},
|
|
55211
55195
|
{
|
|
55212
|
-
"name": "
|
|
55213
|
-
"description": "",
|
|
55214
|
-
"type": [
|
|
55215
|
-
"null",
|
|
55216
|
-
"GridDataSourceCache"
|
|
55217
|
-
],
|
|
55218
|
-
"required": false,
|
|
55219
|
-
"defaultValue": null,
|
|
55220
|
-
"category": "props"
|
|
55221
|
-
},
|
|
55222
|
-
{
|
|
55223
|
-
"name": "unstable_onDataSourceError",
|
|
55224
|
-
"description": "",
|
|
55225
|
-
"type": "(error: Error, params: GridGetRowsParams) => void",
|
|
55196
|
+
"name": "setTreeDataPath",
|
|
55197
|
+
"description": "Updates the tree path in a row model.\nUsed when reordering rows across different parents in tree data.\n@template R\n@param path The new path for the row.\n@param row The row model to update.\n@returns The updated row model with the new path.",
|
|
55198
|
+
"type": "(path: string[], row: any) => any",
|
|
55226
55199
|
"required": false,
|
|
55227
55200
|
"defaultValue": null,
|
|
55228
55201
|
"category": "props"
|
|
@@ -55403,22 +55376,6 @@
|
|
|
55403
55376
|
"defaultValue": null,
|
|
55404
55377
|
"category": "props"
|
|
55405
55378
|
},
|
|
55406
|
-
{
|
|
55407
|
-
"name": "className",
|
|
55408
|
-
"description": "",
|
|
55409
|
-
"type": "string",
|
|
55410
|
-
"required": false,
|
|
55411
|
-
"defaultValue": null,
|
|
55412
|
-
"category": "props"
|
|
55413
|
-
},
|
|
55414
|
-
{
|
|
55415
|
-
"name": "style",
|
|
55416
|
-
"description": "",
|
|
55417
|
-
"type": "CSSProperties",
|
|
55418
|
-
"required": false,
|
|
55419
|
-
"defaultValue": null,
|
|
55420
|
-
"category": "props"
|
|
55421
|
-
},
|
|
55422
55379
|
{
|
|
55423
55380
|
"name": "getTreeDataPath",
|
|
55424
55381
|
"description": "Determines the path of a row in the tree data.\nFor instance, a row with the path [\"A\", \"B\"] is the child of the row with the path [\"A\"].\nNote that all paths must contain at least one element.\n@template R\n@param row The row from which we want the path.\n@returns The path to the row.",
|
|
@@ -55428,20 +55385,9 @@
|
|
|
55428
55385
|
"category": "props"
|
|
55429
55386
|
},
|
|
55430
55387
|
{
|
|
55431
|
-
"name": "
|
|
55432
|
-
"description": "",
|
|
55433
|
-
"type": [
|
|
55434
|
-
"null",
|
|
55435
|
-
"GridDataSourceCache"
|
|
55436
|
-
],
|
|
55437
|
-
"required": false,
|
|
55438
|
-
"defaultValue": null,
|
|
55439
|
-
"category": "props"
|
|
55440
|
-
},
|
|
55441
|
-
{
|
|
55442
|
-
"name": "unstable_onDataSourceError",
|
|
55443
|
-
"description": "",
|
|
55444
|
-
"type": "(error: Error, params: GridGetRowsParams) => void",
|
|
55388
|
+
"name": "setTreeDataPath",
|
|
55389
|
+
"description": "Updates the tree path in a row model.\nUsed when reordering rows across different parents in tree data.\n@template R\n@param path The new path for the row.\n@param row The row model to update.\n@returns The updated row model with the new path.",
|
|
55390
|
+
"type": "(path: string[], row: any) => any",
|
|
55445
55391
|
"required": false,
|
|
55446
55392
|
"defaultValue": null,
|
|
55447
55393
|
"category": "props"
|
|
@@ -55811,8 +55757,8 @@
|
|
|
55811
55757
|
},
|
|
55812
55758
|
{
|
|
55813
55759
|
"name": "dataGridApiRef",
|
|
55814
|
-
"description": "Datagrid API Ref.",
|
|
55815
|
-
"type": "MutableRefObject<
|
|
55760
|
+
"description": "Datagrid API Ref. MUI v8: can be null initially.",
|
|
55761
|
+
"type": "MutableRefObject<GridApiPremium | null>",
|
|
55816
55762
|
"required": false,
|
|
55817
55763
|
"defaultValue": null,
|
|
55818
55764
|
"category": "props"
|
package/data/docs/llms-full.txt
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
This file contains comprehensive documentation for all components in the Red Sift Design System.
|
|
4
4
|
It is optimized for LLM consumption and includes props, types, defaults, and usage examples.
|
|
5
5
|
|
|
6
|
-
Generated: 2026-04-
|
|
6
|
+
Generated: 2026-04-01T15:04:59.437Z
|
|
7
7
|
Total Components: 228
|
|
8
8
|
|
|
9
9
|
---
|
|
@@ -6036,11 +6036,8 @@ For `boolean` columns, use `type: 'boolean'` directly (no createColumn wrapper n
|
|
|
6036
6036
|
| paginationPlacement | "top" \| "bottom" \| "both" \| "none" | No | 'both' | Indicates how to display pagination. |
|
|
6037
6037
|
| paginationProps | Omit<TablePaginationProps, "paginationMode" \| "component" \| "count" \| "onPageChange" \| "onRowsPerPageChange" \| "page" \| "rowsPerPage" \| "rowsPerPageOptions"> | No | - | Props to forward to the pagination component. |
|
|
6038
6038
|
| theme | "light" \| "dark" | No | - | Theme. |
|
|
6039
|
-
| className | string | No | - | |
|
|
6040
|
-
| style | CSSProperties | No | - | |
|
|
6041
6039
|
| getTreeDataPath | (row: any) => readonly string[] | No | - | Determines the path of a row in the tree data. For instance, a row with the path ["A", "B"] is the child of the row with the path ["A"]. Note that all paths must contain at least one element. @template R @param row The row from which we want the path. @returns The path to the row. |
|
|
6042
|
-
|
|
|
6043
|
-
| unstable_onDataSourceError | (error: Error, params: GridGetRowsParams) => void | No | - | |
|
|
6040
|
+
| setTreeDataPath | (path: string[], row: any) => any | No | - | Updates the tree path in a row model. Used when reordering rows across different parents in tree data. @template R @param path The new path for the row. @param row The row model to update. @returns The updated row model with the new path. |
|
|
6044
6041
|
|
|
6045
6042
|
---
|
|
6046
6043
|
|
|
@@ -6097,11 +6094,8 @@ Use when users need persistent table preferences. Requires unique `localStorageK
|
|
|
6097
6094
|
| paginationPlacement | "top" \| "bottom" \| "both" \| "none" | No | 'both' | Indicates how to display pagination. |
|
|
6098
6095
|
| paginationProps | Omit<TablePaginationProps, "paginationMode" \| "component" \| "count" \| "onPageChange" \| "onRowsPerPageChange" \| "page" \| "rowsPerPage" \| "rowsPerPageOptions"> | No | - | Props to forward to the pagination component. |
|
|
6099
6096
|
| theme | "light" \| "dark" | No | - | Theme. |
|
|
6100
|
-
| className | string | No | - | |
|
|
6101
|
-
| style | CSSProperties | No | - | |
|
|
6102
6097
|
| getTreeDataPath | (row: any) => readonly string[] | No | - | Determines the path of a row in the tree data. For instance, a row with the path ["A", "B"] is the child of the row with the path ["A"]. Note that all paths must contain at least one element. @template R @param row The row from which we want the path. @returns The path to the row. |
|
|
6103
|
-
|
|
|
6104
|
-
| unstable_onDataSourceError | (error: Error, params: GridGetRowsParams) => void | No | - | |
|
|
6098
|
+
| setTreeDataPath | (path: string[], row: any) => any | No | - | Updates the tree path in a row model. Used when reordering rows across different parents in tree data. @template R @param path The new path for the row. @param row The row model to update. @returns The updated row model with the new path. |
|
|
6105
6099
|
|
|
6106
6100
|
---
|
|
6107
6101
|
|
|
@@ -6211,7 +6205,7 @@ When one chart is filtered, all connected charts update automatically.
|
|
|
6211
6205
|
| Prop | Type | Required | Default | Description |
|
|
6212
6206
|
|------|------|----------|---------|-------------|
|
|
6213
6207
|
| data | JSONArray | Yes | - | Dataset that will be share across every components within the dashboard. |
|
|
6214
|
-
| dataGridApiRef | MutableRefObject<
|
|
6208
|
+
| dataGridApiRef | MutableRefObject<GridApiPremium \| null> | No | - | Datagrid API Ref. MUI v8: can be null initially. |
|
|
6215
6209
|
|
|
6216
6210
|
---
|
|
6217
6211
|
|
|
@@ -7885,7 +7879,7 @@ Each pattern describes a common UI scenario, the components involved, how they a
|
|
|
7885
7879
|
## Datagrid Page
|
|
7886
7880
|
**Description:** Full-page MUI DataGrid with built-in Toolbar (columns, filters, density, export, quick search). Uses GridColDef[] with createColumn() for typed filter operators (string, number, date, singleSelect, multiSelect, tags), renderCell with TextCell and Pill, pagination, and checkboxSelection. All filtering, sorting, and pagination happen client-side — all rows are loaded into the DataGrid at once. Optionally includes bulk selection actions (rowSelectionModel + onRowSelectionModelChange). For server-side data handling, see the Server Datagrid Page pattern. Matches the table pattern used across OnDMARC, Certificates, and Brand Trust.
|
|
7887
7881
|
**Components:** DataGrid, TextCell, StatefulDataGrid, Pill, Button, Flexbox, Text, Badge, Icon, IconButton, IconButtonLink
|
|
7888
|
-
**Packages:** @redsift/table, @redsift/design-system, @mui/x-data-grid-
|
|
7882
|
+
**Packages:** @redsift/table, @redsift/design-system, @mui/x-data-grid-premium
|
|
7889
7883
|
**Layout:** DataGrid with autoHeight, pagination, pageSize, built-in Toolbar via componentsProps.toolbar.showQuickFilter. Optional bulk actions bar when selectionModel.length > 0.
|
|
7890
7884
|
**Tags:** table, datagrid, list, pagination, filter, toolbar, bulk-actions, GridColDef, filterModel, checkboxSelection, client-side
|
|
7891
7885
|
|
|
@@ -7973,7 +7967,7 @@ type Row = {
|
|
|
7973
7967
|
## Server Datagrid Page
|
|
7974
7968
|
**Description:** Full-page MUI DataGrid where filtering, sorting, and pagination are all handled server-side. Uses paginationMode='server', sortingMode='server', filterMode='server' with controlled rowCount and loading props. The same column types and toolbar as the client-side Datagrid Page pattern, but only the current page of data is fetched per request. Filter changes are debounced to avoid excessive requests. Ideal for datasets too large to load entirely in the browser.
|
|
7975
7969
|
**Components:** DataGrid, TextCell, Pill, Button, Flexbox, Text, Badge, Icon, IconButton, IconButtonLink
|
|
7976
|
-
**Packages:** @redsift/table, @redsift/design-system, @mui/x-data-grid-
|
|
7970
|
+
**Packages:** @redsift/table, @redsift/design-system, @mui/x-data-grid-premium
|
|
7977
7971
|
**Layout:** DataGrid with autoHeight, paginationMode='server', sortingMode='server', filterMode='server', rowCount, loading, built-in Toolbar. Optional bulk actions bar when selectionModel.length > 0.
|
|
7978
7972
|
**Tags:** table, datagrid, server-side, pagination, paginationMode, filterMode, sortingMode, loading, rowCount, filter, toolbar, bulk-actions, GridColDef, filterModel, sortModel, debounce
|
|
7979
7973
|
|
|
@@ -8089,7 +8083,7 @@ type FetchResult = {
|
|
|
8089
8083
|
## Drilldown Datagrid Page
|
|
8090
8084
|
**Description:** Extends the Datagrid Page with summary DataCards placed above the grid. Each DataCard contains DataRows showing aggregate counts for a field (status, category, active). Clicking a DataRow adds an isAnyOf filter to the DataGrid — a one-click shortcut. This is a one-way interaction: DataCard counts always reflect the full (unfiltered) dataset. When the user sets an is or isNot filter via the filter panel, the DataCard selection clears and clicking a DataRow overwrites with isAnyOf.
|
|
8091
8085
|
**Components:** DataGrid, TextCell, DataCard, DataCard.Header, DataCard.Body, DataCard.Listbox, DataRow, Pill, Button, Flexbox, Text, Icon, IconButtonLink
|
|
8092
|
-
**Packages:** @redsift/table, @redsift/design-system, @redsift/dashboard, @mui/x-data-grid-
|
|
8086
|
+
**Packages:** @redsift/table, @redsift/design-system, @redsift/dashboard, @mui/x-data-grid-premium
|
|
8093
8087
|
**Layout:** Flexbox column: DataCard row (Flexbox gap=12px flexWrap=wrap with 1-N DataCards), then DataGrid with autoHeight, pagination, controlled filterModel + onFilterModelChange. Optional bulk actions bar when selectionModel.length > 0.
|
|
8094
8088
|
**Tags:** table, datagrid, datacard, drilldown, drilldown-item, filter, isAnyOf, summary-cards, kpi, one-way, filterModel, client-side
|
|
8095
8089
|
|
|
@@ -8184,7 +8178,7 @@ type AggregateCounts = {
|
|
|
8184
8178
|
## Cross-filtered Datagrid Page
|
|
8185
8179
|
**Description:** Extends the Drilldown Datagrid Page with two-way synchronization between DataCards and the DataGrid filter panel. DataRow clicks add isAnyOf filters. Filter panel changes update DataCard selection state. DataCard counts recalculate against the cross-filtered dataset — each card computes counts by applying all filters except its own field, preventing a card from zeroing out its non-selected values. When the user sets is/isNot via the filter panel, the DataCard clears. Clicking a DataRow overwrites with isAnyOf.
|
|
8186
8180
|
**Components:** DataGrid, TextCell, DataCard, DataCard.Header, DataCard.Body, DataCard.Listbox, DataRow, Pill, Button, Flexbox, Text, Icon, IconButtonLink
|
|
8187
|
-
**Packages:** @redsift/table, @redsift/design-system, @redsift/dashboard, @mui/x-data-grid-
|
|
8181
|
+
**Packages:** @redsift/table, @redsift/design-system, @redsift/dashboard, @mui/x-data-grid-premium
|
|
8188
8182
|
**Layout:** Flexbox column: DataCard row (cross-filtered counts), then DataGrid with autoHeight, pagination, controlled filterModel + onFilterModelChange. Rows are pre-filtered client-side via applyFilters. Optional bulk actions bar.
|
|
8189
8183
|
**Tags:** table, datagrid, datacard, drilldown, drilldown-item, cross-filter, crossfilter, two-way, bidirectional, filter, isAnyOf, summary-cards, kpi, dashboard, filterModel, client-side
|
|
8190
8184
|
|
|
@@ -8315,7 +8309,7 @@ import { DataGrid } from '@redsift/table';
|
|
|
8315
8309
|
import { Flexbox } from '@redsift/design-system';
|
|
8316
8310
|
import { DataCard, DataRow } from '@redsift/dashboard';
|
|
8317
8311
|
import { mdiShapeOutline, mdiToggleSwitch, mdiFoodOff } from '@redsift/icons';
|
|
8318
|
-
import { GridFilterModel, GridSortModel } from '@mui/x-data-grid-
|
|
8312
|
+
import { GridFilterModel, GridSortModel } from '@mui/x-data-grid-premium';
|
|
8319
8313
|
import { Row } from '../_shared/data';
|
|
8320
8314
|
import { columns, CATEGORY_OPTIONS, ALLERGEN_OPTIONS } from '../_shared/columns';
|
|
8321
8315
|
import { fetchBakeryData, FetchResult } from '../_shared/api-client';
|
|
@@ -8592,7 +8586,7 @@ import { Flexbox } from '@redsift/design-system';
|
|
|
8592
8586
|
import { DataCard, DataRow } from '@redsift/dashboard';
|
|
8593
8587
|
import { BarChart, PieChart, ArcDatum, BarDatum } from '@redsift/charts';
|
|
8594
8588
|
import { mdiShapeOutline, mdiToggleSwitch, mdiFoodOff } from '@redsift/icons';
|
|
8595
|
-
import { GridFilterModel, GridSortModel } from '@mui/x-data-grid-
|
|
8589
|
+
import { GridFilterModel, GridSortModel } from '@mui/x-data-grid-premium';
|
|
8596
8590
|
import { Row } from '../_shared/data';
|
|
8597
8591
|
import { columns, CATEGORY_OPTIONS, ALLERGEN_OPTIONS } from '../_shared/columns';
|
|
8598
8592
|
import { fetchBakeryData, FetchResult } from '../_shared/api-client';
|
|
@@ -8796,7 +8790,7 @@ export default () => {
|
|
|
8796
8790
|
data={itemsChartData}
|
|
8797
8791
|
sliceRole="option"
|
|
8798
8792
|
onSliceClick={(datum: ArcDatum) => {
|
|
8799
|
-
const key = datum.data.key
|
|
8793
|
+
const key = datum.data.key;
|
|
8800
8794
|
setFilterModel((prev) => {
|
|
8801
8795
|
const selected = getSelectedFromFilterModel(prev, 'Items');
|
|
8802
8796
|
const next = selected.includes(key) ? selected.filter((v) => v !== key) : [...selected, key];
|
|
@@ -8805,7 +8799,7 @@ export default () => {
|
|
|
8805
8799
|
setPage(0);
|
|
8806
8800
|
}}
|
|
8807
8801
|
isSliceSelected={(datum: ArcDatum) =>
|
|
8808
|
-
itemsSelection.length === 0 || itemsSelection.includes(datum.data.key
|
|
8802
|
+
itemsSelection.length === 0 || itemsSelection.includes(datum.data.key)
|
|
8809
8803
|
}
|
|
8810
8804
|
/>
|
|
8811
8805
|
|
|
@@ -8827,7 +8821,7 @@ export default () => {
|
|
|
8827
8821
|
data={tagsChartData}
|
|
8828
8822
|
barRole="option"
|
|
8829
8823
|
onBarClick={(datum: BarDatum) => {
|
|
8830
|
-
const key = datum.data.key
|
|
8824
|
+
const key = String(datum.data.key);
|
|
8831
8825
|
setFilterModel((prev) => {
|
|
8832
8826
|
const selected = getSelectedFromFilterModel(prev, 'Tags');
|
|
8833
8827
|
const next = selected.includes(key) ? selected.filter((v) => v !== key) : [...selected, key];
|
|
@@ -8836,7 +8830,7 @@ export default () => {
|
|
|
8836
8830
|
setPage(0);
|
|
8837
8831
|
}}
|
|
8838
8832
|
isBarSelected={(datum: BarDatum) =>
|
|
8839
|
-
tagsSelection.length === 0 || tagsSelection.includes(datum.data.key
|
|
8833
|
+
tagsSelection.length === 0 || tagsSelection.includes(String(datum.data.key))
|
|
8840
8834
|
}
|
|
8841
8835
|
/>
|
|
8842
8836
|
</Flexbox>
|
|
@@ -9014,7 +9008,7 @@ export default () => {
|
|
|
9014
9008
|
import React, { useCallback, useEffect, useRef, useState } from 'react';
|
|
9015
9009
|
import { DataGrid } from '@redsift/table';
|
|
9016
9010
|
import { Flexbox, Pill, Number, Text, Tabs, Tab } from '@redsift/design-system';
|
|
9017
|
-
import { GridFilterModel, GridSortModel } from '@mui/x-data-grid-
|
|
9011
|
+
import { GridFilterModel, GridSortModel } from '@mui/x-data-grid-premium';
|
|
9018
9012
|
import { Row } from '../_shared/data';
|
|
9019
9013
|
import { columns, CATEGORY_OPTIONS } from '../_shared/columns';
|
|
9020
9014
|
import { fetchBakeryData } from '../_shared/api-client';
|
package/data/docs/llms.txt
CHANGED
|
@@ -181,10 +181,10 @@ The Red Sift Design System provides reusable UI components including forms, navi
|
|
|
181
181
|
### table
|
|
182
182
|
|
|
183
183
|
- **ControlledPagination** (0 props)
|
|
184
|
-
- **DataGrid** (
|
|
184
|
+
- **DataGrid** (9 props): DataGrid displays tabular data with sorting, filtering, pagination, and row selection.
|
|
185
185
|
- **GridToolbarFilterSemanticField** (7 props): The GridToolbarFilterSemanticField component.
|
|
186
186
|
- **ServerSideControlledPagination** (0 props)
|
|
187
|
-
- **StatefulDataGrid** (
|
|
187
|
+
- **StatefulDataGrid** (12 props): StatefulDataGrid extends DataGrid with automatic state persistence to localStorage.
|
|
188
188
|
- **TextCell** (6 props): The Cell component.
|
|
189
189
|
- **Toolbar** (15 props): ------
|
|
190
190
|
- **ToolbarWrapper** (0 props)
|
|
@@ -284,10 +284,10 @@ Proven component groupings for common UI scenarios, extracted from production ap
|
|
|
284
284
|
|
|
285
285
|
| Pattern | Components | Packages |
|
|
286
286
|
|---------|-----------|----------|
|
|
287
|
-
| Datagrid Page | DataGrid, TextCell, StatefulDataGrid, Pill, Button, Flexbox, Text, Badge, Icon, IconButton, IconButtonLink | @redsift/table, @redsift/design-system, @mui/x-data-grid-
|
|
288
|
-
| Server Datagrid Page | DataGrid, TextCell, Pill, Button, Flexbox, Text, Badge, Icon, IconButton, IconButtonLink | @redsift/table, @redsift/design-system, @mui/x-data-grid-
|
|
289
|
-
| Drilldown Datagrid Page | DataGrid, TextCell, DataCard, DataCard.Header, DataCard.Body, DataCard.Listbox, DataRow, Pill, Button, Flexbox, Text, Icon, IconButtonLink | @redsift/table, @redsift/design-system, @redsift/dashboard, @mui/x-data-grid-
|
|
290
|
-
| Cross-filtered Datagrid Page | DataGrid, TextCell, DataCard, DataCard.Header, DataCard.Body, DataCard.Listbox, DataRow, Pill, Button, Flexbox, Text, Icon, IconButtonLink | @redsift/table, @redsift/design-system, @redsift/dashboard, @mui/x-data-grid-
|
|
287
|
+
| Datagrid Page | DataGrid, TextCell, StatefulDataGrid, Pill, Button, Flexbox, Text, Badge, Icon, IconButton, IconButtonLink | @redsift/table, @redsift/design-system, @mui/x-data-grid-premium |
|
|
288
|
+
| Server Datagrid Page | DataGrid, TextCell, Pill, Button, Flexbox, Text, Badge, Icon, IconButton, IconButtonLink | @redsift/table, @redsift/design-system, @mui/x-data-grid-premium |
|
|
289
|
+
| Drilldown Datagrid Page | DataGrid, TextCell, DataCard, DataCard.Header, DataCard.Body, DataCard.Listbox, DataRow, Pill, Button, Flexbox, Text, Icon, IconButtonLink | @redsift/table, @redsift/design-system, @redsift/dashboard, @mui/x-data-grid-premium |
|
|
290
|
+
| Cross-filtered Datagrid Page | DataGrid, TextCell, DataCard, DataCard.Header, DataCard.Body, DataCard.Listbox, DataRow, Pill, Button, Flexbox, Text, Icon, IconButtonLink | @redsift/table, @redsift/design-system, @redsift/dashboard, @mui/x-data-grid-premium |
|
|
291
291
|
| Server Drilldown Datagrid Page | DataGrid, TextCell, DataCard, DataRow, Flexbox, Pill, Icon | @redsift/table, @redsift/dashboard, @redsift/design-system, @mui/x-data-grid-pro |
|
|
292
292
|
| Server Cross-filtered Datagrid Page | DataGrid, TextCell, DataCard, DataRow, Flexbox, Pill, Icon | @redsift/table, @redsift/dashboard, @redsift/design-system, @mui/x-data-grid-pro |
|
|
293
293
|
| Tabbed Datagrid Page | DataGrid, TextCell, Tabs, Tab, Flexbox, Pill, Number | @redsift/table, @redsift/design-system |
|
|
@@ -27,7 +27,7 @@ These patterns serve as implementation specs — they give LLMs and developers e
|
|
|
27
27
|
2. DataGrid — the table itself, configured with autoHeight, pagination, checkboxSelection, and GridColDef[] columns
|
|
28
28
|
3. Bulk Action Bar — Flexbox row shown when selectionModel.length > 0, with Pill (count) and action Buttons
|
|
29
29
|
|
|
30
|
-
**Key imports:** `DataGrid`, `TextCell`, `StatefulDataGrid` from `@redsift/table`; `GridColDef`, `GridFilterModel`, `GridRowSelectionModel` from `@mui/x-data-grid-
|
|
30
|
+
**Key imports:** `DataGrid`, `TextCell`, `StatefulDataGrid` from `@redsift/table`; `GridColDef`, `GridFilterModel`, `GridRowSelectionModel` from `@mui/x-data-grid-premium`; `Pill`, `Button`, `Flexbox` from `@redsift/design-system`
|
|
31
31
|
**Components:** DataGrid, TextCell, StatefulDataGrid (from @redsift/table), Flexbox, Button, Pill, Text, Badge, Icon, IconButton, IconButtonLink (from @redsift/design-system)
|
|
32
32
|
**Layout:** DataGrid with `autoHeight`, `pagination`, `pageSize`, built-in Toolbar (Columns | Filters | Density | Export | Search via `componentsProps.toolbar.showQuickFilter`). Columns use `GridColDef[]` with `createColumn()` for typed filter operators (e.g. `...createColumn('string')`, `...createColumn('number')`, `...createColumn('singleSelect')`), `renderCell` returning `TextCell`, `Pill`, `Badge`. Optional bulk actions bar above grid shown when `selectionModel.length > 0`.
|
|
33
33
|
|
|
@@ -98,7 +98,7 @@ type Row = {
|
|
|
98
98
|
2. DataGrid — the table configured with paginationMode='server', sortingMode='server', filterMode='server', loading, and rowCount
|
|
99
99
|
3. Bulk Action Bar — Flexbox row shown when selectionModel.length > 0, with Pill (count) and action Buttons
|
|
100
100
|
|
|
101
|
-
**Key imports:** `DataGrid`, `TextCell` from `@redsift/table`; `GridColDef`, `GridFilterModel`, `GridSortModel`, `GridSelectionModel` from `@mui/x-data-grid-
|
|
101
|
+
**Key imports:** `DataGrid`, `TextCell` from `@redsift/table`; `GridColDef`, `GridFilterModel`, `GridSortModel`, `GridSelectionModel` from `@mui/x-data-grid-premium`; `Pill`, `Button`, `Flexbox`, `Icon`, `IconButtonLink` from `@redsift/design-system`
|
|
102
102
|
**Components:** DataGrid, TextCell (from @redsift/table), Flexbox, Button, Pill, Text, Badge, Icon, IconButton, IconButtonLink (from @redsift/design-system)
|
|
103
103
|
**Layout:** DataGrid with `autoHeight`, `paginationMode="server"`, `sortingMode="server"`, `filterMode="server"`, `rowCount`, `loading`, built-in Toolbar (Columns | Filters | Density | Export | Search). Same column types as Datagrid Page.
|
|
104
104
|
|
|
@@ -206,7 +206,7 @@ type FetchResult = {
|
|
|
206
206
|
3. DataGrid — the table with controlled filterModel + onFilterModelChange
|
|
207
207
|
4. Bulk Action Bar — Flexbox row shown when selectionModel.length > 0, with Pill (count) and action Buttons
|
|
208
208
|
|
|
209
|
-
**Key imports:** `DataGrid`, `TextCell` from `@redsift/table`; `DataCard`, `DrilldownItem` from `@redsift/dashboard`; `GridColDef`, `GridFilterModel` from `@mui/x-data-grid-
|
|
209
|
+
**Key imports:** `DataGrid`, `TextCell` from `@redsift/table`; `DataCard`, `DrilldownItem` from `@redsift/dashboard`; `GridColDef`, `GridFilterModel` from `@mui/x-data-grid-premium`; `Pill`, `Button`, `Flexbox`, `Icon` from `@redsift/design-system`
|
|
210
210
|
**Components:** DataGrid, TextCell (from @redsift/table), DataCard, DataCard.Header, DataCard.Body, DataCard.Listbox, DrilldownItem (from @redsift/dashboard), Flexbox, Button, Pill, Text, Icon, IconButtonLink (from @redsift/design-system)
|
|
211
211
|
**Layout:** Flexbox column: DataCard row (Flexbox gap=12px flexWrap=wrap with 1-N DataCards), then DataGrid with autoHeight, pagination, controlled filterModel + onFilterModelChange. Optional bulk actions bar.
|
|
212
212
|
|
|
@@ -292,7 +292,7 @@ type AggregateCounts = {
|
|
|
292
292
|
3. DataGrid — the table with controlled filterModel + onFilterModelChange. Rows are pre-filtered client-side
|
|
293
293
|
4. Bulk Action Bar — Flexbox row shown when selectionModel.length > 0, with Pill (count) and action Buttons
|
|
294
294
|
|
|
295
|
-
**Key imports:** `DataGrid`, `TextCell` from `@redsift/table`; `DataCard`, `DrilldownItem` from `@redsift/dashboard`; `GridColDef`, `GridFilterModel` from `@mui/x-data-grid-
|
|
295
|
+
**Key imports:** `DataGrid`, `TextCell` from `@redsift/table`; `DataCard`, `DrilldownItem` from `@redsift/dashboard`; `GridColDef`, `GridFilterModel` from `@mui/x-data-grid-premium`; `Pill`, `Button`, `Flexbox`, `Icon` from `@redsift/design-system`
|
|
296
296
|
**Components:** DataGrid, TextCell (from @redsift/table), DataCard, DataCard.Header, DataCard.Body, DataCard.Listbox, DrilldownItem (from @redsift/dashboard), Flexbox, Button, Pill, Text, Icon, IconButtonLink (from @redsift/design-system)
|
|
297
297
|
**Layout:** Flexbox column: DataCard row (cross-filtered counts), then DataGrid with autoHeight, pagination, controlled filterModel + onFilterModelChange. Rows are pre-filtered client-side via applyFilters. Optional bulk actions bar.
|
|
298
298
|
|
package/data/docs/patterns.json
CHANGED
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
"IconButton",
|
|
17
17
|
"IconButtonLink"
|
|
18
18
|
],
|
|
19
|
-
"packages": ["@redsift/table", "@redsift/design-system", "@mui/x-data-grid-
|
|
19
|
+
"packages": ["@redsift/table", "@redsift/design-system", "@mui/x-data-grid-premium"],
|
|
20
20
|
"layout": "DataGrid with autoHeight, pagination, pageSize, built-in Toolbar via componentsProps.toolbar.showQuickFilter. Optional bulk actions bar when selectionModel.length > 0.",
|
|
21
21
|
"tags": [
|
|
22
22
|
"table",
|
|
@@ -167,7 +167,7 @@
|
|
|
167
167
|
"IconButton",
|
|
168
168
|
"IconButtonLink"
|
|
169
169
|
],
|
|
170
|
-
"packages": ["@redsift/table", "@redsift/design-system", "@mui/x-data-grid-
|
|
170
|
+
"packages": ["@redsift/table", "@redsift/design-system", "@mui/x-data-grid-premium"],
|
|
171
171
|
"layout": "DataGrid with autoHeight, paginationMode='server', sortingMode='server', filterMode='server', rowCount, loading, built-in Toolbar. Optional bulk actions bar when selectionModel.length > 0.",
|
|
172
172
|
"tags": [
|
|
173
173
|
"table",
|
|
@@ -374,7 +374,7 @@
|
|
|
374
374
|
"Icon",
|
|
375
375
|
"IconButtonLink"
|
|
376
376
|
],
|
|
377
|
-
"packages": ["@redsift/table", "@redsift/design-system", "@redsift/dashboard", "@mui/x-data-grid-
|
|
377
|
+
"packages": ["@redsift/table", "@redsift/design-system", "@redsift/dashboard", "@mui/x-data-grid-premium"],
|
|
378
378
|
"layout": "Flexbox column: DataCard row (Flexbox gap=12px flexWrap=wrap with 1-N DataCards), then DataGrid with autoHeight, pagination, controlled filterModel + onFilterModelChange. Optional bulk actions bar when selectionModel.length > 0.",
|
|
379
379
|
"tags": [
|
|
380
380
|
"table",
|
|
@@ -542,7 +542,7 @@
|
|
|
542
542
|
"Icon",
|
|
543
543
|
"IconButtonLink"
|
|
544
544
|
],
|
|
545
|
-
"packages": ["@redsift/table", "@redsift/design-system", "@redsift/dashboard", "@mui/x-data-grid-
|
|
545
|
+
"packages": ["@redsift/table", "@redsift/design-system", "@redsift/dashboard", "@mui/x-data-grid-premium"],
|
|
546
546
|
"layout": "Flexbox column: DataCard row (cross-filtered counts), then DataGrid with autoHeight, pagination, controlled filterModel + onFilterModelChange. Rows are pre-filtered client-side via applyFilters. Optional bulk actions bar.",
|
|
547
547
|
"tags": [
|
|
548
548
|
"table",
|
package/data/metadata.json
CHANGED
|
@@ -99,7 +99,7 @@ When **not** to use:
|
|
|
99
99
|
## State Management
|
|
100
100
|
|
|
101
101
|
<CodeBlock codeString={`import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
|
102
|
-
import { GridFilterModel, GridSortModel } from '@mui/x-data-grid-
|
|
102
|
+
import { GridFilterModel, GridSortModel } from '@mui/x-data-grid-premium';
|
|
103
103
|
|
|
104
104
|
// Server-driven state
|
|
105
105
|
const [rows, setRows] = useState<Row[]>([]);
|
|
@@ -114,7 +114,7 @@ When **not** to use:
|
|
|
114
114
|
## State Management
|
|
115
115
|
|
|
116
116
|
<CodeBlock codeString={`import { useCallback, useMemo, useState } from 'react';
|
|
117
|
-
import { GridFilterModel } from '@mui/x-data-grid-
|
|
117
|
+
import { GridFilterModel } from '@mui/x-data-grid-premium';
|
|
118
118
|
|
|
119
119
|
// Filter state — controlled, shared between DataCards and DataGrid
|
|
120
120
|
const [filterModel, setFilterModel] = useState<GridFilterModel>({ items: [] });
|
|
@@ -91,7 +91,7 @@ When **not** to use:
|
|
|
91
91
|
## State Management
|
|
92
92
|
|
|
93
93
|
<CodeBlock codeString={`import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
|
94
|
-
import { GridFilterModel, GridSortModel } from '@mui/x-data-grid-
|
|
94
|
+
import { GridFilterModel, GridSortModel } from '@mui/x-data-grid-premium';
|
|
95
95
|
|
|
96
96
|
// Server-driven state
|
|
97
97
|
const [rows, setRows] = useState<Row[]>([]);
|
|
@@ -33,7 +33,7 @@ When **not** to use:
|
|
|
33
33
|
|
|
34
34
|
1. **Toolbar** — `Flexbox` wrapping MUI's `GridToolbarContainer` with `GridToolbarFilterButton`, `GridToolbarColumnsButton`, `GridToolbarDensitySelector`, `GridToolbarExport`, and `GridToolbarQuickFilter`
|
|
35
35
|
2. **DataGrid** — the table itself from `@redsift/table`, configured with `autoHeight`, `pagination`, `checkboxSelection`, and `GridColDef[]` columns
|
|
36
|
-
3. **Bulk Action Bar** — a `Flexbox` row shown when
|
|
36
|
+
3. **Bulk Action Bar** — a `Flexbox` row shown when rows are selected, containing a `Pill` with the selection count and action `Button` components
|
|
37
37
|
|
|
38
38
|
## Features
|
|
39
39
|
|
|
@@ -60,7 +60,7 @@ When **not** to use:
|
|
|
60
60
|
required: true,
|
|
61
61
|
description: (
|
|
62
62
|
<>
|
|
63
|
-
Client-side pagination with configurable page size (<code>
|
|
63
|
+
Client-side pagination with configurable page size (<code>rowsPerPageOptions</code>)
|
|
64
64
|
</>
|
|
65
65
|
),
|
|
66
66
|
},
|
|
@@ -124,13 +124,13 @@ When **not** to use:
|
|
|
124
124
|
## State Management
|
|
125
125
|
|
|
126
126
|
<CodeBlock codeString={`import { useState } from 'react';
|
|
127
|
-
import { GridRowSelectionModel } from '@mui/x-data-grid-
|
|
127
|
+
import { GridRowSelectionModel } from '@mui/x-data-grid-premium';
|
|
128
128
|
|
|
129
129
|
// Selection state — tracks which rows are checked
|
|
130
130
|
const [selectionModel, setSelectionModel] = useState<GridRowSelectionModel>([]);
|
|
131
131
|
|
|
132
|
-
//
|
|
133
|
-
// (DataGrid manages
|
|
132
|
+
// Page size — controlled if you need to persist it
|
|
133
|
+
// (DataGrid manages page/pageSize internally for client-side mode)
|
|
134
134
|
`} />
|
|
135
135
|
|
|
136
136
|
## Data Contract
|
|
@@ -149,7 +149,7 @@ type Row = {
|
|
|
149
149
|
};
|
|
150
150
|
|
|
151
151
|
// Column definitions — use createColumn() for built-in filter operators
|
|
152
|
-
import { GridColDef } from '@mui/x-data-grid-
|
|
152
|
+
import { GridColDef } from '@mui/x-data-grid-premium';
|
|
153
153
|
import { createColumn } from '@redsift/table';
|
|
154
154
|
|
|
155
155
|
const columns: GridColDef[] = [
|
|
@@ -184,9 +184,9 @@ When data fetching fails, replace the DataGrid area with an error message and a
|
|
|
184
184
|
1. **Define your row type** — Create a TypeScript `type Row` per the Data Contract section. Every row must have a unique `id` field.
|
|
185
185
|
2. **Define column definitions** — Create a `GridColDef[]` array. Use `createColumn()` (e.g. `...createColumn('string')`, `...createColumn('number')`, `...createColumn('singleSelect')`, `...createColumn('multiSelect')`) for built-in filter operators. Add `renderCell` for rich content (pills, icons, links).
|
|
186
186
|
3. **Create the toolbar** — Build a `CustomToolbar` component using `GridToolbarContainer` with `GridToolbarFilterButton`, `GridToolbarColumnsButton`, `GridToolbarDensitySelector`, `GridToolbarExport`, and optionally `GridToolbarQuickFilter`.
|
|
187
|
-
4. **Set up state** — Add `useState<GridRowSelectionModel
|
|
188
|
-
5. **Render the DataGrid** — Pass `rows`, `columns`, `autoHeight`, `pagination`, `
|
|
189
|
-
6. **Add bulk action bar** — Conditionally render a `Flexbox` with a `Pill` (selection count) and action `Button` components when
|
|
187
|
+
4. **Set up state** — Add `useState<GridRowSelectionModel>` for checkbox selection (if needed).
|
|
188
|
+
5. **Render the DataGrid** — Pass `rows`, `columns`, `autoHeight`, `pagination`, `pageSize`, `rowsPerPageOptions`, `checkboxSelection`, `slots={{ toolbar: CustomToolbar }}`.
|
|
189
|
+
6. **Add bulk action bar** — Conditionally render a `Flexbox` with a `Pill` (selection count) and action `Button` components when rows are selected.
|
|
190
190
|
7. **Handle edge cases** — Add loading state (`loading` prop), empty state (custom `NoRowsOverlay`), and error state (conditional render with retry).
|
|
191
191
|
8. **Verify** — Test pagination breakpoints, filter operators, column visibility toggle, density switching, and export.
|
|
192
192
|
|
|
@@ -34,7 +34,7 @@ When **not** to use:
|
|
|
34
34
|
|
|
35
35
|
1. **Toolbar** — `Flexbox` wrapping MUI's `GridToolbarContainer` with `GridToolbarFilterButton`, `GridToolbarColumnsButton`, `GridToolbarDensitySelector`, `GridToolbarExport`, and `GridToolbarQuickFilter`
|
|
36
36
|
2. **DataGrid** — the table configured with `paginationMode="server"`, `sortingMode="server"`, `filterMode="server"`, `loading`, and `rowCount`
|
|
37
|
-
3. **Bulk Action Bar** — a `Flexbox` row shown when
|
|
37
|
+
3. **Bulk Action Bar** — a `Flexbox` row shown when rows are selected, containing a `Pill` with the selection count and action `Button` components
|
|
38
38
|
|
|
39
39
|
## Features
|
|
40
40
|
|
|
@@ -101,8 +101,8 @@ When **not** to use:
|
|
|
101
101
|
required: true,
|
|
102
102
|
description: (
|
|
103
103
|
<>
|
|
104
|
-
<code>GridColDef[]</code> with
|
|
105
|
-
<code>
|
|
104
|
+
<code>GridColDef[]</code> with <code>createColumn()</code>: <code>createColumn('string')</code>, <code>createColumn('number')</code>,{' '}
|
|
105
|
+
<code>createColumn('singleSelect')</code>, <code>createColumn('multiSelect')</code>
|
|
106
106
|
</>
|
|
107
107
|
),
|
|
108
108
|
},
|
|
@@ -159,7 +159,7 @@ When **not** to use:
|
|
|
159
159
|
## State Management
|
|
160
160
|
|
|
161
161
|
<CodeBlock codeString={`import { useCallback, useEffect, useRef, useState } from 'react';
|
|
162
|
-
import { GridFilterModel, GridRowSelectionModel, GridSortModel } from '@mui/x-data-grid-
|
|
162
|
+
import { GridFilterModel, GridRowSelectionModel, GridSortModel } from '@mui/x-data-grid-premium';
|
|
163
163
|
|
|
164
164
|
// Data state — rows returned from the server for the current page
|
|
165
165
|
const [rows, setRows] = useState<Row[]>([]);
|
|
@@ -263,13 +263,13 @@ The fetch function rejects with an error. The component shows an error banner ab
|
|
|
263
263
|
|
|
264
264
|
1. **Define your row type** — Create a TypeScript `type Row` per the Data Contract section. Every row must have a unique `id` field.
|
|
265
265
|
2. **Create your fetch function** — Implement an async function matching the `FetchParams → FetchResult` contract. This is where you call your API or ElasticSearch. If using React Query, wrap it in a `useQuery` hook with `[page, pageSize, sortModel, filterModel, quickFilterText]` as the query key.
|
|
266
|
-
3. **Define column definitions** — Create a `GridColDef[]` array. Use
|
|
266
|
+
3. **Define column definitions** — Create a `GridColDef[]` array. Use `createColumn()` (e.g. `...createColumn('string')`, `...createColumn('number')`, `...createColumn('singleSelect')`, `...createColumn('multiSelect')`) for built-in filter operators. Add `renderCell` for rich content.
|
|
267
267
|
4. **Create the toolbar** — Build a `CustomToolbar` component using `GridToolbarContainer` with filter, columns, density, export, and quick search controls.
|
|
268
268
|
5. **Set up state** — Add all hooks from the State Management section: `rows`, `totalRows`, `loading`, `page`, `pageSize`, `sortModel`, `filterModel`, `selectionModel`, `quickFilterText`, and the debounce ref.
|
|
269
269
|
6. **Wire the fetch effect** — Use `useEffect` to call your fetch function whenever `page`, `pageSize`, `sortModel`, `filterModel`, or `quickFilterText` changes.
|
|
270
|
-
7. **Configure the DataGrid** — Pass `paginationMode="server"`, `sortingMode="server"`, `filterMode="server"`, `loading`, `rowCount={totalRows}`, and all controlled state handlers (`
|
|
270
|
+
7. **Configure the DataGrid** — Pass `paginationMode="server"`, `sortingMode="server"`, `filterMode="server"`, `loading`, `rowCount={totalRows}`, and all controlled state handlers (`onPageChange`, `onPageSizeChange`, `onSortModelChange`, `onFilterModelChange`).
|
|
271
271
|
8. **Debounce filter changes** — Use a 300ms `setTimeout` in `onFilterModelChange` to avoid excessive requests during rapid typing. Reset to page 0 on filter change.
|
|
272
|
-
9. **Add bulk action bar** — Conditionally render when
|
|
272
|
+
9. **Add bulk action bar** — Conditionally render when rows are selected.
|
|
273
273
|
10. **Handle edge cases** — Add loading state (`loading` prop), empty state (custom `NoRowsOverlay`), and error state (conditional render with retry).
|
|
274
274
|
11. **Verify** — Test page navigation, sort toggling, filter operators, debounced quick search, loading overlay, empty results, and error recovery.
|
|
275
275
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@redsift/ds-mcp-server",
|
|
3
|
-
"version": "12.4.0
|
|
3
|
+
"version": "12.4.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"description": "MCP server for the Red Sift Design System — provides component lookup, prop documentation, and code generation tools for AI assistants.",
|
|
@@ -35,5 +35,5 @@
|
|
|
35
35
|
"publishConfig": {
|
|
36
36
|
"access": "restricted"
|
|
37
37
|
},
|
|
38
|
-
"gitHead": "
|
|
38
|
+
"gitHead": "01c485a1a597cdec0af3bb199675dcb7577a26e4"
|
|
39
39
|
}
|