fix: fix the problem that the outline pane tree cannot be expanded

This commit is contained in:
liujuping 2023-03-06 15:17:14 +08:00 committed by 林熠
parent 2d80d11475
commit 76ec15f5b7
4 changed files with 82 additions and 35 deletions

View File

@ -3,8 +3,10 @@ import {
IPublicTypeLocationChildrenDetail, IPublicTypeLocationChildrenDetail,
IPublicModelNode, IPublicModelNode,
IPublicModelPluginContext, IPublicModelPluginContext,
IPublicTypeDisposable,
} from '@alilc/lowcode-types'; } from '@alilc/lowcode-types';
import { isI18nData, isLocationChildrenDetail } from '@alilc/lowcode-utils'; import { isI18nData, isLocationChildrenDetail } from '@alilc/lowcode-utils';
import EventEmitter from 'events';
import { Tree } from './tree'; import { Tree } from './tree';
/** /**
@ -21,14 +23,61 @@ export interface FilterResult {
keywords: string; keywords: string;
} }
enum EVENT_NAMES {
filterResultChanged = 'filterResultChanged',
expandedChanged = 'expandedChanged',
hiddenChanged = 'hiddenChanged',
lockedChanged = 'lockedChanged',
titleLabelChanged = 'titleLabelChanged',
expandableChanged = 'expandableChanged',
}
export default class TreeNode { export default class TreeNode {
readonly pluginContext: IPublicModelPluginContext; readonly pluginContext: IPublicModelPluginContext;
onFilterResultChanged: () => void; event = new EventEmitter();
onExpandedChanged: (expanded: boolean) => void;
onHiddenChanged: (hidden: boolean) => void; onFilterResultChanged(fn: () => void): IPublicTypeDisposable {
onLockedChanged: (locked: boolean) => void; this.event.on(EVENT_NAMES.filterResultChanged, fn);
onTitleLabelChanged: (treeNode: TreeNode) => void; return () => {
onExpandableChanged: (expandable: boolean) => void; this.event.off(EVENT_NAMES.filterResultChanged, fn);
}
};
onExpandedChanged(fn: (expanded: boolean) => void): IPublicTypeDisposable {
this.event.on(EVENT_NAMES.expandedChanged, fn);
return () => {
this.event.off(EVENT_NAMES.expandedChanged, fn);
}
};
onHiddenChanged(fn: (hidden: boolean) => void): IPublicTypeDisposable {
this.event.on(EVENT_NAMES.hiddenChanged, fn);
return () => {
this.event.off(EVENT_NAMES.hiddenChanged, fn);
}
};
onLockedChanged(fn: (locked: boolean) => void): IPublicTypeDisposable {
this.event.on(EVENT_NAMES.lockedChanged, fn);
return () => {
this.event.off(EVENT_NAMES.lockedChanged, fn);
}
};
onTitleLabelChanged(fn: (treeNode: TreeNode) => void): IPublicTypeDisposable {
this.event.on(EVENT_NAMES.titleLabelChanged, fn);
return () => {
this.event.off(EVENT_NAMES.titleLabelChanged, fn);
}
};
onExpandableChanged(fn: (expandable: boolean) => void): IPublicTypeDisposable {
this.event.on(EVENT_NAMES.expandableChanged, fn);
return () => {
this.event.off(EVENT_NAMES.expandableChanged, fn);
}
}
get id(): string { get id(): string {
return this.node.id; return this.node.id;
@ -46,7 +95,7 @@ export default class TreeNode {
* onExpandableChanged * onExpandableChanged
*/ */
notifyExpandableChanged(): void { notifyExpandableChanged(): void {
this.onExpandableChanged && this.onExpandableChanged(this.expandable); this.event.emit(EVENT_NAMES.expandableChanged, this.expandable);
} }
/** /**
@ -99,7 +148,7 @@ export default class TreeNode {
setExpanded(value: boolean) { setExpanded(value: boolean) {
this._expanded = value; this._expanded = value;
this.onExpandedChanged && this.onExpandedChanged(value); this.event.emit(EVENT_NAMES.expandedChanged, value);
} }
get detecting() { get detecting() {
@ -120,7 +169,7 @@ export default class TreeNode {
return; return;
} }
this.node.visible = !flag; this.node.visible = !flag;
this.onHiddenChanged && this.onHiddenChanged(flag); this.event.emit(EVENT_NAMES.hiddenChanged, flag);
} }
get locked(): boolean { get locked(): boolean {
@ -129,7 +178,7 @@ export default class TreeNode {
setLocked(flag: boolean) { setLocked(flag: boolean) {
this.node.lock(flag); this.node.lock(flag);
this.onLockedChanged && this.onLockedChanged(flag); this.event.emit(EVENT_NAMES.lockedChanged, flag);
} }
get selected(): boolean { get selected(): boolean {
@ -174,11 +223,11 @@ export default class TreeNode {
} else { } else {
this.node.getExtraProp('title', true)?.setValue(label); this.node.getExtraProp('title', true)?.setValue(label);
} }
this.onTitleLabelChanged && this.onTitleLabelChanged(this); this.event.emit(EVENT_NAMES.titleLabelChanged, this);
} }
get icon() { get icon() {
return this.node.componentMeta.icon; return this.node.componentMeta?.icon;
} }
get parent(): TreeNode | null { get parent(): TreeNode | null {
@ -282,8 +331,6 @@ export default class TreeNode {
setFilterReult(val: FilterResult) { setFilterReult(val: FilterResult) {
this._filterResult = val; this._filterResult = val;
if (this.onFilterResultChanged) { this.event.emit(EVENT_NAMES.filterResultChanged)
this.onFilterResultChanged();
}
} }
} }

View File

@ -25,10 +25,10 @@ export default class TreeBranches extends Component<{
componentDidMount() { componentDidMount() {
const { treeNode } = this.props; const { treeNode } = this.props;
treeNode.onFilterResultChanged = () => { treeNode.onFilterResultChanged(() => {
const { filterWorking: newFilterWorking, matchChild: newMatchChild } = treeNode.filterReult; const { filterWorking: newFilterWorking, matchChild: newMatchChild } = treeNode.filterReult;
this.setState({ filterWorking: newFilterWorking, matchChild: newMatchChild }); this.setState({ filterWorking: newFilterWorking, matchChild: newMatchChild });
}; });
} }
componentWillUnmount(): void { componentWillUnmount(): void {
@ -73,7 +73,7 @@ class TreeNodeChildren extends Component<{
keywords: null, keywords: null,
dropDetail: null, dropDetail: null,
}; };
offLocationChanged: IPublicTypeDisposable; offLocationChanged: IPublicTypeDisposable | undefined;
componentDidMount() { componentDidMount() {
const { treeNode, pluginContext } = this.props; const { treeNode, pluginContext } = this.props;
const { project } = pluginContext; const { project } = pluginContext;
@ -85,7 +85,7 @@ class TreeNodeChildren extends Component<{
keywords, keywords,
dropDetail, dropDetail,
}); });
treeNode.onFilterResultChanged = () => { treeNode.onFilterResultChanged(() => {
const { const {
filterWorking: newFilterWorking, filterWorking: newFilterWorking,
matchSelf: newMatchChild, matchSelf: newMatchChild,
@ -96,7 +96,7 @@ class TreeNodeChildren extends Component<{
matchSelf: newMatchChild, matchSelf: newMatchChild,
keywords: newKeywords, keywords: newKeywords,
}); });
}; });
this.offLocationChanged = project.currentDocument?.onDropLocationChanged( this.offLocationChanged = project.currentDocument?.onDropLocationChanged(
() => { () => {
this.setState({ dropDetail: treeNode.dropDetail }); this.setState({ dropDetail: treeNode.dropDetail });
@ -118,7 +118,7 @@ class TreeNodeChildren extends Component<{
const endGroup = () => { const endGroup = () => {
if (groupContents.length > 0) { if (groupContents.length > 0) {
children.push( children.push(
<div key={currentGrp.id} className="condition-group-container" data-id={currentGrp.firstNode.id}> <div key={currentGrp.id} className="condition-group-container" data-id={currentGrp.firstNode?.id}>
<div className="condition-group-title"> <div className="condition-group-title">
<Title <Title
title={currentGrp.title} title={currentGrp.title}

View File

@ -4,7 +4,7 @@ import TreeNode from '../controllers/tree-node';
import TreeTitle from './tree-title'; import TreeTitle from './tree-title';
import TreeBranches from './tree-branches'; import TreeBranches from './tree-branches';
import { IconEyeClose } from '../icons/eye-close'; import { IconEyeClose } from '../icons/eye-close';
import { IPublicModelPluginContext, IPublicModelModalNodesManager, IPublicModelDocumentModel } from '@alilc/lowcode-types'; import { IPublicModelPluginContext, IPublicModelModalNodesManager, IPublicModelDocumentModel, IPublicTypeDisposable } from '@alilc/lowcode-types';
class ModalTreeNodeView extends Component<{ class ModalTreeNodeView extends Component<{
treeNode: TreeNode; treeNode: TreeNode;
@ -78,7 +78,7 @@ export default class TreeNodeView extends Component<{
expandable: false, expandable: false,
}; };
eventOffCallbacks: Array<() => void> = []; eventOffCallbacks: Array<IPublicTypeDisposable | undefined> = [];
constructor(props: any) { constructor(props: any) {
super(props); super(props);
@ -104,18 +104,18 @@ export default class TreeNodeView extends Component<{
const doc = project.currentDocument; const doc = project.currentDocument;
treeNode.onExpandedChanged = ((expanded: boolean) => { treeNode.onExpandedChanged(((expanded: boolean) => {
this.setState({ expanded }); this.setState({ expanded });
}); }));
treeNode.onHiddenChanged = (hidden: boolean) => { treeNode.onHiddenChanged((hidden: boolean) => {
this.setState({ hidden }); this.setState({ hidden });
}; });
treeNode.onLockedChanged = (locked: boolean) => { treeNode.onLockedChanged((locked: boolean) => {
this.setState({ locked }); this.setState({ locked });
}; });
treeNode.onExpandableChanged = (expandable: boolean) => { treeNode.onExpandableChanged((expandable: boolean) => {
this.setState({ expandable }); this.setState({ expandable });
}; });
this.eventOffCallbacks.push( this.eventOffCallbacks.push(
doc?.onDropLocationChanged((document: IPublicModelDocumentModel) => { doc?.onDropLocationChanged((document: IPublicModelDocumentModel) => {
@ -135,8 +135,8 @@ export default class TreeNodeView extends Component<{
this.eventOffCallbacks.push(offDetectingChange!); this.eventOffCallbacks.push(offDetectingChange!);
} }
componentWillUnmount(): void { componentWillUnmount(): void {
this.eventOffCallbacks?.forEach((offFun: () => void) => { this.eventOffCallbacks?.forEach((offFun: IPublicTypeDisposable | undefined) => {
offFun(); offFun && offFun();
}); });
} }

View File

@ -83,11 +83,11 @@ export default class TreeTitle extends Component<{
editing: false, editing: false,
title: treeNode.titleLabel, title: treeNode.titleLabel,
}); });
treeNode.onTitleLabelChanged = () => { treeNode.onTitleLabelChanged(() => {
this.setState({ this.setState({
title: treeNode.titleLabel, title: treeNode.titleLabel,
}); });
}; });
} }
render() { render() {