mirror of
https://github.com/alibaba/lowcode-engine.git
synced 2026-03-05 09:47:20 +00:00
117 lines
2.8 KiB
TypeScript
117 lines
2.8 KiB
TypeScript
import { assign, find, get } from 'lodash';
|
|
import { Component } from 'react';
|
|
|
|
import bus from '../bus';
|
|
import {
|
|
BaseManager,
|
|
connectGeneralManager,
|
|
connectGeneralManagerList,
|
|
IEmitter,
|
|
IEventNameMap,
|
|
IManagerController,
|
|
INameable,
|
|
IObservable,
|
|
} from './base';
|
|
import VisualManager from './visualManager';
|
|
|
|
interface IDesignerProps {
|
|
name?: string;
|
|
visualManagers?: VisualManager[];
|
|
emitter?: IEmitter;
|
|
}
|
|
|
|
export default class VisualDesigner extends Component implements IManagerController, IObservable, INameable {
|
|
static NAME = 'VisualDesigner';
|
|
|
|
static EVENTS: IEventNameMap = {};
|
|
|
|
props: IDesignerProps = {};
|
|
|
|
defaultProps: IDesignerProps = {
|
|
name: 'defaultDesigner',
|
|
visualManagers: [],
|
|
};
|
|
|
|
private visualManagerList: VisualManager[] = [];
|
|
|
|
private name = '';
|
|
|
|
private id = '';
|
|
|
|
private emitter: IEmitter;
|
|
|
|
constructor(props: IDesignerProps) {
|
|
super(props);
|
|
this.setName(props.name || get(this, 'constructor', 'NAME'));
|
|
this.connectManagerList(this.props.visualManagers as any);
|
|
|
|
if (props.emitter) {
|
|
// 使用自定义的满足 EventEmitter 接口要求的自定义事件对象
|
|
this.emitter = props.emitter;
|
|
} else {
|
|
this.emitter = bus;
|
|
}
|
|
}
|
|
|
|
getId(): string {
|
|
return this.id;
|
|
}
|
|
|
|
setName(name: string): this {
|
|
this.name = name;
|
|
return this;
|
|
}
|
|
|
|
getName() {
|
|
return this.name;
|
|
}
|
|
|
|
getManager(): VisualManager {
|
|
return this.visualManagerList[0];
|
|
}
|
|
|
|
getManagerByName(name?: string): VisualManager[] {
|
|
return this.visualManagerList.filter((m) => m.getName() === name);
|
|
}
|
|
|
|
getManagerById(id: string): VisualManager {
|
|
return find(this.visualManagerList, (m) => m.getId() === id) as VisualManager;
|
|
}
|
|
|
|
getManagerList(): VisualManager[] {
|
|
return this.visualManagerList;
|
|
}
|
|
|
|
connectManager(manager: VisualManager) {
|
|
connectGeneralManager.call(this, manager, this.visualManagerList);
|
|
return this;
|
|
}
|
|
|
|
connectManagerList(managerList: VisualManager[]): this {
|
|
this.visualManagerList = connectGeneralManagerList.call(this, managerList, this.visualManagerList);
|
|
return this;
|
|
}
|
|
|
|
getEventMap() {
|
|
/**
|
|
* Hack for get current constructor
|
|
* because if we write this.constructor.EVENTS
|
|
* ts compiler will show compiled error
|
|
*/
|
|
return get(this, 'constructor', BaseManager.EVENTS);
|
|
}
|
|
|
|
notifyAllManagers(eventName: string | symbol, ...eventData: any[]): boolean {
|
|
return this.visualManagerList.map((m) => m.emit(eventName, eventData)).every((r) => r);
|
|
}
|
|
|
|
on(eventName: string | symbol, callback: () => any) {
|
|
this.emitter.on(eventName, callback);
|
|
return () => this.emitter.removeListener(eventName, callback);
|
|
}
|
|
|
|
emit(eventName: string | symbol, ...eventData: any[]): boolean {
|
|
return this.emitter.emit.call(this.emitter, eventName, ...eventData);
|
|
}
|
|
}
|