import { PureComponent } from 'react'; import classNames from 'classnames'; import TreeNode from '../controllers/tree-node'; import TreeTitle from './tree-title'; import TreeBranches from './tree-branches'; import { IconEyeClose } from '../icons/eye-close'; import { IPublicModelModalNodesManager, IPublicTypeDisposable } from '@alilc/lowcode-types'; import { IOutlinePanelPluginContext } from '../controllers/tree-master'; class ModalTreeNodeView extends PureComponent<{ treeNode: TreeNode; }, { treeChildren: TreeNode[] | null; }> { private modalNodesManager: IPublicModelModalNodesManager | undefined | null; readonly pluginContext: IOutlinePanelPluginContext; constructor(props: { treeNode: TreeNode; }) { super(props); // 模态管理对象 this.pluginContext = props.treeNode.pluginContext; const { project } = this.pluginContext; this.modalNodesManager = project.currentDocument?.modalNodesManager; this.state = { treeChildren: this.rootTreeNode.children, }; } hideAllNodes() { this.modalNodesManager?.hideModalNodes(); } componentDidMount(): void { const rootTreeNode = this.rootTreeNode; rootTreeNode.onExpandableChanged(() => { this.setState({ treeChildren: rootTreeNode.children, }); }); } get rootTreeNode() { const { treeNode } = this.props; // 当指定了新的根节点时,要从原始的根节点去获取模态节点 const { project } = this.pluginContext; const rootNode = project.currentDocument?.root; const rootTreeNode = treeNode.tree.getTreeNode(rootNode!); return rootTreeNode; } render() { const rootTreeNode = this.rootTreeNode; const { expanded } = rootTreeNode; const hasVisibleModalNode = !!this.modalNodesManager?.getVisibleModalNode(); return (
{this.pluginContext.intlNode('Modal View')}
{hasVisibleModalNode ? : null}
); } } export default class TreeNodeView extends PureComponent<{ treeNode: TreeNode; isModal?: boolean; isRootNode?: boolean; }> { state: { expanded: boolean; selected: boolean; hidden: boolean; locked: boolean; detecting: boolean; isRoot: boolean; highlight: boolean; dropping: boolean; conditionFlow: boolean; expandable: boolean; treeChildren: TreeNode[] | null; } = { expanded: false, selected: false, hidden: false, locked: false, detecting: false, isRoot: false, highlight: false, dropping: false, conditionFlow: false, expandable: false, treeChildren: [], }; eventOffCallbacks: Array = []; constructor(props: any) { super(props); const { treeNode, isRootNode } = this.props; this.state = { expanded: isRootNode ? true : treeNode.expanded, selected: treeNode.selected, hidden: treeNode.hidden, locked: treeNode.locked, detecting: treeNode.detecting, isRoot: treeNode.isRoot(), // 是否投放响应 dropping: treeNode.dropDetail?.index != null, conditionFlow: treeNode.node.conditionGroup != null, highlight: treeNode.isFocusingNode(), expandable: treeNode.expandable, treeChildren: treeNode.children, }; } componentDidMount() { const { treeNode } = this.props; const { project } = treeNode.pluginContext; const doc = project.currentDocument; treeNode.onExpandedChanged(((expanded: boolean) => { this.setState({ expanded }); })); treeNode.onHiddenChanged((hidden: boolean) => { this.setState({ hidden }); }); treeNode.onLockedChanged((locked: boolean) => { this.setState({ locked }); }); treeNode.onExpandableChanged((expandable: boolean) => { this.setState({ expandable, treeChildren: treeNode.children, }); }); this.eventOffCallbacks.push( doc?.onDropLocationChanged(() => { this.setState({ dropping: treeNode.dropDetail?.index != null, }); }), ); const offSelectionChange = doc?.selection?.onSelectionChange(() => { this.setState({ selected: treeNode.selected }); }); this.eventOffCallbacks.push(offSelectionChange!); const offDetectingChange = doc?.detecting?.onDetectingChange(() => { this.setState({ detecting: treeNode.detecting }); }); this.eventOffCallbacks.push(offDetectingChange!); } componentWillUnmount(): void { this.eventOffCallbacks?.forEach((offFun: IPublicTypeDisposable | undefined) => { offFun && offFun(); }); } shouldShowModalTreeNode(): boolean { const { treeNode, isRootNode } = this.props; if (!isRootNode) { // 只在 当前树 的根节点展示模态节点 return false; } // 当指定了新的根节点时,要从原始的根节点去获取模态节点 const { project } = treeNode.pluginContext; const rootNode = project.currentDocument?.root; const rootTreeNode = treeNode.tree.getTreeNode(rootNode!); const modalNodes = rootTreeNode.children?.filter((item) => { return item.node.componentMeta?.isModal; }); return !!(modalNodes && modalNodes.length > 0); } render() { const { treeNode, isModal, isRootNode } = this.props; const className = classNames('tree-node', { // 是否展开 expanded: this.state.expanded, // 是否选中的 selected: this.state.selected, // 是否隐藏的 hidden: this.state.hidden, // 是否锁定的 locked: this.state.locked, // 是否悬停中 detecting: this.state.detecting, // 是否投放响应 dropping: this.state.dropping, 'is-root': this.state.isRoot, 'condition-flow': this.state.conditionFlow, highlight: this.state.highlight, }); let shouldShowModalTreeNode: boolean = this.shouldShowModalTreeNode(); // filter 处理 const { filterWorking, matchChild, matchSelf } = treeNode.filterReult; if (!isRootNode && filterWorking && !matchChild && !matchSelf) { // 条件过滤生效时,如果未命中本节点或子节点,则不展示该节点 // 根节点始终展示 return null; } return (
); } }