@redsift/ds-mcp-server 12.5.2-muiv7 → 12.5.2
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/StateDebugPanel.tsx +2 -2
- 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 +106 -36
- package/data/demos/patterns/crossfiltered-datagrid-client-side/CrossfilteredDatagridClientSide.interaction.stories.tsx +4 -19
- package/data/demos/patterns/crossfiltered-datagrid-client-side/example.tsx +2 -2
- package/data/demos/patterns/crossfiltered-datagrid-server-side/CrossfilteredDatagridServerSide.interaction.stories.tsx +3 -3
- 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 +5 -19
- package/data/demos/patterns/single-datagrid-client-side/SingleDatagridClientSide.interaction.stories.tsx +3 -3
- package/data/demos/patterns/single-datagrid-client-side/example.tsx +5 -5
- package/data/demos/patterns/single-datagrid-server-side/SingleDatagridServerSide.interaction.stories.tsx +3 -3
- package/data/demos/patterns/single-datagrid-server-side/example.tsx +5 -6
- package/data/demos/patterns/stateful-single-datagrid-client-side/StatefulSingleDatagridClientSide.interaction.stories.tsx +130 -3
- package/data/demos/patterns/stateful-single-datagrid-client-side/example.tsx +6 -6
- package/data/demos/patterns/stateful-single-datagrid-server-side/StatefulSingleDatagridServerSide.interaction.stories.tsx +136 -6
- package/data/demos/patterns/stateful-single-datagrid-server-side/example.tsx +6 -9
- 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 -58
- package/data/docs/llms-full.txt +40 -46
- package/data/docs/llms.txt +6 -6
- package/data/docs/patterns-catalog.md +24 -25
- 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 +4 -4
- package/data/patterns/stateful-single-datagrid-client-side.mdx +36 -20
- package/data/patterns/stateful-single-datagrid-server-side.mdx +46 -18
- package/data/patterns/tabbed-datagrid-server-side.mdx +1 -1
- package/package.json +2 -2
|
@@ -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-10T18:15:31.369Z",
|
|
6
6
|
"repository": "https://github.com/redsift/design-system",
|
|
7
7
|
"documentation": "https://design-system.redsift.io",
|
|
8
8
|
"packages": [
|
|
@@ -51493,22 +51493,6 @@
|
|
|
51493
51493
|
"defaultValue": null,
|
|
51494
51494
|
"category": "props"
|
|
51495
51495
|
},
|
|
51496
|
-
{
|
|
51497
|
-
"name": "className",
|
|
51498
|
-
"description": "",
|
|
51499
|
-
"type": "string",
|
|
51500
|
-
"required": false,
|
|
51501
|
-
"defaultValue": null,
|
|
51502
|
-
"category": "props"
|
|
51503
|
-
},
|
|
51504
|
-
{
|
|
51505
|
-
"name": "style",
|
|
51506
|
-
"description": "",
|
|
51507
|
-
"type": "CSSProperties",
|
|
51508
|
-
"required": false,
|
|
51509
|
-
"defaultValue": null,
|
|
51510
|
-
"category": "props"
|
|
51511
|
-
},
|
|
51512
51496
|
{
|
|
51513
51497
|
"name": "getTreeDataPath",
|
|
51514
51498
|
"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.",
|
|
@@ -51518,17 +51502,9 @@
|
|
|
51518
51502
|
"category": "props"
|
|
51519
51503
|
},
|
|
51520
51504
|
{
|
|
51521
|
-
"name": "
|
|
51522
|
-
"description": "",
|
|
51523
|
-
"type": [
|
|
51524
|
-
"required": false,
|
|
51525
|
-
"defaultValue": null,
|
|
51526
|
-
"category": "props"
|
|
51527
|
-
},
|
|
51528
|
-
{
|
|
51529
|
-
"name": "unstable_onDataSourceError",
|
|
51530
|
-
"description": "",
|
|
51531
|
-
"type": "(error: Error, params: GridGetRowsParams) => void",
|
|
51505
|
+
"name": "setTreeDataPath",
|
|
51506
|
+
"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.",
|
|
51507
|
+
"type": "(path: string[], row: any) => any",
|
|
51532
51508
|
"required": false,
|
|
51533
51509
|
"defaultValue": null,
|
|
51534
51510
|
"category": "props"
|
|
@@ -51695,22 +51671,6 @@
|
|
|
51695
51671
|
"defaultValue": null,
|
|
51696
51672
|
"category": "props"
|
|
51697
51673
|
},
|
|
51698
|
-
{
|
|
51699
|
-
"name": "className",
|
|
51700
|
-
"description": "",
|
|
51701
|
-
"type": "string",
|
|
51702
|
-
"required": false,
|
|
51703
|
-
"defaultValue": null,
|
|
51704
|
-
"category": "props"
|
|
51705
|
-
},
|
|
51706
|
-
{
|
|
51707
|
-
"name": "style",
|
|
51708
|
-
"description": "",
|
|
51709
|
-
"type": "CSSProperties",
|
|
51710
|
-
"required": false,
|
|
51711
|
-
"defaultValue": null,
|
|
51712
|
-
"category": "props"
|
|
51713
|
-
},
|
|
51714
51674
|
{
|
|
51715
51675
|
"name": "getTreeDataPath",
|
|
51716
51676
|
"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.",
|
|
@@ -51720,17 +51680,9 @@
|
|
|
51720
51680
|
"category": "props"
|
|
51721
51681
|
},
|
|
51722
51682
|
{
|
|
51723
|
-
"name": "
|
|
51724
|
-
"description": "",
|
|
51725
|
-
"type": [
|
|
51726
|
-
"required": false,
|
|
51727
|
-
"defaultValue": null,
|
|
51728
|
-
"category": "props"
|
|
51729
|
-
},
|
|
51730
|
-
{
|
|
51731
|
-
"name": "unstable_onDataSourceError",
|
|
51732
|
-
"description": "",
|
|
51733
|
-
"type": "(error: Error, params: GridGetRowsParams) => void",
|
|
51683
|
+
"name": "setTreeDataPath",
|
|
51684
|
+
"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.",
|
|
51685
|
+
"type": "(path: string[], row: any) => any",
|
|
51734
51686
|
"required": false,
|
|
51735
51687
|
"defaultValue": null,
|
|
51736
51688
|
"category": "props"
|
|
@@ -52077,8 +52029,8 @@
|
|
|
52077
52029
|
},
|
|
52078
52030
|
{
|
|
52079
52031
|
"name": "dataGridApiRef",
|
|
52080
|
-
"description": "Datagrid API Ref.",
|
|
52081
|
-
"type": "MutableRefObject<
|
|
52032
|
+
"description": "Datagrid API Ref. MUI v8: can be null initially.",
|
|
52033
|
+
"type": "MutableRefObject<GridApiPremium | null>",
|
|
52082
52034
|
"required": false,
|
|
52083
52035
|
"defaultValue": null,
|
|
52084
52036
|
"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-10T18:15:31.360Z
|
|
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
|
|
|
@@ -7877,7 +7871,7 @@ Each pattern describes a common UI scenario, the components involved, how they a
|
|
|
7877
7871
|
## Datagrid Page
|
|
7878
7872
|
**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.
|
|
7879
7873
|
**Components:** DataGrid, TextCell, StatefulDataGrid, Pill, Button, Flexbox, Text, Badge, Icon, IconButton, IconButtonLink
|
|
7880
|
-
**Packages:** @redsift/table, @redsift/design-system, @mui/x-data-grid-
|
|
7874
|
+
**Packages:** @redsift/table, @redsift/design-system, @mui/x-data-grid-premium
|
|
7881
7875
|
**Layout:** DataGrid with autoHeight, pagination, pageSize, built-in Toolbar via componentsProps.toolbar.showQuickFilter. Optional bulk actions bar when selectionModel.length > 0.
|
|
7882
7876
|
**Tags:** table, datagrid, list, pagination, filter, toolbar, bulk-actions, GridColDef, filterModel, checkboxSelection, client-side
|
|
7883
7877
|
|
|
@@ -7960,22 +7954,22 @@ type Row = {
|
|
|
7960
7954
|
|
|
7961
7955
|
```tsx
|
|
7962
7956
|
import React, { useState } from 'react';
|
|
7963
|
-
import { DataGrid } from '@redsift/table';
|
|
7957
|
+
import { DataGrid, EMPTY_ROW_SELECTION_MODEL, getSelectionCount } from '@redsift/table';
|
|
7964
7958
|
import { Flexbox } from '@redsift/design-system';
|
|
7965
|
-
import { GridFilterModel, GridRowSelectionModel } from '@mui/x-data-grid-
|
|
7959
|
+
import { GridFilterModel, GridRowSelectionModel } from '@mui/x-data-grid-premium';
|
|
7966
7960
|
import { rows } from '../_shared/data';
|
|
7967
7961
|
import { columns } from '../_shared/columns';
|
|
7968
7962
|
import { CustomToolbar, BulkActionBar } from '../_shared/helpers';
|
|
7969
7963
|
import { DEFAULT_FILTER_MODEL, DEFAULT_SORT_MODEL } from '../_shared/defaults';
|
|
7970
7964
|
|
|
7971
7965
|
export default ({ initialFilterModel }: { initialFilterModel?: GridFilterModel }) => {
|
|
7972
|
-
const [selectionModel, setSelectionModel] = useState<GridRowSelectionModel>(
|
|
7966
|
+
const [selectionModel, setSelectionModel] = useState<GridRowSelectionModel>(EMPTY_ROW_SELECTION_MODEL);
|
|
7973
7967
|
|
|
7974
7968
|
return (
|
|
7975
7969
|
<div style={{ width: '100%' }}>
|
|
7976
7970
|
<Flexbox flexDirection="column" gap="0px">
|
|
7977
7971
|
<BulkActionBar
|
|
7978
|
-
count={selectionModel
|
|
7972
|
+
count={getSelectionCount(selectionModel)}
|
|
7979
7973
|
onLog={() => console.log('Selected:', selectionModel)}
|
|
7980
7974
|
onDelete={() => console.log('Delete:', selectionModel)}
|
|
7981
7975
|
/>
|
|
@@ -7983,8 +7977,8 @@ export default ({ initialFilterModel }: { initialFilterModel?: GridFilterModel }
|
|
|
7983
7977
|
<DataGrid
|
|
7984
7978
|
autoHeight
|
|
7985
7979
|
pagination
|
|
7980
|
+
density="compact"
|
|
7986
7981
|
initialState={{
|
|
7987
|
-
density: 'compact',
|
|
7988
7982
|
filter: { filterModel: initialFilterModel ?? DEFAULT_FILTER_MODEL },
|
|
7989
7983
|
sorting: { sortModel: DEFAULT_SORT_MODEL },
|
|
7990
7984
|
pagination: { paginationModel: { page: 0, pageSize: 10 } },
|
|
@@ -8014,7 +8008,7 @@ export default ({ initialFilterModel }: { initialFilterModel?: GridFilterModel }
|
|
|
8014
8008
|
## Server Datagrid Page
|
|
8015
8009
|
**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.
|
|
8016
8010
|
**Components:** DataGrid, TextCell, Pill, Button, Flexbox, Text, Badge, Icon, IconButton, IconButtonLink
|
|
8017
|
-
**Packages:** @redsift/table, @redsift/design-system, @mui/x-data-grid-
|
|
8011
|
+
**Packages:** @redsift/table, @redsift/design-system, @mui/x-data-grid-premium
|
|
8018
8012
|
**Layout:** DataGrid with autoHeight, paginationMode='server', sortingMode='server', filterMode='server', rowCount, loading, built-in Toolbar. Optional bulk actions bar when selectionModel.length > 0.
|
|
8019
8013
|
**Tags:** table, datagrid, server-side, pagination, paginationMode, filterMode, sortingMode, loading, rowCount, filter, toolbar, bulk-actions, GridColDef, filterModel, sortModel, debounce
|
|
8020
8014
|
|
|
@@ -8125,9 +8119,9 @@ type FetchResult = {
|
|
|
8125
8119
|
|
|
8126
8120
|
```tsx
|
|
8127
8121
|
import React, { useCallback, useEffect, useRef, useState } from 'react';
|
|
8128
|
-
import { DataGrid } from '@redsift/table';
|
|
8122
|
+
import { DataGrid, EMPTY_ROW_SELECTION_MODEL, getSelectionCount } from '@redsift/table';
|
|
8129
8123
|
import { Flexbox } from '@redsift/design-system';
|
|
8130
|
-
import { GridFilterModel, GridRowSelectionModel, GridSortModel } from '@mui/x-data-grid-
|
|
8124
|
+
import { GridFilterModel, GridRowSelectionModel, GridSortModel } from '@mui/x-data-grid-premium';
|
|
8131
8125
|
import { Row } from '../_shared/data';
|
|
8132
8126
|
import { columns } from '../_shared/columns';
|
|
8133
8127
|
import { fetchBakeryData } from '../_shared/api-client';
|
|
@@ -8142,7 +8136,7 @@ export default ({ initialFilterModel }: { initialFilterModel?: GridFilterModel }
|
|
|
8142
8136
|
const [pageSize, setPageSize] = useState(10);
|
|
8143
8137
|
const [sortModel, setSortModel] = useState<GridSortModel>(DEFAULT_SORT_MODEL);
|
|
8144
8138
|
const [filterModel, setFilterModel] = useState<GridFilterModel>(initialFilterModel ?? DEFAULT_FILTER_MODEL);
|
|
8145
|
-
const [selectionModel, setSelectionModel] = useState<GridRowSelectionModel>(
|
|
8139
|
+
const [selectionModel, setSelectionModel] = useState<GridRowSelectionModel>(EMPTY_ROW_SELECTION_MODEL);
|
|
8146
8140
|
|
|
8147
8141
|
const quickFilterText = (filterModel as { quickFilterValues?: string[] }).quickFilterValues?.join(' ') || '';
|
|
8148
8142
|
const debounceRef = useRef<ReturnType<typeof setTimeout>>();
|
|
@@ -8180,7 +8174,7 @@ export default ({ initialFilterModel }: { initialFilterModel?: GridFilterModel }
|
|
|
8180
8174
|
<div style={{ width: '100%' }}>
|
|
8181
8175
|
<Flexbox flexDirection="column" gap="0px">
|
|
8182
8176
|
<BulkActionBar
|
|
8183
|
-
count={selectionModel
|
|
8177
|
+
count={getSelectionCount(selectionModel)}
|
|
8184
8178
|
onLog={() => console.log('Selected:', selectionModel)}
|
|
8185
8179
|
onDelete={() => console.log('Delete:', selectionModel)}
|
|
8186
8180
|
/>
|
|
@@ -8188,7 +8182,7 @@ export default ({ initialFilterModel }: { initialFilterModel?: GridFilterModel }
|
|
|
8188
8182
|
<DataGrid
|
|
8189
8183
|
autoHeight
|
|
8190
8184
|
pagination
|
|
8191
|
-
|
|
8185
|
+
density="compact"
|
|
8192
8186
|
paginationMode="server"
|
|
8193
8187
|
sortingMode="server"
|
|
8194
8188
|
filterMode="server"
|
|
@@ -8248,10 +8242,10 @@ export default ({ initialFilterModel }: { initialFilterModel?: GridFilterModel }
|
|
|
8248
8242
|
|
|
8249
8243
|
```tsx
|
|
8250
8244
|
import React, { useState } from 'react';
|
|
8251
|
-
import { StatefulDataGrid } from '@redsift/table';
|
|
8245
|
+
import { StatefulDataGrid, EMPTY_ROW_SELECTION_MODEL, getSelectionCount } from '@redsift/table';
|
|
8252
8246
|
import { Flexbox } from '@redsift/design-system';
|
|
8253
|
-
import { GridFilterModel, GridRowSelectionModel, useGridApiRef } from '@mui/x-data-grid-
|
|
8254
|
-
import type {
|
|
8247
|
+
import { GridFilterModel, GridRowSelectionModel, useGridApiRef } from '@mui/x-data-grid-premium';
|
|
8248
|
+
import type { GridApiPremium } from '@mui/x-data-grid-premium';
|
|
8255
8249
|
import { rows } from '../_shared/data';
|
|
8256
8250
|
import { columns } from '../_shared/columns';
|
|
8257
8251
|
import { CustomToolbar, BulkActionBar } from '../_shared/helpers';
|
|
@@ -8262,20 +8256,20 @@ import { StateDebugPanel } from '../_shared/StateDebugPanel';
|
|
|
8262
8256
|
interface Props {
|
|
8263
8257
|
initialFilterModel?: GridFilterModel;
|
|
8264
8258
|
useRouter?: () => { pathname: string; search: string; historyReplace: (newSearch: string) => void };
|
|
8265
|
-
apiRef?: React.MutableRefObject<
|
|
8259
|
+
apiRef?: React.MutableRefObject<GridApiPremium | null>;
|
|
8266
8260
|
}
|
|
8267
8261
|
|
|
8268
8262
|
export default ({ initialFilterModel, useRouter = useRouterAdapter, apiRef: propsApiRef }: Props) => {
|
|
8269
8263
|
const internalApiRef = useGridApiRef();
|
|
8270
8264
|
const apiRef = propsApiRef ?? internalApiRef;
|
|
8271
|
-
const [selectionModel, setSelectionModel] = useState<GridRowSelectionModel>(
|
|
8265
|
+
const [selectionModel, setSelectionModel] = useState<GridRowSelectionModel>(EMPTY_ROW_SELECTION_MODEL);
|
|
8272
8266
|
|
|
8273
8267
|
return (
|
|
8274
8268
|
<div style={{ width: '100%' }}>
|
|
8275
8269
|
<StateDebugPanel apiRef={apiRef} useRouter={useRouter} localStorageVersion={1} />
|
|
8276
8270
|
<Flexbox flexDirection="column" gap="0px">
|
|
8277
8271
|
<BulkActionBar
|
|
8278
|
-
count={selectionModel
|
|
8272
|
+
count={getSelectionCount(selectionModel)}
|
|
8279
8273
|
onLog={() => console.log('Selected:', selectionModel)}
|
|
8280
8274
|
onDelete={() => console.log('Delete:', selectionModel)}
|
|
8281
8275
|
/>
|
|
@@ -8331,10 +8325,10 @@ export default ({ initialFilterModel, useRouter = useRouterAdapter, apiRef: prop
|
|
|
8331
8325
|
|
|
8332
8326
|
```tsx
|
|
8333
8327
|
import React, { useCallback, useEffect, useRef, useState } from 'react';
|
|
8334
|
-
import { StatefulDataGrid } from '@redsift/table';
|
|
8328
|
+
import { StatefulDataGrid, EMPTY_ROW_SELECTION_MODEL, getSelectionCount } from '@redsift/table';
|
|
8335
8329
|
import { Flexbox } from '@redsift/design-system';
|
|
8336
|
-
import { GridFilterModel, GridRowSelectionModel, GridSortModel, useGridApiRef } from '@mui/x-data-grid-
|
|
8337
|
-
import type {
|
|
8330
|
+
import { GridFilterModel, GridRowSelectionModel, GridSortModel, useGridApiRef } from '@mui/x-data-grid-premium';
|
|
8331
|
+
import type { GridApiPremium } from '@mui/x-data-grid-premium';
|
|
8338
8332
|
import { Row } from '../_shared/data';
|
|
8339
8333
|
import { columns } from '../_shared/columns';
|
|
8340
8334
|
import { fetchBakeryData } from '../_shared/api-client';
|
|
@@ -8346,7 +8340,7 @@ import { StateDebugPanel } from '../_shared/StateDebugPanel';
|
|
|
8346
8340
|
interface Props {
|
|
8347
8341
|
initialFilterModel?: GridFilterModel;
|
|
8348
8342
|
useRouter?: () => { pathname: string; search: string; historyReplace: (newSearch: string) => void };
|
|
8349
|
-
apiRef?: React.MutableRefObject<
|
|
8343
|
+
apiRef?: React.MutableRefObject<GridApiPremium | null>;
|
|
8350
8344
|
}
|
|
8351
8345
|
|
|
8352
8346
|
export default ({ initialFilterModel, useRouter = useRouterAdapter, apiRef: propsApiRef }: Props) => {
|
|
@@ -8355,7 +8349,7 @@ export default ({ initialFilterModel, useRouter = useRouterAdapter, apiRef: prop
|
|
|
8355
8349
|
const [rows, setRows] = useState<Row[]>([]);
|
|
8356
8350
|
const [totalRows, setTotalRows] = useState(0);
|
|
8357
8351
|
const [loading, setLoading] = useState(true);
|
|
8358
|
-
const [selectionModel, setSelectionModel] = useState<GridRowSelectionModel>(
|
|
8352
|
+
const [selectionModel, setSelectionModel] = useState<GridRowSelectionModel>(EMPTY_ROW_SELECTION_MODEL);
|
|
8359
8353
|
|
|
8360
8354
|
// Refs track the latest model values so fetchData() always reads current state.
|
|
8361
8355
|
// StatefulDataGrid manages filter/sort/pagination internally — we use callbacks
|
|
@@ -8390,7 +8384,7 @@ export default ({ initialFilterModel, useRouter = useRouterAdapter, apiRef: prop
|
|
|
8390
8384
|
<StateDebugPanel apiRef={apiRef} useRouter={useRouter} localStorageVersion={1} />
|
|
8391
8385
|
<Flexbox flexDirection="column" gap="0px">
|
|
8392
8386
|
<BulkActionBar
|
|
8393
|
-
count={selectionModel
|
|
8387
|
+
count={getSelectionCount(selectionModel)}
|
|
8394
8388
|
onLog={() => console.log('Selected:', selectionModel)}
|
|
8395
8389
|
onDelete={() => console.log('Delete:', selectionModel)}
|
|
8396
8390
|
/>
|
|
@@ -8452,7 +8446,7 @@ export default ({ initialFilterModel, useRouter = useRouterAdapter, apiRef: prop
|
|
|
8452
8446
|
## Drilldown Datagrid Page
|
|
8453
8447
|
**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.
|
|
8454
8448
|
**Components:** DataGrid, TextCell, DataCard, DataCard.Header, DataCard.Body, DataCard.Listbox, DataRow, Pill, Button, Flexbox, Text, Icon, IconButtonLink
|
|
8455
|
-
**Packages:** @redsift/table, @redsift/design-system, @redsift/dashboard, @mui/x-data-grid-
|
|
8449
|
+
**Packages:** @redsift/table, @redsift/design-system, @redsift/dashboard, @mui/x-data-grid-premium
|
|
8456
8450
|
**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.
|
|
8457
8451
|
**Tags:** table, datagrid, datacard, drilldown, drilldown-item, filter, isAnyOf, summary-cards, kpi, one-way, filterModel, client-side
|
|
8458
8452
|
|
|
@@ -8546,7 +8540,7 @@ import { DataGrid } from '@redsift/table';
|
|
|
8546
8540
|
import { Flexbox } from '@redsift/design-system';
|
|
8547
8541
|
import { DataCard, DataRow } from '@redsift/dashboard';
|
|
8548
8542
|
import { mdiShapeOutline, mdiToggleSwitch, mdiFoodOff } from '@redsift/icons';
|
|
8549
|
-
import { GridFilterModel } from '@mui/x-data-grid-
|
|
8543
|
+
import { GridFilterModel } from '@mui/x-data-grid-premium';
|
|
8550
8544
|
import { rows } from '../_shared/data';
|
|
8551
8545
|
import { columns, CATEGORY_OPTIONS, ALLERGEN_OPTIONS } from '../_shared/columns';
|
|
8552
8546
|
import { CustomToolbar } from '../_shared/helpers';
|
|
@@ -8750,7 +8744,7 @@ export default () => {
|
|
|
8750
8744
|
## Cross-filtered Datagrid Page
|
|
8751
8745
|
**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.
|
|
8752
8746
|
**Components:** DataGrid, TextCell, DataCard, DataCard.Header, DataCard.Body, DataCard.Listbox, DataRow, Pill, Button, Flexbox, Text, Icon, IconButtonLink
|
|
8753
|
-
**Packages:** @redsift/table, @redsift/design-system, @redsift/dashboard, @mui/x-data-grid-
|
|
8747
|
+
**Packages:** @redsift/table, @redsift/design-system, @redsift/dashboard, @mui/x-data-grid-premium
|
|
8754
8748
|
**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.
|
|
8755
8749
|
**Tags:** table, datagrid, datacard, drilldown, drilldown-item, cross-filter, crossfilter, two-way, bidirectional, filter, isAnyOf, summary-cards, kpi, dashboard, filterModel, client-side
|
|
8756
8750
|
|
|
@@ -8865,7 +8859,7 @@ export default () => (
|
|
|
8865
8859
|
{/* Category card — two-way: counts update when other cards filter */}
|
|
8866
8860
|
<WithFilters
|
|
8867
8861
|
field="Category"
|
|
8868
|
-
dimension={(d:
|
|
8862
|
+
dimension={(d: any) => d.Category}
|
|
8869
8863
|
datagridCategoryDimFilter={{ field: 'Category', operator: 'isAnyOf' }}
|
|
8870
8864
|
syncMode="two-way"
|
|
8871
8865
|
>
|
|
@@ -8898,7 +8892,7 @@ export default () => (
|
|
|
8898
8892
|
{/* Allergens card — two-way */}
|
|
8899
8893
|
<WithFilters
|
|
8900
8894
|
field="Allergens"
|
|
8901
|
-
dimension={(d:
|
|
8895
|
+
dimension={(d: any) => d.Allergens}
|
|
8902
8896
|
isDimensionArray
|
|
8903
8897
|
datagridCategoryDimFilter={{ field: 'Allergens', operator: 'hasAnyOf' }}
|
|
8904
8898
|
syncMode="two-way"
|
|
@@ -9024,7 +9018,7 @@ import { DataGrid } from '@redsift/table';
|
|
|
9024
9018
|
import { Flexbox } from '@redsift/design-system';
|
|
9025
9019
|
import { DataCard, DataRow } from '@redsift/dashboard';
|
|
9026
9020
|
import { mdiShapeOutline, mdiToggleSwitch, mdiFoodOff } from '@redsift/icons';
|
|
9027
|
-
import { GridFilterModel, GridSortModel } from '@mui/x-data-grid-
|
|
9021
|
+
import { GridFilterModel, GridSortModel } from '@mui/x-data-grid-premium';
|
|
9028
9022
|
import { Row } from '../_shared/data';
|
|
9029
9023
|
import { columns, CATEGORY_OPTIONS, ALLERGEN_OPTIONS } from '../_shared/columns';
|
|
9030
9024
|
import { fetchBakeryData, FetchResult } from '../_shared/api-client';
|
|
@@ -9301,7 +9295,7 @@ import { Flexbox } from '@redsift/design-system';
|
|
|
9301
9295
|
import { DataCard, DataRow } from '@redsift/dashboard';
|
|
9302
9296
|
import { BarChart, PieChart, ArcDatum, BarDatum } from '@redsift/charts';
|
|
9303
9297
|
import { mdiShapeOutline, mdiToggleSwitch, mdiFoodOff } from '@redsift/icons';
|
|
9304
|
-
import { GridFilterModel, GridSortModel } from '@mui/x-data-grid-
|
|
9298
|
+
import { GridFilterModel, GridSortModel } from '@mui/x-data-grid-premium';
|
|
9305
9299
|
import { Row } from '../_shared/data';
|
|
9306
9300
|
import { columns, CATEGORY_OPTIONS, ALLERGEN_OPTIONS } from '../_shared/columns';
|
|
9307
9301
|
import { fetchBakeryData, FetchResult } from '../_shared/api-client';
|
|
@@ -9505,7 +9499,7 @@ export default () => {
|
|
|
9505
9499
|
data={itemsChartData}
|
|
9506
9500
|
sliceRole="option"
|
|
9507
9501
|
onSliceClick={(datum: ArcDatum) => {
|
|
9508
|
-
const key = datum.data.key
|
|
9502
|
+
const key = datum.data.key;
|
|
9509
9503
|
setFilterModel((prev) => {
|
|
9510
9504
|
const selected = getSelectedFromFilterModel(prev, 'Items');
|
|
9511
9505
|
const next = selected.includes(key) ? selected.filter((v) => v !== key) : [...selected, key];
|
|
@@ -9514,7 +9508,7 @@ export default () => {
|
|
|
9514
9508
|
setPage(0);
|
|
9515
9509
|
}}
|
|
9516
9510
|
isSliceSelected={(datum: ArcDatum) =>
|
|
9517
|
-
itemsSelection.length === 0 || itemsSelection.includes(datum.data.key
|
|
9511
|
+
itemsSelection.length === 0 || itemsSelection.includes(datum.data.key)
|
|
9518
9512
|
}
|
|
9519
9513
|
/>
|
|
9520
9514
|
|
|
@@ -9536,7 +9530,7 @@ export default () => {
|
|
|
9536
9530
|
data={tagsChartData}
|
|
9537
9531
|
barRole="option"
|
|
9538
9532
|
onBarClick={(datum: BarDatum) => {
|
|
9539
|
-
const key = datum.data.key
|
|
9533
|
+
const key = String(datum.data.key);
|
|
9540
9534
|
setFilterModel((prev) => {
|
|
9541
9535
|
const selected = getSelectedFromFilterModel(prev, 'Tags');
|
|
9542
9536
|
const next = selected.includes(key) ? selected.filter((v) => v !== key) : [...selected, key];
|
|
@@ -9545,7 +9539,7 @@ export default () => {
|
|
|
9545
9539
|
setPage(0);
|
|
9546
9540
|
}}
|
|
9547
9541
|
isBarSelected={(datum: BarDatum) =>
|
|
9548
|
-
tagsSelection.length === 0 || tagsSelection.includes(datum.data.key
|
|
9542
|
+
tagsSelection.length === 0 || tagsSelection.includes(String(datum.data.key))
|
|
9549
9543
|
}
|
|
9550
9544
|
/>
|
|
9551
9545
|
</Flexbox>
|
|
@@ -9723,7 +9717,7 @@ export default () => {
|
|
|
9723
9717
|
import React, { useCallback, useEffect, useRef, useState } from 'react';
|
|
9724
9718
|
import { DataGrid } from '@redsift/table';
|
|
9725
9719
|
import { Flexbox, Pill, Number, Text, Tabs, Tab } from '@redsift/design-system';
|
|
9726
|
-
import { GridFilterModel, GridSortModel } from '@mui/x-data-grid-
|
|
9720
|
+
import { GridFilterModel, GridSortModel } from '@mui/x-data-grid-premium';
|
|
9727
9721
|
import { Row } from '../_shared/data';
|
|
9728
9722
|
import { columns, CATEGORY_OPTIONS } from '../_shared/columns';
|
|
9729
9723
|
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,12 +284,12 @@ 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-
|
|
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
289
|
| Stateful Datagrid Page (Client) | StatefulDataGrid, DataGrid, Pill, Button, Flexbox, Text, Icon | @redsift/table, @redsift/design-system, @mui/x-data-grid-pro |
|
|
290
290
|
| Stateful Datagrid Page (Server) | StatefulDataGrid, DataGrid, Pill, Button, Flexbox, Text, Icon | @redsift/table, @redsift/design-system, @mui/x-data-grid-pro |
|
|
291
|
-
| 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-
|
|
292
|
-
| 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-
|
|
291
|
+
| 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 |
|
|
292
|
+
| 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 |
|
|
293
293
|
| Server Drilldown Datagrid Page | DataGrid, TextCell, DataCard, DataRow, Flexbox, Pill, Icon | @redsift/table, @redsift/dashboard, @redsift/design-system, @mui/x-data-grid-pro |
|
|
294
294
|
| Server Cross-filtered Datagrid Page | DataGrid, TextCell, DataCard, DataRow, Flexbox, Pill, Icon | @redsift/table, @redsift/dashboard, @redsift/design-system, @mui/x-data-grid-pro |
|
|
295
295
|
| 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
|
|
|
@@ -201,29 +201,29 @@ type FetchResult = {
|
|
|
201
201
|
|
|
202
202
|
**Anatomy:**
|
|
203
203
|
|
|
204
|
-
1. DataCard Row — Flexbox with 1-N DataCards, each containing DataCard.Header and DataCard.Listbox or DataCard.Body with
|
|
204
|
+
1. DataCard Row — Flexbox with 1-N DataCards, each containing DataCard.Header and DataCard.Listbox or DataCard.Body with DrilldownItem children
|
|
205
205
|
2. Toolbar — Flexbox wrapping GridToolbarContainer with filter, columns, density, export, quick search controls
|
|
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`, `
|
|
210
|
-
**Components:** DataGrid, TextCell (from @redsift/table), DataCard, DataCard.Header, DataCard.Body, DataCard.Listbox,
|
|
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
|
+
**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
|
|
|
213
213
|
**Features:**
|
|
214
214
|
|
|
215
|
-
| Feature
|
|
216
|
-
|
|
|
217
|
-
| DataCard aggregation
|
|
218
|
-
|
|
|
219
|
-
| Listbox multi-select
|
|
220
|
-
| is/isNot clearing
|
|
221
|
-
| Column definitions
|
|
222
|
-
| Toolbar
|
|
223
|
-
| Custom cell renderers
|
|
224
|
-
| Boolean toggle
|
|
225
|
-
| Checkbox selection
|
|
226
|
-
| Bulk action bar
|
|
215
|
+
| Feature | Required | Description |
|
|
216
|
+
| ------------------------- | -------- | -------------------------------------------------------------------------------- |
|
|
217
|
+
| DataCard aggregation | Yes | DataCard components showing aggregate counts per field from the full dataset |
|
|
218
|
+
| DrilldownItem filter push | Yes | Clicking a DrilldownItem adds an isAnyOf filter to the DataGrid filterModel |
|
|
219
|
+
| Listbox multi-select | Yes | DataCard.Listbox with selectionMode=multiple and controlled values |
|
|
220
|
+
| is/isNot clearing | Yes | When filter panel has is/isNot for a card's field, the DataCard selection clears |
|
|
221
|
+
| Column definitions | Yes | GridColDef[] with custom types |
|
|
222
|
+
| Toolbar | Yes | Built-in toolbar with filter, columns, density, export, and quick search |
|
|
223
|
+
| Custom cell renderers | Yes | renderCell returning TextCell, Pill, Icon, IconButtonLink |
|
|
224
|
+
| Boolean toggle | No | DataCard.Body with DrilldownItem onClick for boolean fields |
|
|
225
|
+
| Checkbox selection | No | checkboxSelection + rowSelectionModel |
|
|
226
|
+
| Bulk action bar | No | Contextual buttons shown when rows are selected |
|
|
227
227
|
|
|
228
228
|
**Filter helpers:**
|
|
229
229
|
|
|
@@ -257,7 +257,7 @@ type AggregateCounts = {
|
|
|
257
257
|
|
|
258
258
|
1. Define your row type — every row must have a unique id field.
|
|
259
259
|
2. Compute aggregate counts — useAggregateCounts(allRows) counts from the full dataset.
|
|
260
|
-
3. Build DataCards with DataCard.Header, DataCard.Listbox (multi-select) or DataCard.Body (boolean toggle) containing
|
|
260
|
+
3. Build DataCards with DataCard.Header, DataCard.Listbox (multi-select) or DataCard.Body (boolean toggle) containing DrilldownItem children.
|
|
261
261
|
4. Write filter helpers — getSelectedFromFilterModel and updateFilterModel.
|
|
262
262
|
5. Wire DataCard handlers — onChange to updateFilterModel, onClick to updateBooleanFilter.
|
|
263
263
|
6. Render the DataGrid with controlled filterModel and onFilterModelChange.
|
|
@@ -277,7 +277,7 @@ type AggregateCounts = {
|
|
|
277
277
|
- DataCard counts should recalculate as filters change — reflecting the current filter context
|
|
278
278
|
- Clicking a card value should add a filter to the datagrid (bidirectional)
|
|
279
279
|
- Changing the filter panel should update the card selection
|
|
280
|
-
- The dataset is small enough to load entirely (under ~
|
|
280
|
+
- The dataset is small enough to load entirely (under ~1,000 rows)
|
|
281
281
|
|
|
282
282
|
**When NOT to use:**
|
|
283
283
|
|
|
@@ -290,11 +290,10 @@ type AggregateCounts = {
|
|
|
290
290
|
1. DataCard Row — Flexbox with 1-N DataCards. Counts are cross-filtered: each card excludes its own field from the filter calculation
|
|
291
291
|
2. Toolbar — Flexbox wrapping GridToolbarContainer with filter, columns, density, export, quick search controls
|
|
292
292
|
3. DataGrid — the table with controlled filterModel + onFilterModelChange. Rows are pre-filtered client-side
|
|
293
|
-
4.
|
|
294
|
-
5. Bulk Action Bar — Flexbox row shown when selectionModel.length > 0, with Pill (count) and action Buttons
|
|
293
|
+
4. Bulk Action Bar — Flexbox row shown when selectionModel.length > 0, with Pill (count) and action Buttons
|
|
295
294
|
|
|
296
|
-
**Key imports:** `DataGrid`, `TextCell` from `@redsift/table`; `DataCard`, `
|
|
297
|
-
**Components:** DataGrid, TextCell (from @redsift/table),
|
|
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
|
+
**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)
|
|
298
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.
|
|
299
298
|
|
|
300
299
|
**Features:**
|
|
@@ -303,14 +302,14 @@ type AggregateCounts = {
|
|
|
303
302
|
| -------------------------- | -------- | -------------------------------------------------------------------------------- |
|
|
304
303
|
| Cross-filtered aggregation | Yes | DataCard counts recompute from rows filtered by all fields except the card's own |
|
|
305
304
|
| Two-way filter sync | Yes | DataCard selections derive from filterModel; DataCard clicks update filterModel |
|
|
306
|
-
|
|
|
305
|
+
| DrilldownItem filter push | Yes | Clicking a DrilldownItem adds an isAnyOf filter to the DataGrid filterModel |
|
|
307
306
|
| Listbox multi-select | Yes | DataCard.Listbox with selectionMode=multiple and controlled values |
|
|
308
307
|
| is/isNot clearing | Yes | When filter panel has is/isNot for a card's field, the DataCard selection clears |
|
|
309
308
|
| Client-side row filtering | Yes | applyFilters function filters the full row set by the current filterModel |
|
|
310
309
|
| Column definitions | Yes | GridColDef[] with custom types |
|
|
311
310
|
| Toolbar | Yes | Built-in toolbar with filter, columns, density, export, and quick search |
|
|
312
311
|
| Custom cell renderers | Yes | renderCell returning TextCell, Pill, Icon, IconButtonLink |
|
|
313
|
-
| Boolean toggle | No | DataCard.Body with
|
|
312
|
+
| Boolean toggle | No | DataCard.Body with DrilldownItem onClick for boolean fields |
|
|
314
313
|
| Checkbox selection | No | checkboxSelection + rowSelectionModel |
|
|
315
314
|
| Bulk action bar | No | Contextual buttons shown when rows are selected |
|
|
316
315
|
|
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",
|
|
@@ -448,7 +448,7 @@
|
|
|
448
448
|
"Icon",
|
|
449
449
|
"IconButtonLink"
|
|
450
450
|
],
|
|
451
|
-
"packages": ["@redsift/table", "@redsift/design-system", "@redsift/dashboard", "@mui/x-data-grid-
|
|
451
|
+
"packages": ["@redsift/table", "@redsift/design-system", "@redsift/dashboard", "@mui/x-data-grid-premium"],
|
|
452
452
|
"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.",
|
|
453
453
|
"tags": [
|
|
454
454
|
"table",
|
|
@@ -616,7 +616,7 @@
|
|
|
616
616
|
"Icon",
|
|
617
617
|
"IconButtonLink"
|
|
618
618
|
],
|
|
619
|
-
"packages": ["@redsift/table", "@redsift/design-system", "@redsift/dashboard", "@mui/x-data-grid-
|
|
619
|
+
"packages": ["@redsift/table", "@redsift/design-system", "@redsift/dashboard", "@mui/x-data-grid-premium"],
|
|
620
620
|
"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.",
|
|
621
621
|
"tags": [
|
|
622
622
|
"table",
|
package/data/metadata.json
CHANGED