From e9ee571ef3595ed5e8c3ba234cbfe763ac55ed55 Mon Sep 17 00:00:00 2001 From: syuilo <4439005+syuilo@users.noreply.github.com> Date: Sun, 11 May 2025 10:58:48 +0900 Subject: [PATCH] wip --- .../src/components/MkDrive.folder.vue | 90 ++++++++++-------- .../src/components/MkDrive.navFolder.vue | 58 ++++++++---- packages/frontend/src/components/MkDrive.vue | 92 ++++++++++++------- 3 files changed, 150 insertions(+), 90 deletions(-) diff --git a/packages/frontend/src/components/MkDrive.folder.vue b/packages/frontend/src/components/MkDrive.folder.vue index 42746aa0ec..e0d3705663 100644 --- a/packages/frontend/src/components/MkDrive.folder.vue +++ b/packages/frontend/src/components/MkDrive.folder.vue @@ -43,6 +43,7 @@ import { claimAchievement } from '@/utility/achievements.js'; import { copyToClipboard } from '@/utility/copy-to-clipboard.js'; import { prefer } from '@/preferences.js'; import { DATA_TRANSFER_DRIVE_FILE, DATA_TRANSFER_DRIVE_FILES, DATA_TRANSFER_DRIVE_FOLDER, DATA_TRANSFER_DRIVE_FOLDERS } from '@/consts.js'; +import { globalEvents } from '@/events.js'; const props = withDefaults(defineProps<{ folder: Misskey.entities.DriveFolder; @@ -143,46 +144,65 @@ function onDrop(ev: DragEvent) { } //#region ドライブのファイル - const driveFile = ev.dataTransfer.getData(DATA_TRANSFER_DRIVE_FILE); - if (driveFile != null && driveFile !== '') { - const file = JSON.parse(driveFile); - misskeyApi('drive/files/update', { - fileId: file.id, - folderId: props.folder.id, - }); + { + const driveFile = ev.dataTransfer.getData(DATA_TRANSFER_DRIVE_FILE); + if (driveFile != null && driveFile !== '') { + const file = JSON.parse(driveFile); + misskeyApi('drive/files/update', { + fileId: file.id, + folderId: props.folder.id, + }); + } + } + //#endregion + + //#region ドライブのファイル(複数) + { + const driveFiles = ev.dataTransfer.getData(DATA_TRANSFER_DRIVE_FILES); + if (driveFiles != null && driveFiles !== '') { + const files = JSON.parse(driveFiles); + misskeyApi('drive/files/move-bulk', { + fileIds: files.map(f => f.id), + folderId: props.folder.id, + }).then(() => { + globalEvents.emit('driveFilesMoved', files, props.folder); + }); + } } //#endregion //#region ドライブのフォルダ - const driveFolder = ev.dataTransfer.getData(DATA_TRANSFER_DRIVE_FOLDER); - if (driveFolder != null && driveFolder !== '') { - const folder = JSON.parse(driveFolder); + { + const driveFolder = ev.dataTransfer.getData(DATA_TRANSFER_DRIVE_FOLDER); + if (driveFolder != null && driveFolder !== '') { + const folder = JSON.parse(driveFolder); - // 移動先が自分自身ならreject - if (folder.id === props.folder.id) return; + // 移動先が自分自身ならreject + if (folder.id === props.folder.id) return; - misskeyApi('drive/folders/update', { - folderId: folder.id, - parentId: props.folder.id, - }).then(() => { + misskeyApi('drive/folders/update', { + folderId: folder.id, + parentId: props.folder.id, + }).then(() => { // noop - }).catch(err => { - switch (err.code) { - case 'RECURSIVE_NESTING': - claimAchievement('driveFolderCircularReference'); - os.alert({ - type: 'error', - title: i18n.ts.unableToProcess, - text: i18n.ts.circularReferenceFolder, - }); - break; - default: - os.alert({ - type: 'error', - text: i18n.ts.somethingHappened, - }); - } - }); + }).catch(err => { + switch (err.code) { + case 'RECURSIVE_NESTING': + claimAchievement('driveFolderCircularReference'); + os.alert({ + type: 'error', + title: i18n.ts.unableToProcess, + text: i18n.ts.circularReferenceFolder, + }); + break; + default: + os.alert({ + type: 'error', + text: i18n.ts.somethingHappened, + }); + } + }); + } } //#endregion } @@ -204,10 +224,6 @@ function onDragend() { emit('dragend'); } -function go() { - emit('move', props.folder); -} - function rename() { os.inputText({ title: i18n.ts.renameFolder, diff --git a/packages/frontend/src/components/MkDrive.navFolder.vue b/packages/frontend/src/components/MkDrive.navFolder.vue index d44cbb6e17..bbd1584057 100644 --- a/packages/frontend/src/components/MkDrive.navFolder.vue +++ b/packages/frontend/src/components/MkDrive.navFolder.vue @@ -21,7 +21,8 @@ import { ref } from 'vue'; import * as Misskey from 'misskey-js'; import { misskeyApi } from '@/utility/misskey-api.js'; import { i18n } from '@/i18n.js'; -import { DATA_TRANSFER_DRIVE_FILE, DATA_TRANSFER_DRIVE_FOLDER } from '@/consts.js'; +import { DATA_TRANSFER_DRIVE_FILE, DATA_TRANSFER_DRIVE_FILES, DATA_TRANSFER_DRIVE_FOLDER, DATA_TRANSFER_DRIVE_FOLDERS } from '@/consts.js'; +import { globalEvents } from '@/events.js'; const props = defineProps<{ folder?: Misskey.entities.DriveFolder; @@ -44,9 +45,11 @@ function onDragover(ev: DragEvent) { const isFile = ev.dataTransfer.items[0].kind === 'file'; const isDriveFile = ev.dataTransfer.types[0] === DATA_TRANSFER_DRIVE_FILE; + const isDriveFiles = ev.dataTransfer.types[0] === DATA_TRANSFER_DRIVE_FILES; const isDriveFolder = ev.dataTransfer.types[0] === DATA_TRANSFER_DRIVE_FOLDER; + const isDriveFolders = ev.dataTransfer.types[0] === DATA_TRANSFER_DRIVE_FOLDERS; - if (isFile || isDriveFile || isDriveFolder) { + if (isFile || isDriveFile || isDriveFolder || isDriveFiles || isDriveFolders) { switch (ev.dataTransfer.effectAllowed) { case 'all': case 'uninitialized': @@ -92,26 +95,45 @@ function onDrop(ev: DragEvent) { } //#region ドライブのファイル - const driveFile = ev.dataTransfer.getData(DATA_TRANSFER_DRIVE_FILE); - if (driveFile != null && driveFile !== '') { - const file = JSON.parse(driveFile); - misskeyApi('drive/files/update', { - fileId: file.id, - folderId: props.folder ? props.folder.id : null, - }); + { + const driveFile = ev.dataTransfer.getData(DATA_TRANSFER_DRIVE_FILE); + if (driveFile != null && driveFile !== '') { + const file = JSON.parse(driveFile); + misskeyApi('drive/files/update', { + fileId: file.id, + folderId: props.folder ? props.folder.id : null, + }); + } + } + //#endregion + + //#region ドライブのファイル(複数) + { + const driveFiles = ev.dataTransfer.getData(DATA_TRANSFER_DRIVE_FILES); + if (driveFiles != null && driveFiles !== '') { + const files = JSON.parse(driveFiles); + misskeyApi('drive/files/move-bulk', { + fileIds: files.map(f => f.id), + folderId: props.folder ? props.folder.id : null, + }).then(() => { + globalEvents.emit('driveFilesMoved', files, props.folder ?? null); + }); + } } //#endregion //#region ドライブのフォルダ - const driveFolder = ev.dataTransfer.getData(DATA_TRANSFER_DRIVE_FOLDER); - if (driveFolder != null && driveFolder !== '') { - const folder = JSON.parse(driveFolder); - // 移動先が自分自身ならreject - if (props.folder && folder.id === props.folder.id) return; - misskeyApi('drive/folders/update', { - folderId: folder.id, - parentId: props.folder ? props.folder.id : null, - }); + { + const driveFolder = ev.dataTransfer.getData(DATA_TRANSFER_DRIVE_FOLDER); + if (driveFolder != null && driveFolder !== '') { + const folder = JSON.parse(driveFolder); + // 移動先が自分自身ならreject + if (props.folder && folder.id === props.folder.id) return; + misskeyApi('drive/folders/update', { + folderId: folder.id, + parentId: props.folder ? props.folder.id : null, + }); + } } //#endregion } diff --git a/packages/frontend/src/components/MkDrive.vue b/packages/frontend/src/components/MkDrive.vue index e42165c3bc..d6c645c6ef 100644 --- a/packages/frontend/src/components/MkDrive.vue +++ b/packages/frontend/src/components/MkDrive.vue @@ -319,47 +319,66 @@ function onDrop(ev: DragEvent) { } //#region ドライブのファイル - const driveFile = ev.dataTransfer.getData(DATA_TRANSFER_DRIVE_FILE); - if (driveFile != null && driveFile !== '') { - const file = JSON.parse(driveFile); - if (filesPaginator.items.value.some(f => f.id === file.id)) return; - misskeyApi('drive/files/update', { - fileId: file.id, - folderId: folder.value ? folder.value.id : null, - }); + { + const driveFile = ev.dataTransfer.getData(DATA_TRANSFER_DRIVE_FILE); + if (driveFile != null && driveFile !== '') { + const file = JSON.parse(driveFile); + if (filesPaginator.items.value.some(f => f.id === file.id)) return; + misskeyApi('drive/files/update', { + fileId: file.id, + folderId: folder.value ? folder.value.id : null, + }); + } + } + //#endregion + + //#region ドライブのファイル(複数) + { + const driveFiles = ev.dataTransfer.getData(DATA_TRANSFER_DRIVE_FILES); + if (driveFiles != null && driveFiles !== '') { + const files = JSON.parse(driveFiles); + misskeyApi('drive/files/move-bulk', { + fileIds: files.map(f => f.id), + folderId: folder.value ? folder.value.id : null, + }).then(() => { + globalEvents.emit('driveFilesMoved', files, folder.value); + }); + } } //#endregion //#region ドライブのフォルダ - const driveFolder = ev.dataTransfer.getData(DATA_TRANSFER_DRIVE_FOLDER); - if (driveFolder != null && driveFolder !== '') { - const droppedFolder = JSON.parse(driveFolder); + { + const driveFolder = ev.dataTransfer.getData(DATA_TRANSFER_DRIVE_FOLDER); + if (driveFolder != null && driveFolder !== '') { + const droppedFolder = JSON.parse(driveFolder); - // 移動先が自分自身ならreject - if (folder.value && droppedFolder.id === folder.value.id) return false; - if (foldersPaginator.items.value.some(f => f.id === droppedFolder.id)) return false; - misskeyApi('drive/folders/update', { - folderId: droppedFolder.id, - parentId: folder.value ? folder.value.id : null, - }).then(() => { + // 移動先が自分自身ならreject + if (folder.value && droppedFolder.id === folder.value.id) return false; + if (foldersPaginator.items.value.some(f => f.id === droppedFolder.id)) return false; + misskeyApi('drive/folders/update', { + folderId: droppedFolder.id, + parentId: folder.value ? folder.value.id : null, + }).then(() => { // noop - }).catch(err => { - switch (err.code) { - case 'RECURSIVE_NESTING': - claimAchievement('driveFolderCircularReference'); - os.alert({ - type: 'error', - title: i18n.ts.unableToProcess, - text: i18n.ts.circularReferenceFolder, - }); - break; - default: - os.alert({ - type: 'error', - text: i18n.ts.somethingHappened, - }); - } - }); + }).catch(err => { + switch (err.code) { + case 'RECURSIVE_NESTING': + claimAchievement('driveFolderCircularReference'); + os.alert({ + type: 'error', + title: i18n.ts.unableToProcess, + text: i18n.ts.circularReferenceFolder, + }); + break; + default: + os.alert({ + type: 'error', + text: i18n.ts.somethingHappened, + }); + } + }); + } } //#endregion } @@ -649,6 +668,9 @@ function closeTip() { } useGlobalEvent('driveFilesMoved', (files, to) => { + for (const f of files) { + filesPaginator.removeItem(f.id); + } if ((to?.id ?? null) === (folder.value?.id ?? null)) { filesPaginator.unshiftItems(files); }