allow to drag new fields into page

pull/105/head
Alex Turchyn 2 years ago
parent 97c462ead2
commit 91b955a39f

@ -35,7 +35,9 @@
:areas-index="fieldAreasIndex[document.uuid]" :areas-index="fieldAreasIndex[document.uuid]"
:document="document" :document="document"
:is-draw="!!drawField" :is-draw="!!drawField"
:is-drag="!!dragFieldType"
@draw="onDraw" @draw="onDraw"
@drop-field="onDropfield"
/> />
</div> </div>
<div <div
@ -55,8 +57,11 @@
<div> <div>
FIelds FIelds
<Fields <Fields
ref="fields"
v-model:fields="flow.fields" v-model:fields="flow.fields"
@set-draw="drawField = $event" @set-draw="drawField = $event"
@set-drag="dragFieldType = $event"
@drag-end="dragFieldType = null"
/> />
</div> </div>
</div> </div>
@ -84,6 +89,7 @@ export default {
data () { data () {
return { return {
drawField: null, drawField: null,
dragFieldType: null,
flow: { flow: {
name: '', name: '',
schema: [], schema: [],
@ -134,6 +140,9 @@ export default {
this.drawField = null this.drawField = null
}, },
onDropfield (area) {
this.$refs.fields.addField(this.dragFieldType, area)
},
updateFromUpload ({ schema, documents }) { updateFromUpload ({ schema, documents }) {
this.flow.schema.push(...schema) this.flow.schema.push(...schema)
this.flow.documents.push(...documents) this.flow.documents.push(...documents)

@ -5,8 +5,10 @@
:number="index" :number="index"
:areas="areasIndex[index]" :areas="areasIndex[index]"
:is-draw="isDraw" :is-draw="isDraw"
:is-drag="isDrag"
:class="{ 'cursor-crosshair': isDraw }" :class="{ 'cursor-crosshair': isDraw }"
:image="image" :image="image"
@drop-field="$emit('drop-field', {...$event, attachment_uuid: document.uuid })"
@draw="$emit('draw', {...$event, attachment_uuid: document.uuid })" @draw="$emit('draw', {...$event, attachment_uuid: document.uuid })"
/> />
</template> </template>
@ -32,9 +34,14 @@ export default {
type: Boolean, type: Boolean,
required: false, required: false,
default: false default: false
},
isDrag: {
type: Boolean,
required: false,
default: false
} }
}, },
emits: ['draw'], emits: ['draw', 'drop-field'],
computed: { computed: {
sortedPreviewImages () { sortedPreviewImages () {
return [...this.document.preview_images].sort((a, b) => parseInt(a.filename) - parseInt(b.filename)) return [...this.document.preview_images].sort((a, b) => parseInt(a.filename) - parseInt(b.filename))

@ -1,6 +1,11 @@
<template> <template>
<div>
<button @click="$emit('remove', field)">
Remove
</button>
<div> <div>
{{ field.type }} {{ field.type }}
</div>
<div v-if="field.type !== 'signature'"> <div v-if="field.type !== 'signature'">
<label>Name</label> <label>Name</label>
<input <input
@ -24,7 +29,10 @@
Remove Remove
</button> </button>
</div> </div>
<button @click="field.options.push('')"> <button
v-if="field.options"
@click="field.options.push('')"
>
Add option Add option
</button> </button>
</div> </div>
@ -66,7 +74,7 @@ export default {
required: true required: true
} }
}, },
emits: ['set-draw'], emits: ['set-draw', 'remove'],
computed: { computed: {
areas () { areas () {
return this.field.areas || [] return this.field.areas || []

@ -5,16 +5,42 @@
:key="field.uuid" :key="field.uuid"
class="border" class="border"
:field="field" :field="field"
@remove="fields.splice(fields.indexOf($event), 1)"
@set-draw="$emit('set-draw', $event)" @set-draw="$emit('set-draw', $event)"
/> />
</div> </div>
<button <button
v-for="item in fieldTypes" v-for="item in fieldTypes"
:key="item.type" :key="item.type"
class="block w-full" draggable="true"
class="w-full flex items-center justify-center"
@dragstart="onDragstart(item.value)"
@dragend="$emit('drag-end')"
@click="addField(item.value)" @click="addField(item.value)"
> >
<svg
xmlns="http://www.w3.org/2000/svg"
class="cursor-move"
width="18"
height="18"
viewBox="0 0 24 24"
stroke-width="2"
stroke="currentColor"
fill="none"
stroke-linecap="round"
stroke-linejoin="round"
>
<path
stroke="none"
d="M0 0h24v24H0z"
fill="none"
/>
<path d="M4 6l16 0" />
<path d="M4 12l16 0" />
<path d="M4 18l16 0" />
</svg>
Add {{ item.label }} Add {{ item.label }}
&plus;
</button> </button>
</template> </template>
@ -33,7 +59,7 @@ export default {
required: true required: true
} }
}, },
emits: ['set-draw'], emits: ['set-draw', 'set-drag', 'drag-end'],
computed: { computed: {
fieldTypes () { fieldTypes () {
return [ return [
@ -49,7 +75,10 @@ export default {
} }
}, },
methods: { methods: {
addField (type) { onDragstart (fieldType) {
this.$emit('set-drag', fieldType)
},
addField (type, area = null) {
const field = { const field = {
name: type === 'signature' ? 'Signature' : '', name: type === 'signature' ? 'Signature' : '',
uuid: v4(), uuid: v4(),
@ -61,6 +90,10 @@ export default {
field.options = [''] field.options = ['']
} }
if (area) {
field.areas = [area]
}
this.fields.push(field) this.fields.push(field)
} }
} }

@ -28,12 +28,14 @@
/> />
</div> </div>
<div <div
v-show="isDraw || showMask" v-show="isDraw || isDrag || showMask"
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"
@pointerdown="onPointerdown" @pointerdown="onPointerdown"
@pointermove="onPointermove" @pointermove="onPointermove"
@dragover.prevent
@drop="onDrop"
@pointerup="onPointerup" @pointerup="onPointerup"
/> />
</div> </div>
@ -62,12 +64,17 @@ export default {
required: false, required: false,
default: false default: false
}, },
isDrag: {
type: Boolean,
required: false,
default: false
},
number: { number: {
type: Number, type: Number,
required: true required: true
} }
}, },
emits: ['draw'], emits: ['draw', 'drop-field'],
data () { data () {
return { return {
scale: 1, scale: 1,
@ -95,6 +102,15 @@ export default {
onResize () { onResize () {
this.scale = this.$refs.image.clientWidth / this.image.metadata.width this.scale = this.$refs.image.clientWidth / this.image.metadata.width
}, },
onDrop (e) {
this.$emit('drop-field', {
x: e.layerX / this.scale,
y: e.layerY / this.scale,
w: 200,
h: 40,
page: this.number
})
},
onPointerdown (e) { onPointerdown (e) {
if (this.isDraw) { if (this.isDraw) {
this.newArea = { this.newArea = {

Loading…
Cancel
Save