vue-apps/com.actionsoft.apps.coe.pal/components/common/BPMOrgAddress/component.vue
shangxiaoran@qq.com 9d8f9f0e92 初始化应用
2022-06-28 01:29:37 +08:00

353 lines
12 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<el-container>
<el-dialog
id="bpmOrgAddress"
:title="title"
:visible.sync="dialogVisible"
:destroy-on-close=true
:width="width"
:modal-append-to-body=false
:append-to-body=true
:close-on-click-modal=false
:before-close="handleClose">
<template v-if="refresh">
<div
v-loading="loading"
element-loading-text="拼命加载中">
<!-- <el-autocomplete-->
<!-- v-model="treeSearchKey"-->
<!-- size="small"-->
<!-- :fetch-suggestions="treeSearch"-->
<!-- @select="treeSearchSelect"-->
<!-- suffix-icon="el-icon-search"-->
<!-- placeholder="快速查询"-->
<!-- :trigger-on-focus=false-->
<!-- style="width:100%;">-->
<!-- <template slot-scope="{ item }">-->
<!-- <el-tooltip class="item" placement="bottom">-->
<!-- <div slot="content">{{item.pathName}}</div>-->
<!-- <span>{{ item.name }}</span>-->
<!-- </el-tooltip>-->
<!-- </template>-->
<!-- </el-autocomplete>-->
<div style="height: 300px;overflow: auto;border: 1px solid #f2f2f2;">
<div class="tree">
<el-tree
ref="tree"
:props="treeProps"
:show-checkbox="multiple"
:expand-on-click-node=false
:check-strictly=true
:highlight-current=true
@node-click="openNode"
@node-expand="expandNode"
@node-collapse="closeNode"
node-key="id"
lazy
:load="loadNode">
<span slot-scope="{node, data}">
<i class="awsui-iconfont tree-content-icon tree-content-icon-padding" :style="{'color': node.data.icon.color}" v-html="node.data.icon.icon"></i>
<span>{{node.label}}</span>
</span>
</el-tree>
</div>
</div>
</div>
</template>
<span slot="footer" class="dialog-footer">
<awsui-button class="button-general-color" type="primary" @click="submit">确定</awsui-button>
<awsui-button @click="cancel">取消</awsui-button>
</span>
</el-dialog>
</el-container>
</template>
<script>
import awsuiAxios from "../../../awsuiAxios";
export default {
name: "BpmOrgAddress",
props: {
visible: {
type: Boolean,
default: false
},
addressType: {// 地址簿类型默认部门地址簿可进行部门department、用户user、角色role组合逗号分隔
type: String,
default: 'department'
},
multiple: {// 是否多选
type: Boolean,
default: false
},
rootDeptId: {// 默认根部门,为空则默认当前人所属单位为根节点
type: String,
default: ''
},
highSecurityFilter: {// 地址簿过滤三员用户类型 三员开启模式并且地址簿类型包含用户user时有效系统管理员sysAdmin、安全保密员secAdmin、安全审计员auditor逗号分割
type: String,
default: ''// 例如值为sysAdmin,auditor则开启三员之后该地址簿不显示系统管理员和安全审计员
},
title: {// 标题
type: String,
default: ''
},
selected: {// 默认选中,比如{'department':[],'user':[],'role':[],'position':[]},不区分单多选,单选只取第一个值
type: Object,
default: function () {
return {'department':[],'user':[],'role':[],'position':[]}
}
}
},
data() {
return {
refresh: false,
dialogVisible: false,
loading: false,
searchKey: '',
treeSearchKey: '',
timeout: null,
pid: '',
width: '500px',
treeProps: {
label: 'name',
isLeaf: 'leaf'
}
};
},
methods: {
handleClose(done) {
this.closeDlalog('cancel');
done();
},
cancel() {
this.closeDlalog('cancel');
this.dialogVisible = false;
},
submit() {
this.closeDlalog('save');
this.dialogVisible = false;
},
closeDlalog(type) {// 取消/确定之后的关闭
if (type == 'save') {
let result = [];
if (this.multiple) {// 多选
result = this.$refs.tree.getCheckedNodes();
} else {// 单选
const node = this.$refs.tree.getCurrentNode();
if (node != null) {
result.push(node);
}
}
this.$emit('getResult', JSON.parse(JSON.stringify(result)));
} else {
this.$emit('cancel');
}
// 清空所有数据
},
handleNodeClick(data) {
// console.log(data);
},
openNode(obj, node, tree) {// 打开一只模型文件
},
treeSearchSelect(item) {
this.queryTreeByIdAndPath(item.id, item.path);
},
treeSearch(key, cb) {
const that = this;
if (key != undefined && key.trim() != '') {
// that.loading = true;
const data = {
url:'jd',
data:{
cmd: 'com.actionsoft.apps.coe.pal_repository_tree_component_search',
addressType: that.addressType,
rootDeptId: that.rootDeptId,
name: key
}
};
// 查询数据
awsuiAxios.post(data).then(function (ro) {
if (ro.result == 'ok') {
if (ro.data.length > 0) {
clearTimeout(that.timeout);
that.timeout = setTimeout(() => {
cb(ro.data);
}, 3000 * Math.random());
} else {
clearTimeout(that.timeout);
}
} else {
clearTimeout(that.timeout);
}
}).catch(error=>{
console.log(error);
})
} else {
clearTimeout(that.timeout);
}
},
queryTreeByIdAndPath(id, path) {// 定位展开某节点
const that= this;
const tree = that.$refs.tree;
// 分隔字符串
const pathArr = path.split(',');
let index = 1;
for (let i = 0; i < pathArr.length; i++) {// 依次展开
if (i > 0) {
if (tree.getNode(pathArr[i-1]) != null) {
setTimeout(that._expandNode(tree, pathArr[i-1]), index * 300);
index++;
}
}
}
setTimeout(function() {
if (tree.getNode(id) != null) {
tree.setCurrentKey(id);
}
}, index * 300);
},
_expandNode(tree, id) {
return function() {
tree.getNode(id).expand();
}
},
loadNode(node, resolve) {// `动态`加载
const that = this;
that.loading = true;
const data = {
url:'jd',
data:{
cmd: 'com.actionsoft.apps.coe.pal_bpm_org_address_component_subjson',
addressType: that.addressType,
pid: '',
highSecurityFilter: that.highSecurityFilter
}
};
if (node.level === 0) {
// 获取根目录
data.data.pid = that.pid;
data.data.parentType = '';
} else {
// 获取其他目录
data.data.pid = node.data.id;
data.data.parentType = node.data.type;
}
// 查询数据
awsuiAxios.post(data).then(function (ro) {
// 设置是否可选中
if (that.multiple) {// 多选
const isDept = that.addressType.indexOf('department') > -1;
const isUser = that.addressType.indexOf('user') > -1;
const isRole = that.addressType.indexOf('role') > -1;
const isPosition = that.addressType.indexOf('position') > -1;
for (let i = 0; i < ro.data.length; i++) {
const curr = ro.data[i];
if (curr.type == 'company' || curr.type == 'roleRoot' || curr.type == 'roleGroup' || curr.type == 'positionRoot' || curr.type == 'positionGroup') {
curr.disabled = true;
} else {
if (isDept && curr.type == 'department') curr.disabled = false;
if (!isDept && curr.type == 'department') curr.disabled = true;
if (isUser && curr.type == 'user') curr.disabled = false;
if (!isUser && curr.type == 'user') curr.disabled = true;
if (isRole && curr.type == 'role') curr.disabled = false;
if (!isRole && curr.type == 'role') curr.disabled = true;
if (isPosition && curr.type == 'position') curr.disabled = false;
if (!isPosition && curr.type == 'position') curr.disabled = true;
}
}
};
resolve(ro.data);
that.loading = false;
if (node.level == 0 && ro.data.length > 0) {
const tree = that.$refs.tree;
tree.getNode(ro.data[0].id).expand();
setTimeout(function(){
const childNode = tree.getNode(ro.data[0].id).childNodes[0];
if (childNode != null) {
childNode.expand();
}
}, 500);
}
}).catch(error=>{
console.log(error);
})
},
expandNode(obj, node, tree) {// 展开节点
},
closeNode(obj, node, tree) {// 关闭时清空,下次展开重新请求动态加载
node.childNodes = [];
node.loaded = false;
},
refreshNode(id) {// 刷新当前选中节点的子节点即关闭当前节点后重新打开会执行loadNode进行自动加载
if (id == undefined) {// 未指定节点,默认刷新当前选中
const nodeData = this.$refs.tree.getCurrentNode();
if (nodeData != null) {
if (this.$refs.tree.store.nodesMap[nodeData.id] != undefined) {
this.$refs.tree.store.nodesMap[nodeData.id].expanded = false;
}
const node = this.$refs.tree.getNode(nodeData.id);
this.closeNode(null, node, null);
node.expand();
}
} else {// 指定刷新某节点
if (this.$refs.tree.store.nodesMap[id] != undefined) {
this.$refs.tree.store.nodesMap[id].expanded = false;
}
const node = this.$refs.tree.getNode(id);
if (node != null) {
this.closeNode(null, node, null);
node.expand();
}
}
}
},
watch: {
visible(val) {
this.dialogVisible = val;
if (val) {// 打开
if (this.addressType.indexOf('department') > 0) {
this.pid = this.rootDeptId;
}
this.refresh = true;
} else {// 关闭
this.refresh = false;
}
}
}
}
</script>
<style scoped>
#bpmOrgAddress >>> .el-dialog__body {
padding: 10px 20px;
color: #606266;
font-size: 14px;
word-break: break-all;
}
#bpmOrgAddress >>> .el-input__inner {
border-radius: 0px;
}
#bpmOrgAddress >>> .el-tree--highlight-current .el-tree-node.is-current>.el-tree-node__content {
background-color: #F5F7FA;
color: #4E7FF9;
}
#bpmOrgAddress >>> .el-tree--highlight-current .el-tree-node.is-current>.el-tree-node__content .awsui-iconfont {
color: #4E7FF9 !important;
}
/*#bpmOrgAddress >>> .el-tree .el-tree-node>.el-tree-node__children{*/
/* overflow: visible;*/
/*}*/
.tree{
overflow: auto;
width:458px;
height: 300px;
}
#bpmOrgAddress >>> .el-tree {
min-width: 100%;
display:inline-block !important;
}
</style>