Skip to content

Commit 776c745

Browse files
authored
Merge pull request #76 from abdel-17/add-batch-option
feat: add option to control batching
2 parents 45e97bc + 9cf6ba1 commit 776c745

File tree

8 files changed

+795
-1462
lines changed

8 files changed

+795
-1462
lines changed

.changeset/twelve-trams-arrive.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"svelte-file-tree": minor
3+
---
4+
5+
expose option to disable batching in tree methods

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@
1313
"format:check": "pnpm --parallel --color format:check"
1414
},
1515
"devDependencies": {
16-
"@changesets/cli": "^2.29.4",
17-
"playwright": "^1.52.0",
16+
"@changesets/cli": "^2.29.5",
17+
"playwright": "^1.54.1",
1818
"prettier-plugin-svelte": "^3.4.0"
1919
},
2020
"pnpm": {

packages/svelte-file-tree/package.json

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -34,24 +34,24 @@
3434
"svelte": "^5.31.0"
3535
},
3636
"dependencies": {
37-
"@atlaskit/pragmatic-drag-and-drop": "^1.7.0",
37+
"@atlaskit/pragmatic-drag-and-drop": "^1.7.4",
3838
"esm-env": "^1.2.2"
3939
},
4040
"devDependencies": {
41-
"@sveltejs/kit": "^2.21.1",
42-
"@sveltejs/package": "^2.3.11",
43-
"@sveltejs/vite-plugin-svelte": "5.0.3",
44-
"@types/node": "^22.15.29",
45-
"@vitest/browser": "^3.1.4",
41+
"@sveltejs/kit": "^2.22.5",
42+
"@sveltejs/package": "^2.3.12",
43+
"@sveltejs/vite-plugin-svelte": "6.0.0",
44+
"@types/node": "^24.0.13",
45+
"@vitest/browser": "^3.2.4",
4646
"jsdom": "^26.1.0",
47-
"prettier": "^3.5.3",
47+
"prettier": "^3.6.2",
4848
"prettier-plugin-svelte": "^3.4.0",
4949
"publint": "^0.3.12",
50-
"svelte": "5.33.11",
51-
"svelte-check": "^4.2.1",
52-
"vite": "^6.3.5",
53-
"vitest": "3.1.4",
54-
"vitest-browser-svelte": "^0.1.0"
50+
"svelte": "5.35.6",
51+
"svelte-check": "^4.2.2",
52+
"vite": "^7.0.4",
53+
"vitest": "3.2.4",
54+
"vitest-browser-svelte": "^1.0.0"
5555
},
5656
"repository": {
5757
"type": "git",

packages/svelte-file-tree/src/lib/components/Tree.svelte

Lines changed: 49 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,11 @@
1919
type DefaultTFolder,
2020
} from "$lib/tree.svelte.js";
2121
import { setTreeContext } from "./context.js";
22-
import type { PasteOperation, TreeProps } from "./types.js";
22+
import type {
23+
TreeCopyToClipboardMethodOptions,
24+
TreeProps,
25+
TreeRemoveMethodOptions,
26+
} from "./types.js";
2327
2428
let {
2529
children,
@@ -248,13 +252,17 @@
248252
}
249253
}
250254
251-
export function copyToClipboard(itemId: string, operation: PasteOperation) {
255+
export function copyToClipboard(itemId: string, options: TreeCopyToClipboardMethodOptions = {}) {
256+
const { pasteOperation: newPasteOperation = "copy", batched = true } = options;
257+
252258
clipboardIds.clear();
253-
for (const id of selectedIds) {
254-
clipboardIds.add(id);
259+
if (batched) {
260+
for (const id of selectedIds) {
261+
clipboardIds.add(id);
262+
}
255263
}
256264
clipboardIds.add(itemId);
257-
pasteOperation = operation;
265+
pasteOperation = newPasteOperation;
258266
onClipboardChange({ clipboardIds, pasteOperation });
259267
}
260268
@@ -457,24 +465,31 @@
457465
}
458466
}
459467
460-
export async function remove(item: TreeItemState<TFile, TFolder>) {
468+
export async function remove(
469+
item: TreeItemState<TFile, TFolder>,
470+
options: TreeRemoveMethodOptions = {},
471+
) {
472+
const { batched = true } = options;
473+
461474
const removed: Array<TreeItemState<TFile, TFolder>> = [];
462475
const removedOwners = new Set<TFolder | TTree>();
463-
outer: for (const id of selectedIds) {
464-
const current = getItem(id);
465-
if (current === undefined) {
466-
continue;
467-
}
476+
if (batched) {
477+
outer: for (const id of selectedIds) {
478+
const current = getItem(id);
479+
if (current === undefined) {
480+
continue;
481+
}
468482
469-
for (let ancestor = current.parent; ancestor !== undefined; ancestor = ancestor.parent) {
470-
if (ancestor.selected) {
471-
// If an ancestor is removed, its children are removed along with it.
472-
continue outer;
483+
for (let ancestor = current.parent; ancestor !== undefined; ancestor = ancestor.parent) {
484+
if (ancestor.selected) {
485+
// If an ancestor is removed, its children are removed along with it.
486+
continue outer;
487+
}
473488
}
474-
}
475489
476-
removed.push(current);
477-
removedOwners.add(current.parent?.node ?? root);
490+
removed.push(current);
491+
removedOwners.add(current.parent?.node ?? root);
492+
}
478493
}
479494
480495
if (!removed.includes(item)) {
@@ -521,10 +536,20 @@
521536
}
522537
523538
const node = item.node;
524-
for (const owner of removedOwners) {
525-
owner.children = owner.children.filter(
526-
(child) => !selectedIds.has(child.id) && child !== node,
527-
);
539+
if (batched) {
540+
for (const owner of removedOwners) {
541+
owner.children = owner.children.filter(
542+
(child) => !selectedIds.has(child.id) && child !== node,
543+
);
544+
onChildrenChange({
545+
operation: "remove",
546+
target: owner,
547+
children: owner.children,
548+
});
549+
}
550+
} else {
551+
const owner = item.parent?.node ?? root;
552+
owner.children = owner.children.filter((child) => child !== node);
528553
onChildrenChange({
529554
operation: "remove",
530555
target: owner,
@@ -845,15 +870,15 @@
845870
break;
846871
}
847872
848-
copyToClipboard(item.node.id, "copy");
873+
copyToClipboard(item.node.id, { pasteOperation: "copy" });
849874
break;
850875
}
851876
case "x": {
852877
if (!isControlOrMeta(event)) {
853878
break;
854879
}
855880
856-
copyToClipboard(item.node.id, "cut");
881+
copyToClipboard(item.node.id, { pasteOperation: "cut" });
857882
break;
858883
}
859884
case "v": {

packages/svelte-file-tree/src/lib/components/types.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,15 @@ export interface TreeProps<
149149
onDrop?: (args: DragEventArgs<TFile, TFolder, TTree>) => void;
150150
}
151151

152+
export type TreeCopyToClipboardMethodOptions = {
153+
pasteOperation?: PasteOperation;
154+
batched?: boolean;
155+
};
156+
157+
export type TreeRemoveMethodOptions = {
158+
batched?: boolean;
159+
};
160+
152161
export interface TreeItemProps<
153162
TFile extends FileNode = FileNode,
154163
TFolder extends FolderNode<TFile | TFolder> = DefaultTFolder<TFile>,

packages/svelte-file-tree/vitest.workspace.ts

Lines changed: 0 additions & 41 deletions
This file was deleted.

0 commit comments

Comments
 (0)