add dynamic documents

This commit is contained in:
Pete Matsyburka
2026-02-12 09:22:08 +02:00
parent b50d982497
commit 37196ff89f
65 changed files with 4372 additions and 485 deletions
+52 -14
View File
@@ -1,19 +1,42 @@
<template>
<div :class="withStickySubmitters ? 'sticky top-0 z-[1]' : ''">
<div
:class="withStickySubmitters ? 'sticky top-0 z-[1]' : ''"
:style="withStickySubmitters ? { backgroundColor } : {}"
class="flex items-center gap-1"
>
<FieldSubmitter
:model-value="selectedSubmitter.uuid"
class="roles-dropdown w-full rounded-lg roles-dropdown"
:style="withStickySubmitters ? { backgroundColor } : {}"
:submitters="submitters"
:menu-style="{ overflow: 'auto', display: 'flex', flexDirection: 'row', maxHeight: 'calc(100vh - 120px)', backgroundColor: ['', null, 'transparent'].includes(backgroundColor) ? 'white' : backgroundColor }"
:editable="editable && !defaultSubmitters.length"
@new-submitter="save"
@remove="removeSubmitter"
@name-change="save"
@update:model-value="$emit('change-submitter', submitters.find((s) => s.uuid === $event))"
@update:model-value="[$emit('change-submitter', submitters.find((s) => s.uuid === $event)), isShowVariables = false]"
/>
<button
v-if="hasDynamicDocuments"
class="flex-shrink-0 rounded-md border hover:border-content flex items-center justify-center self-stretch"
:class="isShowVariables ? 'border-base-content bg-base-content text-base-100' : 'border-base-300'"
style="width: 44px"
:title="t('variables')"
@click.prevent="toggleVariables"
>
<IconBracketsContain
:width="22"
:height="22"
:stroke-width="1.6"
/>
</button>
</div>
<DynamicVariables
v-if="isShowVariables"
:editable="editable"
class="mt-1"
/>
<div
v-if="!isShowVariables"
ref="fields"
class="fields mt-2"
:class="{ 'mb-1': !withCustomFields || !customFields.length }"
@@ -42,7 +65,7 @@
@set-draw="$emit('set-draw', $event)"
/>
</div>
<div v-if="submitterDefaultFields.length && editable">
<div v-if="!isShowVariables && submitterDefaultFields.length && editable">
<hr class="mb-2">
<template v-if="isShowFieldSearch">
<input
@@ -110,7 +133,7 @@
</div>
</div>
<div
v-if="editable && withCustomFields && (customFields.length || newCustomField)"
v-if="!isShowVariables && editable && withCustomFields && (customFields.length || newCustomField)"
class="tabs w-full mb-1.5"
>
<a
@@ -127,7 +150,7 @@
>{{ t('custom') }}</a>
</div>
<div
v-if="showCustomTab && editable && (customFields.length || newCustomField)"
v-if="!isShowVariables && showCustomTab && editable && (customFields.length || newCustomField)"
ref="customFields"
class="custom-fields"
@dragover.prevent="onCustomFieldDragover"
@@ -195,7 +218,7 @@
</div>
</div>
<div
v-if="editable && !onlyDefinedFields && (!showCustomTab || (!customFields.length && !newCustomField))"
v-if="!isShowVariables && editable && !onlyDefinedFields && (!showCustomTab || (!customFields.length && !newCustomField))"
id="field-types-grid"
class="grid grid-cols-3 gap-1 pb-2 fields-grid"
>
@@ -283,7 +306,7 @@
</template>
</div>
<div
v-if="fields.length < 4 && editable && withHelp && !showTourStartForm"
v-if="!isShowVariables && fields.length < 4 && editable && withHelp && !showTourStartForm"
class="text-xs p-2 border border-base-200 rounded"
>
<ul class="list-disc list-outside ml-3">
@@ -299,7 +322,7 @@
</ul>
</div>
<div
v-if="withFieldsDetection && editable && fields.length < 2"
v-if="!isShowVariables && withFieldsDetection && editable && fields.length < 2 && !template.schema.some((item) => item.dynamic)"
class="my-2"
>
<button
@@ -336,7 +359,7 @@
</button>
</div>
<div
v-show="fields.length < 4 && editable && withHelp && showTourStartForm"
v-show="!isShowVariables && fields.length < 4 && editable && withHelp && showTourStartForm"
class="rounded py-2 px-4 w-full border border-dashed border-base-300"
>
<div class="text-center text-sm">
@@ -359,7 +382,8 @@ import Field from './field'
import CustomField from './custom_field'
import FieldType from './field_type'
import FieldSubmitter from './field_submitter'
import { IconLock, IconCirclePlus, IconInnerShadowTop, IconSparkles } from '@tabler/icons-vue'
import { defineAsyncComponent } from 'vue'
import { IconLock, IconCirclePlus, IconInnerShadowTop, IconSparkles, IconBracketsContain } from '@tabler/icons-vue'
import IconDrag from './icon_drag'
import { v4 } from 'uuid'
@@ -374,7 +398,9 @@ export default {
IconInnerShadowTop,
FieldSubmitter,
IconDrag,
IconLock
IconLock,
IconBracketsContain,
DynamicVariables: defineAsyncComponent(() => import(/* webpackChunkName: "dynamic-editor" */ './dynamic_variables'))
},
inject: ['save', 'backgroundColor', 'withPhone', 'withVerification', 'withKba', 'withPayment', 't', 'fieldsDragFieldRef', 'customDragFieldRef', 'baseFetch', 'selectedAreasRef', 'getFieldTypeIndex'],
props: {
@@ -475,7 +501,7 @@ export default {
default: false
}
},
emits: ['add-field', 'set-draw', 'set-draw-type', 'set-draw-custom-field', 'set-drag', 'drag-end', 'scroll-to-area', 'change-submitter', 'set-drag-placeholder', 'select-submitter'],
emits: ['add-field', 'set-draw', 'set-draw-type', 'set-draw-custom-field', 'set-drag', 'drag-end', 'scroll-to-area', 'change-submitter', 'set-drag-placeholder', 'select-submitter', 'rebuild-variables-schema'],
data () {
return {
fieldPagesLoaded: null,
@@ -483,12 +509,16 @@ export default {
newCustomField: null,
showCustomTab: false,
defaultFieldsSearch: '',
customFieldsSearch: ''
customFieldsSearch: '',
isShowVariables: false
}
},
computed: {
fieldNames: FieldType.computed.fieldNames,
fieldIcons: FieldType.computed.fieldIcons,
hasDynamicDocuments () {
return this.template.schema.some((item) => item.dynamic)
},
numberOfPages () {
return this.template.documents.reduce((acc, doc) => {
return acc + doc.metadata?.pdf?.number_of_pages || doc.preview_images.length
@@ -556,6 +586,10 @@ export default {
}
},
methods: {
toggleVariables () {
this.$emit('rebuild-variables-schema')
this.isShowVariables = !this.isShowVariables
},
onDragstart (event, field) {
this.removeDragOverlay(event)
@@ -582,6 +616,10 @@ export default {
delete customField.prefillable
delete customField.conditions
if (Array.isArray(customField.areas)) {
customField.areas = customField.areas.filter((area) => area.page !== null && area.page !== undefined)
}
customField.areas?.forEach((area) => {
delete area.attachment_uuid
delete area.page