edit-dialog.vue 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. <script setup lang="ts">
  2. import { FormRules, ElForm } from "element-plus";
  3. import { reactive, ref } from "vue";
  4. import { httpUpdate, httpAdd, httpDetail } from "/@/api/parameter/card";
  5. import { responseHandle } from "/@/utils/responseHandle";
  6. import { useNav } from "/@/layout/hooks/useNav";
  7. enum FROM_TYPE {
  8. create = "create",
  9. edit = "edit",
  10. view = "view"
  11. }
  12. const { logout } = useNav();
  13. const showModel = ref(false);
  14. const TYPE = ref<FROM_TYPE>(FROM_TYPE.create);
  15. const formRef = ref<InstanceType<typeof ElForm>>(null);
  16. const loading = ref(false);
  17. const titleType = ref("");
  18. const id = ref("");
  19. const emit = defineEmits(["reload"]);
  20. const initform = {
  21. title: "",
  22. id: ""
  23. };
  24. const ruleForm = ref({ ...initform });
  25. const rules = reactive<FormRules>({
  26. title: [{ required: true, trigger: "bulr", message: "请输入卡类型" }]
  27. });
  28. const initData = async () => {
  29. const { code, data, message } = await httpDetail({ id: id.value });
  30. responseHandle({
  31. code,
  32. message,
  33. logout,
  34. handler: () => {
  35. console.log(data);
  36. Object.keys(ruleForm.value).forEach(key => {
  37. ruleForm.value[key] = data[key] ? data[key] + "" : "";
  38. });
  39. }
  40. });
  41. };
  42. async function show(node: any, did: string, isCreate: string) {
  43. id.value = did;
  44. Object.keys(ruleForm.value).forEach(key => {
  45. ruleForm.value[key] = initform[key] ? initform[key] + "" : "";
  46. });
  47. TYPE.value = isCreate;
  48. switch (TYPE.value) {
  49. case "create":
  50. titleType.value = "新建卡类型";
  51. break;
  52. case "edit":
  53. titleType.value = "编辑卡类型";
  54. break;
  55. case "view":
  56. titleType.value = "卡类型详情";
  57. break;
  58. default:
  59. titleType.value = "新建卡类型";
  60. }
  61. if (TYPE.value !== "create") {
  62. await initData();
  63. }
  64. showModel.value = true;
  65. }
  66. function handleUpdate() {
  67. const data = {
  68. ...ruleForm.value
  69. };
  70. return {
  71. data,
  72. api: httpUpdate
  73. };
  74. }
  75. function handleCreate() {
  76. const data = {
  77. ...ruleForm.value
  78. };
  79. return {
  80. data,
  81. api: httpAdd
  82. };
  83. }
  84. function handleSave() {
  85. formRef.value.validate(async vaild => {
  86. if (vaild) {
  87. if (loading.value) return;
  88. const handler =
  89. TYPE.value === FROM_TYPE.create ? handleCreate : handleUpdate;
  90. loading.value = true;
  91. const { api, data } = handler();
  92. const { message, code } = await api(data);
  93. loading.value = false;
  94. responseHandle({
  95. code,
  96. message,
  97. logout,
  98. handler: () => {
  99. showModel.value = false;
  100. emit("reload");
  101. }
  102. });
  103. }
  104. });
  105. }
  106. defineExpose({
  107. show
  108. });
  109. </script>
  110. <template>
  111. <el-dialog
  112. v-model="showModel"
  113. :close-on-press-escape="false"
  114. center
  115. append-to-body
  116. destroy-on-close
  117. :width="'400px'"
  118. :title="titleType"
  119. v-loading="loading"
  120. >
  121. <el-form
  122. ref="formRef"
  123. :model="ruleForm"
  124. :rules="rules"
  125. label-width="70px"
  126. style="margin-top: -10px"
  127. class="demo-ruleForm"
  128. status-icon
  129. >
  130. <el-row>
  131. <el-col :span="24">
  132. <el-form-item label="卡类型" prop="title">
  133. <ElInput
  134. placeholder="卡类型"
  135. :disabled="TYPE === 'view'"
  136. maxlength="50"
  137. v-model="ruleForm.title"
  138. /> </el-form-item
  139. ></el-col>
  140. </el-row>
  141. <div class="flex justify-end">
  142. <el-button
  143. v-if="TYPE !== 'view'"
  144. :loading="loading"
  145. :disabled="loading"
  146. type="primary"
  147. @click="handleSave"
  148. >保存</el-button
  149. >
  150. <el-button @click="showModel = false">取消</el-button>
  151. </div>
  152. </el-form>
  153. </el-dialog>
  154. </template>