mirror of
https://github.com/alibaba/lowcode-engine.git
synced 2026-01-19 05:48:17 +00:00
Merge branch feat/pane-drag into release/1.0.37
Title: feat: add pane drag, use config "enableDrag:true" Link: https://code.aone.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/codereview/4882586
This commit is contained in:
commit
3f0a5e2483
@ -1,5 +1,5 @@
|
|||||||
import React, { Component } from 'react';
|
import React, { Component } from 'react';
|
||||||
import { observer } from '@ali/lowcode-editor-core';
|
import { observer, globalContext } from '@ali/lowcode-editor-core';
|
||||||
import { BuiltinSimulatorHost, BuiltinSimulatorProps } from './host';
|
import { BuiltinSimulatorHost, BuiltinSimulatorProps } from './host';
|
||||||
import { BemTools } from './bem-tools';
|
import { BemTools } from './bem-tools';
|
||||||
import { Project } from '../project';
|
import { Project } from '../project';
|
||||||
@ -73,14 +73,43 @@ class Canvas extends Component<{ host: BuiltinSimulatorHost }> {
|
|||||||
|
|
||||||
@observer
|
@observer
|
||||||
class Content extends Component<{ host: BuiltinSimulatorHost }> {
|
class Content extends Component<{ host: BuiltinSimulatorHost }> {
|
||||||
|
state = {
|
||||||
|
disabledEvents: false,
|
||||||
|
};
|
||||||
|
|
||||||
|
private dispose?: () => void;
|
||||||
|
|
||||||
|
componentDidMount() {
|
||||||
|
const editor = globalContext.get('editor');
|
||||||
|
const onEnableEvents = (type: boolean) => {
|
||||||
|
this.setState({
|
||||||
|
disabledEvents: type,
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
editor.on('designer.builtinSimulator.disabledEvents', onEnableEvents);
|
||||||
|
|
||||||
|
this.dispose = () => {
|
||||||
|
editor.removeListener('designer.builtinSimulator.disabledEvents', onEnableEvents);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
componentWillUnmount() {
|
||||||
|
this.dispose?.();
|
||||||
|
}
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
const sim = this.props.host;
|
const sim = this.props.host;
|
||||||
|
const { disabledEvents } = this.state;
|
||||||
const { viewport } = sim;
|
const { viewport } = sim;
|
||||||
const frameStyle = {
|
const frameStyle: any = {
|
||||||
transform: `scale(${viewport.scale})`,
|
transform: `scale(${viewport.scale})`,
|
||||||
height: viewport.contentHeight,
|
height: viewport.contentHeight,
|
||||||
width: viewport.contentWidth,
|
width: viewport.contentWidth,
|
||||||
};
|
};
|
||||||
|
if (disabledEvents) {
|
||||||
|
frameStyle.pointerEvents = 'none';
|
||||||
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="lc-simulator-content">
|
<div className="lc-simulator-content">
|
||||||
|
|||||||
@ -0,0 +1,15 @@
|
|||||||
|
.lc-draggable-line-vertical {
|
||||||
|
position: absolute;
|
||||||
|
width: 4px;
|
||||||
|
height: 100%;
|
||||||
|
background-color: transparent;
|
||||||
|
cursor: col-resize;
|
||||||
|
}
|
||||||
|
|
||||||
|
.lc-draggable-line-horizontal {
|
||||||
|
position: absolute;
|
||||||
|
width: 100%;
|
||||||
|
height: 4px;
|
||||||
|
background-color: transparent;
|
||||||
|
cursor: row-resize;
|
||||||
|
}
|
||||||
146
packages/editor-skeleton/src/components/draggable-line/index.tsx
Normal file
146
packages/editor-skeleton/src/components/draggable-line/index.tsx
Normal file
@ -0,0 +1,146 @@
|
|||||||
|
import { Component } from 'react';
|
||||||
|
import classNames from 'classnames';
|
||||||
|
import './index.less';
|
||||||
|
|
||||||
|
export interface DraggableLineProps {
|
||||||
|
onDrag: (l: number, e: any) => any;
|
||||||
|
onDragStart?: () => any;
|
||||||
|
onDragEnd?: () => any;
|
||||||
|
position?: 'right' | 'left' | 'top';
|
||||||
|
className?: string;
|
||||||
|
maxIncrement?: number;
|
||||||
|
maxDecrement?: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default class DraggableLine extends Component<DraggableLineProps> {
|
||||||
|
static displayName = 'DraggableLine';
|
||||||
|
|
||||||
|
static defaultProps = {
|
||||||
|
onDrag() {},
|
||||||
|
position: 'right',
|
||||||
|
className: '',
|
||||||
|
maxIncrement: 100,
|
||||||
|
maxDecrement: 0,
|
||||||
|
};
|
||||||
|
|
||||||
|
private startDrag: boolean;
|
||||||
|
private canDrag: boolean;
|
||||||
|
private offset: number;
|
||||||
|
private currentOffset: number;
|
||||||
|
private offEvent: any;
|
||||||
|
private offDragEvent: any;
|
||||||
|
private startOffset: any;
|
||||||
|
private shell: HTMLElement | null = null;
|
||||||
|
|
||||||
|
constructor(props: DraggableLineProps) {
|
||||||
|
super(props);
|
||||||
|
this.startDrag = false;
|
||||||
|
this.canDrag = false;
|
||||||
|
this.offset = 0;
|
||||||
|
this.currentOffset = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
componentDidMount() {
|
||||||
|
this.offEvent = this.initEvent();
|
||||||
|
}
|
||||||
|
|
||||||
|
componentWillUnmount() {
|
||||||
|
if (this.offEvent) {
|
||||||
|
this.offEvent();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
onSelectStart(e: any) {
|
||||||
|
if (this.startDrag) {
|
||||||
|
e.preventDefault();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
onStartMove(e: any) {
|
||||||
|
const { onDragStart } = this.props;
|
||||||
|
if (!this.startDrag) {
|
||||||
|
onDragStart && onDragStart();
|
||||||
|
}
|
||||||
|
this.startDrag = true;
|
||||||
|
this.canDrag = true;
|
||||||
|
this.currentOffset = 0;
|
||||||
|
this.offDragEvent = this.initDragEvent();
|
||||||
|
this.startOffset = this.getClientPosition(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
onEndMove() {
|
||||||
|
const { onDragEnd } = this.props;
|
||||||
|
if (this.startDrag) {
|
||||||
|
if (this.offDragEvent) {
|
||||||
|
this.offDragEvent();
|
||||||
|
}
|
||||||
|
this.startDrag = false;
|
||||||
|
this.offset = this.currentOffset;
|
||||||
|
}
|
||||||
|
onDragEnd && onDragEnd();
|
||||||
|
}
|
||||||
|
|
||||||
|
onDrag(e: any) {
|
||||||
|
const { position, onDrag, maxIncrement = 100, maxDecrement = 0 } = this.props;
|
||||||
|
if (this.startDrag) {
|
||||||
|
if (position === 'left' || position === 'top') {
|
||||||
|
this.currentOffset = this.offset + this.startOffset - this.getClientPosition(e);
|
||||||
|
} else {
|
||||||
|
this.currentOffset = this.offset + this.getClientPosition(e) - this.startOffset;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.currentOffset < -maxDecrement) {
|
||||||
|
this.currentOffset = -maxDecrement;
|
||||||
|
} else if (this.currentOffset > maxIncrement) {
|
||||||
|
this.currentOffset = maxIncrement;
|
||||||
|
}
|
||||||
|
|
||||||
|
onDrag(this.currentOffset, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
getClientPosition(e: any) {
|
||||||
|
const { position } = this.props;
|
||||||
|
return position === 'left' || position === 'right' ? e.clientX : e.clientY;
|
||||||
|
}
|
||||||
|
|
||||||
|
initEvent() {
|
||||||
|
const selectStart = this.onSelectStart.bind(this);
|
||||||
|
document.addEventListener('selectstart', selectStart);
|
||||||
|
return () => document.removeEventListener('selectstart', selectStart);
|
||||||
|
}
|
||||||
|
|
||||||
|
initDragEvent() {
|
||||||
|
const onDrag = this.onDrag.bind(this);
|
||||||
|
const onEndMove = this.onEndMove.bind(this);
|
||||||
|
document.addEventListener('mousemove', onDrag);
|
||||||
|
document.addEventListener('mouseup', onEndMove);
|
||||||
|
return () => {
|
||||||
|
document.removeEventListener('mousemove', onDrag);
|
||||||
|
document.removeEventListener('mouseup', onEndMove);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
getParent() {
|
||||||
|
return this.shell?.parentElement;
|
||||||
|
}
|
||||||
|
|
||||||
|
render() {
|
||||||
|
const { className = '', position } = this.props;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div
|
||||||
|
ref={(ref) => { this.shell = ref; }}
|
||||||
|
className={classNames(
|
||||||
|
position === 'left' || position === 'right'
|
||||||
|
? 'lc-draggable-line-vertical'
|
||||||
|
: 'lc-draggable-line-horizontal',
|
||||||
|
{
|
||||||
|
[className]: !!className,
|
||||||
|
},
|
||||||
|
)}
|
||||||
|
onMouseDown={(e) => this.onStartMove(e)}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -5,10 +5,24 @@
|
|||||||
&.hidden {
|
&.hidden {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.lc-widget-disabled {
|
.lc-widget-disabled {
|
||||||
pointer-events: none;
|
pointer-events: none;
|
||||||
opacity: 0.4;
|
opacity: 0.4;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.lc-draggable-line-vertical {
|
||||||
|
position: absolute;
|
||||||
|
width: 4px;
|
||||||
|
height: 100%;
|
||||||
|
top: 0;
|
||||||
|
background-color: transparent;
|
||||||
|
cursor: col-resize;
|
||||||
|
right: -2px;
|
||||||
|
z-index: 99;
|
||||||
|
}
|
||||||
|
|
||||||
|
.lc-engine-slate-draggable-line-right {
|
||||||
|
right: -2px;
|
||||||
|
}
|
||||||
|
|||||||
@ -9,6 +9,8 @@ import WidgetContainer from '../../widget/widget-container';
|
|||||||
import Panel from '../../widget/panel';
|
import Panel from '../../widget/panel';
|
||||||
import { IWidget } from '../../widget/widget';
|
import { IWidget } from '../../widget/widget';
|
||||||
import { SkeletonEvents } from '../../skeleton';
|
import { SkeletonEvents } from '../../skeleton';
|
||||||
|
import DraggableLine from '../draggable-line';
|
||||||
|
import PanelOperationRow from './panel-operation-row';
|
||||||
|
|
||||||
import './index.less';
|
import './index.less';
|
||||||
|
|
||||||
@ -84,6 +86,75 @@ export class PanelDockView extends Component<DockProps & { dock: PanelDock }> {
|
|||||||
|
|
||||||
export class DialogDockView extends Component {}
|
export class DialogDockView extends Component {}
|
||||||
|
|
||||||
|
export class DraggableLineView extends Component<{ panel: Panel }> {
|
||||||
|
private shell: any;
|
||||||
|
private defaultWidth: number;
|
||||||
|
|
||||||
|
private getDefaultWidth() {
|
||||||
|
const configWidth = this.props.panel?.config.props?.width;
|
||||||
|
if (configWidth) {
|
||||||
|
return configWidth;
|
||||||
|
}
|
||||||
|
if (this.defaultWidth) {
|
||||||
|
return this.defaultWidth;
|
||||||
|
}
|
||||||
|
const containerRef = this.shell?.getParent();
|
||||||
|
if (containerRef) {
|
||||||
|
this.defaultWidth = containerRef.offsetWidth;
|
||||||
|
return this.defaultWidth;
|
||||||
|
}
|
||||||
|
return 300;
|
||||||
|
}
|
||||||
|
|
||||||
|
onDrag(value: number) {
|
||||||
|
const defaultWidth = this.getDefaultWidth();
|
||||||
|
const width = defaultWidth + value;
|
||||||
|
|
||||||
|
const containerRef = this.shell?.getParent();
|
||||||
|
if (containerRef) {
|
||||||
|
containerRef.style.width = `${width}px`;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 抛出事件,对于有些需要 panel 插件随着 度变化进行再次渲染的,由panel插件内部监听事件实现
|
||||||
|
const editor = globalContext.get(Editor);
|
||||||
|
editor?.emit('dockpane.drag', width);
|
||||||
|
}
|
||||||
|
|
||||||
|
onDragChange(type: 'start' | 'end') {
|
||||||
|
const editor = globalContext.get(Editor);
|
||||||
|
editor?.emit('dockpane.dragchange', type);
|
||||||
|
// builtinSimulator 屏蔽掉 鼠标事件
|
||||||
|
editor?.emit('designer.builtinSimulator.disabledEvents', type === 'start');
|
||||||
|
}
|
||||||
|
|
||||||
|
render() {
|
||||||
|
// left fixed 下不允许改变宽度
|
||||||
|
// 默认 关闭,通过配置开启
|
||||||
|
const enableDrag = this.props.panel.config.props?.enableDrag;
|
||||||
|
const isRightArea = this.props.panel.config?.area === 'rightArea';
|
||||||
|
if (isRightArea || !enableDrag || this.props.panel?.parent.name === 'leftFixedArea') {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return (
|
||||||
|
<DraggableLine
|
||||||
|
ref={(ref) => {
|
||||||
|
this.shell = ref;
|
||||||
|
}}
|
||||||
|
position="right"
|
||||||
|
className="lc-engine-slate-draggable-line-right"
|
||||||
|
onDrag={(e) => this.onDrag(e)}
|
||||||
|
onDragStart={() => this.onDragChange('start')}
|
||||||
|
onDragEnd={() => this.onDragChange('end')}
|
||||||
|
maxIncrement={500}
|
||||||
|
maxDecrement={0}
|
||||||
|
// TODO: 优化
|
||||||
|
// maxIncrement={dock.getMaxWidth() - this.cachedSize.width}
|
||||||
|
// maxDecrement={this.cachedSize.width - dock.getWidth()}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@observer
|
@observer
|
||||||
export class TitledPanelView extends Component<{ panel: Panel; area?: string }> {
|
export class TitledPanelView extends Component<{ panel: Panel; area?: string }> {
|
||||||
shouldComponentUpdate() {
|
shouldComponentUpdate() {
|
||||||
@ -131,15 +202,22 @@ export class TitledPanelView extends Component<{ panel: Panel; area?: string }>
|
|||||||
})}
|
})}
|
||||||
id={panelName}
|
id={panelName}
|
||||||
>
|
>
|
||||||
|
<PanelOperationRow panel={panel} />
|
||||||
<PanelTitle panel={panel} />
|
<PanelTitle panel={panel} />
|
||||||
<div className="lc-panel-body">{panel.body}</div>
|
<div className="lc-panel-body">{panel.body}</div>
|
||||||
|
<DraggableLineView panel={panel} />
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@observer
|
@observer
|
||||||
export class PanelView extends Component<{ panel: Panel; area?: string }> {
|
export class PanelView extends Component<{
|
||||||
|
panel: Panel;
|
||||||
|
area?: string;
|
||||||
|
hideOperationRow?: boolean;
|
||||||
|
hideDragLine?: boolean;
|
||||||
|
}> {
|
||||||
shouldComponentUpdate() {
|
shouldComponentUpdate() {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -172,7 +250,7 @@ export class PanelView extends Component<{ panel: Panel; area?: string }> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
const { panel, area } = this.props;
|
const { panel, area, hideOperationRow, hideDragLine } = this.props;
|
||||||
if (!panel.inited) {
|
if (!panel.inited) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@ -189,7 +267,9 @@ export class PanelView extends Component<{ panel: Panel; area?: string }> {
|
|||||||
})}
|
})}
|
||||||
id={panelName}
|
id={panelName}
|
||||||
>
|
>
|
||||||
|
{!hideOperationRow && <PanelOperationRow panel={panel} />}
|
||||||
{panel.body}
|
{panel.body}
|
||||||
|
{!hideDragLine && <DraggableLineView panel={panel} />}
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -203,7 +283,7 @@ export class TabsPanelView extends Component<{ container: WidgetContainer<Panel>
|
|||||||
const contents: ReactElement[] = [];
|
const contents: ReactElement[] = [];
|
||||||
container.items.forEach((item: any) => {
|
container.items.forEach((item: any) => {
|
||||||
titles.push(<PanelTitle key={item.id} panel={item} className="lc-tab-title" />);
|
titles.push(<PanelTitle key={item.id} panel={item} className="lc-tab-title" />);
|
||||||
contents.push(<PanelView key={item.id} panel={item} />);
|
contents.push(<PanelView key={item.id} panel={item} hideOperationRow hideDragLine />);
|
||||||
});
|
});
|
||||||
|
|
||||||
return (
|
return (
|
||||||
@ -302,11 +382,7 @@ export class WidgetView extends Component<{ widget: IWidget }> {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
if (widget.disabled) {
|
if (widget.disabled) {
|
||||||
return (
|
return <div className="lc-widget-disabled">{widget.body}</div>;
|
||||||
<div className="lc-widget-disabled">
|
|
||||||
{widget.body}
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
return widget.body;
|
return widget.body;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -0,0 +1,67 @@
|
|||||||
|
import { Component, Fragment } from 'react';
|
||||||
|
import { Button, Icon } from '@alifd/next';
|
||||||
|
import { IconFix } from '../../icons/fix';
|
||||||
|
import { IconFloat } from '../../icons/float';
|
||||||
|
import Panel from '../../widget/panel';
|
||||||
|
|
||||||
|
export default class PanelOperationRow extends Component<{ panel: Panel }> {
|
||||||
|
// fix or float
|
||||||
|
setDisplay() {
|
||||||
|
const { panel } = this.props;
|
||||||
|
const current = panel;
|
||||||
|
if (!current) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (panel?.parent?.name === 'leftFloatArea') {
|
||||||
|
panel.skeleton.leftFloatArea.remove(current);
|
||||||
|
panel.skeleton.leftFixedArea.add(current);
|
||||||
|
panel.skeleton.leftFixedArea.container.active(current);
|
||||||
|
} else {
|
||||||
|
panel.skeleton.leftFixedArea.remove(current);
|
||||||
|
panel.skeleton.leftFloatArea.add(current);
|
||||||
|
panel.skeleton.leftFloatArea.container.active(current);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
render() {
|
||||||
|
const { panel } = this.props;
|
||||||
|
const isRightArea = this.props.panel.config?.area === 'rightArea';
|
||||||
|
if (isRightArea) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
// can be set fixed by default
|
||||||
|
let canSetFixed = true;
|
||||||
|
if (panel?.config.props?.canSetFixed === false) {
|
||||||
|
canSetFixed = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const hideTitleBar = panel?.config.props?.hideTitleBar;
|
||||||
|
|
||||||
|
const areaName = panel?.parent?.name;
|
||||||
|
const area = panel.skeleton[areaName];
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Fragment>
|
||||||
|
{!hideTitleBar && (
|
||||||
|
<Fragment>
|
||||||
|
{canSetFixed && (
|
||||||
|
// eslint-disable-next-line react/jsx-no-bind
|
||||||
|
<Button text className="lc-pane-icon-fix" onClick={this.setDisplay.bind(this)}>
|
||||||
|
{areaName === 'leftFloatArea' ? <IconFloat /> : <IconFix />}
|
||||||
|
</Button>
|
||||||
|
)}
|
||||||
|
<Button
|
||||||
|
text
|
||||||
|
className="lc-pane-icon-close"
|
||||||
|
onClick={() => {
|
||||||
|
area && area.setVisible(false);
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<Icon type="close" />
|
||||||
|
</Button>
|
||||||
|
</Fragment>
|
||||||
|
)}
|
||||||
|
</Fragment>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,12 +1,10 @@
|
|||||||
import { Component, Fragment } from 'react';
|
import { Component, Fragment } from 'react';
|
||||||
import classNames from 'classnames';
|
import classNames from 'classnames';
|
||||||
import { observer } from '@ali/lowcode-editor-core';
|
import { observer } from '@ali/lowcode-editor-core';
|
||||||
import { Button, Icon } from '@alifd/next';
|
|
||||||
import Area from '../area';
|
import Area from '../area';
|
||||||
import { PanelConfig } from '../types';
|
import { PanelConfig } from '../types';
|
||||||
import Panel from '../widget/panel';
|
import Panel from '../widget/panel';
|
||||||
import { Designer } from '@ali/lowcode-designer';
|
import { Designer } from '@ali/lowcode-designer';
|
||||||
import { IconFloat } from '../icons/float';
|
|
||||||
|
|
||||||
@observer
|
@observer
|
||||||
export default class LeftFixedPane extends Component<{ area: Area<PanelConfig, Panel> }> {
|
export default class LeftFixedPane extends Component<{ area: Area<PanelConfig, Panel> }> {
|
||||||
@ -19,21 +17,9 @@ export default class LeftFixedPane extends Component<{ area: Area<PanelConfig, P
|
|||||||
this.props.area.skeleton.editor.get(Designer)?.touchOffsetObserver();
|
this.props.area.skeleton.editor.get(Designer)?.touchOffsetObserver();
|
||||||
}
|
}
|
||||||
|
|
||||||
// 取消固定
|
|
||||||
setFloat() {
|
|
||||||
const { area } = this.props;
|
|
||||||
const { current } = area;
|
|
||||||
if (!current) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
area.skeleton.leftFixedArea.remove(current);
|
|
||||||
area.skeleton.leftFloatArea.add(current);
|
|
||||||
area.skeleton.leftFloatArea.container.active(current);
|
|
||||||
}
|
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
const { area } = this.props;
|
const { area } = this.props;
|
||||||
const hideTitleBar = area.current?.config.props?.hideTitleBar;
|
|
||||||
const width = area.current?.config.props?.width;
|
const width = area.current?.config.props?.width;
|
||||||
const style = width
|
const style = width
|
||||||
? {
|
? {
|
||||||
@ -48,26 +34,6 @@ export default class LeftFixedPane extends Component<{ area: Area<PanelConfig, P
|
|||||||
})}
|
})}
|
||||||
style={style}
|
style={style}
|
||||||
>
|
>
|
||||||
{!hideTitleBar && (
|
|
||||||
<Fragment>
|
|
||||||
<Button
|
|
||||||
text
|
|
||||||
className="lc-pane-icon-float"
|
|
||||||
onClick={this.setFloat.bind(this)}
|
|
||||||
>
|
|
||||||
<IconFloat />
|
|
||||||
</Button>
|
|
||||||
<Button
|
|
||||||
text
|
|
||||||
className="lc-pane-icon-close"
|
|
||||||
onClick={() => {
|
|
||||||
area.setVisible(false);
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<Icon type="close" />
|
|
||||||
</Button>
|
|
||||||
</Fragment>
|
|
||||||
)}
|
|
||||||
<Contents area={area} />
|
<Contents area={area} />
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|||||||
@ -1,13 +1,12 @@
|
|||||||
import { Component, Fragment } from 'react';
|
import { Component, Fragment } from 'react';
|
||||||
import classNames from 'classnames';
|
import classNames from 'classnames';
|
||||||
import { observer, Focusable, focusTracker } from '@ali/lowcode-editor-core';
|
import { observer, Focusable, focusTracker } from '@ali/lowcode-editor-core';
|
||||||
import { Button, Icon } from '@alifd/next';
|
|
||||||
import { IconFix } from '../icons/fix';
|
|
||||||
import Area from '../area';
|
import Area from '../area';
|
||||||
import Panel from '../widget/panel';
|
import Panel from '../widget/panel';
|
||||||
|
|
||||||
@observer
|
@observer
|
||||||
export default class LeftFloatPane extends Component<{ area: Area<any, Panel> }> {
|
export default class LeftFloatPane extends Component<{ area: Area<any, Panel> }> {
|
||||||
|
|
||||||
shouldComponentUpdate() {
|
shouldComponentUpdate() {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -22,6 +21,7 @@ export default class LeftFloatPane extends Component<{ area: Area<any, Panel> }>
|
|||||||
const { area } = this.props;
|
const { area } = this.props;
|
||||||
const triggerClose = () => area.setVisible(false);
|
const triggerClose = () => area.setVisible(false);
|
||||||
area.skeleton.editor.on('designer.dragstart', triggerClose);
|
area.skeleton.editor.on('designer.dragstart', triggerClose);
|
||||||
|
|
||||||
this.dispose = () => {
|
this.dispose = () => {
|
||||||
area.skeleton.editor.removeListener('designer.dragstart', triggerClose);
|
area.skeleton.editor.removeListener('designer.dragstart', triggerClose);
|
||||||
};
|
};
|
||||||
@ -95,29 +95,10 @@ export default class LeftFloatPane extends Component<{ area: Area<any, Panel> }>
|
|||||||
this.dispose?.();
|
this.dispose?.();
|
||||||
}
|
}
|
||||||
|
|
||||||
// 固定
|
|
||||||
setFixed() {
|
|
||||||
const { area } = this.props;
|
|
||||||
const { current } = area;
|
|
||||||
if (!current) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
area.skeleton.leftFloatArea.remove(current);
|
|
||||||
area.skeleton.leftFixedArea.add(current);
|
|
||||||
area.skeleton.leftFixedArea.container.active(current);
|
|
||||||
}
|
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
const { area } = this.props;
|
const { area } = this.props;
|
||||||
const width = area.current?.config.props?.width;
|
const width = area.current?.config.props?.width;
|
||||||
// can be set fixed by default
|
|
||||||
let canSetFixed = true;
|
|
||||||
if (area.current?.config.props?.canSetFixed === false) {
|
|
||||||
canSetFixed = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
const hideTitleBar = area.current?.config.props?.hideTitleBar;
|
|
||||||
const style = width ? {
|
const style = width ? {
|
||||||
width,
|
width,
|
||||||
} : undefined;
|
} : undefined;
|
||||||
@ -129,32 +110,6 @@ export default class LeftFloatPane extends Component<{ area: Area<any, Panel> }>
|
|||||||
})}
|
})}
|
||||||
style={style}
|
style={style}
|
||||||
>
|
>
|
||||||
{
|
|
||||||
!hideTitleBar && (
|
|
||||||
<Fragment>
|
|
||||||
{
|
|
||||||
canSetFixed && (
|
|
||||||
<Button
|
|
||||||
text
|
|
||||||
className="lc-pane-icon-fix"
|
|
||||||
onClick={this.setFixed.bind(this)}
|
|
||||||
>
|
|
||||||
<IconFix />
|
|
||||||
</Button>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
<Button
|
|
||||||
text
|
|
||||||
className="lc-pane-icon-close"
|
|
||||||
onClick={() => {
|
|
||||||
area.setVisible(false);
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<Icon type="close" />
|
|
||||||
</Button>
|
|
||||||
</Fragment>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
<Contents area={area} />
|
<Contents area={area} />
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|||||||
@ -49,6 +49,8 @@ body {
|
|||||||
width: 100%;
|
width: 100%;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
position: relative;
|
position: relative;
|
||||||
|
background-color: #fff;
|
||||||
|
background-color: var(--color-pane-background);
|
||||||
&.hidden {
|
&.hidden {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
@ -122,6 +124,9 @@ body {
|
|||||||
.lc-panel {
|
.lc-panel {
|
||||||
height: 100%;
|
height: 100%;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
position: relative;
|
||||||
|
background-color: #fff;
|
||||||
|
background-color: var(--color-pane-background);
|
||||||
// overflow: auto;
|
// overflow: auto;
|
||||||
&.hidden {
|
&.hidden {
|
||||||
display: none;
|
display: none;
|
||||||
|
|||||||
@ -103,6 +103,7 @@ export interface PanelProps {
|
|||||||
onInit?: (widget: IWidget) => any;
|
onInit?: (widget: IWidget) => any;
|
||||||
onDestroy?: () => any;
|
onDestroy?: () => any;
|
||||||
shortcut?: string; // 只有在特定位置,可触发 toggle show
|
shortcut?: string; // 只有在特定位置,可触发 toggle show
|
||||||
|
enableDrag?: boolean; // 是否开启通过 drag 调整 宽度
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface PanelDockConfig extends IDockBaseConfig {
|
export interface PanelDockConfig extends IDockBaseConfig {
|
||||||
|
|||||||
@ -25,6 +25,7 @@ registerDefaults();
|
|||||||
|
|
||||||
const editor = new Editor();
|
const editor = new Editor();
|
||||||
globalContext.register(editor, Editor);
|
globalContext.register(editor, Editor);
|
||||||
|
globalContext.register(editor, 'editor');
|
||||||
|
|
||||||
const skeleton = new Skeleton(editor);
|
const skeleton = new Skeleton(editor);
|
||||||
editor.set(Skeleton, skeleton);
|
editor.set(Skeleton, skeleton);
|
||||||
|
|||||||
@ -49,6 +49,7 @@ export interface OldPaneConfig {
|
|||||||
fullScreen?: boolean; // todo
|
fullScreen?: boolean; // todo
|
||||||
canSetFixed?: boolean; // 是否可以设置固定模式
|
canSetFixed?: boolean; // 是否可以设置固定模式
|
||||||
defaultFixed?: boolean; // 是否默认固定
|
defaultFixed?: boolean; // 是否默认固定
|
||||||
|
enableDrag?: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
function upgradeConfig(config: OldPaneConfig): IWidgetBaseConfig & { area: string } {
|
function upgradeConfig(config: OldPaneConfig): IWidgetBaseConfig & { area: string } {
|
||||||
@ -83,6 +84,7 @@ function upgradeConfig(config: OldPaneConfig): IWidgetBaseConfig & { area: strin
|
|||||||
isAction,
|
isAction,
|
||||||
canSetFixed,
|
canSetFixed,
|
||||||
defaultFixed,
|
defaultFixed,
|
||||||
|
enableDrag,
|
||||||
} = config;
|
} = config;
|
||||||
if (menu) {
|
if (menu) {
|
||||||
newConfig.props.title = menu;
|
newConfig.props.title = menu;
|
||||||
@ -99,6 +101,7 @@ function upgradeConfig(config: OldPaneConfig): IWidgetBaseConfig & { area: strin
|
|||||||
height,
|
height,
|
||||||
maxHeight,
|
maxHeight,
|
||||||
canSetFixed,
|
canSetFixed,
|
||||||
|
enableDrag,
|
||||||
};
|
};
|
||||||
|
|
||||||
if (defaultFixed) {
|
if (defaultFixed) {
|
||||||
@ -135,7 +138,6 @@ function upgradeConfig(config: OldPaneConfig): IWidgetBaseConfig & { area: strin
|
|||||||
}
|
}
|
||||||
newConfig.props.onInit = init;
|
newConfig.props.onInit = init;
|
||||||
newConfig.props.onDestroy = destroy;
|
newConfig.props.onDestroy = destroy;
|
||||||
|
|
||||||
return newConfig;
|
return newConfig;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user