From 176148fc71ab45345866e917fe7f563137b32c30 Mon Sep 17 00:00:00 2001 From: Pete Matsyburka Date: Mon, 9 Mar 2026 17:21:35 +0200 Subject: [PATCH 01/17] adjust default initial --- app/javascript/submission_form/initials_step.vue | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/javascript/submission_form/initials_step.vue b/app/javascript/submission_form/initials_step.vue index 814b9c12..8a53d532 100644 --- a/app/javascript/submission_form/initials_step.vue +++ b/app/javascript/submission_form/initials_step.vue @@ -359,7 +359,9 @@ export default { }, initTextInitial () { if (this.submitter.name) { - this.$refs.textInput.value = this.submitter.name.trim().split(/\s+/).filter(Boolean).slice(0, 2).map((part) => part[0]?.toUpperCase() || '').join('') + const parts = this.submitter.name.trim().split(/\s+/) + + this.$refs.textInput.value = (parts.length > 1 ? [parts[0], parts[parts.length - 1]] : parts).map((part) => part[0]?.toUpperCase() || '').join('') } if (this.$refs.textInput.value) { From 5f16b506f53d32108a2b77de655d0732af94f6ef Mon Sep 17 00:00:00 2001 From: Pete Matsyburka Date: Tue, 10 Mar 2026 08:12:32 +0200 Subject: [PATCH 02/17] fix n+1 --- lib/submissions.rb | 14 +------------- lib/submitters.rb | 1 - 2 files changed, 1 insertion(+), 14 deletions(-) diff --git a/lib/submissions.rb b/lib/submissions.rb index 475f0e83..d8394c5b 100644 --- a/lib/submissions.rb +++ b/lib/submissions.rb @@ -3,8 +3,6 @@ module Submissions DEFAULT_SUBMITTERS_ORDER = 'random' - PRELOAD_ALL_PAGES_AMOUNT = 200 - module_function def search(current_user, submissions, keyword, search_values: false, search_template: false) @@ -81,19 +79,9 @@ module Submissions def preload_with_pages(submission) ActiveRecord::Associations::Preloader.new( records: submission.schema_documents, - associations: [:blob] + associations: [:blob, { preview_images_attachments: :blob }] ).call - total_pages = - submission.schema_documents.sum { |e| e.metadata.dig('pdf', 'number_of_pages').to_i } - - if total_pages < PRELOAD_ALL_PAGES_AMOUNT - ActiveRecord::Associations::Preloader.new( - records: submission.schema_documents, - associations: [{ preview_images_attachments: :blob }] - ).call - end - submission end diff --git a/lib/submitters.rb b/lib/submitters.rb index 47fbf014..be0690b1 100644 --- a/lib/submitters.rb +++ b/lib/submitters.rb @@ -2,7 +2,6 @@ module Submitters TRUE_VALUES = ['1', 'true', true].freeze - PRELOAD_ALL_PAGES_AMOUNT = 200 FIELD_NAME_WEIGHTS = { 'email' => 'A', From b7c270bef8f79cfa3067462de9b975eebdc9d3f2 Mon Sep 17 00:00:00 2001 From: Pete Matsyburka Date: Tue, 10 Mar 2026 10:31:45 +0200 Subject: [PATCH 03/17] dir auto section --- app/javascript/template_builder/dynamic_section.vue | 1 + 1 file changed, 1 insertion(+) diff --git a/app/javascript/template_builder/dynamic_section.vue b/app/javascript/template_builder/dynamic_section.vue index 81b87b25..eb584bbe 100644 --- a/app/javascript/template_builder/dynamic_section.vue +++ b/app/javascript/template_builder/dynamic_section.vue @@ -6,6 +6,7 @@
From 0e5f949bcf24579a0cfecaec9ea415930cd6c0ee Mon Sep 17 00:00:00 2001 From: Pete Matsyburka Date: Tue, 10 Mar 2026 11:39:00 +0200 Subject: [PATCH 04/17] remove email from signing reason --- lib/submissions/generate_result_attachments.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/submissions/generate_result_attachments.rb b/lib/submissions/generate_result_attachments.rb index ec3964c2..ab5a840a 100644 --- a/lib/submissions/generate_result_attachments.rb +++ b/lib/submissions/generate_result_attachments.rb @@ -37,7 +37,7 @@ module Submissions bold_italic: FONT_BOLD_NAME }.freeze - SIGN_REASON = 'Signed by %s with DocuSeal.com' + SIGN_REASON = 'Signed with DocuSeal.com' RTL_REGEXP = TextUtils::RTL_REGEXP From e90ac391b26ef223151936c0cee8d9b668d6c356 Mon Sep 17 00:00:00 2001 From: Pete Matsyburka Date: Tue, 10 Mar 2026 18:58:12 +0200 Subject: [PATCH 05/17] update readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d97620c0..9e6b2f04 100644 --- a/README.md +++ b/README.md @@ -64,7 +64,7 @@ DocuSeal is an open source platform that provides secure and efficient digital d |Heroku|Railway| |:--:|:---:| -| [Deploy on Heroku](https://heroku.com/deploy?template=https://github.com/docusealco/docuseal-heroku) | [Deploy on Railway](https://railway.app/template/IGoDnc?referralCode=ruU7JR)| +| [Deploy on Heroku](https://heroku.com/deploy?template=https://github.com/docusealco/docuseal-heroku) | [Deploy on Railway](https://railway.com/deploy/IGoDnc?referralCode=ruU7JR)| |**DigitalOcean**|**Render**| | [Deploy on DigitalOcean](https://cloud.digitalocean.com/apps/new?repo=https://github.com/docusealco/docuseal-digitalocean/tree/master&refcode=421d50f53990) | [Deploy to Render](https://render.com/deploy?repo=https://github.com/docusealco/docuseal-render) From f5ae8c60d308e9950c31d01da46cc1a4ced29e25 Mon Sep 17 00:00:00 2001 From: Pete Matsyburka Date: Wed, 11 Mar 2026 10:44:12 +0200 Subject: [PATCH 06/17] preload dynamic editor --- app/javascript/template_builder/preview.vue | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/app/javascript/template_builder/preview.vue b/app/javascript/template_builder/preview.vue index b09bd860..1fe1288d 100644 --- a/app/javascript/template_builder/preview.vue +++ b/app/javascript/template_builder/preview.vue @@ -274,13 +274,16 @@ export default { makeDynamic () { this.isMakeDynamicLoading = true - this.baseFetch(`/templates/${this.template.id}/dynamic_documents`, { - method: 'POST', - body: JSON.stringify({ uuid: this.document.uuid }), - headers: { - 'Content-Type': 'application/json' - } - }).then(async (resp) => { + Promise.all([ + this.baseFetch(`/templates/${this.template.id}/dynamic_documents`, { + method: 'POST', + body: JSON.stringify({ uuid: this.document.uuid }), + headers: { + 'Content-Type': 'application/json' + } + }), + import(/* webpackChunkName: "dynamic-editor" */ './dynamic_document') + ]).then(async ([resp, _]) => { const dynamicDocument = await resp.json() this.template.schema.find((item) => item.attachment_uuid === dynamicDocument.uuid).dynamic = true From 9c02ed66f59849d843c9e10233d74675540a367e Mon Sep 17 00:00:00 2001 From: Pete Matsyburka Date: Wed, 11 Mar 2026 14:43:16 +0200 Subject: [PATCH 07/17] fix field scroll --- app/javascript/template_builder/dynamic_document.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/template_builder/dynamic_document.vue b/app/javascript/template_builder/dynamic_document.vue index 781e1019..045fc488 100644 --- a/app/javascript/template_builder/dynamic_document.vue +++ b/app/javascript/template_builder/dynamic_document.vue @@ -154,7 +154,7 @@ export default { const el = editor.view.dom.querySelector(`[data-area-uuid="${area.uuid}"]`) if (el) { - editor.chain().focus().setNodeSelection(editor.view.posAtDOM(el, 0)).run() + editor.commands.setNodeSelection(editor.view.posAtDOM(el, 0)) el.scrollIntoView({ behavior: 'smooth', block: 'center' }) } From 3e250bfb28667eba8f52105367e8e0ed93f4bcd3 Mon Sep 17 00:00:00 2001 From: Pete Matsyburka Date: Wed, 11 Mar 2026 23:44:06 +0200 Subject: [PATCH 08/17] error update if declined --- app/controllers/api/submitters_controller.rb | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/controllers/api/submitters_controller.rb b/app/controllers/api/submitters_controller.rb index f28bf5e1..8f6d77fc 100644 --- a/app/controllers/api/submitters_controller.rb +++ b/app/controllers/api/submitters_controller.rb @@ -40,6 +40,10 @@ module Api return render json: { error: 'Submitter has already completed the submission.' }, status: :unprocessable_content end + if @submitter.declined_at? + return render json: { error: 'Submitter has already declined the submission.' }, status: :unprocessable_content + end + submission = @submitter.submission role = submission.template_submitters.find { |e| e['uuid'] == @submitter.uuid }['name'] From 7aba2eb4dabb2db2ce9184d976ba2775faba3b94 Mon Sep 17 00:00:00 2001 From: Pete Matsyburka Date: Thu, 12 Mar 2026 08:58:56 +0200 Subject: [PATCH 09/17] disable decline --- app/views/accounts/show.html.erb | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/app/views/accounts/show.html.erb b/app/views/accounts/show.html.erb index 5093d7bf..8ee0e45f 100644 --- a/app/views/accounts/show.html.erb +++ b/app/views/accounts/show.html.erb @@ -131,21 +131,23 @@ <% end %> <% end %> - <% account_config = AccountConfig.find_or_initialize_by(account: current_account, key: AccountConfig::ALLOW_TO_DECLINE_KEY) %> - <% if can?(:manage, account_config) %> - <%= form_for account_config, url: account_configs_path, method: :post do |f| %> - <%= f.hidden_field :key %> -
-
- <%= t('allow_to_decline_documents') %> - - <%= svg_icon('info_circle', class: 'hidden md:inline-block w-4 h-4 shrink-0') %> - + <% if !Docuseal.multitenant? || can?(:manage, :disable_decline) %> + <% account_config = AccountConfig.find_or_initialize_by(account: current_account, key: AccountConfig::ALLOW_TO_DECLINE_KEY) %> + <% if can?(:manage, account_config) %> + <%= form_for account_config, url: account_configs_path, method: :post do |f| %> + <%= f.hidden_field :key %> +
+
+ <%= t('allow_to_decline_documents') %> + + <%= svg_icon('info_circle', class: 'hidden md:inline-block w-4 h-4 shrink-0') %> + +
+ + <%= f.check_box :value, class: 'toggle', checked: account_config.value != false %> +
- - <%= f.check_box :value, class: 'toggle', checked: account_config.value != false %> - -
+ <% end %> <% end %> <% end %> <% account_config = AccountConfig.find_or_initialize_by(account: current_account, key: AccountConfig::FORM_PREFILL_SIGNATURE_KEY) %> From 8e2e780a1a01e354c77658e3145ea43902c0ef80 Mon Sep 17 00:00:00 2001 From: Alex Turchyn Date: Fri, 13 Mar 2026 20:04:05 +0200 Subject: [PATCH 10/17] fix webhook events filtering --- app/views/webhook_settings/show.html.erb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/views/webhook_settings/show.html.erb b/app/views/webhook_settings/show.html.erb index a8f16dd5..e552396d 100644 --- a/app/views/webhook_settings/show.html.erb +++ b/app/views/webhook_settings/show.html.erb @@ -85,9 +85,9 @@

<%= t('events_log') %>

- <%= link_to t('all'), url_for(params: request.query_parameters.except('status')), style: 'margin-bottom: -1px', class: "tab h-10 text-base #{params[:status].blank? ? 'tab-active tab-bordered' : 'pb-[3px]'}" %> - <%= link_to t('succeeded'), url_for(params: request.query_parameters.merge('status' => 'success')), style: 'margin-bottom: -1px', class: "tab h-10 text-base #{params[:status] == 'success' ? 'tab-active tab-bordered' : 'pb-[3px]'}" %> - <%= link_to t('failed'), url_for(params: request.query_parameters.merge('status' => 'error')), style: 'margin-bottom: -1px', class: "tab h-10 text-base #{params[:status] == 'error' ? 'tab-active tab-bordered' : 'pb-[3px]'}" %> + <%= link_to t('all'), url_for(params: request.query_parameters.except('status', 'page')), style: 'margin-bottom: -1px', class: "tab h-10 text-base #{params[:status].blank? ? 'tab-active tab-bordered' : 'pb-[3px]'}" %> + <%= link_to t('succeeded'), url_for(params: request.query_parameters.except('page').merge('status' => 'success')), style: 'margin-bottom: -1px', class: "tab h-10 text-base #{params[:status] == 'success' ? 'tab-active tab-bordered' : 'pb-[3px]'}" %> + <%= link_to t('failed'), url_for(params: request.query_parameters.except('page').merge('status' => 'error')), style: 'margin-bottom: -1px', class: "tab h-10 text-base #{params[:status] == 'error' ? 'tab-active tab-bordered' : 'pb-[3px]'}" %>
<% if @webhook_events.present? %>
From 44db775b89abb0b992597a7a6b8db1c7fc431bbc Mon Sep 17 00:00:00 2001 From: Pete Matsyburka Date: Sat, 14 Mar 2026 17:44:19 +0200 Subject: [PATCH 11/17] fix variable style --- app/javascript/template_builder/dynamic_editor.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/javascript/template_builder/dynamic_editor.js b/app/javascript/template_builder/dynamic_editor.js index f7cea96e..4c9a2d56 100644 --- a/app/javascript/template_builder/dynamic_editor.js +++ b/app/javascript/template_builder/dynamic_editor.js @@ -28,7 +28,7 @@ tiptapStylesheet.replaceSync( white-space: break-spaces; -webkit-font-variant-ligatures: none; font-variant-ligatures: none; - font-feature-settings: "liga" 0; /* the above doesn't seem to work in Edge */ + font-feature-settings: "liga" 0; } .ProseMirror [contenteditable="false"] { @@ -89,7 +89,7 @@ img.ProseMirror-separator { .ProseMirror-focused .ProseMirror-gapcursor { display: block; } -.variable-highlight { +dynamic-variable { background-color: #fef3c7; }`) @@ -533,7 +533,7 @@ function buildDecorations (doc) { const from = pos + match.index const to = from + match[0].length - decorations.push(Decoration.inline(from, to, { class: 'variable-highlight' })) + decorations.push(Decoration.inline(from, to, { nodeName: 'dynamic-variable' })) } }) From db5dbd6ac22a45f198708cb4c8d710f90f165896 Mon Sep 17 00:00:00 2001 From: Pete Matsyburka Date: Sun, 15 Mar 2026 10:51:44 +0200 Subject: [PATCH 12/17] adjust dynamic editor --- app/javascript/template_builder/builder.vue | 205 +++--- .../template_builder/dynamic_area.vue | 11 +- .../template_builder/dynamic_document.vue | 97 ++- .../template_builder/dynamic_editor.js | 27 +- .../template_builder/dynamic_section.vue | 588 +++++++++++++++--- app/javascript/template_builder/fields.vue | 6 +- 6 files changed, 734 insertions(+), 200 deletions(-) diff --git a/app/javascript/template_builder/builder.vue b/app/javascript/template_builder/builder.vue index 218a182f..5338fc07 100644 --- a/app/javascript/template_builder/builder.vue +++ b/app/javascript/template_builder/builder.vue @@ -364,7 +364,14 @@ :document="dynamicDocuments.find((dynamicDocument) => dynamicDocument.uuid === document.uuid)" :selected-submitter="selectedSubmitter" :drag-field="dragField" + :draw-field="drawField" + :draw-field-type="drawFieldType" + :draw-custom-field="drawCustomField" + :draw-option="drawOption" @update="onDynamicDocumentUpdate" + @draw="clearDrawField" + @add-custom-field="addCustomField" + @set-draw="[drawField = $event.field, drawOption = $event.option]" /> { + this.documentRefs.forEach((documentRef) => { + if (documentRef.isDynamic && documentRef.document.uuid === area.attachment_uuid) { + documentRef.removeArea(area) + } + }) + }) + } + }, + onRemoveSubmitter (submitter) { + if (this.dynamicDocuments.length) { + this.template.fields.forEach((field) => { + if (field.submitter_uuid === submitter.uuid) { + field.areas?.forEach((area) => { + this.documentRefs.forEach((documentRef) => { + if (documentRef.isDynamic && documentRef.document.uuid === area.attachment_uuid) { + documentRef.removeArea(area) + } + }) + }) + } + }) + } + }, toggleSelectMode () { this.isSelectModeRef.value = !this.isSelectModeRef.value @@ -2512,60 +2547,80 @@ export default { this.save() }, - onDocumentRemove (item) { - if (window.confirm(this.t('are_you_sure_'))) { - this.template.schema.splice(this.template.schema.indexOf(item), 1) + removeAreasByAttachmentUuid (attachmentUuid) { + const removedFieldUuids = [] - const removedFieldUuids = [] + this.selectedAreasRef.value = this.selectedAreasRef.value.filter((area) => area.attachment_uuid !== attachmentUuid) - this.template.fields.forEach((field) => { - [...(field.areas || [])].forEach((area) => { - if (area.attachment_uuid === item.attachment_uuid) { - field.areas.splice(field.areas.indexOf(area), 1) + this.template.fields.forEach((field) => { + [...(field.areas || [])].forEach((area) => { + if (area.attachment_uuid === attachmentUuid) { + field.areas.splice(field.areas.indexOf(area), 1) - removedFieldUuids.push(field.uuid) - } - }) + removedFieldUuids.push(field.uuid) + } }) + }) - this.template.fields = this.template.fields.reduce((acc, f) => { - if (removedFieldUuids.includes(f.uuid) && !f.areas?.length) { - this.removeFieldConditions(f) - } else { - acc.push(f) - } + this.template.fields = this.template.fields.reduce((acc, field) => { + if (removedFieldUuids.includes(field.uuid) && !field.areas?.length) { + this.removeFieldConditions(field) + } else { + acc.push(field) + } + + return acc + }, []) + }, + onDocumentRemove (item) { + if (window.confirm(this.t('are_you_sure_'))) { + this.template.schema.splice(this.template.schema.indexOf(item), 1) - return acc - }, []) + this.removeAreasByAttachmentUuid(item.attachment_uuid) this.save() } }, onDocumentReplace (data) { const { replaceSchemaItem, schema, documents } = data + const isReplacingDynamicDocument = !!replaceSchemaItem.dynamic // eslint-disable-next-line camelcase const { google_drive_file_id, dynamic, ...cleanedReplaceSchemaItem } = replaceSchemaItem this.template.schema.splice(this.template.schema.indexOf(replaceSchemaItem), 1, { ...cleanedReplaceSchemaItem, ...schema[0] }) this.template.documents.push(...documents) + if (isReplacingDynamicDocument) { + this.removeAreasByAttachmentUuid(replaceSchemaItem.attachment_uuid) + + const dynamicDocumentIndex = this.dynamicDocuments.findIndex((doc) => doc.uuid === replaceSchemaItem.attachment_uuid) + + if (dynamicDocumentIndex !== -1) { + this.dynamicDocuments.splice(dynamicDocumentIndex, 1) + } + } + if (data.fields) { this.template.fields = data.fields - const removedFieldUuids = [] + if (isReplacingDynamicDocument) { + this.removeAreasByAttachmentUuid(replaceSchemaItem.attachment_uuid) + } else { + const removedFieldUuids = [] - this.template.fields.forEach((field) => { - [...(field.areas || [])].forEach((area) => { - if (area.attachment_uuid === replaceSchemaItem.attachment_uuid) { - field.areas.splice(field.areas.indexOf(area), 1) + this.template.fields.forEach((field) => { + [...(field.areas || [])].forEach((area) => { + if (area.attachment_uuid === replaceSchemaItem.attachment_uuid) { + field.areas.splice(field.areas.indexOf(area), 1) - removedFieldUuids.push(field.uuid) - } + removedFieldUuids.push(field.uuid) + } + }) }) - }) - this.template.fields = - this.template.fields.filter((f) => !removedFieldUuids.includes(f.uuid) || f.areas?.length) + this.template.fields = + this.template.fields.filter((f) => !removedFieldUuids.includes(f.uuid) || f.areas?.length) + } } if (data.submitters) { @@ -2576,13 +2631,15 @@ export default { } } - this.template.fields.forEach((field) => { - (field.areas || []).forEach((area) => { - if (area.attachment_uuid === replaceSchemaItem.attachment_uuid) { - area.attachment_uuid = schema[0].attachment_uuid - } + if (!isReplacingDynamicDocument) { + this.template.fields.forEach((field) => { + (field.areas || []).forEach((area) => { + if (area.attachment_uuid === replaceSchemaItem.attachment_uuid) { + area.attachment_uuid = schema[0].attachment_uuid + } + }) }) - }) + } if (this.onUpload) { this.onUpload(this.template) @@ -2694,9 +2751,13 @@ export default { scrollToArea (area) { const documentRef = this.documentRefs.find((a) => a.document.uuid === area.attachment_uuid) - documentRef.scrollToArea(area) + if (documentRef.isDynamic) { + this.selectedAreasRef.value = [] + } else { + this.selectedAreasRef.value = [area] + } - this.selectedAreasRef.value = [area] + documentRef.scrollToArea(area) }, baseFetch (path, options = {}) { return fetch(this.baseUrl + path, { @@ -2942,15 +3003,15 @@ export default { } }) - this.reconcileDynamicFields() + this.save() }, rebuildVariablesSchema ({ disable = true } = {}) { const parsed = {} - const dynamicDocumentRef = this.documentRefs.find((e) => e.mergeSchemaProperties) + const dynamicDocumentRef = this.documentRefs.find((e) => e.isDynamic) this.documentRefs.forEach((ref) => { - if (ref.updateVariablesSchema) { + if (ref.isDynamic) { ref.updateVariablesSchema() } }) @@ -2964,70 +3025,8 @@ export default { if (!this.template.variables_schema) { this.template.variables_schema = parsed } else { - this.syncVariablesSchema(this.template.variables_schema, parsed, { disable }) - } - }, - syncVariablesSchema (existing, parsed, { disable = true } = {}) { - for (const key of Object.keys(parsed)) { - if (!existing[key]) { - existing[key] = parsed[key] - } + dynamicDocumentRef.syncVariablesSchema(this.template.variables_schema, parsed, { disable }) } - - for (const key of Object.keys(existing)) { - if (!parsed[key]) { - if (disable) { - existing[key].disabled = true - } else { - delete existing[key] - } - } else { - delete existing[key].disabled - - if (!existing[key].form_type) { - existing[key].type = parsed[key].type - } - - if (parsed[key].items) { - if (!existing[key].items) { - existing[key].items = parsed[key].items - } else if (existing[key].items.properties && parsed[key].items.properties) { - this.syncVariablesSchema(existing[key].items.properties, parsed[key].items.properties, { disable }) - } else if (!existing[key].items.properties && !parsed[key].items.properties) { - existing[key].items.type = parsed[key].items.type - } - } - - if (existing[key].properties && parsed[key].properties) { - this.syncVariablesSchema(existing[key].properties, parsed[key].properties, { disable }) - } - } - } - }, - reconcileDynamicFields () { - const dynamicFieldUuids = new Set() - - this.dynamicDocuments.forEach((doc) => { - const body = doc.body || '' - const uuidRegex = /uuid="([^"]+)"/g - let match - - while ((match = uuidRegex.exec(body)) !== null) { - dynamicFieldUuids.add(match[1]) - } - }) - - const toRemove = this.template.fields.filter((field) => { - if (field.areas && field.areas.length > 0) return false - - return field.uuid && !dynamicFieldUuids.has(field.uuid) - }) - - toRemove.forEach((field) => { - this.template.fields.splice(this.template.fields.indexOf(field), 1) - }) - - this.save() } } } diff --git a/app/javascript/template_builder/dynamic_area.vue b/app/javascript/template_builder/dynamic_area.vue index 8a4cb89e..53fb2566 100644 --- a/app/javascript/template_builder/dynamic_area.vue +++ b/app/javascript/template_builder/dynamic_area.vue @@ -5,7 +5,6 @@ :draggable="editable" :style="[nodeStyle]" @mousedown="selectArea" - @click.stop @dragstart="onDragStart" @contextmenu.prevent.stop="onContextMenu" > @@ -25,7 +24,14 @@ {{ field.default_value }} + > + + +