|
|
|
@ -8,6 +8,7 @@ import { |
|
|
|
|
|
|
|
import { ElDialog, ElMessageBox,ElStep,TreeInstance} from 'element-plus'; |
|
|
|
import { useOrgMemberStore } from "@/store/modules/orgMember"; |
|
|
|
import { dataTool } from 'echarts'; |
|
|
|
const props = withDefaults(defineProps<{ |
|
|
|
uid:string, //当前用户的uuid |
|
|
|
uuid:string, //文档的uuid |
|
|
|
@ -21,16 +22,17 @@ const spacePermit=ref<{id:number,data:string,matterUid:string}>({}) //权限 |
|
|
|
const treeRef=ref<TreeInstance>() //tree组件的引用,为了实现初始选中状态 |
|
|
|
const managerMode=ref(false) |
|
|
|
const managers=ref<string[]>([]) |
|
|
|
const firstLevelKeys = ref<string[]>([]) //默认展开的部门 |
|
|
|
|
|
|
|
let resultPermits: Record<string, number> = {}; |
|
|
|
|
|
|
|
interface Tree { |
|
|
|
id: string |
|
|
|
label:string |
|
|
|
parentId?:string |
|
|
|
name:string |
|
|
|
superior?:string |
|
|
|
indeterminate?:boolean, |
|
|
|
radio?:number[]; |
|
|
|
children?: Tree[] |
|
|
|
child?: Tree[] |
|
|
|
ismanager?:boolean, |
|
|
|
} |
|
|
|
|
|
|
|
@ -48,7 +50,7 @@ async function onSavePermChange(){ |
|
|
|
managers.value.push("p0"+item.id) |
|
|
|
} |
|
|
|
|
|
|
|
if(item.children) collectManager(item) |
|
|
|
if(item.child) collectManager(item) |
|
|
|
}) |
|
|
|
|
|
|
|
await addSpaceManager(btoa(props.uid),{ |
|
|
|
@ -69,7 +71,7 @@ async function onSavePermChange(){ |
|
|
|
resultPermits[item.id]=item.radio[0] |
|
|
|
} |
|
|
|
|
|
|
|
if(item.children) collectNodePermits(item) |
|
|
|
if(item.child) collectNodePermits(item) |
|
|
|
}) |
|
|
|
|
|
|
|
spacePermit.value.data=JSON.stringify(resultPermits) |
|
|
|
@ -85,18 +87,18 @@ async function onSavePermChange(){ |
|
|
|
} |
|
|
|
|
|
|
|
function collectManager(node:Tree){ |
|
|
|
node.children?.forEach(ele => { |
|
|
|
node.child?.forEach(ele => { |
|
|
|
if(ele.ismanager){ |
|
|
|
managers.value.push("p0"+ele.id) |
|
|
|
} |
|
|
|
|
|
|
|
if(ele.children) collectManager(ele) |
|
|
|
if(ele.child) collectManager(ele) |
|
|
|
}); |
|
|
|
} |
|
|
|
|
|
|
|
//去遍历查找特殊设置的节点,并保存 |
|
|
|
function collectNodePermits(node:Tree){ |
|
|
|
node.children?.forEach(ele => { |
|
|
|
node.child?.forEach(ele => { |
|
|
|
if(ele.radio&&ele.radio.length>0){ |
|
|
|
if(ele.indeterminate) { |
|
|
|
ele.radio[0]+=10 |
|
|
|
@ -104,7 +106,7 @@ function collectNodePermits(node:Tree){ |
|
|
|
resultPermits[ele.id]=ele.radio[0] |
|
|
|
} |
|
|
|
|
|
|
|
if(ele.children){ |
|
|
|
if(ele.child){ |
|
|
|
collectNodePermits(ele) |
|
|
|
} |
|
|
|
}); |
|
|
|
@ -114,25 +116,25 @@ function collectNodePermits(node:Tree){ |
|
|
|
//递归修改子级元素 |
|
|
|
function onGroupValueChange(node:Tree, val:number[]){ |
|
|
|
if(node.indeterminate) node.indeterminate=false; |
|
|
|
node.children?.forEach(ele => { |
|
|
|
node.child?.forEach(ele => { |
|
|
|
ele.radio=val |
|
|
|
if(ele.children){ |
|
|
|
if(ele.child){ |
|
|
|
onGroupValueChange(ele,val) |
|
|
|
} |
|
|
|
}); |
|
|
|
if(node.parentId){ |
|
|
|
if(node.superior){ |
|
|
|
updateParentNode(node) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
//递归更新父级 |
|
|
|
function updateParentNode(node:Tree){ |
|
|
|
if(node.parentId){ |
|
|
|
if(node.superior){ |
|
|
|
|
|
|
|
const pnode = treeRef.value?.getNode(node.parentId); |
|
|
|
const pnode = treeRef.value?.getNode(node.superior); |
|
|
|
if(pnode){ |
|
|
|
const tdata=pnode.data as Tree |
|
|
|
if (tdata.children?.every(ele=>{ |
|
|
|
if (tdata.child?.every(ele=>{ |
|
|
|
if(ele.indeterminate) return !ele.indeterminate;//注意这里有个取反计算 |
|
|
|
|
|
|
|
if(ele.radio?.length==0) return ele.radio.length==tdata.radio?.length; |
|
|
|
@ -165,10 +167,23 @@ function onShowManagers(){ |
|
|
|
const node = treeRef.value?.getNode(item.replace("p0","")); |
|
|
|
if(node && node.data){ |
|
|
|
node.data.ismanager=true |
|
|
|
setParentIndeterminate(node.data as Tree) |
|
|
|
} |
|
|
|
}) |
|
|
|
} |
|
|
|
|
|
|
|
function setParentIndeterminate(node:Tree){ |
|
|
|
if(node.superior){ |
|
|
|
const pnode = treeRef.value?.getNode(node.superior); |
|
|
|
if(pnode){ |
|
|
|
const tdata=pnode.data as Tree |
|
|
|
tdata.indeterminate=true |
|
|
|
|
|
|
|
setParentIndeterminate(tdata) |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
function refreshSpaceData(){ |
|
|
|
getSpaceMemberList( |
|
|
|
btoa(props.uid), |
|
|
|
@ -183,21 +198,24 @@ function refreshSpaceData(){ |
|
|
|
addNode(item,orgMembers.dataTree) |
|
|
|
}); |
|
|
|
|
|
|
|
if(dataSource.value.length>0){//只添加第一个最顶级部门 |
|
|
|
firstLevelKeys.value.push(dataSource.value[0].id) |
|
|
|
} |
|
|
|
|
|
|
|
resp.data?.members?.forEach(item=>{ |
|
|
|
const mid=item.replace("p0","") |
|
|
|
for(let data of dataSource.value){ |
|
|
|
if(checkNode(mid,data)) return; |
|
|
|
} |
|
|
|
|
|
|
|
dataSource.value.push({id:mid,label:orgMembers.listMap[mid],radio:[2]}) |
|
|
|
dataSource.value.push({id:mid,name:orgMembers.listMap[mid],radio:[]}) |
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
managers.value=resp.data?.managers.split("|") |
|
|
|
spacePermit.value.id=resp.data?.permits.ID |
|
|
|
spacePermit.value.matterUid=resp.data?.permits.MatterUuid |
|
|
|
spacePermit.value.data=resp.data.permits.data!="" ? resp.data.permits.data : "{}" |
|
|
|
|
|
|
|
|
|
|
|
nextTick(() => { |
|
|
|
const permitJson = JSON.parse(spacePermit.value.data) //object |
|
|
|
Object.keys(permitJson).forEach(key=>{ |
|
|
|
@ -217,28 +235,28 @@ function refreshSpaceData(){ |
|
|
|
} |
|
|
|
|
|
|
|
function addNode(key:string,node:Tree){ |
|
|
|
node.children?.forEach(ele => { |
|
|
|
node.child?.forEach(ele => { |
|
|
|
if(ele.id==key){ |
|
|
|
const eleClone=structuredClone(toRaw(ele)) //这里ele是Proxy,无法clone,所以要toRaw拿到原始object |
|
|
|
eleClone.radio=[2] |
|
|
|
eleClone.parentId=ele.parentId |
|
|
|
dataSource.value.push(eleClone) //{id:ele.id,label:ele.label,radio:2,stage:level,children:ele.children} |
|
|
|
//eleClone.radio=[2] |
|
|
|
eleClone.superior=ele.superior |
|
|
|
dataSource.value.push(eleClone) //{id:ele.id,name:ele.name,radio:2,stage:level,children:ele.children} |
|
|
|
return |
|
|
|
} |
|
|
|
if(ele.children){ |
|
|
|
if(ele.child){ |
|
|
|
addNode(key,ele) |
|
|
|
} |
|
|
|
}); |
|
|
|
} |
|
|
|
|
|
|
|
function checkNode(key:string,node:Tree):boolean{ |
|
|
|
for (const child of node.children||[]) { |
|
|
|
if(child.id==key){ |
|
|
|
for (const ch of node.child||[]) { |
|
|
|
if(ch.id==key){ |
|
|
|
return true |
|
|
|
} |
|
|
|
if(child.children){ |
|
|
|
if(ch.child){ |
|
|
|
//这里不能直接return,因为return后,就中断了for循环,但是true的情况下可以直接return |
|
|
|
if(checkNode(key,child)) return true; |
|
|
|
if(checkNode(key,ch)) return true; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
@ -266,11 +284,26 @@ onMounted(()=>{ |
|
|
|
<span>管理员</span> |
|
|
|
</div> |
|
|
|
<div v-else class="buttons"> |
|
|
|
<span>禁止</span> |
|
|
|
<span>仅预览</span> |
|
|
|
<span>可下载</span> |
|
|
|
<span>上传下载</span> |
|
|
|
<span>编辑</span> |
|
|
|
<el-tooltip placement="top" effect="dark" |
|
|
|
content="禁止访问"> |
|
|
|
<span>不可见</span> |
|
|
|
</el-tooltip> |
|
|
|
<el-tooltip placement="top" effect="dark" |
|
|
|
content="仅可预览,不可下载"> |
|
|
|
<span>仅预览</span> |
|
|
|
</el-tooltip> |
|
|
|
<el-tooltip placement="top" effect="dark" |
|
|
|
content="可下载可见文件,不可上传文件"> |
|
|
|
<span>可下载</span> |
|
|
|
</el-tooltip> |
|
|
|
<el-tooltip placement="top" effect="dark" |
|
|
|
content="可上传和下载可见文件"> |
|
|
|
<span>上传下载</span> |
|
|
|
</el-tooltip> |
|
|
|
<el-tooltip placement="top" effect="dark" |
|
|
|
content="可上传、下载、编辑文档"> |
|
|
|
<span>编辑</span> |
|
|
|
</el-tooltip> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
<div class="tablelist"> |
|
|
|
@ -278,15 +311,17 @@ onMounted(()=>{ |
|
|
|
ref="treeRef" |
|
|
|
:data="dataSource" |
|
|
|
node-key="id" |
|
|
|
default-expand-all |
|
|
|
:expand-on-click-node="false" |
|
|
|
accordion |
|
|
|
:props="{label: 'name',children:'child'}" |
|
|
|
:default-expanded-keys="firstLevelKeys" |
|
|
|
:expand-on-click-node="false" |
|
|
|
> |
|
|
|
<template #default="{ node, data }"> |
|
|
|
<div class="tree-node"> |
|
|
|
<span>{{ node.label }}</span> |
|
|
|
<span>{{ data.name }}</span> |
|
|
|
|
|
|
|
<div v-if="managerMode" class="buttons"> |
|
|
|
<el-checkbox v-if="!data.children" v-model="data.ismanager" /> |
|
|
|
<el-checkbox v-model="data.ismanager" :indeterminate="data.indeterminate" /> |
|
|
|
</div> |
|
|
|
<div v-else class="buttons"> |
|
|
|
<el-checkbox-group :min="0" :max="1" v-model="data.radio" @change="(val)=>onGroupValueChange(data,val)"> |
|
|
|
|