feat(editor): 新增已选组件、代码编辑、数据源及其子节点增量缩进配置

This commit is contained in:
roymondchen 2024-09-04 19:20:55 +08:00 committed by roymondchen
parent 34fc0a15b9
commit 47a21d6544
10 changed files with 82 additions and 7 deletions

View File

@ -16,7 +16,13 @@
<template #sidebar> <template #sidebar>
<slot name="sidebar" :editorService="editorService"> <slot name="sidebar" :editorService="editorService">
<Sidebar :data="sidebar" :layer-content-menu="layerContentMenu" :custom-content-menu="customContentMenu"> <Sidebar
:data="sidebar"
:layer-content-menu="layerContentMenu"
:custom-content-menu="customContentMenu"
:indent="indent"
:next-level-indent-increment="nextLevelIndentIncrement"
>
<template #layer-panel-header> <template #layer-panel-header>
<slot name="layer-panel-header"></slot> <slot name="layer-panel-header"></slot>
</template> </template>

View File

@ -1,7 +1,14 @@
<template> <template>
<div class="m-editor-tree" @dragover="handleDragOver"> <div class="m-editor-tree" @dragover="handleDragOver">
<template v-if="data?.length"> <template v-if="data?.length">
<TreeNode v-for="item in data" :key="item.id" :data="item" :indent="indent" :node-status-map="nodeStatusMap"> <TreeNode
v-for="item in data"
:key="item.id"
:data="item"
:indent="indent"
:next-level-indent-increment="nextLevelIndentIncrement"
:node-status-map="nodeStatusMap"
>
<template #tree-node-content="{ data: nodeData }"> <template #tree-node-content="{ data: nodeData }">
<slot name="tree-node-content" :data="nodeData"> </slot> <slot name="tree-node-content" :data="nodeData"> </slot>
</template> </template>
@ -57,6 +64,7 @@ withDefaults(
data: TreeNodeData[]; data: TreeNodeData[];
nodeStatusMap: Map<Id, LayerNodeStatus>; nodeStatusMap: Map<Id, LayerNodeStatus>;
indent?: number; indent?: number;
nextLevelIndentIncrement?: number;
emptyText?: string; emptyText?: string;
}>(), }>(),
{ {

View File

@ -45,7 +45,7 @@
:parent="data" :parent="data"
:parentsId="[...parentsId, data.id]" :parentsId="[...parentsId, data.id]"
:node-status-map="nodeStatusMap" :node-status-map="nodeStatusMap"
:indent="indent + 11" :indent="indent + nextLevelIndentIncrement"
> >
<template #tree-node-content="{ data: nodeData }"> <template #tree-node-content="{ data: nodeData }">
<slot name="tree-node-content" :data="nodeData"> </slot> <slot name="tree-node-content" :data="nodeData"> </slot>
@ -99,9 +99,11 @@ const props = withDefaults(
parentsId?: Id[]; parentsId?: Id[];
nodeStatusMap: Map<Id, LayerNodeStatus>; nodeStatusMap: Map<Id, LayerNodeStatus>;
indent?: number; indent?: number;
nextLevelIndentIncrement?: number;
}>(), }>(),
{ {
indent: 0, indent: 0,
nextLevelIndentIncrement: 11,
parentsId: () => [], parentsId: () => [],
}, },
); );

View File

@ -80,6 +80,10 @@ export interface EditorProps {
disabledStageOverlay?: boolean; disabledStageOverlay?: boolean;
/** 禁用属性配置面板右下角显示源码的按钮 */ /** 禁用属性配置面板右下角显示源码的按钮 */
disabledShowSrc?: boolean; disabledShowSrc?: boolean;
/** 已选组件、代码编辑、数据源缩进配置 */
indent?: number;
/** 已选组件、代码编辑、数据源子节点缩进增量配置 */
nextLevelIndentIncrement?: number;
/** 中间工作区域中画布渲染的内容 */ /** 中间工作区域中画布渲染的内容 */
render?: (stage: StageCore) => HTMLDivElement | void | Promise<HTMLDivElement | void>; render?: (stage: StageCore) => HTMLDivElement | void | Promise<HTMLDivElement | void>;
/** 选中时会在画布上复制出一个大小相同的dom实际拖拽的是这个dom此方法用于干预这个dom的生成方式 */ /** 选中时会在画布上复制出一个大小相同的dom实际拖拽的是这个dom此方法用于干预这个dom的生成方式 */

View File

@ -182,6 +182,8 @@ const props = withDefaults(
defineProps<{ defineProps<{
data: SideBarData; data: SideBarData;
layerContentMenu: (MenuButton | MenuComponent)[]; layerContentMenu: (MenuButton | MenuComponent)[];
indent?: number;
nextLevelIndentIncrement?: number;
customContentMenu?: (menus: (MenuButton | MenuComponent)[], type: string) => (MenuButton | MenuComponent)[]; customContentMenu?: (menus: (MenuButton | MenuComponent)[], type: string) => (MenuButton | MenuComponent)[];
}>(), }>(),
{ {
@ -234,6 +236,8 @@ const getItemConfig = (data: SideItem): SideComponent => {
props: { props: {
layerContentMenu: props.layerContentMenu, layerContentMenu: props.layerContentMenu,
customContentMenu: props.customContentMenu, customContentMenu: props.customContentMenu,
indent: props.indent,
nextLevelIndentIncrement: props.nextLevelIndentIncrement,
}, },
component: LayerPanel, component: LayerPanel,
slots: {}, slots: {},
@ -244,6 +248,10 @@ const getItemConfig = (data: SideItem): SideComponent => {
icon: EditPen, icon: EditPen,
text: '代码编辑', text: '代码编辑',
component: CodeBlockListPanel, component: CodeBlockListPanel,
props: {
indent: props.indent,
nextLevelIndentIncrement: props.nextLevelIndentIncrement,
},
slots: {}, slots: {},
}, },
[SideItemKey.DATA_SOURCE]: { [SideItemKey.DATA_SOURCE]: {
@ -252,6 +260,10 @@ const getItemConfig = (data: SideItem): SideComponent => {
icon: Coin, icon: Coin,
text: '数据源', text: '数据源',
component: DataSourceListPanel, component: DataSourceListPanel,
props: {
indent: props.indent,
nextLevelIndentIncrement: props.nextLevelIndentIncrement,
},
slots: {}, slots: {},
}, },
}; };

View File

@ -1,5 +1,11 @@
<template> <template>
<Tree :data="codeList" :node-status-map="nodeStatusMap" @node-click="clickHandler"> <Tree
:data="codeList"
:node-status-map="nodeStatusMap"
:indent="indent"
:next-level-indent-increment="nextLevelIndentIncrement"
@node-click="clickHandler"
>
<template #tree-node-label="{ data }"> <template #tree-node-label="{ data }">
<div <div
:class="{ :class="{
@ -45,6 +51,8 @@ defineOptions({
}); });
const props = defineProps<{ const props = defineProps<{
indent?: number;
nextLevelIndentIncrement?: number;
customError?: (id: Id, errorType: CodeDeleteErrorType) => any; customError?: (id: Id, errorType: CodeDeleteErrorType) => any;
}>(); }>();

View File

@ -11,7 +11,14 @@
</slot> </slot>
<!-- 代码块列表 --> <!-- 代码块列表 -->
<CodeBlockList ref="codeBlockList" :custom-error="customError" @edit="editCode" @remove="deleteCode"> <CodeBlockList
ref="codeBlockList"
:custom-error="customError"
:indent="indent"
:next-level-indent-increment="nextLevelIndentIncrement"
@edit="editCode"
@remove="deleteCode"
>
<template #code-block-panel-tool="{ id, data }"> <template #code-block-panel-tool="{ id, data }">
<slot name="code-block-panel-tool" :id="id" :data="data"></slot> <slot name="code-block-panel-tool" :id="id" :data="data"></slot>
</template> </template>
@ -47,6 +54,8 @@ defineOptions({
}); });
defineProps<{ defineProps<{
indent?: number;
nextLevelIndentIncrement?: number;
customError?: (id: Id, errorType: CodeDeleteErrorType) => any; customError?: (id: Id, errorType: CodeDeleteErrorType) => any;
}>(); }>();

View File

@ -1,5 +1,11 @@
<template> <template>
<Tree :data="list" :node-status-map="nodeStatusMap" @node-click="clickHandler"> <Tree
:data="list"
:node-status-map="nodeStatusMap"
:indent="indent"
:next-level-indent-increment="nextLevelIndentIncrement"
@node-click="clickHandler"
>
<template #tree-node-label="{ data }"> <template #tree-node-label="{ data }">
<div <div
:class="{ :class="{
@ -42,6 +48,11 @@ defineOptions({
name: 'MEditorDataSourceList', name: 'MEditorDataSourceList',
}); });
defineProps<{
indent?: number;
nextLevelIndentIncrement?: number;
}>();
const emit = defineEmits<{ const emit = defineEmits<{
edit: [id: string]; edit: [id: string];
remove: [id: string]; remove: [id: string];

View File

@ -29,7 +29,13 @@
</div> </div>
<!-- 数据源列表 --> <!-- 数据源列表 -->
<DataSourceList ref="dataSourceList" @edit="editHandler" @remove="removeHandler"></DataSourceList> <DataSourceList
ref="dataSourceList"
:indent="indent"
:next-level-indent-increment="nextLevelIndentIncrement"
@edit="editHandler"
@remove="removeHandler"
></DataSourceList>
</TMagicScrollbar> </TMagicScrollbar>
<DataSourceConfigPanel <DataSourceConfigPanel
@ -61,6 +67,11 @@ defineOptions({
name: 'MEditorDataSourceListPanel', name: 'MEditorDataSourceListPanel',
}); });
defineProps<{
indent?: number;
nextLevelIndentIncrement?: number;
}>();
const eventBus = inject<EventBus>('eventBus'); const eventBus = inject<EventBus>('eventBus');
const { dataSourceService } = inject<Services>('services') || {}; const { dataSourceService } = inject<Services>('services') || {};

View File

@ -10,6 +10,8 @@
ref="tree" ref="tree"
:data="nodeData" :data="nodeData"
:node-status-map="nodeStatusMap" :node-status-map="nodeStatusMap"
:indent="indent"
:next-level-indent-increment="nextLevelIndentIncrement"
@node-dragover="handleDragOver" @node-dragover="handleDragOver"
@node-dragstart="handleDragStart" @node-dragstart="handleDragStart"
@node-dragleave="handleDragLeave" @node-dragleave="handleDragLeave"
@ -70,6 +72,8 @@ defineOptions({
defineProps<{ defineProps<{
layerContentMenu: (MenuButton | MenuComponent)[]; layerContentMenu: (MenuButton | MenuComponent)[];
indent?: number;
nextLevelIndentIncrement?: number;
customContentMenu?: (menus: (MenuButton | MenuComponent)[], type: string) => (MenuButton | MenuComponent)[]; customContentMenu?: (menus: (MenuButton | MenuComponent)[], type: string) => (MenuButton | MenuComponent)[];
}>(); }>();