From 12c767b7d31554d3ac99ccbd70ab6458aa0ed7a1 Mon Sep 17 00:00:00 2001 From: Alex Turchyn Date: Fri, 30 Jan 2026 16:17:49 +0200 Subject: [PATCH] add more options to context menu --- app/javascript/template_builder/area.vue | 12 + app/javascript/template_builder/builder.vue | 24 +- .../template_builder/context_menu.vue | 546 ---------- app/javascript/template_builder/document.vue | 10 +- .../template_builder/field_context_menu.vue | 999 ++++++++++++++++++ .../template_builder/field_context_modal.vue | 49 + .../field_context_submenu.vue | 147 +++ .../template_builder/field_settings.vue | 20 +- .../template_builder/formula_modal.vue | 5 +- app/javascript/template_builder/i18n.js | 56 + app/javascript/template_builder/page.vue | 55 +- .../template_builder/page_context_menu.vue | 159 +++ .../selection_context_menu.vue | 350 ++++++ 13 files changed, 1835 insertions(+), 597 deletions(-) delete mode 100644 app/javascript/template_builder/context_menu.vue create mode 100644 app/javascript/template_builder/field_context_menu.vue create mode 100644 app/javascript/template_builder/field_context_modal.vue create mode 100644 app/javascript/template_builder/field_context_submenu.vue create mode 100644 app/javascript/template_builder/page_context_menu.vue create mode 100644 app/javascript/template_builder/selection_context_menu.vue diff --git a/app/javascript/template_builder/area.vue b/app/javascript/template_builder/area.vue index b690173b..85b4f76a 100644 --- a/app/javascript/template_builder/area.vue +++ b/app/javascript/template_builder/area.vue @@ -134,6 +134,7 @@ @focusout="maybeBlurSettings" > +
+ The dots menu is retired in favor of the field context menu. Right-click the field to access field settings. Double-click the field to set a default value. +
@@ -468,6 +475,11 @@ export default { required: false, default: null }, + isMobile: { + type: Boolean, + required: false, + default: false + }, isSelectMode: { type: Boolean, required: false, diff --git a/app/javascript/template_builder/builder.vue b/app/javascript/template_builder/builder.vue index a871e7cf..34953da1 100644 --- a/app/javascript/template_builder/builder.vue +++ b/app/javascript/template_builder/builder.vue @@ -374,6 +374,7 @@ :draw-field-type="drawFieldType" :draw-custom-field="drawCustomField" :editable="editable" + :is-mobile="isMobile" :base-url="baseUrl" :with-fields-detection="withFieldsDetection" @draw="[onDraw($event), withSelectedFieldType ? '' : drawFieldType = '', drawCustomField = null, showDrawField = false]" @@ -382,9 +383,9 @@ @paste-field="pasteField" @copy-field="copyField" @add-custom-field="addCustomField" + @set-draw="[drawField = $event.field, drawOption = $event.option]" @copy-selected-areas="copySelectedAreas" @delete-selected-areas="deleteSelectedAreas" - @align-selected-areas="alignSelectedAreas" @autodetect-fields="detectFieldsForPage" /> a.x)) - areas.forEach((area) => { area.x = targetValue }) - } else if (direction === 'right') { - targetValue = Math.max(...areas.map(a => a.x + a.w)) - areas.forEach((area) => { area.x = targetValue - area.w }) - } else if (direction === 'top') { - targetValue = Math.min(...areas.map(a => a.y)) - areas.forEach((area) => { area.y = targetValue }) - } else if (direction === 'bottom') { - targetValue = Math.max(...areas.map(a => a.y + a.h)) - areas.forEach((area) => { area.y = targetValue - area.h }) - } - - this.save() - }, download () { this.isDownloading = true diff --git a/app/javascript/template_builder/context_menu.vue b/app/javascript/template_builder/context_menu.vue deleted file mode 100644 index 4eea766c..00000000 --- a/app/javascript/template_builder/context_menu.vue +++ /dev/null @@ -1,546 +0,0 @@ - - - diff --git a/app/javascript/template_builder/document.vue b/app/javascript/template_builder/document.vue index fea0ed05..83b2c486 100644 --- a/app/javascript/template_builder/document.vue +++ b/app/javascript/template_builder/document.vue @@ -13,6 +13,7 @@ :with-signature-id="withSignatureId" :with-prefillable="withPrefillable" :is-drag="isDrag" + :is-mobile="isMobile" :with-field-placeholder="withFieldPlaceholder" :default-fields="defaultFields" :drag-field-placeholder="dragFieldPlaceholder" @@ -30,9 +31,9 @@ @copy-field="$emit('copy-field', $event)" @paste-field="$emit('paste-field', { ...$event, attachment_uuid: document.uuid })" @add-custom-field="$emit('add-custom-field', $event)" + @set-draw="$emit('set-draw', $event)" @copy-selected-areas="$emit('copy-selected-areas')" @delete-selected-areas="$emit('delete-selected-areas')" - @align-selected-areas="$emit('align-selected-areas', $event)" @autodetect-fields="$emit('autodetect-fields', $event)" @scroll-to="scrollToArea" @draw="$emit('draw', { area: {...$event.area, attachment_uuid: document.uuid }, isTooSmall: $event.isTooSmall })" @@ -98,6 +99,11 @@ export default { required: false, default: () => [] }, + isMobile: { + type: Boolean, + required: false, + default: false + }, allowDraw: { type: Boolean, required: false, @@ -138,7 +144,7 @@ export default { default: false } }, - emits: ['draw', 'drop-field', 'remove-area', 'paste-field', 'copy-field', 'copy-selected-areas', 'delete-selected-areas', 'align-selected-areas', 'autodetect-fields', 'add-custom-field'], + emits: ['draw', 'drop-field', 'remove-area', 'paste-field', 'copy-field', 'copy-selected-areas', 'delete-selected-areas', 'autodetect-fields', 'add-custom-field', 'set-draw'], data () { return { pageRefs: [] diff --git a/app/javascript/template_builder/field_context_menu.vue b/app/javascript/template_builder/field_context_menu.vue new file mode 100644 index 00000000..ce304a14 --- /dev/null +++ b/app/javascript/template_builder/field_context_menu.vue @@ -0,0 +1,999 @@ + + + diff --git a/app/javascript/template_builder/field_context_modal.vue b/app/javascript/template_builder/field_context_modal.vue new file mode 100644 index 00000000..7132cc6d --- /dev/null +++ b/app/javascript/template_builder/field_context_modal.vue @@ -0,0 +1,49 @@ + + + diff --git a/app/javascript/template_builder/field_context_submenu.vue b/app/javascript/template_builder/field_context_submenu.vue new file mode 100644 index 00000000..4ba3fb29 --- /dev/null +++ b/app/javascript/template_builder/field_context_submenu.vue @@ -0,0 +1,147 @@ + + + diff --git a/app/javascript/template_builder/field_settings.vue b/app/javascript/template_builder/field_settings.vue index 7c054e79..debf72f8 100644 --- a/app/javascript/template_builder/field_settings.vue +++ b/app/javascript/template_builder/field_settings.vue @@ -10,7 +10,7 @@ @change="[field.preferences ||= {}, field.preferences.method = $event.target.value, $emit('save')]" >