|
|
|
@ -10,11 +10,29 @@ |
|
|
|
ChevronDownIcon, |
|
|
|
CopyIcon, |
|
|
|
} from "../common/Icons" |
|
|
|
import { getComponentDefinition } from "builderStore/storeUtils" |
|
|
|
|
|
|
|
export let components = [] |
|
|
|
export let currentComponent |
|
|
|
export let onSelect = () => {} |
|
|
|
export let level = 0 |
|
|
|
|
|
|
|
/* |
|
|
|
"dragDropStore" is a svelte store. |
|
|
|
This component is recursive... a tree. |
|
|
|
Using a single, shared store, all the nodes in the tree can subscribe to state that is changed by other nodes, in the same tree. |
|
|
|
|
|
|
|
e.g. Say i have the structure |
|
|
|
- Heading 1 |
|
|
|
- Container |
|
|
|
- Heading 2 |
|
|
|
- Heading 3 |
|
|
|
- Heading 4 |
|
|
|
|
|
|
|
1. When I dragover "Heading 1", a placeholder drop-slot appears below it |
|
|
|
2. I drag down a bit so the cursor is INSIDE the container (i.e. now in a child <ComponentsHierarchyChildren />) |
|
|
|
3. Using store subscribes... the original drop-slot now knows that it should disappear, and a new one is created inside the container. |
|
|
|
*/ |
|
|
|
export let dragDropStore |
|
|
|
|
|
|
|
let dropUnderComponent |
|
|
|
@ -47,7 +65,7 @@ |
|
|
|
|
|
|
|
const dragover = (component, index) => e => { |
|
|
|
const canHaveChildrenButIsEmpty = |
|
|
|
$store.components[component._component].children && |
|
|
|
getComponentDefinition($store, component._component).children && |
|
|
|
component._children.length === 0 |
|
|
|
|
|
|
|
e.dataTransfer.dropEffect = "copy" |
|
|
|
@ -97,6 +115,15 @@ |
|
|
|
return s |
|
|
|
}) |
|
|
|
} |
|
|
|
|
|
|
|
const dragend = () => { |
|
|
|
dragDropStore.update(s => { |
|
|
|
s.dropPosition = "" |
|
|
|
s.targetComponent = null |
|
|
|
s.componentToDrop = null |
|
|
|
return s |
|
|
|
}) |
|
|
|
} |
|
|
|
</script> |
|
|
|
|
|
|
|
<ul> |
|
|
|
@ -117,6 +144,7 @@ |
|
|
|
class:selected={currentComponent === component} |
|
|
|
style="padding-left: {level * 20 + 40}px" |
|
|
|
draggable={true} |
|
|
|
on:dragend={dragend} |
|
|
|
on:dragstart={dragstart(component)} |
|
|
|
on:dragover={dragover(component, index)} |
|
|
|
on:drop={drop} |
|
|
|
|