This commit is contained in:
syuilo 2025-05-11 10:58:48 +09:00
parent 9bf9b10ba4
commit e9ee571ef3
3 changed files with 150 additions and 90 deletions

View File

@ -43,6 +43,7 @@ import { claimAchievement } from '@/utility/achievements.js';
import { copyToClipboard } from '@/utility/copy-to-clipboard.js'; import { copyToClipboard } from '@/utility/copy-to-clipboard.js';
import { prefer } from '@/preferences.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 { 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<{ const props = withDefaults(defineProps<{
folder: Misskey.entities.DriveFolder; folder: Misskey.entities.DriveFolder;
@ -143,46 +144,65 @@ function onDrop(ev: DragEvent) {
} }
//#region //#region
const driveFile = ev.dataTransfer.getData(DATA_TRANSFER_DRIVE_FILE); {
if (driveFile != null && driveFile !== '') { const driveFile = ev.dataTransfer.getData(DATA_TRANSFER_DRIVE_FILE);
const file = JSON.parse(driveFile); if (driveFile != null && driveFile !== '') {
misskeyApi('drive/files/update', { const file = JSON.parse(driveFile);
fileId: file.id, misskeyApi('drive/files/update', {
folderId: props.folder.id, 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 //#endregion
//#region //#region
const driveFolder = ev.dataTransfer.getData(DATA_TRANSFER_DRIVE_FOLDER); {
if (driveFolder != null && driveFolder !== '') { const driveFolder = ev.dataTransfer.getData(DATA_TRANSFER_DRIVE_FOLDER);
const folder = JSON.parse(driveFolder); if (driveFolder != null && driveFolder !== '') {
const folder = JSON.parse(driveFolder);
// reject // reject
if (folder.id === props.folder.id) return; if (folder.id === props.folder.id) return;
misskeyApi('drive/folders/update', { misskeyApi('drive/folders/update', {
folderId: folder.id, folderId: folder.id,
parentId: props.folder.id, parentId: props.folder.id,
}).then(() => { }).then(() => {
// noop // noop
}).catch(err => { }).catch(err => {
switch (err.code) { switch (err.code) {
case 'RECURSIVE_NESTING': case 'RECURSIVE_NESTING':
claimAchievement('driveFolderCircularReference'); claimAchievement('driveFolderCircularReference');
os.alert({ os.alert({
type: 'error', type: 'error',
title: i18n.ts.unableToProcess, title: i18n.ts.unableToProcess,
text: i18n.ts.circularReferenceFolder, text: i18n.ts.circularReferenceFolder,
}); });
break; break;
default: default:
os.alert({ os.alert({
type: 'error', type: 'error',
text: i18n.ts.somethingHappened, text: i18n.ts.somethingHappened,
}); });
} }
}); });
}
} }
//#endregion //#endregion
} }
@ -204,10 +224,6 @@ function onDragend() {
emit('dragend'); emit('dragend');
} }
function go() {
emit('move', props.folder);
}
function rename() { function rename() {
os.inputText({ os.inputText({
title: i18n.ts.renameFolder, title: i18n.ts.renameFolder,

View File

@ -21,7 +21,8 @@ import { ref } from 'vue';
import * as Misskey from 'misskey-js'; import * as Misskey from 'misskey-js';
import { misskeyApi } from '@/utility/misskey-api.js'; import { misskeyApi } from '@/utility/misskey-api.js';
import { i18n } from '@/i18n.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<{ const props = defineProps<{
folder?: Misskey.entities.DriveFolder; folder?: Misskey.entities.DriveFolder;
@ -44,9 +45,11 @@ function onDragover(ev: DragEvent) {
const isFile = ev.dataTransfer.items[0].kind === 'file'; const isFile = ev.dataTransfer.items[0].kind === 'file';
const isDriveFile = ev.dataTransfer.types[0] === DATA_TRANSFER_DRIVE_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 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) { switch (ev.dataTransfer.effectAllowed) {
case 'all': case 'all':
case 'uninitialized': case 'uninitialized':
@ -92,26 +95,45 @@ function onDrop(ev: DragEvent) {
} }
//#region //#region
const driveFile = ev.dataTransfer.getData(DATA_TRANSFER_DRIVE_FILE); {
if (driveFile != null && driveFile !== '') { const driveFile = ev.dataTransfer.getData(DATA_TRANSFER_DRIVE_FILE);
const file = JSON.parse(driveFile); if (driveFile != null && driveFile !== '') {
misskeyApi('drive/files/update', { const file = JSON.parse(driveFile);
fileId: file.id, misskeyApi('drive/files/update', {
folderId: props.folder ? props.folder.id : null, 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 //#endregion
//#region //#region
const driveFolder = ev.dataTransfer.getData(DATA_TRANSFER_DRIVE_FOLDER); {
if (driveFolder != null && driveFolder !== '') { const driveFolder = ev.dataTransfer.getData(DATA_TRANSFER_DRIVE_FOLDER);
const folder = JSON.parse(driveFolder); if (driveFolder != null && driveFolder !== '') {
// reject const folder = JSON.parse(driveFolder);
if (props.folder && folder.id === props.folder.id) return; // reject
misskeyApi('drive/folders/update', { if (props.folder && folder.id === props.folder.id) return;
folderId: folder.id, misskeyApi('drive/folders/update', {
parentId: props.folder ? props.folder.id : null, folderId: folder.id,
}); parentId: props.folder ? props.folder.id : null,
});
}
} }
//#endregion //#endregion
} }

View File

@ -319,47 +319,66 @@ function onDrop(ev: DragEvent) {
} }
//#region //#region
const driveFile = ev.dataTransfer.getData(DATA_TRANSFER_DRIVE_FILE); {
if (driveFile != null && driveFile !== '') { const driveFile = ev.dataTransfer.getData(DATA_TRANSFER_DRIVE_FILE);
const file = JSON.parse(driveFile); if (driveFile != null && driveFile !== '') {
if (filesPaginator.items.value.some(f => f.id === file.id)) return; const file = JSON.parse(driveFile);
misskeyApi('drive/files/update', { if (filesPaginator.items.value.some(f => f.id === file.id)) return;
fileId: file.id, misskeyApi('drive/files/update', {
folderId: folder.value ? folder.value.id : null, 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 //#endregion
//#region //#region
const driveFolder = ev.dataTransfer.getData(DATA_TRANSFER_DRIVE_FOLDER); {
if (driveFolder != null && driveFolder !== '') { const driveFolder = ev.dataTransfer.getData(DATA_TRANSFER_DRIVE_FOLDER);
const droppedFolder = JSON.parse(driveFolder); if (driveFolder != null && driveFolder !== '') {
const droppedFolder = JSON.parse(driveFolder);
// reject // reject
if (folder.value && droppedFolder.id === folder.value.id) return false; if (folder.value && droppedFolder.id === folder.value.id) return false;
if (foldersPaginator.items.value.some(f => f.id === droppedFolder.id)) return false; if (foldersPaginator.items.value.some(f => f.id === droppedFolder.id)) return false;
misskeyApi('drive/folders/update', { misskeyApi('drive/folders/update', {
folderId: droppedFolder.id, folderId: droppedFolder.id,
parentId: folder.value ? folder.value.id : null, parentId: folder.value ? folder.value.id : null,
}).then(() => { }).then(() => {
// noop // noop
}).catch(err => { }).catch(err => {
switch (err.code) { switch (err.code) {
case 'RECURSIVE_NESTING': case 'RECURSIVE_NESTING':
claimAchievement('driveFolderCircularReference'); claimAchievement('driveFolderCircularReference');
os.alert({ os.alert({
type: 'error', type: 'error',
title: i18n.ts.unableToProcess, title: i18n.ts.unableToProcess,
text: i18n.ts.circularReferenceFolder, text: i18n.ts.circularReferenceFolder,
}); });
break; break;
default: default:
os.alert({ os.alert({
type: 'error', type: 'error',
text: i18n.ts.somethingHappened, text: i18n.ts.somethingHappened,
}); });
} }
}); });
}
} }
//#endregion //#endregion
} }
@ -649,6 +668,9 @@ function closeTip() {
} }
useGlobalEvent('driveFilesMoved', (files, to) => { useGlobalEvent('driveFilesMoved', (files, to) => {
for (const f of files) {
filesPaginator.removeItem(f.id);
}
if ((to?.id ?? null) === (folder.value?.id ?? null)) { if ((to?.id ?? null) === (folder.value?.id ?? null)) {
filesPaginator.unshiftItems(files); filesPaginator.unshiftItems(files);
} }