mirror of
https://github.com/Tencent/tmagic-editor.git
synced 2025-04-06 03:57:56 +08:00
fix: 升级element-plus2.2.0后,sidebar动态变化后,顺序不对
This commit is contained in:
parent
1486beb52c
commit
2731609526
@ -1,36 +1,26 @@
|
|||||||
<template>
|
<template>
|
||||||
<el-tabs v-if="data.type === 'tabs'" class="m-editor-sidebar" v-model="activeTabName" type="card" tab-position="left">
|
<el-tabs
|
||||||
<el-tab-pane v-for="item in items" :key="item.text" :name="item.text">
|
v-if="data.type === 'tabs' && data.items.length"
|
||||||
<template #label>
|
class="m-editor-sidebar"
|
||||||
<div :key="item.text">
|
v-model="activeTabName"
|
||||||
<m-icon v-if="item.icon" :icon="item.icon"></m-icon>
|
type="card"
|
||||||
<div v-if="item.text" class="magic-editor-tab-panel-title">{{ item.text }}</div>
|
tab-position="left"
|
||||||
</div>
|
>
|
||||||
</template>
|
<tab-pane v-for="(item, index) in data.items" :key="index" :data="item"></tab-pane>
|
||||||
|
|
||||||
<component :is="item.component" v-bind="item.props || {}" v-on="item.listeners || {}">
|
|
||||||
<template #layer-node-content="{ data, node }" v-if="item.slots?.layerNodeContent">
|
|
||||||
<component :is="item.slots.layerNodeContent" :data="data" :node="node" />
|
|
||||||
</template>
|
|
||||||
</component>
|
|
||||||
</el-tab-pane>
|
|
||||||
</el-tabs>
|
</el-tabs>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { computed, defineComponent, PropType, ref, watch } from 'vue';
|
import { defineComponent, PropType, ref, watch } from 'vue';
|
||||||
import { Coin, Files } from '@element-plus/icons';
|
|
||||||
|
|
||||||
import MIcon from '@editor/components/Icon.vue';
|
import { SideBarData } from '@editor/type';
|
||||||
import { SideBarData, SideComponent } from '@editor/type';
|
|
||||||
|
|
||||||
import ComponentListPanel from './ComponentListPanel.vue';
|
import TabPane from './TabPane.vue';
|
||||||
import LayerPanel from './LayerPanel.vue';
|
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
name: 'm-sidebar',
|
components: { TabPane },
|
||||||
|
|
||||||
components: { MIcon },
|
name: 'm-sidebar',
|
||||||
|
|
||||||
props: {
|
props: {
|
||||||
data: {
|
data: {
|
||||||
@ -51,35 +41,6 @@ export default defineComponent({
|
|||||||
|
|
||||||
return {
|
return {
|
||||||
activeTabName,
|
activeTabName,
|
||||||
|
|
||||||
items: computed<SideComponent[] | Record<string, any>[]>(() =>
|
|
||||||
props.data?.items.map((item) => {
|
|
||||||
if (typeof item !== 'string') {
|
|
||||||
return item;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (item) {
|
|
||||||
case 'component-list':
|
|
||||||
return {
|
|
||||||
type: 'component',
|
|
||||||
icon: Coin,
|
|
||||||
text: '组件',
|
|
||||||
component: ComponentListPanel,
|
|
||||||
slots: {},
|
|
||||||
};
|
|
||||||
case 'layer':
|
|
||||||
return {
|
|
||||||
type: 'component',
|
|
||||||
icon: Files,
|
|
||||||
text: '已选组件',
|
|
||||||
component: LayerPanel,
|
|
||||||
slots: {},
|
|
||||||
};
|
|
||||||
default:
|
|
||||||
return {};
|
|
||||||
}
|
|
||||||
}),
|
|
||||||
),
|
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
68
packages/editor/src/layouts/sidebar/TabPane.vue
Normal file
68
packages/editor/src/layouts/sidebar/TabPane.vue
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
<template>
|
||||||
|
<el-tab-pane v-if="config" :name="config.text">
|
||||||
|
<template #label>
|
||||||
|
<div :key="config.text">
|
||||||
|
<m-icon v-if="config.icon" :icon="config.icon"></m-icon>
|
||||||
|
<div v-if="config.text" class="magic-editor-tab-panel-title">{{ config.text }}</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<component :is="config.component" v-bind="config.props || {}" v-on="config?.listeners || {}">
|
||||||
|
<template #layer-node-content="{ data, node }" v-if="config.slots?.layerNodeContent">
|
||||||
|
<component :is="config.slots?.layerNodeContent" :data="data" :node="node" />
|
||||||
|
</template>
|
||||||
|
</component>
|
||||||
|
</el-tab-pane>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import { computed, defineComponent, PropType } from 'vue';
|
||||||
|
import { Coin, Files } from '@element-plus/icons';
|
||||||
|
|
||||||
|
import MIcon from '@editor/components/Icon.vue';
|
||||||
|
import { SideComponent, SideItem } from '@editor/type';
|
||||||
|
|
||||||
|
import ComponentListPanel from './ComponentListPanel.vue';
|
||||||
|
import LayerPanel from './LayerPanel.vue';
|
||||||
|
|
||||||
|
export default defineComponent({
|
||||||
|
components: { MIcon },
|
||||||
|
|
||||||
|
props: {
|
||||||
|
data: {
|
||||||
|
type: Object as PropType<SideItem>,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
setup(props) {
|
||||||
|
return {
|
||||||
|
config: computed<SideComponent | undefined>(() => {
|
||||||
|
if (typeof props.data !== 'string') {
|
||||||
|
return props.data;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (props.data) {
|
||||||
|
case 'component-list':
|
||||||
|
return {
|
||||||
|
type: 'component',
|
||||||
|
icon: Coin,
|
||||||
|
text: '组件',
|
||||||
|
component: ComponentListPanel,
|
||||||
|
slots: {},
|
||||||
|
};
|
||||||
|
case 'layer':
|
||||||
|
return {
|
||||||
|
type: 'component',
|
||||||
|
icon: Files,
|
||||||
|
text: '已选组件',
|
||||||
|
component: LayerPanel,
|
||||||
|
slots: {},
|
||||||
|
};
|
||||||
|
default:
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
};
|
||||||
|
},
|
||||||
|
});
|
||||||
|
</script>
|
@ -291,7 +291,7 @@ class Editor extends BaseService {
|
|||||||
await this.select(newNode);
|
await this.select(newNode);
|
||||||
|
|
||||||
this.addModifiedNodeId(newNode.id);
|
this.addModifiedNodeId(newNode.id);
|
||||||
if (type !== NodeType.PAGE) {
|
if (!isPage) {
|
||||||
this.pushHistoryState();
|
this.pushHistoryState();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user