From ebc137d11871c069b395f80408e6ffc46959a2bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E8=8F=8A=E8=90=8D=28=E7=B5=AE=E9=BB=8E=29?= Date: Mon, 24 Apr 2023 14:06:17 +0800 Subject: [PATCH 1/4] docs: update common.md --- docs/docs/api/common.md | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/docs/docs/api/common.md b/docs/docs/api/common.md index e5bfa8629..966e2277f 100644 --- a/docs/docs/api/common.md +++ b/docs/docs/api/common.md @@ -95,6 +95,17 @@ common.utils.startTransaction(() => { }, IPublicEnumTransitionType.repaint); ``` +#### getConvertedExtraKey + +props key 转化工具 + +```typescript +getConvertedExtraKey(key: string): string + +``` + +**@since v1.0.17** + #### createIntl i18n 相关工具 ```typescript @@ -144,4 +155,4 @@ const { intl, getLocale, setLocale } = common.utils.createIntl({ * get Workbench Component */ get Workbench(): Component; -``` \ No newline at end of file +``` From 5b1423068e5630975cba21460a58b46702810dee Mon Sep 17 00:00:00 2001 From: liujuping Date: Wed, 26 Apr 2023 10:20:52 +0800 Subject: [PATCH 2/4] feat(outline-pane): export OutlinePaneContext --- .../src/controllers/tree-master.ts | 3 +- packages/plugin-outline-pane/src/index.tsx | 61 +++++++++++-------- .../plugin-outline-pane/src/views/filter.tsx | 5 -- .../plugin-outline-pane/src/views/pane.tsx | 20 +++--- .../plugin-outline-pane/src/views/style.less | 7 ++- .../renderer-core/tests/hoc/leaf.test.tsx | 7 --- .../tests/renderer/base.test.tsx | 1 - .../tests/renderer/renderer.test.tsx | 2 - 8 files changed, 50 insertions(+), 56 deletions(-) diff --git a/packages/plugin-outline-pane/src/controllers/tree-master.ts b/packages/plugin-outline-pane/src/controllers/tree-master.ts index a6852803b..cb6298048 100644 --- a/packages/plugin-outline-pane/src/controllers/tree-master.ts +++ b/packages/plugin-outline-pane/src/controllers/tree-master.ts @@ -40,6 +40,7 @@ export class TreeMaster { const { workspace } = this.pluginContext; this.initEvent(); if (pluginContext.registerLevel === IPublicEnumPluginRegisterLevel.Workspace) { + this.setPluginContext(workspace.window?.currentEditorView); workspace.onWindowRendererReady(() => { this.setPluginContext(workspace.window?.currentEditorView); let dispose: IPublicTypeDisposable | undefined; @@ -60,7 +61,7 @@ export class TreeMaster { } } - private setPluginContext(pluginContext: IPublicModelPluginContext | undefined) { + private setPluginContext(pluginContext: IPublicModelPluginContext | undefined | null) { if (!pluginContext) { return; } diff --git a/packages/plugin-outline-pane/src/index.tsx b/packages/plugin-outline-pane/src/index.tsx index 1ea53b2f0..95b219a4b 100644 --- a/packages/plugin-outline-pane/src/index.tsx +++ b/packages/plugin-outline-pane/src/index.tsx @@ -6,6 +6,34 @@ import { TreeMaster } from './controllers/tree-master'; import { PaneController } from './controllers/pane-controller'; import { useState } from 'react'; +export function OutlinePaneContext(props: { + treeMaster?: TreeMaster; + + pluginContext: IPublicModelPluginContext; + + options: any; + + paneName: string; + + hideFilter?: boolean; +}) { + const treeMaster = props.treeMaster || new TreeMaster(props.pluginContext, props.options); + const [masterPaneController, setMasterPaneController] = useState(new PaneController(props.paneName || MasterPaneName, treeMaster)); + treeMaster.onPluginContextChange(() => { + setMasterPaneController(new PaneController(props.paneName || MasterPaneName, treeMaster)); + }); + + return ( + + ); +} + export const OutlinePlugin = (ctx: IPublicModelPluginContext, options: any) => { const { skeleton, config, canvas, project } = ctx; @@ -19,7 +47,6 @@ export const OutlinePlugin = (ctx: IPublicModelPluginContext, options: any) => { backupPane: false, }; const treeMaster = new TreeMaster(ctx, options); - let backupPaneController: PaneController | null = null; return { async init() { skeleton.add({ @@ -33,22 +60,7 @@ export const OutlinePlugin = (ctx: IPublicModelPluginContext, options: any) => { icon: IconOutline, description: treeMaster.pluginContext.intlNode('Outline Tree'), }, - content: function Context(props: any) { - const [masterPaneController, setMasterPaneController] = useState(new PaneController(MasterPaneName, treeMaster)); - treeMaster.onPluginContextChange(() => { - setMasterPaneController(new PaneController(MasterPaneName, treeMaster)); - }); - - return ( - - ); - }, + content: OutlinePaneContext, }, panelProps: { area: isInFloatArea ? 'leftFloatArea' : 'leftFixedArea', @@ -57,6 +69,8 @@ export const OutlinePlugin = (ctx: IPublicModelPluginContext, options: any) => { }, contentProps: { treeTitleExtra: config.get('treeTitleExtra'), + treeMaster, + paneName: MasterPaneName, }, }); @@ -67,15 +81,10 @@ export const OutlinePlugin = (ctx: IPublicModelPluginContext, options: any) => { props: { hiddenWhenInit: true, }, - content: (props: any) => { - backupPaneController = new PaneController(BackupPaneName, treeMaster); - return ( - - ); + content: OutlinePaneContext, + contentProps: { + paneName: BackupPaneName, + treeMaster, }, }); diff --git a/packages/plugin-outline-pane/src/views/filter.tsx b/packages/plugin-outline-pane/src/views/filter.tsx index 908f83d56..8fd18ed25 100644 --- a/packages/plugin-outline-pane/src/views/filter.tsx +++ b/packages/plugin-outline-pane/src/views/filter.tsx @@ -51,7 +51,6 @@ export default class Filter extends PureComponent<{ return (
- {/* @ts-ignore */} - {/* @ts-ignore */} )} > - {/* @ts-ignore */} {this.props.tree.pluginContext.intlNode('Check All')} - {/* @ts-ignore */} - {/* @ts-ignore */} { @@ -26,6 +26,11 @@ export class Pane extends PureComponent<{ this.state = { tree: treeMaster.currentTree, }; + this.dispose = this.props.treeMaster.pluginContext?.project?.onSimulatorRendererReady(() => { + this.setState({ + tree: this.props.treeMaster.currentTree, + }); + }); } componentWillUnmount() { @@ -33,14 +38,6 @@ export class Pane extends PureComponent<{ this.dispose && this.dispose(); } - componentDidMount() { - this.dispose = this.props.treeMaster.pluginContext.project.onSimulatorRendererReady(() => { - this.setState({ - tree: this.props.treeMaster.currentTree, - }); - }); - } - render() { const tree = this.state.tree; @@ -48,7 +45,6 @@ export class Pane extends PureComponent<{ return (

- {/* @ts-ignore */} - -

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/renderer-core/tests/hoc/leaf.test.tsx b/packages/renderer-core/tests/hoc/leaf.test.tsx index 94d50f87a..d4a65e578 100644 --- a/packages/renderer-core/tests/hoc/leaf.test.tsx +++ b/packages/renderer-core/tests/hoc/leaf.test.tsx @@ -83,7 +83,6 @@ beforeEach(() => { }); component = renderer.create( - // @ts-ignore
@@ -238,7 +237,6 @@ describe('mini unit render', () => { nodeMap.set(textSchema.id, TextNode); component = renderer.create( - // @ts-ignore @@ -285,7 +283,6 @@ describe('mini unit render', () => { nodeMap.set(textSchema.id, TextNode); renderer.create( - // @ts-ignore
@@ -309,7 +306,6 @@ describe('mini unit render', () => { }); renderer.create( - // @ts-ignore
@@ -388,7 +384,6 @@ describe('mini unit render', () => { }; const component = renderer.create( - // @ts-ignore @@ -428,7 +423,6 @@ describe('mini unit render', () => { nodeMap.set(miniRenderSchema.id, MiniRenderDivNode); component = renderer.create( - // @ts-ignore @@ -491,7 +485,6 @@ describe('onVisibleChange', () => { describe('children', () => { it('this.props.children is array', () => { const component = renderer.create( - // @ts-ignore
diff --git a/packages/renderer-core/tests/renderer/base.test.tsx b/packages/renderer-core/tests/renderer/base.test.tsx index 63c5cfbb2..3faa2bcf4 100644 --- a/packages/renderer-core/tests/renderer/base.test.tsx +++ b/packages/renderer-core/tests/renderer/base.test.tsx @@ -79,7 +79,6 @@ describe('Base Render methods', () => { // const originalUtils = jest.requireActual('../../src/utils'); // mockParseExpression.mockImplementation(originalUtils.parseExpression); const component = TestRenderer.create( - // @ts-ignore { return new Promise((resolve, reject) => { const component = renderer.create( - // @ts-ignore { describe('Base Render', () => { it('renderComp', () => { const content = ( - // @ts-ignore Date: Wed, 26 Apr 2023 10:24:17 +0800 Subject: [PATCH 3/4] feat(workspace): add config for resource shell model --- packages/designer/src/plugin/plugin-context.ts | 4 ++++ packages/shell/src/model/resource.ts | 4 ++++ packages/shell/src/model/window.ts | 5 ++++- packages/types/src/shell/model/resource.ts | 4 ++++ packages/types/src/shell/model/window.ts | 2 +- packages/types/src/shell/type/resource-list.ts | 4 ++++ packages/workspace/src/context/base-context.ts | 2 +- packages/workspace/src/resource.ts | 4 ++++ 8 files changed, 26 insertions(+), 3 deletions(-) diff --git a/packages/designer/src/plugin/plugin-context.ts b/packages/designer/src/plugin/plugin-context.ts index f43134c75..94e296fd1 100644 --- a/packages/designer/src/plugin/plugin-context.ts +++ b/packages/designer/src/plugin/plugin-context.ts @@ -17,6 +17,8 @@ import { IPublicTypePluginDeclaration, IPublicApiCanvas, IPublicApiWorkspace, + IPublicEnumPluginRegisterLevel, + IPublicModelWindow, } from '@alilc/lowcode-types'; import { IPluginContextOptions, @@ -41,6 +43,8 @@ export default class PluginContext implements pluginEvent: IPublicApiEvent; canvas: IPublicApiCanvas; workspace: IPublicApiWorkspace; + registerLevel: IPublicEnumPluginRegisterLevel; + editorWindow: IPublicModelWindow; constructor( options: IPluginContextOptions, diff --git a/packages/shell/src/model/resource.ts b/packages/shell/src/model/resource.ts index b2b065398..43f28fbd8 100644 --- a/packages/shell/src/model/resource.ts +++ b/packages/shell/src/model/resource.ts @@ -25,6 +25,10 @@ export class Resource implements IPublicModelResource { return this[resourceSymbol].resourceType.name; } + get config() { + return this[resourceSymbol].config; + } + get type() { return this[resourceSymbol].resourceType.type; } diff --git a/packages/shell/src/model/window.ts b/packages/shell/src/model/window.ts index 6af2534dd..f539e9567 100644 --- a/packages/shell/src/model/window.ts +++ b/packages/shell/src/model/window.ts @@ -44,7 +44,10 @@ export class Window implements IPublicModelWindow { } get currentEditorView() { - return new EditorView(this[windowSymbol].editorView).toProxy() as any; + if (this[windowSymbol].editorView) { + return new EditorView(this[windowSymbol].editorView).toProxy() as any; + } + return null; } get editorViews() { diff --git a/packages/types/src/shell/model/resource.ts b/packages/types/src/shell/model/resource.ts index e18f3d503..1f59845e6 100644 --- a/packages/types/src/shell/model/resource.ts +++ b/packages/types/src/shell/model/resource.ts @@ -18,6 +18,10 @@ export interface IBaseModelResource< get children(): Resource[]; get viewName(): string | undefined; + + get config(): { + disableBehaviors?: ('copy' | 'remove')[]; + } | undefined; } export type IPublicModelResource = IBaseModelResource; diff --git a/packages/types/src/shell/model/window.ts b/packages/types/src/shell/model/window.ts index 5f77b0cbf..a33be6ceb 100644 --- a/packages/types/src/shell/model/window.ts +++ b/packages/types/src/shell/model/window.ts @@ -23,7 +23,7 @@ export interface IPublicModelWindow< * 窗口当前视图 * @since v1.1.7 */ - currentEditorView: IPublicModelEditorView; + currentEditorView: IPublicModelEditorView | null; /** * 窗口全部视图实例 diff --git a/packages/types/src/shell/type/resource-list.ts b/packages/types/src/shell/type/resource-list.ts index 5831d7b50..7abdcc7b1 100644 --- a/packages/types/src/shell/type/resource-list.ts +++ b/packages/types/src/shell/type/resource-list.ts @@ -24,6 +24,10 @@ export interface IPublicResourceData { /** 资源子元素 */ children?: IPublicResourceData[]; + + config?: { + disableBehaviors?: ('copy' | 'remove')[]; + }; } export type IPublicResourceList = IPublicResourceData[]; \ No newline at end of file diff --git a/packages/workspace/src/context/base-context.ts b/packages/workspace/src/context/base-context.ts index b12a78183..b359a6139 100644 --- a/packages/workspace/src/context/base-context.ts +++ b/packages/workspace/src/context/base-context.ts @@ -101,7 +101,7 @@ export class BasicContext implements IBasicContext { preference: IPluginPreferenceMananger; workspace: IWorkspace; - constructor(innerWorkspace: IWorkspace, viewName: string, registerLevel: IPublicEnumPluginRegisterLevel, public editorWindow?: IEditorWindow) { + constructor(innerWorkspace: IWorkspace, viewName: string, readonly registerLevel: IPublicEnumPluginRegisterLevel, public editorWindow?: IEditorWindow) { const editor = new Editor(viewName, true); const innerSkeleton = new InnerSkeleton(editor, viewName); diff --git a/packages/workspace/src/resource.ts b/packages/workspace/src/resource.ts index e51993c81..8c59aed1e 100644 --- a/packages/workspace/src/resource.ts +++ b/packages/workspace/src/resource.ts @@ -74,6 +74,10 @@ export class Resource implements IResource { return this.resourceData?.children?.map(d => new Resource(d, this.workspace.getResourceType(d.resourceName || this.resourceType.name), this.workspace)) || []; } + get config() { + return this.resourceData.config; + } + constructor(readonly resourceData: IPublicResourceData, readonly resourceType: IResourceType, readonly workspace: IWorkspace) { this.context = new BasicContext(workspace, `resource-${resourceData.resourceName || resourceType.name}`, IPublicEnumPluginRegisterLevel.Resource); this.resourceTypeInstance = resourceType.resourceTypeModel(this.context.innerPlugins._getLowCodePluginContext({ From 9fd28efd0ea6f4d872928d1e339c852b817194da Mon Sep 17 00:00:00 2001 From: liujuping Date: Wed, 26 Apr 2023 10:57:28 +0800 Subject: [PATCH 4/4] fix: removeEditorWindow does not compare title --- packages/workspace/src/workspace.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/workspace/src/workspace.ts b/packages/workspace/src/workspace.ts index 37341cdc3..c723d2b5c 100644 --- a/packages/workspace/src/workspace.ts +++ b/packages/workspace/src/workspace.ts @@ -192,8 +192,8 @@ export class Workspace implements IWorkspace { this.emitChangeWindow(); } - removeEditorWindow(resourceName: string) { - const index = this.windows.findIndex(d => (d.resource?.name === resourceName && d.title)); + removeEditorWindow(resourceName: string, title: string) { + const index = this.windows.findIndex(d => (d.resource?.name === resourceName && d.title === title)); this.remove(index); }