Hover-Effekt für Drop angepasst

This commit is contained in:
= 2025-02-26 21:29:38 +01:00
parent 5855b1e453
commit 3c2d1af118
2 changed files with 42 additions and 12 deletions

View File

@ -43,12 +43,8 @@ export default defineComponent({
return componentMap[this.element.type] || null; return componentMap[this.element.type] || null;
}, },
}, },
mounted() {
console.log("✅ ComponentRenderer geladen für:", this.element);
},
methods: { methods: {
updateSchema(newItems) { updateSchema(newItems) {
console.log("🔥 `update-schema` Event empfangen (Component-Renderer)! Neue Items:", newItems);
this.$emit("update-schema", newItems); // 🔥 Leitet die Änderung weiter this.$emit("update-schema", newItems); // 🔥 Leitet die Änderung weiter
}, },
}, },

View File

@ -1,6 +1,6 @@
<template> <template>
<div> <div>
<div class="flex-layout" :class="computedDirection" @dragover.prevent="onDragOver" @drop="onDrop"> <div class="flex-layout" :class="[computedDirection, { 'drag-over': dragOverActive }]" @dragover.prevent="onDragOver" @dragleave="onDragLeave" @drop="onDrop">
<component-renderer v-for="(item, key) in items" :key="key" :element="item" @update-schema="updateChildItems(key, $event)" /> <component-renderer v-for="(item, key) in items" :key="key" :element="item" @update-schema="updateChildItems(key, $event)" />
</div> </div>
</div> </div>
@ -13,6 +13,12 @@ import ComponentRenderer from "@/components/formDesigner/ComponentRenderer.vue";
export default defineComponent({ export default defineComponent({
name: "FlexLayoutRenderer", name: "FlexLayoutRenderer",
components: { ComponentRenderer }, components: { ComponentRenderer },
data() {
return {
dragOverActive: false,
hasParentFlexLayout: false,
};
},
props: { props: {
direction: { direction: {
type: String, type: String,
@ -27,14 +33,18 @@ export default defineComponent({
computedDirection() { computedDirection() {
return this.direction === "horizontal" ? "horizontal" : "vertical"; return this.direction === "horizontal" ? "horizontal" : "vertical";
}, },
isInnerMostLayout() {
return !this.items.some((item) => item.type === "FlexLayout") && this.hasParentFlexLayout;
},
isOuterLayout() {
return !this.hasParentFlexLayout;
},
}, },
methods: { methods: {
/** /**
* 🔄 Aktualisiert verschachtelte FlexLayouts * 🔄 Aktualisiert verschachtelte FlexLayouts
*/ */
updateChildItems(index, newItems) { updateChildItems(index, newItems) {
console.log("✅ Event erhalten in updateChildItems! Index:", index, "Neue Items:", newItems);
const updatedItems = [...this.items]; const updatedItems = [...this.items];
updatedItems[index] = { ...updatedItems[index], items: newItems }; // Tiefere Rekursion möglich updatedItems[index] = { ...updatedItems[index], items: newItems }; // Tiefere Rekursion möglich
this.$emit("update-items", updatedItems); // 🔥 Weitergabe an Parent this.$emit("update-items", updatedItems); // 🔥 Weitergabe an Parent
@ -46,7 +56,13 @@ export default defineComponent({
onDragOver(event) { onDragOver(event) {
event.preventDefault(); event.preventDefault();
event.stopPropagation(); event.stopPropagation();
console.log("🚀 Drag over auf FlexLayout:", this.direction); if (this.isInnerMostLayout) {
this.dragOverActive = true;
} else if (this.isOuterLayout) {
this.dragOverActive = true;
} else {
this.dragOverActive = false;
}
}, },
/** /**
@ -55,18 +71,26 @@ export default defineComponent({
onDrop(event) { onDrop(event) {
event.preventDefault(); event.preventDefault();
event.stopPropagation(); event.stopPropagation();
this.dragOverActive = false;
const droppedType = event.dataTransfer.getData("text/plain"); const droppedType = event.dataTransfer.getData("text/plain");
console.log("📦 Element auf FlexLayout gedroppt:", droppedType);
const newElement = this.createElementByType(droppedType); const newElement = this.createElementByType(droppedType);
if (newElement) { if (newElement) {
const updatedItems = [...this.items, newElement]; // Neue Liste mit Element const updatedItems = [...this.items, newElement]; // Neue Liste mit Element
console.log("📌 🔥 `update-items` gesendet:", updatedItems);
this.$emit("update-items", updatedItems); // 🔥 An Parent weiterleiten this.$emit("update-items", updatedItems); // 🔥 An Parent weiterleiten
} }
}, },
/**
* Wenn das Drag das Layout verlässt
*/
onDragLeave(event) {
event.preventDefault();
event.stopPropagation();
this.dragOverActive = false;
},
/** /**
* 🔧 Erstellt das passende Element basierend auf dem Typ * 🔧 Erstellt das passende Element basierend auf dem Typ
*/ */
@ -90,6 +114,16 @@ export default defineComponent({
} }
}, },
}, },
mounted() {
let parent = this.$parent;
while (parent) {
if (parent.$options.name === "FlexLayoutRenderer") {
this.hasParentFlexLayout = true;
break;
}
parent = parent.$parent;
}
},
}); });
</script> </script>
@ -98,7 +132,6 @@ export default defineComponent({
display: flex; display: flex;
gap: 12px; gap: 12px;
min-height: 50px; min-height: 50px;
border: 2px dashed transparent;
} }
.horizontal { .horizontal {
@ -110,6 +143,7 @@ export default defineComponent({
} }
.flex-layout.drag-over { .flex-layout.drag-over {
border: 2px dashed blue; border-left: 5px solid var(--bs-primary);
background: rgba(0, 0, 255, 0.03);
} }
</style> </style>