optimize builder

master^2
Pete Matsyburka 5 days ago
parent c0793f3ce7
commit bccc78ee65

@ -998,7 +998,9 @@ export default {
}, },
previousInitialsValue () { previousInitialsValue () {
if (this.reuseSignature !== false) { if (this.reuseSignature !== false) {
const initialsField = [...this.fields].reverse().find((field) => field.type === 'initials' && !!this.values[field.uuid]) const initialsField = this.fields.findLast
? this.fields.findLast((field) => field.type === 'initials' && !!this.values[field.uuid])
: [...this.fields].reverse().find((field) => field.type === 'initials' && !!this.values[field.uuid])
return this.values[initialsField?.uuid] return this.values[initialsField?.uuid]
} else { } else {
@ -1163,7 +1165,9 @@ export default {
this.currentStep = Math.max(stepIndex, 0) this.currentStep = Math.max(stepIndex, 0)
} else if (this.goToLast) { } else if (this.goToLast) {
const requiredEmptyStepIndex = this.stepFields.indexOf(this.stepFields.find((fields) => fields.some((f) => f.required && !this.submittedValues[f.uuid]))) const requiredEmptyStepIndex = this.stepFields.indexOf(this.stepFields.find((fields) => fields.some((f) => f.required && !this.submittedValues[f.uuid])))
const lastFilledStepIndex = this.stepFields.indexOf([...this.stepFields].reverse().find((fields) => fields.some((f) => !!this.submittedValues[f.uuid]))) + 1 const lastFilledStepIndex = this.stepFields.indexOf(this.stepFields.findLast
? this.stepFields.findLast((fields) => fields.some((f) => !!this.submittedValues[f.uuid]))
: [...this.stepFields].reverse().find((fields) => fields.some((f) => !!this.submittedValues[f.uuid]))) + 1
const indexesList = [this.stepFields.length - 1] const indexesList = [this.stepFields.length - 1]
@ -1367,9 +1371,9 @@ export default {
}, },
previousSignatureValueFor (field) { previousSignatureValueFor (field) {
if (this.reuseSignature !== false) { if (this.reuseSignature !== false) {
const signatureField = [...this.fields].reverse().find((f) => const signatureField = this.fields.findLast
f.type === 'signature' && field.preferences?.format === f.preferences?.format && !!this.values[f.uuid] ? this.fields.findLast((f) => f.type === 'signature' && field.preferences?.format === f.preferences?.format && !!this.values[f.uuid])
) : [...this.fields].reverse().find((f) => f.type === 'signature' && field.preferences?.format === f.preferences?.format && !!this.values[f.uuid])
return this.values[signatureField?.uuid] return this.values[signatureField?.uuid]
} else { } else {

@ -401,7 +401,7 @@ export default {
FieldSubmitter, FieldSubmitter,
IconX IconX
}, },
inject: ['template', 'save', 't', 'isInlineSize', 'selectedAreasRef', 'isCmdKeyRef'], inject: ['template', 'save', 't', 'isInlineSize', 'selectedAreasRef', 'isCmdKeyRef', 'getFieldTypeIndex'],
props: { props: {
area: { area: {
type: Object, type: Object,
@ -579,7 +579,7 @@ export default {
return this.$el.getRootNode().querySelector('#docuseal_modal_container') return this.$el.getRootNode().querySelector('#docuseal_modal_container')
}, },
defaultName () { defaultName () {
return this.buildDefaultName(this.field, this.template.fields) return this.buildDefaultName(this.field)
}, },
fontClasses () { fontClasses () {
if (!this.field.preferences) { if (!this.field.preferences) {

@ -645,7 +645,8 @@ export default {
fieldsDragFieldRef: computed(() => this.fieldsDragFieldRef), fieldsDragFieldRef: computed(() => this.fieldsDragFieldRef),
customDragFieldRef: computed(() => this.customDragFieldRef), customDragFieldRef: computed(() => this.customDragFieldRef),
isSelectModeRef: computed(() => this.isSelectModeRef), isSelectModeRef: computed(() => this.isSelectModeRef),
isCmdKeyRef: computed(() => this.isCmdKeyRef) isCmdKeyRef: computed(() => this.isCmdKeyRef),
getFieldTypeIndex: this.getFieldTypeIndex
} }
}, },
props: { props: {
@ -989,6 +990,18 @@ export default {
return areas return areas
}, },
fieldTypeIndexMap () {
const map = {}
const typeCounters = {}
this.template.fields.forEach((f) => {
typeCounters[f.type] ||= 0
map[f.uuid] = typeCounters[f.type]
typeCounters[f.type]++
})
return map
},
isAllRequiredFieldsAdded () { isAllRequiredFieldsAdded () {
return !this.defaultRequiredFields?.some((f) => { return !this.defaultRequiredFields?.some((f) => {
return !this.template.fields?.some((field) => field.name === f.name) return !this.template.fields?.some((field) => field.name === f.name)
@ -1085,6 +1098,9 @@ export default {
addCustomField (field) { addCustomField (field) {
return this.$refs.fields.addCustomField(field) return this.$refs.fields.addCustomField(field)
}, },
getFieldTypeIndex (field) {
return this.fieldTypeIndexMap[field.uuid]
},
addCustomFieldWithoutDraw () { addCustomFieldWithoutDraw () {
const customField = this.drawCustomField const customField = this.drawCustomField
@ -2065,7 +2081,9 @@ export default {
} }
if (type === 'checkbox' && !this.drawFieldType && (this.template.fields[this.template.fields.length - 1]?.type === 'checkbox' || area.w)) { if (type === 'checkbox' && !this.drawFieldType && (this.template.fields[this.template.fields.length - 1]?.type === 'checkbox' || area.w)) {
const previousField = [...this.template.fields].reverse().find((f) => f.type === type) const previousField = this.template.fields.findLast
? this.template.fields.findLast((f) => f.type === type)
: [...this.template.fields].reverse().find((f) => f.type === type)
const previousArea = previousField?.areas?.[previousField.areas.length - 1] const previousArea = previousField?.areas?.[previousField.areas.length - 1]
if (previousArea || area.w) { if (previousArea || area.w) {
@ -2329,7 +2347,9 @@ export default {
assignDropAreaSize (fieldArea, field, area) { assignDropAreaSize (fieldArea, field, area) {
const fieldType = field.type || 'text' const fieldType = field.type || 'text'
const previousField = [...this.template.fields].reverse().find((f) => f.type === fieldType) const previousField = this.template.fields.findLast
? this.template.fields.findLast((f) => f.type === fieldType)
: [...this.template.fields].reverse().find((f) => f.type === fieldType)
let baseArea let baseArea

@ -9,7 +9,7 @@
<div class="modal-box pt-4 pb-6 px-6 mt-20 max-h-none w-full max-w-xl"> <div class="modal-box pt-4 pb-6 px-6 mt-20 max-h-none w-full max-w-xl">
<div class="flex justify-between items-center border-b pb-2 mb-2 font-medium"> <div class="flex justify-between items-center border-b pb-2 mb-2 font-medium">
<span class="modal-title"> <span class="modal-title">
{{ t('condition') }} - {{ (defaultField ? (defaultField.title || item.title || item.name) : item.name) || buildDefaultName(item, template.fields) }} {{ t('condition') }} - {{ (defaultField ? (defaultField.title || item.title || item.name) : item.name) || buildDefaultName(item) }}
</span> </span>
<a <a
href="#" href="#"
@ -83,7 +83,7 @@
class="text-base-content" class="text-base-content"
:selected="condition.field_uuid === f.uuid" :selected="condition.field_uuid === f.uuid"
> >
{{ f.name || buildDefaultName(f, template.fields) }} {{ f.name || buildDefaultName(f) }}
</option> </option>
</select> </select>
<select <select

@ -281,7 +281,7 @@ export default {
ConditionsModal, ConditionsModal,
DescriptionModal DescriptionModal
}, },
inject: ['t', 'save', 'selectedAreasRef', 'isSelectModeRef'], inject: ['t', 'save', 'selectedAreasRef', 'isSelectModeRef', 'getFieldTypeIndex'],
props: { props: {
contextMenu: { contextMenu: {
type: Object, type: Object,

@ -9,7 +9,7 @@
<div class="modal-box pt-4 pb-6 px-6 mt-20 max-h-none w-full max-w-xl"> <div class="modal-box pt-4 pb-6 px-6 mt-20 max-h-none w-full max-w-xl">
<div class="flex justify-between items-center border-b pb-2 mb-2 font-medium"> <div class="flex justify-between items-center border-b pb-2 mb-2 font-medium">
<span class="modal-title"> <span class="modal-title">
{{ (defaultField ? (defaultField.title || field.title || field.name) : field.name) || buildDefaultName(field, template.fields) }} {{ (defaultField ? (defaultField.title || field.title || field.name) : field.name) || buildDefaultName(field) }}
</span> </span>
<a <a
href="#" href="#"

@ -340,7 +340,7 @@ export default {
IconMathFunction, IconMathFunction,
FieldType FieldType
}, },
inject: ['template', 'backgroundColor', 'selectedAreasRef', 't', 'locale'], inject: ['template', 'backgroundColor', 'selectedAreasRef', 't', 'locale', 'getFieldTypeIndex'],
props: { props: {
field: { field: {
type: Object, type: Object,
@ -412,7 +412,7 @@ export default {
return this.$el.getRootNode().querySelector('#docuseal_modal_container') return this.$el.getRootNode().querySelector('#docuseal_modal_container')
}, },
defaultName () { defaultName () {
return this.buildDefaultName(this.field, this.template.fields) return this.buildDefaultName(this.field)
}, },
areas () { areas () {
return this.field.areas || [] return this.field.areas || []
@ -432,7 +432,7 @@ export default {
this.$emit('save') this.$emit('save')
}, },
buildDefaultName (field, fields) { buildDefaultName (field) {
if (field.type === 'payment' && field.preferences?.price && !field.preferences?.formula) { if (field.type === 'payment' && field.preferences?.price && !field.preferences?.formula) {
const { price, currency } = field.preferences || {} const { price, currency } = field.preferences || {}
@ -443,7 +443,7 @@ export default {
return `${this.fieldNames[field.type]} ${formattedPrice}` return `${this.fieldNames[field.type]} ${formattedPrice}`
} else { } else {
const typeIndex = fields.filter((f) => f.type === field.type).indexOf(field) const typeIndex = this.getFieldTypeIndex(field)
if (field.type === 'heading' || field.type === 'strikethrough') { if (field.type === 'heading' || field.type === 'strikethrough') {
return `${this.fieldNames[field.type]} ${typeIndex + 1}` return `${this.fieldNames[field.type]} ${typeIndex + 1}`

@ -25,7 +25,7 @@
:key="field.uuid" :key="field.uuid"
:data-uuid="field.uuid" :data-uuid="field.uuid"
:field="field" :field="field"
:type-index="fields.filter((f) => f.type === field.type).indexOf(field)" :type-index="getFieldTypeIndex(field)"
:editable="editable" :editable="editable"
:with-signature-id="withSignatureId" :with-signature-id="withSignatureId"
:with-prefillable="withPrefillable" :with-prefillable="withPrefillable"
@ -376,7 +376,7 @@ export default {
IconDrag, IconDrag,
IconLock IconLock
}, },
inject: ['save', 'backgroundColor', 'withPhone', 'withVerification', 'withKba', 'withPayment', 't', 'fieldsDragFieldRef', 'customDragFieldRef', 'baseFetch', 'selectedAreasRef'], inject: ['save', 'backgroundColor', 'withPhone', 'withVerification', 'withKba', 'withPayment', 't', 'fieldsDragFieldRef', 'customDragFieldRef', 'baseFetch', 'selectedAreasRef', 'getFieldTypeIndex'],
props: { props: {
fields: { fields: {
type: Array, type: Array,

@ -9,7 +9,7 @@
<div class="modal-box pt-4 pb-6 px-6 mt-20 max-h-none w-full max-w-xl"> <div class="modal-box pt-4 pb-6 px-6 mt-20 max-h-none w-full max-w-xl">
<div class="flex justify-between items-center border-b pb-2 mb-2 font-medium"> <div class="flex justify-between items-center border-b pb-2 mb-2 font-medium">
<span class="modal-title"> <span class="modal-title">
{{ t('font') }} - {{ (defaultField ? (defaultField.title || field.title || field.name) : field.name) || buildDefaultName(field, template.fields) }} {{ t('font') }} - {{ (defaultField ? (defaultField.title || field.title || field.name) : field.name) || buildDefaultName(field) }}
</span> </span>
<a <a
href="#" href="#"
@ -171,7 +171,7 @@
contenteditable="true" contenteditable="true"
class="outline-none whitespace-nowrap truncate" class="outline-none whitespace-nowrap truncate"
> >
{{ field.default_value || field.name || buildDefaultName(field, template.fields) }} {{ field.default_value || field.name || buildDefaultName(field) }}
</span> </span>
</div> </div>
</div> </div>

@ -9,7 +9,7 @@
<div class="modal-box pt-4 pb-6 px-6 mt-20 max-h-none w-full max-w-xl"> <div class="modal-box pt-4 pb-6 px-6 mt-20 max-h-none w-full max-w-xl">
<div class="flex justify-between items-center border-b pb-2 mb-2 font-medium"> <div class="flex justify-between items-center border-b pb-2 mb-2 font-medium">
<span class="modal-title"> <span class="modal-title">
{{ t('formula') }} - {{ (defaultField ? (defaultField.title || field.title || field.name) : field.name) || buildDefaultName(field, template.fields) }} {{ t('formula') }} - {{ (defaultField ? (defaultField.title || field.title || field.name) : field.name) || buildDefaultName(field) }}
</span> </span>
<a <a
href="#" href="#"
@ -33,7 +33,7 @@
v-for="f in fields" v-for="f in fields"
:key="f.uuid" :key="f.uuid"
class="mr-1 flex btn btn-neutral btn-outline border-base-content/20 btn-sm normal-case font-normal bg-white !rounded-xl" class="mr-1 flex btn btn-neutral btn-outline border-base-content/20 btn-sm normal-case font-normal bg-white !rounded-xl"
@click.prevent="insertTextUnderCursor(`{{${f.name || buildDefaultName(f, template.fields)}}}`)" @click.prevent="insertTextUnderCursor(`{{${f.name || buildDefaultName(f)}}}`)"
> >
<IconMathFunction <IconMathFunction
v-if="f.preferences?.formula" v-if="f.preferences?.formula"
@ -47,7 +47,7 @@
height="20" height="20"
stroke-width="1.5" stroke-width="1.5"
/> />
{{ f.name || buildDefaultName(f, template.fields) }} {{ f.name || buildDefaultName(f) }}
</button> </button>
</div> </div>
<div> <div>
@ -181,7 +181,7 @@ export default {
const foundField = this.fields.find((f) => f.uuid === uuid) const foundField = this.fields.find((f) => f.uuid === uuid)
if (foundField) { if (foundField) {
return `{{${foundField.name || this.buildDefaultName(foundField, this.template.fields)}}}` return `{{${foundField.name || this.buildDefaultName(foundField)}}}`
} else { } else {
return '{{FIELD NOT FOUND}}' return '{{FIELD NOT FOUND}}'
} }
@ -190,7 +190,7 @@ export default {
normalizeFormula (text) { normalizeFormula (text) {
return text.replace(/{{(.*?)}}/g, (match, name) => { return text.replace(/{{(.*?)}}/g, (match, name) => {
const foundField = this.fields.find((f) => { const foundField = this.fields.find((f) => {
return (f.name || this.buildDefaultName(f, this.template.fields)).trim() === name.trim() return (f.name || this.buildDefaultName(f)).trim() === name.trim()
}) })
if (foundField) { if (foundField) {

@ -145,7 +145,7 @@ export default {
GoogleDriveDocumentSettings, GoogleDriveDocumentSettings,
IconSortDescending2 IconSortDescending2
}, },
inject: ['t'], inject: ['t', 'getFieldTypeIndex'],
props: { props: {
item: { item: {
type: Object, type: Object,

Loading…
Cancel
Save