edit-dialog.vue 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. <script setup lang="ts">
  2. import { FormRules, ElForm } from "element-plus";
  3. import { computed, reactive, ref } from "vue";
  4. import btnList from "/@/utils/btnList";
  5. import { httpUpdate, httpAdd } from "/@/api/system/buttonOperator";
  6. import { useNav } from "/@/layout/hooks/nav";
  7. import { IMenuTree } from "../types";
  8. import { responseHandle } from "/@/utils/responseHandle";
  9. enum FROM_TYPE {
  10. create = "create",
  11. edit = "edit"
  12. }
  13. const showModel = ref(false);
  14. const currentMenuId = ref("");
  15. const TYPE = ref<FROM_TYPE>(FROM_TYPE.create);
  16. const formRef = ref<InstanceType<typeof ElForm>>(null);
  17. const currentNode = ref<IMenuTree | null>(null);
  18. const loading = ref(false);
  19. const { logout } = useNav();
  20. const emit = defineEmits(["reload"]);
  21. const formModel = ref({
  22. action_code: "",
  23. status: ""
  24. });
  25. const action_name = computed(() => {
  26. return btnList.filter(b => b.code === formModel.value.action_code)[0].name;
  27. });
  28. const rules = reactive<FormRules>({
  29. action_code: [{ required: true, message: "请选择按钮名称", trigger: "blur" }],
  30. status: [{ required: true, message: "请选择按钮状态", trigger: "blur" }]
  31. });
  32. function show(node: any, isCreate = false) {
  33. showModel.value = true;
  34. currentNode.value = node;
  35. Object.keys(formModel.value).forEach(key => {
  36. formModel.value[key] = isCreate ? "" : node[key];
  37. });
  38. TYPE.value = isCreate ? FROM_TYPE.create : FROM_TYPE.edit;
  39. }
  40. function handleUpdate() {
  41. const data = {
  42. menuid: currentMenuId.value,
  43. id: currentNode.value.id,
  44. action_name: action_name.value,
  45. ...formModel.value
  46. };
  47. return {
  48. data,
  49. api: httpUpdate
  50. };
  51. }
  52. function handleCreate() {
  53. const data = {
  54. menuid: currentMenuId.value,
  55. action_name: action_name.value,
  56. ...formModel.value
  57. };
  58. return {
  59. data,
  60. api: httpAdd
  61. };
  62. }
  63. function handleSave() {
  64. formRef.value.validate(async vaild => {
  65. if (vaild) {
  66. const handler =
  67. TYPE.value === FROM_TYPE.create ? handleCreate : handleUpdate;
  68. loading.value = true;
  69. const { api, data } = handler();
  70. const { message, code } = await api(data);
  71. responseHandle({
  72. code,
  73. message,
  74. logout,
  75. handler: () => {
  76. emit("reload");
  77. }
  78. });
  79. showModel.value = false;
  80. loading.value = false;
  81. }
  82. });
  83. }
  84. defineExpose({
  85. show,
  86. changeCurrentMenuId: (id: string) => (currentMenuId.value = id)
  87. });
  88. </script>
  89. <template>
  90. <div>
  91. <el-dialog v-model="showModel">
  92. <el-form :model="formModel" :rules="rules" ref="formRef">
  93. <el-form-item label="按钮标识" prop="action_code">
  94. <el-select v-model="formModel.action_code">
  95. <el-option
  96. v-for="(btn, index) in btnList"
  97. :label="btn.name"
  98. :value="btn.code"
  99. :key="index"
  100. />
  101. </el-select>
  102. </el-form-item>
  103. <el-form-item label="按钮状态" prop="status">
  104. <el-radio-group v-model="formModel.status">
  105. <el-radio label="1">启用</el-radio>
  106. <el-radio label="0">禁用</el-radio>
  107. </el-radio-group>
  108. </el-form-item>
  109. <div class="flex justify-end">
  110. <el-button :loading="loading" type="primary" @click="handleSave"
  111. >保存</el-button
  112. >
  113. <el-button @click="showModel = false">取消</el-button>
  114. </div>
  115. </el-form>
  116. </el-dialog>
  117. </div>
  118. </template>