UNPKG

@cainiaofe/cn-ui-layout

Version:

- 安装 cone-cli | [Cone-CLI 使用指引](https://alidocs.dingtalk.com/i/nodes/xdqZp24KneBJzvGM6XezJvyb7RA0Nr1E) - `tnpm i -g @alife/cone-cli@latest` - 安装依赖包 - `cone install` - 启动研发 - `cone start`

288 lines (282 loc) 10.7 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); exports.__esModule = true; exports.initSingletonDivider = exports.Divider = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _react = _interopRequireWildcard(require("react")); var _reactDom = _interopRequireDefault(require("react-dom")); var _autoCell = require("./split/auto-cell"); var _const = require("../../../common/util/const"); require("./divider.scss"); function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); } function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; } var FUSION_UI_VIEW_PREFIX = 'fd-layout-view'; var initSingletonDivider = exports.initSingletonDivider = function initSingletonDivider(id) { var dividerId = id || 'default-layout-divider'; var pageC = getPageRootDOMNode(); if (!pageC) return; var $el = pageC.ownerDocument.getElementById(dividerId); if (!$el) { var dividerWrapper = createDividerWrapperNode(dividerId); pageC && pageC.appendChild(dividerWrapper); _reactDom["default"].render(/*#__PURE__*/_react["default"].createElement(Divider, { split: _autoCell.splitNodeByDimension }), dividerWrapper); } }; var Divider = exports.Divider = function Divider(props) { var engine = (0, _react.useRef)(window.parent.AliLowCodeEngine); var _useState = (0, _react.useState)([]), cuts = _useState[0], setCuts = _useState[1]; var _useState2 = (0, _react.useState)(false), disabled = _useState2[0], setDisabled = _useState2[1]; var computCuts = (0, _react.useCallback)(function (selectedNode) { var dimension = getSplitDimension(selectedNode.componentName); var rect = selectedNode.getRect(); var newCuts = []; var pageC = getPageRootDOMNode(); var pageCRect = pageC ? pageC.getBoundingClientRect() : { left: 0, top: 0 }; if (!rect || !pageCRect) { return; } if (dimension.h) { newCuts.push({ dimension: 'h', left: rect.left - pageCRect.left, top: rect.top + rect.height / 2 - pageCRect.top, node: selectedNode }); } if (dimension.v && rect && pageCRect) { newCuts.push({ dimension: 'v', left: rect.left + rect.width / 2 - pageCRect.left, top: rect.top - pageCRect.top, node: selectedNode }); } if (dimension.m) { newCuts.push({ dimension: 'm', left: rect.left + rect.width / 2 - pageCRect.left, top: rect.top + rect.height / 2 - pageCRect.top, node: selectedNode }); } setCuts(newCuts); }, []); var onSelectionChange = (0, _react.useCallback)(function (timer) { if (timer === void 0) { timer = 100; } setDisabled(false); var selectedNode = getSelectedNode(engine.current); if (!selectedNode) { setCuts([]); return; } // TODO // 目前 selectionChang 时 dom 结构可能还在变化 // 会偶尔导致 computCuts 计算尺寸出现问题,需要优化 if (timer) { setTimeout(function () { computCuts(selectedNode); }, timer); } else { computCuts(selectedNode); } }, []); (0, _react.useEffect)(function () { var _project$currentDocum; var project = engine.current.project; if (!project) return; (_project$currentDocum = project.currentDocument) === null || _project$currentDocum === void 0 ? void 0 : _project$currentDocum.onChangeSelection(function () { return onSelectionChange(100); }); }, []); /* // 目前在 resize 开始/结束时会重新计算 // 所以暂时不需要去监听了 const resizeObserver = useRef( new ResizeObserver(() => { onSelectionChange(); }), ); useEffect(() => { engine.current.selection.onSelectionChange(() => { const selectedNode = getSelectedNode(engine.current); try { setTimeout(() => { resizeObserver.current.disconnect(); selectedNode && selectedNode.getDOMNode() && resizeObserver.current.observe(selectedNode.getDOMNode()); }, 50); } catch (error) { console.err(error); } }); }, []); */ var onDisabled = (0, _react.useCallback)(function () { setDisabled(true); }, []); var onEnabled = (0, _react.useCallback)(function () { setDisabled(false); onSelectionChange(0); }, [onSelectionChange]); (0, _react.useEffect)(function () { var contentWindow = engine.current.project.simulator.contentWindow; contentWindow.addEventListener('dividerDisable', onDisabled); contentWindow.addEventListener('dividerEnable', onEnabled); return function () { contentWindow.removeEventListener('dividerDisable', onDisabled); contentWindow.removeEventListener('dividerEnable', onEnabled); }; }, [onDisabled, onEnabled]); if (disabled) return null; return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement(Cut, { pos: cuts.find(function (p) { return p.dimension === 'v'; }), split: props.split }), /*#__PURE__*/_react["default"].createElement(Cut, { pos: cuts.find(function (p) { return p.dimension === 'h'; }), split: props.split })); }; var Cut = function Cut(props) { var _useState3 = (0, _react.useState)(false), showLine = _useState3[0], setLineVisibility = _useState3[1]; var pos = props.pos, split = props.split; if (!pos || !pos.node) return null; var objectRect = pos.node.getRect() || {}; var computeLineStyle = function computeLineStyle() { if ((pos === null || pos === void 0 ? void 0 : pos.dimension) === 'v') { return (0, _extends2["default"])({ width: 1, height: objectRect.height, transform: 'translate(-50%, 0)' }, pos); } else if ((pos === null || pos === void 0 ? void 0 : pos.dimension) === 'h') { return (0, _extends2["default"])({ width: objectRect.width, height: 1 }, pos); } else if ((pos === null || pos === void 0 ? void 0 : pos.dimension) === 'm') { return (0, _extends2["default"])({ width: objectRect.width, height: objectRect.height, transform: 'translate(-50%, 0)' }, pos); } return null; }; var computeCutStyle = function computeCutStyle() { var isNanoSized = objectRect.width <= 60; var getTransform = function getTransform() { var gap = isNanoSized ? 0 : 8; var scale = isNanoSized ? 'scale(.6)' : ''; switch (pos === null || pos === void 0 ? void 0 : pos.dimension) { case 'v': return "translate(-50%, " + gap + "px) " + scale; case 'h': return "translate(" + gap + "px, -50%) rotate(270deg) " + scale; case 'm': default: return "translate(-50%, -50%) rotate(45deg) " + scale; } }; return (0, _extends2["default"])({}, pos, { transform: getTransform() }); }; var lineStyle = computeLineStyle() || {}; return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement("div", { className: FUSION_UI_VIEW_PREFIX + "-divider", style: computeCutStyle(), onMouseEnter: function onMouseEnter() { return setLineVisibility(true); }, onMouseLeave: function onMouseLeave() { return setLineVisibility(false); }, onClick: function onClick() { split(pos.dimension, pos.node); setTimeout(function () { return setLineVisibility(false); }, 20); } }, /*#__PURE__*/_react["default"].createElement("div", { className: FUSION_UI_VIEW_PREFIX + "-dividerImg" })), showLine && (pos.dimension === 'm' ? /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement("div", { className: FUSION_UI_VIEW_PREFIX + "-dividerLine", style: (0, _extends2["default"])({}, lineStyle, { height: 1 }) }), /*#__PURE__*/_react["default"].createElement("div", { className: FUSION_UI_VIEW_PREFIX + "-dividerLine", style: (0, _extends2["default"])({}, lineStyle, { width: 1, top: Number(lineStyle.top) - Number(lineStyle.height) / 2 }) })) : /*#__PURE__*/_react["default"].createElement("div", { className: FUSION_UI_VIEW_PREFIX + "-dividerLine", style: lineStyle }))); }; // utils var getSplitDimension = function getSplitDimension(componentName) { var dimension = { v: false, h: false, m: false }; switch (componentName) { case _const.ROW: case _const.COL: dimension.v = true; dimension.h = true; break; case _const.CELL: dimension.v = true; dimension.h = true; // dimension.m = true; break; case _const.TILE: case _const.BLOCK: dimension.v = true; break; default: break; } return dimension; }; // FIXME:Project类型缺失 var getSelectedNode = function getSelectedNode(_ref) { var _project$currentDocum2; var project = _ref.project; return (_project$currentDocum2 = project.currentDocument) === null || _project$currentDocum2 === void 0 ? void 0 : _project$currentDocum2.selection.getNodes()[0]; }; var getPageRootDOMNode = function getPageRootDOMNode() { var _window$parent$AliLow, _window$parent$AliLow2; return (_window$parent$AliLow = window.parent.AliLowCodeEngine.project.currentDocument) === null || _window$parent$AliLow === void 0 ? void 0 : (_window$parent$AliLow2 = _window$parent$AliLow.root) === null || _window$parent$AliLow2 === void 0 ? void 0 : _window$parent$AliLow2.getDOMNode(); }; var createDividerWrapperNode = function createDividerWrapperNode(dividerId) { var node = document.createElement('div'); node.id = dividerId; node.style.position = 'absolute'; node.style.top = '0'; node.style.left = '0'; node.style.zIndex = '10001'; return node; };