Skip to content

Commit 14cae00

Browse files
committed
preview: restore focus after dialog cancel
1 parent 378a695 commit 14cae00

File tree

1 file changed

+45
-28
lines changed

1 file changed

+45
-28
lines changed

sites/preview/src/lib/Tree.svelte

Lines changed: 45 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -66,17 +66,39 @@
6666
let dialogTitle = $state.raw("");
6767
let dialogDescription = $state.raw("");
6868
let dialogConfirmLabel = $state.raw("");
69-
let dialogOnClose: (() => void) | undefined;
69+
let dialogTrigger: HTMLElement | null = null;
7070
let dialogDidConfirm = false;
71+
let dialogOnClose: (() => void) | undefined;
72+
73+
function showDialog({
74+
title,
75+
description,
76+
confirmLabel,
77+
onClose,
78+
}: {
79+
title: string;
80+
description: string;
81+
confirmLabel: string;
82+
onClose: () => void;
83+
}) {
84+
dialogOpen = true;
85+
dialogTitle = title;
86+
dialogDescription = description;
87+
dialogConfirmLabel = confirmLabel;
88+
dialogTrigger = document.activeElement instanceof HTMLElement ? document.activeElement : null;
89+
dialogDidConfirm = false;
90+
dialogOnClose = onClose;
91+
}
7192
7293
function onDialogOpenChangeComplete(open: boolean) {
7394
if (!open) {
7495
dialogTitle = "";
7596
dialogDescription = "";
7697
dialogConfirmLabel = "";
98+
dialogTrigger?.focus();
99+
dialogTrigger = null;
77100
dialogOnClose?.();
78101
dialogOnClose = undefined;
79-
dialogDidConfirm = false;
80102
}
81103
}
82104
@@ -121,13 +143,14 @@
121143
}
122144
}
123145
124-
dialogOpen = true;
125-
dialogTitle = title;
126-
dialogDescription = `An item named "${name}" already exists in this location. Do you want to skip it or cancel the operation entirely?`;
127-
dialogConfirmLabel = "Skip";
128-
dialogOnClose = () => {
129-
resolve(dialogDidConfirm ? "skip" : "cancel");
130-
};
146+
showDialog({
147+
title,
148+
description: `An item named "${name}" already exists in this location. Do you want to skip it or cancel the operation entirely?`,
149+
confirmLabel: "Skip",
150+
onClose: () => {
151+
resolve(dialogDidConfirm ? "skip" : "cancel");
152+
},
153+
});
131154
});
132155
}
133156
@@ -147,13 +170,14 @@
147170
148171
function canRemove({ removed }: OnRemoveArgs<FileNode, FolderNode>) {
149172
return new Promise<boolean>((resolve) => {
150-
dialogOpen = true;
151-
dialogTitle = `Are you sure you want to delete ${removed.length} item(s)?`;
152-
dialogDescription = "They will be permanently deleted. This action cannot be undone.";
153-
dialogConfirmLabel = "Confirm";
154-
dialogOnClose = () => {
155-
resolve(dialogDidConfirm);
156-
};
173+
showDialog({
174+
title: `Are you sure you want to delete ${removed.length} item(s)?`,
175+
description: "They will be permanently deleted. This action cannot be undone.",
176+
confirmLabel: "Confirm",
177+
onClose: () => {
178+
resolve(dialogDidConfirm);
179+
},
180+
});
157181
});
158182
}
159183
@@ -169,22 +193,20 @@
169193
}
170194
};
171195
172-
async function dropItems(dragged: TreeItemState, destination: TreeItemState | undefined) {
196+
async function dropItems(draggedId: string, destination: TreeItemState | undefined) {
173197
if (destination?.node.type === "file") {
174198
throw new Error("Cannot drop on a file");
175199
}
176200
177-
const movedIds = new Set(selectedIds).add(dragged.node.id);
201+
const movedIds = new Set(selectedIds).add(draggedId);
178202
const didMove = await tree!.move(movedIds, destination);
179203
if (!didMove) {
180204
return;
181205
}
182206
183207
let focusTargetOrder;
184208
if (destination === undefined || destination.expanded) {
185-
focusTargetOrder = tree!
186-
.getVisibleItems()
187-
.findIndex((item) => item.node.id === dragged.node.id);
209+
focusTargetOrder = tree!.getVisibleItems().findIndex((item) => item.node.id === draggedId);
188210
} else {
189211
focusTargetOrder = tree!
190212
.getVisibleItems()
@@ -299,18 +321,13 @@
299321
const handleDrop: EventHandler<DragEvent> = (event) => {
300322
event.preventDefault();
301323
302-
let dragged;
303-
if (draggedId !== undefined) {
304-
dragged = tree!.getItem(draggedId);
305-
}
306-
307324
let dropDestination;
308325
if (dropDestinationId !== undefined) {
309326
dropDestination = tree!.getItem(dropDestinationId);
310327
}
311328
312-
if (dragged !== undefined) {
313-
dropItems(dragged, dropDestination);
329+
if (draggedId !== undefined) {
330+
dropItems(draggedId, dropDestination);
314331
} else if (event.dataTransfer?.types.includes("Files")) {
315332
dropFiles(event.dataTransfer.items, dropDestination);
316333
}

0 commit comments

Comments
 (0)