summaryrefslogtreecommitdiff
path: root/packages/frontend/src/components/MkFileListForAdmin.vue
diff options
context:
space:
mode:
Diffstat (limited to 'packages/frontend/src/components/MkFileListForAdmin.vue')
-rw-r--r--packages/frontend/src/components/MkFileListForAdmin.vue117
1 files changed, 117 insertions, 0 deletions
diff --git a/packages/frontend/src/components/MkFileListForAdmin.vue b/packages/frontend/src/components/MkFileListForAdmin.vue
new file mode 100644
index 0000000000..4910506a95
--- /dev/null
+++ b/packages/frontend/src/components/MkFileListForAdmin.vue
@@ -0,0 +1,117 @@
+<template>
+<div>
+ <MkPagination v-slot="{items}" :pagination="pagination" class="urempief" :class="{ grid: viewMode === 'grid' }">
+ <MkA
+ v-for="file in items"
+ :key="file.id"
+ v-tooltip.mfm="`${file.type}\n${bytes(file.size)}\n${new Date(file.createdAt).toLocaleString()}\nby ${file.user ? '@' + Acct.toString(file.user) : 'system'}`"
+ :to="`/admin/file/${file.id}`"
+ class="file _button"
+ >
+ <div v-if="file.isSensitive" class="sensitive-label">{{ i18n.ts.sensitive }}</div>
+ <MkDriveFileThumbnail class="thumbnail" :file="file" fit="contain"/>
+ <div v-if="viewMode === 'list'" class="body">
+ <div>
+ <small style="opacity: 0.7;">{{ file.name }}</small>
+ </div>
+ <div>
+ <MkAcct v-if="file.user" :user="file.user"/>
+ <div v-else>{{ i18n.ts.system }}</div>
+ </div>
+ <div>
+ <span style="margin-right: 1em;">{{ file.type }}</span>
+ <span>{{ bytes(file.size) }}</span>
+ </div>
+ <div>
+ <span>{{ i18n.ts.registeredDate }}: <MkTime :time="file.createdAt" mode="detail"/></span>
+ </div>
+ </div>
+ </MkA>
+ </MkPagination>
+</div>
+</template>
+
+<script lang="ts" setup>
+import { computed } from 'vue';
+import * as Acct from 'misskey-js/built/acct';
+import MkPagination from '@/components/MkPagination.vue';
+import MkDriveFileThumbnail from '@/components/MkDriveFileThumbnail.vue';
+import bytes from '@/filters/bytes';
+import * as os from '@/os';
+import { i18n } from '@/i18n';
+
+const props = defineProps<{
+ pagination: any;
+ viewMode: 'grid' | 'list';
+}>();
+</script>
+
+<style lang="scss" scoped>
+@keyframes sensitive-blink {
+ 0% { opacity: 1; }
+ 50% { opacity: 0; }
+}
+
+.urempief {
+ margin-top: var(--margin);
+
+ &.list {
+ > .file {
+ display: flex;
+ width: 100%;
+ box-sizing: border-box;
+ text-align: left;
+ align-items: center;
+
+ &:hover {
+ color: var(--accent);
+ }
+
+ > .thumbnail {
+ width: 128px;
+ height: 128px;
+ }
+
+ > .body {
+ margin-left: 0.3em;
+ padding: 8px;
+ flex: 1;
+
+ @media (max-width: 500px) {
+ font-size: 14px;
+ }
+ }
+ }
+ }
+
+ &.grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(130px, 1fr));
+ grid-gap: 12px;
+ margin: var(--margin) 0;
+
+ > .file {
+ position: relative;
+ aspect-ratio: 1;
+
+ > .thumbnail {
+ width: 100%;
+ height: 100%;
+ }
+
+ > .sensitive-label {
+ position: absolute;
+ z-index: 10;
+ top: 8px;
+ left: 8px;
+ padding: 2px 4px;
+ background: #ff0000bf;
+ color: #fff;
+ border-radius: 4px;
+ font-size: 85%;
+ animation: sensitive-blink 1s infinite;
+ }
+ }
+ }
+}
+</style>