2022-02-21 20:24:40 +08:00

178 lines
4.0 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import {
Skeleton as InnerSkeleton,
IWidgetBaseConfig,
IWidgetConfigArea,
SkeletonEvents,
} from '@alilc/lowcode-editor-skeleton';
import { skeletonSymbol } from './symbols';
export default class Skeleton {
private readonly [skeletonSymbol]: InnerSkeleton;
constructor(skeleton: InnerSkeleton) {
this[skeletonSymbol] = skeleton;
}
/**
* 增加一个面板实例
* @param config
* @param extraConfig
* @returns
*/
add(config: IWidgetBaseConfig, extraConfig?: Record<string, any>) {
return this[skeletonSymbol].add(config, extraConfig);
}
/**
* 移除一个面板实例
* @param config
* @returns
*/
remove(config: IWidgetBaseConfig) {
const { area, name } = config;
const skeleton = this[skeletonSymbol];
if (!normalizeArea(area)) return;
skeleton[normalizeArea(area)!].container.remove(name);
}
/**
* 显示面板
* @param name
*/
showPanel(name: string) {
this[skeletonSymbol].getPanel(name)?.show();
}
/**
* 隐藏面板
* @param name
*/
hidePanel(name: string) {
this[skeletonSymbol].getPanel(name)?.hide();
}
/**
* 显示 widget
* @param name
*/
showWidget(name: string) {
this[skeletonSymbol].getWidget(name)?.show();
}
/**
* enable widget
* @param name
*/
enableWidget(name: string) {
this[skeletonSymbol].getWidget(name)?.enable?.();
}
/**
* 隐藏 widget
* @param name
*/
hideWidget(name: string) {
this[skeletonSymbol].getWidget(name)?.hide();
}
/**
* disable widget不可点击
* @param name
*/
disableWidget(name: string) {
this[skeletonSymbol].getWidget(name)?.disable?.();
}
/**
* 监听 panel 显示事件
* @param listener
* @returns
*/
onShowPanel(listener: (...args: unknown[]) => void) {
const { editor } = this[skeletonSymbol];
editor.on(SkeletonEvents.PANEL_SHOW, (name: any, panel: any) => {
// 不泄漏 skeleton
const { skeleton, ...restPanel } = panel;
listener(name, restPanel);
});
return () => editor.off(SkeletonEvents.PANEL_SHOW, listener);
}
/**
* 监听 panel 隐藏事件
* @param listener
* @returns
*/
onHidePanel(listener: (...args: unknown[]) => void) {
const { editor } = this[skeletonSymbol];
editor.on(SkeletonEvents.PANEL_HIDE, (name: any, panel: any) => {
// 不泄漏 skeleton
const { skeleton, ...restPanel } = panel;
listener(name, restPanel);
});
return () => editor.off(SkeletonEvents.PANEL_HIDE, listener);
}
/**
* 监听 widget 显示事件
* @param listener
* @returns
*/
onShowWidget(listener: (...args: unknown[]) => void) {
const { editor } = this[skeletonSymbol];
editor.on(SkeletonEvents.WIDGET_SHOW, (name: any, panel: any) => {
// 不泄漏 skeleton
const { skeleton, ...rest } = panel;
listener(name, rest);
});
return () => editor.off(SkeletonEvents.WIDGET_SHOW, listener);
}
/**
* 监听 widget 隐藏事件
* @param listener
* @returns
*/
onHideWidget(listener: (...args: unknown[]) => void) {
const { editor } = this[skeletonSymbol];
editor.on(SkeletonEvents.WIDGET_HIDE, (name: any, panel: any) => {
// 不泄漏 skeleton
const { skeleton, ...rest } = panel;
listener(name, rest);
});
return () => editor.off(SkeletonEvents.WIDGET_HIDE, listener);
}
}
function normalizeArea(area: IWidgetConfigArea | undefined) {
switch (area) {
case 'leftArea':
case 'left':
return 'leftArea';
case 'rightArea':
case 'right':
return 'rightArea';
case 'topArea':
case 'top':
return 'topArea';
case 'toolbar':
return 'toolbar';
case 'mainArea':
case 'main':
case 'center':
case 'centerArea':
return 'mainArea';
case 'bottomArea':
case 'bottom':
return 'bottomArea';
case 'leftFixedArea':
return 'leftFixedArea';
case 'leftFloatArea':
return 'leftFloatArea';
case 'stages':
return 'stages';
default:
throw new Error(`${area} not supported`);
}
}