mirror of
https://github.com/alibaba/lowcode-engine.git
synced 2026-01-19 14:04:28 +00:00
fix: editor
This commit is contained in:
parent
c0c8760936
commit
ccd916287f
@ -68,7 +68,7 @@ export type HooksConfig = HookConfig[];
|
|||||||
export interface HookConfig {
|
export interface HookConfig {
|
||||||
message: string;
|
message: string;
|
||||||
type: 'on' | 'once';
|
type: 'on' | 'once';
|
||||||
handler: (editor: Editor, ...args: []) => void;
|
handler: (editor: Editor, ...args: any[]) => void;
|
||||||
}
|
}
|
||||||
|
|
||||||
export type ShortCutsConfig = ShortCutConfig[];
|
export type ShortCutsConfig = ShortCutConfig[];
|
||||||
|
|||||||
@ -70,39 +70,41 @@ export interface HooksFuncs {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export default class Editor extends EventEmitter {
|
export default class Editor extends EventEmitter {
|
||||||
public static getInstance = (config: EditorConfig, components: PluginClassSet, utils?: Utils): Editor => {
|
static getInstance = (config: EditorConfig, components: PluginClassSet, utils?: Utils): Editor => {
|
||||||
if (!instance) {
|
if (!instance) {
|
||||||
instance = new Editor(config, components, utils);
|
instance = new Editor(config, components, utils);
|
||||||
}
|
}
|
||||||
return instance;
|
return instance;
|
||||||
};
|
};
|
||||||
|
|
||||||
public config: EditorConfig;
|
private _components?: PluginClassSet;
|
||||||
|
get components(): PluginClassSet {
|
||||||
public components: PluginClassSet;
|
if (!this._components) {
|
||||||
|
this._components = {};
|
||||||
public utils: Utils;
|
Object.keys(this.componentsMap).forEach((key) => {
|
||||||
|
(this._components as any)[key] = pluginFactory(this.componentsMap[key]);
|
||||||
public pluginStatus: PluginStatusSet;
|
|
||||||
|
|
||||||
public plugins: PluginSet;
|
|
||||||
|
|
||||||
public locale: LocaleType;
|
|
||||||
|
|
||||||
private hooksFuncs: HooksFuncs;
|
|
||||||
|
|
||||||
constructor(config: EditorConfig = {}, components: PluginClassSet = {}, utils?: Utils) {
|
|
||||||
super();
|
|
||||||
this.config = config;
|
|
||||||
this.components = {};
|
|
||||||
Object.entries(components).forEach(([key, value]): void => {
|
|
||||||
this.components[key] = pluginFactory(value);
|
|
||||||
});
|
});
|
||||||
this.utils = { ...editorUtils, ...utils };
|
}
|
||||||
|
return this._components;
|
||||||
|
}
|
||||||
|
|
||||||
|
readonly utils: Utils;
|
||||||
|
|
||||||
|
pluginStatus?: PluginStatusSet;
|
||||||
|
|
||||||
|
plugins?: PluginSet;
|
||||||
|
|
||||||
|
locale?: LocaleType;
|
||||||
|
|
||||||
|
hooksFuncs?: HooksFuncs;
|
||||||
|
|
||||||
|
constructor(readonly config: EditorConfig = {}, readonly componentsMap: PluginClassSet = {}, utils?: Utils) {
|
||||||
|
super();
|
||||||
|
this.utils = ({ ...editorUtils, ...utils } as any);
|
||||||
instance = this;
|
instance = this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public init(): Promise<any> {
|
init(): Promise<any> {
|
||||||
const { hooks, shortCuts = [], lifeCycles } = this.config || {};
|
const { hooks, shortCuts = [], lifeCycles } = this.config || {};
|
||||||
this.locale = store.get('lowcode-editor-locale') || 'zh-CN';
|
this.locale = store.get('lowcode-editor-locale') || 'zh-CN';
|
||||||
// this.messages = this.messagesSet[this.locale];
|
// this.messages = this.messagesSet[this.locale];
|
||||||
@ -125,7 +127,7 @@ export default class Editor extends EventEmitter {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public destroy(): void {
|
destroy(): void {
|
||||||
debug('destroy');
|
debug('destroy');
|
||||||
try {
|
try {
|
||||||
const { hooks = [], shortCuts = [], lifeCycles = {} } = this.config;
|
const { hooks = [], shortCuts = [], lifeCycles = {} } = this.config;
|
||||||
@ -139,25 +141,26 @@ export default class Editor extends EventEmitter {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public get(key: string): any {
|
get(key: string): any {
|
||||||
return this[key];
|
return (this as any)[key];
|
||||||
}
|
}
|
||||||
|
|
||||||
public set(key: string | object, val: any): void {
|
set(key: string | object, val: any): void {
|
||||||
if (typeof key === 'string') {
|
if (typeof key === 'string') {
|
||||||
if (['init', 'destroy', 'get', 'set', 'batchOn', 'batchOff', 'batchOnce'].includes(key)) {
|
if (['init', 'destroy', 'get', 'set', 'batchOn', 'batchOff', 'batchOnce'].includes(key)) {
|
||||||
console.error('init, destroy, get, set, batchOn, batchOff, batchOnce is private attribute');
|
console.error('init, destroy, get, set, batchOn, batchOff, batchOnce is private attribute');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
this[key] = val;
|
// FIXME! set to plugins, not to this
|
||||||
|
(this as any)[key] = val;
|
||||||
} else if (typeof key === 'object') {
|
} else if (typeof key === 'object') {
|
||||||
Object.keys(key).forEach((item): void => {
|
Object.keys(key).forEach((item): void => {
|
||||||
this[item] = key[item];
|
(this as any)[item] = (key as any)[item];
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public batchOn(events: string[], lisenter: (...args) => void): void {
|
batchOn(events: string[], lisenter: (...args: any[]) => void): void {
|
||||||
if (!Array.isArray(events)) {
|
if (!Array.isArray(events)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -166,7 +169,7 @@ export default class Editor extends EventEmitter {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public batchOnce(events: string[], lisenter: (...args) => void): void {
|
batchOnce(events: string[], lisenter: (...args: any[]) => void): void {
|
||||||
if (!Array.isArray(events)) {
|
if (!Array.isArray(events)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -175,7 +178,7 @@ export default class Editor extends EventEmitter {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public batchOff(events: string[], lisenter: (...args) => void): void {
|
batchOff(events: string[], lisenter: (...args: any[]) => void): void {
|
||||||
if (!Array.isArray(events)) {
|
if (!Array.isArray(events)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -187,7 +190,7 @@ export default class Editor extends EventEmitter {
|
|||||||
// 销毁hooks中的消息监听
|
// 销毁hooks中的消息监听
|
||||||
private destroyHooks(hooks: HooksConfig = []): void {
|
private destroyHooks(hooks: HooksConfig = []): void {
|
||||||
hooks.forEach((item, idx): void => {
|
hooks.forEach((item, idx): void => {
|
||||||
if (typeof this.hooksFuncs[idx] === 'function') {
|
if (typeof this.hooksFuncs?.[idx] === 'function') {
|
||||||
this.off(item.message, this.hooksFuncs[idx]);
|
this.off(item.message, this.hooksFuncs[idx]);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -196,8 +199,8 @@ export default class Editor extends EventEmitter {
|
|||||||
|
|
||||||
// 初始化hooks中的消息监听
|
// 初始化hooks中的消息监听
|
||||||
private initHooks(hooks: HooksConfig = []): void {
|
private initHooks(hooks: HooksConfig = []): void {
|
||||||
this.hooksFuncs = hooks.map((item): ((...arg) => void) => {
|
this.hooksFuncs = hooks.map((item): ((...arg: any[]) => void) => {
|
||||||
const func = (...args): void => {
|
const func = (...args: any[]): void => {
|
||||||
item.handler(this, ...args);
|
item.handler(this, ...args);
|
||||||
};
|
};
|
||||||
this[item.type](item.message, func);
|
this[item.type](item.message, func);
|
||||||
|
|||||||
@ -17,6 +17,7 @@ import Widget, { isWidget, IWidget } from './widget';
|
|||||||
import PanelDock from './panel-dock';
|
import PanelDock from './panel-dock';
|
||||||
import Dock from './dock';
|
import Dock from './dock';
|
||||||
import { Stage, StageConfig } from './stage';
|
import { Stage, StageConfig } from './stage';
|
||||||
|
import { isValidElement } from 'react';
|
||||||
|
|
||||||
export class Skeleton {
|
export class Skeleton {
|
||||||
private panels = new Map<string, Panel>();
|
private panels = new Map<string, Panel>();
|
||||||
@ -127,6 +128,50 @@ export class Skeleton {
|
|||||||
}
|
}
|
||||||
return new Stage(this, config);
|
return new Stage(this, config);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
this.setupPlugins();
|
||||||
|
}
|
||||||
|
|
||||||
|
private setupPlugins() {
|
||||||
|
const { config, componentsMap } = this.editor;
|
||||||
|
const { plugins } = config;
|
||||||
|
if (!plugins) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Object.keys(plugins).forEach((area) => {
|
||||||
|
plugins[area].forEach(item => {
|
||||||
|
const { pluginKey, type, props = {}, pluginProps } = item;
|
||||||
|
const config: any = {
|
||||||
|
area,
|
||||||
|
type: "Widget",
|
||||||
|
name: pluginKey,
|
||||||
|
contentProps: pluginProps,
|
||||||
|
};
|
||||||
|
const { dialogProps, balloonProps, panelProps, linkProps, ...restProps } = props;
|
||||||
|
config.props = restProps;
|
||||||
|
if (dialogProps) {
|
||||||
|
config.dialogProps = dialogProps;
|
||||||
|
}
|
||||||
|
if (balloonProps) {
|
||||||
|
config.balloonProps = balloonProps;
|
||||||
|
}
|
||||||
|
if (panelProps) {
|
||||||
|
config.panelProps = panelProps;
|
||||||
|
}
|
||||||
|
if (linkProps) {
|
||||||
|
config.linkProps = linkProps;
|
||||||
|
}
|
||||||
|
if (type === 'TabPanel') {
|
||||||
|
config.type = 'Panel';
|
||||||
|
} else if (/Icon$/.test(type)) {
|
||||||
|
config.type = type.replace('Icon', 'Dock');
|
||||||
|
}
|
||||||
|
if (pluginKey in componentsMap) {
|
||||||
|
config.content = componentsMap[pluginKey];
|
||||||
|
}
|
||||||
|
this.add(config);
|
||||||
|
});
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
createWidget(config: IWidgetBaseConfig | IWidget) {
|
createWidget(config: IWidgetBaseConfig | IWidget) {
|
||||||
@ -169,26 +214,43 @@ export class Skeleton {
|
|||||||
}
|
}
|
||||||
|
|
||||||
add(config: IWidgetBaseConfig & { area: string }) {
|
add(config: IWidgetBaseConfig & { area: string }) {
|
||||||
const { area } = config;
|
const { content, ...restConfig } = config;
|
||||||
|
if (content) {
|
||||||
|
if (typeof content === 'object' && !isValidElement(content)) {
|
||||||
|
Object.keys(content).forEach(key => {
|
||||||
|
if (/props$/i.test(key) && restConfig[key]) {
|
||||||
|
restConfig[key] = {
|
||||||
|
...restConfig[key],
|
||||||
|
...content[key],
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
restConfig[key] = content[key];
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
restConfig.content = content;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const { area } = restConfig;
|
||||||
switch (area) {
|
switch (area) {
|
||||||
case 'leftArea': case 'left':
|
case 'leftArea': case 'left':
|
||||||
return this.leftArea.add(config as any);
|
return this.leftArea.add(restConfig as any);
|
||||||
case 'rightArea': case 'right':
|
case 'rightArea': case 'right':
|
||||||
return this.rightArea.add(config as any);
|
return this.rightArea.add(restConfig as any);
|
||||||
case 'topArea': case 'top':
|
case 'topArea': case 'top':
|
||||||
return this.topArea.add(config as any);
|
return this.topArea.add(restConfig as any);
|
||||||
case 'toolbar':
|
case 'toolbar':
|
||||||
return this.toolbar.add(config as any);
|
return this.toolbar.add(restConfig as any);
|
||||||
case 'mainArea': case 'main': case 'center': case 'centerArea':
|
case 'mainArea': case 'main': case 'center': case 'centerArea':
|
||||||
return this.mainArea.add(config as any);
|
return this.mainArea.add(restConfig as any);
|
||||||
case 'bottomArea': case 'bottom':
|
case 'bottomArea': case 'bottom':
|
||||||
return this.bottomArea.add(config as any);
|
return this.bottomArea.add(restConfig as any);
|
||||||
case 'leftFixedArea':
|
case 'leftFixedArea':
|
||||||
return this.leftFixedArea.add(config as any);
|
return this.leftFixedArea.add(restConfig as any);
|
||||||
case 'leftFloatArea':
|
case 'leftFloatArea':
|
||||||
return this.leftFloatArea.add(config as any);
|
return this.leftFloatArea.add(restConfig as any);
|
||||||
case 'stages':
|
case 'stages':
|
||||||
return this.stages.add(config as any);
|
return this.stages.add(restConfig as any);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user