zubin-grid 0.4.11 → 0.4.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +61 -0
- package/dist/core/cell.d.ts +4 -4
- package/dist/core/cell.d.ts.map +1 -1
- package/dist/core/cell.js.map +1 -1
- package/dist/core/grid.d.ts +7 -6
- package/dist/core/grid.d.ts.map +1 -1
- package/dist/core/grid.js +283 -1
- package/dist/core/grid.js.map +1 -1
- package/dist/core/gridPersist.d.ts +2 -7
- package/dist/core/gridPersist.d.ts.map +1 -1
- package/dist/core/gridPersist.js +1 -207
- package/dist/core/gridPersist.js.map +1 -1
- package/dist/core/head.d.ts +4 -4
- package/dist/core/head.d.ts.map +1 -1
- package/dist/core/helpers.d.ts +2 -2
- package/dist/core/helpers.d.ts.map +1 -1
- package/dist/core/persist.d.ts +8 -0
- package/dist/core/persist.d.ts.map +1 -0
- package/dist/core/persist.js +208 -0
- package/dist/core/persist.js.map +1 -0
- package/dist/core/tail.d.ts +5 -5
- package/dist/core/tail.d.ts.map +1 -1
- package/dist/core/types/cell.types.d.ts.map +1 -0
- package/dist/core/{cell.types.js.map → types/cell.types.js.map} +1 -1
- package/dist/core/{grid.types.d.ts → types/grid.types.d.ts} +26 -1
- package/dist/core/types/grid.types.d.ts.map +1 -0
- package/dist/core/{grid.types.js.map → types/grid.types.js.map} +1 -1
- package/dist/core/types/gridPersist.types.d.ts +2 -0
- package/dist/core/types/gridPersist.types.d.ts.map +1 -0
- package/dist/core/types/gridPersist.types.js.map +1 -0
- package/dist/core/types/head.types.d.ts.map +1 -0
- package/dist/core/{head.types.js.map → types/head.types.js.map} +1 -1
- package/dist/core/{gridPersist.types.d.ts → types/persist.types.d.ts} +1 -1
- package/dist/core/types/persist.types.d.ts.map +1 -0
- package/dist/core/types/persist.types.js +2 -0
- package/dist/core/types/persist.types.js.map +1 -0
- package/dist/core/types/tail.types.d.ts.map +1 -0
- package/dist/core/{tail.types.js.map → types/tail.types.js.map} +1 -1
- package/dist/index.d.ts +5 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +5 -1
- package/dist/core/cell.types.d.ts.map +0 -1
- package/dist/core/grid.types.d.ts.map +0 -1
- package/dist/core/gridPersist.types.d.ts.map +0 -1
- package/dist/core/gridPersist.types.js.map +0 -1
- package/dist/core/head.types.d.ts.map +0 -1
- package/dist/core/tail.types.d.ts.map +0 -1
- /package/dist/core/{cell.types.d.ts → types/cell.types.d.ts} +0 -0
- /package/dist/core/{cell.types.js → types/cell.types.js} +0 -0
- /package/dist/core/{grid.types.js → types/grid.types.js} +0 -0
- /package/dist/core/{gridPersist.types.js → types/gridPersist.types.js} +0 -0
- /package/dist/core/{head.types.d.ts → types/head.types.d.ts} +0 -0
- /package/dist/core/{head.types.js → types/head.types.js} +0 -0
- /package/dist/core/{tail.types.d.ts → types/tail.types.d.ts} +0 -0
- /package/dist/core/{tail.types.js → types/tail.types.js} +0 -0
package/README.md
CHANGED
|
@@ -134,6 +134,8 @@ export function BudgetCell(props: {
|
|
|
134
134
|
}
|
|
135
135
|
```
|
|
136
136
|
|
|
137
|
+
`useCell(grid, rowId, columnId)` returns a React-friendly setter for that cell. Outside React, mutate store cells with `grid.upsertCell(...)` or `grid.upsertCells(...)` rather than a store-level `setValue(...)` helper.
|
|
138
|
+
|
|
137
139
|
## Working with heads
|
|
138
140
|
|
|
139
141
|
Headers are stored separately from cell values, so labels and order can change without rebuilding the grid.
|
|
@@ -320,6 +322,63 @@ salesGrid.upsertCell({ rowId: 'west', columnId: 'mar', value: 21 })
|
|
|
320
322
|
|
|
321
323
|
`getValue`, `getRowHead`, and `getColumnHead` are also non-reactive getters when you only need a targeted read.
|
|
322
324
|
|
|
325
|
+
## Sub grids
|
|
326
|
+
|
|
327
|
+
Use `createSubGrid` when you want a second grid layer that reuses the parent grid's row and column dimensions, but stores a different cell shape.
|
|
328
|
+
|
|
329
|
+
```ts
|
|
330
|
+
import { createSubGrid, useCell } from 'zubin-grid'
|
|
331
|
+
|
|
332
|
+
type SalesNoteCell = {
|
|
333
|
+
note: string
|
|
334
|
+
dirty?: boolean
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
const salesNotesGrid = createSubGrid<SalesNoteCell>(salesGrid, [], ['sales-notes'])
|
|
338
|
+
|
|
339
|
+
function SalesNote(props: {
|
|
340
|
+
rowId: 'north' | 'south'
|
|
341
|
+
columnId: 'jan' | 'feb'
|
|
342
|
+
}) {
|
|
343
|
+
const [noteCell, setNoteCell] = useCell(
|
|
344
|
+
salesNotesGrid,
|
|
345
|
+
props.rowId,
|
|
346
|
+
props.columnId,
|
|
347
|
+
)
|
|
348
|
+
|
|
349
|
+
return (
|
|
350
|
+
<input
|
|
351
|
+
value={noteCell.note}
|
|
352
|
+
onChange={(event) =>
|
|
353
|
+
setNoteCell({
|
|
354
|
+
...noteCell,
|
|
355
|
+
note: event.target.value,
|
|
356
|
+
dirty: true,
|
|
357
|
+
})
|
|
358
|
+
}
|
|
359
|
+
/>
|
|
360
|
+
)
|
|
361
|
+
}
|
|
362
|
+
```
|
|
363
|
+
|
|
364
|
+
Sub grids behave like normal grids for cell and hook usage, with a few important rules:
|
|
365
|
+
|
|
366
|
+
- They inherit the parent grid's row ids, column ids, row heads, and column heads.
|
|
367
|
+
- Parent row and column changes stay in sync, including upserts, label changes, order changes, `setGrid(...)`, and `clearGrid()`.
|
|
368
|
+
- `useCell`, `useCellValue`, `useGrid`, `useRowHead`, `useColumnHead`, `useRowTail`, and `useColumnTail` all work with sub grids.
|
|
369
|
+
- Persistence is independent, so a sub grid can keep its own snapshot with `persist: ['your-key']`.
|
|
370
|
+
- Row and column mutations called on a sub grid are forwarded to the parent grid.
|
|
371
|
+
- `clearGrid()` on a sub grid clears the sub grid's own cells while keeping the inherited parent dimensions intact.
|
|
372
|
+
|
|
373
|
+
You can also pass an options object when you want cells plus persistence together in a single argument:
|
|
374
|
+
|
|
375
|
+
```ts
|
|
376
|
+
const salesFlagsGrid = createSubGrid<SalesNoteCell>(salesGrid, {
|
|
377
|
+
cells: [{ rowId: 'north', columnId: 'jan', value: { note: 'Review' } }],
|
|
378
|
+
persist: ['sales-flags'],
|
|
379
|
+
})
|
|
380
|
+
```
|
|
381
|
+
|
|
323
382
|
## Persistence
|
|
324
383
|
|
|
325
384
|
Use `persist` to cache the current grid snapshot under a storage key. A custom adapter can be provided, otherwise `zubin-grid` falls back to a default async browser storage implementation with a runtime cache.
|
|
@@ -360,6 +419,7 @@ const persistedWithCustomAdapter = grid<SalesSchema>(initialState, {
|
|
|
360
419
|
- `cell(initialValue)` - creates a reactive cell
|
|
361
420
|
- `grid({ rows, columns, cells }, options)` - creates a grid from JSON-friendly state
|
|
362
421
|
- `grid(() => ({ rows, columns, cells }), options)` - lazily creates typed grid state
|
|
422
|
+
- `createSubGrid(parentGrid, cellsOrOptions?, persist?)` - creates a child grid with its own cells while inheriting the parent grid dimensions
|
|
363
423
|
|
|
364
424
|
### Cell hooks
|
|
365
425
|
|
|
@@ -405,6 +465,7 @@ Use the root package for most cases:
|
|
|
405
465
|
```ts
|
|
406
466
|
import {
|
|
407
467
|
cell,
|
|
468
|
+
createSubGrid,
|
|
408
469
|
grid,
|
|
409
470
|
useCell,
|
|
410
471
|
useCellValue,
|
package/dist/core/cell.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import type { Cell, CellInitializer } from "./cell.types.js";
|
|
2
|
-
import type { Grid, GridPosition, GridState } from "./grid.types.js";
|
|
3
|
-
import type { GridHead } from "./head.types.js";
|
|
4
|
-
export type { Cell, Subscriber, Updater } from "./cell.types.js";
|
|
1
|
+
import type { Cell, CellInitializer } from "./types/cell.types.js";
|
|
2
|
+
import type { Grid, GridPosition, GridState } from "./types/grid.types.js";
|
|
3
|
+
import type { GridHead } from "./types/head.types.js";
|
|
4
|
+
export type { Cell, Subscriber, Updater } from "./types/cell.types.js";
|
|
5
5
|
export declare function cell<TCell>(initialValue: TCell | CellInitializer<TCell>): Cell<TCell>;
|
|
6
6
|
export declare function useCell<TCell>(currentCell: Cell<TCell>): readonly [TCell, (newValue: TCell) => void];
|
|
7
7
|
export declare function useCell<TCell, TRowId extends string, TColumnId extends string, TRowHead extends GridHead<TRowId>, TColumnHead extends GridHead<TColumnId>, TStateCell, TState extends GridState<TStateCell, TRowHead, TColumnHead>>(currentGrid: Grid<TCell, TRowId, TColumnId, TRowHead, TColumnHead, TStateCell, TState>, position: GridPosition<TColumnId, TRowId>): readonly [TCell, (newValue: TCell) => void];
|
package/dist/core/cell.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cell.d.ts","sourceRoot":"","sources":["../../core/cell.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,eAAe,EAAuB,MAAM,
|
|
1
|
+
{"version":3,"file":"cell.d.ts","sourceRoot":"","sources":["../../core/cell.ts"],"names":[],"mappings":"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"}
|
package/dist/core/cell.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cell.js","sourceRoot":"","sources":["../../core/cell.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"cell.js","sourceRoot":"","sources":["../../core/cell.ts"],"names":[],"mappings":"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"}
|
package/dist/core/grid.d.ts
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
|
-
import type { Grid, GridAxisIds, GridRecord, GridSchemaOptions, GridState, GridStateInitializer, SchemaCell, SchemaCellValue, SchemaColumn, SchemaColumnHead, SchemaColumnId, SchemaRow, SchemaRowHead, SchemaRowId, SchemaSnapshot, UseGridOptions } from "./grid.types.js";
|
|
2
|
-
import type { GridHead } from "./head.types.js";
|
|
3
|
-
export type { Grid, GridAxisIds, GridPersistAdapter, GridPersistOption, GridPosition, GridRows, GridSchemaOptions, GridSetMode, GridState, GridStateCell, GridStateInitializer, GridSubscriber, GridUpdateAction, GridUpdateDiff, GridUpdateSource, GridUpdateType, GridUpsertHead, UseGridOptions, } from "./grid.types.js";
|
|
4
|
-
type BroadSchemaRowHead<TState extends GridState<GridRecord, GridRecord, GridRecord>> = SchemaRow<TState> & GridHead<string>;
|
|
5
|
-
type BroadSchemaColumnHead<TState extends GridState<GridRecord, GridRecord, GridRecord>> = SchemaColumn<TState> & GridHead<string>;
|
|
6
|
-
type BroadSchemaSnapshot<TState extends GridState<GridRecord, GridRecord, GridRecord>> = GridState<SchemaCell<TState>, BroadSchemaRowHead<TState>, BroadSchemaColumnHead<TState>>;
|
|
1
|
+
import type { AnyGrid, BroadSchemaColumnHead, BroadSchemaRowHead, BroadSchemaSnapshot, Grid, GridAxisIds, GridColumnIdOf, GridPersistOption, GridRecord, GridRowIdOf, GridSchemaOptions, GridState, GridStateCell, ParentSubGrid, ParentSubGridOptions, ParentSubGridState, GridStateInitializer, SchemaCell, SchemaCellValue, SchemaColumn, SchemaColumnHead, SchemaColumnId, SchemaRow, SchemaRowHead, SchemaRowId, SchemaSnapshot, UseGridOptions } from "./types/grid.types.js";
|
|
2
|
+
import type { GridHead } from "./types/head.types.js";
|
|
3
|
+
export type { CreateSubGridOptions, Grid, GridAxisIds, GridPersistAdapter, GridPersistOption, GridPosition, GridRows, GridSchemaOptions, GridSetMode, GridState, GridStateCell, GridStateInitializer, GridSubscriber, GridUpdateAction, GridUpdateDiff, GridUpdateSource, GridUpdateType, GridUpsertHead, SubGrid, SubGridState, UseGridOptions, } from "./types/grid.types.js";
|
|
7
4
|
export declare function grid<TState extends GridState<GridRecord, GridRecord, GridRecord>>(source: GridStateInitializer<TState>, options: GridSchemaOptions<TState, keyof SchemaRow<TState> & string, keyof SchemaColumn<TState> & string, keyof SchemaCell<TState> & string, keyof SchemaCell<TState> & string, BroadSchemaSnapshot<TState>>): Grid<SchemaCell<TState>, string, string, BroadSchemaRowHead<TState>, BroadSchemaColumnHead<TState>, SchemaCell<TState>, BroadSchemaSnapshot<TState>>;
|
|
8
5
|
export declare function grid<TState extends GridState<GridRecord, GridRecord, GridRecord>, TRowHeadIdKey extends keyof SchemaRow<TState> & string, TColumnHeadIdKey extends keyof SchemaColumn<TState> & string, TRowCellKey extends keyof SchemaCell<TState> & string, TColumnCellKey extends keyof SchemaCell<TState> & string>(source: GridStateInitializer<TState>, options: GridSchemaOptions<TState, TRowHeadIdKey, TColumnHeadIdKey, TRowCellKey, TColumnCellKey, SchemaSnapshot<TState, TRowHeadIdKey, TColumnHeadIdKey, TRowCellKey, TColumnCellKey>>): Grid<SchemaCellValue<TState, TRowHeadIdKey, TColumnHeadIdKey, TRowCellKey, TColumnCellKey>, SchemaRowId<TState, TRowHeadIdKey>, SchemaColumnId<TState, TColumnHeadIdKey>, SchemaRowHead<TState, TRowHeadIdKey>, SchemaColumnHead<TState, TColumnHeadIdKey>, SchemaCellValue<TState, TRowHeadIdKey, TColumnHeadIdKey, TRowCellKey, TColumnCellKey>, SchemaSnapshot<TState, TRowHeadIdKey, TColumnHeadIdKey, TRowCellKey, TColumnCellKey>>;
|
|
6
|
+
export declare function createSubGrid<TCell, TParentGrid extends AnyGrid = AnyGrid>(parentGrid: TParentGrid): ParentSubGrid<TCell, TParentGrid>;
|
|
7
|
+
export declare function createSubGrid<TCell, TParentGrid extends AnyGrid = AnyGrid>(parentGrid: TParentGrid, initialCells: readonly GridStateCell<TCell, GridRowIdOf<TParentGrid>, GridColumnIdOf<TParentGrid>>[], persist?: GridPersistOption<ParentSubGridState<TCell, TParentGrid>>): ParentSubGrid<TCell, TParentGrid>;
|
|
8
|
+
export declare function createSubGrid<TCell, TParentGrid extends AnyGrid = AnyGrid>(parentGrid: TParentGrid, persist: GridPersistOption<ParentSubGridState<TCell, TParentGrid>>): ParentSubGrid<TCell, TParentGrid>;
|
|
9
|
+
export declare function createSubGrid<TCell, TParentGrid extends AnyGrid = AnyGrid>(parentGrid: TParentGrid, options: ParentSubGridOptions<TCell, TParentGrid>): ParentSubGrid<TCell, TParentGrid>;
|
|
9
10
|
export declare function createGridKey(rowId: string, columnId: string): string;
|
|
10
11
|
export declare function useGrid<TCell, TRowId extends string, TColumnId extends string, TRowHead extends GridHead<TRowId>, TColumnHead extends GridHead<TColumnId>, TStateCell, TState extends GridState<TStateCell, TRowHead, TColumnHead>>(currentGrid: Grid<TCell, TRowId, TColumnId, TRowHead, TColumnHead, TStateCell, TState>, options?: UseGridOptions<TCell, TRowId, TColumnId, TRowHead, TColumnHead, TStateCell, TState>): GridAxisIds<TRowId, TColumnId>;
|
|
11
12
|
//# sourceMappingURL=grid.d.ts.map
|
package/dist/core/grid.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grid.d.ts","sourceRoot":"","sources":["../../core/grid.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"grid.d.ts","sourceRoot":"","sources":["../../core/grid.ts"],"names":[],"mappings":"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"}
|
package/dist/core/grid.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { useCallback, useEffect, useRef, useSyncExternalStore } from "react";
|
|
2
2
|
import { cell } from "./cell.js";
|
|
3
|
-
import { createGridPersistController } from "./gridPersist.js";
|
|
3
|
+
import { createGridPersistController, defaultGridPersistAdapter, } from "./gridPersist.js";
|
|
4
4
|
import { assertHeadId, createHeadCellMap, createHeadOrderIndex, getHeadCell, getOrderedHeads, } from "./head.js";
|
|
5
5
|
import { createTailCellMap, getTailCell, setTailCellResult } from "./tail.js";
|
|
6
6
|
export function grid(input, options) {
|
|
@@ -13,6 +13,126 @@ export function grid(input, options) {
|
|
|
13
13
|
const stateAdapter = createSchemaStateAdapter(rowCellKey, columnCellKey);
|
|
14
14
|
return createGridStore(normalizedRowHeads, normalizedColumnHeads, createGridInitialCellsFromState(initialState.cells, stateAdapter), stateAdapter, schemaOptions.persist);
|
|
15
15
|
}
|
|
16
|
+
export function createSubGrid(parentGrid, cellsOrOptionsOrPersist, persist) {
|
|
17
|
+
const { initialCells, persistOption } = resolveCreateSubGridArgs(cellsOrOptionsOrPersist, persist);
|
|
18
|
+
const parentState = parentGrid.getState();
|
|
19
|
+
const stateAdapter = createGridStateCellAdapter();
|
|
20
|
+
const resolvedInitialCells = assertGridStateCellsWithinAxes(initialCells, parentState.rows, parentState.columns, "Sub grid cells");
|
|
21
|
+
const subGridStore = createGridStore(parentState.rows, parentState.columns, createGridInitialCellsFromState(resolvedInitialCells, stateAdapter), stateAdapter, createSubGridPersistOption(parentGrid, persistOption));
|
|
22
|
+
const getSubGridState = () => {
|
|
23
|
+
const nextParentState = parentGrid.getState();
|
|
24
|
+
return createSubGridState(nextParentState.rows, nextParentState.columns, subGridStore.getState().cells);
|
|
25
|
+
};
|
|
26
|
+
const syncAxesFromParent = () => {
|
|
27
|
+
const nextParentState = parentGrid.getState();
|
|
28
|
+
const currentSubGridState = subGridStore.getState();
|
|
29
|
+
const nextCells = filterGridStateCellsToAxes(currentSubGridState.cells, nextParentState.rows, nextParentState.columns);
|
|
30
|
+
if (haveSameHeadSnapshots(currentSubGridState.rows, nextParentState.rows) &&
|
|
31
|
+
haveSameHeadSnapshots(currentSubGridState.columns, nextParentState.columns) &&
|
|
32
|
+
nextCells.length === currentSubGridState.cells.length) {
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
subGridStore.setGrid({
|
|
36
|
+
rows: nextParentState.rows,
|
|
37
|
+
columns: nextParentState.columns,
|
|
38
|
+
cells: nextCells,
|
|
39
|
+
}, "replace");
|
|
40
|
+
};
|
|
41
|
+
void parentGrid.subscribeGrid((_currentParentGrid, diff) => {
|
|
42
|
+
if (diff.type === "row-head" && diff.rows?.length) {
|
|
43
|
+
diff.rows.forEach((rowHead) => {
|
|
44
|
+
subGridStore.updateRowHead(rowHead.id, rowHead);
|
|
45
|
+
});
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
if (diff.type === "column-head" && diff.columns?.length) {
|
|
49
|
+
diff.columns.forEach((columnHead) => {
|
|
50
|
+
subGridStore.updateColumnHead(columnHead.id, columnHead);
|
|
51
|
+
});
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
if (diff.type === "rows" && diff.rows?.length) {
|
|
55
|
+
subGridStore.upsertRows(diff.rows);
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
if (diff.type === "columns" && diff.columns?.length) {
|
|
59
|
+
subGridStore.upsertColumns(diff.columns);
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
if (diff.type === "grid" && didGridDiffAffectAxes(diff)) {
|
|
63
|
+
syncAxesFromParent();
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
const subGridApi = Object.create(subGridStore);
|
|
67
|
+
Object.defineProperties(subGridApi, {
|
|
68
|
+
rowHeaders: {
|
|
69
|
+
enumerable: true,
|
|
70
|
+
configurable: true,
|
|
71
|
+
get: () => parentGrid.rowHeaders,
|
|
72
|
+
},
|
|
73
|
+
colHeaders: {
|
|
74
|
+
enumerable: true,
|
|
75
|
+
configurable: true,
|
|
76
|
+
get: () => parentGrid.colHeaders,
|
|
77
|
+
},
|
|
78
|
+
});
|
|
79
|
+
subGridApi.getState = getSubGridState;
|
|
80
|
+
subGridApi.getRowHead = (rowId) => parentGrid.getRowHead(rowId);
|
|
81
|
+
subGridApi.getColumnHead = (columnId) => parentGrid.getColumnHead(columnId);
|
|
82
|
+
subGridApi.updateRowHead = (rowId, nextRowHead) => {
|
|
83
|
+
parentGrid.updateRowHead(rowId, nextRowHead);
|
|
84
|
+
};
|
|
85
|
+
subGridApi.updateColumnHead = (columnId, nextColumnHead) => {
|
|
86
|
+
parentGrid.updateColumnHead(columnId, nextColumnHead);
|
|
87
|
+
};
|
|
88
|
+
subGridApi.upsertRow = (nextRowHead) => {
|
|
89
|
+
parentGrid.upsertRow(nextRowHead);
|
|
90
|
+
};
|
|
91
|
+
subGridApi.upsertRows = (nextRowHeads) => {
|
|
92
|
+
parentGrid.upsertRows(nextRowHeads);
|
|
93
|
+
};
|
|
94
|
+
subGridApi.upsertColumn = (nextColumnHead) => {
|
|
95
|
+
parentGrid.upsertColumn(nextColumnHead);
|
|
96
|
+
};
|
|
97
|
+
subGridApi.upsertColumns = (nextColumnHeads) => {
|
|
98
|
+
parentGrid.upsertColumns(nextColumnHeads);
|
|
99
|
+
};
|
|
100
|
+
subGridApi.subscribeRowHead = (rowId, callback) => parentGrid.subscribeRowHead(rowId, callback);
|
|
101
|
+
subGridApi.subscribeColumnHead = (columnId, callback) => parentGrid.subscribeColumnHead(columnId, callback);
|
|
102
|
+
subGridApi.setGrid = (nextState, mode = "replace") => {
|
|
103
|
+
const patch = normalizeGridStatePatchInput(nextState);
|
|
104
|
+
const currentParentState = parentGrid.getState();
|
|
105
|
+
if (mode === "update") {
|
|
106
|
+
if (patch.rows?.length) {
|
|
107
|
+
parentGrid.upsertRows(patch.rows);
|
|
108
|
+
}
|
|
109
|
+
if (patch.columns?.length) {
|
|
110
|
+
parentGrid.upsertColumns(patch.columns);
|
|
111
|
+
}
|
|
112
|
+
if (patch.cells?.length) {
|
|
113
|
+
subGridStore.setGrid({
|
|
114
|
+
rows: currentParentState.rows,
|
|
115
|
+
columns: currentParentState.columns,
|
|
116
|
+
cells: assertGridStateCellsWithinAxes(patch.cells, currentParentState.rows, currentParentState.columns, "Sub grid cells"),
|
|
117
|
+
}, "update");
|
|
118
|
+
}
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
if ((patch.rows && !haveSameHeadSnapshots(patch.rows, currentParentState.rows)) ||
|
|
122
|
+
(patch.columns && !haveSameHeadSnapshots(patch.columns, currentParentState.columns))) {
|
|
123
|
+
throw new Error("Sub grids inherit rows and columns from their parent. Replace parent dimensions on the parent grid instead.");
|
|
124
|
+
}
|
|
125
|
+
subGridStore.setGrid({
|
|
126
|
+
rows: currentParentState.rows,
|
|
127
|
+
columns: currentParentState.columns,
|
|
128
|
+
cells: assertGridStateCellsWithinAxes(patch.cells ?? [], currentParentState.rows, currentParentState.columns, "Sub grid cells"),
|
|
129
|
+
}, "replace");
|
|
130
|
+
};
|
|
131
|
+
subGridApi.clearGrid = () => {
|
|
132
|
+
subGridStore.clearCells();
|
|
133
|
+
};
|
|
134
|
+
return subGridApi;
|
|
135
|
+
}
|
|
16
136
|
function createGridStore(initialRows, initialColumns, initialCells, stateAdapter, persist) {
|
|
17
137
|
assertUniqueHeadIds(initialRows, "row");
|
|
18
138
|
assertUniqueHeadIds(initialColumns, "column");
|
|
@@ -803,6 +923,9 @@ function normalizeGridStateInput(value) {
|
|
|
803
923
|
if (!value || typeof value !== "object") {
|
|
804
924
|
throw new Error("Grid state updates must be objects.");
|
|
805
925
|
}
|
|
926
|
+
if (Array.isArray(value)) {
|
|
927
|
+
throw new Error("Grid state updates must use { rows, columns, cells } objects, not arrays.");
|
|
928
|
+
}
|
|
806
929
|
const partialState = value;
|
|
807
930
|
const { cells = [], rows = [], columns = [] } = partialState;
|
|
808
931
|
if (!Array.isArray(cells) || !Array.isArray(rows) || !Array.isArray(columns)) {
|
|
@@ -818,6 +941,9 @@ function normalizeGridStatePatchInput(value) {
|
|
|
818
941
|
if (!value || typeof value !== "object") {
|
|
819
942
|
throw new Error("Grid state updates must be objects.");
|
|
820
943
|
}
|
|
944
|
+
if (Array.isArray(value)) {
|
|
945
|
+
throw new Error("Grid state updates must use { rows, columns, cells } objects, not arrays.");
|
|
946
|
+
}
|
|
821
947
|
const partialState = value;
|
|
822
948
|
const readOptionalArray = (key, arrayValue) => {
|
|
823
949
|
if (arrayValue === undefined) {
|
|
@@ -886,6 +1012,9 @@ function normalizeGridState(value) {
|
|
|
886
1012
|
if (!value || typeof value !== "object") {
|
|
887
1013
|
throw new Error("Grid state initializer must return an object.");
|
|
888
1014
|
}
|
|
1015
|
+
if (Array.isArray(value)) {
|
|
1016
|
+
throw new Error("Legacy matrix grid input has been removed. Pass a schema object with rows, columns, and cells instead.");
|
|
1017
|
+
}
|
|
889
1018
|
const partialState = value;
|
|
890
1019
|
const { cells = [], rows = [], columns = [] } = partialState;
|
|
891
1020
|
if (!Array.isArray(cells) || !Array.isArray(rows) || !Array.isArray(columns)) {
|
|
@@ -998,4 +1127,157 @@ function readGridHeadLabel(head, id) {
|
|
|
998
1127
|
}
|
|
999
1128
|
return id;
|
|
1000
1129
|
}
|
|
1130
|
+
function resolveCreateSubGridArgs(cellsOrOptionsOrPersist, persist) {
|
|
1131
|
+
if (persist) {
|
|
1132
|
+
return {
|
|
1133
|
+
initialCells: readCreateSubGridCells(cellsOrOptionsOrPersist),
|
|
1134
|
+
persistOption: persist,
|
|
1135
|
+
};
|
|
1136
|
+
}
|
|
1137
|
+
if (!cellsOrOptionsOrPersist) {
|
|
1138
|
+
return {
|
|
1139
|
+
initialCells: [],
|
|
1140
|
+
persistOption: undefined,
|
|
1141
|
+
};
|
|
1142
|
+
}
|
|
1143
|
+
if (isCreateSubGridOptions(cellsOrOptionsOrPersist)) {
|
|
1144
|
+
const subGridOptions = cellsOrOptionsOrPersist;
|
|
1145
|
+
return {
|
|
1146
|
+
initialCells: subGridOptions.cells ?? [],
|
|
1147
|
+
persistOption: subGridOptions.persist,
|
|
1148
|
+
};
|
|
1149
|
+
}
|
|
1150
|
+
if (isGridPersistOption(cellsOrOptionsOrPersist)) {
|
|
1151
|
+
return {
|
|
1152
|
+
initialCells: [],
|
|
1153
|
+
persistOption: cellsOrOptionsOrPersist,
|
|
1154
|
+
};
|
|
1155
|
+
}
|
|
1156
|
+
return {
|
|
1157
|
+
initialCells: cellsOrOptionsOrPersist,
|
|
1158
|
+
persistOption: undefined,
|
|
1159
|
+
};
|
|
1160
|
+
}
|
|
1161
|
+
function readCreateSubGridCells(value) {
|
|
1162
|
+
if (!value || isGridPersistOption(value)) {
|
|
1163
|
+
return [];
|
|
1164
|
+
}
|
|
1165
|
+
if (isCreateSubGridOptions(value)) {
|
|
1166
|
+
return (value
|
|
1167
|
+
.cells ?? []);
|
|
1168
|
+
}
|
|
1169
|
+
return value;
|
|
1170
|
+
}
|
|
1171
|
+
function isCreateSubGridOptions(value) {
|
|
1172
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
1173
|
+
}
|
|
1174
|
+
function isGridPersistOption(value) {
|
|
1175
|
+
return Array.isArray(value) && value.length > 0 && typeof value[0] === "string";
|
|
1176
|
+
}
|
|
1177
|
+
function createGridStateCellAdapter() {
|
|
1178
|
+
return {
|
|
1179
|
+
deserializeCell: (stateCell) => ({
|
|
1180
|
+
rowId: stateCell.rowId,
|
|
1181
|
+
columnId: stateCell.columnId,
|
|
1182
|
+
value: stateCell.value,
|
|
1183
|
+
}),
|
|
1184
|
+
serializeCell: (rowId, columnId, value) => ({
|
|
1185
|
+
rowId,
|
|
1186
|
+
columnId,
|
|
1187
|
+
value,
|
|
1188
|
+
}),
|
|
1189
|
+
};
|
|
1190
|
+
}
|
|
1191
|
+
function createSubGridPersistOption(parentGrid, persist) {
|
|
1192
|
+
if (!persist) {
|
|
1193
|
+
return undefined;
|
|
1194
|
+
}
|
|
1195
|
+
const [storageKey, adapter] = persist;
|
|
1196
|
+
const resolvedAdapter = adapter ??
|
|
1197
|
+
defaultGridPersistAdapter;
|
|
1198
|
+
return [
|
|
1199
|
+
storageKey,
|
|
1200
|
+
{
|
|
1201
|
+
get: async (nextStorageKey) => {
|
|
1202
|
+
const persistedState = await Promise.resolve(resolvedAdapter.get(nextStorageKey));
|
|
1203
|
+
if (persistedState === null) {
|
|
1204
|
+
return null;
|
|
1205
|
+
}
|
|
1206
|
+
try {
|
|
1207
|
+
const normalizedState = normalizeGridStateInput(persistedState);
|
|
1208
|
+
const parentState = parentGrid.getState();
|
|
1209
|
+
return createSubGridState(parentState.rows, parentState.columns, normalizedState.cells);
|
|
1210
|
+
}
|
|
1211
|
+
catch {
|
|
1212
|
+
return null;
|
|
1213
|
+
}
|
|
1214
|
+
},
|
|
1215
|
+
set: (nextStorageKey, nextState) => {
|
|
1216
|
+
const parentState = parentGrid.getState();
|
|
1217
|
+
return resolvedAdapter.set(nextStorageKey, createSubGridState(parentState.rows, parentState.columns, nextState.cells));
|
|
1218
|
+
},
|
|
1219
|
+
remove: (nextStorageKey) => resolvedAdapter.remove(nextStorageKey),
|
|
1220
|
+
},
|
|
1221
|
+
];
|
|
1222
|
+
}
|
|
1223
|
+
function createSubGridState(rows, columns, cells) {
|
|
1224
|
+
return {
|
|
1225
|
+
rows,
|
|
1226
|
+
columns,
|
|
1227
|
+
cells: filterGridStateCellsToAxes(cells, rows, columns),
|
|
1228
|
+
};
|
|
1229
|
+
}
|
|
1230
|
+
function assertGridStateCellsWithinAxes(cells, rows, columns, contextLabel) {
|
|
1231
|
+
const rowIds = new Set(rows.map((rowHead) => rowHead.id));
|
|
1232
|
+
const columnIds = new Set(columns.map((columnHead) => columnHead.id));
|
|
1233
|
+
cells.forEach((currentCell) => {
|
|
1234
|
+
if (!rowIds.has(currentCell.rowId)) {
|
|
1235
|
+
throw new Error(`${contextLabel} must reference an existing parent row header. Missing row "${currentCell.rowId}".`);
|
|
1236
|
+
}
|
|
1237
|
+
if (!columnIds.has(currentCell.columnId)) {
|
|
1238
|
+
throw new Error(`${contextLabel} must reference an existing parent column header. Missing column "${currentCell.columnId}".`);
|
|
1239
|
+
}
|
|
1240
|
+
});
|
|
1241
|
+
return cells;
|
|
1242
|
+
}
|
|
1243
|
+
function filterGridStateCellsToAxes(cells, rows, columns) {
|
|
1244
|
+
const rowIds = new Set(rows.map((rowHead) => rowHead.id));
|
|
1245
|
+
const columnIds = new Set(columns.map((columnHead) => columnHead.id));
|
|
1246
|
+
return cells.filter((currentCell) => rowIds.has(currentCell.rowId) && columnIds.has(currentCell.columnId));
|
|
1247
|
+
}
|
|
1248
|
+
function didGridDiffAffectAxes(diff) {
|
|
1249
|
+
return (!haveSameHeadSnapshots(diff.rows, diff.previousRows) ||
|
|
1250
|
+
!haveSameHeadSnapshots(diff.columns, diff.previousColumns));
|
|
1251
|
+
}
|
|
1252
|
+
function haveSameHeadSnapshots(leftHeads, rightHeads) {
|
|
1253
|
+
if (leftHeads === rightHeads) {
|
|
1254
|
+
return true;
|
|
1255
|
+
}
|
|
1256
|
+
if (!leftHeads || !rightHeads || leftHeads.length !== rightHeads.length) {
|
|
1257
|
+
return false;
|
|
1258
|
+
}
|
|
1259
|
+
return leftHeads.every((leftHead, index) => {
|
|
1260
|
+
const rightHead = rightHeads[index];
|
|
1261
|
+
if (leftHead === undefined || rightHead === undefined) {
|
|
1262
|
+
return leftHead === rightHead;
|
|
1263
|
+
}
|
|
1264
|
+
return haveSameShallowRecord(leftHead, rightHead);
|
|
1265
|
+
});
|
|
1266
|
+
}
|
|
1267
|
+
function haveSameShallowRecord(leftRecord, rightRecord) {
|
|
1268
|
+
if (Object.is(leftRecord, rightRecord)) {
|
|
1269
|
+
return true;
|
|
1270
|
+
}
|
|
1271
|
+
const leftKeys = Object.keys(leftRecord);
|
|
1272
|
+
const rightKeys = Object.keys(rightRecord);
|
|
1273
|
+
if (leftKeys.length !== rightKeys.length) {
|
|
1274
|
+
return false;
|
|
1275
|
+
}
|
|
1276
|
+
return leftKeys.every((key) => {
|
|
1277
|
+
if (!(key in rightRecord)) {
|
|
1278
|
+
return false;
|
|
1279
|
+
}
|
|
1280
|
+
return Object.is(leftRecord[key], rightRecord[key]);
|
|
1281
|
+
});
|
|
1282
|
+
}
|
|
1001
1283
|
//# sourceMappingURL=grid.js.map
|