| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321 |
- <template>
- <!-- 弹出框 -->
- <el-popover placement="bottom-start" :disabled="disabled" v-model="visible">
- <!-- 选中的值 -->
- <div slot="reference" class="tags-box">
- <i v-if="sNodeList.length > 0 && !disabled" class="el-icon-circle-close close-icon" @click="clear"></i>
- <el-tag type="success" v-for="v in sNodeList" :key="v.id">{{ v.name }}</el-tag>
- </div>
- <!-- 文本框 -->
- <el-input style="width: 100%; margin-bottom: 20px" v-model="queryForm.value" @input="serchTreeHandler"
- placeholder="请输入查询机构名称"></el-input>
- <!-- 下拉框 -->
- <el-row :gutter="20" type="flex" align="middle">
- <el-col :span="14" :xs="24">
- <el-select :disabled="disable" v-model="queryForm.type" placeholder="请选择过滤机构类型" clearable
- @change="serchTreeHandler">
- <el-option v-for="dict in dict.type.sys_org_type" :key="dict.value" :label="dict.label"
- :value="parseInt(dict.value)"></el-option>
- </el-select>
- </el-col>
- <el-col :span="10" :xs="24">
- <el-checkbox v-if="queryForm.type" :disabled="disable" v-model="checked">按过滤机构类型勾选</el-checkbox>
- </el-col>
- </el-row>
- <!-- 机构树 -->
- <div class="tree-box">
- <el-tree ref="tree" :data="orgTree" :props="treeProps" node-key="id" show-checkbox :check-strictly="true"
- :expand-on-click-node="false" :default-checked-keys="nodes" :default-expanded-keys="nodes"
- @node-click="handleNodeClick" @check="onCheck" :filter-node-method="filterNode">
- </el-tree>
- </div>
- </el-popover>
- </template>
- <script>
- export default {
- dicts: ["sys_org_type"],
- props: {
- //默认选中的node
- defaultNode: {
- type: Array,
- default: () => [],
- required: false,
- },
- //行社机构
- hangsheTree: {
- type: Boolean,
- default: false,
- },
- defaultProps: {
- type: Object,
- default: () => {
- return {
- children: "children",
- label: "name",
- };
- },
- },
- //自定义请求
- customRequest: {
- type: Function,
- },
- //组件禁用
- disabled: {
- type: Boolean,
- default: false,
- required: false,
- },
- queryData: {
- type: Number,
- default: null,
- required: false,
- },
- // 机构类型筛选条件禁用
- disable: {
- type: Boolean,
- default: false,
- required: false,
- },
- // 机构树上能选择的机构类型
- enabledCheckOrgTypes: {
- type: [Number,Array],
- default: [],
- required: false,
- }
- },
- data() {
- return {
- //清除图标
- showClearable: false,
- //弹窗显示
- visible: false,
- //结构树
- orgTree: null,
- //过滤条件
- queryForm: {
- value: null,
- type: null,
- },
- //受否全选
- checked: false,
- //已选中的node
- sNodeList: [],
- //默认显示及展开的node
- nodes: [],
- treeProps:{
- disabled: this.getNodedisabled,
- children: "children",
- label: "name",
- }
- };
- },
- mounted() {
- this.getDeptTree();
- },
- watch: {
- defaultNode: {
- immediate: true,
- handler(n) {
- if (!n || n.length === 0) return;
- this.nodes = this.defaultNode;
- this.$nextTick(() => {
- let arr = [];
- this.defaultNode.forEach(v => {
- let node = this.$refs.tree.getNode(v);
- arr.push(node.data)
- })
- this.sNodeList = arr;
- });
- },
- },
- queryData: {
- handler(n) {
- if (n) {
- this.queryForm.type = parseInt(n);
- this.serchTreeHandler();
- }
- },
- // queryForm: {
- // deep: true,
- // handler(n, o) {
- // if(!n.value&&!n.type){
- // this.$refs.tree.filter({});
- // }else{
- // this.$refs.tree.filter(n);
- // }
- // },
- // },
- },
- defaultProps: {
- handler(n) {
- if (n) {
- this.treeProps.label=n.label;
- this.treeProps.children=n.children;
- }
- },
- }
- },
- methods: {
- clear() {
- this.sNodeList = [];
- this.$refs.tree.setCheckedKeys([]);
- this.$refs.tree.setCurrentKey(null);
- this.nodes = [];
- this.$emit("selectNode", JSON.stringify(this.sNodeList));
- },
- //筛选条件变化
- serchTreeHandler() {
- this.$refs.tree.filter(this.queryForm);
- },
- /** 查询机构下拉树结构 */
- getDeptTree() {
- if (this.customRequest) {
- this.customRequest().then((response) => {
- this.treeList = response.data;
- return
- });
- }
- this.orgTree = this.$store.getters.orgTree;
- if (this.hangsheTree) {
- this.orgTree = this.$store.getters.depTree;
- }
- },
- getNodedisabled(node) {
- //console.log("getNodedisabled",node,this.enabledCheckOrgTypes)
- return false;
- if (this.enabledCheckOrgTypes) {
- if (Array.isArray(node)) {
- debugger;
- if (this.params.enabledOrgTypeList.findIndex((x) => x === node.type) == -1) {
- return true;
- }
- }
- else {
- if (this.enabledCheckOrgTypes !== node.type) {
- return true;
- }
- }
- }
- return false;
- },
- filterNode(value, data, node) {
- if (this.queryForm.value && this.queryForm.type) {
- return (
- data.name.indexOf(this.queryForm.value) !== -1 &&
- data.type == this.queryForm.type
- );
- }
- if (this.queryForm.value) {
- return data.name.indexOf(this.queryForm.value) !== -1;
- }
- if (this.queryForm.type) {
- return data.type == this.queryForm.type;
- }
- return true;
- },
- handleNodeClick() {
- },
- onCheck(data, checked, tree) {
- if (this.checked) {
- let checkNodes = this.$refs.tree.getCheckedNodes();
- let type = this.queryForm.type;
- let recursionFn = function (tree) {
- tree.forEach((item) => {
- if (type == item.type) {
- checkNodes.push(item);
- //console.log('name',checkNodes.indexOf(item))
- //checkNodes.indexOf(item) >= 0? checkNodes.splice(checkNodes.indexOf(item),1):checkNodes.push(item);
- }
- if (item.children?.length > 0) {
- recursionFn(item.children)
- } else {
- return;
- }
- });
- }
- // 递归查询
- recursionFn(data.children);
- let arr = checkNodes.filter(v => {
- return v.type == this.queryForm.type
- }
- );
- this.$refs.tree.setCheckedNodes(arr);
- this.sNodeList = this.$refs.tree.getCheckedNodes();
- return
- }
- // debugger;
- this.sNodeList = this.$refs.tree.getCheckedNodes();
- this.$emit("selectNode", JSON.stringify(this.sNodeList));
- },
- getSubOrgIdsByOrgType(topOrg, orgType, orgIdList) {
- if (!topOrg) return;
- if (topOrg.type == orgType) {
- orgIdList.push(topOrg);
- }
- if (topOrg.children && topOrg.children.length > 0) {
- topOrg.children.forEach((item) => {
- this.getSubOrgIdsByOrgType(item, orgType, orgIdList);
- });
- }
- },
- },
- model: {
- prop: "defaultNode",
- event: "selectNode",
- },
- };
- </script>
- <style scoped lang="scss">
- .tags-box {
- background-color: #fff;
- border-radius: 4px;
- border: 1px solid #dcdfe6;
- color: #606266;
- outline: 0;
- padding: 0 15px 0 5px;
- width: 100%;
- min-height: 40px;
- max-height: 40px;
- position: relative;
- overflow: hidden;
- display: inline-block;
- text-overflow: ellipsis;
- white-space: nowrap;
- cursor: pointer;
- >span {
- margin: 5px 10px;
- }
- &:hover {
- .close-icon {
- display: block;
- color: #666;
- }
- }
- .close-icon {
- position: absolute;
- top: 30%;
- right: 5px;
- display: none;
- cursor: pointer;
- }
- }
- .tree-box {
- margin-top: 20px;
- max-height: 300px;
- overflow: auto;
- border-radius: 4px;
- border: 1px solid #dcdfe6;
- }
- </style>
|