@redsift/ds-mcp-server 12.5.0-muiv7 → 12.5.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/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 +55 -38
- 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 +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 -5
- package/data/demos/patterns/stateful-single-datagrid-client-side/StatefulSingleDatagridClientSide.interaction.stories.tsx +1 -1
- package/data/demos/patterns/stateful-single-datagrid-client-side/example.tsx +4 -4
- package/data/demos/patterns/stateful-single-datagrid-server-side/StatefulSingleDatagridServerSide.interaction.stories.tsx +2 -4
- package/data/demos/patterns/stateful-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 +36 -42
- 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 +1 -1
- package/data/patterns/tabbed-datagrid-server-side.mdx +1 -1
- package/package.json +2 -2
|
@@ -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-03T15:15:35.500Z",
|
|
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-03T15:15:35.485Z
|
|
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
|
|
|
@@ -7968,22 +7962,22 @@ type Row = {
|
|
|
7968
7962
|
|
|
7969
7963
|
```tsx
|
|
7970
7964
|
import React, { useState } from 'react';
|
|
7971
|
-
import { DataGrid } from '@redsift/table';
|
|
7965
|
+
import { DataGrid, EMPTY_ROW_SELECTION_MODEL, getSelectionCount } from '@redsift/table';
|
|
7972
7966
|
import { Flexbox } from '@redsift/design-system';
|
|
7973
|
-
import { GridFilterModel, GridRowSelectionModel } from '@mui/x-data-grid-
|
|
7967
|
+
import { GridFilterModel, GridRowSelectionModel } from '@mui/x-data-grid-premium';
|
|
7974
7968
|
import { rows } from '../_shared/data';
|
|
7975
7969
|
import { columns } from '../_shared/columns';
|
|
7976
7970
|
import { CustomToolbar, BulkActionBar } from '../_shared/helpers';
|
|
7977
7971
|
import { DEFAULT_FILTER_MODEL, DEFAULT_SORT_MODEL } from '../_shared/defaults';
|
|
7978
7972
|
|
|
7979
7973
|
export default ({ initialFilterModel }: { initialFilterModel?: GridFilterModel }) => {
|
|
7980
|
-
const [selectionModel, setSelectionModel] = useState<GridRowSelectionModel>(
|
|
7974
|
+
const [selectionModel, setSelectionModel] = useState<GridRowSelectionModel>(EMPTY_ROW_SELECTION_MODEL);
|
|
7981
7975
|
|
|
7982
7976
|
return (
|
|
7983
7977
|
<div style={{ width: '100%' }}>
|
|
7984
7978
|
<Flexbox flexDirection="column" gap="0px">
|
|
7985
7979
|
<BulkActionBar
|
|
7986
|
-
count={selectionModel
|
|
7980
|
+
count={getSelectionCount(selectionModel)}
|
|
7987
7981
|
onLog={() => console.log('Selected:', selectionModel)}
|
|
7988
7982
|
onDelete={() => console.log('Delete:', selectionModel)}
|
|
7989
7983
|
/>
|
|
@@ -7991,8 +7985,8 @@ export default ({ initialFilterModel }: { initialFilterModel?: GridFilterModel }
|
|
|
7991
7985
|
<DataGrid
|
|
7992
7986
|
autoHeight
|
|
7993
7987
|
pagination
|
|
7988
|
+
density="compact"
|
|
7994
7989
|
initialState={{
|
|
7995
|
-
density: 'compact',
|
|
7996
7990
|
filter: { filterModel: initialFilterModel ?? DEFAULT_FILTER_MODEL },
|
|
7997
7991
|
sorting: { sortModel: DEFAULT_SORT_MODEL },
|
|
7998
7992
|
pagination: { paginationModel: { page: 0, pageSize: 10 } },
|
|
@@ -8022,7 +8016,7 @@ export default ({ initialFilterModel }: { initialFilterModel?: GridFilterModel }
|
|
|
8022
8016
|
## Server Datagrid Page
|
|
8023
8017
|
**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.
|
|
8024
8018
|
**Components:** DataGrid, TextCell, Pill, Button, Flexbox, Text, Badge, Icon, IconButton, IconButtonLink
|
|
8025
|
-
**Packages:** @redsift/table, @redsift/design-system, @mui/x-data-grid-
|
|
8019
|
+
**Packages:** @redsift/table, @redsift/design-system, @mui/x-data-grid-premium
|
|
8026
8020
|
**Layout:** DataGrid with autoHeight, paginationMode='server', sortingMode='server', filterMode='server', rowCount, loading, built-in Toolbar. Optional bulk actions bar when selectionModel.length > 0.
|
|
8027
8021
|
**Tags:** table, datagrid, server-side, pagination, paginationMode, filterMode, sortingMode, loading, rowCount, filter, toolbar, bulk-actions, GridColDef, filterModel, sortModel, debounce
|
|
8028
8022
|
|
|
@@ -8133,9 +8127,9 @@ type FetchResult = {
|
|
|
8133
8127
|
|
|
8134
8128
|
```tsx
|
|
8135
8129
|
import React, { useCallback, useEffect, useRef, useState } from 'react';
|
|
8136
|
-
import { DataGrid } from '@redsift/table';
|
|
8130
|
+
import { DataGrid, EMPTY_ROW_SELECTION_MODEL, getSelectionCount } from '@redsift/table';
|
|
8137
8131
|
import { Flexbox } from '@redsift/design-system';
|
|
8138
|
-
import { GridFilterModel, GridRowSelectionModel, GridSortModel } from '@mui/x-data-grid-
|
|
8132
|
+
import { GridFilterModel, GridRowSelectionModel, GridSortModel } from '@mui/x-data-grid-premium';
|
|
8139
8133
|
import { Row } from '../_shared/data';
|
|
8140
8134
|
import { columns } from '../_shared/columns';
|
|
8141
8135
|
import { fetchBakeryData } from '../_shared/api-client';
|
|
@@ -8150,7 +8144,7 @@ export default ({ initialFilterModel }: { initialFilterModel?: GridFilterModel }
|
|
|
8150
8144
|
const [pageSize, setPageSize] = useState(10);
|
|
8151
8145
|
const [sortModel, setSortModel] = useState<GridSortModel>(DEFAULT_SORT_MODEL);
|
|
8152
8146
|
const [filterModel, setFilterModel] = useState<GridFilterModel>(initialFilterModel ?? DEFAULT_FILTER_MODEL);
|
|
8153
|
-
const [selectionModel, setSelectionModel] = useState<GridRowSelectionModel>(
|
|
8147
|
+
const [selectionModel, setSelectionModel] = useState<GridRowSelectionModel>(EMPTY_ROW_SELECTION_MODEL);
|
|
8154
8148
|
|
|
8155
8149
|
const quickFilterText = (filterModel as { quickFilterValues?: string[] }).quickFilterValues?.join(' ') || '';
|
|
8156
8150
|
const debounceRef = useRef<ReturnType<typeof setTimeout>>();
|
|
@@ -8188,7 +8182,7 @@ export default ({ initialFilterModel }: { initialFilterModel?: GridFilterModel }
|
|
|
8188
8182
|
<div style={{ width: '100%' }}>
|
|
8189
8183
|
<Flexbox flexDirection="column" gap="0px">
|
|
8190
8184
|
<BulkActionBar
|
|
8191
|
-
count={selectionModel
|
|
8185
|
+
count={getSelectionCount(selectionModel)}
|
|
8192
8186
|
onLog={() => console.log('Selected:', selectionModel)}
|
|
8193
8187
|
onDelete={() => console.log('Delete:', selectionModel)}
|
|
8194
8188
|
/>
|
|
@@ -8196,7 +8190,7 @@ export default ({ initialFilterModel }: { initialFilterModel?: GridFilterModel }
|
|
|
8196
8190
|
<DataGrid
|
|
8197
8191
|
autoHeight
|
|
8198
8192
|
pagination
|
|
8199
|
-
|
|
8193
|
+
density="compact"
|
|
8200
8194
|
paginationMode="server"
|
|
8201
8195
|
sortingMode="server"
|
|
8202
8196
|
filterMode="server"
|
|
@@ -8256,9 +8250,9 @@ export default ({ initialFilterModel }: { initialFilterModel?: GridFilterModel }
|
|
|
8256
8250
|
|
|
8257
8251
|
```tsx
|
|
8258
8252
|
import React, { useState } from 'react';
|
|
8259
|
-
import { StatefulDataGrid } from '@redsift/table';
|
|
8253
|
+
import { StatefulDataGrid, EMPTY_ROW_SELECTION_MODEL, getSelectionCount } from '@redsift/table';
|
|
8260
8254
|
import { Flexbox } from '@redsift/design-system';
|
|
8261
|
-
import { GridFilterModel, GridRowSelectionModel, useGridApiRef } from '@mui/x-data-grid-
|
|
8255
|
+
import { GridFilterModel, GridRowSelectionModel, useGridApiRef } from '@mui/x-data-grid-premium';
|
|
8262
8256
|
import { rows } from '../_shared/data';
|
|
8263
8257
|
import { columns } from '../_shared/columns';
|
|
8264
8258
|
import { CustomToolbar, BulkActionBar } from '../_shared/helpers';
|
|
@@ -8273,14 +8267,14 @@ interface Props {
|
|
|
8273
8267
|
|
|
8274
8268
|
export default ({ initialFilterModel, useRouter = useRouterAdapter }: Props) => {
|
|
8275
8269
|
const apiRef = useGridApiRef();
|
|
8276
|
-
const [selectionModel, setSelectionModel] = useState<GridRowSelectionModel>(
|
|
8270
|
+
const [selectionModel, setSelectionModel] = useState<GridRowSelectionModel>(EMPTY_ROW_SELECTION_MODEL);
|
|
8277
8271
|
|
|
8278
8272
|
return (
|
|
8279
8273
|
<div style={{ width: '100%' }}>
|
|
8280
8274
|
<StateDebugPanel apiRef={apiRef} useRouter={useRouter} localStorageVersion={1} />
|
|
8281
8275
|
<Flexbox flexDirection="column" gap="0px">
|
|
8282
8276
|
<BulkActionBar
|
|
8283
|
-
count={selectionModel
|
|
8277
|
+
count={getSelectionCount(selectionModel)}
|
|
8284
8278
|
onLog={() => console.log('Selected:', selectionModel)}
|
|
8285
8279
|
onDelete={() => console.log('Delete:', selectionModel)}
|
|
8286
8280
|
/>
|
|
@@ -8336,9 +8330,9 @@ export default ({ initialFilterModel, useRouter = useRouterAdapter }: Props) =>
|
|
|
8336
8330
|
|
|
8337
8331
|
```tsx
|
|
8338
8332
|
import React, { useCallback, useEffect, useRef, useState } from 'react';
|
|
8339
|
-
import { StatefulDataGrid } from '@redsift/table';
|
|
8333
|
+
import { StatefulDataGrid, EMPTY_ROW_SELECTION_MODEL, getSelectionCount } from '@redsift/table';
|
|
8340
8334
|
import { Flexbox } from '@redsift/design-system';
|
|
8341
|
-
import { GridFilterModel, GridRowSelectionModel, GridSortModel, useGridApiRef } from '@mui/x-data-grid-
|
|
8335
|
+
import { GridFilterModel, GridRowSelectionModel, GridSortModel, useGridApiRef } from '@mui/x-data-grid-premium';
|
|
8342
8336
|
import { Row } from '../_shared/data';
|
|
8343
8337
|
import { columns } from '../_shared/columns';
|
|
8344
8338
|
import { fetchBakeryData } from '../_shared/api-client';
|
|
@@ -8357,7 +8351,7 @@ export default ({ initialFilterModel, useRouter = useRouterAdapter }: Props) =>
|
|
|
8357
8351
|
const [rows, setRows] = useState<Row[]>([]);
|
|
8358
8352
|
const [totalRows, setTotalRows] = useState(0);
|
|
8359
8353
|
const [loading, setLoading] = useState(true);
|
|
8360
|
-
const [selectionModel, setSelectionModel] = useState<GridRowSelectionModel>(
|
|
8354
|
+
const [selectionModel, setSelectionModel] = useState<GridRowSelectionModel>(EMPTY_ROW_SELECTION_MODEL);
|
|
8361
8355
|
|
|
8362
8356
|
// Refs track the latest model values so fetchData() always reads current state.
|
|
8363
8357
|
// StatefulDataGrid manages filter/sort/pagination internally — we use callbacks
|
|
@@ -8392,7 +8386,7 @@ export default ({ initialFilterModel, useRouter = useRouterAdapter }: Props) =>
|
|
|
8392
8386
|
<StateDebugPanel apiRef={apiRef} useRouter={useRouter} localStorageVersion={1} />
|
|
8393
8387
|
<Flexbox flexDirection="column" gap="0px">
|
|
8394
8388
|
<BulkActionBar
|
|
8395
|
-
count={selectionModel
|
|
8389
|
+
count={getSelectionCount(selectionModel)}
|
|
8396
8390
|
onLog={() => console.log('Selected:', selectionModel)}
|
|
8397
8391
|
onDelete={() => console.log('Delete:', selectionModel)}
|
|
8398
8392
|
/>
|
|
@@ -8454,7 +8448,7 @@ export default ({ initialFilterModel, useRouter = useRouterAdapter }: Props) =>
|
|
|
8454
8448
|
## Drilldown Datagrid Page
|
|
8455
8449
|
**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.
|
|
8456
8450
|
**Components:** DataGrid, TextCell, DataCard, DataCard.Header, DataCard.Body, DataCard.Listbox, DataRow, Pill, Button, Flexbox, Text, Icon, IconButtonLink
|
|
8457
|
-
**Packages:** @redsift/table, @redsift/design-system, @redsift/dashboard, @mui/x-data-grid-
|
|
8451
|
+
**Packages:** @redsift/table, @redsift/design-system, @redsift/dashboard, @mui/x-data-grid-premium
|
|
8458
8452
|
**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.
|
|
8459
8453
|
**Tags:** table, datagrid, datacard, drilldown, drilldown-item, filter, isAnyOf, summary-cards, kpi, one-way, filterModel, client-side
|
|
8460
8454
|
|
|
@@ -8548,7 +8542,7 @@ import { DataGrid } from '@redsift/table';
|
|
|
8548
8542
|
import { Flexbox } from '@redsift/design-system';
|
|
8549
8543
|
import { DataCard, DataRow } from '@redsift/dashboard';
|
|
8550
8544
|
import { mdiShapeOutline, mdiToggleSwitch, mdiFoodOff } from '@redsift/icons';
|
|
8551
|
-
import { GridFilterModel } from '@mui/x-data-grid-
|
|
8545
|
+
import { GridFilterModel } from '@mui/x-data-grid-premium';
|
|
8552
8546
|
import { rows } from '../_shared/data';
|
|
8553
8547
|
import { columns, CATEGORY_OPTIONS, ALLERGEN_OPTIONS } from '../_shared/columns';
|
|
8554
8548
|
import { CustomToolbar } from '../_shared/helpers';
|
|
@@ -8752,7 +8746,7 @@ export default () => {
|
|
|
8752
8746
|
## Cross-filtered Datagrid Page
|
|
8753
8747
|
**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.
|
|
8754
8748
|
**Components:** DataGrid, TextCell, DataCard, DataCard.Header, DataCard.Body, DataCard.Listbox, DataRow, Pill, Button, Flexbox, Text, Icon, IconButtonLink
|
|
8755
|
-
**Packages:** @redsift/table, @redsift/design-system, @redsift/dashboard, @mui/x-data-grid-
|
|
8749
|
+
**Packages:** @redsift/table, @redsift/design-system, @redsift/dashboard, @mui/x-data-grid-premium
|
|
8756
8750
|
**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.
|
|
8757
8751
|
**Tags:** table, datagrid, datacard, drilldown, drilldown-item, cross-filter, crossfilter, two-way, bidirectional, filter, isAnyOf, summary-cards, kpi, dashboard, filterModel, client-side
|
|
8758
8752
|
|
|
@@ -8867,7 +8861,7 @@ export default () => (
|
|
|
8867
8861
|
{/* Category card — two-way: counts update when other cards filter */}
|
|
8868
8862
|
<WithFilters
|
|
8869
8863
|
field="Category"
|
|
8870
|
-
dimension={(d:
|
|
8864
|
+
dimension={(d: any) => d.Category}
|
|
8871
8865
|
datagridCategoryDimFilter={{ field: 'Category', operator: 'isAnyOf' }}
|
|
8872
8866
|
syncMode="two-way"
|
|
8873
8867
|
>
|
|
@@ -8900,7 +8894,7 @@ export default () => (
|
|
|
8900
8894
|
{/* Allergens card — two-way */}
|
|
8901
8895
|
<WithFilters
|
|
8902
8896
|
field="Allergens"
|
|
8903
|
-
dimension={(d:
|
|
8897
|
+
dimension={(d: any) => d.Allergens}
|
|
8904
8898
|
isDimensionArray
|
|
8905
8899
|
datagridCategoryDimFilter={{ field: 'Allergens', operator: 'hasAnyOf' }}
|
|
8906
8900
|
syncMode="two-way"
|
|
@@ -9026,7 +9020,7 @@ import { DataGrid } from '@redsift/table';
|
|
|
9026
9020
|
import { Flexbox } from '@redsift/design-system';
|
|
9027
9021
|
import { DataCard, DataRow } from '@redsift/dashboard';
|
|
9028
9022
|
import { mdiShapeOutline, mdiToggleSwitch, mdiFoodOff } from '@redsift/icons';
|
|
9029
|
-
import { GridFilterModel, GridSortModel } from '@mui/x-data-grid-
|
|
9023
|
+
import { GridFilterModel, GridSortModel } from '@mui/x-data-grid-premium';
|
|
9030
9024
|
import { Row } from '../_shared/data';
|
|
9031
9025
|
import { columns, CATEGORY_OPTIONS, ALLERGEN_OPTIONS } from '../_shared/columns';
|
|
9032
9026
|
import { fetchBakeryData, FetchResult } from '../_shared/api-client';
|
|
@@ -9303,7 +9297,7 @@ import { Flexbox } from '@redsift/design-system';
|
|
|
9303
9297
|
import { DataCard, DataRow } from '@redsift/dashboard';
|
|
9304
9298
|
import { BarChart, PieChart, ArcDatum, BarDatum } from '@redsift/charts';
|
|
9305
9299
|
import { mdiShapeOutline, mdiToggleSwitch, mdiFoodOff } from '@redsift/icons';
|
|
9306
|
-
import { GridFilterModel, GridSortModel } from '@mui/x-data-grid-
|
|
9300
|
+
import { GridFilterModel, GridSortModel } from '@mui/x-data-grid-premium';
|
|
9307
9301
|
import { Row } from '../_shared/data';
|
|
9308
9302
|
import { columns, CATEGORY_OPTIONS, ALLERGEN_OPTIONS } from '../_shared/columns';
|
|
9309
9303
|
import { fetchBakeryData, FetchResult } from '../_shared/api-client';
|
|
@@ -9507,7 +9501,7 @@ export default () => {
|
|
|
9507
9501
|
data={itemsChartData}
|
|
9508
9502
|
sliceRole="option"
|
|
9509
9503
|
onSliceClick={(datum: ArcDatum) => {
|
|
9510
|
-
const key = datum.data.key
|
|
9504
|
+
const key = datum.data.key;
|
|
9511
9505
|
setFilterModel((prev) => {
|
|
9512
9506
|
const selected = getSelectedFromFilterModel(prev, 'Items');
|
|
9513
9507
|
const next = selected.includes(key) ? selected.filter((v) => v !== key) : [...selected, key];
|
|
@@ -9516,7 +9510,7 @@ export default () => {
|
|
|
9516
9510
|
setPage(0);
|
|
9517
9511
|
}}
|
|
9518
9512
|
isSliceSelected={(datum: ArcDatum) =>
|
|
9519
|
-
itemsSelection.length === 0 || itemsSelection.includes(datum.data.key
|
|
9513
|
+
itemsSelection.length === 0 || itemsSelection.includes(datum.data.key)
|
|
9520
9514
|
}
|
|
9521
9515
|
/>
|
|
9522
9516
|
|
|
@@ -9538,7 +9532,7 @@ export default () => {
|
|
|
9538
9532
|
data={tagsChartData}
|
|
9539
9533
|
barRole="option"
|
|
9540
9534
|
onBarClick={(datum: BarDatum) => {
|
|
9541
|
-
const key = datum.data.key
|
|
9535
|
+
const key = String(datum.data.key);
|
|
9542
9536
|
setFilterModel((prev) => {
|
|
9543
9537
|
const selected = getSelectedFromFilterModel(prev, 'Tags');
|
|
9544
9538
|
const next = selected.includes(key) ? selected.filter((v) => v !== key) : [...selected, key];
|
|
@@ -9547,7 +9541,7 @@ export default () => {
|
|
|
9547
9541
|
setPage(0);
|
|
9548
9542
|
}}
|
|
9549
9543
|
isBarSelected={(datum: BarDatum) =>
|
|
9550
|
-
tagsSelection.length === 0 || tagsSelection.includes(datum.data.key
|
|
9544
|
+
tagsSelection.length === 0 || tagsSelection.includes(String(datum.data.key))
|
|
9551
9545
|
}
|
|
9552
9546
|
/>
|
|
9553
9547
|
</Flexbox>
|
|
@@ -9725,7 +9719,7 @@ export default () => {
|
|
|
9725
9719
|
import React, { useCallback, useEffect, useRef, useState } from 'react';
|
|
9726
9720
|
import { DataGrid } from '@redsift/table';
|
|
9727
9721
|
import { Flexbox, Pill, Number, Text, Tabs, Tab } from '@redsift/design-system';
|
|
9728
|
-
import { GridFilterModel, GridSortModel } from '@mui/x-data-grid-
|
|
9722
|
+
import { GridFilterModel, GridSortModel } from '@mui/x-data-grid-premium';
|
|
9729
9723
|
import { Row } from '../_shared/data';
|
|
9730
9724
|
import { columns, CATEGORY_OPTIONS } from '../_shared/columns';
|
|
9731
9725
|
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 |
|