AddPersonnelModal.vue 5.0 KB

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