UNPKG

react-layouts-builder

Version:

Lightweight and powerfull react layouts drag and drop

132 lines (108 loc) 3.71 kB
import { __assign } from '../../node_modules/tslib/tslib.es6.js'; import { LayoutContext } from '../Context/LayoutContext.js'; import React, { useState, useContext, useRef } from 'react'; var DragNDrop = function DragNDrop(_a) { var children = _a.children, layout = _a.layout, handleDrop = _a.handleDrop; var _b = useState(false), isDragging = _b[0], setIsDragging = _b[1]; var _c = useState(), dragOverPosition = _c[0], setDragOverPosition = _c[1]; var _d = useContext(LayoutContext), dataItem = _d.dataItem, setDataItem = _d.setDataItem; var _e = useState(), mouseOver = _e[0], setMouseOver = _e[1]; var ref = useRef(null); var handleDragStart = function handleDragStart(event) { setDataItem(layout); console.log('This run setters'); changeEditable(false); }; var layoutId = layout['@id'] || layout.id; var handleDragOver = function handleDragOver(event) { event.preventDefault(); event.stopPropagation(); if (!dataItem) { return; } setIsDragging(true); if (!ref.current) return; var _a = ref.current, offsetLeft = _a.offsetLeft, offsetTop = _a.offsetTop; // Calculate the height and width of the target element var height = ref.current.offsetHeight; ref.current.offsetWidth; // Calculate the vertical and horizontal thresholds for positioning var verticalThreshold = height / 2; // Calculate the cursor position relative to the target element var cursorY = event.clientY - offsetTop; event.clientX - offsetLeft; // Determine the position based on the cursor position and thresholds // if (cursorX < horizontalThreshold) { // setDragOverPosition('left'); // return; // } else if (cursorX > width - horizontalThreshold) { // setDragOverPosition('right'); // return; // } if (cursorY < verticalThreshold) { setDragOverPosition('top'); return; } else { setDragOverPosition('bottom'); return; } }; var handleDropEvent = function handleDropEvent(event) { event.preventDefault(); var position = dragOverPosition; changeEditable(true); if (dataItem && position) { event.dataTransfer.clearData(); handleDrop({ item: dataItem, targetItemId: layoutId, position: position }); } // Clear the dragged item state setDataItem(undefined); handleDragLeave(); }; var handleDragLeave = function handleDragLeave() { setIsDragging(false); setDragOverPosition(undefined); }; var changeEditable = function changeEditable(b) { var editableElements = document.querySelectorAll('.your-class-name'); editableElements.forEach(function (element) { element.setAttribute('contenteditable', !b ? 'false' : 'true'); }); }; var attrs = layout.block ? { draggable: true, onDragStart: handleDragStart, className: "droppable-container ".concat(isDragging ? "lb-indice drop-".concat(dragOverPosition) : '', " ") } : {}; return /*#__PURE__*/React.createElement("div", __assign({ ref: ref, onDragOver: handleDragOver, onDrop: handleDropEvent, onDragLeave: handleDragLeave }, attrs), /*#__PURE__*/React.createElement("div", { className: "border-hidden ".concat(mouseOver === layoutId ? 'border-gray-200' : ''), onMouseOver: function onMouseOver(e) { e.preventDefault(); e.stopPropagation(); setMouseOver(layoutId); }, onMouseLeave: function onMouseLeave() { return setMouseOver(undefined); } }, /*#__PURE__*/React.createElement("div", { className: "" }, children))); }; export { DragNDrop };