1
0
mirror of https://github.com/sahadev/vue-component-creater-ui.git synced 2025-09-27 23:03:22 +08:00
Files
vue-component-creater-ui/src/components/CodeStructure.vue
2021-11-30 19:17:29 +08:00

174 lines
4.3 KiB
Vue

<template>
<el-drawer v-model="drawer" :with-header="false" size="70%" direction="btt">
<div class="container">
<div style="text-algin: center;">组件结构检视图
<br>
<span style="font-size:12px;">Components
Structure</span>
</div>
<el-row :gutter="20" style="height:0px;flex-grow:1;">
<el-col :span="16" style="height: 100%;">
<div style="overflow: scroll;height:100%; margin: 0 20px;padding: 10px;">
<vue-nestable v-model="treeData" @change="onLevelChange">
<template v-slot="{ item }">
<vue-nestable-handle :item="item">
<i class="el-icon-rank icon-s"></i>
</vue-nestable-handle>
<span @click="onNodeClick(item)">{{ item.text }}</span>
</template>
<template v-slot:placeholder>
<div><b>The editor is empty.</b></div>
</template>
</vue-nestable>
</div>
</el-col>
<el-col :span="8">
<attribute-input ref="attributeInput" :enableRemoveButton="true" v-if="currentEditRawInfo && drawer"
@save="onSaveAttr" shortcutInitMode="auto" @remove="onRemove" @codeRefresh="codeRefresh"
:__rawVueInfo__="currentEditRawInfo">
</attribute-input>
</el-col>
</el-row>
</div>
</el-drawer>
</template>
<script>
import "./halower-tree.min.css";
import "@/assets/nestable.css"
import { isObject, getRawComponentKey, getRawComponentContent } from "@/utils/common";
import { VueNestable, VueNestableHandle } from 'vue-nestable';
export default {
props: ['visible'],
components: {
AttributeInput: resolve => { require(["./AttributeInput"], resolve) },
VueNestable,
VueNestableHandle
},
data() {
return {
// 在此自动生成
treeData: [],
currentEditRawInfo: null
};
},
beforeCreate() { },
created() { },
beforeMount() { },
mounted() { },
beforeUpdate() { },
updated() { },
destoryed() { },
methods: {
// 在此自动生成
request() {
// 网络请求,可选
},
codeRefresh() {
this.$emit('codeRefresh');
},
onLevelChange(value, options) {
this.$emit('onLevelChange', value.id, options.pathTo);
},
convertStructure(rawInfo) {
const title = getRawComponentKey(rawInfo);
const object = rawInfo[title];
const children = [];
if (isObject(object)) {
for (const key in object) {
if (object.hasOwnProperty(key)) {
if (key === '__children') {
const element = object[key];
element.forEach(item => {
const temp = this.convertStructure(item);
temp && children.push(temp);
})
} else if (isObject(object[key])) {
// 组成一个新的结构,适配只有一个子节点的数据结构
const __obj = {};
__obj[key] = object[key];
const child = this.convertStructure(__obj);
child && children.push(child);
}
}
}
return {
text: title,
expanded: true,
children: children,
rawInfo: rawInfo,
id: getRawComponentContent(rawInfo).lc_id
}
} else {
return null;
}
},
onNodeClick(nodeInfo) {
this.currentEditRawInfo = nodeInfo.rawInfo;
},
onRemove({ lc_id }) {
this.$emit("remove", { lc_id });
// 为了降低复杂性,这里先不做删除失败的处理
this.currentEditRawInfo = null;
},
onSaveAttr(resultList) {
this.$emit("save", resultList);
},
updateCode(codeRawInfo) {
this.treeData = [this.convertStructure(codeRawInfo)];
},
},
watch: {
canInitShortcut(newValue) {
}
},
computed: {
drawer: {
get() {
return this.visible;
},
set() {
this.$emit('update:visible', false);
}
},
canInitShortcut() {
return this.currentEditRawInfo !== null && this.drawer;
}
},
fillter: {},
};
</script>
<style scoped>
/* 在此自动生成 */
center {
padding: 20px;
}
::v-deep .el-drawer__body {
height: 100%;
}
.container {
height: 100%;
display: flex;
flex-direction: column;
}
</style>