Hover-Effekt für Drop angepasst
This commit is contained in:
parent
5855b1e453
commit
3c2d1af118
@ -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
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|||||||
@ -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>
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user