drag DirectoryEntry onto directory to move

This commit is contained in:
2025-07-29 22:14:45 +02:00
parent b1409b44d1
commit 2c834eb42b
3 changed files with 87 additions and 2 deletions

View File

@@ -10,6 +10,7 @@ import {
deleteWarrenDirectory, deleteWarrenDirectory,
deleteWarrenFile, deleteWarrenFile,
fetchFile, fetchFile,
moveFile,
} from '~/lib/api/warrens'; } from '~/lib/api/warrens';
import type { DirectoryEntry } from '#shared/types'; import type { DirectoryEntry } from '#shared/types';
@@ -78,6 +79,38 @@ async function onClick() {
} }
} }
} }
function onDragStart(e: DragEvent) {
if (e.dataTransfer == null) {
return;
}
e.dataTransfer.setData('application/warren', entry.name);
e.dataTransfer.dropEffect = 'move';
}
async function onDrop(e: DragEvent) {
if (e.dataTransfer == null || warrenStore.current == null) {
return;
}
if (entry.fileType !== 'directory') {
return;
}
const fileName = e.dataTransfer.getData('application/warren');
if (entry.name === fileName) {
return;
}
await moveFile(
warrenStore.current.warrenId,
warrenStore.current.path,
fileName,
`${warrenStore.current.path}/${entry.name}`
);
}
</script> </script>
<template> <template>
@@ -85,7 +118,10 @@ async function onClick() {
<ContextMenuTrigger> <ContextMenuTrigger>
<button <button
:disabled="warrenStore.loading || disabled" :disabled="warrenStore.loading || disabled"
class="bg-accent/30 border-border select-none, flex w-52 flex-row gap-4 overflow-hidden rounded-md border-1 px-4 py-2" class="bg-accent/30 border-border select-none, flex w-52 translate-0 flex-row gap-4 overflow-hidden rounded-md border-1 px-4 py-2"
draggable="true"
@dragstart="onDragStart"
@drop="onDrop"
@click="onClick" @click="onClick"
> >
<div class="flex flex-row items-center"> <div class="flex flex-row items-center">

View File

@@ -300,3 +300,49 @@ export async function fetchFile(
data: data.value, data: data.value,
}; };
} }
export async function moveFile(
warrenId: string,
path: string,
fileName: string,
targetPath: string
): Promise<{ success: boolean }> {
if (!path.endsWith('/')) {
path += '/';
}
path += fileName;
if (!targetPath.endsWith('/')) {
targetPath += '/';
}
targetPath += fileName;
const { status } = await useFetch(getApiUrl(`warrens/files/mv`), {
method: 'POST',
headers: getApiHeaders(),
body: JSON.stringify({
warrenId,
path,
targetPath,
}),
});
if (status.value !== 'success') {
toast.error('Move', {
id: 'MOVE_FILE_TOAST',
description: `Failed to move ${fileName}`,
});
return { success: false };
}
await refreshNuxtData('current-directory');
toast.success('Rename', {
id: 'RENAME_FILE_TOAST',
description: `Successfully moved ${fileName} to ${targetPath}`,
});
return {
success: true,
};
}

View File

@@ -81,7 +81,10 @@ function onDrop(files: File[] | null, e: DragEvent) {
<DirectoryListContextMenu class="w-full grow"> <DirectoryListContextMenu class="w-full grow">
<DirectoryList <DirectoryList
v-if="entries != null" v-if="entries != null"
:is-over-drop-zone="dropZone.isOverDropZone.value" :is-over-drop-zone="
dropZone.isOverDropZone.value &&
dropZone.files.value != null
"
:entries="entries" :entries="entries"
/> />
</DirectoryListContextMenu> </DirectoryListContextMenu>