@redsift/ds-mcp-server 12.5.2-muiv6 → 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 +12 -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 -22
- package/data/demos/patterns/crossfiltered-datagrid-client-side/CrossfilteredDatagridClientSide.interaction.stories.tsx +1 -18
- package/data/demos/patterns/crossfiltered-datagrid-server-side/CrossfilteredDatagridServerSide.interaction.stories.tsx +1 -1
- package/data/demos/patterns/crossfiltered-datagrid-server-side/example.tsx +10 -10
- package/data/demos/patterns/drilldowned-datagrid-client-side/example.tsx +1 -1
- package/data/demos/patterns/drilldowned-datagrid-server-side/example.tsx +1 -1
- package/data/demos/patterns/single-datagrid-client-side/SingleDatagridClientSide.interaction.stories.tsx +1 -1
- package/data/demos/patterns/single-datagrid-client-side/example.tsx +4 -4
- package/data/demos/patterns/single-datagrid-server-side/SingleDatagridServerSide.interaction.stories.tsx +1 -1
- package/data/demos/patterns/single-datagrid-server-side/example.tsx +4 -4
- package/data/demos/patterns/stateful-single-datagrid-client-side/StatefulSingleDatagridClientSide.interaction.stories.tsx +129 -1
- package/data/demos/patterns/stateful-single-datagrid-client-side/example.tsx +6 -5
- package/data/demos/patterns/stateful-single-datagrid-server-side/StatefulSingleDatagridServerSide.interaction.stories.tsx +134 -1
- package/data/demos/patterns/stateful-single-datagrid-server-side/example.tsx +6 -5
- 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 +7 -7
- package/data/docs/components/table/GridToolbarFilterSemanticField.json +1 -1
- package/data/docs/components/table/StatefulDataGrid.json +7 -7
- package/data/docs/components/table/Toolbar.json +8 -2
- package/data/docs/components.json +1359 -5959
- package/data/docs/llms-full.txt +48 -46
- package/data/docs/llms.txt +4 -4
- 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 +7 -7
- package/data/patterns/single-datagrid-server-side.mdx +4 -4
- package/data/patterns/stateful-single-datagrid-client-side.mdx +36 -21
- 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
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
|
---
|
|
@@ -6034,10 +6034,10 @@ For `boolean` columns, use `type: 'boolean'` directly (no createColumn wrapper n
|
|
|
6034
6034
|
| toolbar | ReactNode | No | - | Toolbar. A default one is provided but every button from this default Toolbar can be customized and the entire Toolbar can be replaced. |
|
|
6035
6035
|
| hideToolbar | false \| true | No | - | Whether the Toolbar is displayed or not. |
|
|
6036
6036
|
| paginationPlacement | "top" \| "bottom" \| "both" \| "none" | No | 'both' | Indicates how to display pagination. |
|
|
6037
|
-
| paginationProps | Omit<TablePaginationProps, "paginationMode" \| "component" \| "
|
|
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
|
-
|
|
|
6040
|
-
|
|
|
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. |
|
|
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. |
|
|
6041
6041
|
|
|
6042
6042
|
---
|
|
6043
6043
|
|
|
@@ -6053,7 +6053,7 @@ The GridToolbarFilterSemanticField component.
|
|
|
6053
6053
|
| Prop | Type | Required | Default | Description |
|
|
6054
6054
|
|------|------|----------|---------|-------------|
|
|
6055
6055
|
| nlpFilterConfig | FilterConfig | Yes | - | |
|
|
6056
|
-
| onFilterModelChange | (filterModel: GridFilterModel) => void |
|
|
6056
|
+
| onFilterModelChange | (filterModel: GridFilterModel) => void | No | - | |
|
|
6057
6057
|
| dateFormat | string | No | - | |
|
|
6058
6058
|
| defaultModel | string | No | - | |
|
|
6059
6059
|
| defaultFilter | CompletionResponse | No | - | |
|
|
@@ -6092,10 +6092,10 @@ Use when users need persistent table preferences. Requires unique `localStorageK
|
|
|
6092
6092
|
| toolbar | ReactNode | No | - | Toolbar. A default one is provided but every button from this default Toolbar can be customized and the entire Toolbar can be replaced. |
|
|
6093
6093
|
| hideToolbar | false \| true | No | - | Whether the Toolbar is displayed or not. |
|
|
6094
6094
|
| paginationPlacement | "top" \| "bottom" \| "both" \| "none" | No | 'both' | Indicates how to display pagination. |
|
|
6095
|
-
| paginationProps | Omit<TablePaginationProps, "paginationMode" \| "component" \| "
|
|
6095
|
+
| paginationProps | Omit<TablePaginationProps, "paginationMode" \| "component" \| "count" \| "onPageChange" \| "onRowsPerPageChange" \| "page" \| "rowsPerPage" \| "rowsPerPageOptions"> | No | - | Props to forward to the pagination component. |
|
|
6096
6096
|
| theme | "light" \| "dark" | No | - | Theme. |
|
|
6097
|
-
|
|
|
6098
|
-
|
|
|
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. |
|
|
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. |
|
|
6099
6099
|
|
|
6100
6100
|
---
|
|
6101
6101
|
|
|
@@ -6130,9 +6130,9 @@ The Cell component.
|
|
|
6130
6130
|
|
|
6131
6131
|
| Prop | Type | Required | Default | Description |
|
|
6132
6132
|
|------|------|----------|---------|-------------|
|
|
6133
|
-
| columnsButtonProps |
|
|
6133
|
+
| columnsButtonProps | GridToolbarColumnsButtonProps \| GridToolbarColumnsButtonProps & RefAttributes<HTMLButtonElement> | No | - | Props to forward to the column button. |
|
|
6134
6134
|
| columnsButtonRef | RefObject<HTMLButtonElement> | No | - | Column button ref. |
|
|
6135
|
-
| densityButtonProps |
|
|
6135
|
+
| densityButtonProps | GridToolbarDensitySelectorProps \| GridToolbarDensitySelectorProps & RefAttributes<HTMLButtonElement> | No | - | Props to forward to the density button. |
|
|
6136
6136
|
| densityButtonRef | RefObject<HTMLButtonElement> | No | - | Density button ref. |
|
|
6137
6137
|
| exportButtonProps | GridToolbarExportProps | No | - | Props to forward to the export button. |
|
|
6138
6138
|
| exportButtonRef | RefObject<HTMLButtonElement> | No | - | Export button ref. |
|
|
@@ -6205,7 +6205,7 @@ When one chart is filtered, all connected charts update automatically.
|
|
|
6205
6205
|
| Prop | Type | Required | Default | Description |
|
|
6206
6206
|
|------|------|----------|---------|-------------|
|
|
6207
6207
|
| data | JSONArray | Yes | - | Dataset that will be share across every components within the dashboard. |
|
|
6208
|
-
| dataGridApiRef | MutableRefObject<
|
|
6208
|
+
| dataGridApiRef | MutableRefObject<GridApiPremium \| null> | No | - | Datagrid API Ref. MUI v8: can be null initially. |
|
|
6209
6209
|
|
|
6210
6210
|
---
|
|
6211
6211
|
|
|
@@ -7871,7 +7871,7 @@ Each pattern describes a common UI scenario, the components involved, how they a
|
|
|
7871
7871
|
## Datagrid Page
|
|
7872
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.
|
|
7873
7873
|
**Components:** DataGrid, TextCell, StatefulDataGrid, Pill, Button, Flexbox, Text, Badge, Icon, IconButton, IconButtonLink
|
|
7874
|
-
**Packages:** @redsift/table, @redsift/design-system, @mui/x-data-grid-
|
|
7874
|
+
**Packages:** @redsift/table, @redsift/design-system, @mui/x-data-grid-premium
|
|
7875
7875
|
**Layout:** DataGrid with autoHeight, pagination, pageSize, built-in Toolbar via componentsProps.toolbar.showQuickFilter. Optional bulk actions bar when selectionModel.length > 0.
|
|
7876
7876
|
**Tags:** table, datagrid, list, pagination, filter, toolbar, bulk-actions, GridColDef, filterModel, checkboxSelection, client-side
|
|
7877
7877
|
|
|
@@ -7954,22 +7954,22 @@ type Row = {
|
|
|
7954
7954
|
|
|
7955
7955
|
```tsx
|
|
7956
7956
|
import React, { useState } from 'react';
|
|
7957
|
-
import { DataGrid } from '@redsift/table';
|
|
7957
|
+
import { DataGrid, EMPTY_ROW_SELECTION_MODEL, getSelectionCount } from '@redsift/table';
|
|
7958
7958
|
import { Flexbox } from '@redsift/design-system';
|
|
7959
|
-
import { GridFilterModel, GridRowSelectionModel } from '@mui/x-data-grid-
|
|
7959
|
+
import { GridFilterModel, GridRowSelectionModel } from '@mui/x-data-grid-premium';
|
|
7960
7960
|
import { rows } from '../_shared/data';
|
|
7961
7961
|
import { columns } from '../_shared/columns';
|
|
7962
7962
|
import { CustomToolbar, BulkActionBar } from '../_shared/helpers';
|
|
7963
7963
|
import { DEFAULT_FILTER_MODEL, DEFAULT_SORT_MODEL } from '../_shared/defaults';
|
|
7964
7964
|
|
|
7965
7965
|
export default ({ initialFilterModel }: { initialFilterModel?: GridFilterModel }) => {
|
|
7966
|
-
const [selectionModel, setSelectionModel] = useState<GridRowSelectionModel>(
|
|
7966
|
+
const [selectionModel, setSelectionModel] = useState<GridRowSelectionModel>(EMPTY_ROW_SELECTION_MODEL);
|
|
7967
7967
|
|
|
7968
7968
|
return (
|
|
7969
7969
|
<div style={{ width: '100%' }}>
|
|
7970
7970
|
<Flexbox flexDirection="column" gap="0px">
|
|
7971
7971
|
<BulkActionBar
|
|
7972
|
-
count={selectionModel
|
|
7972
|
+
count={getSelectionCount(selectionModel)}
|
|
7973
7973
|
onLog={() => console.log('Selected:', selectionModel)}
|
|
7974
7974
|
onDelete={() => console.log('Delete:', selectionModel)}
|
|
7975
7975
|
/>
|
|
@@ -8008,7 +8008,7 @@ export default ({ initialFilterModel }: { initialFilterModel?: GridFilterModel }
|
|
|
8008
8008
|
## Server Datagrid Page
|
|
8009
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.
|
|
8010
8010
|
**Components:** DataGrid, TextCell, Pill, Button, Flexbox, Text, Badge, Icon, IconButton, IconButtonLink
|
|
8011
|
-
**Packages:** @redsift/table, @redsift/design-system, @mui/x-data-grid-
|
|
8011
|
+
**Packages:** @redsift/table, @redsift/design-system, @mui/x-data-grid-premium
|
|
8012
8012
|
**Layout:** DataGrid with autoHeight, paginationMode='server', sortingMode='server', filterMode='server', rowCount, loading, built-in Toolbar. Optional bulk actions bar when selectionModel.length > 0.
|
|
8013
8013
|
**Tags:** table, datagrid, server-side, pagination, paginationMode, filterMode, sortingMode, loading, rowCount, filter, toolbar, bulk-actions, GridColDef, filterModel, sortModel, debounce
|
|
8014
8014
|
|
|
@@ -8119,9 +8119,9 @@ type FetchResult = {
|
|
|
8119
8119
|
|
|
8120
8120
|
```tsx
|
|
8121
8121
|
import React, { useCallback, useEffect, useRef, useState } from 'react';
|
|
8122
|
-
import { DataGrid } from '@redsift/table';
|
|
8122
|
+
import { DataGrid, EMPTY_ROW_SELECTION_MODEL, getSelectionCount } from '@redsift/table';
|
|
8123
8123
|
import { Flexbox } from '@redsift/design-system';
|
|
8124
|
-
import { GridFilterModel, GridRowSelectionModel, GridSortModel } from '@mui/x-data-grid-
|
|
8124
|
+
import { GridFilterModel, GridRowSelectionModel, GridSortModel } from '@mui/x-data-grid-premium';
|
|
8125
8125
|
import { Row } from '../_shared/data';
|
|
8126
8126
|
import { columns } from '../_shared/columns';
|
|
8127
8127
|
import { fetchBakeryData } from '../_shared/api-client';
|
|
@@ -8136,7 +8136,7 @@ export default ({ initialFilterModel }: { initialFilterModel?: GridFilterModel }
|
|
|
8136
8136
|
const [pageSize, setPageSize] = useState(10);
|
|
8137
8137
|
const [sortModel, setSortModel] = useState<GridSortModel>(DEFAULT_SORT_MODEL);
|
|
8138
8138
|
const [filterModel, setFilterModel] = useState<GridFilterModel>(initialFilterModel ?? DEFAULT_FILTER_MODEL);
|
|
8139
|
-
const [selectionModel, setSelectionModel] = useState<GridRowSelectionModel>(
|
|
8139
|
+
const [selectionModel, setSelectionModel] = useState<GridRowSelectionModel>(EMPTY_ROW_SELECTION_MODEL);
|
|
8140
8140
|
|
|
8141
8141
|
const quickFilterText = (filterModel as { quickFilterValues?: string[] }).quickFilterValues?.join(' ') || '';
|
|
8142
8142
|
const debounceRef = useRef<ReturnType<typeof setTimeout>>();
|
|
@@ -8174,7 +8174,7 @@ export default ({ initialFilterModel }: { initialFilterModel?: GridFilterModel }
|
|
|
8174
8174
|
<div style={{ width: '100%' }}>
|
|
8175
8175
|
<Flexbox flexDirection="column" gap="0px">
|
|
8176
8176
|
<BulkActionBar
|
|
8177
|
-
count={selectionModel
|
|
8177
|
+
count={getSelectionCount(selectionModel)}
|
|
8178
8178
|
onLog={() => console.log('Selected:', selectionModel)}
|
|
8179
8179
|
onDelete={() => console.log('Delete:', selectionModel)}
|
|
8180
8180
|
/>
|
|
@@ -8242,9 +8242,10 @@ export default ({ initialFilterModel }: { initialFilterModel?: GridFilterModel }
|
|
|
8242
8242
|
|
|
8243
8243
|
```tsx
|
|
8244
8244
|
import React, { useState } from 'react';
|
|
8245
|
-
import { StatefulDataGrid } from '@redsift/table';
|
|
8245
|
+
import { StatefulDataGrid, EMPTY_ROW_SELECTION_MODEL, getSelectionCount } from '@redsift/table';
|
|
8246
8246
|
import { Flexbox } from '@redsift/design-system';
|
|
8247
|
-
import { GridFilterModel, GridRowSelectionModel,
|
|
8247
|
+
import { GridFilterModel, GridRowSelectionModel, useGridApiRef } from '@mui/x-data-grid-premium';
|
|
8248
|
+
import type { GridApiPremium } from '@mui/x-data-grid-premium';
|
|
8248
8249
|
import { rows } from '../_shared/data';
|
|
8249
8250
|
import { columns } from '../_shared/columns';
|
|
8250
8251
|
import { CustomToolbar, BulkActionBar } from '../_shared/helpers';
|
|
@@ -8255,20 +8256,20 @@ import { StateDebugPanel } from '../_shared/StateDebugPanel';
|
|
|
8255
8256
|
interface Props {
|
|
8256
8257
|
initialFilterModel?: GridFilterModel;
|
|
8257
8258
|
useRouter?: () => { pathname: string; search: string; historyReplace: (newSearch: string) => void };
|
|
8258
|
-
apiRef?: React.MutableRefObject<
|
|
8259
|
+
apiRef?: React.MutableRefObject<GridApiPremium | null>;
|
|
8259
8260
|
}
|
|
8260
8261
|
|
|
8261
8262
|
export default ({ initialFilterModel, useRouter = useRouterAdapter, apiRef: propsApiRef }: Props) => {
|
|
8262
8263
|
const internalApiRef = useGridApiRef();
|
|
8263
8264
|
const apiRef = propsApiRef ?? internalApiRef;
|
|
8264
|
-
const [selectionModel, setSelectionModel] = useState<GridRowSelectionModel>(
|
|
8265
|
+
const [selectionModel, setSelectionModel] = useState<GridRowSelectionModel>(EMPTY_ROW_SELECTION_MODEL);
|
|
8265
8266
|
|
|
8266
8267
|
return (
|
|
8267
8268
|
<div style={{ width: '100%' }}>
|
|
8268
8269
|
<StateDebugPanel apiRef={apiRef} useRouter={useRouter} localStorageVersion={1} />
|
|
8269
8270
|
<Flexbox flexDirection="column" gap="0px">
|
|
8270
8271
|
<BulkActionBar
|
|
8271
|
-
count={selectionModel
|
|
8272
|
+
count={getSelectionCount(selectionModel)}
|
|
8272
8273
|
onLog={() => console.log('Selected:', selectionModel)}
|
|
8273
8274
|
onDelete={() => console.log('Delete:', selectionModel)}
|
|
8274
8275
|
/>
|
|
@@ -8324,9 +8325,10 @@ export default ({ initialFilterModel, useRouter = useRouterAdapter, apiRef: prop
|
|
|
8324
8325
|
|
|
8325
8326
|
```tsx
|
|
8326
8327
|
import React, { useCallback, useEffect, useRef, useState } from 'react';
|
|
8327
|
-
import { StatefulDataGrid } from '@redsift/table';
|
|
8328
|
+
import { StatefulDataGrid, EMPTY_ROW_SELECTION_MODEL, getSelectionCount } from '@redsift/table';
|
|
8328
8329
|
import { Flexbox } from '@redsift/design-system';
|
|
8329
|
-
import { GridFilterModel, GridRowSelectionModel, GridSortModel,
|
|
8330
|
+
import { GridFilterModel, GridRowSelectionModel, GridSortModel, useGridApiRef } from '@mui/x-data-grid-premium';
|
|
8331
|
+
import type { GridApiPremium } from '@mui/x-data-grid-premium';
|
|
8330
8332
|
import { Row } from '../_shared/data';
|
|
8331
8333
|
import { columns } from '../_shared/columns';
|
|
8332
8334
|
import { fetchBakeryData } from '../_shared/api-client';
|
|
@@ -8338,7 +8340,7 @@ import { StateDebugPanel } from '../_shared/StateDebugPanel';
|
|
|
8338
8340
|
interface Props {
|
|
8339
8341
|
initialFilterModel?: GridFilterModel;
|
|
8340
8342
|
useRouter?: () => { pathname: string; search: string; historyReplace: (newSearch: string) => void };
|
|
8341
|
-
apiRef?: React.MutableRefObject<
|
|
8343
|
+
apiRef?: React.MutableRefObject<GridApiPremium | null>;
|
|
8342
8344
|
}
|
|
8343
8345
|
|
|
8344
8346
|
export default ({ initialFilterModel, useRouter = useRouterAdapter, apiRef: propsApiRef }: Props) => {
|
|
@@ -8347,7 +8349,7 @@ export default ({ initialFilterModel, useRouter = useRouterAdapter, apiRef: prop
|
|
|
8347
8349
|
const [rows, setRows] = useState<Row[]>([]);
|
|
8348
8350
|
const [totalRows, setTotalRows] = useState(0);
|
|
8349
8351
|
const [loading, setLoading] = useState(true);
|
|
8350
|
-
const [selectionModel, setSelectionModel] = useState<GridRowSelectionModel>(
|
|
8352
|
+
const [selectionModel, setSelectionModel] = useState<GridRowSelectionModel>(EMPTY_ROW_SELECTION_MODEL);
|
|
8351
8353
|
|
|
8352
8354
|
// Refs track the latest model values so fetchData() always reads current state.
|
|
8353
8355
|
// StatefulDataGrid manages filter/sort/pagination internally — we use callbacks
|
|
@@ -8382,7 +8384,7 @@ export default ({ initialFilterModel, useRouter = useRouterAdapter, apiRef: prop
|
|
|
8382
8384
|
<StateDebugPanel apiRef={apiRef} useRouter={useRouter} localStorageVersion={1} />
|
|
8383
8385
|
<Flexbox flexDirection="column" gap="0px">
|
|
8384
8386
|
<BulkActionBar
|
|
8385
|
-
count={selectionModel
|
|
8387
|
+
count={getSelectionCount(selectionModel)}
|
|
8386
8388
|
onLog={() => console.log('Selected:', selectionModel)}
|
|
8387
8389
|
onDelete={() => console.log('Delete:', selectionModel)}
|
|
8388
8390
|
/>
|
|
@@ -8444,7 +8446,7 @@ export default ({ initialFilterModel, useRouter = useRouterAdapter, apiRef: prop
|
|
|
8444
8446
|
## Drilldown Datagrid Page
|
|
8445
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.
|
|
8446
8448
|
**Components:** DataGrid, TextCell, DataCard, DataCard.Header, DataCard.Body, DataCard.Listbox, DataRow, Pill, Button, Flexbox, Text, Icon, IconButtonLink
|
|
8447
|
-
**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
|
|
8448
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.
|
|
8449
8451
|
**Tags:** table, datagrid, datacard, drilldown, drilldown-item, filter, isAnyOf, summary-cards, kpi, one-way, filterModel, client-side
|
|
8450
8452
|
|
|
@@ -8538,7 +8540,7 @@ import { DataGrid } from '@redsift/table';
|
|
|
8538
8540
|
import { Flexbox } from '@redsift/design-system';
|
|
8539
8541
|
import { DataCard, DataRow } from '@redsift/dashboard';
|
|
8540
8542
|
import { mdiShapeOutline, mdiToggleSwitch, mdiFoodOff } from '@redsift/icons';
|
|
8541
|
-
import { GridFilterModel } from '@mui/x-data-grid-
|
|
8543
|
+
import { GridFilterModel } from '@mui/x-data-grid-premium';
|
|
8542
8544
|
import { rows } from '../_shared/data';
|
|
8543
8545
|
import { columns, CATEGORY_OPTIONS, ALLERGEN_OPTIONS } from '../_shared/columns';
|
|
8544
8546
|
import { CustomToolbar } from '../_shared/helpers';
|
|
@@ -8742,7 +8744,7 @@ export default () => {
|
|
|
8742
8744
|
## Cross-filtered Datagrid Page
|
|
8743
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.
|
|
8744
8746
|
**Components:** DataGrid, TextCell, DataCard, DataCard.Header, DataCard.Body, DataCard.Listbox, DataRow, Pill, Button, Flexbox, Text, Icon, IconButtonLink
|
|
8745
|
-
**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
|
|
8746
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.
|
|
8747
8749
|
**Tags:** table, datagrid, datacard, drilldown, drilldown-item, cross-filter, crossfilter, two-way, bidirectional, filter, isAnyOf, summary-cards, kpi, dashboard, filterModel, client-side
|
|
8748
8750
|
|
|
@@ -9016,7 +9018,7 @@ import { DataGrid } from '@redsift/table';
|
|
|
9016
9018
|
import { Flexbox } from '@redsift/design-system';
|
|
9017
9019
|
import { DataCard, DataRow } from '@redsift/dashboard';
|
|
9018
9020
|
import { mdiShapeOutline, mdiToggleSwitch, mdiFoodOff } from '@redsift/icons';
|
|
9019
|
-
import { GridFilterModel, GridSortModel } from '@mui/x-data-grid-
|
|
9021
|
+
import { GridFilterModel, GridSortModel } from '@mui/x-data-grid-premium';
|
|
9020
9022
|
import { Row } from '../_shared/data';
|
|
9021
9023
|
import { columns, CATEGORY_OPTIONS, ALLERGEN_OPTIONS } from '../_shared/columns';
|
|
9022
9024
|
import { fetchBakeryData, FetchResult } from '../_shared/api-client';
|
|
@@ -9291,9 +9293,9 @@ import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'
|
|
|
9291
9293
|
import { DataGrid } from '@redsift/table';
|
|
9292
9294
|
import { Flexbox } from '@redsift/design-system';
|
|
9293
9295
|
import { DataCard, DataRow } from '@redsift/dashboard';
|
|
9294
|
-
import { BarChart, PieChart } from '@redsift/charts';
|
|
9296
|
+
import { BarChart, PieChart, ArcDatum, BarDatum } from '@redsift/charts';
|
|
9295
9297
|
import { mdiShapeOutline, mdiToggleSwitch, mdiFoodOff } from '@redsift/icons';
|
|
9296
|
-
import { GridFilterModel, GridSortModel } from '@mui/x-data-grid-
|
|
9298
|
+
import { GridFilterModel, GridSortModel } from '@mui/x-data-grid-premium';
|
|
9297
9299
|
import { Row } from '../_shared/data';
|
|
9298
9300
|
import { columns, CATEGORY_OPTIONS, ALLERGEN_OPTIONS } from '../_shared/columns';
|
|
9299
9301
|
import { fetchBakeryData, FetchResult } from '../_shared/api-client';
|
|
@@ -9496,8 +9498,8 @@ export default () => {
|
|
|
9496
9498
|
}}
|
|
9497
9499
|
data={itemsChartData}
|
|
9498
9500
|
sliceRole="option"
|
|
9499
|
-
onSliceClick={(datum:
|
|
9500
|
-
const key = datum.data.key
|
|
9501
|
+
onSliceClick={(datum: ArcDatum) => {
|
|
9502
|
+
const key = datum.data.key;
|
|
9501
9503
|
setFilterModel((prev) => {
|
|
9502
9504
|
const selected = getSelectedFromFilterModel(prev, 'Items');
|
|
9503
9505
|
const next = selected.includes(key) ? selected.filter((v) => v !== key) : [...selected, key];
|
|
@@ -9505,8 +9507,8 @@ export default () => {
|
|
|
9505
9507
|
});
|
|
9506
9508
|
setPage(0);
|
|
9507
9509
|
}}
|
|
9508
|
-
isSliceSelected={(datum:
|
|
9509
|
-
itemsSelection.length === 0 || itemsSelection.includes(datum.data.key
|
|
9510
|
+
isSliceSelected={(datum: ArcDatum) =>
|
|
9511
|
+
itemsSelection.length === 0 || itemsSelection.includes(datum.data.key)
|
|
9510
9512
|
}
|
|
9511
9513
|
/>
|
|
9512
9514
|
|
|
@@ -9527,8 +9529,8 @@ export default () => {
|
|
|
9527
9529
|
barProps={{ gap: 20 }}
|
|
9528
9530
|
data={tagsChartData}
|
|
9529
9531
|
barRole="option"
|
|
9530
|
-
onBarClick={(datum:
|
|
9531
|
-
const key = datum.data.key
|
|
9532
|
+
onBarClick={(datum: BarDatum) => {
|
|
9533
|
+
const key = String(datum.data.key);
|
|
9532
9534
|
setFilterModel((prev) => {
|
|
9533
9535
|
const selected = getSelectedFromFilterModel(prev, 'Tags');
|
|
9534
9536
|
const next = selected.includes(key) ? selected.filter((v) => v !== key) : [...selected, key];
|
|
@@ -9536,8 +9538,8 @@ export default () => {
|
|
|
9536
9538
|
});
|
|
9537
9539
|
setPage(0);
|
|
9538
9540
|
}}
|
|
9539
|
-
isBarSelected={(datum:
|
|
9540
|
-
tagsSelection.length === 0 || tagsSelection.includes(datum.data.key
|
|
9541
|
+
isBarSelected={(datum: BarDatum) =>
|
|
9542
|
+
tagsSelection.length === 0 || tagsSelection.includes(String(datum.data.key))
|
|
9541
9543
|
}
|
|
9542
9544
|
/>
|
|
9543
9545
|
</Flexbox>
|
|
@@ -9715,7 +9717,7 @@ export default () => {
|
|
|
9715
9717
|
import React, { useCallback, useEffect, useRef, useState } from 'react';
|
|
9716
9718
|
import { DataGrid } from '@redsift/table';
|
|
9717
9719
|
import { Flexbox, Pill, Number, Text, Tabs, Tab } from '@redsift/design-system';
|
|
9718
|
-
import { GridFilterModel, GridSortModel } from '@mui/x-data-grid-
|
|
9720
|
+
import { GridFilterModel, GridSortModel } from '@mui/x-data-grid-premium';
|
|
9719
9721
|
import { Row } from '../_shared/data';
|
|
9720
9722
|
import { columns, CATEGORY_OPTIONS } from '../_shared/columns';
|
|
9721
9723
|
import { fetchBakeryData } from '../_shared/api-client';
|
package/data/docs/llms.txt
CHANGED
|
@@ -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
|
@@ -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
|
|
|
@@ -124,10 +124,10 @@ When **not** to use:
|
|
|
124
124
|
## State Management
|
|
125
125
|
|
|
126
126
|
<CodeBlock codeString={`import { useState } from 'react';
|
|
127
|
-
import {
|
|
127
|
+
import { GridRowSelectionModel } from '@mui/x-data-grid-premium';
|
|
128
128
|
|
|
129
129
|
// Selection state — tracks which rows are checked
|
|
130
|
-
const [selectionModel, setSelectionModel] = useState<
|
|
130
|
+
const [selectionModel, setSelectionModel] = useState<GridRowSelectionModel>([]);
|
|
131
131
|
|
|
132
132
|
// Page size — controlled if you need to persist it
|
|
133
133
|
// (DataGrid manages page/pageSize internally for client-side mode)
|
|
@@ -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<
|
|
188
|
-
5. **Render the DataGrid** — Pass `rows`, `columns`, `autoHeight`, `pagination`, `pageSize`, `rowsPerPageOptions`, `checkboxSelection`, `
|
|
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
|
|
|
@@ -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,
|
|
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[]>([]);
|
|
@@ -175,7 +175,7 @@ const [sortModel, setSortModel] = useState<GridSortModel>([]);
|
|
|
175
175
|
const [filterModel, setFilterModel] = useState<GridFilterModel>({ items: [] });
|
|
176
176
|
|
|
177
177
|
// Selection state
|
|
178
|
-
const [selectionModel, setSelectionModel] = useState<
|
|
178
|
+
const [selectionModel, setSelectionModel] = useState<GridRowSelectionModel>([]);
|
|
179
179
|
|
|
180
180
|
// Quick search
|
|
181
181
|
const [quickFilterText, setQuickFilterText] = useState('');
|
|
@@ -269,7 +269,7 @@ The fetch function rejects with an error. The component shows an error banner ab
|
|
|
269
269
|
6. **Wire the fetch effect** — Use `useEffect` to call your fetch function whenever `page`, `pageSize`, `sortModel`, `filterModel`, or `quickFilterText` changes.
|
|
270
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
|
|