diff --git a/packages/svelte-file-tree/src/lib/components/Tree.svelte b/packages/svelte-file-tree/src/lib/components/Tree.svelte index f689836..d05adea 100644 --- a/packages/svelte-file-tree/src/lib/components/Tree.svelte +++ b/packages/svelte-file-tree/src/lib/components/Tree.svelte @@ -95,7 +95,7 @@ } }, shouldClearClipboard = (operation) => operation === "cut", - onResolveNameConflict = () => "cancel", + onResolveNameConflict = () => "default", onCircularReference = noop, canCopy = truePredicate, onCopy = noop, @@ -308,7 +308,8 @@ } } - const name = current.node.name; + const node = current.node; + let name = node.name; if (uniqueNames.has(name)) { const resolution = await onResolveNameConflict({ operation: "copy", @@ -322,12 +323,21 @@ case "cancel": { return false; } + case "default": { + name = `${node.name} copy`; + for (let i = 2; uniqueNames.has(name); i++) { + name = `${node.name} copy ${i}`; + } + break; + } } } uniqueNames.add(name); sources.push(current); - copies.push(copyNode(current.node)); + const copy = copyNode(node); + copy.name = name; + copies.push(copy); } if (sources.length === 0) { @@ -384,7 +394,8 @@ } } - const name = current.node.name; + const node = current.node; + const name = node.name; if (uniqueNames.has(name)) { const resolution = await onResolveNameConflict({ operation: "move", @@ -395,7 +406,8 @@ case "skip": { continue; } - case "cancel": { + case "cancel": + case "default": { return false; } } @@ -403,7 +415,7 @@ uniqueNames.add(name); sources.push(current); - sourceIds.add(current.node.id); + sourceIds.add(node.id); sourceParents.add(current.parent); } diff --git a/packages/svelte-file-tree/src/lib/components/types.ts b/packages/svelte-file-tree/src/lib/components/types.ts index bede053..f01ae1e 100644 --- a/packages/svelte-file-tree/src/lib/components/types.ts +++ b/packages/svelte-file-tree/src/lib/components/types.ts @@ -31,7 +31,7 @@ export type OnResolveNameConflictArgs< name: string; }; -export type NameConflictResolution = "skip" | "cancel"; +export type NameConflictResolution = "skip" | "cancel" | "default"; export type OnCircularReferenceArgs< TFile extends FileNode = FileNode, diff --git a/sites/preview/src/lib/Tree.svelte b/sites/preview/src/lib/Tree.svelte index 9e67a8c..8dedd6a 100644 --- a/sites/preview/src/lib/Tree.svelte +++ b/sites/preview/src/lib/Tree.svelte @@ -46,10 +46,6 @@ }, }, dialog: { - failedToCopyItems: { - en: "Failed to copy items", - ar: "فشل نسخ العناصر", - }, failedToMoveItems: { en: "Failed to move items", ar: "فشل نقل العناصر", @@ -192,21 +188,13 @@ operation, name, }: OnResolveNameConflictArgs) { - return new Promise((resolve) => { - let title; - switch (operation) { - case "copy": { - title = translations.dialog.failedToCopyItems[lang]; - break; - } - case "move": { - title = translations.dialog.failedToMoveItems[lang]; - break; - } - } + if (operation === "copy") { + return "default"; + } + return new Promise((resolve) => { showDialog({ - title, + title: translations.dialog.failedToMoveItems[lang], description: translations.dialog.nameConflictDescription[lang](name), confirmLabel: translations.dialog.skip[lang], cancelLabel: translations.dialog.cancel[lang],