mirror of https://github.com/nocodb/nocodb
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.
136 lines
3.5 KiB
136 lines
3.5 KiB
5 months ago
|
<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>
|