diff --git a/packages/frontend/src/components/MkUploaderDialog.vue b/packages/frontend/src/components/MkUploaderDialog.vue index 723b129822..3a83247d4b 100644 --- a/packages/frontend/src/components/MkUploaderDialog.vue +++ b/packages/frontend/src/components/MkUploaderDialog.vue @@ -51,6 +51,10 @@ SPDX-License-Identifier: AGPL-3.0-only +
+ +
+ (), { - + multiple: true, }); const emit = defineEmits<{ @@ -316,22 +321,34 @@ async function upload() { // エラーハンドリングなどを考慮してシ } } +async function chooseFile(ev: MouseEvent) { + const newFiles = await os.chooseFileFromPc({ multiple: true }); + + for (const file of newFiles) { + initializeFile(file); + } +} + +function initializeFile(file: File) { + const id = uuid(); + const filename = file.name ?? 'untitled'; + const extension = filename.split('.').length > 1 ? '.' + filename.split('.').pop() : ''; + items.value.push({ + id, + name: prefer.s.keepOriginalFilename ? filename : id + extension, + progress: null, + thumbnail: window.URL.createObjectURL(file), + waiting: false, + uploading: false, + uploaded: null, + uploadFailed: false, + file: markRaw(file), + }); +} + onMounted(() => { for (const file of props.files) { - const id = uuid(); - const filename = file.name ?? 'untitled'; - const extension = filename.split('.').length > 1 ? '.' + filename.split('.').pop() : ''; - items.value.push({ - id, - name: prefer.s.keepOriginalFilename ? filename : id + extension, - progress: null, - thumbnail: window.URL.createObjectURL(file), - waiting: false, - uploading: false, - uploaded: null, - uploadFailed: false, - file: markRaw(file), - }); + initializeFile(file); } }); diff --git a/packages/frontend/src/components/MkUserSetupDialog.Profile.vue b/packages/frontend/src/components/MkUserSetupDialog.Profile.vue index ce3192e230..4e96eff82e 100644 --- a/packages/frontend/src/components/MkUserSetupDialog.Profile.vue +++ b/packages/frontend/src/components/MkUserSetupDialog.Profile.vue @@ -85,7 +85,7 @@ async function setAvatar(ev) { }); } - const driveFile = (await os.launchUploader([originalOrCropped], {}))[0]; + const driveFile = (await os.launchUploader([originalOrCropped], { multiple: false }))[0]; const i = await os.apiWithDialog('i/update', { avatarId: driveFile.id, diff --git a/packages/frontend/src/os.ts b/packages/frontend/src/os.ts index 54fa5a5af9..6d49408f26 100644 --- a/packages/frontend/src/os.ts +++ b/packages/frontend/src/os.ts @@ -772,6 +772,7 @@ export function launchUploader( files: File[], options?: { folderId?: string | null; + multiple?: boolean; }, ): Promise { return new Promise((res, rej) => { @@ -779,6 +780,7 @@ export function launchUploader( const { dispose } = popup(defineAsyncComponent(() => import('@/components/MkUploaderDialog.vue')), { files: markRaw(files), folderId: options?.folderId, + multiple: options?.multiple, }, { done: driveFiles => { if (driveFiles.length === 0) return rej(); diff --git a/packages/frontend/src/pages/chat/room.form.vue b/packages/frontend/src/pages/chat/room.form.vue index 6702cd2ec1..7e3be67230 100644 --- a/packages/frontend/src/pages/chat/room.form.vue +++ b/packages/frontend/src/pages/chat/room.form.vue @@ -86,7 +86,7 @@ async function onPaste(ev: ClipboardEvent) { const ext = lio >= 0 ? pastedFile.name.slice(lio) : ''; const formattedName = formatTimeString(new Date(pastedFile.lastModified), pastedFileName).replace(/{{number}}/g, '1') + ext; const renamedFile = new File([pastedFile], formattedName, { type: pastedFile.type }); - os.launchUploader([renamedFile], {}).then(driveFiles => { + os.launchUploader([renamedFile], { multiple: false }).then(driveFiles => { file.value = driveFiles[0]; }); } @@ -131,7 +131,7 @@ function onDrop(ev: DragEvent): void { // ファイルだったら if (ev.dataTransfer.files.length === 1) { ev.preventDefault(); - os.launchUploader([Array.from(ev.dataTransfer.files)[0]], {}); + os.launchUploader([Array.from(ev.dataTransfer.files)[0]], { multiple: false }); return; } else if (ev.dataTransfer.files.length > 1) { ev.preventDefault(); @@ -177,7 +177,7 @@ function onChangeFile() { if (fileEl.value == null || fileEl.value.files == null) return; if (fileEl.value.files[0]) { - os.launchUploader(Array.from(fileEl.value.files), {}).then(driveFiles => { + os.launchUploader(Array.from(fileEl.value.files), { multiple: false }).then(driveFiles => { file.value = driveFiles[0]; }); } diff --git a/packages/frontend/src/pages/settings/profile.vue b/packages/frontend/src/pages/settings/profile.vue index df637d9e9a..cd1565f39e 100644 --- a/packages/frontend/src/pages/settings/profile.vue +++ b/packages/frontend/src/pages/settings/profile.vue @@ -291,7 +291,7 @@ function changeAvatar(ev) { }); } - const driveFile = (await os.launchUploader([originalOrCropped], {}))[0]; + const driveFile = (await os.launchUploader([originalOrCropped], { multiple: false }))[0]; done(driveFile); }, }, { @@ -339,7 +339,7 @@ function changeBanner(ev) { }); } - const driveFile = (await os.launchUploader([originalOrCropped], {}))[0]; + const driveFile = (await os.launchUploader([originalOrCropped], { multiple: false }))[0]; done(driveFile); }, }, {