ModifyRejectType.vue 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. <template>
  2. <el-dialog
  3. v-model="visible"
  4. :title="title"
  5. width="500px"
  6. :close-on-click-modal="false"
  7. :close-on-press-escape="false"
  8. top="10vh"
  9. append-to-body
  10. @close="handleClose"
  11. @open="modalBeforeOpen"
  12. >
  13. <el-form
  14. ref="formRef"
  15. :model="formModel"
  16. :rules="rules"
  17. label-width="100px"
  18. >
  19. <el-form-item label="分类名称" prop="name">
  20. <el-input
  21. v-model="formModel.name"
  22. placeholder="请输入分类名称"
  23. maxlength="50"
  24. />
  25. </el-form-item>
  26. </el-form>
  27. <template #footer>
  28. <el-button @click="close">取消</el-button>
  29. <el-button type="primary" :loading="loading" @click="confirm">
  30. 保存
  31. </el-button>
  32. </template>
  33. </el-dialog>
  34. </template>
  35. <script setup lang="ts">
  36. import { ref, reactive, computed } from 'vue';
  37. import type { FormInstance, FormRules } from 'element-plus';
  38. import { ElMessage } from 'element-plus';
  39. import type {
  40. RejectTypeItem,
  41. RejectTypeUpdateParam,
  42. } from '@/api/types/reject';
  43. import useModal from '@/hooks/modal';
  44. import useLoading from '@/hooks/loading';
  45. import { objAssign, objModifyAssign } from '@/utils/utils';
  46. import { updateRejectType } from '@/api/reject';
  47. defineOptions({
  48. name: 'ModifyRejectType',
  49. });
  50. /* modal */
  51. const { visible, open, close } = useModal();
  52. defineExpose({ open, close });
  53. interface Props {
  54. rowData: RejectTypeItem;
  55. examId: number;
  56. }
  57. const props = withDefaults(defineProps<Props>(), {
  58. rowData: {} as RejectTypeItem,
  59. examId: 0,
  60. });
  61. const emit = defineEmits(['modified']);
  62. const isEdit = computed(() => !!props.rowData?.id);
  63. const title = computed(() => `${isEdit.value ? '编辑' : '新增'}打回卷分类`);
  64. const formRef = ref<FormInstance>();
  65. const initialFormState: Partial<RejectTypeUpdateParam> = {
  66. name: '',
  67. };
  68. const formModel = reactive({ ...initialFormState });
  69. const rules: FormRules<keyof RejectTypeUpdateParam> = {
  70. name: [{ required: true, message: '请输入分类名称', trigger: 'blur' }],
  71. };
  72. const handleClose = () => {
  73. formRef.value?.resetFields();
  74. };
  75. /* confirm */
  76. const { loading, setLoading } = useLoading();
  77. async function confirm() {
  78. const valid = await formRef.value?.validate().catch(() => false);
  79. if (!valid) return;
  80. setLoading(true);
  81. try {
  82. const data = objAssign(formModel, {}) as RejectTypeUpdateParam;
  83. data.examId = props.examId;
  84. if (isEdit.value) {
  85. data.id = props.rowData.id;
  86. }
  87. await updateRejectType(data);
  88. ElMessage.success(`${isEdit.value ? '编辑' : '新增'}成功!`);
  89. emit('modified', data);
  90. close();
  91. } catch (error) {
  92. console.error('保存失败:', error);
  93. ElMessage.error('保存失败');
  94. } finally {
  95. setLoading(false);
  96. }
  97. }
  98. /* init modal */
  99. function modalBeforeOpen() {
  100. if (props.rowData.id) {
  101. // 编辑模式,映射字段
  102. objModifyAssign(formModel, props.rowData);
  103. } else {
  104. objModifyAssign(formModel, initialFormState);
  105. }
  106. }
  107. </script>