allow to drag existing field on the page

pull/220/head^2
Pete Matsyburka 2 years ago
parent f83674b934
commit 970977e469

@ -324,7 +324,8 @@ export default {
withPayment: this.withPayment, withPayment: this.withPayment,
withFormula: this.withFormula, withFormula: this.withFormula,
defaultDrawFieldType: this.defaultDrawFieldType, defaultDrawFieldType: this.defaultDrawFieldType,
selectedAreaRef: computed(() => this.selectedAreaRef) selectedAreaRef: computed(() => this.selectedAreaRef),
fieldsDragFieldRef: computed(() => this.fieldsDragFieldRef)
} }
}, },
props: { props: {
@ -480,6 +481,7 @@ export default {
}, },
computed: { computed: {
selectedAreaRef: () => ref(), selectedAreaRef: () => ref(),
fieldsDragFieldRef: () => ref(),
fieldAreasIndex () { fieldAreasIndex () {
const areas = {} const areas = {}
@ -811,7 +813,7 @@ export default {
} }
}, },
onDropfield (area) { onDropfield (area) {
const field = { const field = this.fieldsDragFieldRef.value || {
name: '', name: '',
uuid: v4(), uuid: v4(),
submitter_uuid: this.selectedSubmitter.uuid, submitter_uuid: this.selectedSubmitter.uuid,
@ -819,17 +821,19 @@ export default {
...this.dragField ...this.dragField
} }
if (['select', 'multiple', 'radio'].includes(field.type)) { if (!this.fieldsDragFieldRef.value) {
field.options = [{ value: '', uuid: v4() }] if (['select', 'multiple', 'radio'].includes(field.type)) {
} field.options = [{ value: '', uuid: v4() }]
}
if (field.type === 'stamp') { if (field.type === 'stamp') {
field.readonly = true field.readonly = true
} }
if (field.type === 'date') { if (field.type === 'date') {
field.preferences = { field.preferences = {
format: Intl.DateTimeFormat().resolvedOptions().locale.endsWith('-US') ? 'MM/DD/YYYY' : 'DD/MM/YYYY' 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) 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.selectedAreaRef.value = fieldArea
this.template.fields.push(field) if (this.template.fields.indexOf(field) === -1) {
this.template.fields.push(field)
}
this.save() this.save()
}, },

@ -24,11 +24,11 @@
:data-uuid="field.uuid" :data-uuid="field.uuid"
:field="field" :field="field"
:type-index="fields.filter((f) => f.type === field.type).indexOf(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)" :default-field="defaultFields.find((f) => f.name === field.name)"
:draggable="editable" :draggable="editable"
@dragstart="dragField = field" @dragstart="fieldsDragFieldRef.value = field"
@dragend="dragField = null" @dragend="fieldsDragFieldRef.value = null"
@remove="removeField" @remove="removeField"
@scroll-to="$emit('scroll-to-area', $event)" @scroll-to="$emit('scroll-to-area', $event)"
@set-draw="$emit('set-draw', $event)" @set-draw="$emit('set-draw', $event)"
@ -154,7 +154,7 @@ export default {
IconDrag, IconDrag,
IconLock IconLock
}, },
inject: ['save', 'backgroundColor', 'withPhone', 'withPayment', 't'], inject: ['save', 'backgroundColor', 'withPhone', 'withPayment', 't', 'fieldsDragFieldRef'],
props: { props: {
fields: { fields: {
type: Array, type: Array,
@ -205,11 +205,6 @@ export default {
} }
}, },
emits: ['set-draw', 'set-drag', 'drag-end', 'scroll-to-area', 'change-submitter'], emits: ['set-draw', 'set-drag', 'drag-end', 'scroll-to-area', 'change-submitter'],
data () {
return {
dragField: null
}
},
computed: { computed: {
fieldNames: FieldType.computed.fieldNames, fieldNames: FieldType.computed.fieldNames,
fieldIcons: FieldType.computed.fieldIcons, fieldIcons: FieldType.computed.fieldIcons,
@ -239,7 +234,7 @@ export default {
}, },
onFieldDragover (e) { onFieldDragover (e) {
const targetField = e.target.closest('[data-uuid]') 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) { if (dragField && targetField && targetField !== dragField) {
const fields = Array.from(this.$refs.fields.children) const fields = Array.from(this.$refs.fields.children)

@ -39,7 +39,7 @@
/> />
</div> </div>
<div <div
v-show="resizeDirection || isMove || isDrag || showMask || (drawField && isMobile)" v-show="resizeDirection || isMove || isDrag || showMask || (drawField && isMobile) || fieldsDragFieldRef.value"
id="mask" id="mask"
ref="mask" ref="mask"
class="top-0 bottom-0 left-0 right-0 absolute" class="top-0 bottom-0 left-0 right-0 absolute"
@ -61,7 +61,7 @@ export default {
components: { components: {
FieldArea FieldArea
}, },
inject: ['fieldTypes', 'defaultDrawFieldType'], inject: ['fieldTypes', 'defaultDrawFieldType', 'fieldsDragFieldRef'],
props: { props: {
image: { image: {
type: Object, type: Object,

Loading…
Cancel
Save