@kanunilabs/datagrid-react 1.8.1 → 1.8.3

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.
Files changed (43) hide show
  1. package/dist/index.cjs +3 -3
  2. package/dist/index.d.cts +111 -14
  3. package/dist/index.d.ts +111 -14
  4. package/dist/index.js +3 -3
  5. package/dist/styles.css +411 -1
  6. package/dist/themes/all.css +108 -0
  7. package/dist/themes/amber.css +3 -0
  8. package/dist/themes/aubergine.css +3 -0
  9. package/dist/themes/azure.css +3 -0
  10. package/dist/themes/burgundy.css +3 -0
  11. package/dist/themes/charcoal.css +3 -0
  12. package/dist/themes/contrast-dark.css +3 -0
  13. package/dist/themes/contrast-light.css +3 -0
  14. package/dist/themes/coral.css +3 -0
  15. package/dist/themes/corporate.css +3 -0
  16. package/dist/themes/deep-sea.css +3 -0
  17. package/dist/themes/editorial.css +3 -0
  18. package/dist/themes/ember.css +3 -0
  19. package/dist/themes/emerald.css +3 -0
  20. package/dist/themes/forest.css +3 -0
  21. package/dist/themes/glacier.css +3 -0
  22. package/dist/themes/graphite.css +3 -0
  23. package/dist/themes/indigo-night.css +3 -0
  24. package/dist/themes/indigo.css +3 -0
  25. package/dist/themes/ivory.css +3 -0
  26. package/dist/themes/lagoon.css +3 -0
  27. package/dist/themes/linen.css +3 -0
  28. package/dist/themes/midnight.css +3 -0
  29. package/dist/themes/mist.css +3 -0
  30. package/dist/themes/monochrome.css +3 -0
  31. package/dist/themes/onyx.css +3 -0
  32. package/dist/themes/orchid.css +3 -0
  33. package/dist/themes/porcelain.css +3 -0
  34. package/dist/themes/rose.css +3 -0
  35. package/dist/themes/sandstone.css +3 -0
  36. package/dist/themes/slate-night.css +3 -0
  37. package/dist/themes/slate.css +3 -0
  38. package/dist/themes/steel.css +3 -0
  39. package/dist/themes/stone.css +3 -0
  40. package/dist/themes/taupe.css +3 -0
  41. package/dist/themes/teal.css +3 -0
  42. package/dist/themes/terminal.css +3 -0
  43. package/package.json +2 -2
package/dist/index.d.cts CHANGED
@@ -1,7 +1,7 @@
1
1
  import * as react from 'react';
2
2
  import { ReactNode, RefObject } from 'react';
3
- import { GridRowData, DataGridController, GridDataType, RowKey, LookupItem, GridDictionary, StateStoringConfig, RowNode, GridColumnDef, DataGridCoreConfig, FilterRenderContextBase, FilterNode, InferColumnsOptions, GridThemeName, GridPaletteName, DescribeFilterOptions, GridDensity, CardViewOptions, EditMode, RowChange, ColumnRuntime, ColumnLayout, SortDescriptor, ColumnModel, DataRowNode, ColSpanPlan, SummaryDef, ToolbarIconName, ColumnState, BusyPhase, VirtualWindow, ChartBoxSpec, ChartBoxModel, ChartSpec, ChartModel, ChartXYSpec, ChartXYModel, CellRange, RangeSelectionEngine, ColumnSelectMode, EditingEngine, ValidationRule, CrudHandlers, EditingPermissions, NewRowPosition, RowEditSession, LookupMatchMode } from '@kanunilabs/datagrid-core';
4
- export { BusyChangedEvent, BusyPhase, ClientRowModel, ColumnLayout, ColumnLookup, ColumnModel, ColumnPin, ColumnRuntime, ColumnState, ColumnStateChangedEvent, ContentReadyEvent, CustomFilterOperator, CustomFilterOperatorId, DEFAULT_ROW_HEIGHT, DENSITY_ROW_HEIGHT, DataGridController, DataGridCoreConfig, DataRowNode, DataSource, FilterChangedEvent, FilterCondition, FilterGroupNode, FilterNode, FilterOperator, FocusedRowChangedEvent, GRID_COLOR_SCHEMES, GRID_PALETTES, GRID_THEMES, GridColorScheme, GridColumnDef, GridDataType, GridDensity, GridEventMap, GridPalette, GridPaletteName, GridRowData, GridStateStore, GridTheme, GridThemeName, GridViewState, GroupRowNode, GroupingConfig, HeaderBandCell, InferColumnsOptions, LoadOptions, LoadResult, LookupItem, NewRowPosition, RowDropPosition, RowKey, RowNode, SUMMARY_TYPE_LABEL, ScrollingConfig, SelectionDescriptor, SortChangedEvent, SortDescriptor, SortDirection, StateStoringConfig, SummaryDef, SummaryType, THEME_ROW_HEIGHT, ViewportChangedEvent, VirtualWindow, VirtualWindowEngine, allowedSummaryTypes, andFilters, attachStateStoring, bandDepth, bandPath, computeColumnLayout, computeHeaderBands, createRestDataSource, describeFilter, downloadBlob, fillText, filterInputFromNode, formatSummaryValue, humanizeField, importCsv, inferColumns, isDataRow, isDataSource, isFilterGroup, isGroupRow, isPackagedTheme, lookupLabel, moveRowInArray, parseCsv, parseFilterInput, sniffDelimiter, summaryKey, summaryLabel, summaryTypeLabels, themeClassName } from '@kanunilabs/datagrid-core';
3
+ import { GridRowData, DataGridController, GridDataType, RowKey, LookupItem, GridDictionary, StateStoringConfig, RowNode, GridColumnDef, DataGridCoreConfig, FilterRenderContextBase, FilterNode, InferColumnsOptions, GridThemeName, GridPaletteName, DescribeFilterOptions, GridDensity, ToolbarOptions, PortalContainer, CardViewOptions, EditMode, RowChange, RowStatusSource, ColumnRuntime, ColumnLayout, SortDescriptor, ColumnModel, RowSaveStatus, DataRowNode, ColSpanPlan, SummaryDef, RemoteDistinctList, ToolbarSearchOptions, ToolbarIconName, ColumnState, BusyPhase, VirtualWindow, ChartBoxSpec, ChartBoxModel, ChartSpec, ChartModel, ChartXYSpec, ChartXYModel, CellRange, RangeSelectionEngine, ColumnSelectMode, EditingEngine, ValidationRule, CrudHandlers, EditingPermissions, NewRowPosition, RowEditSession, LookupMatchMode } from '@kanunilabs/datagrid-core';
4
+ export { BusyChangedEvent, BusyPhase, ClientRowModel, ColumnLayout, ColumnLookup, ColumnModel, ColumnPin, ColumnRuntime, ColumnState, ColumnStateChangedEvent, ContentReadyEvent, CustomFilterOperator, CustomFilterOperatorId, DEFAULT_ROW_HEIGHT, DENSITY_ROW_HEIGHT, DataGridController, DataGridCoreConfig, DataRowNode, DataSource, FilterChangedEvent, FilterCondition, FilterGroupNode, FilterNode, FilterOperator, FocusedRowChangedEvent, GRID_COLOR_SCHEMES, GRID_PALETTES, GRID_THEMES, GridColorScheme, GridColumnDef, GridDataType, GridDensity, GridEventMap, GridPalette, GridPaletteName, GridRowData, GridStateStore, GridTheme, GridThemeName, GridViewState, GroupRowNode, GroupingConfig, HeaderBandCell, InferColumnsOptions, LoadOptions, LoadResult, LookupItem, NewRowPosition, PortalContainer, RowDropPosition, RowKey, RowNode, SUMMARY_TYPE_LABEL, ScrollingConfig, SelectionDescriptor, SortChangedEvent, SortDescriptor, SortDirection, StateStoringConfig, SummaryDef, SummaryType, THEME_ROW_HEIGHT, ToolbarOptions, ToolbarSearchOptions, ViewportChangedEvent, VirtualWindow, VirtualWindowEngine, allowedSummaryTypes, andFilters, attachStateStoring, bandDepth, bandPath, computeColumnLayout, computeHeaderBands, createRestDataSource, describeFilter, downloadBlob, fillText, filterInputFromNode, formatSummaryValue, humanizeField, importCsv, inferColumns, isDataRow, isDataSource, isFilterGroup, isGroupRow, isPackagedTheme, lookupLabel, moveRowInArray, parseCsv, parseFilterInput, sniffDelimiter, summaryKey, summaryLabel, summaryTypeLabels, themeClassName } from '@kanunilabs/datagrid-core';
5
5
 
6
6
  /** Formats an export menu can offer. */
7
7
  type ExportKind = 'csv' | 'excel' | 'excel-selected' | 'pdf';
@@ -744,8 +744,29 @@ interface DataGridProps<TRow = GridRowData> extends Omit<DataGridCoreConfig<TRow
744
744
  * supports. `false` makes the footer read-only.
745
745
  */
746
746
  footerMenu?: boolean;
747
- /** Toolbar with search, column chooser and export. */
748
- toolbar?: boolean;
747
+ /**
748
+ * Toolbar with search, column chooser and export. `true` shows all of it;
749
+ * an object picks the parts and sets the search box up:
750
+ *
751
+ * toolbar={{ export: false, columns: false,
752
+ * search: { maxLength: 100, debounce: 300, validate } }}
753
+ *
754
+ * Your own buttons: `toolbarItemsBefore` (start) and `toolbarItemsAfter`
755
+ * (end), e.g. `<GridToolbarButton>`.
756
+ */
757
+ toolbar?: boolean | ToolbarOptions;
758
+ /**
759
+ * Where the grid draws its popups (header filter, menus, date and lookup
760
+ * lists, dialogs): an element, or a function returning one. Default
761
+ * `document.body`.
762
+ *
763
+ * Set it when the grid sits in a modal (Radix Dialog and the like): the
764
+ * modal makes the rest of the page ignore the pointer, so a popup on <body>
765
+ * cannot be clicked. Pass the modal's content element (one without
766
+ * `overflow: hidden`). Popups stay in place even when the modal is moved
767
+ * with a CSS transform. Every popup carries `data-kanuni-portal`.
768
+ */
769
+ portalContainer?: PortalContainer;
749
770
  /**
750
771
  * The toolbar's Columns button — the popup listing HIDDEN columns. Default
751
772
  * true. The Enterprise wrapper turns it off when the side bar's Columns
@@ -950,6 +971,12 @@ interface DataGridProps<TRow = GridRowData> extends Omit<DataGridCoreConfig<TRow
950
971
  renderCellContent?: (ctx: CellSlotContext<TRow>) => ReactNode | undefined;
951
972
  /** Extra class names per cell (dirty marker, range highlight, invalid). */
952
973
  getCellClassName?: (ctx: CellSlotContext<TRow>) => string | undefined;
974
+ /**
975
+ * Where `rowStatus` reads each row's save state — `EnterpriseDataGrid`'s
976
+ * editing engine. With this grid's own `editing` on, its engine answers and
977
+ * this is not asked.
978
+ */
979
+ rowStatusSource?: RowStatusSource | null;
953
980
  /** Absolutely-positioned layer over the viewport (fill handle, watermark). */
954
981
  renderOverlay?: () => ReactNode;
955
982
  /** Pointer down on a cell, with the view coordinates the range engine needs. */
@@ -1037,6 +1064,8 @@ interface GridHeaderProps<TRow = GridRowData> {
1037
1064
  /** Leading expander column for master-detail (Enterprise). */
1038
1065
  detailColumn?: boolean;
1039
1066
  /** Leading row-number column (gap analysis P3.5). */
1067
+ /** `rowStatus.icons`: the leading status column is showing. */
1068
+ statusColumn?: boolean;
1040
1069
  rowNumberColumn?: boolean;
1041
1070
  /** What the row-number column's header shows. Defaults to `#`. */
1042
1071
  rowNumberHeader?: React.ReactNode;
@@ -1084,7 +1113,7 @@ interface GridHeaderProps<TRow = GridRowData> {
1084
1113
  /** Replace a header's label (the Enterprise rename box, G-CORE-06). Undefined = the label. */
1085
1114
  renderHeaderLabel?: (columnId: string) => React.ReactNode | undefined;
1086
1115
  }
1087
- declare function GridHeaderImpl<TRow = GridRowData>({ bandOffset, stickyInsets, layout, centerColumns, leadingSpacer, trailingSpacer, sort, sortable, onSort, headerFilter, filteredColumns, onOpenFilter, filterIconMode, checkboxColumn, detailColumn, rowNumberColumn, rowNumberHeader, selectAllState, selectAllDisabled, onToggleSelectAll, draggable, reorderable, onReorder, resizable, onResize, onAutoFit, onHeaderContextMenu, groupLevels, onHeaderClick, getHeaderClassName, renderHeaderLabel, }: GridHeaderProps<TRow>): react.JSX.Element;
1116
+ declare function GridHeaderImpl<TRow = GridRowData>({ bandOffset, stickyInsets, layout, centerColumns, leadingSpacer, trailingSpacer, sort, sortable, onSort, headerFilter, filteredColumns, onOpenFilter, filterIconMode, checkboxColumn, detailColumn, statusColumn, rowNumberColumn, rowNumberHeader, selectAllState, selectAllDisabled, onToggleSelectAll, draggable, reorderable, onReorder, resizable, onResize, onAutoFit, onHeaderContextMenu, groupLevels, onHeaderClick, getHeaderClassName, renderHeaderLabel, }: GridHeaderProps<TRow>): react.JSX.Element;
1088
1117
  declare const GridHeader: typeof GridHeaderImpl;
1089
1118
 
1090
1119
  /**
@@ -1104,6 +1133,8 @@ interface GridHeaderBandsProps<TRow = GridRowData> {
1104
1133
  checkboxColumn?: boolean;
1105
1134
  detailColumn?: boolean;
1106
1135
  /** Leading row-number column (gap analysis P3.5). */
1136
+ /** `rowStatus.icons`: the leading status column is showing. */
1137
+ statusColumn?: boolean;
1107
1138
  rowNumberColumn?: boolean;
1108
1139
  /** Height of one band row, in px. Defaults to `BAND_ROW_HEIGHT`. */
1109
1140
  rowHeight?: number;
@@ -1123,7 +1154,7 @@ interface GridHeaderBandsProps<TRow = GridRowData> {
1123
1154
  };
1124
1155
  };
1125
1156
  }
1126
- declare function GridHeaderBandsImpl<TRow = GridRowData>({ layout, centerColumns, leadingSpacer, trailingSpacer, depth, checkboxColumn, detailColumn, rowNumberColumn, rowHeight, bandFold, }: GridHeaderBandsProps<TRow>): react.JSX.Element | null;
1157
+ declare function GridHeaderBandsImpl<TRow = GridRowData>({ layout, centerColumns, leadingSpacer, trailingSpacer, depth, checkboxColumn, detailColumn, statusColumn, rowNumberColumn, rowHeight, bandFold, }: GridHeaderBandsProps<TRow>): react.JSX.Element | null;
1127
1158
  declare const GridHeaderBands: typeof GridHeaderBandsImpl;
1128
1159
 
1129
1160
  interface GridRowProps<TRow = GridRowData> {
@@ -1199,6 +1230,19 @@ interface GridRowProps<TRow = GridRowData> {
1199
1230
  rowDrag?: RowDragHandlers;
1200
1231
  /** Which edge to draw the drop line on, or null. */
1201
1232
  dropSide?: 'before' | 'after' | null;
1233
+ /**
1234
+ * `rowStatus.messages`: the content of a message row (a refused save's
1235
+ * reason and its buttons), for the parent row's key.
1236
+ */
1237
+ renderRowMessage?: (rowKey: RowKey, row: TRow) => React.ReactNode;
1238
+ /** `rowStatus.icons`: the leading status column is showing. */
1239
+ statusColumn?: boolean;
1240
+ /** `rowStatus`: this row's save state, when it has one. */
1241
+ rowStatus?: RowSaveStatus;
1242
+ /** The words a screen reader hears for `rowStatus` (`aria-description`). */
1243
+ rowStatusText?: string;
1244
+ /** `rowStatus.tint`: wash the whole row, not only the marker. */
1245
+ rowStatusTint?: boolean;
1202
1246
  /** Renders the leading checkbox cell. */
1203
1247
  checkboxColumn: boolean;
1204
1248
  /** Renders the leading row-number cell (gap analysis P3.5). */
@@ -1326,7 +1370,7 @@ interface GridRowProps<TRow = GridRowData> {
1326
1370
  onCellPointerEnter?: (ctx: CellSlotContext<TRow>, event: React.MouseEvent) => void;
1327
1371
  onCellDoubleClick?: (ctx: CellSlotContext<TRow>) => void;
1328
1372
  }
1329
- declare function GridRowImpl<TRow = GridRowData>({ gridId, node, index, layout, columnModel, centerColumns, centerIndices, stickyInsets, leadingSpacer, trailingSpacer, striped, selected, ariaSelectable, selectable, groupSelection, onToggleGroupSelect, groupDisplay, focusedColumnId, rowFocused, renderRow, checkboxColumn, rowNumberColumn, rowNumber, getNote, getSpan, resolveColSpans, findKind, headerRowCount, onRowClick, onRowMouseDown, onRowDoubleClick, onToggleSelect, onCellMouseDown, onRowContextMenu, searchNeedle, onToggleGroup, summaryDefs, detailColumn, detailExpanded, onToggleDetail, onToggleTreeRow, renderDetail, renderEditForm, renderCellContent, getCellClassName, onCellPointerDown, onCellPointerEnter, onCellDoubleClick, rowDrag, dropSide, height, }: GridRowProps<TRow>): react.JSX.Element | null;
1373
+ declare function GridRowImpl<TRow = GridRowData>({ gridId, node, index, layout, columnModel, centerColumns, centerIndices, stickyInsets, leadingSpacer, trailingSpacer, striped, selected, ariaSelectable, selectable, groupSelection, onToggleGroupSelect, groupDisplay, focusedColumnId, rowFocused, renderRow, checkboxColumn, statusColumn, rowNumberColumn, rowNumber, getNote, getSpan, resolveColSpans, findKind, headerRowCount, onRowClick, onRowMouseDown, onRowDoubleClick, onToggleSelect, onCellMouseDown, onRowContextMenu, searchNeedle, onToggleGroup, summaryDefs, detailColumn, detailExpanded, onToggleDetail, onToggleTreeRow, renderDetail, renderEditForm, renderRowMessage, renderCellContent, getCellClassName, onCellPointerDown, onCellPointerEnter, onCellDoubleClick, rowDrag, dropSide, rowStatus, rowStatusText, rowStatusTint, height, }: GridRowProps<TRow>): react.JSX.Element | null;
1330
1374
  declare const GridRow: typeof GridRowImpl;
1331
1375
 
1332
1376
  interface GridFilterRowProps<TRow = GridRowData> {
@@ -1353,6 +1397,8 @@ interface GridFilterRowProps<TRow = GridRowData> {
1353
1397
  checkboxColumn?: boolean;
1354
1398
  detailColumn?: boolean;
1355
1399
  /** Leading row-number column (gap analysis P3.5). */
1400
+ /** `rowStatus.icons`: the leading status column is showing. */
1401
+ statusColumn?: boolean;
1356
1402
  rowNumberColumn?: boolean;
1357
1403
  placeholder?: string;
1358
1404
  onChange: (columnId: string, raw: string) => void;
@@ -1417,7 +1463,7 @@ interface FilterInputSyncProbe {
1417
1463
  * re-render entirely.
1418
1464
  */
1419
1465
  declare function reconcileFilterInputs(prev: Record<string, string>, probe: FilterInputSyncProbe, columnIds?: readonly string[]): Record<string, string>;
1420
- declare function GridFilterRowImpl<TRow = GridRowData>({ bandOffset, stickyInsets, layout, centerColumns, leadingSpacer, trailingSpacer, values, checkboxColumn, detailColumn, rowNumberColumn, placeholder, onChange, onCommit, periodSuggestions, periodListId, operators, onOperatorChange, renderCustom, }: GridFilterRowProps<TRow>): react.JSX.Element;
1466
+ declare function GridFilterRowImpl<TRow = GridRowData>({ bandOffset, stickyInsets, layout, centerColumns, leadingSpacer, trailingSpacer, values, checkboxColumn, detailColumn, statusColumn, rowNumberColumn, placeholder, onChange, onCommit, periodSuggestions, periodListId, operators, onOperatorChange, renderCustom, }: GridFilterRowProps<TRow>): react.JSX.Element;
1421
1467
  declare const GridFilterRow: typeof GridFilterRowImpl;
1422
1468
 
1423
1469
  interface DistinctEntry {
@@ -1471,9 +1517,16 @@ interface GridHeaderFilterPopupProps {
1471
1517
  * matched nothing even though the value exists.
1472
1518
  */
1473
1519
  onSearch?: (needle: string) => void;
1520
+ /**
1521
+ * A server-side list, loaded in pieces (see `RemoteDistinctList`). When set,
1522
+ * the popup draws THAT instead of `entries`: the scroll bar is as long as the
1523
+ * server's list, the search box searches on the server, and Select all /
1524
+ * Clear / ticks are the pager's ("everything except these").
1525
+ */
1526
+ pager?: RemoteDistinctList;
1474
1527
  labels?: Partial<Record<'search' | 'selectAll' | 'clear' | 'apply' | 'cancel' | 'blank' | 'noMatch' | 'loading' | 'truncated', string>>;
1475
1528
  }
1476
- declare function GridHeaderFilterPopup({ gridId, columnId, headerLabel, entries, initialSelected, anchor, loading, dark, onApply, onClose, truncated, onSearch, labels, }: GridHeaderFilterPopupProps): react.JSX.Element;
1529
+ declare function GridHeaderFilterPopup({ gridId, columnId, headerLabel, entries, initialSelected, anchor, loading, dark, onApply, onClose, truncated, onSearch, pager, labels, }: GridHeaderFilterPopupProps): react.JSX.Element;
1477
1530
 
1478
1531
  interface GridContextMenuProps<TContext> {
1479
1532
  x: number;
@@ -1530,6 +1583,8 @@ interface GridFooterRowProps<TRow = GridRowData> {
1530
1583
  checkboxColumn?: boolean;
1531
1584
  detailColumn?: boolean;
1532
1585
  /** Leading row-number column (gap analysis P3.5). */
1586
+ /** `rowStatus.icons`: the leading status column is showing. */
1587
+ statusColumn?: boolean;
1533
1588
  rowNumberColumn?: boolean;
1534
1589
  /** Opens the aggregation menu for a column. */
1535
1590
  onPickSummary?: (columnId: string, event: React.MouseEvent) => void;
@@ -1546,7 +1601,7 @@ interface GridFooterRowProps<TRow = GridRowData> {
1546
1601
  /** Header-height rows between this row and its edge. See GridPinnedRows. */
1547
1602
  headerRowsBetween?: number;
1548
1603
  }
1549
- declare function GridFooterRowImpl<TRow = GridRowData>({ layout, centerColumns, leadingSpacer, trailingSpacer, defs, values, checkboxColumn, detailColumn, rowNumberColumn, onPickSummary, emptyHint, position, bandOffset, headerRowsBetween, }: GridFooterRowProps<TRow>): react.JSX.Element;
1604
+ declare function GridFooterRowImpl<TRow = GridRowData>({ layout, centerColumns, leadingSpacer, trailingSpacer, defs, values, checkboxColumn, detailColumn, statusColumn, rowNumberColumn, onPickSummary, emptyHint, position, bandOffset, headerRowsBetween, }: GridFooterRowProps<TRow>): react.JSX.Element;
1550
1605
  declare const GridFooterRow: typeof GridFooterRowImpl;
1551
1606
 
1552
1607
  interface GridFilterPanelProps<TRow = GridRowData> {
@@ -1603,9 +1658,16 @@ interface GridToolbarProps<TRow = GridRowData> {
1603
1658
  itemsAfter?: React.ReactNode;
1604
1659
  /** Milliseconds to wait after the last keystroke. Default 200. */
1605
1660
  searchDebounce?: number;
1661
+ /**
1662
+ * The search box's settings (`toolbar={{ search: {...} }}`): placeholder,
1663
+ * maxLength, debounce (wins over `searchDebounce`), applyOnBlur, validate.
1664
+ */
1665
+ searchOptions?: ToolbarSearchOptions;
1666
+ /** The export menu. Default true; false leaves it out whatever the formats. */
1667
+ exportMenu?: boolean;
1606
1668
  labels?: Partial<Record<'search' | 'csv' | 'excel' | 'excelSelected' | 'pdf' | 'columns' | 'exporting' | 'exportMenu', string>>;
1607
1669
  }
1608
- declare function GridToolbarImpl<TRow = GridRowData>({ controller, search, exportCsv, exportExcel, exportPdf, columnChooser, dark, onOpenColumnChooser, itemsBefore, itemsAfter, searchDebounce, labels, }: GridToolbarProps<TRow>): react.JSX.Element;
1670
+ declare function GridToolbarImpl<TRow = GridRowData>({ controller, search, exportCsv, exportExcel, exportPdf, columnChooser, dark, onOpenColumnChooser, itemsBefore, itemsAfter, searchDebounce, searchOptions, exportMenu, labels, }: GridToolbarProps<TRow>): react.JSX.Element;
1609
1671
  declare const GridToolbar: typeof GridToolbarImpl;
1610
1672
 
1611
1673
  /** A command button's icon — the shared paths of `toolbarIcons.ts` (see there for why). */
@@ -1614,6 +1676,26 @@ declare function ToolbarIcon({ name, size }: {
1614
1676
  size?: number;
1615
1677
  }): react.JSX.Element;
1616
1678
 
1679
+ interface GridToolbarButtonProps {
1680
+ /** The glyph, e.g. an inline SVG or `<ToolbarIcon name="columns" />`. */
1681
+ icon: ReactNode;
1682
+ /** The button's name: its accessible name and the start of its tooltip. */
1683
+ label: string;
1684
+ /** Keyboard shortcut shown in the tooltip ("Export (Ctrl+E)") and as `aria-keyshortcuts`. */
1685
+ shortcut?: string;
1686
+ /**
1687
+ * Set while the button cannot be used: it reads as unavailable, ignores
1688
+ * clicks, and the tooltip and screen reader give this reason.
1689
+ */
1690
+ disabledReason?: string;
1691
+ /** Show the label beside the icon. Default false (icon only). */
1692
+ showLabel?: boolean;
1693
+ onClick?: () => void;
1694
+ /** `data-testid` on the button. */
1695
+ testId?: string;
1696
+ }
1697
+ declare function GridToolbarButton({ icon, label, shortcut, disabledReason, showLabel, onClick, testId, }: GridToolbarButtonProps): react.JSX.Element;
1698
+
1617
1699
  interface GridColumnChooserProps<TRow = GridRowData> {
1618
1700
  controller: DataGridController<TRow>;
1619
1701
  /** Passed in so the panel re-renders when visibility changes. */
@@ -1884,6 +1966,8 @@ interface GridPinnedRowsProps<TRow = GridRowData> {
1884
1966
  checkboxColumn?: boolean;
1885
1967
  detailColumn?: boolean;
1886
1968
  /** Leading row-number column (gap analysis P3.5). */
1969
+ /** `rowStatus.icons`: the leading status column is showing. */
1970
+ statusColumn?: boolean;
1887
1971
  rowNumberColumn?: boolean;
1888
1972
  rowHeight: number;
1889
1973
  /** Pixels of BAND rows above. Zero on a grid without column bands. */
@@ -1908,7 +1992,7 @@ interface GridPinnedRowsProps<TRow = GridRowData> {
1908
1992
  */
1909
1993
  ariaRowBase: number;
1910
1994
  }
1911
- declare function GridPinnedRowsImpl<TRow = GridRowData>({ gridId, side, rows, rowKeys, onUserRowContextMenu, layout, columnModel, centerColumns, centerIndices, stickyInsets, leadingSpacer, trailingSpacer, checkboxColumn, detailColumn, rowNumberColumn, rowHeight, bandOffset, headerRowsBetween, ariaRowBase, }: GridPinnedRowsProps<TRow>): react.JSX.Element | null;
1995
+ declare function GridPinnedRowsImpl<TRow = GridRowData>({ gridId, side, rows, rowKeys, onUserRowContextMenu, layout, columnModel, centerColumns, centerIndices, stickyInsets, leadingSpacer, trailingSpacer, checkboxColumn, detailColumn, statusColumn, rowNumberColumn, rowHeight, bandOffset, headerRowsBetween, ariaRowBase, }: GridPinnedRowsProps<TRow>): react.JSX.Element | null;
1912
1996
  declare const GridPinnedRows: typeof GridPinnedRowsImpl;
1913
1997
 
1914
1998
  type UseDataGridOptions<TRow = GridRowData> = DataGridCoreConfig<TRow>;
@@ -1983,9 +2067,16 @@ interface GridSurfaceProviderProps {
1983
2067
  theme?: GridThemeName;
1984
2068
  density?: GridDensity;
1985
2069
  palette?: GridPaletteName;
2070
+ /** Where popups are drawn (the grid's `portalContainer`). Default <body>. */
2071
+ portalContainer?: PortalContainer;
1986
2072
  children: ReactNode;
1987
2073
  }
1988
- declare function GridSurfaceProvider({ theme, density, palette, children, }: GridSurfaceProviderProps): react.JSX.Element;
2074
+ declare function GridSurfaceProvider({ theme, density, palette, portalContainer, children, }: GridSurfaceProviderProps): react.JSX.Element;
2075
+ /**
2076
+ * The element a popup is portalled into, read when the popup opens: <body>,
2077
+ * or the host inside the grid's `portalContainer` (core `portalTarget`).
2078
+ */
2079
+ declare function useGridPortalTarget(): () => HTMLElement;
1989
2080
  /**
1990
2081
  * The theme + density modifier classes for a surface rendered outside the grid.
1991
2082
  * `''` when the grid is unthemed, so appending it is always safe.
@@ -2052,6 +2143,12 @@ interface UseGridEditingOptions<TRow = GridRowData> {
2052
2143
  confirmDeleteMessage?: string;
2053
2144
  /** Disables editing entirely (`editing={{ enabled: false }}`). */
2054
2145
  enabled?: boolean;
2146
+ /**
2147
+ * How long a row reads `'saved'` after its save (`engine.getRowStatus`),
2148
+ * in ms; 0 never shows it. Left out, the engine's default (1500) stays.
2149
+ * The grids pass `rowStatus.savedDuration`, or 0 when `rowStatus` is off.
2150
+ */
2151
+ savedDuration?: number;
2055
2152
  /**
2056
2153
  * `editing.range` — the rectangle, the fill handle and the clipboard
2057
2154
  * gestures (cut / paste). Default true. Off means Ctrl+X and Ctrl+V are left
@@ -2411,4 +2508,4 @@ interface GridDialogProps {
2411
2508
  }
2412
2509
  declare function GridDialog({ open, title, message, cancelLabel, confirmLabel, danger, dark, onConfirm, onCancel, }: GridDialogProps): react.ReactPortal | null;
2413
2510
 
2414
- export { type AlignedGridsApi, BAND_ROW_HEIGHT, type BatchSaveError, type CellMenuOptions, type CellRenderContext, type CellSlotContext, type CellTooltipOptions, DEFAULT_EDIT_FORM_LABELS, DEFAULT_HEADER_MENU_LABELS, DataGrid, type DataGridProps, type DistinctEntry, type EditFormField, type EditFormLabels, type EditModes, type EditorRenderContext, type ExportOutcome, type FilterRenderContext, GridCellEditor, type GridCellEditorProps, GridColumnChooser, type GridColumnChooserProps, GridContextMenu, type GridContextMenuProps, GridDateEditor, type GridDateEditorProps, GridDialog, type GridDialogProps, GridEditForm, type GridEditFormProps, GridFilterPanel, type GridFilterPanelProps, GridFilterRow, type GridFilterRowProps, GridFooterRow, type GridFooterRowProps, GridGroupPanel, type GridGroupPanelProps, GridHeader, GridHeaderBands, type GridHeaderBandsProps, GridHeaderFilterPopup, type GridHeaderFilterPopupProps, type GridHeaderProps, GridLoadingOverlay, type GridLoadingOverlayProps, GridLookupEditor, type GridLookupEditorProps, type GridMenuItem, GridNoteEditor, type GridNotesConfig, GridPager, type GridPagerProps, GridPinnedRows, type GridPinnedRowsProps, GridPopupPanel, type GridPopupPanelProps, GridPortal, type GridPortalProps, GridRow, GridRowEditor, type GridRowEditorProps, type GridRowProps, GridSummaryBar, type GridSummaryBarProps, GridSurfaceProvider, type GridSurfaceProviderProps, GridTextProvider, type GridTextProviderProps, GridToolbar, type GridToolbarProps, GridTooltip, type GridTooltipConfig, type GridTooltipProps, type HeaderMenuContext, type HeaderMenuDeps, type HeaderMenuLabels, type HeaderRenderContext, type NoteCellContext, PRINT_MAX_ROWS, type PendingDelete, type PrintLayoutOptions, type PrintLayoutState, ROW_DRAG_MIME, type RangeApi, type ReactColumnRuntime, type ReactGridColumnDef, type RowDragConfig, type RowDragHandlers, type RowDragPayload, type RowDropEvent, type RowLookupMap, type RowMenuContext, type RowReorderEvent, type RowTemplateContext, SHORTCUT_COPY, SHORTCUT_CUT, SHORTCUT_PASTE, type SelectionStats, ToolbarIcon, type TooltipState, type UseDataGridOptions, type UseDataGridResult, type UseEditModesOptions, type UseGridEditingOptions, type UseGridEditingResult, buildCellMenuItems, buildHeaderMenu, copyToClipboard, editFormColumnIds, editFormLabels, headerMenuLabels, matchOptions, measureBestFitWidth, reconcileFilterInputs, runGridExport, useAlignedGrids, useAnchoredPopup, useCellTooltip, useDataGrid, useEditModes, useGridChartBoxData, useGridChartData, useGridChartXYData, useGridEditing, useGridSurfaceClass, useGridText, usePrintLayout, useRowDrag, useStateStoring, writeClipboardText };
2511
+ export { type AlignedGridsApi, BAND_ROW_HEIGHT, type BatchSaveError, type CellMenuOptions, type CellRenderContext, type CellSlotContext, type CellTooltipOptions, DEFAULT_EDIT_FORM_LABELS, DEFAULT_HEADER_MENU_LABELS, DataGrid, type DataGridProps, type DistinctEntry, type EditFormField, type EditFormLabels, type EditModes, type EditorRenderContext, type ExportOutcome, type FilterRenderContext, GridCellEditor, type GridCellEditorProps, GridColumnChooser, type GridColumnChooserProps, GridContextMenu, type GridContextMenuProps, GridDateEditor, type GridDateEditorProps, GridDialog, type GridDialogProps, GridEditForm, type GridEditFormProps, GridFilterPanel, type GridFilterPanelProps, GridFilterRow, type GridFilterRowProps, GridFooterRow, type GridFooterRowProps, GridGroupPanel, type GridGroupPanelProps, GridHeader, GridHeaderBands, type GridHeaderBandsProps, GridHeaderFilterPopup, type GridHeaderFilterPopupProps, type GridHeaderProps, GridLoadingOverlay, type GridLoadingOverlayProps, GridLookupEditor, type GridLookupEditorProps, type GridMenuItem, GridNoteEditor, type GridNotesConfig, GridPager, type GridPagerProps, GridPinnedRows, type GridPinnedRowsProps, GridPopupPanel, type GridPopupPanelProps, GridPortal, type GridPortalProps, GridRow, GridRowEditor, type GridRowEditorProps, type GridRowProps, GridSummaryBar, type GridSummaryBarProps, GridSurfaceProvider, type GridSurfaceProviderProps, GridTextProvider, type GridTextProviderProps, GridToolbar, GridToolbarButton, type GridToolbarButtonProps, type GridToolbarProps, GridTooltip, type GridTooltipConfig, type GridTooltipProps, type HeaderMenuContext, type HeaderMenuDeps, type HeaderMenuLabels, type HeaderRenderContext, type NoteCellContext, PRINT_MAX_ROWS, type PendingDelete, type PrintLayoutOptions, type PrintLayoutState, ROW_DRAG_MIME, type RangeApi, type ReactColumnRuntime, type ReactGridColumnDef, type RowDragConfig, type RowDragHandlers, type RowDragPayload, type RowDropEvent, type RowLookupMap, type RowMenuContext, type RowReorderEvent, type RowTemplateContext, SHORTCUT_COPY, SHORTCUT_CUT, SHORTCUT_PASTE, type SelectionStats, ToolbarIcon, type TooltipState, type UseDataGridOptions, type UseDataGridResult, type UseEditModesOptions, type UseGridEditingOptions, type UseGridEditingResult, buildCellMenuItems, buildHeaderMenu, copyToClipboard, editFormColumnIds, editFormLabels, headerMenuLabels, matchOptions, measureBestFitWidth, reconcileFilterInputs, runGridExport, useAlignedGrids, useAnchoredPopup, useCellTooltip, useDataGrid, useEditModes, useGridChartBoxData, useGridChartData, useGridChartXYData, useGridEditing, useGridPortalTarget, useGridSurfaceClass, useGridText, usePrintLayout, useRowDrag, useStateStoring, writeClipboardText };
package/dist/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import * as react from 'react';
2
2
  import { ReactNode, RefObject } from 'react';
3
- import { GridRowData, DataGridController, GridDataType, RowKey, LookupItem, GridDictionary, StateStoringConfig, RowNode, GridColumnDef, DataGridCoreConfig, FilterRenderContextBase, FilterNode, InferColumnsOptions, GridThemeName, GridPaletteName, DescribeFilterOptions, GridDensity, CardViewOptions, EditMode, RowChange, ColumnRuntime, ColumnLayout, SortDescriptor, ColumnModel, DataRowNode, ColSpanPlan, SummaryDef, ToolbarIconName, ColumnState, BusyPhase, VirtualWindow, ChartBoxSpec, ChartBoxModel, ChartSpec, ChartModel, ChartXYSpec, ChartXYModel, CellRange, RangeSelectionEngine, ColumnSelectMode, EditingEngine, ValidationRule, CrudHandlers, EditingPermissions, NewRowPosition, RowEditSession, LookupMatchMode } from '@kanunilabs/datagrid-core';
4
- export { BusyChangedEvent, BusyPhase, ClientRowModel, ColumnLayout, ColumnLookup, ColumnModel, ColumnPin, ColumnRuntime, ColumnState, ColumnStateChangedEvent, ContentReadyEvent, CustomFilterOperator, CustomFilterOperatorId, DEFAULT_ROW_HEIGHT, DENSITY_ROW_HEIGHT, DataGridController, DataGridCoreConfig, DataRowNode, DataSource, FilterChangedEvent, FilterCondition, FilterGroupNode, FilterNode, FilterOperator, FocusedRowChangedEvent, GRID_COLOR_SCHEMES, GRID_PALETTES, GRID_THEMES, GridColorScheme, GridColumnDef, GridDataType, GridDensity, GridEventMap, GridPalette, GridPaletteName, GridRowData, GridStateStore, GridTheme, GridThemeName, GridViewState, GroupRowNode, GroupingConfig, HeaderBandCell, InferColumnsOptions, LoadOptions, LoadResult, LookupItem, NewRowPosition, RowDropPosition, RowKey, RowNode, SUMMARY_TYPE_LABEL, ScrollingConfig, SelectionDescriptor, SortChangedEvent, SortDescriptor, SortDirection, StateStoringConfig, SummaryDef, SummaryType, THEME_ROW_HEIGHT, ViewportChangedEvent, VirtualWindow, VirtualWindowEngine, allowedSummaryTypes, andFilters, attachStateStoring, bandDepth, bandPath, computeColumnLayout, computeHeaderBands, createRestDataSource, describeFilter, downloadBlob, fillText, filterInputFromNode, formatSummaryValue, humanizeField, importCsv, inferColumns, isDataRow, isDataSource, isFilterGroup, isGroupRow, isPackagedTheme, lookupLabel, moveRowInArray, parseCsv, parseFilterInput, sniffDelimiter, summaryKey, summaryLabel, summaryTypeLabels, themeClassName } from '@kanunilabs/datagrid-core';
3
+ import { GridRowData, DataGridController, GridDataType, RowKey, LookupItem, GridDictionary, StateStoringConfig, RowNode, GridColumnDef, DataGridCoreConfig, FilterRenderContextBase, FilterNode, InferColumnsOptions, GridThemeName, GridPaletteName, DescribeFilterOptions, GridDensity, ToolbarOptions, PortalContainer, CardViewOptions, EditMode, RowChange, RowStatusSource, ColumnRuntime, ColumnLayout, SortDescriptor, ColumnModel, RowSaveStatus, DataRowNode, ColSpanPlan, SummaryDef, RemoteDistinctList, ToolbarSearchOptions, ToolbarIconName, ColumnState, BusyPhase, VirtualWindow, ChartBoxSpec, ChartBoxModel, ChartSpec, ChartModel, ChartXYSpec, ChartXYModel, CellRange, RangeSelectionEngine, ColumnSelectMode, EditingEngine, ValidationRule, CrudHandlers, EditingPermissions, NewRowPosition, RowEditSession, LookupMatchMode } from '@kanunilabs/datagrid-core';
4
+ export { BusyChangedEvent, BusyPhase, ClientRowModel, ColumnLayout, ColumnLookup, ColumnModel, ColumnPin, ColumnRuntime, ColumnState, ColumnStateChangedEvent, ContentReadyEvent, CustomFilterOperator, CustomFilterOperatorId, DEFAULT_ROW_HEIGHT, DENSITY_ROW_HEIGHT, DataGridController, DataGridCoreConfig, DataRowNode, DataSource, FilterChangedEvent, FilterCondition, FilterGroupNode, FilterNode, FilterOperator, FocusedRowChangedEvent, GRID_COLOR_SCHEMES, GRID_PALETTES, GRID_THEMES, GridColorScheme, GridColumnDef, GridDataType, GridDensity, GridEventMap, GridPalette, GridPaletteName, GridRowData, GridStateStore, GridTheme, GridThemeName, GridViewState, GroupRowNode, GroupingConfig, HeaderBandCell, InferColumnsOptions, LoadOptions, LoadResult, LookupItem, NewRowPosition, PortalContainer, RowDropPosition, RowKey, RowNode, SUMMARY_TYPE_LABEL, ScrollingConfig, SelectionDescriptor, SortChangedEvent, SortDescriptor, SortDirection, StateStoringConfig, SummaryDef, SummaryType, THEME_ROW_HEIGHT, ToolbarOptions, ToolbarSearchOptions, ViewportChangedEvent, VirtualWindow, VirtualWindowEngine, allowedSummaryTypes, andFilters, attachStateStoring, bandDepth, bandPath, computeColumnLayout, computeHeaderBands, createRestDataSource, describeFilter, downloadBlob, fillText, filterInputFromNode, formatSummaryValue, humanizeField, importCsv, inferColumns, isDataRow, isDataSource, isFilterGroup, isGroupRow, isPackagedTheme, lookupLabel, moveRowInArray, parseCsv, parseFilterInput, sniffDelimiter, summaryKey, summaryLabel, summaryTypeLabels, themeClassName } from '@kanunilabs/datagrid-core';
5
5
 
6
6
  /** Formats an export menu can offer. */
7
7
  type ExportKind = 'csv' | 'excel' | 'excel-selected' | 'pdf';
@@ -744,8 +744,29 @@ interface DataGridProps<TRow = GridRowData> extends Omit<DataGridCoreConfig<TRow
744
744
  * supports. `false` makes the footer read-only.
745
745
  */
746
746
  footerMenu?: boolean;
747
- /** Toolbar with search, column chooser and export. */
748
- toolbar?: boolean;
747
+ /**
748
+ * Toolbar with search, column chooser and export. `true` shows all of it;
749
+ * an object picks the parts and sets the search box up:
750
+ *
751
+ * toolbar={{ export: false, columns: false,
752
+ * search: { maxLength: 100, debounce: 300, validate } }}
753
+ *
754
+ * Your own buttons: `toolbarItemsBefore` (start) and `toolbarItemsAfter`
755
+ * (end), e.g. `<GridToolbarButton>`.
756
+ */
757
+ toolbar?: boolean | ToolbarOptions;
758
+ /**
759
+ * Where the grid draws its popups (header filter, menus, date and lookup
760
+ * lists, dialogs): an element, or a function returning one. Default
761
+ * `document.body`.
762
+ *
763
+ * Set it when the grid sits in a modal (Radix Dialog and the like): the
764
+ * modal makes the rest of the page ignore the pointer, so a popup on <body>
765
+ * cannot be clicked. Pass the modal's content element (one without
766
+ * `overflow: hidden`). Popups stay in place even when the modal is moved
767
+ * with a CSS transform. Every popup carries `data-kanuni-portal`.
768
+ */
769
+ portalContainer?: PortalContainer;
749
770
  /**
750
771
  * The toolbar's Columns button — the popup listing HIDDEN columns. Default
751
772
  * true. The Enterprise wrapper turns it off when the side bar's Columns
@@ -950,6 +971,12 @@ interface DataGridProps<TRow = GridRowData> extends Omit<DataGridCoreConfig<TRow
950
971
  renderCellContent?: (ctx: CellSlotContext<TRow>) => ReactNode | undefined;
951
972
  /** Extra class names per cell (dirty marker, range highlight, invalid). */
952
973
  getCellClassName?: (ctx: CellSlotContext<TRow>) => string | undefined;
974
+ /**
975
+ * Where `rowStatus` reads each row's save state — `EnterpriseDataGrid`'s
976
+ * editing engine. With this grid's own `editing` on, its engine answers and
977
+ * this is not asked.
978
+ */
979
+ rowStatusSource?: RowStatusSource | null;
953
980
  /** Absolutely-positioned layer over the viewport (fill handle, watermark). */
954
981
  renderOverlay?: () => ReactNode;
955
982
  /** Pointer down on a cell, with the view coordinates the range engine needs. */
@@ -1037,6 +1064,8 @@ interface GridHeaderProps<TRow = GridRowData> {
1037
1064
  /** Leading expander column for master-detail (Enterprise). */
1038
1065
  detailColumn?: boolean;
1039
1066
  /** Leading row-number column (gap analysis P3.5). */
1067
+ /** `rowStatus.icons`: the leading status column is showing. */
1068
+ statusColumn?: boolean;
1040
1069
  rowNumberColumn?: boolean;
1041
1070
  /** What the row-number column's header shows. Defaults to `#`. */
1042
1071
  rowNumberHeader?: React.ReactNode;
@@ -1084,7 +1113,7 @@ interface GridHeaderProps<TRow = GridRowData> {
1084
1113
  /** Replace a header's label (the Enterprise rename box, G-CORE-06). Undefined = the label. */
1085
1114
  renderHeaderLabel?: (columnId: string) => React.ReactNode | undefined;
1086
1115
  }
1087
- declare function GridHeaderImpl<TRow = GridRowData>({ bandOffset, stickyInsets, layout, centerColumns, leadingSpacer, trailingSpacer, sort, sortable, onSort, headerFilter, filteredColumns, onOpenFilter, filterIconMode, checkboxColumn, detailColumn, rowNumberColumn, rowNumberHeader, selectAllState, selectAllDisabled, onToggleSelectAll, draggable, reorderable, onReorder, resizable, onResize, onAutoFit, onHeaderContextMenu, groupLevels, onHeaderClick, getHeaderClassName, renderHeaderLabel, }: GridHeaderProps<TRow>): react.JSX.Element;
1116
+ declare function GridHeaderImpl<TRow = GridRowData>({ bandOffset, stickyInsets, layout, centerColumns, leadingSpacer, trailingSpacer, sort, sortable, onSort, headerFilter, filteredColumns, onOpenFilter, filterIconMode, checkboxColumn, detailColumn, statusColumn, rowNumberColumn, rowNumberHeader, selectAllState, selectAllDisabled, onToggleSelectAll, draggable, reorderable, onReorder, resizable, onResize, onAutoFit, onHeaderContextMenu, groupLevels, onHeaderClick, getHeaderClassName, renderHeaderLabel, }: GridHeaderProps<TRow>): react.JSX.Element;
1088
1117
  declare const GridHeader: typeof GridHeaderImpl;
1089
1118
 
1090
1119
  /**
@@ -1104,6 +1133,8 @@ interface GridHeaderBandsProps<TRow = GridRowData> {
1104
1133
  checkboxColumn?: boolean;
1105
1134
  detailColumn?: boolean;
1106
1135
  /** Leading row-number column (gap analysis P3.5). */
1136
+ /** `rowStatus.icons`: the leading status column is showing. */
1137
+ statusColumn?: boolean;
1107
1138
  rowNumberColumn?: boolean;
1108
1139
  /** Height of one band row, in px. Defaults to `BAND_ROW_HEIGHT`. */
1109
1140
  rowHeight?: number;
@@ -1123,7 +1154,7 @@ interface GridHeaderBandsProps<TRow = GridRowData> {
1123
1154
  };
1124
1155
  };
1125
1156
  }
1126
- declare function GridHeaderBandsImpl<TRow = GridRowData>({ layout, centerColumns, leadingSpacer, trailingSpacer, depth, checkboxColumn, detailColumn, rowNumberColumn, rowHeight, bandFold, }: GridHeaderBandsProps<TRow>): react.JSX.Element | null;
1157
+ declare function GridHeaderBandsImpl<TRow = GridRowData>({ layout, centerColumns, leadingSpacer, trailingSpacer, depth, checkboxColumn, detailColumn, statusColumn, rowNumberColumn, rowHeight, bandFold, }: GridHeaderBandsProps<TRow>): react.JSX.Element | null;
1127
1158
  declare const GridHeaderBands: typeof GridHeaderBandsImpl;
1128
1159
 
1129
1160
  interface GridRowProps<TRow = GridRowData> {
@@ -1199,6 +1230,19 @@ interface GridRowProps<TRow = GridRowData> {
1199
1230
  rowDrag?: RowDragHandlers;
1200
1231
  /** Which edge to draw the drop line on, or null. */
1201
1232
  dropSide?: 'before' | 'after' | null;
1233
+ /**
1234
+ * `rowStatus.messages`: the content of a message row (a refused save's
1235
+ * reason and its buttons), for the parent row's key.
1236
+ */
1237
+ renderRowMessage?: (rowKey: RowKey, row: TRow) => React.ReactNode;
1238
+ /** `rowStatus.icons`: the leading status column is showing. */
1239
+ statusColumn?: boolean;
1240
+ /** `rowStatus`: this row's save state, when it has one. */
1241
+ rowStatus?: RowSaveStatus;
1242
+ /** The words a screen reader hears for `rowStatus` (`aria-description`). */
1243
+ rowStatusText?: string;
1244
+ /** `rowStatus.tint`: wash the whole row, not only the marker. */
1245
+ rowStatusTint?: boolean;
1202
1246
  /** Renders the leading checkbox cell. */
1203
1247
  checkboxColumn: boolean;
1204
1248
  /** Renders the leading row-number cell (gap analysis P3.5). */
@@ -1326,7 +1370,7 @@ interface GridRowProps<TRow = GridRowData> {
1326
1370
  onCellPointerEnter?: (ctx: CellSlotContext<TRow>, event: React.MouseEvent) => void;
1327
1371
  onCellDoubleClick?: (ctx: CellSlotContext<TRow>) => void;
1328
1372
  }
1329
- declare function GridRowImpl<TRow = GridRowData>({ gridId, node, index, layout, columnModel, centerColumns, centerIndices, stickyInsets, leadingSpacer, trailingSpacer, striped, selected, ariaSelectable, selectable, groupSelection, onToggleGroupSelect, groupDisplay, focusedColumnId, rowFocused, renderRow, checkboxColumn, rowNumberColumn, rowNumber, getNote, getSpan, resolveColSpans, findKind, headerRowCount, onRowClick, onRowMouseDown, onRowDoubleClick, onToggleSelect, onCellMouseDown, onRowContextMenu, searchNeedle, onToggleGroup, summaryDefs, detailColumn, detailExpanded, onToggleDetail, onToggleTreeRow, renderDetail, renderEditForm, renderCellContent, getCellClassName, onCellPointerDown, onCellPointerEnter, onCellDoubleClick, rowDrag, dropSide, height, }: GridRowProps<TRow>): react.JSX.Element | null;
1373
+ declare function GridRowImpl<TRow = GridRowData>({ gridId, node, index, layout, columnModel, centerColumns, centerIndices, stickyInsets, leadingSpacer, trailingSpacer, striped, selected, ariaSelectable, selectable, groupSelection, onToggleGroupSelect, groupDisplay, focusedColumnId, rowFocused, renderRow, checkboxColumn, statusColumn, rowNumberColumn, rowNumber, getNote, getSpan, resolveColSpans, findKind, headerRowCount, onRowClick, onRowMouseDown, onRowDoubleClick, onToggleSelect, onCellMouseDown, onRowContextMenu, searchNeedle, onToggleGroup, summaryDefs, detailColumn, detailExpanded, onToggleDetail, onToggleTreeRow, renderDetail, renderEditForm, renderRowMessage, renderCellContent, getCellClassName, onCellPointerDown, onCellPointerEnter, onCellDoubleClick, rowDrag, dropSide, rowStatus, rowStatusText, rowStatusTint, height, }: GridRowProps<TRow>): react.JSX.Element | null;
1330
1374
  declare const GridRow: typeof GridRowImpl;
1331
1375
 
1332
1376
  interface GridFilterRowProps<TRow = GridRowData> {
@@ -1353,6 +1397,8 @@ interface GridFilterRowProps<TRow = GridRowData> {
1353
1397
  checkboxColumn?: boolean;
1354
1398
  detailColumn?: boolean;
1355
1399
  /** Leading row-number column (gap analysis P3.5). */
1400
+ /** `rowStatus.icons`: the leading status column is showing. */
1401
+ statusColumn?: boolean;
1356
1402
  rowNumberColumn?: boolean;
1357
1403
  placeholder?: string;
1358
1404
  onChange: (columnId: string, raw: string) => void;
@@ -1417,7 +1463,7 @@ interface FilterInputSyncProbe {
1417
1463
  * re-render entirely.
1418
1464
  */
1419
1465
  declare function reconcileFilterInputs(prev: Record<string, string>, probe: FilterInputSyncProbe, columnIds?: readonly string[]): Record<string, string>;
1420
- declare function GridFilterRowImpl<TRow = GridRowData>({ bandOffset, stickyInsets, layout, centerColumns, leadingSpacer, trailingSpacer, values, checkboxColumn, detailColumn, rowNumberColumn, placeholder, onChange, onCommit, periodSuggestions, periodListId, operators, onOperatorChange, renderCustom, }: GridFilterRowProps<TRow>): react.JSX.Element;
1466
+ declare function GridFilterRowImpl<TRow = GridRowData>({ bandOffset, stickyInsets, layout, centerColumns, leadingSpacer, trailingSpacer, values, checkboxColumn, detailColumn, statusColumn, rowNumberColumn, placeholder, onChange, onCommit, periodSuggestions, periodListId, operators, onOperatorChange, renderCustom, }: GridFilterRowProps<TRow>): react.JSX.Element;
1421
1467
  declare const GridFilterRow: typeof GridFilterRowImpl;
1422
1468
 
1423
1469
  interface DistinctEntry {
@@ -1471,9 +1517,16 @@ interface GridHeaderFilterPopupProps {
1471
1517
  * matched nothing even though the value exists.
1472
1518
  */
1473
1519
  onSearch?: (needle: string) => void;
1520
+ /**
1521
+ * A server-side list, loaded in pieces (see `RemoteDistinctList`). When set,
1522
+ * the popup draws THAT instead of `entries`: the scroll bar is as long as the
1523
+ * server's list, the search box searches on the server, and Select all /
1524
+ * Clear / ticks are the pager's ("everything except these").
1525
+ */
1526
+ pager?: RemoteDistinctList;
1474
1527
  labels?: Partial<Record<'search' | 'selectAll' | 'clear' | 'apply' | 'cancel' | 'blank' | 'noMatch' | 'loading' | 'truncated', string>>;
1475
1528
  }
1476
- declare function GridHeaderFilterPopup({ gridId, columnId, headerLabel, entries, initialSelected, anchor, loading, dark, onApply, onClose, truncated, onSearch, labels, }: GridHeaderFilterPopupProps): react.JSX.Element;
1529
+ declare function GridHeaderFilterPopup({ gridId, columnId, headerLabel, entries, initialSelected, anchor, loading, dark, onApply, onClose, truncated, onSearch, pager, labels, }: GridHeaderFilterPopupProps): react.JSX.Element;
1477
1530
 
1478
1531
  interface GridContextMenuProps<TContext> {
1479
1532
  x: number;
@@ -1530,6 +1583,8 @@ interface GridFooterRowProps<TRow = GridRowData> {
1530
1583
  checkboxColumn?: boolean;
1531
1584
  detailColumn?: boolean;
1532
1585
  /** Leading row-number column (gap analysis P3.5). */
1586
+ /** `rowStatus.icons`: the leading status column is showing. */
1587
+ statusColumn?: boolean;
1533
1588
  rowNumberColumn?: boolean;
1534
1589
  /** Opens the aggregation menu for a column. */
1535
1590
  onPickSummary?: (columnId: string, event: React.MouseEvent) => void;
@@ -1546,7 +1601,7 @@ interface GridFooterRowProps<TRow = GridRowData> {
1546
1601
  /** Header-height rows between this row and its edge. See GridPinnedRows. */
1547
1602
  headerRowsBetween?: number;
1548
1603
  }
1549
- declare function GridFooterRowImpl<TRow = GridRowData>({ layout, centerColumns, leadingSpacer, trailingSpacer, defs, values, checkboxColumn, detailColumn, rowNumberColumn, onPickSummary, emptyHint, position, bandOffset, headerRowsBetween, }: GridFooterRowProps<TRow>): react.JSX.Element;
1604
+ declare function GridFooterRowImpl<TRow = GridRowData>({ layout, centerColumns, leadingSpacer, trailingSpacer, defs, values, checkboxColumn, detailColumn, statusColumn, rowNumberColumn, onPickSummary, emptyHint, position, bandOffset, headerRowsBetween, }: GridFooterRowProps<TRow>): react.JSX.Element;
1550
1605
  declare const GridFooterRow: typeof GridFooterRowImpl;
1551
1606
 
1552
1607
  interface GridFilterPanelProps<TRow = GridRowData> {
@@ -1603,9 +1658,16 @@ interface GridToolbarProps<TRow = GridRowData> {
1603
1658
  itemsAfter?: React.ReactNode;
1604
1659
  /** Milliseconds to wait after the last keystroke. Default 200. */
1605
1660
  searchDebounce?: number;
1661
+ /**
1662
+ * The search box's settings (`toolbar={{ search: {...} }}`): placeholder,
1663
+ * maxLength, debounce (wins over `searchDebounce`), applyOnBlur, validate.
1664
+ */
1665
+ searchOptions?: ToolbarSearchOptions;
1666
+ /** The export menu. Default true; false leaves it out whatever the formats. */
1667
+ exportMenu?: boolean;
1606
1668
  labels?: Partial<Record<'search' | 'csv' | 'excel' | 'excelSelected' | 'pdf' | 'columns' | 'exporting' | 'exportMenu', string>>;
1607
1669
  }
1608
- declare function GridToolbarImpl<TRow = GridRowData>({ controller, search, exportCsv, exportExcel, exportPdf, columnChooser, dark, onOpenColumnChooser, itemsBefore, itemsAfter, searchDebounce, labels, }: GridToolbarProps<TRow>): react.JSX.Element;
1670
+ declare function GridToolbarImpl<TRow = GridRowData>({ controller, search, exportCsv, exportExcel, exportPdf, columnChooser, dark, onOpenColumnChooser, itemsBefore, itemsAfter, searchDebounce, searchOptions, exportMenu, labels, }: GridToolbarProps<TRow>): react.JSX.Element;
1609
1671
  declare const GridToolbar: typeof GridToolbarImpl;
1610
1672
 
1611
1673
  /** A command button's icon — the shared paths of `toolbarIcons.ts` (see there for why). */
@@ -1614,6 +1676,26 @@ declare function ToolbarIcon({ name, size }: {
1614
1676
  size?: number;
1615
1677
  }): react.JSX.Element;
1616
1678
 
1679
+ interface GridToolbarButtonProps {
1680
+ /** The glyph, e.g. an inline SVG or `<ToolbarIcon name="columns" />`. */
1681
+ icon: ReactNode;
1682
+ /** The button's name: its accessible name and the start of its tooltip. */
1683
+ label: string;
1684
+ /** Keyboard shortcut shown in the tooltip ("Export (Ctrl+E)") and as `aria-keyshortcuts`. */
1685
+ shortcut?: string;
1686
+ /**
1687
+ * Set while the button cannot be used: it reads as unavailable, ignores
1688
+ * clicks, and the tooltip and screen reader give this reason.
1689
+ */
1690
+ disabledReason?: string;
1691
+ /** Show the label beside the icon. Default false (icon only). */
1692
+ showLabel?: boolean;
1693
+ onClick?: () => void;
1694
+ /** `data-testid` on the button. */
1695
+ testId?: string;
1696
+ }
1697
+ declare function GridToolbarButton({ icon, label, shortcut, disabledReason, showLabel, onClick, testId, }: GridToolbarButtonProps): react.JSX.Element;
1698
+
1617
1699
  interface GridColumnChooserProps<TRow = GridRowData> {
1618
1700
  controller: DataGridController<TRow>;
1619
1701
  /** Passed in so the panel re-renders when visibility changes. */
@@ -1884,6 +1966,8 @@ interface GridPinnedRowsProps<TRow = GridRowData> {
1884
1966
  checkboxColumn?: boolean;
1885
1967
  detailColumn?: boolean;
1886
1968
  /** Leading row-number column (gap analysis P3.5). */
1969
+ /** `rowStatus.icons`: the leading status column is showing. */
1970
+ statusColumn?: boolean;
1887
1971
  rowNumberColumn?: boolean;
1888
1972
  rowHeight: number;
1889
1973
  /** Pixels of BAND rows above. Zero on a grid without column bands. */
@@ -1908,7 +1992,7 @@ interface GridPinnedRowsProps<TRow = GridRowData> {
1908
1992
  */
1909
1993
  ariaRowBase: number;
1910
1994
  }
1911
- declare function GridPinnedRowsImpl<TRow = GridRowData>({ gridId, side, rows, rowKeys, onUserRowContextMenu, layout, columnModel, centerColumns, centerIndices, stickyInsets, leadingSpacer, trailingSpacer, checkboxColumn, detailColumn, rowNumberColumn, rowHeight, bandOffset, headerRowsBetween, ariaRowBase, }: GridPinnedRowsProps<TRow>): react.JSX.Element | null;
1995
+ declare function GridPinnedRowsImpl<TRow = GridRowData>({ gridId, side, rows, rowKeys, onUserRowContextMenu, layout, columnModel, centerColumns, centerIndices, stickyInsets, leadingSpacer, trailingSpacer, checkboxColumn, detailColumn, statusColumn, rowNumberColumn, rowHeight, bandOffset, headerRowsBetween, ariaRowBase, }: GridPinnedRowsProps<TRow>): react.JSX.Element | null;
1912
1996
  declare const GridPinnedRows: typeof GridPinnedRowsImpl;
1913
1997
 
1914
1998
  type UseDataGridOptions<TRow = GridRowData> = DataGridCoreConfig<TRow>;
@@ -1983,9 +2067,16 @@ interface GridSurfaceProviderProps {
1983
2067
  theme?: GridThemeName;
1984
2068
  density?: GridDensity;
1985
2069
  palette?: GridPaletteName;
2070
+ /** Where popups are drawn (the grid's `portalContainer`). Default <body>. */
2071
+ portalContainer?: PortalContainer;
1986
2072
  children: ReactNode;
1987
2073
  }
1988
- declare function GridSurfaceProvider({ theme, density, palette, children, }: GridSurfaceProviderProps): react.JSX.Element;
2074
+ declare function GridSurfaceProvider({ theme, density, palette, portalContainer, children, }: GridSurfaceProviderProps): react.JSX.Element;
2075
+ /**
2076
+ * The element a popup is portalled into, read when the popup opens: <body>,
2077
+ * or the host inside the grid's `portalContainer` (core `portalTarget`).
2078
+ */
2079
+ declare function useGridPortalTarget(): () => HTMLElement;
1989
2080
  /**
1990
2081
  * The theme + density modifier classes for a surface rendered outside the grid.
1991
2082
  * `''` when the grid is unthemed, so appending it is always safe.
@@ -2052,6 +2143,12 @@ interface UseGridEditingOptions<TRow = GridRowData> {
2052
2143
  confirmDeleteMessage?: string;
2053
2144
  /** Disables editing entirely (`editing={{ enabled: false }}`). */
2054
2145
  enabled?: boolean;
2146
+ /**
2147
+ * How long a row reads `'saved'` after its save (`engine.getRowStatus`),
2148
+ * in ms; 0 never shows it. Left out, the engine's default (1500) stays.
2149
+ * The grids pass `rowStatus.savedDuration`, or 0 when `rowStatus` is off.
2150
+ */
2151
+ savedDuration?: number;
2055
2152
  /**
2056
2153
  * `editing.range` — the rectangle, the fill handle and the clipboard
2057
2154
  * gestures (cut / paste). Default true. Off means Ctrl+X and Ctrl+V are left
@@ -2411,4 +2508,4 @@ interface GridDialogProps {
2411
2508
  }
2412
2509
  declare function GridDialog({ open, title, message, cancelLabel, confirmLabel, danger, dark, onConfirm, onCancel, }: GridDialogProps): react.ReactPortal | null;
2413
2510
 
2414
- export { type AlignedGridsApi, BAND_ROW_HEIGHT, type BatchSaveError, type CellMenuOptions, type CellRenderContext, type CellSlotContext, type CellTooltipOptions, DEFAULT_EDIT_FORM_LABELS, DEFAULT_HEADER_MENU_LABELS, DataGrid, type DataGridProps, type DistinctEntry, type EditFormField, type EditFormLabels, type EditModes, type EditorRenderContext, type ExportOutcome, type FilterRenderContext, GridCellEditor, type GridCellEditorProps, GridColumnChooser, type GridColumnChooserProps, GridContextMenu, type GridContextMenuProps, GridDateEditor, type GridDateEditorProps, GridDialog, type GridDialogProps, GridEditForm, type GridEditFormProps, GridFilterPanel, type GridFilterPanelProps, GridFilterRow, type GridFilterRowProps, GridFooterRow, type GridFooterRowProps, GridGroupPanel, type GridGroupPanelProps, GridHeader, GridHeaderBands, type GridHeaderBandsProps, GridHeaderFilterPopup, type GridHeaderFilterPopupProps, type GridHeaderProps, GridLoadingOverlay, type GridLoadingOverlayProps, GridLookupEditor, type GridLookupEditorProps, type GridMenuItem, GridNoteEditor, type GridNotesConfig, GridPager, type GridPagerProps, GridPinnedRows, type GridPinnedRowsProps, GridPopupPanel, type GridPopupPanelProps, GridPortal, type GridPortalProps, GridRow, GridRowEditor, type GridRowEditorProps, type GridRowProps, GridSummaryBar, type GridSummaryBarProps, GridSurfaceProvider, type GridSurfaceProviderProps, GridTextProvider, type GridTextProviderProps, GridToolbar, type GridToolbarProps, GridTooltip, type GridTooltipConfig, type GridTooltipProps, type HeaderMenuContext, type HeaderMenuDeps, type HeaderMenuLabels, type HeaderRenderContext, type NoteCellContext, PRINT_MAX_ROWS, type PendingDelete, type PrintLayoutOptions, type PrintLayoutState, ROW_DRAG_MIME, type RangeApi, type ReactColumnRuntime, type ReactGridColumnDef, type RowDragConfig, type RowDragHandlers, type RowDragPayload, type RowDropEvent, type RowLookupMap, type RowMenuContext, type RowReorderEvent, type RowTemplateContext, SHORTCUT_COPY, SHORTCUT_CUT, SHORTCUT_PASTE, type SelectionStats, ToolbarIcon, type TooltipState, type UseDataGridOptions, type UseDataGridResult, type UseEditModesOptions, type UseGridEditingOptions, type UseGridEditingResult, buildCellMenuItems, buildHeaderMenu, copyToClipboard, editFormColumnIds, editFormLabels, headerMenuLabels, matchOptions, measureBestFitWidth, reconcileFilterInputs, runGridExport, useAlignedGrids, useAnchoredPopup, useCellTooltip, useDataGrid, useEditModes, useGridChartBoxData, useGridChartData, useGridChartXYData, useGridEditing, useGridSurfaceClass, useGridText, usePrintLayout, useRowDrag, useStateStoring, writeClipboardText };
2511
+ export { type AlignedGridsApi, BAND_ROW_HEIGHT, type BatchSaveError, type CellMenuOptions, type CellRenderContext, type CellSlotContext, type CellTooltipOptions, DEFAULT_EDIT_FORM_LABELS, DEFAULT_HEADER_MENU_LABELS, DataGrid, type DataGridProps, type DistinctEntry, type EditFormField, type EditFormLabels, type EditModes, type EditorRenderContext, type ExportOutcome, type FilterRenderContext, GridCellEditor, type GridCellEditorProps, GridColumnChooser, type GridColumnChooserProps, GridContextMenu, type GridContextMenuProps, GridDateEditor, type GridDateEditorProps, GridDialog, type GridDialogProps, GridEditForm, type GridEditFormProps, GridFilterPanel, type GridFilterPanelProps, GridFilterRow, type GridFilterRowProps, GridFooterRow, type GridFooterRowProps, GridGroupPanel, type GridGroupPanelProps, GridHeader, GridHeaderBands, type GridHeaderBandsProps, GridHeaderFilterPopup, type GridHeaderFilterPopupProps, type GridHeaderProps, GridLoadingOverlay, type GridLoadingOverlayProps, GridLookupEditor, type GridLookupEditorProps, type GridMenuItem, GridNoteEditor, type GridNotesConfig, GridPager, type GridPagerProps, GridPinnedRows, type GridPinnedRowsProps, GridPopupPanel, type GridPopupPanelProps, GridPortal, type GridPortalProps, GridRow, GridRowEditor, type GridRowEditorProps, type GridRowProps, GridSummaryBar, type GridSummaryBarProps, GridSurfaceProvider, type GridSurfaceProviderProps, GridTextProvider, type GridTextProviderProps, GridToolbar, GridToolbarButton, type GridToolbarButtonProps, type GridToolbarProps, GridTooltip, type GridTooltipConfig, type GridTooltipProps, type HeaderMenuContext, type HeaderMenuDeps, type HeaderMenuLabels, type HeaderRenderContext, type NoteCellContext, PRINT_MAX_ROWS, type PendingDelete, type PrintLayoutOptions, type PrintLayoutState, ROW_DRAG_MIME, type RangeApi, type ReactColumnRuntime, type ReactGridColumnDef, type RowDragConfig, type RowDragHandlers, type RowDragPayload, type RowDropEvent, type RowLookupMap, type RowMenuContext, type RowReorderEvent, type RowTemplateContext, SHORTCUT_COPY, SHORTCUT_CUT, SHORTCUT_PASTE, type SelectionStats, ToolbarIcon, type TooltipState, type UseDataGridOptions, type UseDataGridResult, type UseEditModesOptions, type UseGridEditingOptions, type UseGridEditingResult, buildCellMenuItems, buildHeaderMenu, copyToClipboard, editFormColumnIds, editFormLabels, headerMenuLabels, matchOptions, measureBestFitWidth, reconcileFilterInputs, runGridExport, useAlignedGrids, useAnchoredPopup, useCellTooltip, useDataGrid, useEditModes, useGridChartBoxData, useGridChartData, useGridChartXYData, useGridEditing, useGridPortalTarget, useGridSurfaceClass, useGridText, usePrintLayout, useRowDrag, useStateStoring, writeClipboardText };