vue-apps/com.actionsoft.apps.coe.pal/components/common/BPMOrgAddress/component.vue

353 lines
12 KiB
Vue
Raw Normal View History

2022-06-28 01:29:37 +08:00
<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>