AddPersonnelModal.vue 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. <template>
  2. <el-dialog v-model="data.addPersonnelDialogVisible" :title="'添加人员'" :show-close="false" width="600" :before-close="handleClose">
  3. <template #header="{ close, titleId, titleClass }">
  4. <div class="flex justify-between items-center border-b pb-3 dialog-header">
  5. <h4 :id="titleId">添加/编辑人员</h4>
  6. <div class="flex">
  7. <el-button @click="handleClose">取消</el-button>
  8. <el-button type="primary" @click="addPersonel(personnelRuleFormRef)">
  9. 确定
  10. </el-button>
  11. </div>
  12. </div>
  13. </template>
  14. <div class="pt-5">
  15. <el-form ref="personnelRuleFormRef" style="max-width: 500px" :model="personnelFrom" :rules="personnelRules"
  16. label-width="120px" size="large" status-icon>
  17. <el-form-item label="姓名" prop="name">
  18. <el-input v-model="personnelFrom.name" placeholder="请输入姓名" clearable />
  19. </el-form-item>
  20. <el-form-item label="电话">
  21. <el-input v-model="personnelFrom.phone" placeholder="请输入电话" clearable />
  22. </el-form-item>
  23. <el-form-item label="工号">
  24. <el-input v-model="personnelFrom.jobNumber" placeholder="请输入工号" clearable />
  25. </el-form-item>
  26. <el-form-item label="部门">
  27. <el-cascader v-model="personnelFrom.departmentId" :options="data.deptList" placeholder="请选择部门" :props="{ checkStrictly: true }" clearable style="width: 100%" />
  28. </el-form-item>
  29. <el-form-item label="角色">
  30. <el-select v-model="personnelFrom.roleId" placeholder="请选择角色" size="large">
  31. <el-option v-for="item in data.roleList" :key="item.id" :label="item.rolename" :value="item.id" />
  32. </el-select>
  33. </el-form-item>
  34. <el-form-item label="入职时间">
  35. <el-date-picker v-model="personnelFrom.inductionDate" type="date" placeholder="选择入职时间" value-format="YYYY-MM-DD" style="width: 100%" />
  36. </el-form-item>
  37. </el-form>
  38. </div>
  39. </el-dialog>
  40. </template>
  41. <script setup lang="ts">
  42. import { ref, watch, reactive } from 'vue'
  43. import { FormRules, FormInstance } from 'element-plus'
  44. import { getFromValue, resetFromValue } from '@/utils/tools'
  45. const emit = defineEmits(['closeModal', 'personnelModalConfirm']);
  46. // 定义类型
  47. interface Props {
  48. data: {
  49. addPersonnelDialogVisible: boolean,
  50. deptList: any,
  51. roleList: any,
  52. personnelFromData: any
  53. };
  54. }
  55. interface personnelFromType { // 类型定义
  56. id: string | number,
  57. name: string,
  58. phone: string | number,
  59. jobNumber: string,
  60. roleId: string | number,
  61. departmentId: string[] | number[],
  62. inductionDate: string,
  63. }
  64. const data = ref<Props['data']>({
  65. addPersonnelDialogVisible: false,
  66. deptList: [],
  67. roleList: [],
  68. personnelFromData: {}
  69. })
  70. const personnelRuleFormRef = ref<FormInstance>() // 表单实例
  71. const personnelFrom = ref<personnelFromType>({ // 填写的内容
  72. id: '',
  73. name: '',
  74. phone: '',
  75. jobNumber: '',
  76. roleId: '',
  77. departmentId: [],
  78. inductionDate: '',
  79. });
  80. // 接收参数
  81. const props = defineProps<Props>();
  82. // 定义校验规则
  83. const personnelRules = reactive<FormRules<typeof personnelFrom>>({ // 部门表单校验规则
  84. name: [{ required: true, trigger: 'blur', message: '请输入姓名' }]
  85. })
  86. // 定义方法
  87. function addPersonel(formEl: FormInstance | undefined) {
  88. if (!formEl) return
  89. let dataForm = getFromValue(personnelFrom.value)
  90. const { departmentId } = dataForm
  91. emit('personnelModalConfirm', { ...dataForm, departmentId: departmentId && departmentId[departmentId.length - 1] }, 'addPersonnelDialogVisible')
  92. }
  93. // 监听 Props 的变化
  94. watch(() => props.data, (newValue) => {
  95. data.value = newValue
  96. personnelFrom.value = newValue.personnelFromData
  97. });
  98. const handleClose = () => {
  99. emit('closeModal', 'addPersonnelDialogVisible')
  100. }
  101. </script>
  102. <style scoped lang="scss"></style>