mirror of
https://github.com/alibaba/lowcode-engine.git
synced 2025-12-14 21:12:53 +00:00
feat: modify the usage of resource registration
This commit is contained in:
parent
d3cc39ec9c
commit
7d526d1e83
@ -1,26 +0,0 @@
|
|||||||
---
|
|
||||||
title: ResourceType
|
|
||||||
sidebar_position: 12
|
|
||||||
---
|
|
||||||
|
|
||||||
> **[@experimental](./#experimental)**<br/>
|
|
||||||
> **@types** [IPublicModelWindow](https://github.com/alibaba/lowcode-engine/blob/main/packages/types/src/shell/model/resource-type.ts)<br/>
|
|
||||||
> **@since** v1.1.0
|
|
||||||
|
|
||||||
## 变量
|
|
||||||
|
|
||||||
### description
|
|
||||||
|
|
||||||
资源描述
|
|
||||||
|
|
||||||
`@type {string}`
|
|
||||||
|
|
||||||
### icon
|
|
||||||
|
|
||||||
资源 icon
|
|
||||||
|
|
||||||
`@type {ReactElement}`
|
|
||||||
|
|
||||||
### name
|
|
||||||
|
|
||||||
`@type {string}`
|
|
||||||
@ -15,6 +15,24 @@ sidebar_position: 12
|
|||||||
|
|
||||||
`@type {string}`
|
`@type {string}`
|
||||||
|
|
||||||
|
### name
|
||||||
|
|
||||||
|
资源名字
|
||||||
|
|
||||||
|
`@type {string}`
|
||||||
|
|
||||||
|
### type
|
||||||
|
|
||||||
|
资源类型
|
||||||
|
|
||||||
|
`@type {string}`
|
||||||
|
|
||||||
|
### category
|
||||||
|
|
||||||
|
资源分类
|
||||||
|
|
||||||
|
`@type {string}`
|
||||||
|
|
||||||
### icon
|
### icon
|
||||||
|
|
||||||
资源 icon
|
资源 icon
|
||||||
@ -25,12 +43,4 @@ sidebar_position: 12
|
|||||||
|
|
||||||
资源配置信息
|
资源配置信息
|
||||||
|
|
||||||
`@type {Object}`
|
`@type {Object}`
|
||||||
|
|
||||||
### resourceType
|
|
||||||
|
|
||||||
资源所属的资源类型
|
|
||||||
|
|
||||||
`@type {IPublicModelResourceType}`
|
|
||||||
|
|
||||||
关联模型 [IPublicModelResourceType](./resource-type)
|
|
||||||
@ -30,13 +30,13 @@ sidebar_position: 12
|
|||||||
|
|
||||||
`@type {ReactElement}`
|
`@type {ReactElement}`
|
||||||
|
|
||||||
### resourceType
|
### resource
|
||||||
|
|
||||||
窗口资源类型
|
窗口对应资源
|
||||||
|
|
||||||
`@type {IPublicModelResourceType}`
|
`@type {IPublicModelResource}`
|
||||||
|
|
||||||
关联模型 [IPublicModelResourceType](./resource-type)
|
关联模型 [IPublicModelResource](./resource)
|
||||||
|
|
||||||
## 方法签名
|
## 方法签名
|
||||||
|
|
||||||
|
|||||||
@ -64,10 +64,10 @@ get resourceList(): IPublicModelResource;
|
|||||||
|
|
||||||
```typescript
|
```typescript
|
||||||
/** 注册资源 */
|
/** 注册资源 */
|
||||||
registerResourceType(name: string, type: 'editor', options: IPublicResourceOptions): void;
|
registerResourceType(resourceTypeModel: IPublicTypeResourceType): void;
|
||||||
```
|
```
|
||||||
|
|
||||||
相关类型:[IPublicResourceOptions](https://github.com/alibaba/lowcode-engine/blob/main/packages/types/src/shell/type/resource-options.ts)
|
相关类型:[IPublicTypeResourceType](https://github.com/alibaba/lowcode-engine/blob/main/packages/types/src/shell/type/resource-type.ts)
|
||||||
|
|
||||||
### onChangeWindows
|
### onChangeWindows
|
||||||
|
|
||||||
|
|||||||
@ -39,12 +39,14 @@ import { ComponentActions } from '../component-actions';
|
|||||||
const logger = new Logger({ level: 'warn', bizName: 'designer' });
|
const logger = new Logger({ level: 'warn', bizName: 'designer' });
|
||||||
|
|
||||||
export interface DesignerProps {
|
export interface DesignerProps {
|
||||||
|
[key: string]: any;
|
||||||
editor: IPublicModelEditor;
|
editor: IPublicModelEditor;
|
||||||
shellModelFactory: IShellModelFactory;
|
shellModelFactory: IShellModelFactory;
|
||||||
className?: string;
|
className?: string;
|
||||||
style?: object;
|
style?: object;
|
||||||
defaultSchema?: IPublicTypeProjectSchema;
|
defaultSchema?: IPublicTypeProjectSchema;
|
||||||
hotkeys?: object;
|
hotkeys?: object;
|
||||||
|
viewName?: string;
|
||||||
simulatorProps?: object | ((document: DocumentModel) => object);
|
simulatorProps?: object | ((document: DocumentModel) => object);
|
||||||
simulatorComponent?: ComponentType<any>;
|
simulatorComponent?: ComponentType<any>;
|
||||||
dragGhostComponent?: ComponentType<any>;
|
dragGhostComponent?: ComponentType<any>;
|
||||||
@ -55,8 +57,6 @@ export interface DesignerProps {
|
|||||||
onDragstart?: (e: ILocateEvent) => void;
|
onDragstart?: (e: ILocateEvent) => void;
|
||||||
onDrag?: (e: ILocateEvent) => void;
|
onDrag?: (e: ILocateEvent) => void;
|
||||||
onDragend?: (e: { dragObject: IPublicModelDragObject; copy: boolean }, loc?: DropLocation) => void;
|
onDragend?: (e: { dragObject: IPublicModelDragObject; copy: boolean }, loc?: DropLocation) => void;
|
||||||
viewName?: string;
|
|
||||||
[key: string]: any;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface IDesigner {
|
export interface IDesigner {
|
||||||
@ -71,7 +71,9 @@ export interface IDesigner {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export class Designer implements IDesigner {
|
export class Designer implements IDesigner {
|
||||||
dragon: Dragon;
|
public dragon: Dragon;
|
||||||
|
|
||||||
|
public viewName: string | undefined;
|
||||||
|
|
||||||
readonly componentActions = new ComponentActions();
|
readonly componentActions = new ComponentActions();
|
||||||
|
|
||||||
@ -87,6 +89,24 @@ export class Designer implements IDesigner {
|
|||||||
|
|
||||||
readonly shellModelFactory: IShellModelFactory;
|
readonly shellModelFactory: IShellModelFactory;
|
||||||
|
|
||||||
|
private _dropLocation?: DropLocation;
|
||||||
|
|
||||||
|
private propsReducers = new Map<IPublicEnumTransformStage, IPublicTypePropsTransducer[]>();
|
||||||
|
|
||||||
|
private _lostComponentMetasMap = new Map<string, ComponentMeta>();
|
||||||
|
|
||||||
|
private props?: DesignerProps;
|
||||||
|
|
||||||
|
private oobxList: OffsetObserver[] = [];
|
||||||
|
|
||||||
|
@obx.ref private _componentMetasMap = new Map<string, ComponentMeta>();
|
||||||
|
|
||||||
|
@obx.ref private _simulatorComponent?: ComponentType<any>;
|
||||||
|
|
||||||
|
@obx.ref private _simulatorProps?: object | ((project: Project) => object);
|
||||||
|
|
||||||
|
@obx.ref private _suspensed = false;
|
||||||
|
|
||||||
get currentDocument() {
|
get currentDocument() {
|
||||||
return this.project.currentDocument;
|
return this.project.currentDocument;
|
||||||
}
|
}
|
||||||
@ -99,8 +119,6 @@ export class Designer implements IDesigner {
|
|||||||
return this.currentDocument?.selection;
|
return this.currentDocument?.selection;
|
||||||
}
|
}
|
||||||
|
|
||||||
viewName: string | undefined;
|
|
||||||
|
|
||||||
constructor(props: DesignerProps) {
|
constructor(props: DesignerProps) {
|
||||||
makeObservable(this);
|
makeObservable(this);
|
||||||
const { editor, viewName, shellModelFactory } = props;
|
const { editor, viewName, shellModelFactory } = props;
|
||||||
@ -234,8 +252,6 @@ export class Designer implements IDesigner {
|
|||||||
this.editor.eventBus.emit(`designer.${event}`, ...args);
|
this.editor.eventBus.emit(`designer.${event}`, ...args);
|
||||||
}
|
}
|
||||||
|
|
||||||
private _dropLocation?: DropLocation;
|
|
||||||
|
|
||||||
get dropLocation() {
|
get dropLocation() {
|
||||||
return this._dropLocation;
|
return this._dropLocation;
|
||||||
}
|
}
|
||||||
@ -270,8 +286,6 @@ export class Designer implements IDesigner {
|
|||||||
return new Scroller(scrollable);
|
return new Scroller(scrollable);
|
||||||
}
|
}
|
||||||
|
|
||||||
private oobxList: OffsetObserver[] = [];
|
|
||||||
|
|
||||||
createOffsetObserver(nodeInstance: INodeSelector): OffsetObserver | null {
|
createOffsetObserver(nodeInstance: INodeSelector): OffsetObserver | null {
|
||||||
const oobx = createOffsetObserver(nodeInstance);
|
const oobx = createOffsetObserver(nodeInstance);
|
||||||
this.clearOobxList();
|
this.clearOobxList();
|
||||||
@ -342,8 +356,6 @@ export class Designer implements IDesigner {
|
|||||||
return { target, index };
|
return { target, index };
|
||||||
}
|
}
|
||||||
|
|
||||||
private props?: DesignerProps;
|
|
||||||
|
|
||||||
setProps(nextProps: DesignerProps) {
|
setProps(nextProps: DesignerProps) {
|
||||||
const props = this.props ? { ...this.props, ...nextProps } : nextProps;
|
const props = this.props ? { ...this.props, ...nextProps } : nextProps;
|
||||||
if (this.props) {
|
if (this.props) {
|
||||||
@ -421,14 +433,10 @@ export class Designer implements IDesigner {
|
|||||||
return this.props?.[key];
|
return this.props?.[key];
|
||||||
}
|
}
|
||||||
|
|
||||||
@obx.ref private _simulatorComponent?: ComponentType<any>;
|
|
||||||
|
|
||||||
@computed get simulatorComponent(): ComponentType<any> | undefined {
|
@computed get simulatorComponent(): ComponentType<any> | undefined {
|
||||||
return this._simulatorComponent;
|
return this._simulatorComponent;
|
||||||
}
|
}
|
||||||
|
|
||||||
@obx.ref private _simulatorProps?: object | ((project: Project) => object);
|
|
||||||
|
|
||||||
@computed get simulatorProps(): object {
|
@computed get simulatorProps(): object {
|
||||||
if (typeof this._simulatorProps === 'function') {
|
if (typeof this._simulatorProps === 'function') {
|
||||||
return this._simulatorProps(this.project);
|
return this._simulatorProps(this.project);
|
||||||
@ -451,8 +459,6 @@ export class Designer implements IDesigner {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@obx.ref private _suspensed = false;
|
|
||||||
|
|
||||||
get suspensed(): boolean {
|
get suspensed(): boolean {
|
||||||
return this._suspensed;
|
return this._suspensed;
|
||||||
}
|
}
|
||||||
@ -473,16 +479,15 @@ export class Designer implements IDesigner {
|
|||||||
this.project.load(schema);
|
this.project.load(schema);
|
||||||
}
|
}
|
||||||
|
|
||||||
@obx.ref private _componentMetasMap = new Map<string, ComponentMeta>();
|
|
||||||
|
|
||||||
private _lostComponentMetasMap = new Map<string, ComponentMeta>();
|
|
||||||
|
|
||||||
buildComponentMetasMap(metas: IPublicTypeComponentMetadata[]) {
|
buildComponentMetasMap(metas: IPublicTypeComponentMetadata[]) {
|
||||||
metas.forEach((data) => this.createComponentMeta(data));
|
metas.forEach((data) => this.createComponentMeta(data));
|
||||||
}
|
}
|
||||||
|
|
||||||
createComponentMeta(data: IPublicTypeComponentMetadata): ComponentMeta {
|
createComponentMeta(data: IPublicTypeComponentMetadata): ComponentMeta | null {
|
||||||
const key = data.componentName;
|
const key = data.componentName;
|
||||||
|
if (!key) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
let meta = this._componentMetasMap.get(key);
|
let meta = this._componentMetasMap.get(key);
|
||||||
if (meta) {
|
if (meta) {
|
||||||
meta.setMetadata(data);
|
meta.setMetadata(data);
|
||||||
@ -552,8 +557,6 @@ export class Designer implements IDesigner {
|
|||||||
return maps;
|
return maps;
|
||||||
}
|
}
|
||||||
|
|
||||||
private propsReducers = new Map<IPublicEnumTransformStage, IPublicTypePropsTransducer[]>();
|
|
||||||
|
|
||||||
transformProps(props: IPublicTypeCompositeObject | IPublicTypePropsList, node: Node, stage: IPublicEnumTransformStage) {
|
transformProps(props: IPublicTypeCompositeObject | IPublicTypePropsList, node: Node, stage: IPublicEnumTransformStage) {
|
||||||
if (Array.isArray(props)) {
|
if (Array.isArray(props)) {
|
||||||
// current not support, make this future
|
// current not support, make this future
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
import { IPublicApiWorkspace, IPublicResourceList, IPublicResourceOptions } from '@alilc/lowcode-types';
|
import { IPublicApiWorkspace, IPublicResourceList, IPublicTypeResourceType } from '@alilc/lowcode-types';
|
||||||
import { Workspace as InnerWorkSpace } from '@alilc/lowcode-workspace';
|
import { Workspace as InnerWorkSpace } from '@alilc/lowcode-workspace';
|
||||||
import { Plugins } from '@alilc/lowcode-shell';
|
import { Plugins } from '@alilc/lowcode-shell';
|
||||||
import { Window } from '../model/window';
|
import { Window } from '../model/window';
|
||||||
@ -32,8 +32,8 @@ export class Workspace implements IPublicApiWorkspace {
|
|||||||
return new Window(this[workspaceSymbol].window);
|
return new Window(this[workspaceSymbol].window);
|
||||||
}
|
}
|
||||||
|
|
||||||
registerResourceType(name: string, type: 'editor', options: IPublicResourceOptions): void {
|
registerResourceType(resourceTypeModel: IPublicTypeResourceType): void {
|
||||||
this[workspaceSymbol].registerResourceType(name, type, options);
|
this[workspaceSymbol].registerResourceType(resourceTypeModel);
|
||||||
}
|
}
|
||||||
|
|
||||||
openEditorWindow(resourceName: string, title: string, extra: Object, viewName?: string) {
|
openEditorWindow(resourceName: string, title: string, extra: Object, viewName?: string) {
|
||||||
|
|||||||
@ -14,5 +14,4 @@ export * from './props';
|
|||||||
export * from './selection';
|
export * from './selection';
|
||||||
export * from './setting-prop-entry';
|
export * from './setting-prop-entry';
|
||||||
export * from './setting-top-entry';
|
export * from './setting-top-entry';
|
||||||
export * from './resource';
|
export * from './resource';
|
||||||
export * from './resource-type';
|
|
||||||
@ -1,22 +0,0 @@
|
|||||||
import { IPublicModelResourceType } from '@alilc/lowcode-types';
|
|
||||||
import { ResourceType as InnerResourceType } from '@alilc/lowcode-workspace';
|
|
||||||
import { resourceTypeSymbol } from '../symbols';
|
|
||||||
|
|
||||||
export class ResourceType implements IPublicModelResourceType {
|
|
||||||
readonly [resourceTypeSymbol]: InnerResourceType;
|
|
||||||
constructor(resourceType: InnerResourceType) {
|
|
||||||
this[resourceTypeSymbol] = resourceType;
|
|
||||||
}
|
|
||||||
|
|
||||||
get name() {
|
|
||||||
return this[resourceTypeSymbol].name;
|
|
||||||
}
|
|
||||||
|
|
||||||
get description() {
|
|
||||||
return this[resourceTypeSymbol].options.description;
|
|
||||||
}
|
|
||||||
|
|
||||||
get icon() {
|
|
||||||
return this[resourceTypeSymbol].options.icon;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -22,7 +22,15 @@ export class Resource implements IPublicModelResource {
|
|||||||
return this[resourceSymbol].options;
|
return this[resourceSymbol].options;
|
||||||
}
|
}
|
||||||
|
|
||||||
get resourceType() {
|
get name() {
|
||||||
return new ResourceType(this[resourceSymbol].resourceType);
|
return this[resourceSymbol].resourceType.name;
|
||||||
|
}
|
||||||
|
|
||||||
|
get type() {
|
||||||
|
return this[resourceSymbol].resourceType.type;
|
||||||
|
}
|
||||||
|
|
||||||
|
get category() {
|
||||||
|
return this[resourceSymbol].category;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1,13 +1,13 @@
|
|||||||
import { windowSymbol } from '../symbols';
|
import { windowSymbol } from '../symbols';
|
||||||
import { IPublicModelWindow } from '@alilc/lowcode-types';
|
import { IPublicModelResource, IPublicModelWindow } from '@alilc/lowcode-types';
|
||||||
import { EditorWindow } from '@alilc/lowcode-workspace';
|
import { EditorWindow } from '@alilc/lowcode-workspace';
|
||||||
import { ResourceType } from './resource-type';
|
import { Resource } from './resource';
|
||||||
|
|
||||||
export class Window implements IPublicModelWindow {
|
export class Window implements IPublicModelWindow {
|
||||||
private readonly [windowSymbol]: EditorWindow;
|
private readonly [windowSymbol]: EditorWindow;
|
||||||
|
|
||||||
get id() {
|
get id() {
|
||||||
return this[windowSymbol].id;
|
return this[windowSymbol]?.id;
|
||||||
}
|
}
|
||||||
|
|
||||||
get title() {
|
get title() {
|
||||||
@ -18,8 +18,8 @@ export class Window implements IPublicModelWindow {
|
|||||||
return this[windowSymbol].icon;
|
return this[windowSymbol].icon;
|
||||||
}
|
}
|
||||||
|
|
||||||
get resourceType(): ResourceType {
|
get resource(): IPublicModelResource {
|
||||||
return new ResourceType(this[windowSymbol].resourceType);
|
return new Resource(this[windowSymbol].resource);
|
||||||
}
|
}
|
||||||
|
|
||||||
constructor(editorWindow: EditorWindow) {
|
constructor(editorWindow: EditorWindow) {
|
||||||
|
|||||||
@ -1,6 +1,5 @@
|
|||||||
import { IPublicModelWindow } from '../model';
|
import { IPublicModelWindow } from '../model';
|
||||||
import { IPublicResourceOptions } from '../type';
|
import { IPublicApiPlugins, IPublicModelResource, IPublicResourceList, IPublicTypeResourceType } from '@alilc/lowcode-types';
|
||||||
import { IPublicApiPlugins, IPublicModelResource, IPublicResourceList } from '@alilc/lowcode-types';
|
|
||||||
|
|
||||||
export interface IPublicApiWorkspace {
|
export interface IPublicApiWorkspace {
|
||||||
|
|
||||||
@ -10,6 +9,11 @@ export interface IPublicApiWorkspace {
|
|||||||
/** 当前设计器窗口 */
|
/** 当前设计器窗口 */
|
||||||
window: IPublicModelWindow;
|
window: IPublicModelWindow;
|
||||||
|
|
||||||
|
plugins: IPublicApiPlugins;
|
||||||
|
|
||||||
|
/** 当前设计器的编辑窗口 */
|
||||||
|
windows: IPublicModelWindow[];
|
||||||
|
|
||||||
/** 获取资源树列表 */
|
/** 获取资源树列表 */
|
||||||
get resourceList(): IPublicModelResource[];
|
get resourceList(): IPublicModelResource[];
|
||||||
|
|
||||||
@ -20,7 +24,7 @@ export interface IPublicApiWorkspace {
|
|||||||
onResourceListChange(fn: (resourceList: IPublicResourceList) => void): () => void;
|
onResourceListChange(fn: (resourceList: IPublicResourceList) => void): () => void;
|
||||||
|
|
||||||
/** 注册资源 */
|
/** 注册资源 */
|
||||||
registerResourceType(resourceName: string, type: 'editor', options: IPublicResourceOptions): void;
|
registerResourceType(resourceTypeModel: IPublicTypeResourceType): void;
|
||||||
|
|
||||||
/** 打开视图窗口 */
|
/** 打开视图窗口 */
|
||||||
openEditorWindow(resourceName: string, title: string, extra: Object, viewName?: string): void;
|
openEditorWindow(resourceName: string, title: string, extra: Object, viewName?: string): void;
|
||||||
@ -34,14 +38,9 @@ export interface IPublicApiWorkspace {
|
|||||||
/** 通过视图 id 移除窗口 */
|
/** 通过视图 id 移除窗口 */
|
||||||
removeEditorWindowById(id: string): void;
|
removeEditorWindowById(id: string): void;
|
||||||
|
|
||||||
plugins: IPublicApiPlugins;
|
|
||||||
|
|
||||||
/** 当前设计器的编辑窗口 */
|
|
||||||
windows: IPublicModelWindow[];
|
|
||||||
|
|
||||||
/** 窗口新增/删除的事件 */
|
/** 窗口新增/删除的事件 */
|
||||||
onChangeWindows: (fn: () => void) => void;
|
onChangeWindows(fn: () => void): void;
|
||||||
|
|
||||||
/** active 窗口变更事件 */
|
/** active 窗口变更事件 */
|
||||||
onChangeActiveWindow: (fn: () => void) => void;
|
onChangeActiveWindow(fn: () => void): void;
|
||||||
}
|
}
|
||||||
@ -28,5 +28,4 @@ export * from './editor';
|
|||||||
export * from './preference';
|
export * from './preference';
|
||||||
export * from './plugin-instance';
|
export * from './plugin-instance';
|
||||||
export * from './sensor';
|
export * from './sensor';
|
||||||
export * from './resource-type';
|
|
||||||
export * from './resource';
|
export * from './resource';
|
||||||
@ -1,7 +0,0 @@
|
|||||||
import { ReactElement } from 'react';
|
|
||||||
|
|
||||||
export interface IPublicModelResourceType {
|
|
||||||
get description(): string | undefined;
|
|
||||||
|
|
||||||
get icon(): ReactElement | undefined;
|
|
||||||
}
|
|
||||||
@ -2,11 +2,15 @@ import { ReactElement } from 'react';
|
|||||||
import { IPublicModelResourceType } from './resource-type';
|
import { IPublicModelResourceType } from './resource-type';
|
||||||
|
|
||||||
export interface IPublicModelResource {
|
export interface IPublicModelResource {
|
||||||
get title(): string;
|
get title(): string | undefined;
|
||||||
|
|
||||||
get icon(): ReactElement | undefined;
|
get icon(): ReactElement | undefined;
|
||||||
|
|
||||||
get options(): Object;
|
get options(): Object;
|
||||||
|
|
||||||
get resourceType(): IPublicModelResourceType | undefined;
|
get name(): string | undefined;
|
||||||
|
|
||||||
|
get type(): string | undefined;
|
||||||
|
|
||||||
|
get category(): string | undefined;
|
||||||
}
|
}
|
||||||
@ -1,18 +1,9 @@
|
|||||||
import { ReactElement } from 'react';
|
import { ReactElement } from 'react';
|
||||||
import { IPublicTypeNodeSchema } from '../type';
|
import { IPublicTypeNodeSchema } from '../type';
|
||||||
import { IPublicModelResourceType } from './resource-type';
|
import { IPublicModelResource } from './resource';
|
||||||
|
|
||||||
export interface IPublicModelWindow {
|
export interface IPublicModelWindow {
|
||||||
|
|
||||||
/** 当前窗口导入 schema */
|
|
||||||
importSchema(schema: IPublicTypeNodeSchema): void;
|
|
||||||
|
|
||||||
/** 修改当前窗口视图类型 */
|
|
||||||
changeViewType(viewName: string): void;
|
|
||||||
|
|
||||||
/** 调用当前窗口视图保存钩子 */
|
|
||||||
save(): Promise<any>;
|
|
||||||
|
|
||||||
/** 窗口 id */
|
/** 窗口 id */
|
||||||
id: string;
|
id: string;
|
||||||
|
|
||||||
@ -23,5 +14,14 @@ export interface IPublicModelWindow {
|
|||||||
icon?: ReactElement;
|
icon?: ReactElement;
|
||||||
|
|
||||||
/** 窗口资源类型 */
|
/** 窗口资源类型 */
|
||||||
resourceType?: IPublicModelResourceType;
|
resource?: IPublicModelResource;
|
||||||
|
|
||||||
|
/** 当前窗口导入 schema */
|
||||||
|
importSchema(schema: IPublicTypeNodeSchema): void;
|
||||||
|
|
||||||
|
/** 修改当前窗口视图类型 */
|
||||||
|
changeViewType(viewName: string): void;
|
||||||
|
|
||||||
|
/** 调用当前窗口视图保存钩子 */
|
||||||
|
save(): Promise<any>;
|
||||||
}
|
}
|
||||||
8
packages/types/src/shell/type/editor-view-config.ts
Normal file
8
packages/types/src/shell/type/editor-view-config.ts
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
export interface IPublicEditorViewConfig {
|
||||||
|
|
||||||
|
/** 视图初始化钩子 */
|
||||||
|
init?: () => Promise<void>;
|
||||||
|
|
||||||
|
/** 资源保存时,会调用视图的钩子 */
|
||||||
|
save?: () => Promise<void>;
|
||||||
|
}
|
||||||
12
packages/types/src/shell/type/editor-view.ts
Normal file
12
packages/types/src/shell/type/editor-view.ts
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
import { IPublicEditorViewConfig } from './editor-view-config';
|
||||||
|
|
||||||
|
export interface IPublicTypeEditorView {
|
||||||
|
|
||||||
|
/** 资源名字 */
|
||||||
|
viewName: string;
|
||||||
|
|
||||||
|
/** 资源类型 */
|
||||||
|
viewType?: 'editor' | 'webview';
|
||||||
|
|
||||||
|
(ctx: any, options: any): IPublicEditorViewConfig;
|
||||||
|
}
|
||||||
@ -73,7 +73,7 @@ export * from './tip-config';
|
|||||||
export * from './widget-config-area';
|
export * from './widget-config-area';
|
||||||
export * from './hotkey-callback';
|
export * from './hotkey-callback';
|
||||||
export * from './plugin-register-options';
|
export * from './plugin-register-options';
|
||||||
export * from './resource-options';
|
export * from './resource-list';
|
||||||
export * from './engine-options';
|
export * from './engine-options';
|
||||||
export * from './on-change-options';
|
export * from './on-change-options';
|
||||||
export * from './slot-schema';
|
export * from './slot-schema';
|
||||||
@ -82,4 +82,8 @@ export * from './node-instance';
|
|||||||
export * from './editor-value-key';
|
export * from './editor-value-key';
|
||||||
export * from './editor-get-options';
|
export * from './editor-get-options';
|
||||||
export * from './editor-get-result';
|
export * from './editor-get-result';
|
||||||
export * from './editor-register-options';
|
export * from './editor-register-options';
|
||||||
|
export * from './editor-view';
|
||||||
|
export * from './resource-type';
|
||||||
|
export * from './resource-type-config';
|
||||||
|
export * from './editor-view-config';
|
||||||
10
packages/types/src/shell/type/resource-list.ts
Normal file
10
packages/types/src/shell/type/resource-list.ts
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
export interface IPublicResourceData {
|
||||||
|
resourceName: string;
|
||||||
|
title: string;
|
||||||
|
category: string;
|
||||||
|
options: {
|
||||||
|
[key: string]: any;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export type IPublicResourceList = IPublicResourceData[];
|
||||||
@ -1,56 +0,0 @@
|
|||||||
export interface IPublicViewFunctions {
|
|
||||||
|
|
||||||
/** 视图初始化钩子 */
|
|
||||||
init?: () => Promise<void>;
|
|
||||||
|
|
||||||
/** 资源保存时,会调用视图的钩子 */
|
|
||||||
save?: () => Promise<void>;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface IPublicEditorView {
|
|
||||||
|
|
||||||
/** 资源名字 */
|
|
||||||
viewName: string;
|
|
||||||
|
|
||||||
/** 资源类型 */
|
|
||||||
viewType?: 'editor' | 'webview';
|
|
||||||
(ctx: any, options: any): IPublicViewFunctions;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface IPublicResourceOptions {
|
|
||||||
|
|
||||||
/** 资源描述 */
|
|
||||||
description?: string;
|
|
||||||
|
|
||||||
/** 资源 icon 标识 */
|
|
||||||
icon?: React.ReactElement;
|
|
||||||
|
|
||||||
/** 默认视图类型 */
|
|
||||||
defaultViewType: string;
|
|
||||||
|
|
||||||
/** 资源视图 */
|
|
||||||
editorViews: IPublicEditorView[];
|
|
||||||
|
|
||||||
/** save 钩子 */
|
|
||||||
save?: (schema: {
|
|
||||||
[viewName: string]: any;
|
|
||||||
}) => Promise<void>;
|
|
||||||
|
|
||||||
/** import 钩子 */
|
|
||||||
import?: (schema: any) => Promise<{
|
|
||||||
[viewName: string]: any;
|
|
||||||
}>;
|
|
||||||
|
|
||||||
/** 默认标题 */
|
|
||||||
defaultTitle?: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface IPublicResourceData {
|
|
||||||
resourceName: string;
|
|
||||||
title: string;
|
|
||||||
options: {
|
|
||||||
[key: string]: any;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
export type IPublicResourceList = IPublicResourceData[];
|
|
||||||
31
packages/types/src/shell/type/resource-type-config.ts
Normal file
31
packages/types/src/shell/type/resource-type-config.ts
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
import { IPublicTypeEditorView } from './editor-view';
|
||||||
|
|
||||||
|
export interface IPublicResourceTypeConfig {
|
||||||
|
|
||||||
|
/** 资源描述 */
|
||||||
|
description?: string;
|
||||||
|
|
||||||
|
/** 资源 icon 标识 */
|
||||||
|
icon?: React.ReactElement;
|
||||||
|
|
||||||
|
/** 默认视图类型 */
|
||||||
|
defaultViewType: string;
|
||||||
|
|
||||||
|
/** 资源视图 */
|
||||||
|
editorViews: IPublicTypeEditorView[];
|
||||||
|
|
||||||
|
init?: () => void;
|
||||||
|
|
||||||
|
/** save 钩子 */
|
||||||
|
save?: (schema: {
|
||||||
|
[viewName: string]: any;
|
||||||
|
}) => Promise<void>;
|
||||||
|
|
||||||
|
/** import 钩子 */
|
||||||
|
import?: (schema: any) => Promise<{
|
||||||
|
[viewName: string]: any;
|
||||||
|
}>;
|
||||||
|
|
||||||
|
/** 默认标题 */
|
||||||
|
defaultTitle?: string;
|
||||||
|
}
|
||||||
10
packages/types/src/shell/type/resource-type.ts
Normal file
10
packages/types/src/shell/type/resource-type.ts
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
import { IPublicModelPluginContext } from '../model';
|
||||||
|
import { IPublicResourceTypeConfig } from './resource-type-config';
|
||||||
|
|
||||||
|
export interface IPublicTypeResourceType {
|
||||||
|
resourceName: string;
|
||||||
|
|
||||||
|
resourceType: string;
|
||||||
|
|
||||||
|
(ctx: IPublicModelPluginContext): IPublicResourceTypeConfig;
|
||||||
|
}
|
||||||
@ -1,5 +1,5 @@
|
|||||||
import { makeObservable, obx } from '@alilc/lowcode-editor-core';
|
import { makeObservable, obx } from '@alilc/lowcode-editor-core';
|
||||||
import { IPublicEditorView, IPublicViewFunctions } from '@alilc/lowcode-types';
|
import { IPublicEditorViewConfig, IPublicTypeEditorView } from '@alilc/lowcode-types';
|
||||||
import { flow } from 'mobx';
|
import { flow } from 'mobx';
|
||||||
import { Workspace as InnerWorkspace } from '../workspace';
|
import { Workspace as InnerWorkspace } from '../workspace';
|
||||||
import { BasicContext } from '../base-context';
|
import { BasicContext } from '../base-context';
|
||||||
@ -9,31 +9,12 @@ import { getWebviewPlugin } from '../inner-plugins/webview';
|
|||||||
export class Context extends BasicContext {
|
export class Context extends BasicContext {
|
||||||
viewName = 'editor-view';
|
viewName = 'editor-view';
|
||||||
|
|
||||||
instance: IPublicViewFunctions;
|
instance: IPublicEditorViewConfig;
|
||||||
|
|
||||||
viewType: 'editor' | 'webview';
|
viewType: 'editor' | 'webview';
|
||||||
|
|
||||||
constructor(public workspace: InnerWorkspace, public editorWindow: EditorWindow, public editorView: IPublicEditorView, options: Object) {
|
|
||||||
super(workspace, editorView.viewName, editorWindow);
|
|
||||||
this.viewType = editorView.viewType || 'editor';
|
|
||||||
this.viewName = editorView.viewName;
|
|
||||||
this.instance = editorView(this.innerPlugins._getLowCodePluginContext({
|
|
||||||
pluginName: 'any',
|
|
||||||
}), options);
|
|
||||||
makeObservable(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
@obx _activate = false;
|
@obx _activate = false;
|
||||||
|
|
||||||
setActivate = (_activate: boolean) => {
|
|
||||||
this._activate = _activate;
|
|
||||||
this.innerHotkey.activate(this._activate);
|
|
||||||
};
|
|
||||||
|
|
||||||
get active() {
|
|
||||||
return this._activate;
|
|
||||||
}
|
|
||||||
|
|
||||||
@obx isInit: boolean = false;
|
@obx isInit: boolean = false;
|
||||||
|
|
||||||
init = flow(function* (this: any) {
|
init = flow(function* (this: any) {
|
||||||
@ -48,6 +29,25 @@ export class Context extends BasicContext {
|
|||||||
this.isInit = true;
|
this.isInit = true;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
constructor(public workspace: InnerWorkspace, public editorWindow: EditorWindow, public editorView: IPublicTypeEditorView, options: Object) {
|
||||||
|
super(workspace, editorView.viewName, editorWindow);
|
||||||
|
this.viewType = editorView.viewType || 'editor';
|
||||||
|
this.viewName = editorView.viewName;
|
||||||
|
this.instance = editorView(this.innerPlugins._getLowCodePluginContext({
|
||||||
|
pluginName: 'any',
|
||||||
|
}), options);
|
||||||
|
makeObservable(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
setActivate = (_activate: boolean) => {
|
||||||
|
this._activate = _activate;
|
||||||
|
this.innerHotkey.activate(this._activate);
|
||||||
|
};
|
||||||
|
|
||||||
|
get active() {
|
||||||
|
return this._activate;
|
||||||
|
}
|
||||||
|
|
||||||
async save() {
|
async save() {
|
||||||
return await this.instance?.save?.();
|
return await this.instance?.save?.();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -2,20 +2,24 @@ import { uniqueId } from '@alilc/lowcode-utils';
|
|||||||
import { makeObservable, obx } from '@alilc/lowcode-editor-core';
|
import { makeObservable, obx } from '@alilc/lowcode-editor-core';
|
||||||
import { Context } from '../editor-view/context';
|
import { Context } from '../editor-view/context';
|
||||||
import { Workspace } from '../workspace';
|
import { Workspace } from '../workspace';
|
||||||
import { ResourceType } from '../resource-type';
|
import { Resource } from '../resource';
|
||||||
|
|
||||||
export class EditorWindow {
|
export class EditorWindow {
|
||||||
id: string = uniqueId('window');
|
id: string = uniqueId('window');
|
||||||
icon: React.ReactElement | undefined;
|
icon: React.ReactElement | undefined;
|
||||||
|
|
||||||
constructor(readonly resourceType: ResourceType, readonly workspace: Workspace, public title: string | undefined = '', private options: Object = {}) {
|
@obx.ref editorView: Context;
|
||||||
|
|
||||||
|
@obx editorViews: Map<string, Context> = new Map<string, Context>();
|
||||||
|
|
||||||
|
constructor(readonly resource: Resource, readonly workspace: Workspace, public title: string | undefined = '', private options: Object = {}) {
|
||||||
makeObservable(this);
|
makeObservable(this);
|
||||||
this.init();
|
this.init();
|
||||||
this.icon = resourceType.icon;
|
this.icon = resource.icon;
|
||||||
}
|
}
|
||||||
|
|
||||||
async importSchema(schema: any) {
|
async importSchema(schema: any) {
|
||||||
const newSchema = await this.resourceType.import(schema);
|
const newSchema = await this.resource.import(schema);
|
||||||
|
|
||||||
if (!newSchema) {
|
if (!newSchema) {
|
||||||
return;
|
return;
|
||||||
@ -29,13 +33,13 @@ export class EditorWindow {
|
|||||||
|
|
||||||
async save() {
|
async save() {
|
||||||
const value: any = {};
|
const value: any = {};
|
||||||
const editorViews = this.resourceType.editorViews;
|
const editorViews = this.resource.editorViews;
|
||||||
for (let i = 0; i < editorViews.length; i++) {
|
for (let i = 0; i < editorViews.length; i++) {
|
||||||
const name = editorViews[i].viewName;
|
const name = editorViews[i].viewName;
|
||||||
const saveResult = await this.editorViews.get(name)?.save();
|
const saveResult = await this.editorViews.get(name)?.save();
|
||||||
value[name] = saveResult;
|
value[name] = saveResult;
|
||||||
}
|
}
|
||||||
return await this.resourceType.save(value);
|
return await this.resource.save(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
async init() {
|
async init() {
|
||||||
@ -45,7 +49,7 @@ export class EditorWindow {
|
|||||||
}
|
}
|
||||||
|
|
||||||
initViewTypes = async () => {
|
initViewTypes = async () => {
|
||||||
const editorViews = this.resourceType.editorViews;
|
const editorViews = this.resource.editorViews;
|
||||||
for (let i = 0; i < editorViews.length; i++) {
|
for (let i = 0; i < editorViews.length; i++) {
|
||||||
const name = editorViews[i].viewName;
|
const name = editorViews[i].viewName;
|
||||||
await this.initViewType(name);
|
await this.initViewType(name);
|
||||||
@ -56,7 +60,7 @@ export class EditorWindow {
|
|||||||
};
|
};
|
||||||
|
|
||||||
execViewTypesInit = async () => {
|
execViewTypesInit = async () => {
|
||||||
const editorViews = this.resourceType.editorViews;
|
const editorViews = this.resource.editorViews;
|
||||||
for (let i = 0; i < editorViews.length; i++) {
|
for (let i = 0; i < editorViews.length; i++) {
|
||||||
const name = editorViews[i].viewName;
|
const name = editorViews[i].viewName;
|
||||||
this.changeViewType(name);
|
this.changeViewType(name);
|
||||||
@ -65,15 +69,11 @@ export class EditorWindow {
|
|||||||
};
|
};
|
||||||
|
|
||||||
setDefaultViewType = () => {
|
setDefaultViewType = () => {
|
||||||
this.changeViewType(this.resourceType.defaultViewType);
|
this.changeViewType(this.resource.defaultViewType);
|
||||||
};
|
};
|
||||||
|
|
||||||
@obx.ref editorView: Context;
|
|
||||||
|
|
||||||
@obx editorViews: Map<string, Context> = new Map<string, Context>();
|
|
||||||
|
|
||||||
initViewType = async (name: string) => {
|
initViewType = async (name: string) => {
|
||||||
const viewInfo = this.resourceType.getEditorView(name);
|
const viewInfo = this.resource.getEditorView(name);
|
||||||
if (this.editorViews.get(name)) {
|
if (this.editorViews.get(name)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,5 +1,4 @@
|
|||||||
export { Workspace } from './workspace';
|
export { Workspace } from './workspace';
|
||||||
export { ResourceType } from './resource-type';
|
|
||||||
export * from './editor-window/context';
|
export * from './editor-window/context';
|
||||||
export * from './layouts/workbench';
|
export * from './layouts/workbench';
|
||||||
export { Resource } from './resource';
|
export { Resource } from './resource';
|
||||||
|
|||||||
@ -48,9 +48,7 @@ class Contents extends Component<{ area: Area; itemClassName?: string }> {
|
|||||||
right.push(content);
|
right.push(content);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
if (!center || !center.length) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
return (
|
return (
|
||||||
<Fragment>
|
<Fragment>
|
||||||
<div className="lc-top-area-left">{left}</div>
|
<div className="lc-top-area-left">{left}</div>
|
||||||
|
|||||||
@ -1,53 +1,14 @@
|
|||||||
import { IPublicEditorView, IPublicModelResourceType, IPublicResourceOptions } from '@alilc/lowcode-types';
|
import { IPublicTypeResourceType } from '@alilc/lowcode-types';
|
||||||
|
|
||||||
export class ResourceType implements IPublicModelResourceType {
|
export class ResourceType {
|
||||||
constructor(readonly name: string, readonly type: 'editor' | 'webview', options: IPublicResourceOptions) {
|
constructor(readonly resourceTypeModel: IPublicTypeResourceType) {
|
||||||
if (options.editorViews) {
|
|
||||||
options.editorViews.forEach((d: any) => {
|
|
||||||
this.editorViewMap.set(d.viewName, d);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
this.options = options;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
get description() {
|
get name() {
|
||||||
return this.options.description;
|
return this.resourceTypeModel.resourceName;
|
||||||
}
|
}
|
||||||
|
|
||||||
options: IPublicResourceOptions;
|
get type() {
|
||||||
|
return this.resourceTypeModel.resourceType;
|
||||||
editorViewMap: Map<string, IPublicEditorView> = new Map<string, IPublicEditorView>();
|
|
||||||
|
|
||||||
init(ctx: any) {
|
|
||||||
this.options.init(ctx);
|
|
||||||
}
|
|
||||||
|
|
||||||
get icon() {
|
|
||||||
return this.options.icon;
|
|
||||||
}
|
|
||||||
|
|
||||||
async import(schema: any) {
|
|
||||||
return await this.options.import?.(schema);
|
|
||||||
}
|
|
||||||
|
|
||||||
getEditorView(name: string) {
|
|
||||||
return this.editorViewMap.get(name);
|
|
||||||
}
|
|
||||||
|
|
||||||
get defaultViewType() {
|
|
||||||
return this.options.defaultViewType || this.editorViewMap.keys().next().value;
|
|
||||||
}
|
|
||||||
|
|
||||||
get editorViews() {
|
|
||||||
return Array.from(this.editorViewMap.values());
|
|
||||||
}
|
|
||||||
|
|
||||||
async save(value: any) {
|
|
||||||
return await this.options.save?.(value);
|
|
||||||
}
|
|
||||||
|
|
||||||
get title() {
|
|
||||||
return this.options.defaultTitle;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1,29 +1,72 @@
|
|||||||
import { IPublicModelResource, IPublicResourceData } from '@alilc/lowcode-types';
|
import { IPublicTypeEditorView, IPublicModelResource, IPublicResourceData, IPublicResourceTypeConfig } from '@alilc/lowcode-types';
|
||||||
import { Logger } from '@alilc/lowcode-utils';
|
import { Logger } from '@alilc/lowcode-utils';
|
||||||
|
import { BasicContext } from './base-context';
|
||||||
import { ResourceType } from './resource-type';
|
import { ResourceType } from './resource-type';
|
||||||
|
import { Workspace as InnerWorkSpace } from './workspace';
|
||||||
|
|
||||||
const logger = new Logger({ level: 'warn', bizName: 'workspace:resource' });
|
const logger = new Logger({ level: 'warn', bizName: 'workspace:resource' });
|
||||||
|
|
||||||
export class Resource implements IPublicModelResource {
|
export class Resource implements IPublicModelResource {
|
||||||
constructor(readonly resourceData: IPublicResourceData, readonly resourceType: ResourceType) {
|
resourceTypeInstance: IPublicResourceTypeConfig;
|
||||||
|
|
||||||
|
editorViewMap: Map<string, IPublicTypeEditorView> = new Map<string, IPublicTypeEditorView>();
|
||||||
|
|
||||||
|
constructor(readonly resourceData: IPublicResourceData, readonly resourceType: ResourceType, workspace: InnerWorkSpace) {
|
||||||
|
this.resourceTypeInstance = resourceType.resourceTypeModel(new BasicContext(workspace, ''), {});
|
||||||
|
if (this.resourceTypeInstance.editorViews) {
|
||||||
|
this.resourceTypeInstance.editorViews.forEach((d: any) => {
|
||||||
|
this.editorViewMap.set(d.viewName, d);
|
||||||
|
});
|
||||||
|
}
|
||||||
if (!resourceType) {
|
if (!resourceType) {
|
||||||
logger.error(`resourceType[${resourceType}] is unValid.`);
|
logger.error(`resourceType[${resourceType}] is unValid.`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
get name() {
|
||||||
|
return this.resourceType.name;
|
||||||
|
}
|
||||||
|
|
||||||
|
get description() {
|
||||||
|
return this.resourceTypeInstance?.description;
|
||||||
|
}
|
||||||
|
|
||||||
get icon() {
|
get icon() {
|
||||||
return this.resourceType?.icon;
|
return this.resourceTypeInstance?.icon;
|
||||||
}
|
}
|
||||||
|
|
||||||
get type() {
|
get type() {
|
||||||
return this.resourceData.resourceName;
|
return this.resourceType.type;
|
||||||
}
|
}
|
||||||
|
|
||||||
get title() {
|
get title(): string | undefined {
|
||||||
return this.resourceData.title;
|
return this.resourceData.title || this.resourceTypeInstance.defaultTitle;
|
||||||
}
|
}
|
||||||
|
|
||||||
get options() {
|
get options() {
|
||||||
return this.resourceData.options;
|
return this.resourceData.options;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
get category() {
|
||||||
|
return this.resourceData?.category;
|
||||||
|
}
|
||||||
|
|
||||||
|
async import(schema: any) {
|
||||||
|
return await this.resourceTypeInstance.import?.(schema);
|
||||||
|
}
|
||||||
|
async save(value: any) {
|
||||||
|
return await this.resourceTypeInstance.save?.(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
get editorViews() {
|
||||||
|
return this.resourceTypeInstance.editorViews;
|
||||||
|
}
|
||||||
|
|
||||||
|
get defaultViewType() {
|
||||||
|
return this.resourceTypeInstance.defaultViewType;
|
||||||
|
}
|
||||||
|
|
||||||
|
getEditorView(name: string) {
|
||||||
|
return this.editorViewMap.get(name);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@ -1,7 +1,7 @@
|
|||||||
import { Designer } from '@alilc/lowcode-designer';
|
import { Designer } from '@alilc/lowcode-designer';
|
||||||
import { createModuleEventBus, Editor, IEventBus, makeObservable, obx } from '@alilc/lowcode-editor-core';
|
import { createModuleEventBus, Editor, IEventBus, makeObservable, obx } from '@alilc/lowcode-editor-core';
|
||||||
import { Plugins } from '@alilc/lowcode-shell';
|
import { Plugins } from '@alilc/lowcode-shell';
|
||||||
import { IPublicApiWorkspace, IPublicResourceList, IPublicResourceOptions } from '@alilc/lowcode-types';
|
import { IPublicApiWorkspace, IPublicResourceList, IPublicTypeResourceType } from '@alilc/lowcode-types';
|
||||||
import { BasicContext } from './base-context';
|
import { BasicContext } from './base-context';
|
||||||
import { EditorWindow } from './editor-window/context';
|
import { EditorWindow } from './editor-window/context';
|
||||||
import { Resource } from './resource';
|
import { Resource } from './resource';
|
||||||
@ -16,7 +16,7 @@ enum event {
|
|||||||
const CHANGE_EVENT = 'resource.list.change';
|
const CHANGE_EVENT = 'resource.list.change';
|
||||||
|
|
||||||
export class Workspace implements IPublicApiWorkspace {
|
export class Workspace implements IPublicApiWorkspace {
|
||||||
private context: BasicContext;
|
context: BasicContext;
|
||||||
|
|
||||||
private emitter: IEventBus = createModuleEventBus('workspace');
|
private emitter: IEventBus = createModuleEventBus('workspace');
|
||||||
|
|
||||||
@ -28,6 +28,18 @@ export class Workspace implements IPublicApiWorkspace {
|
|||||||
return this.context.innerPlugins;
|
return this.context.innerPlugins;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private _isActive = false;
|
||||||
|
|
||||||
|
windows: EditorWindow[] = [];
|
||||||
|
|
||||||
|
editorWindowMap: Map<string, EditorWindow> = new Map<string, EditorWindow>();
|
||||||
|
|
||||||
|
@obx.ref window: EditorWindow;
|
||||||
|
|
||||||
|
private resourceTypeMap: Map<string, ResourceType> = new Map();
|
||||||
|
|
||||||
|
private resourceList: Resource[] = [];
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
readonly registryInnerPlugin: (designer: Designer, editor: Editor, plugins: Plugins) => Promise<void>,
|
readonly registryInnerPlugin: (designer: Designer, editor: Editor, plugins: Plugins) => Promise<void>,
|
||||||
readonly shellModelFactory: any,
|
readonly shellModelFactory: any,
|
||||||
@ -42,19 +54,18 @@ export class Workspace implements IPublicApiWorkspace {
|
|||||||
}
|
}
|
||||||
|
|
||||||
initWindow() {
|
initWindow() {
|
||||||
if (!this.defaultResource) {
|
if (!this.defaultResourceType) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const title = this.defaultResource.description;
|
const title = this.defaultResourceType.name;
|
||||||
this.window = new EditorWindow(this.defaultResource, this, title);
|
const resource = new Resource({}, this.defaultResourceType, this);
|
||||||
|
this.window = new EditorWindow(resource, this, title);
|
||||||
this.editorWindowMap.set(this.window.id, this.window);
|
this.editorWindowMap.set(this.window.id, this.window);
|
||||||
this.windows.push(this.window);
|
this.windows.push(this.window);
|
||||||
this.emitChangeWindow();
|
this.emitChangeWindow();
|
||||||
this.emitChangeActiveWindow();
|
this.emitChangeActiveWindow();
|
||||||
}
|
}
|
||||||
|
|
||||||
private _isActive = false;
|
|
||||||
|
|
||||||
get isActive() {
|
get isActive() {
|
||||||
return this._isActive;
|
return this._isActive;
|
||||||
}
|
}
|
||||||
@ -63,22 +74,12 @@ export class Workspace implements IPublicApiWorkspace {
|
|||||||
this._isActive = value;
|
this._isActive = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
windows: EditorWindow[] = [];
|
async registerResourceType(resourceTypeModel: IPublicTypeResourceType): Promise<void> {
|
||||||
|
if (resourceTypeModel.resourceType === 'editor') {
|
||||||
|
const resourceType = new ResourceType(resourceTypeModel);
|
||||||
|
this.resourceTypeMap.set(resourceTypeModel.resourceName, resourceType);
|
||||||
|
|
||||||
editorWindowMap: Map<string, EditorWindow> = new Map<string, EditorWindow>();
|
if (!this.window && this.defaultResourceType) {
|
||||||
|
|
||||||
@obx.ref window: EditorWindow;
|
|
||||||
|
|
||||||
private resourceTypeMap: Map<string, ResourceType> = new Map();
|
|
||||||
|
|
||||||
private resourceList: Resource[] = [];
|
|
||||||
|
|
||||||
async registerResourceType(resourceName: string, type: 'editor' | 'webview', options: IPublicResourceOptions): Promise<void> {
|
|
||||||
if (type === 'editor') {
|
|
||||||
const resourceType = new ResourceType(resourceName, type, options);
|
|
||||||
this.resourceTypeMap.set(resourceName, resourceType);
|
|
||||||
|
|
||||||
if (!this.window && this.defaultResource) {
|
|
||||||
this.initWindow();
|
this.initWindow();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -89,7 +90,7 @@ export class Workspace implements IPublicApiWorkspace {
|
|||||||
}
|
}
|
||||||
|
|
||||||
setResourceList(resourceList: IPublicResourceList) {
|
setResourceList(resourceList: IPublicResourceList) {
|
||||||
this.resourceList = resourceList.map(d => new Resource(d, this.getResourceType(d.resourceName)));
|
this.resourceList = resourceList.map(d => new Resource(d, this.getResourceType(d.resourceName), this));
|
||||||
this.emitter.emit(CHANGE_EVENT, resourceList);
|
this.emitter.emit(CHANGE_EVENT, resourceList);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -104,9 +105,9 @@ export class Workspace implements IPublicApiWorkspace {
|
|||||||
return this.resourceTypeMap.get(resourceName)!;
|
return this.resourceTypeMap.get(resourceName)!;
|
||||||
}
|
}
|
||||||
|
|
||||||
get defaultResource(): ResourceType | null {
|
get defaultResourceType(): ResourceType | null {
|
||||||
if (this.resourceTypeMap.size > 1) {
|
if (this.resourceTypeMap.size >= 1) {
|
||||||
return this.resourceTypeMap.values().next().value;
|
return Array.from(this.resourceTypeMap.values())[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
@ -134,7 +135,7 @@ export class Workspace implements IPublicApiWorkspace {
|
|||||||
}
|
}
|
||||||
|
|
||||||
removeEditorWindow(resourceName: string, title: string) {
|
removeEditorWindow(resourceName: string, title: string) {
|
||||||
const index = this.windows.findIndex(d => (d.resourceType.name === resourceName && d.title));
|
const index = this.windows.findIndex(d => (d.resource.name === resourceName && d.title));
|
||||||
this.remove(index);
|
this.remove(index);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -152,13 +153,14 @@ export class Workspace implements IPublicApiWorkspace {
|
|||||||
console.error(`${name} is not available`);
|
console.error(`${name} is not available`);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const filterWindows = this.windows.filter(d => (d.resourceType.name === name && d.title == title));
|
const filterWindows = this.windows.filter(d => (d.resource.name === name && d.title == title));
|
||||||
if (filterWindows && filterWindows.length) {
|
if (filterWindows && filterWindows.length) {
|
||||||
this.window = filterWindows[0];
|
this.window = filterWindows[0];
|
||||||
this.emitChangeActiveWindow();
|
this.emitChangeActiveWindow();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
this.window = new EditorWindow(resourceType, this, title, options);
|
const resource = new Resource({}, resourceType, this);
|
||||||
|
this.window = new EditorWindow(resource, this, title, options);
|
||||||
this.windows.push(this.window);
|
this.windows.push(this.window);
|
||||||
this.editorWindowMap.set(this.window.id, this.window);
|
this.editorWindowMap.set(this.window.id, this.window);
|
||||||
this.emitChangeWindow();
|
this.emitChangeWindow();
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user