diff --git a/packages/frontend/src/components/MkDrive.folder.vue b/packages/frontend/src/components/MkDrive.folder.vue
index 9c72691d21..37181f65b6 100644
--- a/packages/frontend/src/components/MkDrive.folder.vue
+++ b/packages/frontend/src/components/MkDrive.folder.vue
@@ -230,7 +230,7 @@ function rename() {
}
function move() {
- os.selectDriveFolder(false).then(folder => {
+ os.selectDriveFolder().then(folder => {
if (folder[0] && folder[0].id === props.folder.id) return;
misskeyApi('drive/folders/update', {
diff --git a/packages/frontend/src/components/MkDrive.vue b/packages/frontend/src/components/MkDrive.vue
index 7a283120da..f215457a78 100644
--- a/packages/frontend/src/components/MkDrive.vue
+++ b/packages/frontend/src/components/MkDrive.vue
@@ -36,6 +36,25 @@ SPDX-License-Identifier: AGPL-3.0-only
+
+
+
+ {{ i18n.ts.selectThisFolder }}
+
+
+ {{ i18n.ts.unselectThisFolder }}
+
+
+
+
+ {{ i18n.ts.selectThisFolder }}
+
+ f.id !== folder.id)">
+ {{ i18n.ts.unselectThisFolder }}
+
+
+
+
@@ -134,7 +153,7 @@ import { isSeparatorNeeded, getSeparatorInfo, makeDateGroupedTimelineComputedRef
import { usePagination } from '@/composables/use-pagination.js';
const props = withDefaults(defineProps<{
- initialFolder?: Misskey.entities.DriveFolder;
+ initialFolder?: Misskey.entities.DriveFolder['id'] | null;
type?: string;
multiple?: boolean;
select?: 'file' | 'folder' | null;
@@ -144,8 +163,8 @@ const props = withDefaults(defineProps<{
});
const emit = defineEmits<{
- (ev: 'selected', v: Misskey.entities.DriveFile | Misskey.entities.DriveFolder): void;
- (ev: 'change-selection', v: Misskey.entities.DriveFile[] | Misskey.entities.DriveFolder[]): void;
+ (ev: 'changeSelectedFiles', v: Misskey.entities.DriveFile[]): void;
+ (ev: 'changeSelectedFolders', v: (Misskey.entities.DriveFolder | null)[]): void;
(ev: 'move-root'): void;
(ev: 'cd', v: Misskey.entities.DriveFolder | null): void;
(ev: 'open-folder', v: Misskey.entities.DriveFolder): void;
@@ -153,8 +172,6 @@ const emit = defineEmits<{
const folder = ref
(null);
const hierarchyFolders = ref([]);
-const selectedFiles = ref([]);
-const selectedFolders = ref([]);
const uploadings = uploads;
// ドロップされようとしているか
@@ -166,6 +183,18 @@ const isDragSource = ref(false);
const isEditMode = ref(false);
+const selectedFiles = ref([]);
+const selectedFolders = ref([]);
+const isRootSelected = ref(false);
+
+watch(selectedFiles, () => {
+ emit('changeSelectedFiles', selectedFiles.value);
+});
+
+watch([selectedFolders, isRootSelected], () => {
+ emit('changeSelectedFolders', isRootSelected.value ? [null, ...selectedFolders.value] : selectedFolders.value);
+});
+
const fetching = ref(true);
const sortModeSelect = ref>('+createdAt');
@@ -403,7 +432,7 @@ function upload(file: File, folderToUpload?: Misskey.entities.DriveFolder | null
});
}
-function chooseFile(file: Misskey.entities.DriveFile) {
+function onChooseFile(file: Misskey.entities.DriveFile) {
const isAlreadySelected = selectedFiles.value.some(f => f.id === file.id);
if (isEditMode.value) {
@@ -421,13 +450,11 @@ function chooseFile(file: Misskey.entities.DriveFile) {
} else {
selectedFiles.value.push(file);
}
- emit('change-selection', selectedFiles.value);
} else {
if (isAlreadySelected) {
- emit('selected', file);
+ //emit('selected', file);
} else {
selectedFiles.value = [file];
- emit('change-selection', [file]);
}
}
}
@@ -440,20 +467,17 @@ function chooseFolder(folderToChoose: Misskey.entities.DriveFolder) {
} else {
selectedFolders.value.push(folderToChoose);
}
- emit('change-selection', selectedFolders.value);
} else {
if (isAlreadySelected) {
- emit('selected', folderToChoose);
+ //emit('selected', folderToChoose);
} else {
selectedFolders.value = [folderToChoose];
- emit('change-selection', [folderToChoose]);
}
}
}
function unchoseFolder(folderToUnchose: Misskey.entities.DriveFolder) {
selectedFolders.value = selectedFolders.value.filter(f => f.id !== folderToUnchose.id);
- emit('change-selection', selectedFolders.value);
}
function move(target?: Misskey.entities.DriveFolder | Misskey.entities.DriveFolder['id' | 'parentId']) {
@@ -487,7 +511,7 @@ function move(target?: Misskey.entities.DriveFolder | Misskey.entities.DriveFold
async function moveFilesBulk() {
if (selectedFiles.value.length === 0) return;
- const toFolder = await os.selectDriveFolder(false);
+ const toFolder = await os.selectDriveFolder(folder.value ? folder.value.id : null);
os.apiWithDialog('drive/files/move-bulk', {
fileIds: selectedFiles.value.map(f => f.id),
diff --git a/packages/frontend/src/components/MkDriveSelectDialog.stories.impl.ts b/packages/frontend/src/components/MkDriveFileSelectDialog.stories.impl.ts
similarity index 66%
rename from packages/frontend/src/components/MkDriveSelectDialog.stories.impl.ts
rename to packages/frontend/src/components/MkDriveFileSelectDialog.stories.impl.ts
index fe8f705165..a5073337cd 100644
--- a/packages/frontend/src/components/MkDriveSelectDialog.stories.impl.ts
+++ b/packages/frontend/src/components/MkDriveFileSelectDialog.stories.impl.ts
@@ -3,5 +3,5 @@
* SPDX-License-Identifier: AGPL-3.0-only
*/
-import MkDriveSelectDialog from './MkDriveSelectDialog.vue';
+import MkDriveSelectDialog from './MkDriveFileSelectDialog.vue';
void MkDriveSelectDialog;
diff --git a/packages/frontend/src/components/MkDriveSelectDialog.vue b/packages/frontend/src/components/MkDriveFileSelectDialog.vue
similarity index 54%
rename from packages/frontend/src/components/MkDriveSelectDialog.vue
rename to packages/frontend/src/components/MkDriveFileSelectDialog.vue
index 1b9455e3f3..9cccd4ab5e 100644
--- a/packages/frontend/src/components/MkDriveSelectDialog.vue
+++ b/packages/frontend/src/components/MkDriveFileSelectDialog.vue
@@ -9,43 +9,41 @@ SPDX-License-Identifier: AGPL-3.0-only
:width="800"
:height="500"
:withOkButton="true"
- :okButtonDisabled="(type === 'file') && (selected.length === 0)"
+ :okButtonDisabled="selected.length === 0"
@click="cancel()"
@close="cancel()"
@ok="ok()"
@closed="emit('closed')"
>
- {{ multiple ? ((type === 'file') ? i18n.ts.selectFiles : i18n.ts.selectFolders) : ((type === 'file') ? i18n.ts.selectFile : i18n.ts.selectFolder) }}
- ({{ number(selected.length) }})
+ {{ multiple ? i18n.ts.selectFiles : i18n.ts.selectFile }}
+ ({{ selected.length }})
-
+
diff --git a/packages/frontend/src/components/MkDriveFolderSelectDialog.vue b/packages/frontend/src/components/MkDriveFolderSelectDialog.vue
new file mode 100644
index 0000000000..adc85c49e1
--- /dev/null
+++ b/packages/frontend/src/components/MkDriveFolderSelectDialog.vue
@@ -0,0 +1,63 @@
+
+
+
+
+
+ {{ multiple ? i18n.ts.selectFolders : i18n.ts.selectFolder }}
+ ({{ selected.length }})
+
+
+
+
+
+
diff --git a/packages/frontend/src/os.ts b/packages/frontend/src/os.ts
index d891525782..9d26242c3c 100644
--- a/packages/frontend/src/os.ts
+++ b/packages/frontend/src/os.ts
@@ -594,8 +594,7 @@ export async function selectUser(opts: { includeSelf?: boolean; localOnly?: bool
export async function selectDriveFile(multiple: boolean): Promise {
return new Promise(resolve => {
- const { dispose } = popup(defineAsyncComponent(() => import('@/components/MkDriveSelectDialog.vue')), {
- type: 'file',
+ const { dispose } = popup(defineAsyncComponent(() => import('@/components/MkDriveFileSelectDialog.vue')), {
multiple,
}, {
done: files => {
@@ -608,11 +607,10 @@ export async function selectDriveFile(multiple: boolean): Promise {
+export async function selectDriveFolder(initialFolder: Misskey.entities.DriveFolder['id'] | null): Promise {
return new Promise(resolve => {
- const { dispose } = popup(defineAsyncComponent(() => import('@/components/MkDriveSelectDialog.vue')), {
- type: 'folder',
- multiple,
+ const { dispose } = popup(defineAsyncComponent(() => import('@/components/MkDriveFolderSelectDialog.vue')), {
+ initialFolder,
}, {
done: folders => {
if (folders) {
diff --git a/packages/frontend/src/pages/drive.file.info.vue b/packages/frontend/src/pages/drive.file.info.vue
index 21be0b18a9..fec260be72 100644
--- a/packages/frontend/src/pages/drive.file.info.vue
+++ b/packages/frontend/src/pages/drive.file.info.vue
@@ -139,7 +139,7 @@ function crop() {
function move() {
if (!file.value) return;
- os.selectDriveFolder(false).then(folder => {
+ os.selectDriveFolder().then(folder => {
misskeyApi('drive/files/update', {
fileId: file.value.id,
folderId: folder[0] ? folder[0].id : null,
diff --git a/packages/frontend/src/pages/settings/drive.vue b/packages/frontend/src/pages/settings/drive.vue
index 2130cbc868..c4619c354d 100644
--- a/packages/frontend/src/pages/settings/drive.vue
+++ b/packages/frontend/src/pages/settings/drive.vue
@@ -138,7 +138,7 @@ if (prefer.s.uploadFolder) {
}
function chooseUploadFolder() {
- os.selectDriveFolder(false).then(async folder => {
+ os.selectDriveFolder().then(async folder => {
prefer.commit('uploadFolder', folder[0] ? folder[0].id : null);
os.success();
if (prefer.s.uploadFolder) {
diff --git a/packages/frontend/src/utility/get-drive-file-menu.ts b/packages/frontend/src/utility/get-drive-file-menu.ts
index 3c6cbba002..a5595cb0cb 100644
--- a/packages/frontend/src/utility/get-drive-file-menu.ts
+++ b/packages/frontend/src/utility/get-drive-file-menu.ts
@@ -42,7 +42,7 @@ function describe(file: Misskey.entities.DriveFile) {
}
function move(file: Misskey.entities.DriveFile) {
- os.selectDriveFolder(false).then(folder => {
+ os.selectDriveFolder().then(folder => {
misskeyApi('drive/files/update', {
fileId: file.id,
folderId: folder[0] ? folder[0].id : null,
diff --git a/packages/frontend/src/widgets/WidgetSlideshow.vue b/packages/frontend/src/widgets/WidgetSlideshow.vue
index 2ccbb7a28f..a83e2754f6 100644
--- a/packages/frontend/src/widgets/WidgetSlideshow.vue
+++ b/packages/frontend/src/widgets/WidgetSlideshow.vue
@@ -93,7 +93,7 @@ const fetch = () => {
};
const choose = () => {
- os.selectDriveFolder(false).then(folder => {
+ os.selectDriveFolder().then(folder => {
if (folder[0] == null) {
return;
}