enhance(client): improve file moderation ui
This commit is contained in:
		
							parent
							
								
									e29a310f7d
								
							
						
					
					
						commit
						8df2f19b5b
					
				|  | @ -845,6 +845,7 @@ failedToFetchAccountInformation: "アカウント情報の取得に失敗しま | |||
| rateLimitExceeded: "レート制限を超えました" | ||||
| cropImage: "画像のクロップ" | ||||
| cropImageAsk: "画像をクロップしますか?" | ||||
| file: "ファイル" | ||||
| 
 | ||||
| _emailUnavailable: | ||||
|   used: "既に使用されています" | ||||
|  |  | |||
|  | @ -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> | ||||
|  | @ -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() { | ||||
|  |  | |||
|  | @ -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, | ||||
| 	}; | ||||
| } | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue