@jielga/tmdatagrid 2.0.0-beta.4 → 2.0.0-beta.7

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 (37) hide show
  1. package/dist/index.d.ts +339 -152
  2. package/dist/index.js +2602 -2450
  3. package/dist/index.js.map +1 -1
  4. package/dist/styles.css +1 -1
  5. package/package.json +1 -1
  6. package/skills/appearance/SKILL.md +1 -1
  7. package/skills/cell-selection/SKILL.md +1 -1
  8. package/skills/columns/SKILL.md +44 -2
  9. package/skills/data/SKILL.md +14 -10
  10. package/skills/editing/SKILL.md +140 -68
  11. package/skills/editing/references/common-mistakes.md +98 -8
  12. package/skills/editing/references/editing-api.md +40 -30
  13. package/skills/editing/references/editors-and-validation.md +65 -14
  14. package/skills/filtering/SKILL.md +1 -1
  15. package/skills/getting-started/SKILL.md +3 -3
  16. package/skills/grouping/SKILL.md +5 -3
  17. package/skills/options/SKILL.md +2 -2
  18. package/skills/rows/SKILL.md +7 -3
  19. package/skills/server-side/SKILL.md +1 -1
  20. package/skills/testing/SKILL.md +1 -1
  21. package/src/tmdatagrid/components/TMDataGrid.tsx +2 -2
  22. package/src/tmdatagrid/components/TMDataGridCellEditor.tsx +33 -34
  23. package/src/tmdatagrid/components/TMDataGridDraftActions.tsx +296 -0
  24. package/src/tmdatagrid/components/TMDataGridEditColumn.tsx +40 -33
  25. package/src/tmdatagrid/components/TMDataGridEntryRows.tsx +7 -7
  26. package/src/tmdatagrid/components/TMDataGridTable.tsx +27 -5
  27. package/src/tmdatagrid/components/TMDataGridToolbar.module.css +4 -0
  28. package/src/tmdatagrid/components/TMDataGridToolbar.tsx +8 -10
  29. package/src/tmdatagrid/components/editors/TMDataGridNumberEditor.tsx +34 -4
  30. package/src/tmdatagrid/components/editors/editorShared.ts +1 -29
  31. package/src/tmdatagrid/core/capabilities.ts +14 -6
  32. package/src/tmdatagrid/core/editEngine.ts +472 -96
  33. package/src/tmdatagrid/core/labels.ts +3 -3
  34. package/src/tmdatagrid/core/summary.ts +10 -2
  35. package/src/tmdatagrid/index.ts +9 -7
  36. package/src/tmdatagrid/useTMDataGrid.tsx +107 -47
  37. package/src/tmdatagrid/components/TMDataGridEditActions.tsx +0 -233
package/dist/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { Cell, Column, ColumnPinningState, ExpandedState, Header, Row, RowData, RowSelectionState, Table, TableFeatures, TableOptions, TableState, aggregationFns } from "@tanstack/react-table";
2
2
  import { CSSProperties, ComponentType, MouseEvent, MutableRefObject, ReactNode } from "react";
3
- import { MantineSize, MenuProps } from "@mantine/core";
4
3
  import { Store } from "@tanstack/store";
4
+ import { MantineSize, MenuProps } from "@mantine/core";
5
5
  import { AnyFieldApi, AnyFormApi, StandardSchemaV1 } from "@tanstack/react-form";
6
6
  import { RankingInfo } from "@tanstack/match-sorter-utils";
7
7
  //#region .types-tmp/components/TMDataGridColumnsPanel.d.ts
@@ -12,96 +12,6 @@ import { RankingInfo } from "@tanstack/match-sorter-utils";
12
12
  */
13
13
  declare function TMDataGridColumnsPanel(): import("react").JSX.Element;
14
14
  //#endregion
15
- //#region .types-tmp/components/TMDataGridEditActions.d.ts
16
- /** What the edit chrome is showing. */
17
- type TMDataGridEditActionsState = {
18
- /**
19
- * Rows in the draft store, which is what Save sends: committed edits,
20
- * committed entry rows and deletion marks.
21
- */
22
- draftCount: number;
23
- /**
24
- * Rows still open - edited or entered but not committed, so not part of
25
- * the save. They stay open across a save.
26
- */
27
- openCount: number;
28
- /**
29
- * @deprecated Was "everything uncommitted", which Save no longer sends.
30
- * Reads as `draftCount + openCount`; use whichever you meant.
31
- */
32
- pendingCount: number;
33
- /** Whether a submit is in flight. */
34
- isSubmitting: boolean;
35
- };
36
- /** What the edit chrome can do. */
37
- type TMDataGridEditActionsActions = {
38
- /** Saves the draft store. Open rows are left alone. */
39
- save: () => Promise<boolean>;
40
- /** Submits every open row, committing the ones that validate. */
41
- commitAll: () => Promise<boolean>;
42
- /** Drops everything - open form state and the draft store alike. */
43
- discard: () => void;
44
- };
45
- /** The pre-bound pieces of the built-in edit chrome. */
46
- type TMDataGridEditActionsControls = {
47
- /** Save, with the draft count, disabled while the draft store is empty. */
48
- Save: () => ReactNode;
49
- /** Discard, disabled while nothing is pending. */
50
- Discard: () => ReactNode;
51
- /** The "N rows still being edited" note, or nothing while there are none. */
52
- OpenRowsNote: () => ReactNode;
53
- };
54
- /** What {@link TMDataGridEditActionsProps.renderActions} is handed. */
55
- type TMDataGridEditActionsSlotArgs = {
56
- state: TMDataGridEditActionsState;
57
- actions: TMDataGridEditActionsActions;
58
- Controls: TMDataGridEditActionsControls;
59
- };
60
- type TMDataGridEditActionsProps = {
61
- /**
62
- * Replaces the built-in Save/Discard pair, and is handed the pieces of it.
63
- *
64
- * ```tsx
65
- * <TMDataGrid.EditActions
66
- * renderActions={({ state, Controls }) => (
67
- * <Group>
68
- * {state.draftCount > 0 && <Badge>{state.draftCount}</Badge>}
69
- * <Controls.OpenRowsNote />
70
- * <Controls.Save />
71
- * <Controls.Discard />
72
- * </Group>
73
- * )}
74
- * />
75
- * ```
76
- */
77
- renderActions?: (args: TMDataGridEditActionsSlotArgs) => ReactNode;
78
- };
79
- /**
80
- * Draft mode's toolbar chrome: Save with the draft-store count, Discard, and
81
- * a note counting rows still open. Save sends the draft store and leaves open
82
- * rows alone, so it greys out while nothing is committed however much is
83
- * being typed - the note is what makes those rows visible. Works under any
84
- * `editing.mode` and renders nothing while editing is off.
85
- *
86
- * ```tsx
87
- * <TMDataGrid.Toolbar>
88
- * <TMDataGrid.SummaryCount />
89
- * <TMDataGrid.Spacer />
90
- * <TMDataGrid.EditActions />
91
- * </TMDataGrid.Toolbar>
92
- * ```
93
- */
94
- declare function TMDataGridEditActions({ renderActions }?: TMDataGridEditActionsProps): string | number | bigint | boolean | import("react").JSX.Element | Iterable<ReactNode> | Promise<string | number | bigint | boolean | Iterable<ReactNode> | import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>> | import("react").ReactPortal | null | undefined> | null | undefined;
95
- //#endregion
96
- //#region .types-tmp/components/TMDataGridFilterPanel.d.ts
97
- /**
98
- * The MUI-style filter surface: one row per active column filter, each row a
99
- * column / operator / value triple. It only ever reads and writes the table's
100
- * `columnFilters` state, so a `manualFiltering` grid gets the same panel for
101
- * free - the state is forwarded to the server instead of a row model.
102
- */
103
- declare function TMDataGridFilterPanel(): import("react").JSX.Element | null;
104
- //#endregion
105
15
  //#region .types-tmp/core/sizes.d.ts
106
16
  type TMDataGridSize = MantineSize;
107
17
  declare const DEFAULT_TMDATAGRID_SIZE: TMDataGridSize;
@@ -277,10 +187,21 @@ declare function tmDataGridFilterFn<TFeatures extends TableFeatures, TData exten
277
187
  //#endregion
278
188
  //#region .types-tmp/core/editEngine.d.ts
279
189
  /**
280
- * How commits happen - one axis, each mode a thin policy over the same
281
- * engine. See `editMode` on `UseTMDataGridOptions`.
190
+ * What counts as a commit - one axis, each mode a thin policy over the same
191
+ * engine. Where a commit *goes* is the other axis, `editing.draft`: out to
192
+ * the consumer, or into the draft store. See `editing` on
193
+ * `UseTMDataGridOptions`.
194
+ *
195
+ * | Mode | Enter | Tab | Focus leaves | Escape |
196
+ * | ---- | ----- | --- | ------------ | ------ |
197
+ * | `"cell"` | commits | commits, caret moves on | commits | cancels |
198
+ * | `"cellConfirm"` | commits | keeps the draft, caret moves on | keeps the draft | cancels |
199
+ * | `"row"` | commits the row | the browser's, along the row | nothing | cancels the row |
200
+ *
201
+ * An entry row is row-shaped in every mode - every editable cell open at
202
+ * once, the browser's Tab between them, and an explicit ✓.
282
203
  */
283
- type TMDataGridEditMode = "cell" | "cellConfirm" | "row" | "draft";
204
+ type TMDataGridEditMode = "cell" | "cellConfirm" | "row";
284
205
  /**
285
206
  * One editing row's live form. TanStack Form's `FormApi`, not a wrapper: the
286
207
  * engine is a form library, and everything mid-edit - values, dirty state,
@@ -333,6 +254,40 @@ type TMDataGridRowValidators = {
333
254
  onSubmitAsync?: TMDataGridValidator;
334
255
  onSubmitAsyncDebounceMs?: number;
335
256
  };
257
+ /** What `editing.tableValidators` is handed for one commit. */
258
+ type TMDataGridTableValidateArgs<TData extends RowData = TMDataGridRowData> = {
259
+ /** The committing row, as drafted. */
260
+ value: TData;
261
+ /** Its id - `addRow`'s temp id for an entry row. */
262
+ rowId: string;
263
+ /** Whether the row is an entry row, not yet in `data`. */
264
+ isNew: boolean;
265
+ /**
266
+ * The collection as it would stand if this commit landed: every data row
267
+ * overlaid with its draft where one is held (this row's `value` included),
268
+ * entry rows appended, deletion-marked rows removed. Unfiltered - a rule
269
+ * sees the whole collection whatever the view shows.
270
+ */
271
+ rows: ReadonlyArray<{
272
+ rowId: string;
273
+ value: TData;
274
+ }>;
275
+ };
276
+ /**
277
+ * `editing.tableValidators` - rules that need the other rows: no duplicate
278
+ * keys, no overlapping ranges, allocations summing to a total. Run at every
279
+ * commit, after the row's own validators, and again per parked row during
280
+ * `saveDrafts` - so a draft invalidated by a later edit blocks the save.
281
+ *
282
+ * Return nothing to pass, a message, or Form's `{ form, fields }` shape;
283
+ * pathed issues land on the committing row's cells, pathless ones on the row.
284
+ * `onSubmit` runs first, and its failure stands without `onSubmitAsync`
285
+ * running.
286
+ */
287
+ type TMDataGridTableValidators<TData extends RowData = TMDataGridRowData> = {
288
+ onSubmit?: (args: TMDataGridTableValidateArgs<TData>) => unknown;
289
+ onSubmitAsync?: (args: TMDataGridTableValidateArgs<TData>) => unknown | Promise<unknown>;
290
+ };
336
291
  /** One field's before/after across a commit. */
337
292
  type TMDataGridEditChange = {
338
293
  /** Column the field maps back to, for consumers thinking in columns. */
@@ -357,8 +312,20 @@ type TMDataGridEditCommitArgs<TData extends RowData> = {
357
312
  type TMDataGridEditRowProjection = {
358
313
  /** Field names whose value differs from the original. */
359
314
  dirtyFields: ReadonlyArray<string>;
360
- /** Field names carrying a validation error. */
315
+ /** Field names carrying a validation error, live or from a failed commit. */
361
316
  errorFields: ReadonlyArray<string>;
317
+ /**
318
+ * Those errors as text: what each cell editor is showing, plus what the
319
+ * row's last failed commit found. The second half is the reason this
320
+ * exists - Form clears a field's errors when its editor unmounts, so a row
321
+ * left invalid would go back to looking like an ordinary edited row. Such
322
+ * a message is dropped as soon as its field's value moves: the fix is what
323
+ * clears the mark.
324
+ */
325
+ errorMessages: ReadonlyArray<{
326
+ field: string;
327
+ message: string;
328
+ }>;
362
329
  /** A row-level error - a pathless `.refine()`, or a rejected commit. */
363
330
  hasRowError: boolean;
364
331
  isSubmitting: boolean;
@@ -398,22 +365,21 @@ type TMDataGridEditState = {
398
365
  * values stay in the row's form, this records which side of the line the
399
366
  * row is on. `begin` on one of these takes it back out, into form state.
400
367
  *
401
- * Only draft mode parks; the immediate modes send a commit straight to the
402
- * consumer and drop the form, so there this stays empty.
368
+ * Only `editing.draft` parks. Without it a commit goes straight to the
369
+ * consumer and the form is dropped, so this stays empty.
403
370
  */
404
371
  committedRowIds: ReadonlyArray<string>;
405
372
  /**
406
373
  * Rows being created, not yet in `data`. `committed` is the draft store's
407
374
  * add slice: the entry row passed its submit and renders as a value row
408
- * until `begin` re-opens it. Under the immediate modes a commit adds
409
- * through `onRowAdd` and the entry is dropped, so there it never turns
410
- * `true`.
375
+ * until `begin` re-opens it. Without `editing.draft` a commit adds through
376
+ * `onRowAdd` and the entry is dropped, so it never turns `true`.
411
377
  */
412
378
  newRows: ReadonlyArray<{
413
379
  tempId: string;
414
380
  committed: boolean;
415
381
  }>;
416
- /** The draft store's delete slice: rows marked deleted under draft mode. */
382
+ /** The draft store's delete slice: rows marked deleted, awaiting the save. */
417
383
  deletedRowIds: ReadonlyArray<string>;
418
384
  };
419
385
  type ErasedRow = Row<TMDataGridFeatures, TMDataGridRowData>;
@@ -523,7 +489,7 @@ type TMDataGridColumnEditOptions = {
523
489
  */
524
490
  mapValue?: TMDataGridEditValueMap;
525
491
  };
526
- /** A new row being committed - `onRowAdd`, and `submitAll`'s `added`. */
492
+ /** A new row being committed - `onRowAdd`, and `saveDrafts`'s `created`. */
527
493
  type TMDataGridRowAddArgs<TData extends RowData> = {
528
494
  /** The engine's placeholder id; the real id is the consumer's to mint. */
529
495
  tempId: string;
@@ -639,6 +605,13 @@ type TMDataGridEditApi<TData extends RowData = TMDataGridRowData> = {
639
605
  canEditCell: (row: ErasedRow, column: ErasedColumn) => boolean;
640
606
  /** Whether the row takes edits at all - the edit lane's pencil gate. */
641
607
  canEditRow: (row: ErasedRow) => boolean;
608
+ /**
609
+ * Whether the column takes edits at all, with no row in hand: it maps to a
610
+ * field, `editing.columns` lists it if that option is set, and
611
+ * `meta.edit.enabled` is not `false`. A per-row `enabled` predicate is the
612
+ * row's half of the question - `canEditCell` asks both.
613
+ */
614
+ isColumnEditable: (column: ErasedColumn) => boolean;
642
615
  /**
643
616
  * Opens an editor. In row mode the whole row opens either way and `columnId`
644
617
  * only says which cell takes the caret; `null` (the lane's pencil) leaves it
@@ -665,10 +638,10 @@ type TMDataGridEditApi<TData extends RowData = TMDataGridRowData> = {
665
638
  cancelAll: () => void;
666
639
  /**
667
640
  * Submits every open row, as if each had been OK'd: a row that validates
668
- * commits (into the draft store under draft mode, straight to the consumer
669
- * under the immediate modes), a row that fails stays open with its errors.
670
- * `true` when every row committed. Sends nothing to the consumer by itself
671
- * under draft mode - that is `saveDrafts`.
641
+ * commits (into the draft store with `editing.draft` on, straight to the
642
+ * consumer without it), a row that fails stays open with its errors.
643
+ * `true` when every row committed. Under `editing.draft` it sends nothing
644
+ * to the consumer by itself - that is `saveDrafts`.
672
645
  */
673
646
  commitAll: () => Promise<boolean>;
674
647
  /**
@@ -687,13 +660,38 @@ type TMDataGridEditApi<TData extends RowData = TMDataGridRowData> = {
687
660
  submitAll: () => Promise<boolean>;
688
661
  /** Writes the type's empty value into a cell and commits it - Delete. */
689
662
  clearCell: (rowId: string, columnId: string) => Promise<boolean>;
663
+ /**
664
+ * Writes one cell and commits the row - a typed edit without the typing,
665
+ * for toolbar actions and bulk fills. Under `editing.draft` the row parks
666
+ * in the draft store exactly as a hand-made edit does, so it carries the
667
+ * same change markers and the same per-row revert.
668
+ *
669
+ * The row need not be mounted; a row inside a collapsed group takes the
670
+ * write. Resolves `false` when the cell takes no edit - no such row or
671
+ * column, `editing.columns` excludes it, `meta.edit.enabled` is off, or the
672
+ * row is not editable - and when validation refuses the value, which leaves
673
+ * the row open carrying its errors.
674
+ *
675
+ * `value` is the stored value: no editor runs, so `meta.edit.mapValue`
676
+ * does not either. `meta.edit.validate` does.
677
+ */
678
+ setCellValue: (rowId: string, columnId: string, value: unknown) => Promise<boolean>;
679
+ /**
680
+ * {@link setCellValue} for several cells of one row, in a single commit -
681
+ * one consumer call and one draft entry rather than one per column. Keys
682
+ * are column ids.
683
+ *
684
+ * All or nothing: if any named cell takes no edit, nothing is written and
685
+ * this resolves `false`.
686
+ */
687
+ setRowValues: (rowId: string, values: Record<string, unknown>) => Promise<boolean>;
690
688
  /**
691
689
  * Opens a new entry row (the sticky block under the header) seeded from
692
690
  * `newRowDefaults`. `values` overrides that seed key by key, so
693
691
  * `addRow()` opens a blank row and `addRow({ status: "draft" })` opens one
694
692
  * that starts filled in. Returns its temporary id - a form with no backing
695
- * row yet. Committing it calls `onRowAdd` (immediate modes) or joins
696
- * `submitAll`'s `added` (draft).
693
+ * row yet. Committing it calls `onRowAdd`, or parks it for `saveDrafts`
694
+ * under `editing.draft`.
697
695
  */
698
696
  addRow: (values?: Partial<TData>) => string;
699
697
  /**
@@ -702,17 +700,17 @@ type TMDataGridEditApi<TData extends RowData = TMDataGridRowData> = {
702
700
  * `newRowDefaults` exactly as `addRow` does.
703
701
  *
704
702
  * `commit: true` submits each row as it lands, which is what an import
705
- * wants: rows that validate commit (parked in the draft store under draft
706
- * mode, added through `onRowAdd` under the immediate modes - once per row),
703
+ * wants: rows that validate commit (parked in the draft store under
704
+ * `editing.draft`, added through `onRowAdd` without it - once per row),
707
705
  * and rows that fail stay open in the entry block carrying their errors,
708
706
  * for the user to fix. The result says which went which way.
709
707
  */
710
708
  addRows: (rows: ReadonlyArray<Partial<TData>>, options?: TMDataGridAddRowsOptions) => Promise<TMDataGridAddRowsResult>;
711
709
  /**
712
- * Deletes a row: `onRowDelete` straight away under the immediate modes;
713
- * under draft it toggles the id in `deletedRowIds` - the row renders
714
- * struck through until `submitAll` reports it. On an uncommitted entry
715
- * row it just discards the entry.
710
+ * Deletes a row: `onRowDelete` straight away, or under `editing.draft` a
711
+ * toggle of the id in `deletedRowIds` - the row renders struck through
712
+ * until `saveDrafts` reports it. On an uncommitted entry row it just
713
+ * discards the entry.
716
714
  */
717
715
  deleteRow: (rowId: string) => void;
718
716
  /** Whether delete chrome makes sense - the lane's trash gate. */
@@ -821,12 +819,12 @@ type TMDataGridLabels = {
821
819
  cancelRowEdit: string;
822
820
  /** Save tooltip when field errors block the row, with no row message. */
823
821
  editRowErrors: string;
824
- /** `EditActions`' Save, with the count of rows in the draft store. */
822
+ /** `DraftActions`' Save, with the count of rows in the draft store. */
825
823
  saveAllEdits: (rows: number) => string;
826
- /** `EditActions`' Discard. */
824
+ /** `DraftActions`' Discard. */
827
825
  discardAllEdits: string;
828
826
  /**
829
- * `EditActions`' note about rows still open - edited but not committed, so
827
+ * `DraftActions`' note about rows still open - edited but not committed, so
830
828
  * not part of the save. Shown only while there are any.
831
829
  */
832
830
  editRowsStillOpen: (rows: number) => string;
@@ -1128,13 +1126,20 @@ type TMDataGridFeatureFlags = {
1128
1126
  grouping: boolean;
1129
1127
  /** Whether cells can be edited at all - the `editing` option was set. */
1130
1128
  editing: boolean;
1131
- /** The commit policy, or `null` while editing is off. */
1129
+ /** What counts as a commit, or `null` while editing is off. */
1132
1130
  editMode: TMDataGridEditMode | null;
1133
1131
  /**
1134
- * Whether a confirmed entry row stays pinned in the sticky entry block
1135
- * until Save all - `editing.newRowsSticky`, draft mode only. Off by
1136
- * default: a confirmed row joins the scrolling flow instead, so entering
1137
- * many rows cannot fill the viewport with sticky chrome.
1132
+ * Where a commit goes - `editing.draft`. On, commits park in the grid's
1133
+ * draft store and leave through `edit.saveDrafts()`; off, each one reaches
1134
+ * the consumer as it happens.
1135
+ */
1136
+ editDraft: boolean;
1137
+ /**
1138
+ * Whether a parked entry row stays pinned in the sticky entry block until
1139
+ * the draft store is saved - `editing.newRowsSticky`, which needs
1140
+ * `editing.draft`. Off by default: a parked row joins the scrolling flow
1141
+ * instead, so entering many rows cannot fill the viewport with sticky
1142
+ * chrome.
1138
1143
  */
1139
1144
  editNewRowsSticky: boolean;
1140
1145
  /** The generated row-number gutter - `enableRowNumbers`. Off by default. */
@@ -1731,6 +1736,27 @@ type TMDataGridEditingCallbacks<TData extends RowData> = {
1731
1736
  * Pathed issues land on the matching columns; pathless ones on the row.
1732
1737
  */
1733
1738
  rowValidators?: TMDataGridRowValidators;
1739
+ /**
1740
+ * Rules that need the other rows - no duplicate keys, no overlapping
1741
+ * ranges, allocations summing to a total. Handed the committing row and
1742
+ * `rows`, the collection as it would stand if the commit landed: every
1743
+ * draft overlaid, entry rows appended, deletion-marked rows removed.
1744
+ *
1745
+ * ```tsx
1746
+ * tableValidators: {
1747
+ * onSubmit: ({ value, rowId, rows }) =>
1748
+ * rows.some((r) => r.rowId !== rowId && r.value.code === value.code)
1749
+ * ? { fields: { code: "Duplicate code" } }
1750
+ * : undefined,
1751
+ * }
1752
+ * ```
1753
+ *
1754
+ * Runs at every commit, after the row's own validators, and again per
1755
+ * parked row during `saveDrafts` - a draft another edit has invalidated
1756
+ * blocks the save. Pathed issues land on the committing row's cells,
1757
+ * pathless ones on the row.
1758
+ */
1759
+ tableValidators?: TMDataGridTableValidators<TData>;
1734
1760
  /** Rows the pencil skips - `false` keeps a row read-only in every mode. */
1735
1761
  isRowEditable?: (row: Row<TMDataGridFeatures, TData>) => boolean;
1736
1762
  /**
@@ -1751,35 +1777,43 @@ type TMDataGridEditingCallbacks<TData extends RowData> = {
1751
1777
  */
1752
1778
  newRowDefaults?: TData | (() => TData);
1753
1779
  /**
1754
- * Called when an entry row commits: `Enter` or the lane's ✓ under the
1755
- * immediate modes, `submitAll` under draft. Create the record and let it
1756
- * arrive back through `data`; the engine's `tempId` never leaves the grid.
1780
+ * Called when an entry row commits: `Enter` or the lane's ✓, or
1781
+ * `saveDrafts` under `editing.draft`. Create the record and let it arrive
1782
+ * back through `data`; the engine's `tempId` never leaves the grid.
1757
1783
  */
1758
1784
  onRowAdd?: (args: TMDataGridRowAddArgs<TData>) => void | Promise<void>;
1759
1785
  /**
1760
- * Called by `edit.deleteRow` under the immediate modes - confirmation, if
1761
- * any, belongs in here. Under draft, deletions accumulate in
1762
- * `edit.state.deletedRowIds` instead and are reported by `submitAll`.
1763
- * Setting this also puts the trash can in the edit lane.
1786
+ * Called by `edit.deleteRow` - confirmation, if any, belongs in here. Under
1787
+ * `editing.draft` deletions accumulate in `edit.state.deletedRowIds`
1788
+ * instead and are reported by `saveDrafts`. Setting this also puts the
1789
+ * trash can in the edit lane.
1764
1790
  */
1765
1791
  onRowDelete?: (args: TMDataGridRowDeleteArgs<TData>) => void | Promise<void>;
1766
1792
  };
1767
1793
  /**
1768
1794
  * The `editing` option: one object that turns editing on and holds
1769
- * everything about it. `mode` picks what counts as a commit and which
1770
- * controls trigger it; the other members act within that mode.
1795
+ * everything about it. Two axes, and they are independent: `mode` picks what
1796
+ * counts as a commit, `draft` picks where that commit goes.
1797
+ *
1798
+ * | Mode | Commit | Cancel | Controls |
1799
+ * | ---- | ------ | ------ | -------- |
1800
+ * | `"cell"` | Enter, Tab, blur - Sheets | Escape | none |
1801
+ * | `"cellConfirm"` | ✓ or Enter; Tab and blur keep the draft | ✕ or Escape | ✓ / ✕ beside the input |
1802
+ * | `"row"` | Save in the edit lane, or Enter | Cancel, or Escape | generated edit lane |
1803
+ *
1804
+ * | `draft` | Where a commit goes |
1805
+ * | ------- | ------------------- |
1806
+ * | `false` (default) | Out as it happens - `onCommit`, `onRowAdd`, `onRowDelete` |
1807
+ * | `true` | Into the grid's draft store; `edit.saveDrafts()` sends the lot |
1771
1808
  *
1772
- * | Mode | Commit | Cancel |
1773
- * | ---- | ------ | ------ |
1774
- * | `"cell"` | Enter, Tab, blur - Sheets | Escape |
1775
- * | `"cellConfirm"` | ✓ or Enter only; blur keeps the draft | ✕ or Escape |
1776
- * | `"row"` | Save in the edit lane, or Ctrl+Enter | Cancel, or Escape |
1777
- * | `"draft"` | `edit.commit(rowId)` into the draft store, `edit.saveDrafts()` out | `edit.cancelAll()` |
1809
+ * So `{ mode: "row", draft: true }` is "edit a row, the lane's ✓ parks it,
1810
+ * the toolbar's Save sends every parked row at once", and
1811
+ * `{ mode: "cell", draft: true }` is the same store filled cell by cell.
1778
1812
  *
1779
1813
  * Setting `editing` makes `getRowId` required - drafts are keyed by row id,
1780
1814
  * and the index fallback would name a different record after any sort - and
1781
- * `onSaveDrafts` exists only under `mode: "draft"`, the one mode with a draft
1782
- * store to save.
1815
+ * `onSaveDrafts` exists only under `draft: true`, the one configuration with
1816
+ * a draft store to save.
1783
1817
  *
1784
1818
  * The object may be written inline: the callbacks are read through a ref
1785
1819
  * every render, so its identity does not matter.
@@ -1790,10 +1824,34 @@ type TMDataGridEditingCallbacks<TData extends RowData> = {
1790
1824
  * built-in editor, and `enabled`, `field`, `editor`, `validate` and `mapValue`
1791
1825
  * override the rest.
1792
1826
  */
1793
- type TMDataGridEditingOptions<TData extends RowData> = TMDataGridEditingCallbacks<TData> & ({
1794
- mode: "draft";
1827
+ type TMDataGridEditingOptions<TData extends RowData> = TMDataGridEditingCallbacks<TData> & {
1828
+ /** What counts as a commit. See the table above. */
1829
+ mode: TMDataGridEditMode;
1795
1830
  /**
1796
- * Draft mode's save: called once by `edit.saveDrafts()` with the
1831
+ * The column ids that take edits, by id. Unset - the default - every
1832
+ * column mapping to a data path is editable, which is what a grid whose
1833
+ * columns are mostly the record itself wants.
1834
+ *
1835
+ * Set it for the other shape: a grid of reference data with one or two
1836
+ * columns the user maintains, where naming those is shorter and harder to
1837
+ * get wrong than switching every other column off one by one.
1838
+ *
1839
+ * This gates before `meta.edit`, never past it: a column left out takes no
1840
+ * edits whatever its own meta says, and a column listed here still answers
1841
+ * to its `meta.edit.enabled`.
1842
+ */
1843
+ columns?: ReadonlyArray<string>;
1844
+ } & ({
1845
+ /**
1846
+ * Commits park in the grid's draft store instead of reaching the
1847
+ * consumer, and leave together through `edit.saveDrafts()`. The
1848
+ * edit lane gains the change markers and the per-row revert, the
1849
+ * trash marks a row for deletion rather than deleting it, and
1850
+ * `TMDataGrid.DraftActions` gets something to save.
1851
+ */
1852
+ draft: true;
1853
+ /**
1854
+ * The bulk save: called once by `edit.saveDrafts()` with the
1797
1855
  * whole draft store - committed edits, added rows and deletion
1798
1856
  * marks - so a server can apply it as one transaction. Without it,
1799
1857
  * `saveDrafts` falls back to the per-row
@@ -1811,20 +1869,21 @@ type TMDataGridEditingOptions<TData extends RowData> = TMDataGridEditingCallback
1811
1869
  */
1812
1870
  onCommitDrafts?: (args: TMDataGridSaveDraftsArgs<TData>) => void | TMDataGridSaveDraftsResult | Promise<void | TMDataGridSaveDraftsResult>;
1813
1871
  /**
1814
- * Keep committed entry rows pinned in the sticky entry block until
1815
- * the draft store is saved. Off by default: a committed row joins
1816
- * the scrolling flow above the body rows instead - the block a row
1817
- * is *typed* into is always sticky, but committed rows scroll, so
1818
- * committing many cannot fill the viewport with sticky chrome.
1872
+ * Keep parked entry rows pinned in the sticky entry block until
1873
+ * the draft store is saved. Off by default: a parked row joins the
1874
+ * scrolling flow above the body rows instead - the block a row is
1875
+ * *typed* into is always sticky, but parked rows scroll, so
1876
+ * entering many cannot fill the viewport with sticky chrome.
1819
1877
  */
1820
1878
  newRowsSticky?: boolean;
1821
1879
  } | {
1822
- mode: Exclude<TMDataGridEditMode, "draft">;
1823
- /** Only `"draft"` has a draft store to save - see the other branch. */
1880
+ /** Every commit reaches the consumer as it happens. The default. */
1881
+ draft?: false;
1882
+ /** Only `draft: true` has a store to save - see the other branch. */
1824
1883
  onSaveDrafts?: never;
1825
1884
  /** @deprecated See {@link onSaveDrafts}. */
1826
1885
  onCommitDrafts?: never;
1827
- /** Committed entry rows exist only under `"draft"` - see there. */
1886
+ /** Parked entry rows exist only under `draft: true` - see there. */
1828
1887
  newRowsSticky?: never;
1829
1888
  });
1830
1889
  type UseTMDataGridOptions<TData extends RowData> = Omit<TableOptions<TMDataGridFeatures, TData>, "features"> & ({
@@ -2091,6 +2150,130 @@ declare function useTMDataGrid<TData extends RowData>({ persist, labels: labelsO
2091
2150
  */
2092
2151
  declare function openColumnFilter<TData extends RowData>(api: TMDataGridApi<TData>, columnId: string): void;
2093
2152
  //#endregion
2153
+ //#region .types-tmp/components/TMDataGridDraftActions.d.ts
2154
+ /** What the edit chrome is showing. */
2155
+ type TMDataGridDraftActionsState = {
2156
+ /**
2157
+ * Rows in the draft store, which is what Save sends: committed edits,
2158
+ * committed entry rows and deletion marks.
2159
+ */
2160
+ draftCount: number;
2161
+ /**
2162
+ * Rows still open - edited or entered but not committed, so not part of
2163
+ * the save. They stay open across a save.
2164
+ */
2165
+ openCount: number;
2166
+ /**
2167
+ * The ids behind {@link openCount}, in the order the grid opened them - a
2168
+ * sort, a filter or a page never moves this list. An entered row appears as
2169
+ * its `tempId`.
2170
+ *
2171
+ * Narrower than `edit.state.openRowIds`, which is every row holding a form,
2172
+ * the parked ones included. And note the ordering:
2173
+ * {@link TMDataGridDraftActionsActions.scrollToFirstOpenRow} takes "first"
2174
+ * in display order, so it need not be `openRowIds[0]`.
2175
+ */
2176
+ openRowIds: ReadonlyArray<string>;
2177
+ /**
2178
+ * @deprecated Was "everything uncommitted", which Save no longer sends.
2179
+ * Reads as `draftCount + openCount`; use whichever you meant.
2180
+ */
2181
+ pendingCount: number;
2182
+ /** Whether a submit is in flight. */
2183
+ isSubmitting: boolean;
2184
+ };
2185
+ /** What the edit chrome can do. */
2186
+ type TMDataGridDraftActionsActions = {
2187
+ /** Saves the draft store. Open rows are left alone. */
2188
+ save: () => Promise<boolean>;
2189
+ /** Submits every open row, committing the ones that validate. */
2190
+ commitAll: () => Promise<boolean>;
2191
+ /** Drops everything - open form state and the draft store alike. */
2192
+ discard: () => void;
2193
+ /**
2194
+ * `grid.scrollToRow`, so a control in here can take the user to a row
2195
+ * without the grid being threaded down to it.
2196
+ */
2197
+ scrollToRow: (args: TMDataGridScrollToRowArgs) => boolean;
2198
+ /**
2199
+ * Scrolls to the first row still open, taking "first" in display order: the
2200
+ * topmost open row under the current sort, filter and page. That need not
2201
+ * be {@link TMDataGridDraftActionsState.openRowIds}`[0]`, which is the
2202
+ * order the grid opened them in.
2203
+ *
2204
+ * Answers whether an open row could be reached. `false` when nothing is
2205
+ * open, and when every open row is filtered out, on another page or
2206
+ * collapsed inside a group. An open entry row answers `true` without
2207
+ * scrolling - it is sticky under the header, so it is on screen already -
2208
+ * and so does an open row pinned to an edge. The scroll goes through
2209
+ * `scrollToRow`, so before `TMDataGrid.Table` has mounted there is nothing
2210
+ * to scroll and the answer is `false`.
2211
+ */
2212
+ scrollToFirstOpenRow: (align?: TMDataGridScrollAlign) => boolean;
2213
+ };
2214
+ /** The pre-bound pieces of the built-in edit chrome. */
2215
+ type TMDataGridDraftActionsControls = {
2216
+ /** Save, with the draft count, disabled while the draft store is empty. */
2217
+ Save: () => ReactNode;
2218
+ /** Discard, disabled while nothing is pending. */
2219
+ Discard: () => ReactNode;
2220
+ /** The "N rows still being edited" note, or nothing while there are none. */
2221
+ OpenRowsNote: () => ReactNode;
2222
+ };
2223
+ /** What {@link TMDataGridDraftActionsProps.renderActions} is handed. */
2224
+ type TMDataGridDraftActionsSlotArgs = {
2225
+ state: TMDataGridDraftActionsState;
2226
+ actions: TMDataGridDraftActionsActions;
2227
+ Controls: TMDataGridDraftActionsControls;
2228
+ };
2229
+ type TMDataGridDraftActionsProps = {
2230
+ /**
2231
+ * Replaces the built-in Save/Discard pair, and is handed the pieces of it.
2232
+ *
2233
+ * ```tsx
2234
+ * <TMDataGrid.DraftActions
2235
+ * renderActions={({ state, Controls }) => (
2236
+ * <Group>
2237
+ * {state.draftCount > 0 && <Badge>{state.draftCount}</Badge>}
2238
+ * <Controls.OpenRowsNote />
2239
+ * <Controls.Save />
2240
+ * <Controls.Discard />
2241
+ * </Group>
2242
+ * )}
2243
+ * />
2244
+ * ```
2245
+ */
2246
+ renderActions?: (args: TMDataGridDraftActionsSlotArgs) => ReactNode;
2247
+ };
2248
+ /**
2249
+ * The draft store's toolbar chrome: Save with the store's count, Discard, and
2250
+ * a note counting the rows still open. Save sends the store and leaves open
2251
+ * rows alone, so it greys out while nothing is parked however much is being
2252
+ * typed - the note is what makes those rows visible.
2253
+ *
2254
+ * Works under any `editing.mode`. The toolbar is declarative: the grid does
2255
+ * not decide for you, so include this only when the grid runs a draft store -
2256
+ * without `editing.draft` there is nothing to save and Save stays disabled.
2257
+ *
2258
+ * ```tsx
2259
+ * <TMDataGrid.Toolbar>
2260
+ * <TMDataGrid.SummaryCount />
2261
+ * <TMDataGrid.Spacer />
2262
+ * <TMDataGrid.DraftActions />
2263
+ * </TMDataGrid.Toolbar>
2264
+ * ```
2265
+ */
2266
+ declare function TMDataGridDraftActions({ renderActions }?: TMDataGridDraftActionsProps): string | number | bigint | boolean | import("react").JSX.Element | Iterable<ReactNode> | Promise<string | number | bigint | boolean | Iterable<ReactNode> | import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>> | import("react").ReactPortal | null | undefined> | null | undefined;
2267
+ //#endregion
2268
+ //#region .types-tmp/components/TMDataGridFilterPanel.d.ts
2269
+ /**
2270
+ * The MUI-style filter surface: one row per active column filter, each row a
2271
+ * column / operator / value triple. It only ever reads and writes the table's
2272
+ * `columnFilters` state, so a `manualFiltering` grid gets the same panel for
2273
+ * free - the state is forwarded to the server instead of a row model.
2274
+ */
2275
+ declare function TMDataGridFilterPanel(): import("react").JSX.Element | null;
2276
+ //#endregion
2094
2277
  //#region .types-tmp/components/TMDataGridFilterPills.d.ts
2095
2278
  type TMDataGridFilterPillsProps<TData extends RowData> = {
2096
2279
  /** The object returned by `useTMDataGrid`. */
@@ -2760,7 +2943,7 @@ declare const TMDataGrid: typeof TMDataGridRoot & {
2760
2943
  SummaryCount: typeof TMDataGridSummaryCount;
2761
2944
  LoadingIndicator: typeof TMDataGridLoadingIndicator;
2762
2945
  Search: typeof TMDataGridSearch;
2763
- EditActions: typeof TMDataGridEditActions;
2946
+ DraftActions: typeof TMDataGridDraftActions;
2764
2947
  ColumnsButton: typeof TMDataGridColumnsButton;
2765
2948
  FilterButton: typeof TMDataGridFilterButton;
2766
2949
  Table: typeof TMDataGridTable$1;
@@ -2999,6 +3182,10 @@ type TMDataGridAggregationName = keyof typeof aggregationFns;
2999
3182
  * Filtered rather than paginated rows, so the total covers everything the
3000
3183
  * filters left (all pages), and follows the filters as they change. Reuses
3001
3184
  * TanStack's registered aggregation functions; `fn` defaults to `"sum"`.
3185
+ *
3186
+ * Every data row counts once. Grouping builds its group rows from this model
3187
+ * rather than into it, so a grouped grid totals its records, not its records
3188
+ * plus their subtotals; a tree counts parents and children alike.
3002
3189
  */
3003
3190
  declare function aggregateColumn<TData extends RowData>({ table, columnId, fn }: {
3004
3191
  table: TMDataGridTable<TData>;
@@ -3243,4 +3430,4 @@ declare function getSelectableRowIds<TData extends RowData>(row: Row<TMDataGridF
3243
3430
  */
3244
3431
  declare function resolveRowSelectionClick<TData extends RowData>({ rows, rowId, anchorRowId, modifiers, selection, canReplaceSelection }: ResolveRowSelectionClickArgs<TData>): ResolvedRowSelection;
3245
3432
  //#endregion
3246
- export { type BuildCellMatrixArgs, type ColumnStepArgs, DATA_STATE_SLICES, DEFAULT_CELL_EXPORT_OPTIONS, DEFAULT_TMDATAGRID_SIZE, DETAILS_COLUMN_ID, DgAutocompleteFilter, DgDateRangeFilter, DgRangeSliderFilter, DgTriStateFilter, EDIT_COLUMN_ID, FILTER_OPERATOR_LABELS, GROUP_COLUMN_ID, type MoveColumnArgs, PERSIST_PAYLOAD_VERSION, ROW_NUMBER_COLUMN_ID, type ResolveCellMoveArgs, type ResolveRangeBoundsArgs, type ResolveRowSelectionClickArgs, type ResolvedRowSelection, SELECT_COLUMN_ID, SETTINGS_STATE_SLICES, SIZE_CONTROL_SIZE, SIZE_ROW_HEIGHT, TMDATAGRID_LABELS_EN, TMDATAGRID_LABELS_SV, TMDataGrid, type TMDataGridAddRowsOptions, type TMDataGridAddRowsResult, type TMDataGridAggregationName, type TMDataGridApi, TMDataGridBooleanEditor, type TMDataGridCapabilities, type TMDataGridCellCoords, type TMDataGridCellEventArgs, type TMDataGridCellExportOptions, type TMDataGridCellMatrix, type TMDataGridCellNav, type TMDataGridCellPosition, type TMDataGridCellRange, type TMDataGridCellSelectionMode, type TMDataGridColumnCapabilities, type TMDataGridColumnEditOptions, type TMDataGridColumnFilterOptions, type TMDataGridColumnLayout, type TMDataGridColumnMenuItemsArgs, type TMDataGridColumnMenuItemsRenderer, type TMDataGridColumnMeta, type TMDataGridColumnRegion, type TMDataGridColumnType, type TMDataGridContextValue, type TMDataGridDataSlice, TMDataGridDateEditor, type TMDataGridDetailsArgs, type TMDataGridDetailsRenderer, type TMDataGridDropSide, TMDataGridEditActions, type TMDataGridEditActionsActions, type TMDataGridEditActionsControls, type TMDataGridEditActionsProps, type TMDataGridEditActionsSlotArgs, type TMDataGridEditActionsState, type TMDataGridEditApi, type TMDataGridEditChange, type TMDataGridEditCommitArgs, type TMDataGridEditCommitDraftsArgs, type TMDataGridEditField, type TMDataGridEditMode, type TMDataGridEditRowProjection, type TMDataGridEditState, type TMDataGridEditValueMap, type TMDataGridEditValueMapArgs, type TMDataGridEditingOptions, type TMDataGridEditorArgs, type TMDataGridEditorComponent, type TMDataGridExpandAllArgs, type TMDataGridExpandTarget, type TMDataGridFeatureFlags, type TMDataGridFeatures, type TMDataGridFieldValidate, type TMDataGridFilterControlArgs, type TMDataGridFilterControlComponent, type TMDataGridFilterOperator, TMDataGridFilterPills, type TMDataGridFilterPillsProps, type TMDataGridFilterValue, TMDataGridFilterValueInput, type TMDataGridFooterProps, type TMDataGridLabels, type TMDataGridLabelsOverride, TMDataGridMultiSelectEditor, TMDataGridNumberEditor, type TMDataGridOption, type TMDataGridOptionsArgs, type TMDataGridOptionsSource, type TMDataGridPaginationActions, type TMDataGridPaginationApi, type TMDataGridPaginationControls, type TMDataGridPaginationSlotArgs, type TMDataGridPaginationState, type TMDataGridPersistKey, type TMDataGridPersistence, type TMDataGridProps, type TMDataGridQuickSearchMode, type TMDataGridRangeBounds, type TMDataGridRowAddArgs, type TMDataGridRowClickModifiers, type TMDataGridRowContextMenuArgs, type TMDataGridRowContextMenuRenderer, type TMDataGridRowData, type TMDataGridRowDeleteArgs, type TMDataGridRowEditForm, type TMDataGridRowStyle, type TMDataGridRowValidators, type TMDataGridSaveDraftsArgs, type TMDataGridSaveDraftsResult, type TMDataGridSaveOutcomes, type TMDataGridScrollAlign, type TMDataGridScrollToRowArgs, TMDataGridSearch, type TMDataGridSearchProps, TMDataGridSelectEditor, type TMDataGridSelectionMode, type TMDataGridSettingsSlice, type TMDataGridSize, type TMDataGridStorageMode, TMDataGridStringEditor, type TMDataGridTable, type TMDataGridTableMeta, type TMDataGridTableProps, type TMDataGridUiActions, type TMDataGridUiState, type TMDataGridUiStore, type UseTMDataGridOptions, aggregateColumn, areAllRowsExpanded, autosizeColumn, boundsCellCount, boundsEdges, buildCellMatrix, buildGridCellMatrix, clearedValueForType, createTMDataGridColumnHelper, downloadTextFile, emptyValueForOperator, exportGridToCsv, formatExportValue, formatFilterLabel, formatGroupValue, fuzzyGlobalFilterFn, getColumnCapabilities, getColumnDefaultOperator, getColumnFilterControl, getColumnLabel, getColumnRegion, getColumnType, getDefaultOperator, getDisplayedRows, getEditFieldName, getGridCapabilities, getGroupDataRows, getOperatorsForType, getSelectableRowIds, getStepTargetColumn, getTMDataGridPaginationApi, isColumnEditableForRow, isColumnReorderable, isControlColumn, isFilterActive, isGeneratedColumn, isPagingActive, isSameCell, isWithinBounds, keepGeneratedColumnsOutermost, measureColumnContentWidth, mergeLabels, moveColumn, moveColumnByStep, normalizeFieldValidate, openColumnFilter, operatorNeedsValue, operatorTakesArrayValue, operatorTakesRangeValue, optionsToComboboxData, readFeatureFlags, resolveCellMove, resolveColumnOptions, resolveExpandAll, resolveRangeBounds, resolveRowSelectionClick, tmDataGridFeatures, toClipboardText, toExcelCsv, useCellControlTabIndex, useTMDataGrid, useTMDataGridContext, writeClipboardText };
3433
+ export { type BuildCellMatrixArgs, type ColumnStepArgs, DATA_STATE_SLICES, DEFAULT_CELL_EXPORT_OPTIONS, DEFAULT_TMDATAGRID_SIZE, DETAILS_COLUMN_ID, DgAutocompleteFilter, DgDateRangeFilter, DgRangeSliderFilter, DgTriStateFilter, EDIT_COLUMN_ID, FILTER_OPERATOR_LABELS, GROUP_COLUMN_ID, type MoveColumnArgs, PERSIST_PAYLOAD_VERSION, ROW_NUMBER_COLUMN_ID, type ResolveCellMoveArgs, type ResolveRangeBoundsArgs, type ResolveRowSelectionClickArgs, type ResolvedRowSelection, SELECT_COLUMN_ID, SETTINGS_STATE_SLICES, SIZE_CONTROL_SIZE, SIZE_ROW_HEIGHT, TMDATAGRID_LABELS_EN, TMDATAGRID_LABELS_SV, TMDataGrid, type TMDataGridAddRowsOptions, type TMDataGridAddRowsResult, type TMDataGridAggregationName, type TMDataGridApi, TMDataGridBooleanEditor, type TMDataGridCapabilities, type TMDataGridCellCoords, type TMDataGridCellEventArgs, type TMDataGridCellExportOptions, type TMDataGridCellMatrix, type TMDataGridCellNav, type TMDataGridCellPosition, type TMDataGridCellRange, type TMDataGridCellSelectionMode, type TMDataGridColumnCapabilities, type TMDataGridColumnEditOptions, type TMDataGridColumnFilterOptions, type TMDataGridColumnLayout, type TMDataGridColumnMenuItemsArgs, type TMDataGridColumnMenuItemsRenderer, type TMDataGridColumnMeta, type TMDataGridColumnRegion, type TMDataGridColumnType, type TMDataGridContextValue, type TMDataGridDataSlice, TMDataGridDateEditor, type TMDataGridDetailsArgs, type TMDataGridDetailsRenderer, TMDataGridDraftActions, type TMDataGridDraftActionsActions, type TMDataGridDraftActionsControls, type TMDataGridDraftActionsProps, type TMDataGridDraftActionsSlotArgs, type TMDataGridDraftActionsState, type TMDataGridDropSide, type TMDataGridEditApi, type TMDataGridEditChange, type TMDataGridEditCommitArgs, type TMDataGridEditCommitDraftsArgs, type TMDataGridEditField, type TMDataGridEditMode, type TMDataGridEditRowProjection, type TMDataGridEditState, type TMDataGridEditValueMap, type TMDataGridEditValueMapArgs, type TMDataGridEditingOptions, type TMDataGridEditorArgs, type TMDataGridEditorComponent, type TMDataGridExpandAllArgs, type TMDataGridExpandTarget, type TMDataGridFeatureFlags, type TMDataGridFeatures, type TMDataGridFieldValidate, type TMDataGridFilterControlArgs, type TMDataGridFilterControlComponent, type TMDataGridFilterOperator, TMDataGridFilterPills, type TMDataGridFilterPillsProps, type TMDataGridFilterValue, TMDataGridFilterValueInput, type TMDataGridFooterProps, type TMDataGridLabels, type TMDataGridLabelsOverride, TMDataGridMultiSelectEditor, TMDataGridNumberEditor, type TMDataGridOption, type TMDataGridOptionsArgs, type TMDataGridOptionsSource, type TMDataGridPaginationActions, type TMDataGridPaginationApi, type TMDataGridPaginationControls, type TMDataGridPaginationSlotArgs, type TMDataGridPaginationState, type TMDataGridPersistKey, type TMDataGridPersistence, type TMDataGridProps, type TMDataGridQuickSearchMode, type TMDataGridRangeBounds, type TMDataGridRowAddArgs, type TMDataGridRowClickModifiers, type TMDataGridRowContextMenuArgs, type TMDataGridRowContextMenuRenderer, type TMDataGridRowData, type TMDataGridRowDeleteArgs, type TMDataGridRowEditForm, type TMDataGridRowStyle, type TMDataGridRowValidators, type TMDataGridSaveDraftsArgs, type TMDataGridSaveDraftsResult, type TMDataGridSaveOutcomes, type TMDataGridScrollAlign, type TMDataGridScrollToRowArgs, TMDataGridSearch, type TMDataGridSearchProps, TMDataGridSelectEditor, type TMDataGridSelectionMode, type TMDataGridSettingsSlice, type TMDataGridSize, type TMDataGridStorageMode, TMDataGridStringEditor, type TMDataGridTable, type TMDataGridTableMeta, type TMDataGridTableProps, type TMDataGridTableValidateArgs, type TMDataGridTableValidators, type TMDataGridUiActions, type TMDataGridUiState, type TMDataGridUiStore, type UseTMDataGridOptions, aggregateColumn, areAllRowsExpanded, autosizeColumn, boundsCellCount, boundsEdges, buildCellMatrix, buildGridCellMatrix, clearedValueForType, createTMDataGridColumnHelper, downloadTextFile, emptyValueForOperator, exportGridToCsv, formatExportValue, formatFilterLabel, formatGroupValue, fuzzyGlobalFilterFn, getColumnCapabilities, getColumnDefaultOperator, getColumnFilterControl, getColumnLabel, getColumnRegion, getColumnType, getDefaultOperator, getDisplayedRows, getEditFieldName, getGridCapabilities, getGroupDataRows, getOperatorsForType, getSelectableRowIds, getStepTargetColumn, getTMDataGridPaginationApi, isColumnEditableForRow, isColumnReorderable, isControlColumn, isFilterActive, isGeneratedColumn, isPagingActive, isSameCell, isWithinBounds, keepGeneratedColumnsOutermost, measureColumnContentWidth, mergeLabels, moveColumn, moveColumnByStep, normalizeFieldValidate, openColumnFilter, operatorNeedsValue, operatorTakesArrayValue, operatorTakesRangeValue, optionsToComboboxData, readFeatureFlags, resolveCellMove, resolveColumnOptions, resolveExpandAll, resolveRangeBounds, resolveRowSelectionClick, tmDataGridFeatures, toClipboardText, toExcelCsv, useCellControlTabIndex, useTMDataGrid, useTMDataGridContext, writeClipboardText };