You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

237 lines
6.4 KiB
Vue

<template>
<div>
<el-container>
<el-header class="top-el-header">
<top-panel
@change-visible="changeVisible"
@on-return="emits('onReturn')"
@on-preview="(val) => emits('onPreview', val)"
@on-save="(val) => emits('onSave', val)"
></top-panel>
</el-header>
<el-container class="middle">
<el-aside class="side-nav" :class="svgEditLayoutStore.left_nav ? 'show-nav' : 'hide-nav'">
<el-scrollbar class="elscrooll-pc">
<left-panel class="content-left" :custom-tool-bar="props.customToolBar"></left-panel>
</el-scrollbar>
</el-aside>
<el-main class="middle main">
<div class="canvas-main-pc">
<center-panel></center-panel>
</div>
</el-main>
<el-aside class="side-nav" :class="svgEditLayoutStore.right_nav ? 'show-nav' : 'hide-nav'">
<el-scrollbar class="elscrooll-pc">
<right-panel></right-panel>
</el-scrollbar>
</el-aside>
</el-container>
<el-footer class="bottom-el-footer" height="40px">
<bottom-panel></bottom-panel>
</el-footer>
</el-container>
<el-dialog v-model="visible_conf.ImportJson" title="导入" width="60%" destroy-on-close>
<import-json ref="importJsonRef"></import-json>
<template #footer>
<span class="dialog-footer">
<el-button type="primary" @click="onImportJson"></el-button>
<el-button type="primary" @click="visible_conf.ImportJson = false">关闭</el-button>
</span>
</template>
</el-dialog>
<el-dialog v-model="visible_conf.ExportJson" title="导出" width="60%" destroy-on-close>
<export-json></export-json>
<template #footer>
<span class="dialog-footer">
<el-button type="primary" @click="visible_conf.ExportJson = false">关闭</el-button>
</span>
</template>
</el-dialog>
<el-drawer
v-if="visible_conf.ComponentTree"
v-model="visible_conf.ComponentTree"
title="组件树"
direction="ltr"
size="30%"
>
<component-tree></component-tree>
</el-drawer>
</div>
</template>
<script setup lang="ts">
import {
ElContainer,
ElHeader,
ElAside,
ElFooter,
ElMain,
ElScrollbar,
ElDialog,
ElButton,
ElDrawer
} from 'element-plus';
import 'element-plus/dist/index.css';
import TopPanel from './components/top-panel/index.vue';
import LeftPanel from './components/left-panel/index.vue';
import CenterPanel from './components/center-panel/index.vue';
import RightPanel from './components/right-panel/index.vue';
import BottomPanel from './components/bottom-panel/index.vue';
import { useSvgEditLayoutStore } from '../../store/svgedit-layout';
import { onMounted, PropType, reactive, ref } from 'vue';
import ExportJson from '@/components/webtopo-svg-edit/components/export-json/index.vue';
import ImportJson from '@/components/webtopo-svg-edit/components/import-json/index.vue';
import ComponentTree from '@/components/webtopo-svg-edit/components/component-tree/index.vue';
import { IVisibleConf, EVisibleConfKey } from './types';
import { IConfigCenter } from '@/config-center/types';
import { useImportDataModel } from '@/hooks';
import { useGlobalStore } from '@/store/global';
const props = defineProps({
customToolBar: {
type: Object as PropType<IConfigCenter>,
default: () => {}
},
dataModel: {
type: String,
default: ''
}
});
const globalStore = useGlobalStore();
const svgEditLayoutStore = useSvgEditLayoutStore();
const importJsonRef = ref<InstanceType<typeof ImportJson>>();
const visible_conf: IVisibleConf = reactive({
[EVisibleConfKey.ExportJson]: false,
[EVisibleConfKey.ImportJson]: false,
[EVisibleConfKey.ComponentTree]: false
});
const emits = defineEmits(['onReturn', 'onPreview', 'onSave']);
const changeVisible = (key: EVisibleConfKey, val: boolean) => {
visible_conf[key] = val;
};
const onImportJson = () => {
importJsonRef.value?.onImportJson();
changeVisible(EVisibleConfKey.ImportJson, false);
};
onMounted(() => {
if (props.dataModel != '') {
useImportDataModel(props.dataModel);
} else {
globalStore.setDoneJson([]);
}
});
</script>
<style scoped lang="less">
@headerHeight: 60px;
@buttomHeight: 40px;
.elscrooll-pc {
height: calc(100vh - (@headerHeight + @buttomHeight));
}
.canvas-main-pc {
width: 100%;
height: 100%;
margin: 0 auto;
}
.middle {
height: calc(100vh - (@headerHeight + @buttomHeight));
&.main {
margin: 0px 5px;
background-color: #ffffff;
padding: 0px 2px;
}
.side-nav {
@showLeftNavWidth: 240px;
@hideLeftNavWidth: 0px;
position: relative;
overflow: inherit;
transition: all 0.5s;
// background-color: rgb(250, 251, 253);
box-shadow: 0px 0px 2px #dfcfcf;
.content-left {
overflow: hidden;
margin: 0px 1vh;
}
&.show-nav {
flex: 0 0 @showLeftNavWidth;
min-width: @showLeftNavWidth;
max-width: @showLeftNavWidth;
}
&.hide-nav {
flex: 0 0 @hideLeftNavWidth;
min-width: @hideLeftNavWidth;
max-width: @hideLeftNavWidth;
}
}
}
.top-el-header {
display: flex;
flex-direction: row;
align-items: center;
box-shadow: 0px 0px 2px #dfcfcf;
margin-bottom: 1px;
height: 45px;
}
.bottom-el-footer {
box-shadow: 0px -1px 0px 0px #dfcfcf;
margin-top: 10px;
}
.contextMenu {
position: absolute;
z-index: 99999;
background: #ffffff;
padding: 5px 0;
margin: 0px;
display: block;
border-radius: 5px;
box-shadow: 2px 5px 10px rgba(0, 0, 0, 0.3);
li {
list-style: none;
padding: 0px;
margin: 0px;
}
.shortcut {
width: 115px;
text-align: right;
float: right;
}
p {
text-decoration: none;
display: block;
padding: 0px 15px 1px 20px;
margin: 0;
user-select: none;
-webkit-user-select: none;
}
p:hover {
background-color: #0cf;
color: #ffffff;
cursor: default;
}
.disabled {
color: #999;
}
.disabled:hover {
color: #999;
background-color: transparent;
}
li.separator {
border-top: solid 1px #e3e3e3;
padding-top: 5px;
margin-top: 5px;
}
}
</style>