feat(tree): add flat and lazy modes for tree data handling

* Implement flat mode to transform flat data with parentId to nested structure.
* Introduce lazy mode for on-demand loading of children.
* Update tree rendering logic to accommodate new modes.
* Enhance tree cell expansion logic to support lazy loading.
* Add dark mode styles for improved UI experience.
* Create comprehensive end-to-end tests for tree functionality.
This commit is contained in:
Hein
2026-02-17 13:03:20 +02:00
parent 9ddc960578
commit 93568891cd
23 changed files with 1131 additions and 707 deletions

View File

@@ -82,16 +82,16 @@ export interface GriddyStoreState extends GriddyUIState {
setScrollRef: (el: HTMLDivElement | null) => void;
// ─── Internal ref setters ───
setTable: (table: Table<any>) => void;
setVirtualizer: (virtualizer: Virtualizer<HTMLDivElement, Element>) => void;
setTreeChildrenCache: (nodeId: string, children: any[]) => void;
setTreeLoadingNode: (nodeId: string, loading: boolean) => void;
setVirtualizer: (virtualizer: Virtualizer<HTMLDivElement, Element>) => void;
showToolbar?: boolean;
sorting?: SortingState;
// ─── Tree/Hierarchical Data ───
tree?: TreeConfig<any>;
treeLoadingNodes: Set<string>;
treeChildrenCache: Map<string, any[]>;
setTreeLoadingNode: (nodeId: string, loading: boolean) => void;
setTreeChildrenCache: (nodeId: string, children: any[]) => void;
treeLoadingNodes: Set<string>;
// ─── Synced from GriddyProps (written by $sync) ───
uniqueId?: string;
}
@@ -150,10 +150,12 @@ export const { Provider: GriddyProvider, useStore: useGriddyStore } = createSync
setTable: (table) => set({ _table: table }),
setTotalRows: (count) => set({ totalRows: count }),
setVirtualizer: (virtualizer) => set({ _virtualizer: virtualizer }),
// ─── Tree State ───
treeLoadingNodes: new Set(),
treeChildrenCache: new Map(),
setTreeChildrenCache: (nodeId, children) =>
set((state) => {
const newMap = new Map(state.treeChildrenCache);
newMap.set(nodeId, children);
return { treeChildrenCache: newMap };
}),
setTreeLoadingNode: (nodeId, loading) =>
set((state) => {
const newSet = new Set(state.treeLoadingNodes);
@@ -164,12 +166,10 @@ export const { Provider: GriddyProvider, useStore: useGriddyStore } = createSync
}
return { treeLoadingNodes: newSet };
}),
setTreeChildrenCache: (nodeId, children) =>
set((state) => {
const newMap = new Map(state.treeChildrenCache);
newMap.set(nodeId, children);
return { treeChildrenCache: newMap };
}),
setVirtualizer: (virtualizer) => set({ _virtualizer: virtualizer }),
// ─── Row Count ───
totalRows: 0,
treeChildrenCache: new Map(),
// ─── Tree State ───
treeLoadingNodes: new Set(),
}));