@keenmate/svelte-treeview 4.6.0 → 4.8.0
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 +218 -222
- package/dist/components/Node.svelte +89 -72
- package/dist/components/Node.svelte.d.ts +1 -1
- package/dist/components/Tree.svelte +422 -171
- package/dist/components/Tree.svelte.d.ts +37 -13
- package/dist/constants.generated.d.ts +1 -1
- package/dist/constants.generated.js +1 -1
- package/dist/ltree/indexer.js +5 -2
- package/dist/ltree/ltree-node.svelte.d.ts +3 -0
- package/dist/ltree/ltree-node.svelte.js +2 -0
- package/dist/ltree/ltree.svelte.d.ts +1 -1
- package/dist/ltree/ltree.svelte.js +120 -73
- package/dist/ltree/types.d.ts +9 -3
- package/dist/styles/main.scss +53 -6
- package/dist/styles.css +43 -6
- package/dist/styles.css.map +1 -1
- package/package.json +1 -1
|
@@ -13,6 +13,8 @@ declare function $$render<T>(): {
|
|
|
13
13
|
isSelectedMember?: string | null | undefined;
|
|
14
14
|
isDraggableMember?: string | null | undefined;
|
|
15
15
|
isDropAllowedMember?: string | null | undefined;
|
|
16
|
+
allowedDropPositionsMember?: string | null | undefined;
|
|
17
|
+
getAllowedDropPositionsCallback?: (node: LTreeNode<T>) => DropPosition[] | null | undefined;
|
|
16
18
|
hasChildrenMember?: string | null | undefined;
|
|
17
19
|
isSorted?: boolean | null | undefined;
|
|
18
20
|
displayValueMember?: string | null | undefined;
|
|
@@ -54,13 +56,19 @@ declare function $$render<T>(): {
|
|
|
54
56
|
/**
|
|
55
57
|
* Use flat/centralized rendering instead of recursive node rendering.
|
|
56
58
|
* This significantly improves performance for large trees by:
|
|
57
|
-
* - Removing the {#key changeTracker} block that destroys all nodes on any change
|
|
58
59
|
* - Using a single flat loop instead of recursive component instantiation
|
|
59
60
|
* - Allowing Svelte's keyed {#each} to efficiently diff only changed nodes
|
|
61
|
+
* - Per-node reactive signals for O(1) data-only updates (updateNode, selection)
|
|
60
62
|
*/
|
|
61
63
|
useFlatRendering?: boolean;
|
|
62
|
-
/**
|
|
63
|
-
|
|
64
|
+
/** Enable virtual scrolling in flat mode. Only visible nodes + overscan are rendered. */
|
|
65
|
+
virtualScroll?: boolean;
|
|
66
|
+
/** Explicit row height in px. Auto-measured from first row if not set. */
|
|
67
|
+
virtualRowHeight?: number;
|
|
68
|
+
/** Extra rows above/below viewport (default: 5) */
|
|
69
|
+
virtualOverscan?: number;
|
|
70
|
+
/** CSS height for scroll container. Auto-detected from parent if not set, fallback 400px. */
|
|
71
|
+
virtualContainerHeight?: string;
|
|
64
72
|
dragDropMode?: DragDropMode;
|
|
65
73
|
dropZoneMode?: "floating" | "glow";
|
|
66
74
|
dropZoneLayout?: "around" | "above" | "below" | "wave" | "wave2";
|
|
@@ -129,7 +137,7 @@ declare function $$render<T>(): {
|
|
|
129
137
|
error?: string;
|
|
130
138
|
};
|
|
131
139
|
applyChanges: (changes: import("../ltree/types").TreeChange<T>[]) => import("../ltree/types").ApplyChangesResult;
|
|
132
|
-
copyNodeWithDescendants: (sourceNode: LTreeNode<T>, targetParentPath: string, transformData: (data: T) => T) => {
|
|
140
|
+
copyNodeWithDescendants: (sourceNode: LTreeNode<T>, targetParentPath: string, transformData: (data: T) => T, siblingPath?: string, position?: "above" | "below") => {
|
|
133
141
|
success: boolean;
|
|
134
142
|
rootNode?: LTreeNode<T>;
|
|
135
143
|
count: number;
|
|
@@ -158,6 +166,8 @@ declare function $$render<T>(): {
|
|
|
158
166
|
isSelectedMember?: string | null | undefined;
|
|
159
167
|
isDraggableMember?: string | null | undefined;
|
|
160
168
|
isDropAllowedMember?: string | null | undefined;
|
|
169
|
+
allowedDropPositionsMember?: string | null | undefined;
|
|
170
|
+
getAllowedDropPositionsCallback?: (node: LTreeNode<T>) => DropPosition[] | null | undefined;
|
|
161
171
|
hasChildrenMember?: string | null | undefined;
|
|
162
172
|
isSorted?: boolean | null | undefined;
|
|
163
173
|
displayValueMember?: string | null | undefined;
|
|
@@ -199,13 +209,19 @@ declare function $$render<T>(): {
|
|
|
199
209
|
/**
|
|
200
210
|
* Use flat/centralized rendering instead of recursive node rendering.
|
|
201
211
|
* This significantly improves performance for large trees by:
|
|
202
|
-
* - Removing the {#key changeTracker} block that destroys all nodes on any change
|
|
203
212
|
* - Using a single flat loop instead of recursive component instantiation
|
|
204
213
|
* - Allowing Svelte's keyed {#each} to efficiently diff only changed nodes
|
|
214
|
+
* - Per-node reactive signals for O(1) data-only updates (updateNode, selection)
|
|
205
215
|
*/
|
|
206
216
|
useFlatRendering?: boolean;
|
|
207
|
-
/**
|
|
208
|
-
|
|
217
|
+
/** Enable virtual scrolling in flat mode. Only visible nodes + overscan are rendered. */
|
|
218
|
+
virtualScroll?: boolean;
|
|
219
|
+
/** Explicit row height in px. Auto-measured from first row if not set. */
|
|
220
|
+
virtualRowHeight?: number;
|
|
221
|
+
/** Extra rows above/below viewport (default: 5) */
|
|
222
|
+
virtualOverscan?: number;
|
|
223
|
+
/** CSS height for scroll container. Auto-detected from parent if not set, fallback 400px. */
|
|
224
|
+
virtualContainerHeight?: string;
|
|
209
225
|
dragDropMode?: DragDropMode;
|
|
210
226
|
dropZoneMode?: "floating" | "glow";
|
|
211
227
|
dropZoneLayout?: "around" | "above" | "below" | "wave" | "wave2";
|
|
@@ -241,7 +257,7 @@ declare function $$render<T>(): {
|
|
|
241
257
|
scrollHighlightClass?: string | null | undefined;
|
|
242
258
|
contextMenuXOffset?: number | null | undefined;
|
|
243
259
|
contextMenuYOffset?: number | null | undefined;
|
|
244
|
-
}, "treeId" | "treePathSeparator" | "idMember" | "pathMember" | "parentPathMember" | "levelMember" | "hasChildrenMember" | "isExpandedMember" | "isSelectedMember" | "isDraggableMember" | "isDropAllowedMember" | "displayValueMember" | "getDisplayValueCallback" | "searchValueMember" | "getSearchValueCallback" | "orderMember" | "isSorted" | "sortCallback" | "data" | "selectedNode" | "expandLevel" | "shouldToggleOnNodeClick" | "shouldUseInternalSearchIndex" | "initializeIndexCallback" | "searchText" | "indexerBatchSize" | "indexerTimeout" | "shouldDisplayDebugInformation" | "shouldDisplayContextMenuInDebugMode" | "onNodeClicked" | "onNodeDragStart" | "onNodeDragOver" | "beforeDropCallback" | "onNodeDrop" | "contextMenuCallback" | "dragDropMode" | "dropZoneMode" | "bodyClass" | "expandIconClass" | "collapseIconClass" | "leafIconClass" | "selectedNodeClass" | "dragOverNodeClass" | "scrollHighlightTimeout" | "scrollHighlightClass" | "contextMenuXOffset" | "contextMenuYOffset">>) => void;
|
|
260
|
+
}, "treeId" | "treePathSeparator" | "idMember" | "pathMember" | "parentPathMember" | "levelMember" | "hasChildrenMember" | "isExpandedMember" | "isSelectedMember" | "isDraggableMember" | "isDropAllowedMember" | "displayValueMember" | "getDisplayValueCallback" | "searchValueMember" | "getSearchValueCallback" | "orderMember" | "isSorted" | "sortCallback" | "data" | "selectedNode" | "expandLevel" | "shouldToggleOnNodeClick" | "shouldUseInternalSearchIndex" | "initializeIndexCallback" | "searchText" | "indexerBatchSize" | "indexerTimeout" | "shouldDisplayDebugInformation" | "shouldDisplayContextMenuInDebugMode" | "onNodeClicked" | "onNodeDragStart" | "onNodeDragOver" | "beforeDropCallback" | "onNodeDrop" | "contextMenuCallback" | "dragDropMode" | "dropZoneMode" | "bodyClass" | "expandIconClass" | "collapseIconClass" | "leafIconClass" | "selectedNodeClass" | "dragOverNodeClass" | "scrollHighlightTimeout" | "scrollHighlightClass" | "contextMenuXOffset" | "contextMenuYOffset" | "virtualScroll" | "virtualRowHeight" | "virtualOverscan" | "virtualContainerHeight">>) => void;
|
|
245
261
|
};
|
|
246
262
|
bindings: "data" | "selectedNode" | "insertResult" | "searchText" | "isRendering";
|
|
247
263
|
slots: {};
|
|
@@ -284,7 +300,7 @@ declare class __sveltets_Render<T> {
|
|
|
284
300
|
error?: string;
|
|
285
301
|
};
|
|
286
302
|
applyChanges: (changes: import("../ltree/types.js").TreeChange<T>[]) => import("../ltree/types").ApplyChangesResult;
|
|
287
|
-
copyNodeWithDescendants: (sourceNode: LTreeNode<T>, targetParentPath: string, transformData: (data: T) => T) => {
|
|
303
|
+
copyNodeWithDescendants: (sourceNode: LTreeNode<T>, targetParentPath: string, transformData: (data: T) => T, siblingPath?: string, position?: "above" | "below") => {
|
|
288
304
|
success: boolean;
|
|
289
305
|
rootNode?: LTreeNode<T> | undefined;
|
|
290
306
|
count: number;
|
|
@@ -313,6 +329,8 @@ declare class __sveltets_Render<T> {
|
|
|
313
329
|
isSelectedMember?: string | null | undefined;
|
|
314
330
|
isDraggableMember?: string | null | undefined;
|
|
315
331
|
isDropAllowedMember?: string | null | undefined;
|
|
332
|
+
allowedDropPositionsMember?: string | null | undefined;
|
|
333
|
+
getAllowedDropPositionsCallback?: ((node: LTreeNode<T>) => DropPosition[] | null | undefined) | undefined;
|
|
316
334
|
hasChildrenMember?: string | null | undefined;
|
|
317
335
|
isSorted?: boolean | null | undefined;
|
|
318
336
|
displayValueMember?: string | null | undefined;
|
|
@@ -354,13 +372,19 @@ declare class __sveltets_Render<T> {
|
|
|
354
372
|
/**
|
|
355
373
|
* Use flat/centralized rendering instead of recursive node rendering.
|
|
356
374
|
* This significantly improves performance for large trees by:
|
|
357
|
-
* - Removing the {#key changeTracker} block that destroys all nodes on any change
|
|
358
375
|
* - Using a single flat loop instead of recursive component instantiation
|
|
359
376
|
* - Allowing Svelte's keyed {#each} to efficiently diff only changed nodes
|
|
377
|
+
* - Per-node reactive signals for O(1) data-only updates (updateNode, selection)
|
|
360
378
|
*/
|
|
361
379
|
useFlatRendering?: boolean;
|
|
362
|
-
/**
|
|
363
|
-
|
|
380
|
+
/** Enable virtual scrolling in flat mode. Only visible nodes + overscan are rendered. */
|
|
381
|
+
virtualScroll?: boolean;
|
|
382
|
+
/** Explicit row height in px. Auto-measured from first row if not set. */
|
|
383
|
+
virtualRowHeight?: number;
|
|
384
|
+
/** Extra rows above/below viewport (default: 5) */
|
|
385
|
+
virtualOverscan?: number;
|
|
386
|
+
/** CSS height for scroll container. Auto-detected from parent if not set, fallback 400px. */
|
|
387
|
+
virtualContainerHeight?: string;
|
|
364
388
|
dragDropMode?: DragDropMode;
|
|
365
389
|
dropZoneMode?: "floating" | "glow";
|
|
366
390
|
dropZoneLayout?: "around" | "above" | "below" | "wave" | "wave2";
|
|
@@ -396,7 +420,7 @@ declare class __sveltets_Render<T> {
|
|
|
396
420
|
scrollHighlightClass?: string | null | undefined;
|
|
397
421
|
contextMenuXOffset?: number | null | undefined;
|
|
398
422
|
contextMenuYOffset?: number | null | undefined;
|
|
399
|
-
}, "treeId" | "data" | "
|
|
423
|
+
}, "treeId" | "data" | "treePathSeparator" | "idMember" | "pathMember" | "parentPathMember" | "levelMember" | "hasChildrenMember" | "isExpandedMember" | "displayValueMember" | "getDisplayValueCallback" | "searchValueMember" | "getSearchValueCallback" | "orderMember" | "isSorted" | "sortCallback" | "isDraggableMember" | "isDropAllowedMember" | "shouldDisplayDebugInformation" | "isSelectedMember" | "selectedNode" | "expandLevel" | "shouldToggleOnNodeClick" | "shouldUseInternalSearchIndex" | "initializeIndexCallback" | "searchText" | "indexerBatchSize" | "indexerTimeout" | "shouldDisplayContextMenuInDebugMode" | "virtualScroll" | "virtualRowHeight" | "virtualOverscan" | "virtualContainerHeight" | "dragDropMode" | "dropZoneMode" | "onNodeClicked" | "onNodeDragStart" | "onNodeDragOver" | "beforeDropCallback" | "onNodeDrop" | "contextMenuCallback" | "bodyClass" | "expandIconClass" | "collapseIconClass" | "leafIconClass" | "selectedNodeClass" | "dragOverNodeClass" | "scrollHighlightTimeout" | "scrollHighlightClass" | "contextMenuXOffset" | "contextMenuYOffset">>) => void;
|
|
400
424
|
};
|
|
401
425
|
}
|
|
402
426
|
interface $$IsomorphicComponent {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// Auto-generated file - do not edit manually
|
|
2
2
|
// Generated by scripts/generate-constants.js
|
|
3
|
-
export const VERSION = "4.
|
|
3
|
+
export const VERSION = "4.8.0";
|
|
4
4
|
export const PACKAGE_NAME = "@keenmate/svelte-treeview";
|
|
5
5
|
export const AUTHOR = "KeenMate";
|
|
6
6
|
export const LICENSE = "MIT";
|
package/dist/ltree/indexer.js
CHANGED
|
@@ -26,7 +26,8 @@ export class Indexer {
|
|
|
26
26
|
}
|
|
27
27
|
// Add items to the processing queue
|
|
28
28
|
addToQueue(items) {
|
|
29
|
-
|
|
29
|
+
// Use concat instead of push(...items) to avoid stack overflow with large arrays
|
|
30
|
+
this.processingQueue = this.processingQueue.concat(items);
|
|
30
31
|
this.totalItemsAdded += items.length;
|
|
31
32
|
indexLogger.debug(`[${this.treeId}] Added ${items.length} items to queue. Queue size: ${this.processingQueue.length}`);
|
|
32
33
|
// Start processing if not already running
|
|
@@ -137,7 +138,9 @@ export class Indexer {
|
|
|
137
138
|
this.isProcessing = false;
|
|
138
139
|
indexLogger.info(`[${this.treeId}] Indexing complete. Processed ${this.totalItemsProcessed} items.`);
|
|
139
140
|
if (this.onCompleteCallback) {
|
|
140
|
-
this.onCompleteCallback
|
|
141
|
+
const cb = this.onCompleteCallback;
|
|
142
|
+
this.onCompleteCallback = undefined;
|
|
143
|
+
cb();
|
|
141
144
|
}
|
|
142
145
|
}
|
|
143
146
|
// Get current indexer status
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export type NodeId = string | number;
|
|
2
|
+
export type DropPosition = 'above' | 'below' | 'child';
|
|
2
3
|
export declare enum VisualState {
|
|
3
4
|
indeterminate = "indeterminate",
|
|
4
5
|
selected = "true",
|
|
@@ -18,6 +19,7 @@ export interface LTreeNode<T> {
|
|
|
18
19
|
priority: number | null | undefined;
|
|
19
20
|
isDraggable: boolean;
|
|
20
21
|
isDropAllowed: boolean;
|
|
22
|
+
allowedDropPositions: DropPosition[] | null | undefined;
|
|
21
23
|
isInsertAllowed: boolean;
|
|
22
24
|
isNestAllowed: boolean;
|
|
23
25
|
isCheckboxVisible: boolean | null | undefined;
|
|
@@ -25,5 +27,6 @@ export interface LTreeNode<T> {
|
|
|
25
27
|
isExpanded: boolean;
|
|
26
28
|
isSelected: boolean;
|
|
27
29
|
isSelectable: boolean;
|
|
30
|
+
_rev: number;
|
|
28
31
|
}
|
|
29
32
|
export declare function createLTreeNode<T>(data?: Partial<LTreeNode<T>>): LTreeNode<T>;
|
|
@@ -19,6 +19,7 @@ export function createLTreeNode(data) {
|
|
|
19
19
|
priority: undefined,
|
|
20
20
|
isDraggable: true,
|
|
21
21
|
isDropAllowed: true,
|
|
22
|
+
allowedDropPositions: undefined,
|
|
22
23
|
isInsertAllowed: true,
|
|
23
24
|
isNestAllowed: true,
|
|
24
25
|
isCheckboxVisible: false,
|
|
@@ -26,6 +27,7 @@ export function createLTreeNode(data) {
|
|
|
26
27
|
isExpanded: false,
|
|
27
28
|
isSelected: false,
|
|
28
29
|
isSelectable: true,
|
|
30
|
+
_rev: 0,
|
|
29
31
|
...data
|
|
30
32
|
};
|
|
31
33
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import { Index } from 'flexsearch';
|
|
2
2
|
import { type LTreeNode } from './ltree-node.svelte';
|
|
3
3
|
import type { Ltree } from './types.js';
|
|
4
|
-
export declare function createLTree<T>(_idMember: string, _pathMember: string, _parentPathMember?: string | null | undefined, _levelMember?: string | null | undefined, _hasChildrenMember?: string | null | undefined, _isExpandedMember?: string | null | undefined, _isSelectableMember?: string | null | undefined, _isDraggableMember?: string | null | undefined, _isDropAllowedMember?: string | null | undefined, _displayValueMember?: string | null | undefined, _getDisplayValueCallback?: (node: LTreeNode<T>) => string, _searchValueMember?: string | null | undefined, _getSearchValueCallback?: (node: LTreeNode<T>) => string, _orderMember?: string | null | undefined, _treeId?: string, _treePathSeparator?: string | null | undefined, _expandLevel?: number | null | undefined, _shouldUseInternalSearchIndex?: boolean | null | undefined, _initializeIndexCallback?: () => Index, _indexerBatchSize?: number | null | undefined, _indexerTimeout?: number | null | undefined, opts?: Partial<Ltree<T>>): Ltree<T>;
|
|
4
|
+
export declare function createLTree<T>(_idMember: string, _pathMember: string, _parentPathMember?: string | null | undefined, _levelMember?: string | null | undefined, _hasChildrenMember?: string | null | undefined, _isExpandedMember?: string | null | undefined, _isSelectableMember?: string | null | undefined, _isDraggableMember?: string | null | undefined, _isDropAllowedMember?: string | null | undefined, _allowedDropPositionsMember?: string | null | undefined, _displayValueMember?: string | null | undefined, _getDisplayValueCallback?: (node: LTreeNode<T>) => string, _searchValueMember?: string | null | undefined, _getSearchValueCallback?: (node: LTreeNode<T>) => string, _getAllowedDropPositionsCallback?: (node: LTreeNode<T>) => import('./types').DropPosition[] | null | undefined, _orderMember?: string | null | undefined, _treeId?: string, _treePathSeparator?: string | null | undefined, _expandLevel?: number | null | undefined, _shouldUseInternalSearchIndex?: boolean | null | undefined, _initializeIndexCallback?: () => Index, _indexerBatchSize?: number | null | undefined, _indexerTimeout?: number | null | undefined, opts?: Partial<Ltree<T>>): Ltree<T>;
|