<!-- 用户列表弹窗 -->
<script lang="ts" setup name="selectPerson">
import { ElMessage } from 'element-plus'
import { getUserList } from '@/api/system/user'
import { getDeptTreeList } from '@/api/system/dept'
// import type { TreeStructure } from '@/views/system/user/user-interface'
import comTreeSelect from '@/views/system/user/selecTree.vue'
import { toTreeList } from '@/utils/structure'
import type { TableColumn } from '@/components/NormalTable/table_interface'
const props = defineProps({
needAdmin: { // 是否展示admin用户
type: Boolean,
default: true,
},
})
const emits = defineEmits(['add'])
const dialogFormVisible = ref(false)
// 查询条件
const listQuery = ref({
keywords: '', // 姓名
deptId: '', // 所在部门
limit: 5,
offset: 1,
})
const loadingTable = ref<boolean>(true)
const list = ref([]) // 表格数据
const total = ref(0)
// 表头
const columns = ref<TableColumn[]>([
{ text: '姓名', value: 'name', align: 'center' },
{ text: '账户', value: 'account', align: 'center' },
{ text: '所在部门', value: 'deptName', align: 'center' },
])
// 所在部门
const deptProps = reactive({
parent: 'pid', value: 'id', label: 'name', children: 'children',
})
// 获取部门
const deptIdList = ref([])
const getDeptList = () => {
getDeptTreeList().then((res) => {
deptIdList.value = toTreeList(res.data, '0', true)
})
}
// 获取人员数据列表
const fetchData = () => {
loadingTable.value = true
getUserList(listQuery.value).then((res) => {
if (res.code === 200) {
if (props.needAdmin) {
list.value = res.data.rows
total.value = res.data.total
}
else {
// 展示超级管理员、但禁止选择
list.value = res.data.rows.map((item: { isRadioDisabled: boolean; account: string }) => {
if (item.account === 'admin') {
item.isRadioDisabled = true
}
return item
})
total.value = res.data.total
}
loadingTable.value = false
}
})
}
// 搜索
const search = () => {
fetchData()
}
const selectTreeRef = ref()
// 重置
const reset = () => {
listQuery.value = {
keywords: '', // 姓名
deptId: '', // 所在部门
limit: 5,
offset: 1,
}
selectTreeRef.value.clearSelected()
search()
}
// 多选发生改变时
const checkoutList = ref([])
function handleSelectionChange(e: any) {
checkoutList.value = e
}
// 页数发生变化后的操作,可能是页码变化,可能是每页容量变化,此函数必写
const changePage = (val: { size?: number;page?: number }) => {
if (val && val.size) {
listQuery.value.limit = val.size
}
if (val && val.page) {
listQuery.value.offset = val.page
}
search()
}
// 点击保存
const submitForm = () => {
if (checkoutList.value.length >= 0) {
emits('add', checkoutList.value)
dialogFormVisible.value = false
checkoutList.value = []
// reset()
}
else {
ElMessage.warning('请先选择人员')
}
}
// 取消
const resetForm = () => {
dialogFormVisible.value = false
// reset()
}
// 初始化
const initDialog = () => {
// checkoutList.value = []
// reset()
dialogFormVisible.value = true
}
getDeptList() // 获取部门信息
fetchData() // 获取人员列表
defineExpose({ initDialog })
</script>
<template>
<el-dialog v-model="dialogFormVisible" title="选择人员" width="65%">
<!-- 筛选条件 -->
<search-area :need-clear="true" @search="search" @clear="reset">
<search-item>
<el-input v-model.trim="listQuery.keywords" placeholder="真实姓名" clearable />
</search-item>
<search-item>
<!-- <el-select v-model="listQuery.deptId" placeholder="所在部门" clearable>
<el-option v-for="item in deptIdList" :key="item.id" :label="item.name" :value="item.id" />
</el-select> -->
<com-tree-select
ref="selectTreeRef" v-model="listQuery.deptId" :options="deptIdList"
placeholder="所在部门" :tree-props="deptProps"
/>
</search-item>
</search-area>
<!-- 查询结果Table显示 -->
<div style="padding: 12px;">
<normal-table
:data="list" :total="total" :columns="columns" :query="listQuery"
:list-loading="loadingTable" :is-showmulti-select="true" :is-multi="true" @change="changePage"
@multi-select="handleSelectionChange"
>
<template #preColumns>
<el-table-column label="#" width="55" align="center">
<template #default="scope">
{{ (listQuery.offset - 1) * listQuery.limit + scope.$index + 1 }}
</template>
</el-table-column>
</template>
</normal-table>
</div>
<template #footer>
<span class="dialog-footer">
<el-button type="primary" @click="submitForm">确认</el-button>
<el-button @click="resetForm">
取消
</el-button>
</span>
</template>
</el-dialog>
</template>
<style lang="scss" scoped>
:deep(.el-radio__label) {
display: none;
}
</style>