CreateDrawer.vue 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. <template>
  2. <el-drawer v-model="isDrawer" :size="width" :title="title" @close="handleReset">
  3. <el-form
  4. :model="formParams"
  5. :rules="rules"
  6. ref="formRef"
  7. label-placement="left"
  8. :label-width="80"
  9. >
  10. <el-form-item label="部门名称" prop="deptName">
  11. <el-input placeholder="请输入部门名称" v-model="formParams.deptName" />
  12. </el-form-item>
  13. <el-form-item label="上级部门" prop="parentId">
  14. <el-tree-select
  15. :data="getTreeList"
  16. clearable
  17. check-strictly
  18. v-model="formParams.parentId"
  19. placeholder="请选择上级部门"
  20. />
  21. </el-form-item>
  22. <el-form-item label="排序" prop="orderNum">
  23. <el-input-number placeholder="请输入排序" v-model="formParams.orderNum" />
  24. </el-form-item>
  25. <el-form-item label="状态" prop="isDisabled">
  26. <el-switch v-model="formParams.isDisabled" :active-value="1" :inactive-value="0" />
  27. </el-form-item>
  28. </el-form>
  29. <template #footer>
  30. <el-space>
  31. <el-button @click="handleReset">重置</el-button>
  32. <el-button type="primary" :loading="subLoading" @click="formSubmit">提交</el-button>
  33. </el-space>
  34. </template>
  35. </el-drawer>
  36. </template>
  37. <script lang="ts" setup>
  38. import { ref, computed, watch } from 'vue';
  39. import { ElMessage } from 'element-plus';
  40. import type { editDeptProps } from '@/types/dept/type';
  41. import { deptInfo, updateDepartments, saveDept } from '@/api/auth/dept';
  42. import { replaceParams } from '@/utils/helper/treeHelper';
  43. import { IS_DISABLED } from '@/types/common/constants';
  44. import { DeptTreeItem } from '@/types/dept/type';
  45. interface Props {
  46. title: string;
  47. width: number;
  48. deptList: Array<DeptTreeItem>;
  49. dataSource: DeptTreeItem;
  50. }
  51. const emit = defineEmits(['change']);
  52. const props = withDefaults(defineProps<Props>(), {
  53. title: '添加部门',
  54. width: 450,
  55. });
  56. const rules = {
  57. deptName: {
  58. required: true,
  59. message: '部门名称不能为空',
  60. trigger: 'blur',
  61. },
  62. };
  63. const defaultValueRef = () => ({
  64. id: null,
  65. parentId: null,
  66. isDisabled: 1,
  67. deptName: '',
  68. orderNum: undefined,
  69. });
  70. const message = ElMessage;
  71. const formRef: any = ref(null);
  72. const isDrawer = ref(false);
  73. const subLoading = ref(false);
  74. const getTreeList = computed(() => {
  75. return [
  76. {
  77. label: '顶级部门',
  78. value: 0,
  79. children: replaceParams(props.deptList || [], 'deptName', 'id'),
  80. },
  81. ];
  82. });
  83. const formParams = ref<editDeptProps>(defaultValueRef());
  84. function openDrawer(id?) {
  85. if (id) {
  86. formParams.value.id = id;
  87. getInfo();
  88. return;
  89. }
  90. isDrawer.value = true;
  91. }
  92. function closeDrawer() {
  93. isDrawer.value = false;
  94. }
  95. function formSubmit() {
  96. formRef.value.validate((valid) => {
  97. if (!valid) {
  98. return message.error('请填写完整信息');
  99. }
  100. const msg = formParams.value.id ? '编辑成功' : '添加成功';
  101. const params = { ...formParams.value };
  102. params.isDisabled = formParams.value.isDisabled ? IS_DISABLED.YES : IS_DISABLED.NO;
  103. if (formParams.value.id) {
  104. updateDepartments(params).then(() => {
  105. message.success(msg);
  106. emit('change');
  107. handleReset();
  108. closeDrawer();
  109. });
  110. } else {
  111. delete params.id;
  112. saveDept(params).then(() => {
  113. message.success(msg);
  114. emit('change');
  115. handleReset();
  116. closeDrawer();
  117. });
  118. }
  119. });
  120. }
  121. function handleReset() {
  122. formRef.value.resetFields();
  123. formParams.value = Object.assign(formParams.value, defaultValueRef());
  124. }
  125. function getInfo() {
  126. deptInfo({ id: formParams.value.id }).then((res) => {
  127. const params = {
  128. id: res.id,
  129. parentId: res.parentId,
  130. isDisabled: res.isDisabled,
  131. deptName: res.deptName,
  132. orderNum: res.orderNum,
  133. };
  134. formParams.value = Object.assign(formParams.value, params);
  135. isDrawer.value = true;
  136. });
  137. }
  138. watch(
  139. () => props.dataSource,
  140. (value) => {
  141. if (value) {
  142. Object.entries(value).forEach(([key, value]) => {
  143. if (['id', 'parentId', 'deptName', 'orderNum', 'isDisabled'].includes(key)) {
  144. formParams.value[key] = value;
  145. }
  146. });
  147. }
  148. },
  149. {
  150. immediate: true,
  151. },
  152. );
  153. defineExpose({
  154. openDrawer,
  155. closeDrawer,
  156. });
  157. </script>