diff --git a/packages/types/src/shell/type/resource-list.ts b/packages/types/src/shell/type/resource-list.ts index e5fbcba7e..9b8cc3272 100644 --- a/packages/types/src/shell/type/resource-list.ts +++ b/packages/types/src/shell/type/resource-list.ts @@ -1,7 +1,7 @@ export interface IPublicResourceData { resourceName: string; title: string; - category: string; + category?: string; options: { [key: string]: any; }; diff --git a/packages/workspace/src/base-context.ts b/packages/workspace/src/context/base-context.ts similarity index 95% rename from packages/workspace/src/base-context.ts rename to packages/workspace/src/context/base-context.ts index 0ff63ee02..b90a131a3 100644 --- a/packages/workspace/src/base-context.ts +++ b/packages/workspace/src/context/base-context.ts @@ -1,5 +1,3 @@ -/* eslint-disable no-param-reassign */ -/* eslint-disable max-len */ import { Editor, engineConfig, Setters as InnerSetters, @@ -33,8 +31,8 @@ import { IPublicTypePluginMeta, } from '@alilc/lowcode-types'; import { getLogger } from '@alilc/lowcode-utils'; -import { Workspace as InnerWorkspace } from './workspace'; -import { EditorWindow } from './editor-window/context'; +import { Workspace as InnerWorkspace } from '../workspace'; +import { EditorWindow } from '../window'; export class BasicContext { skeleton: Skeleton; diff --git a/packages/workspace/src/editor-view/context.ts b/packages/workspace/src/context/view-context.ts similarity index 93% rename from packages/workspace/src/editor-view/context.ts rename to packages/workspace/src/context/view-context.ts index b991532fb..55bbf2d57 100644 --- a/packages/workspace/src/editor-view/context.ts +++ b/packages/workspace/src/context/view-context.ts @@ -2,8 +2,8 @@ import { makeObservable, obx } from '@alilc/lowcode-editor-core'; import { IPublicEditorViewConfig, IPublicTypeEditorView } from '@alilc/lowcode-types'; import { flow } from 'mobx'; import { Workspace as InnerWorkspace } from '../workspace'; -import { BasicContext } from '../base-context'; -import { EditorWindow } from '../editor-window/context'; +import { BasicContext } from './base-context'; +import { EditorWindow } from '../window'; import { getWebviewPlugin } from '../inner-plugins/webview'; export class Context extends BasicContext { @@ -17,6 +17,10 @@ export class Context extends BasicContext { @obx isInit: boolean = false; + get active() { + return this._activate; + } + init = flow(function* (this: any) { if (this.viewType === 'webview') { const url = yield this.instance?.url?.(); @@ -44,10 +48,6 @@ export class Context extends BasicContext { this.innerHotkey.activate(this._activate); }; - get active() { - return this._activate; - } - async save() { return await this.instance?.save?.(); } diff --git a/packages/workspace/src/index.ts b/packages/workspace/src/index.ts index 2f6da97a8..9442266bb 100644 --- a/packages/workspace/src/index.ts +++ b/packages/workspace/src/index.ts @@ -1,4 +1,4 @@ export { Workspace } from './workspace'; -export * from './editor-window/context'; +export * from './window'; export * from './layouts/workbench'; export { Resource } from './resource'; diff --git a/packages/workspace/src/layouts/workbench.tsx b/packages/workspace/src/layouts/workbench.tsx index 7ffb0e531..fe5ef846f 100644 --- a/packages/workspace/src/layouts/workbench.tsx +++ b/packages/workspace/src/layouts/workbench.tsx @@ -1,6 +1,6 @@ import { Component } from 'react'; import { TipContainer, observer } from '@alilc/lowcode-editor-core'; -import { EditorWindowView } from '../editor-window/view'; +import { WindowView } from '../view/window-view'; import classNames from 'classnames'; import TopArea from './top-area'; import LeftArea from './left-area'; @@ -46,9 +46,9 @@ export class Workbench extends Component<{
{ workspace.windows.map(d => ( - )) diff --git a/packages/workspace/src/resource.ts b/packages/workspace/src/resource.ts index 2495909b4..effa6abee 100644 --- a/packages/workspace/src/resource.ts +++ b/packages/workspace/src/resource.ts @@ -1,6 +1,6 @@ import { IPublicTypeEditorView, IPublicModelResource, IPublicResourceData, IPublicResourceTypeConfig } from '@alilc/lowcode-types'; import { Logger } from '@alilc/lowcode-utils'; -import { BasicContext } from './base-context'; +import { BasicContext } from './context/base-context'; import { ResourceType } from './resource-type'; import { Workspace as InnerWorkSpace } from './workspace'; @@ -13,20 +13,6 @@ export class Resource implements IPublicModelResource { editorViewMap: Map = new Map(); - constructor(readonly resourceData: IPublicResourceData, readonly resourceType: ResourceType, workspace: InnerWorkSpace) { - this.context = new BasicContext(workspace, ''); - this.resourceTypeInstance = resourceType.resourceTypeModel(this.context, {}); - this.init(); - if (this.resourceTypeInstance.editorViews) { - this.resourceTypeInstance.editorViews.forEach((d: any) => { - this.editorViewMap.set(d.viewName, d); - }); - } - if (!resourceType) { - logger.error(`resourceType[${resourceType}] is unValid.`); - } - } - get name() { return this.resourceType.name; } @@ -55,6 +41,24 @@ export class Resource implements IPublicModelResource { return this.resourceData?.category; } + get skeleton() { + return this.context.innerSkeleton; + } + + constructor(readonly resourceData: IPublicResourceData, readonly resourceType: ResourceType, workspace: InnerWorkSpace) { + this.context = new BasicContext(workspace, `resource-${resourceData.resourceName || resourceType.name}`); + this.resourceTypeInstance = resourceType.resourceTypeModel(this.context, {}); + this.init(); + if (this.resourceTypeInstance.editorViews) { + this.resourceTypeInstance.editorViews.forEach((d: any) => { + this.editorViewMap.set(d.viewName, d); + }); + } + if (!resourceType) { + logger.error(`resourceType[${resourceType}] is unValid.`); + } + } + async init() { await this.resourceTypeInstance.init?.(); await this.context.innerPlugins.init(); @@ -63,6 +67,7 @@ export class Resource implements IPublicModelResource { async import(schema: any) { return await this.resourceTypeInstance.import?.(schema); } + async save(value: any) { return await this.resourceTypeInstance.save?.(value); } diff --git a/packages/workspace/src/editor-view/view.tsx b/packages/workspace/src/view/editor-view.tsx similarity index 69% rename from packages/workspace/src/editor-view/view.tsx rename to packages/workspace/src/view/editor-view.tsx index 77f0dffeb..7ada5c911 100644 --- a/packages/workspace/src/editor-view/view.tsx +++ b/packages/workspace/src/view/editor-view.tsx @@ -4,9 +4,9 @@ import { Workbench, } from '@alilc/lowcode-editor-skeleton'; import { PureComponent } from 'react'; -import { Context } from './context'; +import { Context } from '../context/view-context'; -export * from '../base-context'; +export * from '../context/base-context'; @observer export class EditorView extends PureComponent<{ @@ -23,13 +23,11 @@ export class EditorView extends PureComponent<{ } return ( - <> - - + ); } } diff --git a/packages/workspace/src/view/resource-view.less b/packages/workspace/src/view/resource-view.less new file mode 100644 index 000000000..4c281f8d8 --- /dev/null +++ b/packages/workspace/src/view/resource-view.less @@ -0,0 +1,14 @@ +.workspace-resource-view { + display: flex; + position: absolute; + flex-direction: column; + top: 0; + bottom: 0; + left: 0; + right: 0; +} + +.workspace-editor-body { + position: relative; + height: 100%; +} \ No newline at end of file diff --git a/packages/workspace/src/view/resource-view.tsx b/packages/workspace/src/view/resource-view.tsx new file mode 100644 index 000000000..37e960b99 --- /dev/null +++ b/packages/workspace/src/view/resource-view.tsx @@ -0,0 +1,36 @@ +import { PureComponent } from 'react'; +import { EditorView } from './editor-view'; +import { observer } from '@alilc/lowcode-editor-core'; +import TopArea from '../layouts/top-area'; +import { Resource } from '../resource'; +import { EditorWindow } from '../window'; +import './resource-view.less'; + +@observer +export class ResourceView extends PureComponent<{ + window: EditorWindow; + resource: Resource; +}, any> { + render() { + const { skeleton } = this.props.resource; + const { editorViews } = this.props.window; + return ( +
+ +
+ { + Array.from(editorViews.values()).map((editorView: any) => { + return ( + + ); + }) + } +
+
+ ); + } +} \ No newline at end of file diff --git a/packages/workspace/src/editor-window/view.tsx b/packages/workspace/src/view/window-view.tsx similarity index 52% rename from packages/workspace/src/editor-window/view.tsx rename to packages/workspace/src/view/window-view.tsx index eb049aeed..396582a02 100644 --- a/packages/workspace/src/editor-window/view.tsx +++ b/packages/workspace/src/view/window-view.tsx @@ -1,17 +1,17 @@ import { PureComponent } from 'react'; -import { EditorView } from '../editor-view/view'; +import { ResourceView } from './resource-view'; import { engineConfig, observer } from '@alilc/lowcode-editor-core'; -import { EditorWindow } from './context'; +import { EditorWindow } from '../window'; import { BuiltinLoading } from '@alilc/lowcode-designer'; @observer -export class EditorWindowView extends PureComponent<{ - editorWindow: EditorWindow; +export class WindowView extends PureComponent<{ + window: EditorWindow; active: boolean; }, any> { render() { const { active } = this.props; - const { editorView, editorViews } = this.props.editorWindow; + const { editorView, resource } = this.props.window; if (!editorView) { const Loading = engineConfig.get('loadingComponent', BuiltinLoading); return ( @@ -23,17 +23,10 @@ export class EditorWindowView extends PureComponent<{ return (
- { - Array.from(editorViews.values()).map((editorView: any) => { - return ( - - ); - }) - } +
); } diff --git a/packages/workspace/src/editor-window/context.ts b/packages/workspace/src/window.ts similarity index 95% rename from packages/workspace/src/editor-window/context.ts rename to packages/workspace/src/window.ts index 680647587..73064c6b4 100644 --- a/packages/workspace/src/editor-window/context.ts +++ b/packages/workspace/src/window.ts @@ -1,8 +1,8 @@ import { uniqueId } from '@alilc/lowcode-utils'; import { makeObservable, obx } from '@alilc/lowcode-editor-core'; -import { Context } from '../editor-view/context'; -import { Workspace } from '../workspace'; -import { Resource } from '../resource'; +import { Context } from './context/view-context'; +import { Workspace } from './workspace'; +import { Resource } from './resource'; export class EditorWindow { id: string = uniqueId('window'); diff --git a/packages/workspace/src/workspace.ts b/packages/workspace/src/workspace.ts index c4462a71a..509ca9d9d 100644 --- a/packages/workspace/src/workspace.ts +++ b/packages/workspace/src/workspace.ts @@ -2,8 +2,8 @@ import { Designer } from '@alilc/lowcode-designer'; import { createModuleEventBus, Editor, IEventBus, makeObservable, obx } from '@alilc/lowcode-editor-core'; import { Plugins } from '@alilc/lowcode-shell'; import { IPublicApiWorkspace, IPublicResourceList, IPublicTypeResourceType } from '@alilc/lowcode-types'; -import { BasicContext } from './base-context'; -import { EditorWindow } from './editor-window/context'; +import { BasicContext } from './context/base-context'; +import { EditorWindow } from './window'; import { Resource } from './resource'; import { ResourceType } from './resource-type'; @@ -20,6 +20,12 @@ export class Workspace implements IPublicApiWorkspace { private emitter: IEventBus = createModuleEventBus('workspace'); + private _isActive = false; + + private resourceTypeMap: Map = new Map(); + + private resourceList: Resource[] = []; + get skeleton() { return this.context.innerSkeleton; } @@ -28,7 +34,17 @@ export class Workspace implements IPublicApiWorkspace { return this.context.innerPlugins; } - private _isActive = false; + get isActive() { + return this._isActive; + } + + get defaultResourceType(): ResourceType | null { + if (this.resourceTypeMap.size >= 1) { + return Array.from(this.resourceTypeMap.values())[0]; + } + + return null; + } windows: EditorWindow[] = []; @@ -36,10 +52,6 @@ export class Workspace implements IPublicApiWorkspace { @obx.ref window: EditorWindow; - private resourceTypeMap: Map = new Map(); - - private resourceList: Resource[] = []; - constructor( readonly registryInnerPlugin: (designer: Designer, editor: Editor, plugins: Plugins) => Promise, readonly shellModelFactory: any, @@ -66,10 +78,6 @@ export class Workspace implements IPublicApiWorkspace { this.emitChangeActiveWindow(); } - get isActive() { - return this._isActive; - } - setActive(value: boolean) { this._isActive = value; } @@ -105,14 +113,6 @@ export class Workspace implements IPublicApiWorkspace { return this.resourceTypeMap.get(resourceName)!; } - get defaultResourceType(): ResourceType | null { - if (this.resourceTypeMap.size >= 1) { - return Array.from(this.resourceTypeMap.values())[0]; - } - - return null; - } - removeResourceType(resourceName: string) { if (this.resourceTypeMap.has(resourceName)) { this.resourceTypeMap.delete(resourceName); @@ -153,13 +153,17 @@ export class Workspace implements IPublicApiWorkspace { console.error(`${name} is not available`); return; } - const filterWindows = this.windows.filter(d => (d.resource.name === name && d.title == title)); + const filterWindows = this.windows.filter(d => (d.resource.name === name && d.resource.title == title)); if (filterWindows && filterWindows.length) { this.window = filterWindows[0]; this.emitChangeActiveWindow(); return; } - const resource = new Resource({}, resourceType, this); + const resource = new Resource({ + resourceName: name, + title, + options, + }, resourceType, this); this.window = new EditorWindow(resource, this, title, options); this.windows.push(this.window); this.editorWindowMap.set(this.window.id, this.window);