diff options
Diffstat (limited to 'packages/client/src/components/MkPostFormAttaches.vue')
| -rw-r--r-- | packages/client/src/components/MkPostFormAttaches.vue | 168 |
1 files changed, 0 insertions, 168 deletions
diff --git a/packages/client/src/components/MkPostFormAttaches.vue b/packages/client/src/components/MkPostFormAttaches.vue deleted file mode 100644 index 766cc9a06c..0000000000 --- a/packages/client/src/components/MkPostFormAttaches.vue +++ /dev/null @@ -1,168 +0,0 @@ -<template> -<div v-show="props.modelValue.length != 0" class="skeikyzd"> - <Sortable :model-value="props.modelValue" class="files" item-key="id" :animation="150" :delay="100" :delay-on-touch-only="true" @update:model-value="v => emit('update:modelValue', v)"> - <template #item="{element}"> - <div class="file" @click="showFileMenu(element, $event)" @contextmenu.prevent="showFileMenu(element, $event)"> - <MkDriveFileThumbnail :data-id="element.id" class="thumbnail" :file="element" fit="cover"/> - <div v-if="element.isSensitive" class="sensitive"> - <i class="ti ti-alert-triangle icon"></i> - </div> - </div> - </template> - </Sortable> - <p class="remain">{{ 16 - props.modelValue.length }}/16</p> -</div> -</template> - -<script lang="ts" setup> -import { defineAsyncComponent, watch } from 'vue'; -import MkDriveFileThumbnail from '@/components/MkDriveFileThumbnail.vue'; -import * as os from '@/os'; -import { deepClone } from '@/scripts/clone'; -import { i18n } from '@/i18n'; - -const Sortable = defineAsyncComponent(() => import('vuedraggable').then(x => x.default)); - -const props = defineProps<{ - modelValue: any[]; - detachMediaFn: () => void; -}>(); - -const emit = defineEmits<{ - (ev: 'update:modelValue', value: any[]): void; - (ev: 'detach'): void; - (ev: 'changeSensitive'): void; - (ev: 'changeName'): void; -}>(); - -let menuShowing = false; - -function detachMedia(id) { - if (props.detachMediaFn) { - props.detachMediaFn(id); - } else { - emit('detach', id); - } -} - -function toggleSensitive(file) { - os.api('drive/files/update', { - fileId: file.id, - isSensitive: !file.isSensitive, - }).then(() => { - emit('changeSensitive', file, !file.isSensitive); - }); -} -async function rename(file) { - const { canceled, result } = await os.inputText({ - title: i18n.ts.enterFileName, - default: file.name, - allowEmpty: false, - }); - if (canceled) return; - os.api('drive/files/update', { - fileId: file.id, - name: result, - }).then(() => { - emit('changeName', file, result); - file.name = result; - }); -} - -async function describe(file) { - os.popup(defineAsyncComponent(() => import('@/components/MkFileCaptionEditWindow.vue')), { - default: file.comment !== null ? file.comment : '', - file: file, - }, { - done: caption => { - let comment = caption.length === 0 ? null : caption; - os.api('drive/files/update', { - fileId: file.id, - comment: comment, - }).then(() => { - file.comment = comment; - }); - }, - }, 'closed'); -} - -function showFileMenu(file, ev: MouseEvent) { - if (menuShowing) return; - os.popupMenu([{ - text: i18n.ts.renameFile, - icon: 'ti ti-forms', - action: () => { rename(file); }, - }, { - text: file.isSensitive ? i18n.ts.unmarkAsSensitive : i18n.ts.markAsSensitive, - icon: file.isSensitive ? 'ti ti-eye-off' : 'ti ti-eye', - action: () => { toggleSensitive(file); }, - }, { - text: i18n.ts.describeFile, - icon: 'ti ti-text-caption', - action: () => { describe(file); }, - }, { - text: i18n.ts.attachCancel, - icon: 'ti ti-circle-x', - action: () => { detachMedia(file.id); }, - }], ev.currentTarget ?? ev.target).then(() => menuShowing = false); - menuShowing = true; -} -</script> - -<style lang="scss" scoped> -.skeikyzd { - padding: 8px 16px; - position: relative; - - > .files { - display: flex; - flex-wrap: wrap; - - > .file { - position: relative; - width: 64px; - height: 64px; - margin-right: 4px; - border-radius: 4px; - overflow: hidden; - cursor: move; - - &:hover > .remove { - display: block; - } - - > .thumbnail { - width: 100%; - height: 100%; - z-index: 1; - color: var(--fg); - } - - > .sensitive { - display: flex; - position: absolute; - width: 64px; - height: 64px; - top: 0; - left: 0; - z-index: 2; - background: rgba(17, 17, 17, .7); - color: #fff; - - > .icon { - margin: auto; - } - } - } - } - - > .remain { - display: block; - position: absolute; - top: 8px; - right: 8px; - margin: 0; - padding: 0; - } -} -</style> |