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) {
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`);
}
}