From 6626a2b602309a81626e0dabf23bc8d41ca5a579 Mon Sep 17 00:00:00 2001 From: Pete Matsyburka Date: Sat, 11 Nov 2023 23:36:03 +0200 Subject: [PATCH] add default builder fields --- app/javascript/template_builder/builder.vue | 44 +++++++---- app/javascript/template_builder/fields.vue | 73 ++++++++++++------- app/javascript/template_builder/icon_drag.vue | 31 ++++++++ 3 files changed, 108 insertions(+), 40 deletions(-) create mode 100644 app/javascript/template_builder/icon_drag.vue diff --git a/app/javascript/template_builder/builder.vue b/app/javascript/template_builder/builder.vue index 98e321bf..809f6fe1 100644 --- a/app/javascript/template_builder/builder.vue +++ b/app/javascript/template_builder/builder.vue @@ -123,7 +123,7 @@ :areas-index="fieldAreasIndex[document.uuid]" :selected-submitter="selectedSubmitter" :document="document" - :is-drag="!!dragFieldType" + :is-drag="!!dragField" :draw-field="drawField" :editable="editable" :base-url="baseUrl" @@ -222,12 +222,13 @@ :fields="template.fields" :submitters="template.submitters" :selected-submitter="selectedSubmitter" + :default-fields="defaultFields" :with-sticky-submitters="withStickySubmitters" :editable="editable" @set-draw="drawField = $event" - @set-drag="dragFieldType = $event" + @set-drag="dragField = $event" @change-submitter="selectedSubmitter = $event" - @drag-end="dragFieldType = null" + @drag-end="dragField = null" @scroll-to-area="scrollToArea" /> @@ -300,6 +301,16 @@ export default { required: false, default: true }, + defaultFields: { + type: Array, + required: false, + default: () => [] + }, + defaultSubmitters: { + type: Array, + required: false, + default: () => [] + }, acceptFileTypes: { type: String, required: false, @@ -343,7 +354,7 @@ export default { isSaving: false, selectedSubmitter: null, drawField: null, - dragFieldType: null + dragField: null } }, computed: { @@ -375,6 +386,13 @@ export default { } }, created () { + this.defaultSubmitters.forEach((name, index) => { + const submitter = (this.template.submitters[index] ||= {}) + + submitter.name = name + submitter.uuid ||= v4() + }) + this.selectedSubmitter = this.template.submitters[0] }, mounted () { @@ -567,13 +585,13 @@ export default { onDropfield (area) { const field = { name: '', - type: this.dragFieldType, uuid: v4(), submitter_uuid: this.selectedSubmitter.uuid, - required: this.dragFieldType !== 'checkbox' + required: this.dragField.type !== 'checkbox', + ...this.dragField } - if (['select', 'multiple', 'radio'].includes(this.dragFieldType)) { + if (['select', 'multiple', 'radio'].includes(field.type)) { field.options = [''] } @@ -588,27 +606,27 @@ export default { let baseArea - if (this.selectedField?.type === this.dragFieldType) { + if (this.selectedField?.type === field.type) { baseArea = this.selectedAreaRef.value } else if (previousField?.areas?.length) { baseArea = previousField.areas[previousField.areas.length - 1] } else { - if (['checkbox'].includes(this.dragFieldType)) { + if (['checkbox'].includes(field.type)) { baseArea = { w: area.maskW / 30 / area.maskW, h: area.maskW / 30 / area.maskW * (area.maskW / area.maskH) } - } else if (this.dragFieldType === 'image') { + } else if (field.type === 'image') { baseArea = { w: area.maskW / 5 / area.maskW, h: (area.maskW / 5 / area.maskW) * (area.maskW / area.maskH) } - } else if (this.dragFieldType === 'signature') { + } else if (field.type === 'signature') { baseArea = { w: area.maskW / 5 / area.maskW, h: (area.maskW / 5 / area.maskW) * (area.maskW / area.maskH) / 2 } - } else if (this.dragFieldType === 'initials') { + } else if (field.type === 'initials') { baseArea = { w: area.maskW / 10 / area.maskW, h: area.maskW / 35 / area.maskW @@ -625,7 +643,7 @@ export default { fieldArea.h = baseArea.h fieldArea.y = fieldArea.y - baseArea.h / 2 - if (this.dragFieldType === 'cells') { + if (field.type === 'cells') { fieldArea.cell_w = baseArea.cell_w || (baseArea.w / 5) } diff --git a/app/javascript/template_builder/fields.vue b/app/javascript/template_builder/fields.vue index ddd4fed5..81ede9c4 100644 --- a/app/javascript/template_builder/fields.vue +++ b/app/javascript/template_builder/fields.vue @@ -32,6 +32,35 @@ @set-draw="$emit('set-draw', $event)" /> +
+
+ +
- - - - - - - - - +
@@ -134,12 +140,15 @@ import { v4 } from 'uuid' import FieldType from './field_type' import FieldSubmitter from './field_submitter' import { IconLock } from '@tabler/icons-vue' +import IconDrag from './icon_drag' export default { name: 'TemplateFields', components: { Field, + FieldType, FieldSubmitter, + IconDrag, IconLock }, inject: ['save', 'backgroundColor', 'withPhone'], @@ -153,6 +162,11 @@ export default { required: false, default: true }, + defaultFields: { + type: Array, + required: false, + default: () => [] + }, withStickySubmitters: { type: Boolean, required: false, @@ -178,11 +192,16 @@ export default { fieldIcons: FieldType.computed.fieldIcons, submitterFields () { return this.fields.filter((f) => f.submitter_uuid === this.selectedSubmitter.uuid) + }, + submitterDefaultFields () { + return this.defaultFields.filter((f) => { + return !this.fields.find((field) => field.name === f.name) && (!f.role || f.role === this.selectedSubmitter.name) + }) } }, methods: { - onDragstart (fieldType) { - this.$emit('set-drag', fieldType) + onDragstart (field) { + this.$emit('set-drag', field) }, onFieldDragover (e) { const targetFieldUuid = e.target.closest('[data-uuid]')?.dataset?.uuid diff --git a/app/javascript/template_builder/icon_drag.vue b/app/javascript/template_builder/icon_drag.vue new file mode 100644 index 00000000..a4f0afd4 --- /dev/null +++ b/app/javascript/template_builder/icon_drag.vue @@ -0,0 +1,31 @@ + + +