多维表格
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

135 lines
3.5 KiB

<script setup lang="ts">
import { useAttachmentCell } from './utils'
const props = defineProps<{
value: boolean
}>()
const dialogShow = useVModel(props, 'value')
const { onDrop: saveAttachment, isPublic, stopCamera } = useAttachmentCell()!
const activeMenu = ref('local')
const selectMenu = (option: string) => {
activeMenu.value = option
}
const closeModal = (value: boolean) => {
dialogShow.value = value
}
const saveAttachments = async (files: File[]) => {
await saveAttachment(files, {} as any)
dialogShow.value = false
}
watch(activeMenu, (newVal, oldValue) => {
// Stop camera when switching to another menu
if (oldValue === 'webcam' && newVal !== 'webcam') {
// When the menu is switched when the startCamera function is called, the videoStream might not have initialized yet
// So, we need to wait for a while before stopping the camera
setTimeout(() => {
stopCamera()
}, 1000)
}
})
</script>
<template>
<NcModal
v-model:visible="dialogShow"
:show-separator="false"
size="medium"
width="50rem"
wrap-class-name="nc-modal-attachment-create"
class="!rounded-md"
@keydown.esc="dialogShow = false"
>
<div class="flex h-full flex-row">
<div style="border-top-left-radius: 1rem; border-bottom-left-radius: 1rem" class="px-2 !-full flex-grow bg-gray-100">
<NcMenu class="!h-full !bg-gray-100">
<NcMenuItem
key="local"
:class="{
'active-menu': activeMenu === 'local',
}"
@click="selectMenu('local')"
>
<div class="flex gap-2 items-center">
<GeneralIcon icon="file" />
{{ $t('title.localFiles') }}
</div>
</NcMenuItem>
<NcMenuItem
v-if="!isPublic"
key="url"
:class="{
'active-menu': activeMenu === 'url',
}"
@click="selectMenu('url')"
>
<div class="flex gap-2 items-center">
<GeneralIcon icon="link2" />
{{ $t('title.uploadViaUrl') }}
</div>
</NcMenuItem>
<NcMenuItem
key="webcam"
:class="{
'active-menu': activeMenu === 'webcam',
}"
@click="selectMenu('webcam')"
>
<div class="flex gap-2 items-center">
<GeneralIcon icon="camera" />
{{ $t('title.webcam') }}
</div>
</NcMenuItem>
</NcMenu>
</div>
<div style="height: 425px" class="w-full p-2">
<LazyCellAttachmentUploadProvidersLocal
v-show="activeMenu === 'local'"
@update:visible="closeModal"
@upload="(e) => saveAttachments(e)"
/>
<LazyCellAttachmentUploadProvidersCamera
v-if="activeMenu === 'webcam'"
@update:visible="closeModal"
@upload="(e) => saveAttachments(e)"
/>
<LazyCellAttachmentUploadProvidersUrl
v-if="activeMenu === 'url'"
@update:visible="closeModal"
@upload="(e) => saveAttachments(e)"
/>
</div>
</div>
</NcModal>
</template>
<style lang="scss">
.nc-modal-attachment-create {
.active-menu {
@apply !bg-gray-200 font-sembold text-brand-500 rounded-md;
}
}
.nc-modal-attachment-create {
.nc-modal {
@apply !p-0;
}
}
</style>
<style scoped lang="scss">
:deep(.ant-menu-inline),
:deep(.ant-menu-vertical),
:deep(.ant-menu-vertical-left) {
border-right: none !important;
}
</style>