UNPKG

@ifed/component

Version:
230 lines (229 loc) 8.05 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _ = require("./.."); var _antd = require("antd"); var _classnames = _interopRequireDefault(require("classnames")); var _react = _interopRequireDefault(require("react")); var _provider = require("../provider"); var _Icons = require("./Icons"); var _location = _interopRequireDefault(require("./location.gif")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } const thisNodehasSubFlow = node => Array.isArray(node?.subFlow) && node.subFlow.length > 0; const thisFlowHasSubFlow = arr => arr?.some(thisNodehasSubFlow); function needMask(current, parents) { const [parent] = parents.slice(-1); return parent?.subFlow?.slice(-1)?.[0]?.nodeInfoList?.find?.(k => k.nodeId === current?.nodeId) !== undefined; } const getFirst = data => { const first = data?.find?.(k => thisNodehasSubFlow(k)); if (first !== undefined) { return first?.subFlow?.[0]; } return null; }; function getIcon(item) { if (item.status === 'finish') { return /*#__PURE__*/_react.default.createElement(_antd.Icon, { type: "check" }); } if (item.status === 'error') { return /*#__PURE__*/_react.default.createElement(_antd.Icon, { type: "warning", theme: "filled" }); } if (item.status === 'timeout') { return /*#__PURE__*/_react.default.createElement(_antd.Icon, { type: "check" }); } if (item.status === 'process') { return /*#__PURE__*/_react.default.createElement("img", { src: _location.default, className: "flow-icon-process", alt: "process", width: 30, height: 30 }); } if (item.status === 'suspend') { return /*#__PURE__*/_react.default.createElement(_antd.Icon, { type: "pause" }); } return /*#__PURE__*/_react.default.createElement(_Icons.WaitIcon, null); } function getBranches(flow, pace) { const result = []; flow?.forEach((k, index) => { if (k?.subFlow?.length !== undefined && k?.subFlow?.length > 0) { result.push({ parentIndex: index, nodeId: k.nodeId }); } }); return result.map((k, i) => { return { offset: i === 0 ? k.parentIndex * pace + pace / 2 : (k.parentIndex - result[i - 1].parentIndex) * pace, ...k }; }); } const width1 = 160; function getOffsetStyle(start, end, pace) { return { left: `${start * pace + pace / 2}px`, width: `${(end - start) * pace}px` }; } const Flow = ({ data = [], onClick, sub, sup, renderBraces, renderNode, renderIcon = getIcon, renderCornerMark, size, pace = width1, autoHide = true, autoHeightMax = 600, className }) => { const { getPrefixCls } = _react.default.useContext(_provider.ConfigContext); if (!Array.isArray(data) || !data.every(k => k.nodeId && k.nodeName)) { throw Error('props.data不是有效值,预期是包含nodeId和nodeName的对象数组'); } const prefixCls = getPrefixCls('flow'); const scrollbarRef = _react.default.useRef(null); const newData = data; const handleClick = (e, item) => { if (typeof onClick === 'function') { onClick(e, item); } }; const renderBracesAndNodes = nodes => { const braces = renderBraces?.(nodes); return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, Array.isArray(braces) && braces.length > 0 ? /*#__PURE__*/_react.default.createElement("div", { className: `${prefixCls}-braces` }, braces?.map((k, i) => /*#__PURE__*/_react.default.createElement("div", { key: `${k.start}-${k.end}-${i}`, className: `${prefixCls}-brace`, style: getOffsetStyle(k.start, k.end, pace) }, /*#__PURE__*/_react.default.createElement("div", { className: `${prefixCls}-brace-main` }, /*#__PURE__*/_react.default.createElement("div", { className: `${prefixCls}-brace-content` }, k?.content)), /*#__PURE__*/_react.default.createElement("div", null)))) : null, /*#__PURE__*/_react.default.createElement("div", { className: (0, _classnames.default)(`${prefixCls}-nodes`), style: { width: `${nodes?.length * pace + 1}px` } }, nodes?.map(item => { const defaultNode = /*#__PURE__*/_react.default.createElement("div", { key: item.nodeId, className: `${prefixCls}-node ${prefixCls}-node-${item.status}`, style: { width: `${pace}px` }, onClick: e => { handleClick(e, item); } }, renderCornerMark?.(item), /*#__PURE__*/_react.default.createElement("div", { className: `${prefixCls}-triangle` }), /*#__PURE__*/_react.default.createElement("div", { className: `${prefixCls}-node-up-area` }, sup?.(item, newData)), /*#__PURE__*/_react.default.createElement("div", { className: `${prefixCls}-node-down-area` }, sub?.(item, newData)), /*#__PURE__*/_react.default.createElement("span", { className: `${prefixCls}-node-icon` }, renderIcon(item)), /*#__PURE__*/_react.default.createElement("div", { className: `${prefixCls}-node-title`, title: item.nodeName }, item.nodeName)); if (typeof renderNode === 'function') { return /*#__PURE__*/_react.default.cloneElement(renderNode(item, defaultNode), { key: item.nodeId }); } return defaultNode; }))); }; const first = getFirst(data); const walkNodes = (nodes, parentNodes = []) => { const cloneNodes = nodes; const ad = getBranches(cloneNodes, pace); return cloneNodes.map(k => { if (thisNodehasSubFlow(k)) { return { ...k, __offset: ad?.find(m => m.nodeId === k.nodeId).offset }; } return k; })?.reduceRight((result, next) => { if (thisNodehasSubFlow(next)) { return next.subFlow.map((flow, index) => { const isLeaf = !thisFlowHasSubFlow(flow?.nodeInfoList); return /*#__PURE__*/_react.default.createElement("div", { className: (0, _classnames.default)(`${prefixCls}-branch`, { [`${prefixCls}-branch-active`]: next.subFlow?.[0]?.status !== 'wait', [`${prefixCls}-branch-corner`]: index === next.subFlow.length - 1 && isLeaf }), key: flow.key, style: { marginLeft: next?.__offset } }, needMask(next, parentNodes) ? /*#__PURE__*/_react.default.createElement("div", { className: `${prefixCls}-branch-mask`, style: { left: `-${next?.__offset}px` } }) : null, first?.key === flow.key ? result : null, renderBracesAndNodes(flow?.nodeInfoList), !isLeaf ? walkNodes(flow?.nodeInfoList, [...parentNodes, next]) : null); }); } return result; }, []); }; const [hasHorizontalScrollbar, setHasHorizontalScrollbar] = _react.default.useState(false); const checkForHorizontalScrollbar = () => { if (scrollbarRef.current) { const { clientWidth, scrollWidth } = scrollbarRef.current.getValues(); setHasHorizontalScrollbar(scrollWidth > clientWidth); } }; _react.default.useEffect(() => { checkForHorizontalScrollbar(); window.addEventListener('resize', checkForHorizontalScrollbar); return () => { window.removeEventListener('resize', checkForHorizontalScrollbar); }; }, []); return /*#__PURE__*/_react.default.createElement(_.Scrollbar, { ref: scrollbarRef, autoHeight: true, autoHeightMax: autoHeightMax, autoHide: autoHide }, /*#__PURE__*/_react.default.createElement("div", { className: (0, _classnames.default)(`${prefixCls}`, { [`${prefixCls}-lg`]: size === 'large', [`${className}`]: !!className }), style: { width: hasHorizontalScrollbar ? 'auto' : newData?.length * pace + 1 } }, renderBracesAndNodes(newData), walkNodes(newData))); }; var _default = Flow; exports.default = _default;