From bccc78ee6594d68d6475a679f57afc3e29c202d2 Mon Sep 17 00:00:00 2001 From: Pete Matsyburka Date: Fri, 30 Jan 2026 09:58:30 +0200 Subject: [PATCH] optimize builder --- app/javascript/submission_form/form.vue | 14 ++++++---- app/javascript/template_builder/area.vue | 4 +-- app/javascript/template_builder/builder.vue | 26 ++++++++++++++++--- .../template_builder/conditions_modal.vue | 4 +-- .../template_builder/context_menu.vue | 2 +- .../template_builder/description_modal.vue | 2 +- app/javascript/template_builder/field.vue | 8 +++--- app/javascript/template_builder/fields.vue | 4 +-- .../template_builder/font_modal.vue | 4 +-- .../template_builder/formula_modal.vue | 10 +++---- app/javascript/template_builder/preview.vue | 2 +- 11 files changed, 52 insertions(+), 28 deletions(-) diff --git a/app/javascript/submission_form/form.vue b/app/javascript/submission_form/form.vue index 3f78624b..da939ce4 100644 --- a/app/javascript/submission_form/form.vue +++ b/app/javascript/submission_form/form.vue @@ -998,7 +998,9 @@ export default { }, previousInitialsValue () { 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] } else { @@ -1163,7 +1165,9 @@ export default { this.currentStep = Math.max(stepIndex, 0) } else if (this.goToLast) { 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] @@ -1367,9 +1371,9 @@ export default { }, previousSignatureValueFor (field) { if (this.reuseSignature !== false) { - const signatureField = [...this.fields].reverse().find((f) => - f.type === 'signature' && field.preferences?.format === f.preferences?.format && !!this.values[f.uuid] - ) + const signatureField = this.fields.findLast + ? 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] } else { diff --git a/app/javascript/template_builder/area.vue b/app/javascript/template_builder/area.vue index 7f87edbe..52e5f7b8 100644 --- a/app/javascript/template_builder/area.vue +++ b/app/javascript/template_builder/area.vue @@ -401,7 +401,7 @@ export default { FieldSubmitter, IconX }, - inject: ['template', 'save', 't', 'isInlineSize', 'selectedAreasRef', 'isCmdKeyRef'], + inject: ['template', 'save', 't', 'isInlineSize', 'selectedAreasRef', 'isCmdKeyRef', 'getFieldTypeIndex'], props: { area: { type: Object, @@ -579,7 +579,7 @@ export default { return this.$el.getRootNode().querySelector('#docuseal_modal_container') }, defaultName () { - return this.buildDefaultName(this.field, this.template.fields) + return this.buildDefaultName(this.field) }, fontClasses () { if (!this.field.preferences) { diff --git a/app/javascript/template_builder/builder.vue b/app/javascript/template_builder/builder.vue index b0f9e9cd..a871e7cf 100644 --- a/app/javascript/template_builder/builder.vue +++ b/app/javascript/template_builder/builder.vue @@ -645,7 +645,8 @@ export default { fieldsDragFieldRef: computed(() => this.fieldsDragFieldRef), customDragFieldRef: computed(() => this.customDragFieldRef), isSelectModeRef: computed(() => this.isSelectModeRef), - isCmdKeyRef: computed(() => this.isCmdKeyRef) + isCmdKeyRef: computed(() => this.isCmdKeyRef), + getFieldTypeIndex: this.getFieldTypeIndex } }, props: { @@ -989,6 +990,18 @@ export default { 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 () { return !this.defaultRequiredFields?.some((f) => { return !this.template.fields?.some((field) => field.name === f.name) @@ -1085,6 +1098,9 @@ export default { addCustomField (field) { return this.$refs.fields.addCustomField(field) }, + getFieldTypeIndex (field) { + return this.fieldTypeIndexMap[field.uuid] + }, addCustomFieldWithoutDraw () { 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)) { - 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] if (previousArea || area.w) { @@ -2329,7 +2347,9 @@ export default { assignDropAreaSize (fieldArea, field, area) { 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 diff --git a/app/javascript/template_builder/conditions_modal.vue b/app/javascript/template_builder/conditions_modal.vue index 81e54407..6dc06e99 100644 --- a/app/javascript/template_builder/conditions_modal.vue +++ b/app/javascript/template_builder/conditions_modal.vue @@ -9,7 +9,7 @@