AddPersonnelModal.vue 4.0 KB

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