Skip to content

Commit 7a472eb

Browse files
committed
feat: add batched option
1 parent 912130e commit 7a472eb

File tree

2 files changed

+58
-24
lines changed

2 files changed

+58
-24
lines changed

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>,

0 commit comments

Comments
 (0)