diff --git a/docs/docs/api/project.md b/docs/docs/api/project.md index f0fa106de..15fb3cb7e 100644 --- a/docs/docs/api/project.md +++ b/docs/docs/api/project.md @@ -5,7 +5,7 @@ sidebar_position: 3 ## 模块简介 引擎编排模块中包含多种模型,包括: -- [文档模型 DocumentModel)](./model/document-model) +- [文档模型 DocumentModel](./model/document-model) - [节点模型 Node](./model/node) - [节点孩子模型 NodeChildren](./model/node-children) - [属性模型 Prop](./model/prop) diff --git a/packages/plugin-outline-pane/src/controllers/tree-node.ts b/packages/plugin-outline-pane/src/controllers/tree-node.ts index b6063e724..32c21ede2 100644 --- a/packages/plugin-outline-pane/src/controllers/tree-node.ts +++ b/packages/plugin-outline-pane/src/controllers/tree-node.ts @@ -28,6 +28,7 @@ export default class TreeNode { onHiddenChanged: (hidden: boolean) => void; onLockedChanged: (locked: boolean) => void; onTitleLabelChanged: (treeNode: TreeNode) => void; + onExpandableChanged: (expandable: boolean) => void; get id(): string { return this.node.id; @@ -41,6 +42,13 @@ export default class TreeNode { return this.hasChildren() || this.hasSlots() || this.dropDetail?.index != null; } + /** + * 触发 onExpandableChanged 回调 + */ + notifyExpandableChanged(): void { + this.onExpandableChanged && this.onExpandableChanged(this.expandable); + } + /** * 插入"线"位置信息 */ @@ -96,7 +104,7 @@ export default class TreeNode { get detecting() { const doc = this.pluginContext.project.currentDocument; - return doc?.isDetectingNode(this.node); + return !!(doc?.isDetectingNode(this.node)); } get hidden(): boolean { diff --git a/packages/plugin-outline-pane/src/controllers/tree.ts b/packages/plugin-outline-pane/src/controllers/tree.ts index a4106088b..2256d45d9 100644 --- a/packages/plugin-outline-pane/src/controllers/tree.ts +++ b/packages/plugin-outline-pane/src/controllers/tree.ts @@ -17,7 +17,27 @@ export class Tree { constructor(pluginContext: IPublicModelPluginContext) { this.pluginContext = pluginContext; - this.id = this.pluginContext.project.currentDocument?.id; + const doc = this.pluginContext.project.currentDocument; + this.id = doc?.id; + + doc?.onMountNode((payload: {node: IPublicModelNode }) => { + const { node } = payload; + const parentNode = node.parent; + if (!parentNode) { + return; + } + const parentTreeNode = this.getTreeNodeById(parentNode.id); + parentTreeNode?.notifyExpandableChanged(); + }); + + doc?.onRemoveNode((node: IPublicModelNode) => { + const parentNode = node.parent; + if (!parentNode) { + return; + } + const parentTreeNode = this.getTreeNodeById(parentNode.id); + parentTreeNode?.notifyExpandableChanged(); + }); } setNodeSelected(nodeId: string): void { diff --git a/packages/plugin-outline-pane/src/views/tree-node.tsx b/packages/plugin-outline-pane/src/views/tree-node.tsx index 091530706..a6dc03f08 100644 --- a/packages/plugin-outline-pane/src/views/tree-node.tsx +++ b/packages/plugin-outline-pane/src/views/tree-node.tsx @@ -32,7 +32,7 @@ class ModalTreeNodeView extends Component<{ const { project } = this.pluginContext; const rootNode = project.currentDocument?.root; const rootTreeNode = treeNode.tree.getTreeNode(rootNode!); - const expanded = rootTreeNode.expanded; + const { expanded } = rootTreeNode; const hasVisibleModalNode = !!this.modalNodesManager?.getVisibleModalNode(); return ( @@ -100,7 +100,7 @@ export default class TreeNodeView extends Component<{ componentDidMount() { const { treeNode, pluginContext } = this.props; - const { event, project } = pluginContext; + const { project } = pluginContext; const doc = project.currentDocument; @@ -113,6 +113,9 @@ export default class TreeNodeView extends Component<{ treeNode.onLockedChanged = (locked: boolean) => { this.setState({ locked }); }; + treeNode.onExpandableChanged = (expandable: boolean) => { + this.setState({ expandable }); + }; this.eventOffCallbacks.push( doc?.onDropLocationChanged((document: IPublicModelDocumentModel) => { diff --git a/scripts/sync-oss.js b/scripts/sync-oss.js index 4b67bdca9..ba4a77be3 100644 --- a/scripts/sync-oss.js +++ b/scripts/sync-oss.js @@ -4,7 +4,6 @@ const package = require('../packages/engine/package.json'); const { version, name } = package; const options = { method: 'PUT', - // 暂时使用 日常环境的 uipaas-node,上线后可切换成线上环境 https://uipaas-node.alibaba-inc.com hostname: 'uipaas-node.alibaba-inc.com', path: '/staticAssets/cdn/packages', headers: {