From d314ecf120b451e5e956b8dfe02194349c0d3196 Mon Sep 17 00:00:00 2001 From: Johnson Cherian Date: Mon, 23 Oct 2023 11:45:07 +0530 Subject: [PATCH] feat: updated grid column width to 24 --- frontend/src/Editor/BoxDragPreview.jsx | 2 +- frontend/src/Editor/Container.jsx | 16 ++- frontend/src/Editor/DragContainer.css | 1 + frontend/src/Editor/DragContainer.jsx | 148 +++++++++++++++++--- frontend/src/Editor/DragContainerNested.jsx | 79 ++++++++--- frontend/src/Editor/DraggableBox.jsx | 2 +- frontend/src/Editor/Editor.jsx | 2 +- frontend/src/Editor/EditorFunc.jsx | 4 +- frontend/src/Editor/SubContainer.jsx | 28 +++- frontend/src/_helpers/appUtils.js | 2 +- 10 files changed, 234 insertions(+), 50 deletions(-) diff --git a/frontend/src/Editor/BoxDragPreview.jsx b/frontend/src/Editor/BoxDragPreview.jsx index 01d4565777..92fc8859c9 100644 --- a/frontend/src/Editor/BoxDragPreview.jsx +++ b/frontend/src/Editor/BoxDragPreview.jsx @@ -29,7 +29,7 @@ export const BoxDragPreview = memo(function BoxDragPreview({ item, canvasWidth } return (
({ @@ -384,16 +385,19 @@ export const Container = ({ ...boxesObj, [id]: { ...boxes[id], + component: { + ...boxes[id]['component'], + parent: parent ? parent : boxes[id]['component']?.parent, + }, layouts: { ...boxes[id]['layouts'], [currentLayout]: { ...boxes[id]['layouts'][currentLayout], // ...{ top: layout.y, left: layout.x, height: layout.h, width: layout.w }, top: y, - left: Math.round(x / gridWidth), + left: Math.round(x / (parent ? subContainerWidths[parent] : gridWidth)), }, }, - parent: parent ? parent : boxes[id].parent, }, }), {} @@ -415,7 +419,6 @@ export const Container = ({ // parent: parent ? parent : boxes[id].parent, // }, }; - setBoxes(newBoxes); } @@ -739,6 +742,8 @@ export const Container = ({ currentPageId, childComponents, setIsChildDragged, + setSubContainerWidths: (id, width) => setSubContainerWidths((widths) => ({ ...widths, [id]: width })), + parentGridWidth: gridWidth, }} isVersionReleased={isVersionReleased} /> @@ -755,7 +760,7 @@ export const Container = ({ drop(el); }} style={{ ...styles, height: canvasHeight }} - className={cx('real-canvas', { + className={cx('real-canvas show-grid', { 'show-grid': isDragging || isResizing, })} id="real-canvas" @@ -795,6 +800,7 @@ export const Container = ({ onDrag={onDragStop2} gridWidth={gridWidth} selectedComponents={selectedComponents} + setIsDragging={setIsDragging} /> {/* {Object.keys(boxes).map((key) => { const box = boxes[key]; diff --git a/frontend/src/Editor/DragContainer.css b/frontend/src/Editor/DragContainer.css index 5c71362e7d..769108a94d 100644 --- a/frontend/src/Editor/DragContainer.css +++ b/frontend/src/Editor/DragContainer.css @@ -11,4 +11,5 @@ /* font-weight: bold; */ border: 1px solid #333; box-sizing: border-box; + /* transition: transform 0.1s; */ } \ No newline at end of file diff --git a/frontend/src/Editor/DragContainer.jsx b/frontend/src/Editor/DragContainer.jsx index 4424f808ff..c211c678c4 100644 --- a/frontend/src/Editor/DragContainer.jsx +++ b/frontend/src/Editor/DragContainer.jsx @@ -5,7 +5,7 @@ import { shallow } from 'zustand/shallow'; import './DragContainer.css'; import DragContainerNested from './DragContainerNested'; import { isEmpty } from 'lodash'; -const NO_OF_GRIDS = 43; +const NO_OF_GRIDS = 24; export default function DragContainer({ boxes, @@ -15,6 +15,7 @@ export default function DragContainer({ onDrag, gridWidth, selectedComponents = [], + setIsDragging, }) { const [dragTarget, setDragTarget] = useState(); const [draggedTarget, setDraggedTarget] = useState(); @@ -25,20 +26,21 @@ export default function DragContainer({ left: box?.layouts?.desktop?.left, top: box?.layouts?.desktop?.top, width: box?.layouts?.desktop?.width, - parent: box.parent, + parent: box?.component?.parent, })); const [list, setList] = useState(boxList); + console.log('>>>>>>>>>>>>>> Rerender'); const hoveredComponent = useEditorStore((state) => state?.hoveredComponent, shallow); useEffect(() => { moveableRef.current.updateRect(); - window.moveableRef = moveableRef.current.updateRect; - }, [selectedComponents.length]); + setTimeout(() => moveableRef.current.updateRect(), 100); + }, [selectedComponents.length, JSON.stringify(boxes)]); useEffect(() => { setList(boxList); - }, [boxes?.length]); + }, [JSON.stringify(boxes)]); const [isChildDragged, setIsChildDragged] = useState(false); @@ -58,15 +60,21 @@ export default function DragContainer({ }; const groupedTargets = [...selectedComponents.map((component) => '.ele-' + component.id)]; + console.log('selectedComponents', selectedComponents); const movableTargets = [groupedTargets]; + console.log('selectedComponents movableTargets', movableTargets); + console.log('selectedComponents hoveredComponent', hoveredComponent); if (hoveredComponent && !groupedTargets?.length) { movableTargets.push('.ele-' + hoveredComponent); } + console.log('selectedComponents draggedTarget', draggedTarget); if (draggedTarget && !movableTargets.includes(`.ele-${draggedTarget}`)) { movableTargets.push('.ele-' + draggedTarget); } + console.log('selectedComponents movableTargets', movableTargets, isChildDragged); + // console.log("movableTargets", movableTargets, hoveredComponent); return ( @@ -81,6 +89,7 @@ export default function DragContainer({ key={i.id} id={i.id} widgetid={i.id} + widget-pos={JSON.stringify(boxes.find((b) => b.id === i.id)?.layouts?.desktop)} style={{ transform: `translate(332px, -134px)`, ...getDimensions(i.id) }} > {/* Target {i.id} */} @@ -100,14 +109,15 @@ export default function DragContainer({ 1} // hideChildMoveableDefaultLines={false} // individualGroupable={true} individualGroupable={selectedComponents.length <= 1} draggable={true} resizable={true} keepRatio={false} - rotatable={true} + // rotatable={true} key={list.length} individualGroupableProps={(element) => { if (element?.classList.contains('target2')) { @@ -117,16 +127,96 @@ export default function DragContainer({ } }} onResize={(e) => { + // console.log('Resize >>>>>>>>>>>>>>', e); + const width = Math.round(e.width / gridWidth) * gridWidth; + + const currentLayout = list.find(({ id }) => id === e.target.id); + const currentWidth = currentLayout.width * gridWidth; + const diffWidth = e.width - currentWidth; + const diffHeight = e.height - currentLayout.height; + console.log('currentLayout width', currentWidth, e.width, diffWidth, e.direction); + const isLeftChanged = e.direction[0] === -1; + const isTopChanged = e.direction[1] === -1; + + console.log( + 'currentLayout transform', + `translate(${currentLayout.left * gridWidth}px, ${currentLayout.top}px)`, + `translate(${currentLayout.left * gridWidth - diffWidth}px, ${currentLayout.top}px)` + ); + e.target.style.width = `${e.width}px`; e.target.style.height = `${e.height}px`; - e.target.style.transform = e.drag.transform; + let transformX = currentLayout.left * gridWidth; + let transformY = currentLayout.top; + if (isLeftChanged) { + transformX = currentLayout.left * gridWidth - diffWidth; + } + if (isTopChanged) { + transformY = currentLayout.top - diffHeight; + } + e.target.style.transform = `translate(${transformX}px, ${transformY}px)`; + + // e.target.style.transform = e.drag.transform; + // onResizeStop([ + // { + // id: e.target.id, + // height: e.height, + // width: width, + // x: e.drag.translate[0], + // y: e.drag.translate[1], + // }, + // ]); + }} + onResizeEnd={(e) => { + console.log('onResizeEnd>>>>>>>>>>>>>>', e); + // const width = Math.round(e.lastEvent.width / gridWidth) * gridWidth; + // e.target.style.width = `${width}px`; + // e.target.style.height = `${e.lastEvent.height}px`; + // e.target.style.transform = e.lastEvent.drag.transform; + // onResizeStop([ + // { + // id: e.target.id, + // height: e.lastEvent.height, + // width: width, + // x: e.lastEvent.drag.translate[0], + // y: e.lastEvent.drag.translate[1], + // }, + // ]); + + const width = Math.round(e.lastEvent.width / gridWidth) * gridWidth; + const height = Math.round(e.lastEvent.height / 10) * 10; + + const currentLayout = list.find(({ id }) => id === e.target.id); + const currentWidth = currentLayout.width * gridWidth; + const diffWidth = e.lastEvent.width - currentWidth; + const diffHeight = e.lastEvent.height - currentLayout.height; + console.log('onResizeEnd data', currentWidth, e.width, diffWidth, e.direction, diffHeight); + const isLeftChanged = e.lastEvent.direction[0] === -1; + const isTopChanged = e.lastEvent.direction[1] === -1; + + console.log( + 'onResizeEnd => currentLayout transform', + `translate(${currentLayout.left * gridWidth}px, ${currentLayout.top}px)`, + `translate(${currentLayout.left * gridWidth - diffWidth}px, ${currentLayout.top}px)` + ); + + let transformX = currentLayout.left * gridWidth; + let transformY = currentLayout.top; + if (isLeftChanged) { + transformX = currentLayout.left * gridWidth - diffWidth; + } + if (isTopChanged) { + transformY = currentLayout.top - diffHeight; + } + + // e.target.style.transform = e.drag.transform; onResizeStop([ { id: e.target.id, - height: e.height, - width: e.width, - x: e.drag.translate[0], - y: e.drag.translate[1], + height: height, + width: width, + x: transformX, + y: transformY, }, ]); }} @@ -147,7 +237,9 @@ export default function DragContainer({ onResizeStop(newBoxs); }} checkInput + onDragStart={() => setIsDragging(true)} onDragEnd={(e) => { + setIsDragging(false); console.log('onDragEnd', e); setDraggedTarget(); if (isChildDragged) { @@ -173,8 +265,21 @@ export default function DragContainer({ console.log('draggedOverElem =>', draggedOverElem?.id, dragTarget); draggedOverElemId = draggedOverElem?.id; } + // console.log("draggedOverElemId", draggedOverElemId); + const parentElem = list.find(({ id }) => id === draggedOverElemId); + let left = e.lastEvent.translate[0]; + let top = e.lastEvent.translate[1]; + if (parentElem) { + left = left - parentElem.left * gridWidth; + top = top - parentElem.top; + } onDrag([ - { id: e.target.id, x: e.lastEvent.translate[0], y: e.lastEvent.translate[1], parent: draggedOverElemId }, + { + id: e.target.id, + x: left, + y: top, + parent: draggedOverElemId, + }, ]); }} onDrag={(e) => { @@ -185,9 +290,16 @@ export default function DragContainer({ // onDrag(e.target.id, e.translate[0], e.translate[1]); // console.log(e.target.style); if (!isChildDragged) { - e.target.style.transform = `translate(${Math.round(e.translate[0] / gridWidth) * gridWidth}px, ${ - Math.round(e.translate[1] / 10) * 10 - }px)`; + // e.target.style.transform = `translate(${Math.round(e.translate[0] / gridWidth) * gridWidth}px, ${ + // Math.round(e.translate[1] / 10) * 10 + // }px)`; + e.target.style.transform = `translate(${e.translate[0]}px, ${e.translate[1]}px)`; + e.target.setAttribute( + 'widget-pos2', + `translate: ${e.translate[0]} | Round: ${ + Math.round(e.translate[0] / gridWidth) * gridWidth + } | ${gridWidth}` + ); } // let draggedOverElemId; @@ -218,7 +330,9 @@ export default function DragContainer({ }} //snap settgins snappable={true} - snapDirections={{ top: true, left: true, bottom: true, right: true }} + // snapDirections={{ top: true, left: true, bottom: true, right: true }} + snapDirections={{ top: true, left: true, bottom: true, right: true, center: true, middle: true }} + elementSnapDirections={{ top: true, left: true, bottom: true, right: true, center: true, middle: true }} snapThreshold={5} elementGuidelines={list.map((l) => ({ element: `.ele-${l.id}` }))} // verticalGuidelines={[50, 150, 250, 450, 550]} diff --git a/frontend/src/Editor/DragContainerNested.jsx b/frontend/src/Editor/DragContainerNested.jsx index efa853a4c0..13379d802b 100644 --- a/frontend/src/Editor/DragContainerNested.jsx +++ b/frontend/src/Editor/DragContainerNested.jsx @@ -1,8 +1,17 @@ import React, { useState, useEffect, useRef } from 'react'; -import Moveable from 'react-moveable'; +import Moveable, { makeAble } from 'react-moveable'; import './DragContainer.css'; import { isEmpty } from 'lodash'; -const NO_OF_GRIDS = 43; +const NO_OF_GRIDS = 24; + +const MouseEnterLeaveAble = makeAble('enterLeave', { + mouseEnter(moveable) { + console.log('moveable', moveable); + }, + mouseLeave(moveable) { + console.log('moveable2', moveable); + }, +}); export default function DragContainer({ boxes, @@ -14,6 +23,7 @@ export default function DragContainer({ setIsChildDragged, parent, parentLayout, + parentGridWidth, }) { const [dragTarget, setDragTarget] = useState(); const boxList = boxes.map((box) => ({ @@ -32,7 +42,7 @@ export default function DragContainer({ useEffect(() => { moveableRef.current.updateRect(); - }, [...Object.values(parentLayout)]); + }, [...Object.values(parentLayout), boxes?.length]); // const [isChildDragged, setIsChildDragged] = useState(false); @@ -78,11 +88,16 @@ export default function DragContainer({ { if (element?.classList.contains('target2')) { @@ -101,29 +116,59 @@ export default function DragContainer({ checkInput onDrag={(e) => { setIsChildDragged(true); - onDrag(e.target.id, e.translate[0], e.translate[1]); // if (!isChildDragged) { e.target.style.transform = `translate(${Math.round(e.translate[0] / gridWidth) * gridWidth}px, ${ Math.round(e.translate[1] / 10) * 10 }px)`; // } - // let draggedOverElemId; - // if (document.elementFromPoint(e.clientX, e.clientY)) { - // const targetElems = document.elementsFromPoint(e.clientX, e.clientY); - // // targetElems.forEach((e) => console.log('Element=>', { id: e.id, clist: e.classList, class: e.className })); - // const draggedOverElem = targetElems.find( - // (ele) => ele.id !== e.target.id && ele.classList.contains('target') - // ); - // setDragTarget(draggedOverElem?.id); - // console.log('draggedOverElem =>', draggedOverElem?.id, dragTarget); - // draggedOverElemId = draggedOverElem?.id; - // } + let draggedOverElemId; + if (document.elementFromPoint(e.clientX, e.clientY)) { + const targetElems = document.elementsFromPoint(e.clientX, e.clientY); + // targetElems.forEach((e) => console.log('Element=>', { id: e.id, clist: e.classList, class: e.className })); + const draggedOverElem = targetElems.find( + (ele) => ele.id !== e.target.id && ele.classList.contains('target') + ); + setDragTarget(draggedOverElem?.id); + console.log('draggedOverElem =>', draggedOverElem?.id, dragTarget); + draggedOverElemId = draggedOverElem?.id; + } + console.log('draggedOverElemId child', draggedOverElemId); + // onDrag(e.target.id, e.translate[0], e.translate[1], draggedOverElemId); }} //snap settgins snappable={true} - onDragEnd={() => setIsChildDragged(false)} + onDragEnd={(e) => { + setIsChildDragged(false); + // if (!isChildDragged) { + // e.target.style.transform = `translate(${Math.round(e.translate[0] / gridWidth) * gridWidth}px, ${ + // Math.round(e.translate[1] / 10) * 10 + // }px)`; + // } + + let draggedOverElemId; + if (document.elementFromPoint(e.clientX, e.clientY)) { + const targetElems = document.elementsFromPoint(e.clientX, e.clientY); + // targetElems.forEach((e) => console.log('Element=>', { id: e.id, clist: e.classList, class: e.className })); + const draggedOverElem = targetElems.find( + (ele) => ele.id !== e.target.id && ele.classList.contains('target') + ); + setDragTarget(draggedOverElem?.id); + console.log('draggedOverElem =>', draggedOverElem?.id, dragTarget); + draggedOverElemId = draggedOverElem?.id; + } + let left = e.lastEvent.translate[0]; + let top = e.lastEvent.translate[1]; + console.log('draggedOverElemId child', draggedOverElemId); + if (!draggedOverElemId) { + left = left + parentLayout.left * (parentGridWidth / 24); + top = top + parentLayout.top; + } + // onDrag(e.target.id, e.translate[0], e.translate[1], draggedOverElemId); + + onDrag(e.target.id, left, top, draggedOverElemId); + }} snapDirections={{ top: true, left: true, bottom: true, right: true }} snapThreshold={5} elementGuidelines={list.map((l) => ({ element: `.ele-${l.id}` }))} diff --git a/frontend/src/Editor/DraggableBox.jsx b/frontend/src/Editor/DraggableBox.jsx index 2871b1852d..a73e03a9c7 100644 --- a/frontend/src/Editor/DraggableBox.jsx +++ b/frontend/src/Editor/DraggableBox.jsx @@ -13,7 +13,7 @@ import { useCurrentState } from '@/_stores/currentStateStore'; import { useEditorStore } from '@/_stores/editorStore'; import { shallow } from 'zustand/shallow'; -const NO_OF_GRIDS = 43; +const NO_OF_GRIDS = 24; const resizerClasses = { topRight: 'top-right', diff --git a/frontend/src/Editor/Editor.jsx b/frontend/src/Editor/Editor.jsx index a23b645080..f2a333d471 100644 --- a/frontend/src/Editor/Editor.jsx +++ b/frontend/src/Editor/Editor.jsx @@ -760,7 +760,7 @@ class EditorComponent extends React.Component { let top = draft[selectedComponent.id].layouts[this.props.currentLayout].top; let left = draft[selectedComponent.id].layouts[this.props.currentLayout].left; - const gridWidth = (1 * 100) / 43; // width of the canvas grid in percentage + const gridWidth = (1 * 100) / 24; // width of the canvas grid in percentage switch (direction) { case 'ArrowLeft': diff --git a/frontend/src/Editor/EditorFunc.jsx b/frontend/src/Editor/EditorFunc.jsx index 207fd770a8..1b2a2f2ba3 100644 --- a/frontend/src/Editor/EditorFunc.jsx +++ b/frontend/src/Editor/EditorFunc.jsx @@ -1145,7 +1145,7 @@ const EditorComponent = (props) => { }; const moveComponents = (direction) => { - const gridWidth = (1 * 100) / 43; // width of the canvas grid in percentage + const gridWidth = (1 * 100) / 24; // width of the canvas grid in percentage const _appDefinition = _.cloneDeep(appDefinition); let newComponents = _appDefinition?.pages[currentPageId].components; @@ -1689,7 +1689,7 @@ const EditorComponent = (props) => { {!showComments && ( { //Todo add custom resolve vars for other widgets too const mounted = useMounted(); @@ -109,6 +111,7 @@ export const SubContainer = ({ const [boxes, setBoxes] = useState(allComponents); const [childWidgets, setChildWidgets] = useState([]); + console.log('childWidgets', childWidgets); const [isDragging, setIsDragging] = useState(false); const [isResizing, setIsResizing] = useState(false); // const [subContainerHeight, setSubContainerHeight] = useState('100%'); //used to determine the height of the sub container for modal @@ -121,6 +124,13 @@ export const SubContainer = ({ // eslint-disable-next-line react-hooks/exhaustive-deps }, [allComponents, parent]); + const containerWidth = getContainerCanvasWidth(); + + useEffect(() => { + setSubContainerWidths(parent, containerWidth / NO_OF_GRIDS); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [containerWidth]); + useEffect(() => { if (mounted) { //find children with parent prop @@ -516,6 +526,7 @@ export const SubContainer = ({ }; function onDragStop2(id, x, y, parent) { + // const parentGridWidth = parentGridWidth; let newBoxes = { ...boxes, [id]: { @@ -526,10 +537,13 @@ export const SubContainer = ({ ...boxes[id]['layouts'][currentLayout], // ...{ top: layout.y, left: layout.x, height: layout.h, width: layout.w }, top: y, - left: Math.round(x / gridWidth), + left: Math.round(x / (parent ? gridWidth : parentGridWidth)), }, }, - parent: parent ? parent : boxes[id].parent, + component: { + ...boxes[id]['component'], + parent: !parent ? parent : boxes[id]['component']?.parent, + }, }, }; @@ -606,13 +620,16 @@ export const SubContainer = ({ } const renderWidget = (key, height) => { - console.log(key, height); + console.log('childeWidget', key, height); + if (!childWidgets[key]) { + return; + } const addDefaultChildren = childWidgets[key]['withDefaultChildren'] || false; const box = childWidgets[key]; const canShowInCurrentLayout = box.component.definition.others[currentLayout === 'mobile' ? 'showOnMobile' : 'showOnDesktop'].value; - if (box.parent && resolveReferences(canShowInCurrentLayout, currentState)) { + if (box.component.parent && resolveReferences(canShowInCurrentLayout, currentState)) { return ( {/* {checkParentVisibility() && Object.keys(childWidgets).map((key) => { diff --git a/frontend/src/_helpers/appUtils.js b/frontend/src/_helpers/appUtils.js index a0b852ca72..e0a5e4afcb 100644 --- a/frontend/src/_helpers/appUtils.js +++ b/frontend/src/_helpers/appUtils.js @@ -1658,7 +1658,7 @@ export const addNewWidgetToTheEditor = ( [left, top] = snapToGrid(subContainerWidth, left, top); } - const gridWidth = subContainerWidth / 43; + const gridWidth = subContainerWidth / 24; left = Math.round(left / gridWidth); console.log('Top calc', { top, initialClientOffset, delta, zoomLevel, offsetFromTopOfWindow, subContainerWidth }); // left = (left * 100) / subContainerWidth;