|
@@ -16,6 +16,7 @@
|
|
|
@search="onSearch"
|
|
@search="onSearch"
|
|
|
/>
|
|
/>
|
|
|
<a-tree
|
|
<a-tree
|
|
|
|
|
+ v-if="treeData.length > 0"
|
|
|
:tree-data="filteredTreeData"
|
|
:tree-data="filteredTreeData"
|
|
|
:field-names="{ key: 'id', title: 'name', children: 'children' }"
|
|
:field-names="{ key: 'id', title: 'name', children: 'children' }"
|
|
|
:checked-keys="checkedKeys"
|
|
:checked-keys="checkedKeys"
|
|
@@ -23,7 +24,6 @@
|
|
|
:auto-expand-parent="autoExpandParent"
|
|
:auto-expand-parent="autoExpandParent"
|
|
|
checkable
|
|
checkable
|
|
|
show-icon
|
|
show-icon
|
|
|
- :selectable="false"
|
|
|
|
|
@check="onCheck"
|
|
@check="onCheck"
|
|
|
@expand="onExpand"
|
|
@expand="onExpand"
|
|
|
>
|
|
>
|
|
@@ -79,7 +79,8 @@
|
|
|
</template>
|
|
</template>
|
|
|
|
|
|
|
|
<script setup>
|
|
<script setup>
|
|
|
- import { ref, reactive, computed, watch } from 'vue'
|
|
|
|
|
|
|
+ import { ref, reactive, computed, onMounted } from 'vue'
|
|
|
|
|
+ import resourceAuditApi from '@/api/resourceAudit.js'
|
|
|
import { Modal, Input, Tree, List, Avatar, Button } from 'ant-design-vue'
|
|
import { Modal, Input, Tree, List, Avatar, Button } from 'ant-design-vue'
|
|
|
const emit = defineEmits(['close', 'confirm'])
|
|
const emit = defineEmits(['close', 'confirm'])
|
|
|
const visible = ref(true)
|
|
const visible = ref(true)
|
|
@@ -125,32 +126,40 @@
|
|
|
const selectedKeys = ref([])
|
|
const selectedKeys = ref([])
|
|
|
const selectedUsers = ref([])
|
|
const selectedUsers = ref([])
|
|
|
const checkedKeys = ref([])
|
|
const checkedKeys = ref([])
|
|
|
- const expandedKeys = ref(['1']) // 默认展开第一层
|
|
|
|
|
|
|
+ const expandedKeys = ref([]) // 默认展开第一层
|
|
|
const autoExpandParent = ref(true)
|
|
const autoExpandParent = ref(true)
|
|
|
const filteredTreeData = computed(() => {
|
|
const filteredTreeData = computed(() => {
|
|
|
const filterFn = (node) => {
|
|
const filterFn = (node) => {
|
|
|
- if (node.name.includes(searchValue.value)) {
|
|
|
|
|
- return true
|
|
|
|
|
- }
|
|
|
|
|
- if (node.children && node.children.some(filterFn)) {
|
|
|
|
|
- return true
|
|
|
|
|
|
|
+ // 保留匹配节点及其所有祖先节点
|
|
|
|
|
+ if (node.name.includes(searchValue.value)) return true
|
|
|
|
|
+ if (node.children) {
|
|
|
|
|
+ const hasMatchingChild = node.children.some(filterFn)
|
|
|
|
|
+ if (hasMatchingChild) return true
|
|
|
}
|
|
}
|
|
|
return false
|
|
return false
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
return treeData.value.filter(filterFn)
|
|
return treeData.value.filter(filterFn)
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
// 替换原来的onSelect方法
|
|
// 替换原来的onSelect方法
|
|
|
const onCheck = (checkedKeysValue, { checked, node, checkedNodes }) => {
|
|
const onCheck = (checkedKeysValue, { checked, node, checkedNodes }) => {
|
|
|
|
|
+ // console.log(checkedKeysValue, checked, node, checkedNodes, 'checkedKeysValue')
|
|
|
checkedKeys.value = checkedKeysValue
|
|
checkedKeys.value = checkedKeysValue
|
|
|
- selectedUsers.value = checkedNodes
|
|
|
|
|
- .filter((node) => node.isLeaf) // 只保留叶子节点
|
|
|
|
|
- .map((node) => ({
|
|
|
|
|
- id: node.id,
|
|
|
|
|
- name: node.name,
|
|
|
|
|
- avatar: node.avatar,
|
|
|
|
|
- department: findDepartmentName(node.id, treeData.value)
|
|
|
|
|
- }))
|
|
|
|
|
|
|
+ // selectedUsers.value = checkedNodes
|
|
|
|
|
+ // .filter((node) => node.isLeaf) // 只保留叶子节点
|
|
|
|
|
+ // .map((node) => ({
|
|
|
|
|
+ // id: node.id,
|
|
|
|
|
+ // name: node.name,
|
|
|
|
|
+ // // avatar: node.avatar,
|
|
|
|
|
+ // department: findDepartmentName(node.id, treeData.value)
|
|
|
|
|
+ // }))
|
|
|
|
|
+ selectedUsers.value = checkedNodes.map((node) => ({
|
|
|
|
|
+ id: node.id,
|
|
|
|
|
+ name: node.name
|
|
|
|
|
+ // avatar: node.avatar,
|
|
|
|
|
+ // department: findDepartmentName(node.id, treeData.value)
|
|
|
|
|
+ }))
|
|
|
}
|
|
}
|
|
|
// 查找部门名称的辅助函数
|
|
// 查找部门名称的辅助函数
|
|
|
const findDepartmentName = (id, nodes) => {
|
|
const findDepartmentName = (id, nodes) => {
|
|
@@ -165,6 +174,7 @@
|
|
|
return ''
|
|
return ''
|
|
|
}
|
|
}
|
|
|
const onExpand = (keys) => {
|
|
const onExpand = (keys) => {
|
|
|
|
|
+ // console.log(keys, 'onExpand')
|
|
|
expandedKeys.value = keys
|
|
expandedKeys.value = keys
|
|
|
autoExpandParent.value = false
|
|
autoExpandParent.value = false
|
|
|
}
|
|
}
|
|
@@ -172,6 +182,31 @@
|
|
|
const onSearch = (value) => {
|
|
const onSearch = (value) => {
|
|
|
searchValue.value = value
|
|
searchValue.value = value
|
|
|
}
|
|
}
|
|
|
|
|
+ const augmentNode = (node) => {
|
|
|
|
|
+ if (node.children) {
|
|
|
|
|
+ node.isLeaf = false // 有children的节点标记为非叶子节点
|
|
|
|
|
+ node.children.forEach((child) => augmentNode(child))
|
|
|
|
|
+ } else {
|
|
|
|
|
+ node.isLeaf = true // 无children的节点标记为叶子节点
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ const getOrgUserTreeRespectively = () => {
|
|
|
|
|
+ resourceAuditApi
|
|
|
|
|
+ .orgUserTreeSelector()
|
|
|
|
|
+ .then((res) => {
|
|
|
|
|
+ if (res?.data) {
|
|
|
|
|
+ console.log(res.data, 'getOrgUserTreeRespectively')
|
|
|
|
|
+ res.data.forEach((root) => augmentNode(root))
|
|
|
|
|
+ // if (treeData.value.length > 0 && treeData.value[0]?.id) {
|
|
|
|
|
+ // expandedKeys.value = [treeData.value[0].id]
|
|
|
|
|
+ // }
|
|
|
|
|
+ treeData.value = res.data
|
|
|
|
|
+ }
|
|
|
|
|
+ })
|
|
|
|
|
+ .catch((err) => {
|
|
|
|
|
+ console.log(err)
|
|
|
|
|
+ })
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
const clearSelection = () => {
|
|
const clearSelection = () => {
|
|
|
selectedKeys.value = []
|
|
selectedKeys.value = []
|
|
@@ -195,12 +230,16 @@
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
const handleOk = () => {
|
|
const handleOk = () => {
|
|
|
- console.log('Selected Users:', selectedUsers.value)
|
|
|
|
|
|
|
+ console.log('Selected Users:', selectedUsers.value, checkedKeys.value)
|
|
|
|
|
+ emit('confirm', checkedKeys.value)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
const handleCancel = () => {
|
|
const handleCancel = () => {
|
|
|
emit('close')
|
|
emit('close')
|
|
|
}
|
|
}
|
|
|
|
|
+ onMounted(() => {
|
|
|
|
|
+ getOrgUserTreeRespectively()
|
|
|
|
|
+ })
|
|
|
</script>
|
|
</script>
|
|
|
|
|
|
|
|
<style scoped>
|
|
<style scoped>
|