From 970977e4698b9e5b29031b8c0e90370168d6710e Mon Sep 17 00:00:00 2001 From: Pete Matsyburka Date: Tue, 27 Feb 2024 01:41:57 +0200 Subject: [PATCH] allow to drag existing field on the page --- app/javascript/template_builder/builder.vue | 42 ++++++++++++++------- app/javascript/template_builder/fields.vue | 15 +++----- app/javascript/template_builder/page.vue | 4 +- 3 files changed, 36 insertions(+), 25 deletions(-) diff --git a/app/javascript/template_builder/builder.vue b/app/javascript/template_builder/builder.vue index 227ce948..90b19df9 100644 --- a/app/javascript/template_builder/builder.vue +++ b/app/javascript/template_builder/builder.vue @@ -324,7 +324,8 @@ export default { withPayment: this.withPayment, withFormula: this.withFormula, defaultDrawFieldType: this.defaultDrawFieldType, - selectedAreaRef: computed(() => this.selectedAreaRef) + selectedAreaRef: computed(() => this.selectedAreaRef), + fieldsDragFieldRef: computed(() => this.fieldsDragFieldRef) } }, props: { @@ -480,6 +481,7 @@ export default { }, computed: { selectedAreaRef: () => ref(), + fieldsDragFieldRef: () => ref(), fieldAreasIndex () { const areas = {} @@ -811,7 +813,7 @@ export default { } }, onDropfield (area) { - const field = { + const field = this.fieldsDragFieldRef.value || { name: '', uuid: v4(), submitter_uuid: this.selectedSubmitter.uuid, @@ -819,17 +821,19 @@ export default { ...this.dragField } - if (['select', 'multiple', 'radio'].includes(field.type)) { - field.options = [{ value: '', uuid: v4() }] - } + if (!this.fieldsDragFieldRef.value) { + if (['select', 'multiple', 'radio'].includes(field.type)) { + field.options = [{ value: '', uuid: v4() }] + } - if (field.type === 'stamp') { - field.readonly = true - } + if (field.type === 'stamp') { + field.readonly = true + } - if (field.type === 'date') { - field.preferences = { - format: Intl.DateTimeFormat().resolvedOptions().locale.endsWith('-US') ? 'MM/DD/YYYY' : 'DD/MM/YYYY' + if (field.type === 'date') { + field.preferences = { + format: Intl.DateTimeFormat().resolvedOptions().locale.endsWith('-US') ? 'MM/DD/YYYY' : 'DD/MM/YYYY' + } } } @@ -885,11 +889,23 @@ export default { fieldArea.cell_w = baseArea.cell_w || (baseArea.w / 5) } - field.areas = [fieldArea] + field.areas ||= [] + + const lastArea = field.areas[field.areas.length - 1] + + if (lastArea) { + fieldArea.x -= lastArea.w / 2 + fieldArea.w = lastArea.w + fieldArea.h = lastArea.h + } + + field.areas.push(fieldArea) this.selectedAreaRef.value = fieldArea - this.template.fields.push(field) + if (this.template.fields.indexOf(field) === -1) { + this.template.fields.push(field) + } this.save() }, diff --git a/app/javascript/template_builder/fields.vue b/app/javascript/template_builder/fields.vue index 9224e485..8abe3de6 100644 --- a/app/javascript/template_builder/fields.vue +++ b/app/javascript/template_builder/fields.vue @@ -24,11 +24,11 @@ :data-uuid="field.uuid" :field="field" :type-index="fields.filter((f) => f.type === field.type).indexOf(field)" - :editable="editable && (!dragField || dragField !== field)" + :editable="editable && (!fieldsDragFieldRef.value || fieldsDragFieldRef.value !== field)" :default-field="defaultFields.find((f) => f.name === field.name)" :draggable="editable" - @dragstart="dragField = field" - @dragend="dragField = null" + @dragstart="fieldsDragFieldRef.value = field" + @dragend="fieldsDragFieldRef.value = null" @remove="removeField" @scroll-to="$emit('scroll-to-area', $event)" @set-draw="$emit('set-draw', $event)" @@ -154,7 +154,7 @@ export default { IconDrag, IconLock }, - inject: ['save', 'backgroundColor', 'withPhone', 'withPayment', 't'], + inject: ['save', 'backgroundColor', 'withPhone', 'withPayment', 't', 'fieldsDragFieldRef'], props: { fields: { type: Array, @@ -205,11 +205,6 @@ export default { } }, emits: ['set-draw', 'set-drag', 'drag-end', 'scroll-to-area', 'change-submitter'], - data () { - return { - dragField: null - } - }, computed: { fieldNames: FieldType.computed.fieldNames, fieldIcons: FieldType.computed.fieldIcons, @@ -239,7 +234,7 @@ export default { }, onFieldDragover (e) { const targetField = e.target.closest('[data-uuid]') - const dragField = this.$refs.fields.querySelector(`[data-uuid="${this.dragField.uuid}"]`) + const dragField = this.$refs.fields.querySelector(`[data-uuid="${this.fieldsDragFieldRef.value.uuid}"]`) if (dragField && targetField && targetField !== dragField) { const fields = Array.from(this.$refs.fields.children) diff --git a/app/javascript/template_builder/page.vue b/app/javascript/template_builder/page.vue index 88bcc9be..0da13943 100644 --- a/app/javascript/template_builder/page.vue +++ b/app/javascript/template_builder/page.vue @@ -39,7 +39,7 @@ />