UNPKG

@rxflow/base

Version:

BaseFlow - 核心 Flow 组件库

238 lines (233 loc) 9.41 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Flow = Flow; require("@xyflow/react/dist/style.css"); var _components = require("./components"); var _hooks = require("./hooks"); var _react = require("@xyflow/react"); var _ahooks = require("ahooks"); var _lodash = require("lodash"); var _react2 = _interopRequireWildcard(require("react")); var _Controls = _interopRequireDefault(require("./components/Controls")); var _DebugInfo = require("./components/DebugInfo"); var _manhattan = require("./edges/manhattan"); var _useGetEdgesChangeHandlers = require("./hooks/edges/useGetEdgesChangeHandlers"); var _useSetNodeDragging = require("./hooks/node/useSetNodeDragging"); var _useForceUpdateTimes = require("./hooks/render/useForceUpdateTimes"); var _useListenRender = require("./hooks/useListenRender"); var _scrollbar = require("./plugins/scrollbar"); var _hasDimensionsChange = require("./utils/hasDimensionsChange"); require("./index.less"); var _base = require("./utils/layouts/base"); var _jsxRuntime = require("react/jsx-runtime"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (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 && Object.prototype.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; } /** * @author: yanxianliang * @date: 2025-07-27 16:33 * @modified:2025/7/27 16:33 by yanxianliang * @desc: Flow * * Copyright (c) 2025 by yanxianliang, All Rights Reserved. */ const proOptions = { hideAttribution: true }; // 默认隐藏水印 function Flow(props) { const { width, height, showControls = true, // 默认开启 controlsPosition = 'top-right', controlsOrientation, showMiniMap, showLegend, background = '#F2F7FAFF', // 默认背景色 showFullscreen, showForceLayout, showInteractive, showFitView, showZoom, onlyRenderVisibleElements = true, // 默认开启虚拟渲染 rootStyle: _rootStyle, fitViewOptions, nodes, edges, layout = _base.baseLayout, autoCenter = false, omitProps = [], // 不向下透传的属性 forceLayout = !!props.layout, // 是否强制布局,如果强制布局会监控节点的dimension改变事件,自动触发布局计算 getMiniMapNodeColor, markers, plugins, readOnly, onZoomOut, onZoomIn, onFitView, onInteractiveChange, customControls, nodeTypes: _nodeTypes, onEdgesChange, children, forceFitView } = props; (0, _useListenRender.useListenRender)(); // 性能监听 hook const [minimapVisible, setMinimapVisible] = (0, _react2.useState)(!!(showMiniMap && !showControls)); // 不显示控制器是默认按照字段控制 miniMap显示状态 const storeApi = (0, _react.useStoreApi)(); const containerRef = (0, _react2.useRef)(null); const theme = (0, _hooks.useTheme)(); const themeVars = (0, _hooks.useThemeVars)(); const nodeTypes = (0, _hooks.useNodeTypes)(_nodeTypes); // 获取注册的节点类型 const forceUpdateTimes = (0, _useForceUpdateTimes.useForceUpdateTimes)(); const triggerLayout = (0, _hooks.useForceUpdate)(); const setNodeDragging = (0, _useSetNodeDragging.useSetNodeDragging)(); const instance = (0, _react.useReactFlow)(); const getState = (0, _hooks.useGetState)(); const rootStyle = (0, _react2.useMemo)(() => { return { width: typeof width === 'number' ? `${width}px` : width, height: typeof height === 'number' ? `${height}px` : height, ..._rootStyle, ...themeVars }; }, [width, height, _rootStyle, themeVars]); const { nodes: _nodes, edges: _edges } = (0, _react2.useMemo)(() => { const store = storeApi.getState(); return layout({ nodeTypes, originNodes: nodes || [], originEdges: edges || [], theme, onlyRenderVisibleElements, // 不支持修改该参数 store, state: getState(), flowProps: props }); }, [nodes, edges, forceUpdateTimes]); const flowProps = (0, _react2.useMemo)(() => { const options = { selectNodesOnDrag: false, preventScrolling: true, panOnScroll: false, zoomOnScroll: true, nodesDraggable: false, proOptions: proOptions, fitViewOptions: { nodes: _nodes?.length && autoCenter ? [_nodes[0]] : undefined, ...props.fitViewOptions }, fitView: true, onlyRenderVisibleElements, ...(0, _lodash.omit)(props, ['flowInstanceRef', 'width', 'height', 'nodes', 'edges', 'fitViewOptions', 'theme', 'background', 'nodeTypes', 'showControls', 'showMiniMap', 'autoCenter', 'rootStyle', 'layout', 'onNodesChange', 'omitProps', 'forceLayout', 'controlsPosition', 'getMiniMapNodeColor', 'markers', 'onBeforeLayout', 'onLayout', 'onAfterLayout', 'plugins', 'readOnly', 'showFitView', 'showFullscreen', 'showInteractive', 'showZoom', 'showForceLayout', 'onInteractiveChange', 'onZoomOut', 'onZoomIn', 'onFitView', 'customControls', 'controlsOrientation', ...omitProps]), edgeTypes: { manhattan: _manhattan.ManhattanEdge, ...(props.edgeTypes || {}) } }; if (plugins?.scroller) { // 只读模式也需要 options.zoomOnScroll = false; options.panOnScroll = true; options.panOnDrag = options.panOnDrag ?? [1, 2]; options.selectionOnDrag = options.selectionOnDrag ?? true; options.selectionMode = options.selectionMode ?? _react.SelectionMode.Partial; } if (readOnly) { options.nodesDraggable = false; options.nodesConnectable = false; options.elementsSelectable = false; } return options; }, [props, _nodes, readOnly, onlyRenderVisibleElements]); const onNodesChange = (0, _ahooks.useMemoizedFn)(changes => { if (forceLayout && (0, _hasDimensionsChange.hasDimensionsChange)(changes)) { // 强制布局 triggerLayout(); } props.onNodesChange?.(changes); }); const onNodeDragStart = (0, _ahooks.useMemoizedFn)((event, node, nodes) => { setNodeDragging(true); flowProps.onNodeDragStart?.(event, node, nodes); }); const onNodeDragStop = (0, _ahooks.useMemoizedFn)((event, node, nodes) => { setNodeDragging(false); flowProps.onNodeDragStop?.(event, node, nodes); }); const getEdgesChangeHandlers = (0, _useGetEdgesChangeHandlers.useGetEdgesChangeHandlers)(); const _onEdgesChange = (0, _ahooks.useMemoizedFn)(changes => { onEdgesChange?.(changes); // 触发注册事件 getEdgesChangeHandlers()?.forEach(onEdgesChange => { onEdgesChange?.(changes); }); }); (0, _react2.useEffect)(() => { if (forceFitView) { instance.fitView(fitViewOptions); } }, [nodes]); return /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", { ref: containerRef, style: rootStyle, children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_DebugInfo.DebugInfo, { debug: props.debug }), markers ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_components.MarkerDefinitions, { marks: markers }) : null, /*#__PURE__*/(0, _jsxRuntime.jsxs)(_react.ReactFlow, { nodeTypes: nodeTypes, ...flowProps, nodes: _nodes, edges: _edges, onNodesChange: onNodesChange, onNodeDragStart: onNodeDragStart, onNodeDragStop: onNodeDragStop, onEdgesChange: _onEdgesChange, children: [plugins?.scroller ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_scrollbar.Scrollbar, { ...plugins.scroller, width: width, height: height }) : null, /*#__PURE__*/(0, _jsxRuntime.jsx)(_react.Background, { bgColor: background, className: 'rxflow-bg-hide-pattern', variant: _react.BackgroundVariant.Lines }), minimapVisible && /*#__PURE__*/(0, _jsxRuntime.jsx)(_react.MiniMap, { zoomable: true, pannable: true, nodeColor: getMiniMapNodeColor }), showControls && /*#__PURE__*/(0, _jsxRuntime.jsx)(_Controls.default, { showFullscreen: showFullscreen, containerRef: containerRef, fitViewOptions: fitViewOptions, position: controlsPosition, showInteractive: showInteractive, showMiniMap: showMiniMap, showFitView: showFitView, showZoom: showZoom, setMinimapVisible: setMinimapVisible, minimapVisible: minimapVisible, showForceLayout: showForceLayout, onFitView: onFitView, onZoomOut: onZoomOut, onZoomIn: onZoomIn, onInteractiveChange: onInteractiveChange, children: customControls, orientation: controlsOrientation }), showLegend && /*#__PURE__*/(0, _jsxRuntime.jsx)(_components.Legend, { showLegend: showLegend }), children] })] }); }