Allow moving grid components using the label

This commit is contained in:
Andrew Kingston 2024-08-14 10:59:06 +01:00
parent f99ae6b96e
commit b62371d1be
No known key found for this signature in database
4 changed files with 48 additions and 25 deletions

View File

@ -3040,7 +3040,7 @@
"editable": true, "editable": true,
"size": { "size": {
"width": 400, "width": 400,
"height": 32 "height": 60
}, },
"settings": [ "settings": [
{ {
@ -3071,7 +3071,7 @@
"editable": true, "editable": true,
"size": { "size": {
"width": 400, "width": 400,
"height": 32 "height": 60
}, },
"settings": [ "settings": [
{ {
@ -3207,7 +3207,7 @@
"editable": true, "editable": true,
"size": { "size": {
"width": 400, "width": 400,
"height": 50 "height": 60
}, },
"settings": [ "settings": [
{ {
@ -3309,7 +3309,7 @@
"editable": true, "editable": true,
"size": { "size": {
"width": 400, "width": 400,
"height": 50 "height": 60
}, },
"settings": [ "settings": [
{ {
@ -3395,7 +3395,7 @@
"editable": true, "editable": true,
"size": { "size": {
"width": 400, "width": 400,
"height": 50 "height": 60
}, },
"settings": [ "settings": [
{ {
@ -3481,7 +3481,7 @@
"editable": true, "editable": true,
"size": { "size": {
"width": 400, "width": 400,
"height": 50 "height": 60
}, },
"settings": [ "settings": [
{ {
@ -3695,7 +3695,7 @@
"editable": true, "editable": true,
"size": { "size": {
"width": 400, "width": 400,
"height": 50 "height": 60
}, },
"settings": [ "settings": [
{ {
@ -3901,8 +3901,8 @@
"editable": true, "editable": true,
"requiredAncestors": ["form"], "requiredAncestors": ["form"],
"size": { "size": {
"width": 20, "width": 400,
"height": 20 "height": 60
}, },
"settings": [ "settings": [
{ {
@ -4028,7 +4028,7 @@
"editable": true, "editable": true,
"size": { "size": {
"width": 400, "width": 400,
"height": 150 "height": 100
}, },
"settings": [ "settings": [
{ {
@ -4152,7 +4152,7 @@
"editable": true, "editable": true,
"size": { "size": {
"width": 400, "width": 400,
"height": 50 "height": 60
}, },
"settings": [ "settings": [
{ {
@ -4270,7 +4270,7 @@
"styles": ["size"], "styles": ["size"],
"size": { "size": {
"width": 400, "width": 400,
"height": 50 "height": 60
}, },
"settings": [ "settings": [
{ {
@ -4430,7 +4430,7 @@
"styles": ["size"], "styles": ["size"],
"size": { "size": {
"width": 400, "width": 400,
"height": 50 "height": 60
}, },
"settings": [ "settings": [
{ {
@ -4785,7 +4785,7 @@
"editable": true, "editable": true,
"size": { "size": {
"width": 400, "width": 400,
"height": 50 "height": 60
}, },
"settings": [ "settings": [
{ {

View File

@ -3,7 +3,13 @@
import { builderStore, componentStore } from "stores" import { builderStore, componentStore } from "stores"
import { Utils, memo } from "@budibase/frontend-core" import { Utils, memo } from "@budibase/frontend-core"
import { GridRowHeight } from "constants" import { GridRowHeight } from "constants"
import { isGridEvent, GridParams, getGridVar, Devices } from "utils/grid" import {
isGridEvent,
GridParams,
getGridVar,
Devices,
GridDragModes,
} from "utils/grid"
const context = getContext("context") const context = getContext("context")
@ -49,7 +55,7 @@
let deltaX = Math.round(diffX / colSize) let deltaX = Math.round(diffX / colSize)
const diffY = mouseY - startY const diffY = mouseY - startY
let deltaY = Math.round(diffY / GridRowHeight) let deltaY = Math.round(diffY / GridRowHeight)
if (mode === "move") { if (mode === GridDragModes.Move) {
deltaX = minMax(deltaX, 1 - colStart, cols + 1 - colEnd) deltaX = minMax(deltaX, 1 - colStart, cols + 1 - colEnd)
deltaY = Math.max(deltaY, 1 - rowStart) deltaY = Math.max(deltaY, 1 - rowStart)
const newStyles = { const newStyles = {
@ -59,7 +65,7 @@
[vars.rowEnd]: rowEnd + deltaY, [vars.rowEnd]: rowEnd + deltaY,
} }
styles.set(newStyles) styles.set(newStyles)
} else if (mode === "resize") { } else if (mode === GridDragModes.Resize) {
let newStyles = {} let newStyles = {}
if (side === "right") { if (side === "right") {
newStyles[vars.colEnd] = Math.max(colEnd + deltaX, colStart + 1) newStyles[vars.colEnd] = Math.max(colEnd + deltaX, colStart + 1)
@ -103,14 +109,13 @@
// Extract state // Extract state
let mode, id, side let mode, id, side
if (e.target.classList.contains("anchor")) { if (e.target.dataset.indicator === "true") {
// Handle resize mode = e.target.dataset.dragMode
mode = "resize"
id = e.target.dataset.id id = e.target.dataset.id
side = e.target.dataset.side side = e.target.dataset.side
} else { } else {
// Handle move // Handle move
mode = "move" mode = GridDragModes.Move
const component = e.target.closest(".component") const component = e.target.closest(".component")
id = component.dataset.id id = component.dataset.id
} }

View File

@ -1,5 +1,6 @@
<script> <script>
import { Icon } from "@budibase/bbui" import { Icon } from "@budibase/bbui"
import { GridDragModes } from "utils/grid"
export let top export let top
export let left export let left
@ -38,7 +39,16 @@
class:hCompact={width < 40} class:hCompact={width < 40}
> >
{#if text || icon} {#if text || icon}
<div class="label" class:flipped class:line class:right={alignRight}> <div
class="label"
class:flipped
class:line
class:right={alignRight}
draggable="true"
data-indicator="true"
data-drag-mode={GridDragModes.Move}
data-id={componentId}
>
{#if icon} {#if icon}
<Icon name={icon} size="S" color="white" /> <Icon name={icon} size="S" color="white" />
{/if} {/if}
@ -52,8 +62,10 @@
{#if showResizeAnchors} {#if showResizeAnchors}
{#each AnchorSides as side} {#each AnchorSides as side}
<div <div
draggable="true"
class="anchor {side}" class="anchor {side}"
draggable="true"
data-indicator="true"
data-drag-mode={GridDragModes.Resize}
data-side={side} data-side={side}
data-id={componentId} data-id={componentId}
> >
@ -101,6 +113,7 @@
justify-content: flex-start; justify-content: flex-start;
align-items: center; align-items: center;
gap: 6px; gap: 6px;
pointer-events: all;
} }
.label.line { .label.line {
transform: translateY(-50%); transform: translateY(-50%);

View File

@ -38,17 +38,22 @@ export const Devices = {
Mobile: "mobile", Mobile: "mobile",
} }
export const GridDragModes = {
Resize: "resize",
Move: "move",
}
// Builds a CSS variable name for a certain piece of grid metadata // Builds a CSS variable name for a certain piece of grid metadata
export const getGridVar = (device, param) => `--grid-${device}-${param}` export const getGridVar = (device, param) => `--grid-${device}-${param}`
// Determines whether a JS event originated from immediately within a grid // Determines whether a JS event originated from immediately within a grid
export const isGridEvent = e => { export const isGridEvent = e => {
return ( return (
e.target.dataset.indicator === "true" ||
e.target e.target
.closest?.(".component") .closest?.(".component")
?.parentNode.closest(".component") ?.parentNode.closest(".component")
?.childNodes[0]?.classList?.contains("grid") || ?.childNodes[0]?.classList?.contains("grid")
e.target.classList.contains("anchor")
) )
} }