deptDialog.vue 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. <script lang="ts" setup>/**
  2. * @Name: deptDialog.vue
  3. * @Description: 部门权限管理-弹窗
  4. * @Author: xinyan
  5. */
  6. import { ref } from 'vue';
  7. import { ElMessage, FormInstance, FormRules } from 'element-plus';
  8. import { Close, Finished } from '@element-plus/icons-vue';
  9. import { createRole, getDeptUser, getRoleList } from '../api';
  10. const props = defineProps({
  11. deptId: Object,
  12. // deptInfo: Object
  13. });
  14. const { deptId } = props;
  15. const createOpen = defineModel({ default: false });
  16. const deptInfo = ref({});
  17. const usersOptions = ref([]);
  18. interface RuleForm {
  19. dept_role: string[]; // 确保这里的类型匹配
  20. }
  21. const ruleFormRef = ref<FormInstance>();
  22. const ruleForm = reactive<RuleForm>({
  23. // name: '',
  24. dept_role: [],
  25. });
  26. const rules = reactive<FormRules<RuleForm>>({
  27. dept_role: [
  28. { required: true, message: '请选择部门角色', trigger: 'change' }
  29. ]
  30. });
  31. async function getList() {
  32. const res = await getDeptUser({ id: deptId });
  33. deptInfo.value = res.data;
  34. if (deptInfo.value.length > 0) {
  35. ruleForm.dept_role = deptInfo.value[0].dept_role || []; // 赋值
  36. }
  37. }
  38. async function fetchRoleList() {
  39. try {
  40. const resp = await getRoleList({ id: deptId });
  41. usersOptions.value = resp.data.map((item: any) => {
  42. return { value: item.id, label: item.name };
  43. });
  44. } catch (error) {
  45. console.log(error);
  46. }
  47. }
  48. const submitForm = async (formEl: FormInstance | undefined) => {
  49. if (!formEl) return;
  50. await formEl.validate(async (valid, fields) => {
  51. if (valid) {
  52. const body = {
  53. deptId: deptId,
  54. roleIdList: ruleForm.dept_role,
  55. };
  56. const res = await createRole(body);
  57. if (res.code === 2000) {
  58. ElMessage.success('更新成功');
  59. createOpen.value = false;
  60. }
  61. } else {
  62. // createOpen.value = false;
  63. ElMessage.error('创建失败,请检查表单');
  64. }
  65. });
  66. };
  67. function cancelDialog() {
  68. createOpen.value = false;
  69. }
  70. onMounted(() => {
  71. getList();
  72. fetchRoleList();
  73. });
  74. </script>
  75. <template>
  76. <el-dialog ref="createDialog" v-model="createOpen" :close-on-click-modal="false" :close-on-press-escape="false"
  77. :title="`部门权限`" style="width: 30%">
  78. <el-form ref="ruleFormRef" :model="ruleForm" :rules="rules" class="mx-2.5 mt-5" label-width="auto" status-icon>
  79. <el-form-item class="font-medium" label="部门名称:" prop="name">
  80. <span>{{ deptInfo[0]?.name || '' }}</span>
  81. </el-form-item>
  82. <el-form-item class="font-medium" label="部门角色:" prop="dept_role">
  83. <el-select v-model="ruleForm.dept_role" clearable multiple>
  84. <el-option
  85. v-for="item in usersOptions"
  86. :key="item.value"
  87. :label="item.label"
  88. :value="item.value"
  89. />
  90. </el-select>
  91. </el-form-item>
  92. </el-form>
  93. <template #footer>
  94. <el-button :icon="Close" @click="cancelDialog">取 消</el-button>
  95. <el-button :icon="Finished" :loading="loading" type="primary" @click="submitForm(ruleFormRef)">确 定</el-button>
  96. </template>
  97. </el-dialog>
  98. </template>
  99. <style scoped>
  100. </style>