diff --git a/app/javascript/template_builder/builder.vue b/app/javascript/template_builder/builder.vue index 26a62bcd5..f8c2580bc 100644 --- a/app/javascript/template_builder/builder.vue +++ b/app/javascript/template_builder/builder.vue @@ -3,8 +3,10 @@ ref="dragContainer" style="max-width: 1600px" :class="nativeView ? (isSheetView ? 'bg-base-100' : 'px-4') : 'mx-auto pl-3 md:pl-4 h-full'" + @dragstart="isInternalDrag = true" + @dragend="isInternalDrag = false" @dragover="onDragover" - @drop="isDragFile = false" + @drop="[isDragFile = false, isInternalDrag = false]" > item.type.startsWith('image/'))) { + if (!e.defaultPrevented) { + e.preventDefault() + + e.dataTransfer.dropEffect = 'none' + } + } else { + this.isDragFile = true + } } }, onWindowDragLeave (event) { diff --git a/app/javascript/template_builder/dynamic_section.vue b/app/javascript/template_builder/dynamic_section.vue index 260a1b768..5842e2091 100644 --- a/app/javascript/template_builder/dynamic_section.vue +++ b/app/javascript/template_builder/dynamic_section.vue @@ -639,6 +639,20 @@ export default { if (!file) return + const image = await this.uploadImage(file) + + if (image) { + this.editor.chain().focus().insertContent(image).run() + } + }, + async insertImageFiles (files, pos) { + const images = (await Promise.all(files.map(this.uploadImage))).filter(Boolean) + + if (images.length) { + this.editor.chain().focus().insertContentAt(pos, images).run() + } + }, + async uploadImage (file) { const formData = new FormData() formData.append('file', file) @@ -656,9 +670,7 @@ export default { await this.$nextTick() - this.editor.chain().focus() - .insertContent({ type: 'image', attrs: { htmlAttrs: { src: `blob:${data.uuid}`, style: 'max-width: 100%' } } }) - .run() + return { type: 'image', attrs: { htmlAttrs: { src: `blob:${data.uuid}`, style: 'max-width: 100%' } } } }, setDynamicMenuCoords (editor) { const { from, to } = editor.state.selection @@ -975,7 +987,7 @@ export default { onSelectedAreaChange () { this.save() }, - onFieldDrop (view, event, _slice, moved) { + onFieldDrop (view, event, slice, moved) { this.isAreaDrag = false if (moved) { @@ -983,8 +995,9 @@ export default { } const draggedField = this.fieldsDragFieldRef?.value || this.customDragFieldRef?.value || this.dragField + const imageFiles = slice.size ? [] : Array.from(event.dataTransfer.files).filter((file) => file.type.startsWith('image/')) - if (!draggedField) return false + if (!draggedField && !imageFiles.length) return false event.preventDefault() @@ -992,14 +1005,18 @@ export default { if (!pos) return false - this.insertFieldAtRange({ - sourceField: draggedField, - existingField: this.fieldsDragFieldRef?.value, - from: pos.pos - }) + if (draggedField) { + this.insertFieldAtRange({ + sourceField: draggedField, + existingField: this.fieldsDragFieldRef?.value, + from: pos.pos + }) - this.fieldsDragFieldRef.value = null - this.customDragFieldRef.value = null + this.fieldsDragFieldRef.value = null + this.customDragFieldRef.value = null + } else { + this.insertImageFiles(imageFiles, pos.pos) + } return true },