summaryrefslogtreecommitdiff
path: root/packages
diff options
context:
space:
mode:
authorsyuilo <4439005+syuilo@users.noreply.github.com>2025-03-28 09:47:34 +0900
committersyuilo <4439005+syuilo@users.noreply.github.com>2025-03-28 09:47:34 +0900
commita25fa62d645e6b18d676b7c994f2f1218ebe4251 (patch)
treee8310a5f070f77d654698860cfb29c7ef36cc67a /packages
parentrefactor (diff)
downloadsharkey-a25fa62d645e6b18d676b7c994f2f1218ebe4251.tar.gz
sharkey-a25fa62d645e6b18d676b7c994f2f1218ebe4251.tar.bz2
sharkey-a25fa62d645e6b18d676b7c994f2f1218ebe4251.zip
enhance(frontend): ファイルアップロード処理のリファクタと設定の簡略化
Diffstat (limited to 'packages')
-rw-r--r--packages/frontend/src/components/MkDrive.vue93
-rw-r--r--packages/frontend/src/pages/admin/custom-emojis-manager.local.register.vue10
-rw-r--r--packages/frontend/src/pages/drive.vue2
-rw-r--r--packages/frontend/src/pages/settings/drive.vue10
-rw-r--r--packages/frontend/src/pref-migrate.ts1
-rw-r--r--packages/frontend/src/preferences/def.ts3
-rw-r--r--packages/frontend/src/utility/autogen/settings-search-index.ts9
-rw-r--r--packages/frontend/src/utility/select-file.ts12
-rw-r--r--packages/frontend/src/utility/upload.ts2
9 files changed, 52 insertions, 90 deletions
diff --git a/packages/frontend/src/components/MkDrive.vue b/packages/frontend/src/components/MkDrive.vue
index edbdf1cca1..c212167c8f 100644
--- a/packages/frontend/src/components/MkDrive.vue
+++ b/packages/frontend/src/components/MkDrive.vue
@@ -4,34 +4,37 @@ SPDX-License-Identifier: AGPL-3.0-only
-->
<template>
-<div :class="$style.root">
- <nav :class="$style.nav">
- <div :class="$style.navPath" @contextmenu.prevent.stop="() => {}">
- <XNavFolder
- :class="[$style.navPathItem, { [$style.navCurrent]: folder == null }]"
- :parentFolder="folder"
- @move="move"
- @upload="upload"
- @removeFile="removeFile"
- @removeFolder="removeFolder"
- />
- <template v-for="f in hierarchyFolders">
- <span :class="[$style.navPathItem, $style.navSeparator]"><i class="ti ti-chevron-right"></i></span>
+<MkStickyContainer>
+ <template #header>
+ <nav :class="$style.nav">
+ <div :class="$style.navPath" @contextmenu.prevent.stop="() => {}">
<XNavFolder
- :folder="f"
+ :class="[$style.navPathItem, { [$style.navCurrent]: folder == null }]"
:parentFolder="folder"
- :class="[$style.navPathItem]"
@move="move"
@upload="upload"
@removeFile="removeFile"
@removeFolder="removeFolder"
/>
- </template>
- <span v-if="folder != null" :class="[$style.navPathItem, $style.navSeparator]"><i class="ti ti-chevron-right"></i></span>
- <span v-if="folder != null" :class="[$style.navPathItem, $style.navCurrent]">{{ folder.name }}</span>
- </div>
- <button class="_button" :class="$style.navMenu" @click="showMenu"><i class="ti ti-dots"></i></button>
- </nav>
+ <template v-for="f in hierarchyFolders">
+ <span :class="[$style.navPathItem, $style.navSeparator]"><i class="ti ti-chevron-right"></i></span>
+ <XNavFolder
+ :folder="f"
+ :parentFolder="folder"
+ :class="[$style.navPathItem]"
+ @move="move"
+ @upload="upload"
+ @removeFile="removeFile"
+ @removeFolder="removeFolder"
+ />
+ </template>
+ <span v-if="folder != null" :class="[$style.navPathItem, $style.navSeparator]"><i class="ti ti-chevron-right"></i></span>
+ <span v-if="folder != null" :class="[$style.navPathItem, $style.navCurrent]">{{ folder.name }}</span>
+ </div>
+ <button class="_button" :class="$style.navMenu" @click="showMenu"><i class="ti ti-dots"></i></button>
+ </nav>
+ </template>
+
<div
ref="main"
:class="[$style.main, { [$style.uploading]: uploadings.length > 0, [$style.fetching]: fetching }]"
@@ -91,8 +94,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<MkLoading v-if="fetching"/>
</div>
<div v-if="draghover" :class="$style.dropzone"></div>
- <input ref="fileInput" style="display: none;" type="file" accept="*/*" multiple tabindex="-1" @change="onChangeFileInput"/>
-</div>
+</MkStickyContainer>
</template>
<script lang="ts" setup>
@@ -110,6 +112,7 @@ import { i18n } from '@/i18n.js';
import { uploadFile, uploads } from '@/utility/upload.js';
import { claimAchievement } from '@/utility/achievements.js';
import { prefer } from '@/preferences.js';
+import { chooseFileFromPc } from '@/utility/select-file.js';
const props = withDefaults(defineProps<{
initialFolder?: Misskey.entities.DriveFolder;
@@ -130,7 +133,6 @@ const emit = defineEmits<{
}>();
const loadMoreFiles = useTemplateRef('loadMoreFiles');
-const fileInput = useTemplateRef('fileInput');
const folder = ref<Misskey.entities.DriveFolder | null>(null);
const files = ref<Misskey.entities.DriveFile[]>([]);
@@ -142,7 +144,6 @@ const selectedFiles = ref<Misskey.entities.DriveFile[]>([]);
const selectedFolders = ref<Misskey.entities.DriveFolder[]>([]);
const uploadings = uploads;
const connection = useStream().useChannel('drive');
-const keepOriginal = ref<boolean>(prefer.s.keepOriginalUploading); // 外部渡しが多いので$refは使わないほうがよい
// ドロップされようとしているか
const draghover = ref(false);
@@ -304,10 +305,6 @@ function onDrop(ev: DragEvent) {
//#endregion
}
-function selectLocalFile() {
- fileInput.value?.click();
-}
-
function urlUpload() {
os.inputText({
title: i18n.ts.uploadFromUrl,
@@ -383,15 +380,8 @@ function deleteFolder(folderToDelete: Misskey.entities.DriveFolder) {
});
}
-function onChangeFileInput() {
- if (!fileInput.value?.files) return;
- for (const file of Array.from(fileInput.value.files)) {
- upload(file, folder.value);
- }
-}
-
-function upload(file: File, folderToUpload?: Misskey.entities.DriveFolder | null) {
- uploadFile(file, (folderToUpload && typeof folderToUpload === 'object') ? folderToUpload.id : null, undefined, keepOriginal.value).then(res => {
+function upload(file: File, folderToUpload?: Misskey.entities.DriveFolder | null, keepOriginal?: boolean) {
+ uploadFile(file, (folderToUpload && typeof folderToUpload === 'object') ? folderToUpload.id : null, undefined, keepOriginal).then(res => {
addFile(res, true);
});
}
@@ -630,16 +620,20 @@ function getMenu() {
const menu: MenuItem[] = [];
menu.push({
- type: 'switch',
- text: i18n.ts.keepOriginalUploading,
- ref: keepOriginal,
- }, { type: 'divider' }, {
text: i18n.ts.addFile,
type: 'label',
}, {
+ text: i18n.ts.upload + ' (' + i18n.ts.compress + ')',
+ icon: 'ti ti-upload',
+ action: () => {
+ chooseFileFromPc(true, { keepOriginal: false });
+ },
+ }, {
text: i18n.ts.upload,
icon: 'ti ti-upload',
- action: () => { selectLocalFile(); },
+ action: () => {
+ chooseFileFromPc(true, { keepOriginal: true });
+ },
}, {
text: i18n.ts.fromUrl,
icon: 'ti ti-link',
@@ -751,22 +745,17 @@ onBeforeUnmount(() => {
</script>
<style lang="scss" module>
-.root {
- display: flex;
- flex-direction: column;
- height: 100%;
-}
-
.nav {
display: flex;
- z-index: 2;
width: 100%;
padding: 0 8px;
box-sizing: border-box;
overflow: auto;
font-size: 0.9em;
- box-shadow: 0 1px 0 var(--MI_THEME-divider);
- user-select: none;
+ background: color(from var(--MI_THEME-bg) srgb r g b / 0.75);
+ -webkit-backdrop-filter: var(--MI-blur, blur(15px));
+ backdrop-filter: var(--MI-blur, blur(15px));
+ border-bottom: solid 0.5px var(--MI_THEME-divider);
}
.navPath {
diff --git a/packages/frontend/src/pages/admin/custom-emojis-manager.local.register.vue b/packages/frontend/src/pages/admin/custom-emojis-manager.local.register.vue
index 666e3c95ac..eff7efd0fa 100644
--- a/packages/frontend/src/pages/admin/custom-emojis-manager.local.register.vue
+++ b/packages/frontend/src/pages/admin/custom-emojis-manager.local.register.vue
@@ -18,11 +18,6 @@ SPDX-License-Identifier: AGPL-3.0-only
</option>
</MkSelect>
- <MkSwitch v-model="keepOriginalUploading">
- <template #label>{{ i18n.ts.keepOriginalUploading }}</template>
- <template #caption>{{ i18n.ts.keepOriginalUploadingDescription }}</template>
- </MkSwitch>
-
<MkSwitch v-model="directoryToCategory">
<template #label>{{ i18n.ts._customEmojisManager._local._register.directoryToCategoryLabel }}</template>
<template #caption>{{ i18n.ts._customEmojisManager._local._register.directoryToCategoryCaption }}</template>
@@ -245,7 +240,6 @@ function setupGrid(): GridSetting {
const uploadFolders = ref<FolderItem[]>([]);
const gridItems = ref<GridItem[]>([]);
const selectedFolderId = ref(prefer.s.uploadFolder);
-const keepOriginalUploading = ref(prefer.s.keepOriginalUploading);
const directoryToCategory = ref<boolean>(false);
const registerButtonDisabled = ref<boolean>(false);
const requestLogs = ref<RequestLogItem[]>([]);
@@ -338,7 +332,7 @@ async function onDrop(ev: DragEvent) {
it.file,
selectedFolderId.value,
it.file.name.replace(/\.[^.]+$/, ''),
- keepOriginalUploading.value,
+ true,
),
}),
),
@@ -373,7 +367,7 @@ async function onFileSelectClicked() {
true,
{
uploadFolder: selectedFolderId.value,
- keepOriginal: keepOriginalUploading.value,
+ keepOriginal: true,
// 拡張子は消す
nameConverter: (file) => file.name.replace(/\.[a-zA-Z0-9]+$/, ''),
},
diff --git a/packages/frontend/src/pages/drive.vue b/packages/frontend/src/pages/drive.vue
index c5813a4523..bee54f3fd2 100644
--- a/packages/frontend/src/pages/drive.vue
+++ b/packages/frontend/src/pages/drive.vue
@@ -5,7 +5,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<template>
<div>
- <XDrive ref="drive" @cd="x => folder = x"/>
+ <XDrive @cd="x => folder = x"/>
</div>
</template>
diff --git a/packages/frontend/src/pages/settings/drive.vue b/packages/frontend/src/pages/settings/drive.vue
index 8ff37d0404..2130cbc868 100644
--- a/packages/frontend/src/pages/settings/drive.vue
+++ b/packages/frontend/src/pages/settings/drive.vue
@@ -53,15 +53,6 @@ SPDX-License-Identifier: AGPL-3.0-only
{{ i18n.ts.drivecleaner }}
</FormLink>
- <SearchMarker :keywords="['keep', 'original', 'raw', 'upload']">
- <MkPreferenceContainer k="keepOriginalUploading">
- <MkSwitch v-model="keepOriginalUploading">
- <template #label><SearchLabel>{{ i18n.ts.keepOriginalUploading }}</SearchLabel></template>
- <template #caption><SearchKeyword>{{ i18n.ts.keepOriginalUploadingDescription }}</SearchKeyword></template>
- </MkSwitch>
- </MkPreferenceContainer>
- </SearchMarker>
-
<SearchMarker :keywords="['keep', 'original', 'filename']">
<MkPreferenceContainer k="keepOriginalFilename">
<MkSwitch v-model="keepOriginalFilename">
@@ -130,7 +121,6 @@ const meterStyle = computed(() => {
};
});
-const keepOriginalUploading = prefer.model('keepOriginalUploading');
const keepOriginalFilename = prefer.model('keepOriginalFilename');
misskeyApi('drive').then(info => {
diff --git a/packages/frontend/src/pref-migrate.ts b/packages/frontend/src/pref-migrate.ts
index beeaac8383..5d48508def 100644
--- a/packages/frontend/src/pref-migrate.ts
+++ b/packages/frontend/src/pref-migrate.ts
@@ -66,7 +66,6 @@ export function migrateOldSettings() {
prefer.commit('collapseRenotes', store.s.collapseRenotes);
prefer.commit('rememberNoteVisibility', store.s.rememberNoteVisibility);
prefer.commit('uploadFolder', store.s.uploadFolder);
- prefer.commit('keepOriginalUploading', store.s.keepOriginalUploading);
prefer.commit('menu', store.s.menu);
prefer.commit('statusbars', store.s.statusbars);
prefer.commit('pinnedUserLists', store.s.pinnedUserLists);
diff --git a/packages/frontend/src/preferences/def.ts b/packages/frontend/src/preferences/def.ts
index b588cc3b5f..9fa4e6af35 100644
--- a/packages/frontend/src/preferences/def.ts
+++ b/packages/frontend/src/preferences/def.ts
@@ -118,9 +118,6 @@ export const PREF_DEF = {
keepCw: {
default: true,
},
- keepOriginalUploading: {
- default: false,
- },
rememberNoteVisibility: {
default: false,
},
diff --git a/packages/frontend/src/utility/autogen/settings-search-index.ts b/packages/frontend/src/utility/autogen/settings-search-index.ts
index c939c93425..8ec9ef99c9 100644
--- a/packages/frontend/src/utility/autogen/settings-search-index.ts
+++ b/packages/frontend/src/utility/autogen/settings-search-index.ts
@@ -759,21 +759,16 @@ export const searchIndexes: SearchIndexItem[] = [
},
{
id: 'goQdtf3dD',
- label: i18n.ts.keepOriginalUploading,
- keywords: ['keep', 'original', 'raw', 'upload', i18n.ts.keepOriginalUploadingDescription],
- },
- {
- id: '83xRo0XJl',
label: i18n.ts.keepOriginalFilename,
keywords: ['keep', 'original', 'filename', i18n.ts.keepOriginalFilenameDescription],
},
{
- id: 'wf77yRQQq',
+ id: '83xRo0XJl',
label: i18n.ts.alwaysMarkSensitive,
keywords: ['always', 'default', 'mark', 'nsfw', 'sensitive', 'media', 'file'],
},
{
- id: '3pxwNB8e4',
+ id: 'BrBqZL35E',
label: i18n.ts.enableAutoSensitive,
keywords: ['auto', 'nsfw', 'sensitive', 'media', 'file', i18n.ts.enableAutoSensitiveDescription],
},
diff --git a/packages/frontend/src/utility/select-file.ts b/packages/frontend/src/utility/select-file.ts
index b9b3687483..731ef58302 100644
--- a/packages/frontend/src/utility/select-file.ts
+++ b/packages/frontend/src/utility/select-file.ts
@@ -21,7 +21,7 @@ export function chooseFileFromPc(
},
): Promise<Misskey.entities.DriveFile[]> {
const uploadFolder = options?.uploadFolder ?? prefer.s.uploadFolder;
- const keepOriginal = options?.keepOriginal ?? prefer.s.keepOriginalUploading;
+ const keepOriginal = options?.keepOriginal ?? false;
const nameConverter = options?.nameConverter ?? (() => undefined);
return new Promise((res, rej) => {
@@ -96,19 +96,17 @@ export function chooseFileFromUrl(): Promise<Misskey.entities.DriveFile> {
function select(src: HTMLElement | EventTarget | null, label: string | null, multiple: boolean): Promise<Misskey.entities.DriveFile[]> {
return new Promise((res, rej) => {
- const keepOriginal = ref(prefer.s.keepOriginalUploading);
-
os.popupMenu([label ? {
text: label,
type: 'label',
} : undefined, {
- type: 'switch',
- text: i18n.ts.keepOriginalUploading,
- ref: keepOriginal,
+ text: i18n.ts.upload + ' (' + i18n.ts.compress + ')',
+ icon: 'ti ti-upload',
+ action: () => chooseFileFromPc(multiple, { keepOriginal: false }).then(files => res(files)),
}, {
text: i18n.ts.upload,
icon: 'ti ti-upload',
- action: () => chooseFileFromPc(multiple, { keepOriginal: keepOriginal.value }).then(files => res(files)),
+ action: () => chooseFileFromPc(multiple, { keepOriginal: true }).then(files => res(files)),
}, {
text: i18n.ts.fromDrive,
icon: 'ti ti-cloud',
diff --git a/packages/frontend/src/utility/upload.ts b/packages/frontend/src/utility/upload.ts
index e13d793ffb..b43fea8e15 100644
--- a/packages/frontend/src/utility/upload.ts
+++ b/packages/frontend/src/utility/upload.ts
@@ -34,7 +34,7 @@ export function uploadFile(
file: File,
folder?: string | Misskey.entities.DriveFolder | null,
name?: string,
- keepOriginal: boolean = prefer.s.keepOriginalUploading,
+ keepOriginal = false,
): Promise<Misskey.entities.DriveFile> {
if ($i == null) throw new Error('Not logged in');