From a63543a5c793c8954fa2f9da0ee4fb215c62d8c2 Mon Sep 17 00:00:00 2001 From: 疯狂的狮子Li <15040126243@163.com> Date: 星期一, 20 五月 2024 10:26:46 +0800 Subject: [PATCH] !118 ♥️发布 5.2.0-BETA 公测版本 Merge pull request !118 from 疯狂的狮子Li/dev --- src/components/RoleSelect/index.vue | 250 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 250 insertions(+), 0 deletions(-) diff --git a/src/components/RoleSelect/index.vue b/src/components/RoleSelect/index.vue new file mode 100644 index 0000000..6ba2076 --- /dev/null +++ b/src/components/RoleSelect/index.vue @@ -0,0 +1,250 @@ +<template> + <div> + <el-dialog v-model="roleDialog.visible.value" :title="roleDialog.title.value" width="80%" append-to-body> + <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave"> + <div v-show="showSearch" class="mb-[10px]"> + <el-card shadow="hover"> + <el-form ref="queryFormRef" :model="queryParams" :inline="true"> + <el-form-item label="瑙掕壊鍚嶇О" prop="roleName"> + <el-input v-model="queryParams.roleName" placeholder="璇疯緭鍏ヨ鑹插悕绉�" clearable @keyup.enter="handleQuery" /> + </el-form-item> + <el-form-item label="鏉冮檺瀛楃" prop="roleKey"> + <el-input v-model="queryParams.roleKey" placeholder="璇疯緭鍏ユ潈闄愬瓧绗�" clearable @keyup.enter="handleQuery" /> + </el-form-item> + + <el-form-item> + <el-button type="primary" icon="Search" @click="handleQuery">鎼滅储</el-button> + <el-button icon="Refresh" @click="resetQuery">閲嶇疆</el-button> + </el-form-item> + </el-form> + </el-card> + </div> + </transition> + + <el-card shadow="hover"> + <template #header> + <el-tag v-for="role in selectRoleList" :key="role.roleId" closable style="margin: 2px" @close="handleCloseTag(role)"> + {{ role.roleName }} + </el-tag> + </template> + + <vxe-table + ref="tableRef" + height="400px" + border + show-overflow + :data="roleList" + :loading="loading" + :row-config="{ keyField: 'roleId' }" + :checkbox-config="{ reserve: true, checkRowKeys: defaultSelectRoleIds }" + highlight-current-row + @checkbox-all="handleCheckboxAll" + @checkbox-change="handleCheckboxChange" + > + <vxe-column type="checkbox" width="50" align="center" /> + <vxe-column v-if="false" key="roleId" label="瑙掕壊缂栧彿" /> + <vxe-column field="roleName" title="瑙掕壊鍚嶇О" /> + <vxe-column field="roleKey" title="鏉冮檺瀛楃" /> + <vxe-column field="roleSort" title="鏄剧ず椤哄簭" width="100" /> + <vxe-column title="鐘舵��" align="center" width="100"> + <template #default="scope"> + <dict-tag :options="sys_normal_disable" :value="scope.row.status"></dict-tag> + </template> + </vxe-column> + <vxe-column field="createTime" title="鍒涘缓鏃堕棿" align="center"> + <template #default="scope"> + <span>{{ parseTime(scope.row.createTime) }}</span> + </template> + </vxe-column> + </vxe-table> + + <pagination + v-if="total > 0" + v-model:total="total" + v-model:page="queryParams.pageNum" + v-model:limit="queryParams.pageSize" + @pagination="pageList" + /> + </el-card> + <template #footer> + <el-button @click="close">鍙栨秷</el-button> + <el-button type="primary" @click="confirm">纭畾</el-button> + </template> + </el-dialog> + </div> +</template> + +<script setup lang="ts"> +import { RoleVO, RoleQuery } from '@/api/system/role/types'; +import { VxeTableInstance } from 'vxe-table'; +import useDialog from '@/hooks/useDialog'; +import api from '@/api/system/role'; +interface PropType { + modelValue?: RoleVO[] | RoleVO | undefined; + multiple?: boolean; + data?: string | number | (string | number)[]; +} +const prop = withDefaults(defineProps<PropType>(), { + multiple: true, + modelValue: undefined, + data: undefined +}); +const emit = defineEmits(['update:modelValue', 'confirmCallBack']); + +const router = useRouter(); +const { proxy } = getCurrentInstance() as ComponentInternalInstance; +const { sys_normal_disable } = toRefs<any>(proxy?.useDict('sys_normal_disable')); + +const roleList = ref<RoleVO[]>(); +const loading = ref(true); +const showSearch = ref(true); +const total = ref(0); +const dateRange = ref<[DateModelType, DateModelType]>(['', '']); +const selectRoleList = ref<RoleVO[]>([]); + +const roleDialog = useDialog({ + title: '瑙掕壊閫夋嫨' +}); + +const queryFormRef = ref<ElFormInstance>(); +const tableRef = ref<VxeTableInstance<RoleVO>>(); + +const queryParams = ref<RoleQuery>({ + pageNum: 1, + pageSize: 10, + roleName: '', + roleKey: '', + status: '' +}); + +const defaultSelectRoleIds = computed(() => computedIds(prop.data)); + +const confirm = () => { + emit('update:modelValue', selectRoleList.value); + emit('confirmCallBack', selectRoleList.value); + roleDialog.closeDialog(); +}; + +const computedIds = (data) => { + if (data instanceof Array) { + return [...data]; + } else if (typeof data === 'string') { + return data.split(','); + } else if (typeof data === 'number') { + return [data]; + } else { + console.warn('<RoleSelect> The data type of data should be array or string or number, but I received other'); + return []; + } +}; + +/** + * 鏌ヨ瑙掕壊鍒楄〃 + */ +const getList = () => { + loading.value = true; + api.listRole(proxy?.addDateRange(queryParams.value, dateRange.value)).then((res) => { + roleList.value = res.rows; + total.value = res.total; + loading.value = false; + }); +}; +const pageList = async () => { + await getList(); + const roles = roleList.value.filter((item) => { + return selectRoleList.value.some((role) => role.roleId === item.roleId); + }); + await tableRef.value.setCheckboxRow(roles, true); +}; +/** + * 鎼滅储鎸夐挳鎿嶄綔 + */ +const handleQuery = () => { + queryParams.value.pageNum = 1; + getList(); +}; + +/** 閲嶇疆 */ +const resetQuery = () => { + dateRange.value = ['', '']; + queryFormRef.value?.resetFields(); + handleQuery(); +}; + +const handleCheckboxChange = (checked) => { + if (!prop.multiple && checked.checked) { + tableRef.value.setCheckboxRow(selectRoleList.value, false); + selectRoleList.value = []; + } + const row = checked.row; + if (checked.checked) { + selectRoleList.value.push(row); + } else { + selectRoleList.value = selectRoleList.value.filter((item) => { + return item.roleId !== row.roleId; + }); + } +}; +const handleCheckboxAll = (checked) => { + const rows = roleList.value; + if (checked.checked) { + rows.forEach((row) => { + if (!selectRoleList.value.some((item) => item.roleId === row.roleId)) { + selectRoleList.value.push(row); + } + }); + } else { + selectRoleList.value = selectRoleList.value.filter((item) => { + return !rows.some((row) => row.roleId === item.roleId); + }); + } +}; + +const handleCloseTag = (user: RoleVO) => { + const roleId = user.roleId; + // 浣跨敤split鍒犻櫎鐢ㄦ埛 + const index = selectRoleList.value.findIndex((item) => item.roleId === roleId); + const rows = selectRoleList.value[index]; + tableRef.value?.setCheckboxRow(rows, false); + selectRoleList.value.splice(index, 1); +}; +/** + * 鍒濆鍖栭�変腑鏁版嵁 + */ +const initSelectRole = async () => { + if (defaultSelectRoleIds.value.length > 0) { + const { data } = await api.optionSelect(defaultSelectRoleIds.value); + selectRoleList.value = data; + const users = roleList.value.filter((item) => { + return defaultSelectRoleIds.value.includes(String(item.roleId)); + }); + await nextTick(() => { + tableRef.value.setCheckboxRow(users, true); + }); + } +}; +const close = () => { + roleDialog.closeDialog(); +}; +watch( + () => roleDialog.visible.value, + (newValue: boolean) => { + if (newValue) { + initSelectRole(); + } else { + tableRef.value.clearCheckboxReserve(); + tableRef.value.clearCheckboxRow(); + resetQuery(); + selectRoleList.value = []; + } + } +); +onMounted(() => { + getList(); // 鍒濆鍖栧垪琛ㄦ暟鎹� +}); + +defineExpose({ + open: roleDialog.openDialog, + close: roleDialog.closeDialog +}); +</script> -- Gitblit v1.9.3