mirror of
https://github.com/alibaba/lowcode-engine.git
synced 2025-12-17 15:23:00 +00:00
177 lines
3.5 KiB
TypeScript
177 lines
3.5 KiB
TypeScript
import { obx, computed, makeObservable } from '@alilc/lowcode-editor-core';
|
|
import { uniqueId } from '@alilc/lowcode-utils';
|
|
import { createElement, ReactNode, ReactInstance } from 'react';
|
|
import { Skeleton } from '../skeleton';
|
|
import { PanelDockConfig } from '../types';
|
|
import { Panel } from './panel';
|
|
import { PanelDockView, WidgetView } from '../components/widget-views';
|
|
import { IWidget } from './widget';
|
|
import { composeTitle } from './utils';
|
|
import { findDOMNode } from 'react-dom';
|
|
|
|
export class PanelDock implements IWidget {
|
|
readonly isWidget = true;
|
|
|
|
readonly isPanelDock = true;
|
|
|
|
readonly id: string;
|
|
|
|
readonly name: string;
|
|
|
|
readonly align?: string;
|
|
|
|
private inited = false;
|
|
|
|
private _body: ReactNode;
|
|
|
|
get body() {
|
|
if (this.inited) {
|
|
return this._body;
|
|
}
|
|
this.inited = true;
|
|
const { props } = this.config;
|
|
|
|
this._body = createElement(PanelDockView, {
|
|
...props,
|
|
dock: this,
|
|
});
|
|
|
|
return this._body;
|
|
}
|
|
|
|
private _shell: ReactInstance | null = null;
|
|
|
|
get content(): ReactNode {
|
|
return createElement(WidgetView, {
|
|
widget: this,
|
|
ref: (ref) => {
|
|
this._shell = ref;
|
|
},
|
|
key: this.id,
|
|
});
|
|
}
|
|
|
|
getDOMNode() {
|
|
// eslint-disable-next-line react/no-find-dom-node
|
|
return this._shell ? findDOMNode(this._shell) : null;
|
|
}
|
|
|
|
@obx.ref private _visible = true;
|
|
|
|
get visible() {
|
|
return this._visible;
|
|
}
|
|
|
|
@computed get actived(): boolean {
|
|
return this.panel?.visible || false;
|
|
}
|
|
|
|
readonly panelName: string;
|
|
|
|
private _panel?: Panel;
|
|
|
|
@obx.ref private _disabled = false;
|
|
|
|
@computed get panel() {
|
|
return this._panel || this.skeleton.getPanel(this.panelName);
|
|
}
|
|
|
|
constructor(readonly skeleton: Skeleton, readonly config: PanelDockConfig) {
|
|
makeObservable(this);
|
|
const { content, contentProps, panelProps, name, props } = config;
|
|
this.name = name;
|
|
this.id = uniqueId(`dock:${name}$`);
|
|
this.panelName = config.panelName || name;
|
|
this.align = props?.align;
|
|
if (content) {
|
|
const _panelProps: any = { ...panelProps };
|
|
if (_panelProps.title == null && props) {
|
|
_panelProps.title = composeTitle(props.title, undefined, props.description, true, true);
|
|
}
|
|
this._panel = this.skeleton.add({
|
|
type: 'Panel',
|
|
name: this.panelName,
|
|
props: _panelProps,
|
|
contentProps,
|
|
content,
|
|
area: panelProps?.area,
|
|
}) as Panel;
|
|
}
|
|
if (props?.onInit) {
|
|
props.onInit.call(this, this);
|
|
}
|
|
}
|
|
|
|
setVisible(flag: boolean) {
|
|
if (flag === this._visible) {
|
|
return;
|
|
}
|
|
if (flag) {
|
|
this._visible = true;
|
|
} else if (this.inited) {
|
|
this._visible = false;
|
|
}
|
|
}
|
|
|
|
hide() {
|
|
this.setVisible(false);
|
|
}
|
|
|
|
show() {
|
|
this.setVisible(true);
|
|
}
|
|
|
|
toggle() {
|
|
this.setVisible(!this._visible);
|
|
}
|
|
|
|
private setDisabled(flag: boolean) {
|
|
if (this._disabled === flag) return;
|
|
this._disabled = flag;
|
|
}
|
|
|
|
disable() {
|
|
this.setDisabled(true);
|
|
}
|
|
|
|
enable() {
|
|
this.setDisabled(false);
|
|
}
|
|
|
|
get disabled(): boolean {
|
|
return this._disabled;
|
|
}
|
|
|
|
togglePanel() {
|
|
this.panel?.toggle();
|
|
}
|
|
|
|
getName() {
|
|
return this.name;
|
|
}
|
|
|
|
getContent() {
|
|
return this.content;
|
|
}
|
|
|
|
hidePanel() {
|
|
this.panel?.setActive(false);
|
|
}
|
|
|
|
showPanel() {
|
|
this.panel?.setActive(true);
|
|
}
|
|
|
|
/**
|
|
* @deprecated
|
|
*/
|
|
onActiveChange(func: () => any) {
|
|
return this.panel?.onActiveChange(func);
|
|
}
|
|
}
|
|
|
|
|
|
export function isPanelDock(obj: any): obj is PanelDock {
|
|
return obj && obj.isPanelDock;
|
|
}
|