-
-
this.controller.mount(shell)} className="lc-outline-tree-container">
-
+ { !this.props.hideFilter &&
}
+
this.controller.mount(shell)} className={`lc-outline-tree-container ${ this.props.hideFilter ? 'lc-hidden-outline-filter' : '' }`}>
+
);
diff --git a/packages/plugin-outline-pane/src/views/style.less b/packages/plugin-outline-pane/src/views/style.less
index cd133932b..f343fba17 100644
--- a/packages/plugin-outline-pane/src/views/style.less
+++ b/packages/plugin-outline-pane/src/views/style.less
@@ -14,10 +14,14 @@
overflow: auto;
}
+ > .lc-outline-tree-container.lc-hidden-outline-filter {
+ top: 0;
+ }
+
> .lc-outline-filter {
padding: 12px 16px;
display: flex;
- align-items: center;
+ align-items: stretch;
justify-content: right;
.lc-outline-filter-search-input {
@@ -27,7 +31,6 @@
.lc-outline-filter-icon {
background: #ebecf0;
border: 1px solid #c4c6cf;
- height: 28px;
display: flex;
align-items: center;
border-radius: 0 2px 2px 0;
diff --git a/packages/plugin-outline-pane/src/views/tree-branches.tsx b/packages/plugin-outline-pane/src/views/tree-branches.tsx
index 210fe0af8..2e281071b 100644
--- a/packages/plugin-outline-pane/src/views/tree-branches.tsx
+++ b/packages/plugin-outline-pane/src/views/tree-branches.tsx
@@ -2,12 +2,11 @@ import { PureComponent } from 'react';
import classNames from 'classnames';
import TreeNode from '../controllers/tree-node';
import TreeNodeView from './tree-node';
-import { IPublicModelPluginContext, IPublicModelExclusiveGroup, IPublicTypeDisposable, IPublicTypeLocationChildrenDetail } from '@alilc/lowcode-types';
+import { IPublicModelExclusiveGroup, IPublicTypeDisposable, IPublicTypeLocationChildrenDetail } from '@alilc/lowcode-types';
export default class TreeBranches extends PureComponent<{
treeNode: TreeNode;
isModal?: boolean;
- pluginContext: IPublicModelPluginContext;
expanded: boolean;
treeChildren: TreeNode[] | null;
}> {
@@ -51,12 +50,11 @@ export default class TreeBranches extends PureComponent<{
return (
{
- !isModal &&
+ !isModal &&
}
@@ -73,7 +71,6 @@ interface ITreeNodeChildrenState {
class TreeNodeChildren extends PureComponent<{
treeNode: TreeNode;
isModal?: boolean;
- pluginContext: IPublicModelPluginContext;
treeChildren: TreeNode[] | null;
}, ITreeNodeChildrenState> {
state: ITreeNodeChildrenState = {
@@ -84,8 +81,8 @@ class TreeNodeChildren extends PureComponent<{
};
offLocationChanged: IPublicTypeDisposable | undefined;
componentDidMount() {
- const { treeNode, pluginContext } = this.props;
- const { project } = pluginContext;
+ const { treeNode } = this.props;
+ const { project } = treeNode.pluginContext;
const { filterWorking, matchSelf, keywords } = treeNode.filterReult;
const { dropDetail } = treeNode;
this.setState({
@@ -122,13 +119,14 @@ class TreeNodeChildren extends PureComponent<{
let groupContents: any[] = [];
let currentGrp: IPublicModelExclusiveGroup;
const { filterWorking, matchSelf, keywords } = this.state;
- const Title = this.props.pluginContext.common.editorCabin.Title;
+ const Title = this.props.treeNode.pluginContext.common.editorCabin.Title;
const endGroup = () => {
if (groupContents.length > 0) {
children.push(
+ {/* @ts-ignore */}
);
+ groupContents.push(
);
} else {
if (index === dropIndex) {
children.push(insertion);
}
- children.push(
);
+ children.push(
);
}
});
endGroup();
@@ -191,14 +189,13 @@ class TreeNodeChildren extends PureComponent<{
class TreeNodeSlots extends PureComponent<{
treeNode: TreeNode;
- pluginContext: IPublicModelPluginContext;
}> {
render() {
const { treeNode } = this.props;
if (!treeNode.hasSlots()) {
return null;
}
- const Title = this.props.pluginContext.common.editorCabin.Title;
+ const Title = this.props.treeNode.pluginContext.common.editorCabin.Title;
return (
-
+ {/* @ts-ignore */}
+
{treeNode.slots.map(tnode => (
-
+
))}
);
diff --git a/packages/plugin-outline-pane/src/views/tree-node.tsx b/packages/plugin-outline-pane/src/views/tree-node.tsx
index 712dc20fa..882fe15b1 100644
--- a/packages/plugin-outline-pane/src/views/tree-node.tsx
+++ b/packages/plugin-outline-pane/src/views/tree-node.tsx
@@ -4,34 +4,56 @@ import TreeNode from '../controllers/tree-node';
import TreeTitle from './tree-title';
import TreeBranches from './tree-branches';
import { IconEyeClose } from '../icons/eye-close';
-import { IPublicModelPluginContext, IPublicModelModalNodesManager, IPublicTypeDisposable } from '@alilc/lowcode-types';
+import { IPublicModelModalNodesManager, IPublicTypeDisposable } from '@alilc/lowcode-types';
+import { IOutlinePanelPluginContext } from '../controllers/tree-master';
class ModalTreeNodeView extends PureComponent<{
treeNode: TreeNode;
- pluginContext: IPublicModelPluginContext;
+}, {
+ treeChildren: TreeNode[] | null;
}> {
private modalNodesManager: IPublicModelModalNodesManager | undefined | null;
- readonly pluginContext: IPublicModelPluginContext;
+ readonly pluginContext: IOutlinePanelPluginContext;
- constructor(props: any) {
+ constructor(props: {
+ treeNode: TreeNode;
+ }) {
super(props);
// 模态管理对象
- this.pluginContext = props.pluginContext;
+ this.pluginContext = props.treeNode.pluginContext;
const { project } = this.pluginContext;
this.modalNodesManager = project.currentDocument?.modalNodesManager;
+ this.state = {
+ treeChildren: this.rootTreeNode.children,
+ };
}
hideAllNodes() {
this.modalNodesManager?.hideModalNodes();
}
- render() {
+ 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();
@@ -49,10 +71,9 @@ class ModalTreeNodeView extends PureComponent<{
@@ -63,7 +84,6 @@ class ModalTreeNodeView extends PureComponent<{
export default class TreeNodeView extends PureComponent<{
treeNode: TreeNode;
isModal?: boolean;
- pluginContext: IPublicModelPluginContext;
isRootNode?: boolean;
}> {
state: {
@@ -114,8 +134,8 @@ export default class TreeNodeView extends PureComponent<{
}
componentDidMount() {
- const { treeNode, pluginContext } = this.props;
- const { project } = pluginContext;
+ const { treeNode } = this.props;
+ const { project } = treeNode.pluginContext;
const doc = project.currentDocument;
@@ -158,14 +178,14 @@ export default class TreeNodeView extends PureComponent<{
}
shouldShowModalTreeNode(): boolean {
- const { treeNode, isRootNode, pluginContext } = this.props;
+ const { treeNode, isRootNode } = this.props;
if (!isRootNode) {
// 只在 当前树 的根节点展示模态节点
return false;
}
// 当指定了新的根节点时,要从原始的根节点去获取模态节点
- const { project } = pluginContext;
+ const { project } = treeNode.pluginContext;
const rootNode = project.currentDocument?.root;
const rootTreeNode = treeNode.tree.getTreeNode(rootNode!);
const modalNodes = rootTreeNode.children?.filter((item) => {
@@ -214,19 +234,16 @@ export default class TreeNodeView extends PureComponent<{
hidden={this.state.hidden}
locked={this.state.locked}
expandable={this.state.expandable}
- pluginContext={this.props.pluginContext}
/>
{shouldShowModalTreeNode &&
}
diff --git a/packages/plugin-outline-pane/src/views/tree-title.tsx b/packages/plugin-outline-pane/src/views/tree-title.tsx
index 6e1b14a46..6f35c6a61 100644
--- a/packages/plugin-outline-pane/src/views/tree-title.tsx
+++ b/packages/plugin-outline-pane/src/views/tree-title.tsx
@@ -1,7 +1,7 @@
import { KeyboardEvent, FocusEvent, Fragment, PureComponent } from 'react';
import classNames from 'classnames';
import { createIcon } from '@alilc/lowcode-utils';
-import { IPublicModelPluginContext, IPublicApiEvent } from '@alilc/lowcode-types';
+import { IPublicApiEvent } from '@alilc/lowcode-types';
import TreeNode from '../controllers/tree-node';
import { IconLock, IconUnlock, IconArrowRight, IconEyeClose, IconEye, IconCond, IconLoop, IconRadioActive, IconRadio, IconSetting } from '../icons';
@@ -23,11 +23,12 @@ export default class TreeTitle extends PureComponent<{
hidden: boolean;
locked: boolean;
expandable: boolean;
- pluginContext: IPublicModelPluginContext;
}> {
state: {
editing: boolean;
title: string;
+ condition?: boolean;
+ visible?: boolean;
} = {
editing: false,
title: '',
@@ -53,7 +54,7 @@ export default class TreeTitle extends PureComponent<{
const { treeNode } = this.props;
const value = (e.target as HTMLInputElement).value || '';
treeNode.setTitleLabel(value);
- emitOutlineEvent(this.props.pluginContext.event, 'rename', treeNode, { value });
+ emitOutlineEvent(this.props.treeNode.pluginContext.event, 'rename', treeNode, { value });
this.cancelEdit();
};
@@ -81,16 +82,28 @@ export default class TreeTitle extends PureComponent<{
this.setState({
editing: false,
title: treeNode.titleLabel,
+ condition: treeNode.condition,
});
treeNode.onTitleLabelChanged(() => {
this.setState({
title: treeNode.titleLabel,
});
});
+ treeNode.onConditionChanged(() => {
+ this.setState({
+ condition: treeNode.condition,
+ });
+ });
+ treeNode.onHiddenChanged((hidden: boolean) => {
+ this.setState({
+ visible: !hidden,
+ });
+ });
}
render() {
- const { treeNode, isModal, pluginContext } = this.props;
+ const { treeNode, isModal } = this.props;
+ const { pluginContext } = treeNode;
const { editing } = this.state;
const isCNode = !treeNode.isRoot();
const { node } = treeNode;
@@ -125,7 +138,7 @@ export default class TreeTitle extends PureComponent<{
data-id={treeNode.id}
onClick={() => {
if (isModal) {
- if (node.visible) {
+ if (this.state.visible) {
node.document?.modalNodesManager?.setInvisible(node);
} else {
node.document?.modalNodesManager?.setVisible(node);
@@ -137,7 +150,7 @@ export default class TreeTitle extends PureComponent<{
}
}}
>
- {isModal && node.visible && (
+ {isModal && this.state.visible && (
{
node.document?.modalNodesManager?.setInvisible(node);
}}
@@ -145,7 +158,7 @@ export default class TreeTitle extends PureComponent<{
)}
- {isModal && !node.visible && (
+ {isModal && !this.state.visible && (
{
node.document?.modalNodesManager?.setVisible(node);
}}
@@ -153,7 +166,7 @@ export default class TreeTitle extends PureComponent<{
)}
- {isCNode &&
}
+ {isCNode &&
}
{createIcon(treeNode.icon)}
- {shouldShowHideBtn &&
}
- {shouldShowLockBtn &&
}
- {shouldEditBtn &&
}
+ {shouldShowHideBtn &&
}
+ {shouldShowLockBtn &&
}
+ {shouldEditBtn &&
}
);
@@ -206,11 +223,10 @@ export default class TreeTitle extends PureComponent<{
class RenameBtn extends PureComponent<{
treeNode: TreeNode;
- pluginContext: IPublicModelPluginContext;
onClick: (e: any) => void;
}> {
render() {
- const { intl, common } = this.props.pluginContext;
+ const { intl, common } = this.props.treeNode.pluginContext;
const Tip = common.editorCabin.Tip;
return (
{
e.stopPropagation();
- emitOutlineEvent(this.props.pluginContext.event, hidden ? 'show' : 'hide', treeNode);
+ emitOutlineEvent(treeNode.pluginContext.event, hidden ? 'show' : 'hide', treeNode);
treeNode.setHidden(!hidden);
}}
>
{hidden ? : }
+ {/* @ts-ignore */}
{hidden ? intl('Show') : intl('Hide')}
);
@@ -277,7 +294,6 @@ class HideBtn extends PureComponent<{
class ExpandBtn extends PureComponent<{
treeNode: TreeNode;
- pluginContext: IPublicModelPluginContext;
expanded: boolean;
expandable: boolean;
}> {
@@ -294,7 +310,7 @@ class ExpandBtn extends PureComponent<{
if (expanded) {
e.stopPropagation();
}
- emitOutlineEvent(this.props.pluginContext.event, expanded ? 'collapse' : 'expand', treeNode);
+ emitOutlineEvent(treeNode.pluginContext.event, expanded ? 'collapse' : 'expand', treeNode);
treeNode.setExpanded(!expanded);
}}
>
diff --git a/packages/plugin-outline-pane/src/views/tree.tsx b/packages/plugin-outline-pane/src/views/tree.tsx
index 930c65cce..4bc502886 100644
--- a/packages/plugin-outline-pane/src/views/tree.tsx
+++ b/packages/plugin-outline-pane/src/views/tree.tsx
@@ -2,7 +2,7 @@ import { MouseEvent as ReactMouseEvent, PureComponent } from 'react';
import { isFormEvent, canClickNode, isShaken } from '@alilc/lowcode-utils';
import { Tree } from '../controllers/tree';
import TreeNodeView from './tree-node';
-import { IPublicEnumDragObjectType, IPublicModelPluginContext, IPublicModelNode } from '@alilc/lowcode-types';
+import { IPublicEnumDragObjectType, IPublicModelNode } from '@alilc/lowcode-types';
import TreeNode from '../controllers/tree-node';
function getTreeNodeIdByEvent(e: ReactMouseEvent, stop: Element): null | string {
@@ -20,12 +20,21 @@ function getTreeNodeIdByEvent(e: ReactMouseEvent, stop: Element): null | string
export default class TreeView extends PureComponent<{
tree: Tree;
- pluginContext: IPublicModelPluginContext;
}> {
private shell: HTMLDivElement | null = null;
+ private ignoreUpSelected = false;
+
+ private boostEvent?: MouseEvent;
+
+ state: {
+ root: TreeNode | null;
+ } = {
+ root: null,
+ };
+
private hover(e: ReactMouseEvent) {
- const { project } = this.props.pluginContext;
+ const { project } = this.props.tree.pluginContext;
const detecting = project.currentDocument?.detecting;
if (detecting?.enable) {
return;
@@ -54,7 +63,7 @@ export default class TreeView extends PureComponent<{
return;
}
- const { project, event, canvas } = this.props.pluginContext;
+ const { project, event, canvas } = this.props.tree.pluginContext;
const doc = project.currentDocument;
const selection = doc?.selection;
const focusNode = doc?.focusNode;
@@ -109,10 +118,6 @@ export default class TreeView extends PureComponent<{
return tree.getTreeNodeById(id);
}
- private ignoreUpSelected = false;
-
- private boostEvent?: MouseEvent;
-
private onMouseDown = (e: ReactMouseEvent) => {
if (isFormEvent(e.nativeEvent)) {
return;
@@ -127,7 +132,7 @@ export default class TreeView extends PureComponent<{
if (!canClickNode(node, e)) {
return;
}
- const { project, canvas } = this.props.pluginContext;
+ const { project, canvas } = this.props.tree.pluginContext;
const selection = project.currentDocument?.selection;
const focusNode = project.currentDocument?.focusNode;
@@ -166,22 +171,16 @@ export default class TreeView extends PureComponent<{
};
private onMouseLeave = () => {
- const { pluginContext } = this.props;
+ const { pluginContext } = this.props.tree;
const { project } = pluginContext;
const doc = project.currentDocument;
doc?.detecting.leave();
};
- state: {
- root: TreeNode | null
- } = {
- root: null,
- };
-
componentDidMount() {
- const { tree, pluginContext } = this.props;
+ const { tree } = this.props;
const { root } = tree;
- const { project } = pluginContext;
+ const { project } = tree.pluginContext;
this.setState({ root });
const doc = project.currentDocument;
doc?.onFocusNodeChanged(() => {
@@ -208,7 +207,6 @@ export default class TreeView extends PureComponent<{