济菏高速业务端
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

245 lines
5.9 KiB

2 years ago
<!-- 机构-多选(默认级联)-桑基图 -->
<template>
<div>
<div style="width: 100%; padding: 10px 0;" class="box">
<el-row v-if="filter">
<el-input
v-model="label"
placeholder="请输入机构名称"
clearable
size="small"
suffix-icon="el-icon-search"
style="width: 100%"
/>
</el-row>
</div>
<el-scrollbar>
<el-row :style="{ height: height }"
style="overflow-x: hidden;
overflow-y: auto;
height: calc(100% - 40px);
width: 100%;">
<el-tree
class="tree"
:data="siteTreeOptions"
:props="defaultProps"
:expand-on-click-node="false"
:check-on-click-node="true"
:show-checkbox="show_checkbox"
:filter-node-method="filterNode"
ref="tree"
@node-click="handleNodeClick"
@check="handleCheckChange"
node-key="id"
highlight-current
>
<!-- 鼠标移入文本提示 -->
<div class="showName" slot-scope="{ node, data }">
<!-- <el-tooltip :content="node.label" placement="top" effect="light"> -->
<span>{{ node.label }}</span>
<!-- </el-tooltip> -->
</div>
</el-tree>
</el-row>
</el-scrollbar>
</div>
</template>
<script>
import { treeselectExcYG1 } from "@/api/system/dept";
import { siteTree } from "@/api/energy/api";
export default {
name: "loopTree",
components: {},
props: {
//开启过滤
filter: {
type: Boolean,
default: true,
},
//节点是否可被选择
show_checkbox: {
type: Boolean,
default: false,
},
//是否级联
// check_strictly: {
// type: Boolean,
// default: false,
// },
// //开启默认全选
// default_check_all: {
// type: Boolean,
// default: false,
// },
// //开启默认选中第一个子节点
// default_check_first: {
// type: Boolean,
// default: false,
// },
//默认第一个子节点高亮选中
default_select_first: {
type: Boolean,
default: false,
},
height: {
type: String,
default: "calc(100vh - 280px)",
},
},
data() {
return {
//名称
label: null,
// 部门树选项
deptCode: null,
//回路选项
siteTreeOptions: [],
defaultProps: {
value: "id",
label: "label",
children: "children",
},
default_check_first: false, //默认选中第一项
default_check_all:true
};
},
watch: {
// 根据名称筛选部门树
label(val) {
this.$refs.tree.filter(val);
},
},
created() {
this.getSiteTree();
},
methods: {
// 筛选节点时执行的方法,返回 true 表示这个节点可以显示,返回 false 则表示这个节点会被隐藏
filterNode(value, data) {
if (!value) return true;
return data.label.indexOf(value) !== -1;
},
// 获取树结构
async getSiteTree() {
const response = await siteTree();
if (response.code === 200) {
this.siteTreeOptions =
response.data == null || response.data.length === 0
? []
: response.data;
}
this.$nextTick(() => {
this.showCheckBox();
this.selectFirstChild();
});
},
//节点单击事件
handleNodeClick(data) {
this.$emit("nodeClick", data);
},
//第一个子节点,高亮选中
selectFirstChild() {
if (this.default_select_first) {
let first = this.getFirstChildren(this.siteTreeOptions);
this.$refs.tree.setCurrentKey(first);
this.$emit("defaultSelect", first, this.$refs.tree.getCurrentNode());
}
},
//节点选中事件--复选框
handleCheckChange(data, checked) {
this.$emit("nodeCheck", data, checked);
},
//默认选中--复选框
showCheckBox() {
if (this.show_checkbox) {
//默认全选
if (this.default_check_all) {
let all = this.getAllKeys(this.siteTreeOptions);
this.$refs.tree.setCheckedKeys(all);
this.$emit("defaultCheck", all);
}
//默认选中第一个子节点
if (this.default_check_first) {
let arr = [];
let first = this.getFirstChildren(this.siteTreeOptions);
if (first) arr.push(first);
this.$refs.tree.setCheckedKeys(arr);
this.$emit("defaultCheck", arr);
}
}
},
//获取所有节点
getAllKeys(node, arr = []) {
for (let item of node) {
arr.push(item.id);
let parentArr = [];
if (item.children) parentArr.push(...item.children);
if (parentArr && parentArr.length) this.getAllKeys(parentArr, arr);
}
return arr;
},
//获取第一个子节点
getFirstChildren(node) {
if (node.length) {
return node[0].children && node[0].children.length > 0
? this.getFirstChildren(node[0].children)
: node[0].id;
// return node[0].code;
}
},
},
};
</script>
<style lang="scss" scoped>
.leftTree {
height: 100%;
}
.showName {
width: 170px; //外部容器的宽度
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
display: block;
}
::v-deep .el-tree-node__content {
margin: 3px 0 !important;
}
::v-deep .el-input--small .el-input__inner {
text-align: center;
}
.check {
padding: 10px 10px;
::v-deep .el-checkbox {
width: 50%;
height: 20px;
margin: 0;
line-height: 20px;
}
::v-deep .el-checkbox__label {
font-size: 16px;
padding-left: 8px;
}
::v-deep .el-checkbox__inner {
margin-bottom: 2px;
}
}
.theme-blue .box {
background: none !important;
}
.el-scrollbar__wrap {
overflow-x: hidden;
overflow-y: auto;
width: 100%;
}
.el-scrollbar {
height: calc(100% - 52px);
}
</style>