Cleanup
This commit is contained in:
parent
61940705b9
commit
b4fed6a02f
|
@ -1,166 +0,0 @@
|
||||||
<script>
|
|
||||||
import { onDestroy, getContext } from "svelte"
|
|
||||||
import { builderStore, componentStore, screenStore } from "@/stores"
|
|
||||||
import { Utils, memo } from "@budibase/frontend-core"
|
|
||||||
import { GridRowHeight } from "@/constants"
|
|
||||||
import { GridParams, getGridVar, Devices } from "@/utils/grid"
|
|
||||||
|
|
||||||
const context = getContext("context")
|
|
||||||
|
|
||||||
// Smallest possible 1x1 transparent GIF
|
|
||||||
const ghost = new Image(1, 1)
|
|
||||||
ghost.src =
|
|
||||||
"data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw=="
|
|
||||||
|
|
||||||
let dragInfo
|
|
||||||
let styles = memo()
|
|
||||||
|
|
||||||
$: placeholderID = findPlaceholderID($screenStore.activeScreen)
|
|
||||||
$: handleNewPlaceholderID(placeholderID)
|
|
||||||
|
|
||||||
// Grid CSS variables
|
|
||||||
$: device = $context.device.mobile ? Devices.Mobile : Devices.Desktop
|
|
||||||
$: vars = {
|
|
||||||
colStart: getGridVar(device, GridParams.ColStart),
|
|
||||||
colEnd: getGridVar(device, GridParams.ColEnd),
|
|
||||||
rowStart: getGridVar(device, GridParams.RowStart),
|
|
||||||
rowEnd: getGridVar(device, GridParams.RowEnd),
|
|
||||||
}
|
|
||||||
|
|
||||||
// Some memoisation of primitive types for performance
|
|
||||||
$: id = dragInfo?.id
|
|
||||||
|
|
||||||
// Set ephemeral styles
|
|
||||||
$: instance = componentStore.actions.getComponentInstance(id)
|
|
||||||
$: $instance?.setEphemeralStyles($styles)
|
|
||||||
|
|
||||||
const findPlaceholderID = screen => {
|
|
||||||
return screen?.props?._children?.find(c => c._placeholder)?._id
|
|
||||||
}
|
|
||||||
|
|
||||||
const sleep = ms => new Promise(resolve => setTimeout(resolve, ms))
|
|
||||||
|
|
||||||
const handleNewPlaceholderID = async placeholderID => {
|
|
||||||
if (!placeholderID) {
|
|
||||||
stopDragging()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
await sleep(100)
|
|
||||||
onDragStart(placeholderID)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Sugar for a combination of both min and max
|
|
||||||
const minMax = (value, min, max) => Math.min(max, Math.max(min, value))
|
|
||||||
|
|
||||||
const processEvent = Utils.domDebounce((mouseX, mouseY) => {
|
|
||||||
if (!dragInfo?.grid) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
const { grid, domGrid } = dragInfo
|
|
||||||
const { startX, startY, rowStart, rowEnd, colStart, colEnd } = grid
|
|
||||||
if (!domGrid) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
const cols = parseInt(domGrid.dataset.cols)
|
|
||||||
const colSize = parseInt(domGrid.dataset.colSize)
|
|
||||||
const diffX = mouseX - startX
|
|
||||||
let deltaX = Math.round(diffX / colSize)
|
|
||||||
const diffY = mouseY - startY
|
|
||||||
let deltaY = Math.round(diffY / GridRowHeight)
|
|
||||||
deltaX = minMax(deltaX, 1 - colStart, cols + 1 - colEnd)
|
|
||||||
deltaY = Math.max(deltaY, 1 - rowStart)
|
|
||||||
const newStyles = {
|
|
||||||
[vars.colStart]: colStart + deltaX,
|
|
||||||
[vars.colEnd]: colEnd + deltaX,
|
|
||||||
[vars.rowStart]: rowStart + deltaY,
|
|
||||||
[vars.rowEnd]: rowEnd + deltaY,
|
|
||||||
opacity: 1,
|
|
||||||
}
|
|
||||||
styles.set(newStyles)
|
|
||||||
})
|
|
||||||
|
|
||||||
const handleEvent = e => {
|
|
||||||
e.preventDefault()
|
|
||||||
e.stopPropagation()
|
|
||||||
processEvent(e.clientX, e.clientY)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Callback when initially starting a drag on a draggable component
|
|
||||||
const onDragStart = id => {
|
|
||||||
console.log("DRAG START", id)
|
|
||||||
// Find grid parent and read from DOM
|
|
||||||
const domComponent = document.getElementsByClassName(id)[0]
|
|
||||||
const domGrid = domComponent?.closest(".grid")
|
|
||||||
if (!domGrid) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
const styles = getComputedStyle(domComponent)
|
|
||||||
const bounds = domComponent.getBoundingClientRect()
|
|
||||||
|
|
||||||
// Show as active
|
|
||||||
domComponent.classList.add("dragging")
|
|
||||||
domGrid.classList.add("highlight")
|
|
||||||
builderStore.actions.selectComponent(id)
|
|
||||||
|
|
||||||
// Update state
|
|
||||||
dragInfo = {
|
|
||||||
domComponent,
|
|
||||||
domGrid,
|
|
||||||
id,
|
|
||||||
gridId: domGrid.parentNode.dataset.id,
|
|
||||||
grid: {
|
|
||||||
startX: bounds.left + bounds.width / 2,
|
|
||||||
startY: bounds.top + bounds.height / 2,
|
|
||||||
rowStart: parseInt(styles["grid-row-start"]),
|
|
||||||
rowEnd: parseInt(styles["grid-row-end"]),
|
|
||||||
colStart: parseInt(styles["grid-column-start"]),
|
|
||||||
colEnd: parseInt(styles["grid-column-end"]),
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add event handler to clear all drag state when dragging ends
|
|
||||||
document.addEventListener("dragover", onDrag, false)
|
|
||||||
|
|
||||||
// Add event handler to clear all drag state when dragging ends
|
|
||||||
document.addEventListener("dragEnd", stopDragging, false)
|
|
||||||
document.addEventListener("drop", stopDragging, false)
|
|
||||||
}
|
|
||||||
|
|
||||||
const onDrag = e => {
|
|
||||||
if (!dragInfo) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
handleEvent(e)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Callback when drag stops (whether dropped or not)
|
|
||||||
const stopDragging = async () => {
|
|
||||||
if (!dragInfo) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
console.log("END")
|
|
||||||
const { id, domGrid, domComponent } = dragInfo
|
|
||||||
|
|
||||||
// Reset DOM
|
|
||||||
domComponent.classList.remove("dragging")
|
|
||||||
domGrid.classList.remove("highlight")
|
|
||||||
document.removeEventListener("dragover", onDrag, false)
|
|
||||||
document.removeEventListener("dragend", stopDragging, false)
|
|
||||||
document.removeEventListener("drop", stopDragging, false)
|
|
||||||
|
|
||||||
// Save changes
|
|
||||||
if ($styles) {
|
|
||||||
builderStore.actions.updateStyles($styles, id)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Reset state
|
|
||||||
dragInfo = null
|
|
||||||
styles.set(null)
|
|
||||||
}
|
|
||||||
|
|
||||||
onDestroy(() => {
|
|
||||||
document.removeEventListener("dragover", onDrag, false)
|
|
||||||
document.removeEventListener("dragend", stopDragging, false)
|
|
||||||
document.removeEventListener("drop", stopDragging, false)
|
|
||||||
})
|
|
||||||
</script>
|
|
Loading…
Reference in New Issue