From 8df2f19b5b371d73809d12b2ffbcba3ec3cffb2d Mon Sep 17 00:00:00 2001 From: syuilo <Syuilotan@yahoo.co.jp> Date: Fri, 17 Jun 2022 15:03:02 +0900 Subject: [PATCH] enhance(client): improve file moderation ui --- locales/ja-JP.yml | 1 + .../{admin/file-dialog.vue => admin-file.vue} | 45 ++++++++++--------- packages/client/src/pages/admin/files.vue | 4 +- packages/client/src/router.ts | 9 ++-- 4 files changed, 30 insertions(+), 29 deletions(-) rename packages/client/src/pages/{admin/file-dialog.vue => admin-file.vue} (68%) diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index 43ab7f2d69..c17e6959b9 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -845,6 +845,7 @@ failedToFetchAccountInformation: "ã‚¢ã‚«ã‚¦ãƒ³ãƒˆæƒ…å ±ã®å–å¾—ã«å¤±æ•—ã—ã¾ rateLimitExceeded: "レート制é™ã‚’超ãˆã¾ã—ãŸ" cropImage: "ç”»åƒã®ã‚¯ãƒãƒƒãƒ—" cropImageAsk: "ç”»åƒã‚’クãƒãƒƒãƒ—ã—ã¾ã™ã‹ï¼Ÿ" +file: "ファイル" _emailUnavailable: used: "æ—¢ã«ä½¿ç”¨ã•ã‚Œã¦ã„ã¾ã™" diff --git a/packages/client/src/pages/admin/file-dialog.vue b/packages/client/src/pages/admin-file.vue similarity index 68% rename from packages/client/src/pages/admin/file-dialog.vue rename to packages/client/src/pages/admin-file.vue index 0765548aab..b0e879b8f3 100644 --- a/packages/client/src/pages/admin/file-dialog.vue +++ b/packages/client/src/pages/admin-file.vue @@ -1,12 +1,7 @@ <template> -<XModalWindow ref="dialog" - :width="370" - @close="$refs.dialog.close()" - @closed="$emit('closed')" -> - <template v-if="file" #header>{{ file.name }}</template> - <div v-if="file" class="cxqhhsmd"> - <div class="_section"> +<MkSpacer :content-max="500" :margin-min="16" :margin-max="32"> + <div v-if="file" class="cxqhhsmd _formRoot"> + <div class="_formBlock"> <MkDriveFileThumbnail class="thumbnail" :file="file" fit="contain"/> <div class="info"> <span style="margin-right: 1em;">{{ file.type }}</span> @@ -14,35 +9,33 @@ <MkTime :time="file.createdAt" mode="detail" style="display: block;"/> </div> </div> - <div class="_section"> - <div class="_content"> - <MkSwitch v-model="isSensitive" @update:modelValue="toggleIsSensitive">NSFW</MkSwitch> - </div> + <div class="_formBlock"> + <MkSwitch v-model="isSensitive" @update:modelValue="toggleIsSensitive">NSFW</MkSwitch> </div> - <div class="_section"> - <div class="_content"> - <MkButton full @click="showUser"><i class="fas fa-external-link-square-alt"></i> {{ $ts.user }}</MkButton> - <MkButton full danger @click="del"><i class="fas fa-trash-alt"></i> {{ $ts.delete }}</MkButton> - </div> + <div class="_formBlock"> + <MkButton full @click="showUser"><i class="fas fa-external-link-square-alt"></i> {{ $ts.user }}</MkButton> </div> - <div v-if="info" class="_section"> + <div class="_formBlock"> + <MkButton full danger @click="del"><i class="fas fa-trash-alt"></i> {{ $ts.delete }}</MkButton> + </div> + <div v-if="info" class="_formBlock"> <details class="_content rawdata"> <pre><code>{{ JSON.stringify(info, null, 2) }}</code></pre> </details> </div> </div> -</XModalWindow> +</MkSpacer> </template> <script lang="ts" setup> -import { } from 'vue'; +import { computed } from 'vue'; import MkButton from '@/components/ui/button.vue'; import MkSwitch from '@/components/form/switch.vue'; -import XModalWindow from '@/components/ui/modal-window.vue'; import MkDriveFileThumbnail from '@/components/drive-file-thumbnail.vue'; import bytes from '@/filters/bytes'; import * as os from '@/os'; import { i18n } from '@/i18n'; +import * as symbols from '@/symbols'; let file: any = $ref(null); let info: any = $ref(null); @@ -72,7 +65,7 @@ async function del() { if (canceled) return; os.apiWithDialog('drive/files/delete', { - fileId: file.id + fileId: file.id, }); } @@ -80,6 +73,14 @@ async function toggleIsSensitive(v) { await os.api('drive/files/update', { fileId: props.fileId, isSensitive: v }); isSensitive = v; } + +defineExpose({ + [symbols.PAGE_INFO]: computed(() => ({ + title: file ? i18n.ts.file + ': ' + file.name : i18n.ts.file, + icon: 'fas fa-file', + bg: 'var(--bg)', + })), +}); </script> <style lang="scss" scoped> diff --git a/packages/client/src/pages/admin/files.vue b/packages/client/src/pages/admin/files.vue index 6f43c2b7bd..9350911b60 100644 --- a/packages/client/src/pages/admin/files.vue +++ b/packages/client/src/pages/admin/files.vue @@ -82,9 +82,7 @@ function clear() { } function show(file) { - os.popup(defineAsyncComponent(() => import('./file-dialog.vue')), { - fileId: file.id, - }, {}, 'closed'); + os.pageWindow(`/admin-file/${file.id}`); } async function find() { diff --git a/packages/client/src/router.ts b/packages/client/src/router.ts index 96c793166c..7e16c35d2b 100644 --- a/packages/client/src/router.ts +++ b/packages/client/src/router.ts @@ -1,9 +1,9 @@ import { AsyncComponentLoader, defineAsyncComponent, markRaw } from 'vue'; import { createRouter, createWebHistory } from 'vue-router'; +import { $i, iAmModerator } from './account'; import MkLoading from '@/pages/_loading_.vue'; import MkError from '@/pages/_error_.vue'; import MkTimeline from '@/pages/timeline.vue'; -import { $i, iAmModerator } from './account'; import { ui } from '@/config'; // pathã«/ãŒå…¥ã‚‹ã¨rollupãŒè§£æ±ºã—ã¦ãã‚Œãªã„ã®ã§ã€() => import('*.vue')を指定ã™ã‚‹ã“㨠@@ -70,6 +70,7 @@ const defaultRoutes = [ { path: '/scratchpad', component: page('scratchpad') }, { path: '/admin/:page(.*)?', component: iAmModerator ? page(() => import('./pages/admin/index.vue')) : page('not-found'), props: route => ({ initialPage: route.params.page || null }) }, { path: '/admin', component: iAmModerator ? page(() => import('./pages/admin/index.vue')) : page('not-found') }, + { path: '/admin-file/:fileId', component: page('admin-file'), props: route => ({ fileId: route.params.fileId }) }, { path: '/notes/:note', name: 'note', component: page('note'), props: route => ({ noteId: route.params.note }) }, { path: '/tags/:tag', component: page('tag'), props: route => ({ tag: route.params.tag }) }, { path: '/user-info/:user', component: page('user-info'), props: route => ({ userId: route.params.user }) }, @@ -82,7 +83,7 @@ const defaultRoutes = [ { path: '/miauth/:session', component: page('miauth') }, { path: '/authorize-follow', component: page('follow') }, { path: '/share', component: page('share') }, - { path: '/:catchAll(.*)', component: page('not-found') } + { path: '/:catchAll(.*)', component: page('not-found') }, ]; const chatRoutes = [ @@ -126,7 +127,7 @@ export const router = createRouter({ window.scroll({ top: 0, behavior: 'instant' }); } }; - } + }, }); router.afterEach((to, from) => { @@ -141,6 +142,6 @@ export function resolve(path: string) { return { component: markRaw(route.components.default), // TODO: route.propsã«ã¯é–¢æ•°ä»¥å¤–も入るå¯èƒ½æ€§ãŒã‚ã‚‹ã®ã§ã‚ˆã—ãªã«ãƒãƒ³ãƒ‰ãƒªãƒ³ã‚°ã™ã‚‹ - props: route.props?.default ? route.props.default(resolved) : resolved.params + props: route.props.default ? route.props.default(resolved) : resolved.params, }; } -- GitLab