Skip to content

Commit d316b1e

Browse files
authored
Merge pull request #64 from abdel-17/improve-editing
change rename ui
2 parents cfc9999 + 85d30fa commit d316b1e

File tree

11 files changed

+154
-295
lines changed

11 files changed

+154
-295
lines changed

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

+1-16
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
defaultClipboardIds,
1818
clipboardIds = new SvelteSet(defaultClipboardIds),
1919
pasteOperation = $bindable(),
20-
isItemEditable = true,
2120
isItemDisabled = false,
2221
id = defaultId,
2322
ref = $bindable(null),
@@ -44,10 +43,6 @@
4443
}
4544
}
4645
},
47-
onRenameItem = ({ target, name }) => {
48-
target.name = name;
49-
return true;
50-
},
5146
onMoveItems = ({ updates }) => {
5247
for (const { target, children } of updates) {
5348
target.children = children;
@@ -65,7 +60,6 @@
6560
return true;
6661
},
6762
onResolveNameConflict = () => "cancel",
68-
onAlreadyExistsError,
6963
onCircularReferenceError,
7064
...rest
7165
}: TreeProps<TNode> = $props();
@@ -79,13 +73,6 @@
7973
setPasteOperation: (value) => {
8074
pasteOperation = value;
8175
},
82-
isItemEditable: (node) => {
83-
if (typeof isItemEditable === "function") {
84-
return isItemEditable(node);
85-
}
86-
87-
return isItemEditable;
88-
},
8976
isItemDisabled: (node) => {
9077
if (typeof isItemDisabled === "function") {
9178
return isItemDisabled(node);
@@ -95,16 +82,14 @@
9582
},
9683
id: () => id,
9784
copyNode: (node) => copyNode(node),
98-
onRenameItem: (args) => onRenameItem(args),
9985
onMoveItems: (args) => onMoveItems(args),
10086
onCopyPasteItems: (args) => onCopyPasteItems(args),
10187
onRemoveItems: (args) => onRemoveItems(args),
10288
onResolveNameConflict: (args) => onResolveNameConflict(args),
103-
onAlreadyExistsError: (args) => onAlreadyExistsError?.(args),
10489
onCircularReferenceError: (args) => onCircularReferenceError?.(args),
10590
});
10691
107-
export const { rename, copy, paste, remove } = treeState;
92+
export const { copy, paste, remove } = treeState;
10893
</script>
10994

11095
<div {...rest} bind:this={ref} {id} role="tree" aria-multiselectable="true">

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

+5-35
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,11 @@
11
<script lang="ts" module>
22
import { composeEventHandlers, isControlOrMeta } from "$lib/internal/helpers.js";
3-
import { DEV } from "esm-env";
4-
import { flushSync, getContext, hasContext, setContext } from "svelte";
3+
import { flushSync } from "svelte";
54
import type { EventHandler } from "svelte/elements";
65
import { getTreeItemProviderContext } from "./TreeItemProvider.svelte";
76
import { createTreeItemDragState, type TreeItemPosition } from "./state.svelte.js";
87
import type { TreeItemChildrenSnippetArgs, TreeItemProps, TreeItemState } from "./types.js";
98
10-
const CONTEXT_KEY = Symbol("TreeItem");
11-
12-
export type TreeItemContext = {
13-
setEditing: (value: boolean) => void;
14-
};
15-
16-
export function getTreeItemContext(): TreeItemContext {
17-
if (DEV && !hasContext(CONTEXT_KEY)) {
18-
throw new Error("No parent <TreeItem> found");
19-
}
20-
21-
return getContext(CONTEXT_KEY);
22-
}
23-
249
function hasChildren(item: TreeItemState): boolean {
2510
return item.node.type === "folder" && item.node.children.length !== 0;
2611
}
@@ -31,7 +16,6 @@
3116
3217
let {
3318
children,
34-
editing = $bindable(false),
3519
ref = $bindable(null),
3620
class: className,
3721
style,
@@ -53,12 +37,9 @@
5337
item,
5438
});
5539
56-
const context: TreeItemContext = {
57-
setEditing: (value) => {
58-
editing = value;
59-
},
60-
};
61-
setContext(CONTEXT_KEY, context);
40+
const childrenArgs: TreeItemChildrenSnippetArgs = $derived({
41+
dropPosition: dropPosition(),
42+
});
6243
6344
const handleFocusIn: EventHandler<FocusEvent, HTMLElement> = () => {
6445
treeState.setTabbableId(item().node.id);
@@ -139,7 +120,7 @@
139120
const itemRect = event.currentTarget.getBoundingClientRect();
140121
141122
let current: TreeItemPosition = item();
142-
let currentElement: HTMLElement = event.currentTarget;
123+
let currentElement = event.currentTarget;
143124
while (true) {
144125
const next = navigate(current);
145126
if (next === undefined) {
@@ -267,12 +248,6 @@
267248
window.scrollBy(0, rectAfter.top - rectBefore.top);
268249
break;
269250
}
270-
case "F2": {
271-
if (item().editable) {
272-
editing = true;
273-
}
274-
break;
275-
}
276251
case "Delete": {
277252
treeState.remove(item());
278253
break;
@@ -382,11 +357,6 @@
382357
treeState.setDraggedId(undefined);
383358
};
384359
385-
const childrenArgs: TreeItemChildrenSnippetArgs = {
386-
editing: () => editing,
387-
dropPosition,
388-
};
389-
390360
$effect(() => {
391361
return () => {
392362
treeState.onItemDestroyed(item().node.id);

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

-67
This file was deleted.

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

-37
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ import { FileNode, FolderNode, type FileTree, type FileTreeNode } from "$lib/tre
33
import { DEV } from "esm-env";
44
import type { SvelteSet } from "svelte/reactivity";
55
import type {
6-
AlreadyExistsErrorArgs,
76
CircularReferenceErrorArgs,
87
CopyPasteItemsArgs,
98
DropPosition,
@@ -12,7 +11,6 @@ import type {
1211
ParentFileTreeNode,
1312
PasteOperation,
1413
RemoveItemsArgs,
15-
RenameItemArgs,
1614
ResolveNameConflictArgs,
1715
TreeItemState,
1816
} from "./types.js";
@@ -24,16 +22,13 @@ export type TreeStateProps<TNode extends FileNode | FolderNode<TNode> = FileTree
2422
clipboardIds: () => SvelteSet<string>;
2523
pasteOperation: () => PasteOperation | undefined;
2624
setPasteOperation: (value: PasteOperation | undefined) => void;
27-
isItemEditable: (node: TNode) => boolean;
2825
isItemDisabled: (node: TNode) => boolean;
2926
id: () => string;
3027
copyNode: (node: TNode) => TNode;
31-
onRenameItem: (args: RenameItemArgs<TNode>) => MaybePromise<boolean>;
3228
onMoveItems: (args: MoveItemsArgs<TNode>) => MaybePromise<boolean>;
3329
onCopyPasteItems: (args: CopyPasteItemsArgs<TNode>) => MaybePromise<boolean>;
3430
onRemoveItems: (args: RemoveItemsArgs<TNode>) => MaybePromise<boolean>;
3531
onResolveNameConflict: (args: ResolveNameConflictArgs) => MaybePromise<NameConflictResolution>;
36-
onAlreadyExistsError: (args: AlreadyExistsErrorArgs) => void;
3732
onCircularReferenceError: (args: CircularReferenceErrorArgs<TNode>) => void;
3833
};
3934

@@ -55,7 +50,6 @@ class TreeItemStateImpl<TNode extends FileNode | FolderNode<TNode> = FileTreeNod
5550
readonly selectedIds: () => SvelteSet<string>,
5651
readonly expandedIds: () => SvelteSet<string>,
5752
readonly clipboardIds: () => SvelteSet<string>,
58-
readonly isItemEditable: (node: TNode) => boolean,
5953
readonly isItemDisabled: (node: TNode) => boolean,
6054
readonly draggedId: () => string | undefined,
6155
) {
@@ -72,8 +66,6 @@ class TreeItemStateImpl<TNode extends FileNode | FolderNode<TNode> = FileTreeNod
7266

7367
readonly inClipboard: boolean = $derived.by(() => this.clipboardIds().has(this.node.id));
7468

75-
readonly editable: boolean = $derived.by(() => this.isItemEditable(this.node));
76-
7769
readonly disabled: boolean = $derived.by(() => {
7870
if (this.parent?.disabled === true) {
7971
return true;
@@ -129,16 +121,13 @@ export function createTreeState<TNode extends FileNode | FolderNode<TNode>>({
129121
clipboardIds,
130122
pasteOperation,
131123
setPasteOperation,
132-
isItemEditable,
133124
isItemDisabled,
134125
id,
135126
copyNode,
136-
onRenameItem,
137127
onMoveItems,
138128
onCopyPasteItems,
139129
onRemoveItems,
140130
onResolveNameConflict,
141-
onAlreadyExistsError,
142131
onCircularReferenceError,
143132
}: TreeStateProps<TNode>) {
144133
let tabbableId: string | undefined = $state.raw();
@@ -178,7 +167,6 @@ export function createTreeState<TNode extends FileNode | FolderNode<TNode>>({
178167
selectedIds,
179168
expandedIds,
180169
clipboardIds,
181-
isItemEditable,
182170
isItemDisabled,
183171
getDraggedId,
184172
);
@@ -344,29 +332,6 @@ export function createTreeState<TNode extends FileNode | FolderNode<TNode>>({
344332
setPasteOperation(undefined);
345333
}
346334

347-
async function rename(target: TreeItemState<TNode>, name: string): Promise<boolean> {
348-
if (name.length === 0) {
349-
return false;
350-
}
351-
352-
const owner = target.parent?.node ?? tree();
353-
for (const child of owner.children) {
354-
if (child !== target.node && name === child.name) {
355-
onAlreadyExistsError({ name });
356-
return false;
357-
}
358-
}
359-
360-
if (name === target.node.name) {
361-
return true;
362-
}
363-
364-
return await onRenameItem({
365-
target: target.node,
366-
name,
367-
});
368-
}
369-
370335
async function moveItems(
371336
movedIds: Set<string>,
372337
isItemMoved: (item: TreeItemState<TNode>) => boolean,
@@ -775,7 +740,6 @@ export function createTreeState<TNode extends FileNode | FolderNode<TNode>>({
775740
clipboardIds,
776741
pasteOperation,
777742
id,
778-
tabbableId: () => tabbableId,
779743
isItemTabbable,
780744
setTabbableId,
781745
draggedId: getDraggedId,
@@ -791,7 +755,6 @@ export function createTreeState<TNode extends FileNode | FolderNode<TNode>>({
791755
selectUntil,
792756
copy,
793757
clearClipboard,
794-
rename,
795758
drop,
796759
paste,
797760
remove,

0 commit comments

Comments
 (0)