@1771technologies/lytenyte-pro 1.0.1 → 1.0.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 (62) hide show
  1. package/README.md +1 -6
  2. package/dist/+types.d.ts +24 -4
  3. package/dist/cell-selection/cell-selection-driver.js +2 -1
  4. package/dist/cell-selection/cell-style-row.d.ts +2 -2
  5. package/dist/cell-selection/cell-style-row.js +1 -1
  6. package/dist/cell-selection/get-root-cell.js +3 -83
  7. package/dist/cell-selection/index.d.ts +0 -1
  8. package/dist/cell-selection/index.js +0 -1
  9. package/dist/cell-selection/split-cell-selection-rect.d.ts +8 -1
  10. package/dist/cell-selection/split-cell-selection-rect.js +13 -4
  11. package/dist/cell-selection/split-on-pivot.d.ts +3 -0
  12. package/dist/cell-selection/split-on-pivot.js +50 -0
  13. package/dist/cells/cell-editor.js +1 -1
  14. package/dist/cells/cell-spacer.d.ts +3 -0
  15. package/dist/cells/cell-spacer.js +37 -0
  16. package/dist/cells/cell.d.ts +1 -3
  17. package/dist/cells/cell.js +11 -9
  18. package/dist/column-manager/branch.js +1 -1
  19. package/dist/column-manager/leaf.js +1 -1
  20. package/dist/column-manager/move-handle.d.ts +0 -7
  21. package/dist/column-manager/move-handle.js +23 -6
  22. package/dist/filter-tree/leaf.js +3 -1
  23. package/dist/grid-box/+types.d.ts +2 -2
  24. package/dist/grid-box/item.js +3 -3
  25. package/dist/grid-box/use-aggregation-box-items.js +1 -2
  26. package/dist/grid-box/use-column-box-items.d.ts +2 -3
  27. package/dist/grid-box/use-column-box-items.js +3 -3
  28. package/dist/grid-box/use-row-group-box-items.d.ts +3 -3
  29. package/dist/grid-box/use-row-group-box-items.js +41 -5
  30. package/dist/grid.d.ts +1 -1
  31. package/dist/header/resize-handler.js +21 -15
  32. package/dist/license.js +1 -1
  33. package/dist/row-data-source-client/use-client-data-source-paginated.js +154 -164
  34. package/dist/row-data-source-client/use-client-data-source.js +144 -177
  35. package/dist/row-data-source-client/use-client-tree-data-source.js +119 -152
  36. package/dist/row-data-source-server/use-server-data-source.js +102 -120
  37. package/dist/rows/row/row.d.ts +1 -1
  38. package/dist/rows/row/row.js +11 -4
  39. package/dist/rows/rows-sections.js +1 -1
  40. package/dist/sort-manager/+types.d.ts +2 -0
  41. package/dist/sort-manager/hooks/use-sort-row-item.js +6 -6
  42. package/dist/sort-manager/utils/sort-item-to-sort-model.js +5 -0
  43. package/dist/sort-manager/utils/sort-model-to-sort-items.js +2 -1
  44. package/dist/state/+types.d.ts +8 -10
  45. package/dist/state/api/cell-root.d.ts +5 -0
  46. package/dist/state/api/cell-root.js +64 -0
  47. package/dist/state/api/edit-begin.js +5 -9
  48. package/dist/state/api/edit-is-cell-active.d.ts +1 -1
  49. package/dist/state/api/edit-is-cell-active.js +2 -7
  50. package/dist/state/api/focus-cell.js +2 -2
  51. package/dist/state/helpers/column-layout.d.ts +3 -3
  52. package/dist/state/helpers/column-layout.js +9 -15
  53. package/dist/state/helpers/get-full-width-callback.d.ts +1 -1
  54. package/dist/state/helpers/get-full-width-callback.js +2 -0
  55. package/dist/state/helpers/get-span-callback.d.ts +1 -1
  56. package/dist/state/helpers/get-span-callback.js +2 -0
  57. package/dist/state/helpers/row-layout/row-layout.d.ts +5 -4
  58. package/dist/state/helpers/row-layout/row-layout.js +112 -346
  59. package/dist/state/use-lytenyte.js +398 -334
  60. package/dist/viewport/viewport.js +3 -2
  61. package/main.css +27 -3
  62. package/package.json +7 -7
@@ -1,10 +1,9 @@
1
- import { atom, createStore } from "@1771technologies/atom";
2
1
  import {} from "../+types.js";
3
2
  import { useRef } from "react";
4
3
  import { makeColumnView } from "./helpers/column-view.js";
5
- import { applyLayoutUpdate, computeBounds, computeColumnPositions, computeRowPositions, DEFAULT_PREVIOUS_LAYOUT, makeGridAtom, makeRowDataStore, } from "@1771technologies/lytenyte-shared";
4
+ import { computeBounds, computeColumnPositions, computed, computeRowPositions, effect, makeAtom, makeLayoutState, makeRowStore, signal, updateFull, } from "@1771technologies/lytenyte-shared";
6
5
  import { makeRowLayout } from "./helpers/row-layout/row-layout.js";
7
- import { equal } from "@1771technologies/lytenyte-js-utils";
6
+ import { equal, rangesOverlap } from "@1771technologies/lytenyte-js-utils";
8
7
  import { makeColumnLayout } from "./helpers/column-layout.js";
9
8
  import { emptyRowDataSource } from "./helpers/empty-row-data-source.js";
10
9
  import { getFullWidthCallback } from "./helpers/get-full-width-callback.js";
@@ -47,84 +46,84 @@ import { makeExportDataRect } from "./api/export-data-rect.js";
47
46
  import { makeDialogFrameClose, makeDialogFrameOpen } from "./api/dialog-frame.js";
48
47
  import { makePopoverFrameClose, makePopoverFrameOpen } from "./api/popover-frame.js";
49
48
  import { makePositionFromElement } from "./api/position-from-element.js";
50
- import { splitCellSelectionRect } from "../cell-selection/split-cell-selection-rect.js";
49
+ import { splitCellSelectionRect, } from "../cell-selection/split-cell-selection-rect.js";
51
50
  import { boundSelectionRect } from "../cell-selection/bound-selection-rect.js";
51
+ import { makeCellRoot } from "./api/cell-root.js";
52
+ import { splitOnPivot } from "../cell-selection/split-on-pivot.js";
53
+ const EMPTY_POSITION_ARRAY = new Uint32Array();
52
54
  const DEFAULT_HEADER_HEIGHT = 40;
53
55
  const COLUMN_GROUP_JOIN_DELIMITER = "-->";
54
56
  export function makeLyteNyte(p) {
55
- const store = createStore();
56
57
  /**
57
58
  * Primitive ATOMS and State
58
59
  */
59
- const rtl = atom(p.rtl ?? false);
60
- const columns = atom(p.columns ?? []);
61
- const base = atom(p.columnBase ?? {});
62
- const gridId = atom(p.gridId);
63
- const headerHeight = atom(p.headerHeight ?? DEFAULT_HEADER_HEIGHT);
64
- const headerGroupHeight = atom(p.headerGroupHeight ?? DEFAULT_HEADER_HEIGHT);
65
- const columnSizeToFit = atom(p.columnSizeToFit ?? false);
66
- const viewport = atom(null);
67
- const viewportHeightInner = atom(0);
68
- const viewportHeightOuter = atom(0);
69
- const viewportWidthInner = atom(0);
70
- const viewportWidthOuter = atom(0);
71
- const columnGroupJoinDelimiter = atom(p.columnGroupJoinDelimiter ?? COLUMN_GROUP_JOIN_DELIMITER);
72
- const columnGroupExpansions = atom(p.columnGroupExpansions ?? {});
73
- const columnGroupDefaultExpansion = atom(p.columnGroupDefaultExpansion ?? true);
74
- const rowDataSource = atom(emptyRowDataSource);
75
- const rowHeight = atom(40);
76
- if (typeof p.rowHeight === "function") {
77
- store.set(rowHeight, () => p.rowHeight);
78
- }
79
- else {
80
- store.set(rowHeight, p.rowHeight ?? 40);
81
- }
82
- const rowAutoHeightGuess = atom(p.rowAutoHeightGuess ?? 40);
83
- const rowScanDistance = atom(p.rowScanDistance ?? 100);
84
- const colScanDistance = atom(p.colScanDistance ?? 100);
85
- const rowOverscanTop = atom(p.rowOverscanTop ?? 10);
86
- const rowOverscanBottom = atom(p.rowOverscanBottom ?? 10);
87
- const colOverScanStart = atom(p.colOverscanStart ?? 2);
88
- const colOverscanEnd = atom(p.colOverscanEnd ?? 2);
89
- const xScroll = atom(0);
90
- const yScroll = atom(0);
91
- const cellRenderers = atom(p.cellRenderers ?? {});
92
- const rowFullWidthPredicate = atom({ fn: p.rowFullWidthPredicate ?? (() => false) });
93
- const rowFullWidthRenderer = atom({ fn: p.rowFullWidthRenderer ?? (() => "Not defined") });
94
- const sortModel = atom(p.sortModel ?? []);
95
- const filterModel = atom(p.filterModel ?? {});
96
- const filterInModel = atom(p.filterInModel ?? {});
97
- const rowGroupModel = atom(p.rowGroupModel ?? []);
98
- const aggModel = atom(p.aggModel ?? {});
99
- const rowGroupDisplayMode = atom(p.rowGroupDisplayMode ?? "single-column");
100
- const rowGroupDefaultExpansion = atom(p.rowGroupDefaultExpansion ?? false);
101
- const rowGroupExpansions = atom(p.rowGroupExpansions ?? {});
102
- const rowGroupColumn = atom(p.rowGroupColumn ?? {});
103
- const headerCellRenderers = atom(p.headerCellRenderers ?? {});
104
- const floatingCellRenderers = atom(p.floatingCellRenderers ?? {});
105
- const floatingRowEnabled = atom(p.floatingRowEnabled ?? false);
106
- const floatingRowHeight = atom(p.floatingRowHeight ?? 40);
107
- const editRenderers = atom(p.editRenderers ?? {});
108
- const editRowValidatorFn = atom({ fn: p.editRowValidatorFn ?? (() => true) });
109
- const editClickActivator = atom(p.editClickActivator ?? "single");
110
- const editCellMode = atom(p.editCellMode ?? "readonly");
111
- const columnMarker = atom(p.columnMarker ?? {});
112
- const columnMarkerEnabled = atom(p.columnMarkerEnabled ?? false);
113
- const columnDoubleClickToAutosize = atom(p.columnDoubleClickToAutosize ?? true);
114
- const rowDetailHeight = atom(p.rowDetailHeight ?? 300);
115
- const rowDetailAutoHeightGuess = atom(p.rowDetailAutoHeightGuess ?? 300);
116
- const rowDetailExpansions = atom(p.rowDetailExpansions ?? new Set());
117
- const rowDetailRenderer = atom({ fn: p.rowDetailRenderer ?? (() => "Not defined") });
118
- const rowSelectedIds = atom(p.rowSelectedIds ?? new Set());
119
- const rowSelectionMode = atom(p.rowSelectionMode ?? "none");
120
- const rowSelectChildren = atom(p.rowSelectChildren ?? false);
121
- const rowSelectionActivator = atom(p.rowSelectionActivator ?? "single-click");
122
- const virtualizeRows = atom(p.virtualizeRows ?? true);
123
- const virtualizeCols = atom(p.virtualizeCols ?? true);
124
- const quickSearch = atom(p.quickSearch ?? null);
125
- const quickSearchSensitivity = atom(p.quickSearchSensitivity ?? "case-insensitive");
126
- const columnPivotMode = atom(p.columnPivotMode ?? false);
127
- const columnPivotModel = atom(p.columnPivotModel ??
60
+ const rtl = signal(p.rtl ?? false);
61
+ const columns = signal(p.columns ?? []);
62
+ const base = signal(p.columnBase ?? {});
63
+ const gridId = signal(p.gridId);
64
+ const headerHeight = signal(p.headerHeight ?? DEFAULT_HEADER_HEIGHT);
65
+ const headerGroupHeight = signal(p.headerGroupHeight ?? DEFAULT_HEADER_HEIGHT);
66
+ const columnSizeToFit = signal(p.columnSizeToFit ?? false);
67
+ const viewport = signal(null);
68
+ const viewportHeightInner = signal(0);
69
+ const viewportHeightOuter = signal(0);
70
+ const viewportWidthInner = signal(0);
71
+ const viewportWidthOuter = signal(0);
72
+ const columnGroupJoinDelimiter = signal(p.columnGroupJoinDelimiter ?? COLUMN_GROUP_JOIN_DELIMITER);
73
+ const columnGroupExpansions = signal(p.columnGroupExpansions ?? {});
74
+ const columnGroupDefaultExpansion = signal(p.columnGroupDefaultExpansion ?? true);
75
+ const rowDataSource = signal(emptyRowDataSource);
76
+ const rowHeight = signal(40);
77
+ if (typeof p.rowHeight === "function")
78
+ rowHeight.set(() => p.rowHeight);
79
+ else
80
+ rowHeight.set(p.rowHeight ?? 40);
81
+ const rowAutoHeightGuess = signal(p.rowAutoHeightGuess ?? 40);
82
+ const rowScanDistance = signal(p.rowScanDistance ?? 100);
83
+ const colScanDistance = signal(p.colScanDistance ?? 100);
84
+ const rowOverscanTop = signal(p.rowOverscanTop ?? 10);
85
+ const rowOverscanBottom = signal(p.rowOverscanBottom ?? 10);
86
+ const colOverScanStart = signal(p.colOverscanStart ?? 2);
87
+ const colOverscanEnd = signal(p.colOverscanEnd ?? 2);
88
+ const xScroll = signal(0);
89
+ const yScroll = signal(0);
90
+ const cellRenderers = signal(p.cellRenderers ?? {});
91
+ const rowFullWidthPredicate = signal({ fn: p.rowFullWidthPredicate ?? null });
92
+ const rowFullWidthRenderer = signal({ fn: p.rowFullWidthRenderer ?? (() => "Not defined") });
93
+ const sortModel = signal(p.sortModel ?? []);
94
+ const filterModel = signal(p.filterModel ?? {});
95
+ const filterInModel = signal(p.filterInModel ?? {});
96
+ const rowGroupModel = signal(p.rowGroupModel ?? []);
97
+ const aggModel = signal(p.aggModel ?? {});
98
+ const rowGroupDisplayMode = signal(p.rowGroupDisplayMode ?? "single-column");
99
+ const rowGroupDefaultExpansion = signal(p.rowGroupDefaultExpansion ?? false);
100
+ const rowGroupExpansions = signal(p.rowGroupExpansions ?? {});
101
+ const rowGroupColumn = signal(p.rowGroupColumn ?? {});
102
+ const headerCellRenderers = signal(p.headerCellRenderers ?? {});
103
+ const floatingCellRenderers = signal(p.floatingCellRenderers ?? {});
104
+ const floatingRowEnabled = signal(p.floatingRowEnabled ?? false);
105
+ const floatingRowHeight = signal(p.floatingRowHeight ?? 40);
106
+ const editRenderers = signal(p.editRenderers ?? {});
107
+ const editRowValidatorFn = signal({ fn: p.editRowValidatorFn ?? (() => true) });
108
+ const editClickActivator = signal(p.editClickActivator ?? "single");
109
+ const editCellMode = signal(p.editCellMode ?? "readonly");
110
+ const columnMarker = signal(p.columnMarker ?? {});
111
+ const columnMarkerEnabled = signal(p.columnMarkerEnabled ?? false);
112
+ const columnDoubleClickToAutosize = signal(p.columnDoubleClickToAutosize ?? true);
113
+ const rowDetailHeight = signal(p.rowDetailHeight ?? 300);
114
+ const rowDetailAutoHeightGuess = signal(p.rowDetailAutoHeightGuess ?? 300);
115
+ const rowDetailExpansions = signal(p.rowDetailExpansions ?? new Set());
116
+ const rowDetailRenderer = signal({ fn: p.rowDetailRenderer ?? (() => "Not defined") });
117
+ const rowSelectedIds = signal(p.rowSelectedIds ?? new Set());
118
+ const rowSelectionMode = signal(p.rowSelectionMode ?? "none");
119
+ const rowSelectChildren = signal(p.rowSelectChildren ?? false);
120
+ const rowSelectionActivator = signal(p.rowSelectionActivator ?? "single-click");
121
+ const virtualizeRows = signal(p.virtualizeRows ?? true);
122
+ const virtualizeCols = signal(p.virtualizeCols ?? true);
123
+ const quickSearch = signal(p.quickSearch ?? null);
124
+ const quickSearchSensitivity = signal(p.quickSearchSensitivity ?? "case-insensitive");
125
+ const columnPivotMode = signal(p.columnPivotMode ?? false);
126
+ const columnPivotModel = signal(p.columnPivotModel ??
128
127
  {
129
128
  columns: [],
130
129
  filters: {},
@@ -133,20 +132,21 @@ export function makeLyteNyte(p) {
133
132
  sorts: [],
134
133
  values: [],
135
134
  });
136
- const columnPivotColumns = atom([]);
137
- const columnPivotColumnGroupExpansions = atom({});
138
- const columnPivotRowGroupExpansions = atom({});
139
- const cellSelections = atom(p.cellSelections ?? []);
140
- const cellSelectionMode = atom(p.cellSelectionMode ?? "none");
141
- const internal__rowGroupColumnState = atom({});
142
- const internal_cellSelectionPivot = atom(null);
143
- const internal_cellSelectionAdditive = atom(null);
144
- const internal_cellSelectionSplits = atom((g) => {
145
- const selections = g(cellSelections);
146
- const topCount = g(rdsAtoms.topCount);
147
- const centerCount = g(rdsAtoms.rowCenterCount);
148
- const meta = g(columnMeta);
149
- return selections.flatMap((rect) => {
135
+ const columnPivotColumns = signal([]);
136
+ const columnPivotColumnGroupExpansions = signal({});
137
+ const columnPivotRowGroupExpansions = signal({});
138
+ const cellSelections = signal(p.cellSelections ?? []);
139
+ const cellSelectionMode = signal(p.cellSelectionMode ?? "none");
140
+ const internal__rowGroupColumnState = signal({});
141
+ const internal_cellSelectionPivot = signal(null);
142
+ const internal_cellSelectionAdditive = signal(null);
143
+ const internal_cellSelectionSplits = computed(() => {
144
+ const selections = cellSelections();
145
+ const topCount = rowDataStore.rowTopCount.$();
146
+ const centerCount = rowDataStore.rowCenterCount.$();
147
+ const meta = columnMeta();
148
+ const p = internal_cellSelectionPivot();
149
+ const splits = selections.flatMap((rect) => {
150
150
  return splitCellSelectionRect({
151
151
  rect,
152
152
  rowTopCount: topCount,
@@ -155,51 +155,79 @@ export function makeLyteNyte(p) {
155
155
  colCenterCount: meta.columnVisibleCenterCount,
156
156
  });
157
157
  });
158
+ const firstWithinPivot = splits.findIndex((c) => p &&
159
+ p.rowStart >= c.rowStart &&
160
+ p.rowEnd <= c.rowEnd &&
161
+ p.columnStart >= c.columnStart &&
162
+ p.columnEnd <= c.columnEnd);
163
+ if (firstWithinPivot !== -1) {
164
+ const pivotSplits = splitOnPivot(splits[firstWithinPivot], p);
165
+ if (pivotSplits)
166
+ splits.splice(firstWithinPivot, 1, ...pivotSplits);
167
+ else
168
+ splits.splice(firstWithinPivot, 1);
169
+ }
170
+ return splits;
158
171
  });
159
- const dialogFrame = atom(p.dialogFrames ?? {});
160
- const popoverFrame = atom(p.popoverFrames ?? {});
161
- const internal_rowSelectionPivot = atom(null);
162
- const internal_rowSelectionLastWasDeselect = atom(false);
163
- const rowSelectionPivot = atom((g) => g(internal_rowSelectionPivot));
164
- const internal_draggingHeader = atom(null);
165
- const internal_rowAutoHeightCache = atom({});
166
- const internal_rowDetailHeightCache = atom({});
167
- const internal_focusActive = atom(null);
168
- const internal_focusPrevCol = atom(null);
169
- const internal_focusPrevRow = atom(null);
170
- const internal_editActivePosition = atom(null);
171
- const internal_editData = atom(null);
172
- const internal_editValidation = atom(true);
173
- const internal_dialogFrames = atom({});
174
- const internal_popoverFrames = atom({});
175
- const layoutMap = atom((g) => {
176
- g(rdsAtoms.bottomCount);
177
- g(rdsAtoms.rowCenterCount);
178
- g(rdsAtoms.topCount);
179
- g(rdsAtoms.snapshotKey);
180
- g(rowDataSource);
181
- g(rowGroupModel);
182
- g(sortModel);
183
- g(filterModel);
184
- g(filterInModel);
185
- g(aggModel);
186
- return new Map();
172
+ const dialogFrame = signal(p.dialogFrames ?? {});
173
+ const popoverFrame = signal(p.popoverFrames ?? {});
174
+ const internal_rowSelectionPivot = signal(null);
175
+ const internal_rowSelectionLastWasDeselect = signal(false);
176
+ const internal_draggingHeader = signal(null);
177
+ const internal_rowAutoHeightCache = signal({});
178
+ const internal_rowDetailHeightCache = signal({});
179
+ const internal_focusActive = signal(null);
180
+ const internal_focusPrevCol = signal(null);
181
+ const internal_focusPrevRow = signal(null);
182
+ const internal_editActivePosition = signal(null);
183
+ const internal_editData = signal(null);
184
+ const internal_editValidation = signal(true);
185
+ const internal_dialogFrames = signal({});
186
+ const internal_popoverFrames = signal({});
187
+ const columnCount$ = computed(() => {
188
+ const view = columnView();
189
+ return view.visibleColumns.length;
190
+ });
191
+ const layoutState = makeLayoutState(0);
192
+ const layoutState$ = computed(() => {
193
+ rowDataStore.rowBottomCount.$();
194
+ rowDataStore.rowCenterCount.$();
195
+ rowDataStore.rowTopCount.$();
196
+ rowDataSource();
197
+ rowGroupModel();
198
+ sortModel();
199
+ filterModel();
200
+ aggModel();
201
+ filterInModel();
202
+ columnPivotModel();
203
+ columns();
204
+ columnPivotColumns();
205
+ const rowCount = rowDataStore.rowCount.$();
206
+ const columnCount = columnCount$();
207
+ if (rowCount > layoutState.computed.length || columnCount != layoutState.base.length) {
208
+ Object.assign(layoutState, makeLayoutState(columnCount, rowCount + 2000));
209
+ }
210
+ else {
211
+ layoutState.computed.fill(0);
212
+ layoutState.special.fill(0);
213
+ layoutState.lookup.clear();
214
+ }
215
+ return { layout: { ...layoutState }, cache: new Map() };
187
216
  });
188
217
  /**
189
218
  * VIEW BOUNDS
190
219
  */
191
- let prevBounds = null;
192
- const bounds = atom((g) => {
193
- const vpWidth = g(viewportWidthInner);
194
- const vpHeight = g(viewportHeightInner);
195
- const scrollTop = g(yScroll);
196
- const scrollLeft = g(xScroll);
197
- const xPos = g(xPositions);
198
- const yPos = g(yPositions);
199
- const topCount = g(rdsAtoms.topCount);
200
- const bottomCount = g(rdsAtoms.bottomCount);
201
- const start = g(startCount);
202
- const end = g(endCount);
220
+ const bounds = computed(() => {
221
+ const vpWidth = viewportWidthInner();
222
+ const vpHeight = viewportHeightInner();
223
+ const scrollTop = yScroll();
224
+ const scrollLeft = xScroll();
225
+ const xPos = xPositions();
226
+ const yPos = yPositions();
227
+ const topCount = rowDataStore.rowTopCount.$();
228
+ const bottomCount = rowDataStore.rowBottomCount.$();
229
+ const start = startCount();
230
+ const end = endCount();
203
231
  const bounds = computeBounds({
204
232
  viewportWidth: vpWidth,
205
233
  viewportHeight: vpHeight,
@@ -211,65 +239,88 @@ export function makeLyteNyte(p) {
211
239
  bottomCount,
212
240
  startCount: start,
213
241
  endCount: end,
214
- rowOverscanTop: g(rowOverscanTop),
215
- rowOverscanBottom: g(rowOverscanBottom),
216
- colOverscanStart: g(colOverScanStart),
217
- colOverscanEnd: g(colOverscanEnd),
242
+ rowOverscanTop: rowOverscanTop(),
243
+ rowOverscanBottom: rowOverscanBottom(),
244
+ colOverscanStart: colOverScanStart(),
245
+ colOverscanEnd: colOverscanEnd(),
218
246
  });
219
- if (equal(prevBounds, bounds))
220
- return prevBounds;
221
- prevBounds = bounds;
222
247
  return bounds;
223
- });
248
+ }, { dirty: (prev, next) => !equal(prev, next) });
224
249
  /**
225
250
  * COLUMN VIEW
226
251
  * Compute the column layout. This impacts both the row layout and header layout. Column layout
227
252
  * is impacted by the column definitions, the group expansions, the row group display mode.
228
253
  */
229
- const columnView = atom((g) => {
230
- const groupState = g(internal__rowGroupColumnState);
231
- const pivotMode = g(columnPivotMode);
254
+ const columnView = computed(() => {
255
+ const groupState = internal__rowGroupColumnState();
256
+ const pivotMode = columnPivotMode();
232
257
  let cols;
233
258
  if (pivotMode) {
234
- const model = g(columnPivotModel);
259
+ const model = columnPivotModel();
235
260
  cols = columnAddRowGroup({
236
- columns: g(columnPivotColumns),
261
+ columns: columnPivotColumns(),
237
262
  rowGroupDisplayMode: "single-column",
238
263
  rowGroupModel: model.rows.filter((c) => c.active ?? true).map((c) => c.field),
239
- rowGroupTemplate: g(rowGroupColumn),
264
+ rowGroupTemplate: rowGroupColumn(),
240
265
  rowGroupColumnState: groupState,
241
266
  });
242
267
  }
243
268
  else {
244
269
  cols = columnAddRowGroup({
245
- columns: g(columns),
246
- rowGroupDisplayMode: g(rowGroupDisplayMode),
247
- rowGroupModel: g(rowGroupModel),
248
- rowGroupTemplate: g(rowGroupColumn),
270
+ columns: columns(),
271
+ rowGroupDisplayMode: rowGroupDisplayMode(),
272
+ rowGroupModel: rowGroupModel(),
273
+ rowGroupTemplate: rowGroupColumn(),
249
274
  rowGroupColumnState: groupState,
250
275
  });
251
276
  }
252
277
  const colsWithMarker = columnHandleMarker({
253
278
  columns: cols,
254
- marker: g(columnMarker),
255
- markerEnabled: g(columnMarkerEnabled),
279
+ marker: columnMarker(),
280
+ markerEnabled: columnMarkerEnabled(),
256
281
  });
257
282
  const view = makeColumnView({
258
283
  columns: colsWithMarker,
259
- base: g(base),
260
- groupExpansionDefault: g(columnGroupDefaultExpansion),
261
- groupExpansions: g(columnGroupExpansions),
262
- groupJoinDelimiter: g(columnGroupJoinDelimiter),
284
+ base: base(),
285
+ groupExpansionDefault: columnGroupDefaultExpansion(),
286
+ groupExpansions: columnGroupExpansions(),
287
+ groupJoinDelimiter: columnGroupJoinDelimiter(),
263
288
  });
264
289
  return view;
265
290
  });
266
291
  /**
267
292
  * COMPUTE ATOMS
268
293
  */
269
- const headerLayout = atom((g) => {
270
- const view = g(columnView);
271
- const layout = makeColumnLayout(view.combinedView, view.meta, g(bounds), g(internal_focusActive), g(floatingRowEnabled));
272
- const dragged = g(internal_draggingHeader);
294
+ const headerLayoutFull = computed(() => {
295
+ const view = columnView();
296
+ const layout = makeColumnLayout(view, floatingRowEnabled());
297
+ return { maxCol: view.maxCol, maxRow: view.maxRow, layout };
298
+ });
299
+ const headerPosition$ = computed(() => {
300
+ const focus = internal_focusActive();
301
+ return focus?.kind === "header-cell" ||
302
+ focus?.kind === "floating-cell" ||
303
+ focus?.kind === "header-group-cell"
304
+ ? focus
305
+ : null;
306
+ });
307
+ const headerLayout = computed(() => {
308
+ const view = columnView();
309
+ const layout = headerLayoutFull();
310
+ const spanBounds = bounds();
311
+ const headerPos = headerPosition$();
312
+ const filtered = layout.layout.map((row) => {
313
+ return row.filter((col) => {
314
+ if (col.colPin)
315
+ return true;
316
+ if (headerPos) {
317
+ if (rangesOverlap(col.colStart, col.colEnd, headerPos.colIndex, headerPos.colIndex + 1))
318
+ return true;
319
+ }
320
+ return col.colStart >= spanBounds.colCenterStart && col.colStart < spanBounds.colCenterEnd;
321
+ });
322
+ });
323
+ const dragged = internal_draggingHeader();
273
324
  // When dragging a group column, we may end up removing that group column when joining
274
325
  // the group with other columns in the same group (if they are separated). We want to ensure
275
326
  // the group remains mounted until after the drag. Hence we check if there would've been a merge
@@ -277,16 +328,16 @@ export function makeLyteNyte(p) {
277
328
  // isHiddenMove is important for this.
278
329
  if (dragged) {
279
330
  const row = dragged.rowStart;
280
- const has = layout[row].findIndex((c) => c.kind === "group" && c.idOccurrence === dragged.idOccurrence);
331
+ const has = filtered[row].findIndex((c) => c.kind === "group" && c.idOccurrence === dragged.idOccurrence);
281
332
  if (has === -1) {
282
- layout[row].push({ ...dragged, isHiddenMove: true });
333
+ filtered[row].push({ ...dragged, isHiddenMove: true });
283
334
  }
284
335
  }
285
- return { maxCol: view.maxCol, maxRow: view.maxRow, layout: layout };
336
+ return { maxCol: view.maxCol, maxRow: view.maxRow, layout: filtered };
286
337
  });
287
- const columnGroupMeta = atom((g) => g(columnView).meta);
288
- const columnMeta = atom((g) => {
289
- const view = g(columnView);
338
+ const columnGroupMeta = computed(() => columnView().meta);
339
+ const columnMeta = computed(() => {
340
+ const view = columnView();
290
341
  return {
291
342
  columnLookup: view.lookup,
292
343
  columnsVisible: view.visibleColumns,
@@ -295,84 +346,106 @@ export function makeLyteNyte(p) {
295
346
  columnVisibleStartCount: view.startCount,
296
347
  };
297
348
  });
298
- const xPositions = atom((g) => {
299
- const view = g(columnView);
300
- return computeColumnPositions(view.visibleColumns, g(base), g(viewportWidthInner), g(columnSizeToFit));
349
+ const xPositions = computed(() => {
350
+ if (!viewport())
351
+ return EMPTY_POSITION_ARRAY;
352
+ const view = columnView();
353
+ return computeColumnPositions(view.visibleColumns, base(), viewportWidthInner(), columnSizeToFit());
301
354
  });
302
- const widthTotal = atom((get) => get(xPositions).at(-1));
303
- const headerHeightTotal = atom((g) => {
304
- const groupHHeight = g(headerGroupHeight);
305
- const hHeight = g(headerHeight);
306
- const view = g(columnView);
307
- const floating = g(floatingRowEnabled);
308
- const floatingHeight = g(floatingRowHeight);
355
+ const widthTotal = computed(() => xPositions().at(-1));
356
+ const headerHeightTotal = computed(() => {
357
+ const groupHHeight = headerGroupHeight();
358
+ const hHeight = headerHeight();
359
+ const view = columnView();
360
+ const floating = floatingRowEnabled();
361
+ const floatingHeight = floatingRowHeight();
309
362
  return (view.maxRow - 1) * groupHHeight + hHeight + (floating ? floatingHeight : 0);
310
363
  });
311
- const startCount = atom((g) => g(columnView).startCount);
312
- const endCount = atom((g) => g(columnView).endCount);
364
+ const startCount = computed(() => columnView().startCount);
365
+ const endCount = computed(() => columnView().endCount);
313
366
  /** ROWS */
314
- const rowByIndex = makeGridAtom(atom((g) => g(rowDataSource).rowByIndex), store);
315
- const { store: rowDataStore, atoms: rdsAtoms } = makeRowDataStore(store, rowByIndex);
316
- const yPositions = atom((g) => {
317
- const rowCount = g(rdsAtoms.rowCount);
318
- const innerHeight = g(viewportHeightInner);
319
- const detailExpansions = g(rowDetailExpansions);
320
- g(internal_rowDetailHeightCache);
321
- const rds = g(rowDataSource);
367
+ const rowDataStore = makeRowStore({
368
+ getRow: (r) => {
369
+ return rowDataSource().rowByIndex(r);
370
+ },
371
+ });
372
+ const yPositions = computed(() => {
373
+ if (!viewport())
374
+ return EMPTY_POSITION_ARRAY;
375
+ const rowCount = rowDataStore.rowCount.$();
376
+ const innerHeight = viewportHeightInner();
377
+ const detailExpansions = rowDetailExpansions();
378
+ internal_rowDetailHeightCache();
379
+ const rds = rowDataSource();
322
380
  const rows = Object.fromEntries([...detailExpansions]
323
381
  .map((x) => rds.rowToIndex(x))
324
382
  .filter((x) => x != null)
325
383
  .map((x) => [x, api.rowByIndex(x)]));
326
- const headerHeight = g(headerHeightTotal);
327
- return computeRowPositions(rowCount, g(rowHeight), g(rowAutoHeightGuess), g(internal_rowAutoHeightCache), (i) => {
384
+ const headerHeight = headerHeightTotal();
385
+ return computeRowPositions(rowCount, rowHeight(), rowAutoHeightGuess(), internal_rowAutoHeightCache(), (i) => {
328
386
  const row = rows[i];
329
387
  if (!row || !api.rowDetailIsExpanded(row))
330
388
  return 0;
331
389
  return api.rowDetailRenderedHeight(row);
332
390
  }, innerHeight - headerHeight);
333
391
  });
334
- const heightTotal = atom((g) => g(yPositions).at(-1));
335
- let prevLayout = DEFAULT_PREVIOUS_LAYOUT;
336
- const rowView = atom((g) => {
337
- let n = g(bounds);
338
- if (!g(virtualizeRows)) {
392
+ const heightTotal = computed(() => yPositions().at(-1));
393
+ const rowView = computed(() => {
394
+ if (!viewport())
395
+ return {
396
+ bottom: [],
397
+ center: [],
398
+ rowBottomTotalHeight: 0,
399
+ rowCenterTotalHeight: 0,
400
+ rowFirstCenter: 0,
401
+ rowFocusedIndex: 0,
402
+ rowTopTotalHeight: 0,
403
+ top: [],
404
+ };
405
+ let n = bounds();
406
+ if (!virtualizeRows()) {
339
407
  n = { ...n, rowCenterStart: n.rowTopEnd, rowCenterEnd: n.rowCenterLast };
340
408
  }
341
- if (!g(virtualizeCols)) {
409
+ if (!virtualizeCols()) {
342
410
  n = { ...n, colCenterStart: n.colStartEnd, colCenterEnd: n.colCenterLast };
343
411
  }
344
- const rowScan = g(rowScanDistance);
345
- const colScan = g(colScanDistance);
346
- const columns = g(columnMeta).columnsVisible;
347
- const rds = g(rowDataSource);
348
- applyLayoutUpdate({
412
+ const rowScan = rowScanDistance();
413
+ const columns = columnMeta().columnsVisible;
414
+ const rds = rowDataSource();
415
+ const { layout, cache } = layoutState$();
416
+ const topCount = rowDataStore.rowTopCount.$();
417
+ const botCount = rowDataStore.rowBottomCount.$();
418
+ const rowCount = rowDataStore.rowCount.$();
419
+ const fullWidthPredicate = rowFullWidthPredicate().fn;
420
+ updateFull({
421
+ topCount,
422
+ botCount,
423
+ startCount: n.colStartEnd,
424
+ endCount: n.colEndEnd - n.colEndStart,
425
+ centerCount: n.colCenterLast - n.colStartEnd,
349
426
  computeColSpan: getSpanFn(rds, grid, columns, "col"),
350
427
  computeRowSpan: getSpanFn(rds, grid, columns, "row"),
351
- colScanDistance: colScan,
352
- rowScanDistance: rowScan,
353
- invalidated: true,
354
- isFullWidth: getFullWidthCallback(rds, g(rowFullWidthPredicate).fn, grid),
428
+ isFullWidth: fullWidthPredicate ? getFullWidthCallback(rds, fullWidthPredicate, grid) : null,
355
429
  isRowCutoff: (r) => {
356
430
  const row = rds.rowByIndex(r);
357
431
  return !row || row.kind === "branch";
358
432
  },
359
- layoutMap: g(layoutMap),
360
- nextLayout: n,
361
- prevLayout,
433
+ rowScanDistance: rowScan,
434
+ rowStart: n.rowCenterStart,
435
+ rowEnd: n.rowCenterEnd,
436
+ rowMax: n.rowCenterLast,
437
+ ...layout,
362
438
  });
363
- prevLayout = n;
364
- const topCount = g(rdsAtoms.topCount);
365
- const botCount = g(rdsAtoms.bottomCount);
366
- const rowCount = g(rdsAtoms.rowCount);
367
- const yPos = g(yPositions);
439
+ const yPos = yPositions();
368
440
  const botStart = rowCount - botCount;
369
- const focus = g(internal_focusActive);
441
+ const focus = internal_focusActive();
370
442
  const view = makeRowLayout({
371
- layout: n,
372
- layoutMap: g(layoutMap),
443
+ view: n,
444
+ viewCache: cache,
445
+ layout,
373
446
  rds: rowDataStore,
374
447
  columns,
375
- focus: g(internal_focusActive),
448
+ focus: internal_focusActive(),
376
449
  });
377
450
  const topHeight = yPos[topCount];
378
451
  const botHeight = yPos.at(-1) - yPos[botStart];
@@ -393,96 +466,97 @@ export function makeLyteNyte(p) {
393
466
  /**
394
467
  * STATE VIEW AND API
395
468
  */
396
- const gridView = atom((g) => {
469
+ const gridView = computed(() => {
397
470
  return {
398
- header: g(headerLayout),
399
- rows: g(rowView),
471
+ header: headerLayout(),
472
+ rows: rowView(),
400
473
  };
401
474
  });
402
475
  const state = {
403
- rtl: makeGridAtom(rtl, store),
404
- columns: makeGridAtom(columns, store),
405
- columnMeta: makeGridAtom(columnMeta, store),
406
- columnBase: makeGridAtom(base, store),
407
- columnGroupExpansions: makeGridAtom(columnGroupExpansions, store),
408
- columnGroupDefaultExpansion: makeGridAtom(columnGroupDefaultExpansion, store),
409
- columnGroupJoinDelimiter: makeGridAtom(columnGroupJoinDelimiter, store),
410
- columnGroupMeta: makeGridAtom(columnGroupMeta, store),
411
- columnSizeToFit: makeGridAtom(columnSizeToFit, store),
412
- gridId: makeGridAtom(gridId, store),
413
- widthTotal: makeGridAtom(widthTotal, store),
414
- heightTotal: makeGridAtom(heightTotal, store),
415
- headerHeight: makeGridAtom(headerHeight, store),
416
- headerGroupHeight: makeGridAtom(headerGroupHeight, store),
417
- viewport: makeGridAtom(viewport, store),
418
- viewportHeightInner: makeGridAtom(viewportHeightInner, store),
419
- viewportHeightOuter: makeGridAtom(viewportHeightOuter, store),
420
- viewportWidthInner: makeGridAtom(viewportWidthInner, store),
421
- viewportWidthOuter: makeGridAtom(viewportWidthOuter, store),
422
- xPositions: makeGridAtom(xPositions, store),
423
- yPositions: makeGridAtom(yPositions, store),
476
+ rtl: makeAtom(rtl),
477
+ columns: makeAtom(columns),
478
+ columnMeta: makeAtom(columnMeta),
479
+ columnBase: makeAtom(base),
480
+ columnGroupExpansions: makeAtom(columnGroupExpansions),
481
+ columnGroupDefaultExpansion: makeAtom(columnGroupDefaultExpansion),
482
+ columnGroupJoinDelimiter: makeAtom(columnGroupJoinDelimiter),
483
+ columnGroupMeta: makeAtom(columnGroupMeta),
484
+ columnSizeToFit: makeAtom(columnSizeToFit),
485
+ gridId: makeAtom(gridId),
486
+ widthTotal: makeAtom(widthTotal),
487
+ heightTotal: makeAtom(heightTotal),
488
+ headerHeight: makeAtom(headerHeight),
489
+ headerGroupHeight: makeAtom(headerGroupHeight),
490
+ viewport: makeAtom(viewport),
491
+ viewportHeightInner: makeAtom(viewportHeightInner),
492
+ viewportHeightOuter: makeAtom(viewportHeightOuter),
493
+ viewportWidthInner: makeAtom(viewportWidthInner),
494
+ viewportWidthOuter: makeAtom(viewportWidthOuter),
495
+ xPositions: makeAtom(xPositions),
496
+ yPositions: makeAtom(yPositions),
424
497
  rowDataStore,
425
- rowDataSource: makeGridAtom(rowDataSource, store),
426
- rowAutoHeightGuess: makeGridAtom(rowAutoHeightGuess, store),
427
- rowHeight: makeGridAtom(rowHeight, store),
428
- rowScanDistance: makeGridAtom(rowScanDistance, store),
429
- colScanDistance: makeGridAtom(colScanDistance, store),
430
- colOverscanStart: makeGridAtom(colOverScanStart, store),
431
- colOverscanEnd: makeGridAtom(colOverscanEnd, store),
432
- rowOverscanTop: makeGridAtom(rowOverscanTop, store),
433
- rowOverscanBottom: makeGridAtom(rowOverscanBottom, store),
434
- rowFullWidthPredicate: makeGridAtom(rowFullWidthPredicate, store),
435
- rowFullWidthRenderer: makeGridAtom(rowFullWidthRenderer, store),
436
- cellRenderers: makeGridAtom(cellRenderers, store),
437
- sortModel: makeGridAtom(sortModel, store),
438
- filterModel: makeGridAtom(filterModel, store),
439
- filterInModel: makeGridAtom(filterInModel, store),
440
- rowGroupModel: makeGridAtom(rowGroupModel, store),
441
- aggModel: makeGridAtom(aggModel, store),
442
- rowGroupColumn: makeGridAtom(rowGroupColumn, store),
443
- rowGroupDefaultExpansion: makeGridAtom(rowGroupDefaultExpansion, store),
444
- rowGroupDisplayMode: makeGridAtom(rowGroupDisplayMode, store),
445
- rowGroupExpansions: makeGridAtom(rowGroupExpansions, store),
446
- headerCellRenderers: makeGridAtom(headerCellRenderers, store),
447
- floatingCellRenderers: makeGridAtom(floatingCellRenderers, store),
448
- floatingRowEnabled: makeGridAtom(floatingRowEnabled, store),
449
- floatingRowHeight: makeGridAtom(floatingRowHeight, store),
450
- editRenderers: makeGridAtom(editRenderers, store),
451
- editCellMode: makeGridAtom(editCellMode, store),
452
- editClickActivator: makeGridAtom(editClickActivator, store),
453
- editRowValidatorFn: makeGridAtom(editRowValidatorFn, store),
454
- editActivePosition: makeGridAtom(atom((g) => g(internal_editActivePosition)), store),
455
- columnMarker: makeGridAtom(columnMarker, store),
456
- columnMarkerEnabled: makeGridAtom(columnMarkerEnabled, store),
457
- columnDoubleClickToAutosize: makeGridAtom(columnDoubleClickToAutosize, store),
458
- rowDetailExpansions: makeGridAtom(rowDetailExpansions, store),
459
- rowDetailHeight: makeGridAtom(rowDetailHeight, store),
460
- rowDetailRenderer: makeGridAtom(rowDetailRenderer, store),
461
- rowDetailAutoHeightGuess: makeGridAtom(rowDetailAutoHeightGuess, store),
462
- rowSelectedIds: makeGridAtom(rowSelectedIds, store),
463
- rowSelectionMode: makeGridAtom(rowSelectionMode, store),
464
- rowSelectionPivot: makeGridAtom(rowSelectionPivot, store),
465
- rowSelectionActivator: makeGridAtom(rowSelectionActivator, store),
466
- rowSelectChildren: makeGridAtom(rowSelectChildren, store),
467
- viewBounds: makeGridAtom(bounds, store),
468
- virtualizeRows: makeGridAtom(virtualizeRows, store),
469
- virtualizeCols: makeGridAtom(virtualizeCols, store),
470
- quickSearch: makeGridAtom(quickSearch, store),
471
- quickSearchSensitivity: makeGridAtom(quickSearchSensitivity, store),
472
- columnPivotMode: makeGridAtom(columnPivotMode, store),
473
- columnPivotColumns: makeGridAtom(columnPivotColumns, store),
474
- columnPivotModel: makeGridAtom(columnPivotModel, store),
475
- columnPivotColumnGroupExpansions: makeGridAtom(columnPivotColumnGroupExpansions, store),
476
- columnPivotRowGroupExpansions: makeGridAtom(columnPivotRowGroupExpansions, store),
477
- dialogFrames: makeGridAtom(dialogFrame, store),
478
- popoverFrames: makeGridAtom(popoverFrame, store),
479
- cellSelections: makeGridAtom(cellSelections, store),
480
- cellSelectionMode: makeGridAtom(cellSelectionMode, store),
498
+ rowDataSource: makeAtom(rowDataSource),
499
+ rowAutoHeightGuess: makeAtom(rowAutoHeightGuess),
500
+ rowHeight: makeAtom(rowHeight),
501
+ rowScanDistance: makeAtom(rowScanDistance),
502
+ colScanDistance: makeAtom(colScanDistance),
503
+ colOverscanStart: makeAtom(colOverScanStart),
504
+ colOverscanEnd: makeAtom(colOverscanEnd),
505
+ rowOverscanTop: makeAtom(rowOverscanTop),
506
+ rowOverscanBottom: makeAtom(rowOverscanBottom),
507
+ rowFullWidthPredicate: makeAtom(rowFullWidthPredicate),
508
+ rowFullWidthRenderer: makeAtom(rowFullWidthRenderer),
509
+ cellRenderers: makeAtom(cellRenderers),
510
+ sortModel: makeAtom(sortModel),
511
+ filterModel: makeAtom(filterModel),
512
+ filterInModel: makeAtom(filterInModel),
513
+ rowGroupModel: makeAtom(rowGroupModel),
514
+ aggModel: makeAtom(aggModel),
515
+ rowGroupColumn: makeAtom(rowGroupColumn),
516
+ rowGroupDefaultExpansion: makeAtom(rowGroupDefaultExpansion),
517
+ rowGroupDisplayMode: makeAtom(rowGroupDisplayMode),
518
+ rowGroupExpansions: makeAtom(rowGroupExpansions),
519
+ headerCellRenderers: makeAtom(headerCellRenderers),
520
+ floatingCellRenderers: makeAtom(floatingCellRenderers),
521
+ floatingRowEnabled: makeAtom(floatingRowEnabled),
522
+ floatingRowHeight: makeAtom(floatingRowHeight),
523
+ editRenderers: makeAtom(editRenderers),
524
+ editCellMode: makeAtom(editCellMode),
525
+ editClickActivator: makeAtom(editClickActivator),
526
+ editRowValidatorFn: makeAtom(editRowValidatorFn),
527
+ editActivePosition: makeAtom(computed(() => internal_editActivePosition())),
528
+ columnMarker: makeAtom(columnMarker),
529
+ columnMarkerEnabled: makeAtom(columnMarkerEnabled),
530
+ columnDoubleClickToAutosize: makeAtom(columnDoubleClickToAutosize),
531
+ rowDetailExpansions: makeAtom(rowDetailExpansions),
532
+ rowDetailHeight: makeAtom(rowDetailHeight),
533
+ rowDetailRenderer: makeAtom(rowDetailRenderer),
534
+ rowDetailAutoHeightGuess: makeAtom(rowDetailAutoHeightGuess),
535
+ rowSelectedIds: makeAtom(rowSelectedIds),
536
+ rowSelectionMode: makeAtom(rowSelectionMode),
537
+ rowSelectionPivot: makeAtom(internal_rowSelectionPivot),
538
+ rowSelectionActivator: makeAtom(rowSelectionActivator),
539
+ rowSelectChildren: makeAtom(rowSelectChildren),
540
+ viewBounds: makeAtom(bounds),
541
+ virtualizeRows: makeAtom(virtualizeRows),
542
+ virtualizeCols: makeAtom(virtualizeCols),
543
+ quickSearch: makeAtom(quickSearch),
544
+ quickSearchSensitivity: makeAtom(quickSearchSensitivity),
545
+ columnPivotMode: makeAtom(columnPivotMode),
546
+ columnPivotColumns: makeAtom(columnPivotColumns),
547
+ columnPivotModel: makeAtom(columnPivotModel),
548
+ columnPivotColumnGroupExpansions: makeAtom(columnPivotColumnGroupExpansions),
549
+ columnPivotRowGroupExpansions: makeAtom(columnPivotRowGroupExpansions),
550
+ dialogFrames: makeAtom(dialogFrame),
551
+ popoverFrames: makeAtom(popoverFrame),
552
+ cellSelections: makeAtom(cellSelections),
553
+ cellSelectionMode: makeAtom(cellSelectionMode),
481
554
  };
482
555
  const api = {};
483
- const grid = { state, view: makeGridAtom(gridView, store), api };
556
+ const grid = { state, view: makeAtom(gridView), api };
484
557
  const listeners = makeEventListeners();
485
558
  Object.assign(api, {
559
+ cellRoot: makeCellRoot(grid),
486
560
  columnField: makeColumnField(grid),
487
561
  columnByIndex: makeColumnByIndex(grid),
488
562
  columnIndex: makeColumnIndex(grid),
@@ -529,56 +603,46 @@ export function makeLyteNyte(p) {
529
603
  });
530
604
  Object.assign(grid, {
531
605
  internal: {
532
- headerCols: makeGridAtom(atom((g) => g(columnView).maxCol), store),
533
- headerRows: makeGridAtom(atom((g) => g(columnView).maxRow), store),
534
- headerHeightTotal: makeGridAtom(headerHeightTotal, store),
535
- xScroll: makeGridAtom(xScroll, store),
536
- yScroll: makeGridAtom(yScroll, store),
537
- refreshKey: makeGridAtom(rdsAtoms.snapshotKey, store),
538
- layout: makeGridAtom(layoutMap, store),
539
- focusActive: makeGridAtom(internal_focusActive, store),
540
- focusPrevColIndex: makeGridAtom(internal_focusPrevCol, store),
541
- focusPrevRowIndex: makeGridAtom(internal_focusPrevRow, store),
542
- editActivePos: makeGridAtom(internal_editActivePosition, store),
543
- editData: makeGridAtom(internal_editData, store),
544
- editValidation: makeGridAtom(internal_editValidation, store),
545
- rowAutoHeightCache: makeGridAtom(internal_rowAutoHeightCache, store),
546
- rowDetailAutoHeightCache: makeGridAtom(internal_rowDetailHeightCache, store),
606
+ headerCols: makeAtom(computed(() => columnView().maxCol)),
607
+ headerRows: makeAtom(computed(() => columnView().maxRow)),
608
+ headerHeightTotal: makeAtom(headerHeightTotal),
609
+ xScroll: makeAtom(xScroll),
610
+ yScroll: makeAtom(yScroll),
611
+ layout: layoutState,
612
+ focusActive: makeAtom(internal_focusActive),
613
+ focusPrevColIndex: makeAtom(internal_focusPrevCol),
614
+ focusPrevRowIndex: makeAtom(internal_focusPrevRow),
615
+ editActivePos: makeAtom(internal_editActivePosition),
616
+ editData: makeAtom(internal_editData),
617
+ editValidation: makeAtom(internal_editValidation),
618
+ rowAutoHeightCache: makeAtom(internal_rowAutoHeightCache),
619
+ rowDetailAutoHeightCache: makeAtom(internal_rowDetailHeightCache),
547
620
  rowSelectedIds: rowSelectedIds,
548
- rowSelectionPivot: makeGridAtom(internal_rowSelectionPivot, store),
549
- rowSelectionLastWasDeselect: makeGridAtom(internal_rowSelectionLastWasDeselect, store),
550
- draggingHeader: makeGridAtom(internal_draggingHeader, store),
551
- dialogFrames: makeGridAtom(internal_dialogFrames, store),
552
- popoverFrames: makeGridAtom(internal_popoverFrames, store),
553
- cellSelectionPivot: makeGridAtom(internal_cellSelectionPivot, store),
554
- cellSelectionAdditiveRects: makeGridAtom(internal_cellSelectionAdditive, store),
555
- cellSelectionIsDeselect: makeGridAtom(atom(false), store),
556
- cellSelectionSplits: makeGridAtom(internal_cellSelectionSplits, store),
557
- rowGroupColumnState: makeGridAtom(internal__rowGroupColumnState, store),
558
- store: store,
621
+ rowSelectionPivot: makeAtom(internal_rowSelectionPivot),
622
+ rowSelectionLastWasDeselect: makeAtom(internal_rowSelectionLastWasDeselect),
623
+ draggingHeader: makeAtom(internal_draggingHeader),
624
+ rowGroupColumnState: makeAtom(internal__rowGroupColumnState),
625
+ dialogFrames: makeAtom(internal_dialogFrames),
626
+ popoverFrames: makeAtom(internal_popoverFrames),
627
+ cellSelectionPivot: makeAtom(internal_cellSelectionPivot),
628
+ cellSelectionAdditiveRects: makeAtom(internal_cellSelectionAdditive),
629
+ cellSelectionIsDeselect: makeAtom(signal(false)),
630
+ cellSelectionSplits: makeAtom(internal_cellSelectionSplits),
559
631
  },
560
632
  });
561
- store.sub(rowDataSource, () => {
562
- store.get(rowDataSource).init(grid);
633
+ effect(() => {
634
+ rowDataSource().init(grid);
563
635
  });
564
- store.set(rowDataSource, p.rowDataSource ?? emptyRowDataSource);
636
+ rowDataSource.set(p.rowDataSource ?? emptyRowDataSource);
565
637
  // Ensure cell selections are bounded.
566
- store.sub(cellSelections, () => {
567
- const selections = store.get(cellSelections);
638
+ effect(() => {
639
+ rowDataStore.rowCount.$();
640
+ columnMeta();
641
+ const selections = cellSelections();
568
642
  const safeSelections = selections.map((c) => boundSelectionRect(grid, c));
569
643
  if (equal(selections, safeSelections))
570
644
  return;
571
- store.set(cellSelections, safeSelections);
572
- });
573
- store.sub(rdsAtoms.rowCount, () => {
574
- const selections = store.get(cellSelections);
575
- const safeSelections = selections.map((c) => boundSelectionRect(grid, c));
576
- store.set(cellSelections, safeSelections);
577
- });
578
- store.sub(columnMeta, () => {
579
- const selections = store.get(cellSelections);
580
- const safeSelections = selections.map((c) => boundSelectionRect(grid, c));
581
- store.set(cellSelections, safeSelections);
645
+ cellSelections.set(selections);
582
646
  });
583
647
  return grid;
584
648
  }