Advice-edit.vue 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. <template>
  2. <el-dialog v-model="state.dialogVisible" width="50%" draggable title="修改常用意见" @close="close">
  3. <el-form :model="state.ruleForm" label-width="90px" ref="ruleFormRef">
  4. <el-row :gutter="10">
  5. <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
  6. <el-form-item label="意见类型" prop="commonType" :rules="[{ required: true, message: '请选择意见类型', trigger: 'change' }]">
  7. <el-select v-model="state.ruleForm.commonType" placeholder="请选择意见类型" clearable class="w100">
  8. <el-option v-for="item in commonType" :value="item.key" :key="item.key" :label="item.value" />
  9. </el-select>
  10. </el-form-item>
  11. </el-col>
  12. <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
  13. <el-form-item label="意见分类" prop="isOpen" :rules="[{ required: true, message: '请选择意见分类', trigger: 'change' }]">
  14. <el-switch v-model="state.ruleForm.isOpen" inline-prompt active-text="公开常用意见" inactive-text="个人常用意见" />
  15. </el-form-item>
  16. </el-col>
  17. <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
  18. <el-form-item label="意见内容" prop="content" :rules="[{ required: true, message: '请填写意见内容', trigger: 'blur' }]">
  19. <el-input
  20. v-model="state.ruleForm.content"
  21. placeholder="请填写意见内容"
  22. :autosize="{ minRows: 6, maxRows: 10 }"
  23. type="textarea"
  24. show-word-limit
  25. maxlength="2000"
  26. ></el-input>
  27. </el-form-item>
  28. </el-col>
  29. </el-row>
  30. </el-form>
  31. <template #footer>
  32. <span class="dialog-footer">
  33. <el-button @click="closeDialog" class="default-button">取 消</el-button>
  34. <el-button type="primary" @click="onSubmit(ruleFormRef)" :loading="loading">确 定</el-button>
  35. </span>
  36. </template>
  37. </el-dialog>
  38. </template>
  39. <script setup lang="ts" name="auxiliaryAdviceEdit">
  40. import { reactive, ref } from 'vue';
  41. import { ElMessage, FormInstance } from 'element-plus';
  42. import { throttle } from '@/utils/tools';
  43. import { commonUpdate } from '@/api/auxiliary/advice';
  44. import other from '@/utils/other';
  45. // 定义子组件向父组件传值/事件
  46. const emit = defineEmits(['updateList']);
  47. const props = defineProps({
  48. commonType: {
  49. type: Array,
  50. default: () => [],
  51. },
  52. });
  53. // 定义变量内容
  54. const state = reactive<any>({
  55. dialogVisible: false,
  56. ruleForm: {
  57. content: '', // 意见内容
  58. CommonType: '', // 意见类型
  59. isOpen: true, // 是否公开意见
  60. },
  61. });
  62. let loading = ref<boolean>(false); // 加载状态
  63. // 打开弹窗
  64. const ruleFormRef = ref<RefType>();
  65. const openDialog = async (row: any) => {
  66. state.dialogVisible = true;
  67. ruleFormRef.value?.resetFields();
  68. try {
  69. state.ruleForm = other.deepClone(row);
  70. } catch (error) {
  71. console.log(error);
  72. }
  73. };
  74. // 关闭弹窗
  75. const closeDialog = () => {
  76. state.dialogVisible = false;
  77. };
  78. const close = () => {
  79. ruleFormRef.value?.resetFields();
  80. ruleFormRef.value?.resetFields();
  81. };
  82. // 新增
  83. const onSubmit = throttle(async (formEl: FormInstance | undefined) => {
  84. if (!formEl) return;
  85. await formEl.validate((valid: boolean) => {
  86. if (!valid) return;
  87. loading.value = true;
  88. commonUpdate(state.ruleForm)
  89. .then(() => {
  90. ElMessage({
  91. message: '操作成功',
  92. type: 'success',
  93. });
  94. loading.value = false;
  95. closeDialog();
  96. emit('updateList');
  97. })
  98. .catch(() => {})
  99. .finally(() => {
  100. loading.value = false;
  101. closeDialog();
  102. });
  103. });
  104. }, 300);
  105. // 暴露变量
  106. defineExpose({
  107. openDialog,
  108. closeDialog,
  109. });
  110. </script>