MenuDrawer.vue 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. <template>
  2. <BasicDrawer
  3. v-bind="$attrs"
  4. @register="registerDrawer"
  5. showFooter
  6. :showDetailBack="false"
  7. :title="getTitle"
  8. width="50%"
  9. @ok="handleSubmit"
  10. >
  11. <BasicForm @register="registerForm" />
  12. </BasicDrawer>
  13. </template>
  14. <script lang="ts">
  15. import { defineComponent, ref, computed, unref } from 'vue';
  16. import { BasicForm, useForm } from '/@/components/Form/index';
  17. import { formSchema } from './menu.data';
  18. import { BasicDrawer, useDrawerInner } from '/@/components/Drawer';
  19. import { getMenuList, saveMenuApi, updateMenuApi } from '/@/api/system/system';
  20. import { makeMenuTree, TreeMenuNode } from '/@/utils/treeUtils';
  21. import { useMessage } from '/@/hooks/web/useMessage';
  22. import { useI18n } from '/@/hooks/web/useI18n';
  23. export default defineComponent({
  24. name: 'MenuDrawer',
  25. components: { BasicDrawer, BasicForm },
  26. emits: ['success', 'register'],
  27. setup(_, { emit }) {
  28. const isUpdate = ref(true);
  29. const tData = ref<TreeMenuNode[]>([]);
  30. const menuId = ref(0);
  31. const [registerForm, { resetFields, setFieldsValue, updateSchema, validate }] = useForm({
  32. labelWidth: 100,
  33. schemas: formSchema,
  34. showActionButtonGroup: false,
  35. baseColProps: { lg: 12, md: 24 },
  36. });
  37. const [registerDrawer, { setDrawerProps, closeDrawer }] = useDrawerInner(async (data) => {
  38. resetFields();
  39. setDrawerProps({ confirmLoading: false });
  40. isUpdate.value = !!data?.isUpdate;
  41. if (unref(isUpdate)) {
  42. console.log('data.record', data.record.menuId);
  43. menuId.value = data.record.menuId;
  44. setFieldsValue({
  45. ...data.record,
  46. });
  47. }
  48. tData.value = (await getMenuList()) as any as TreeMenuNode[];
  49. const treeData = makeMenuTree(tData.value);
  50. updateSchema({
  51. field: 'parentId',
  52. componentProps: {
  53. treeData,
  54. },
  55. });
  56. });
  57. const getTitle = computed(() => (!unref(isUpdate) ? '新增菜单' : '编辑菜单'));
  58. const { createMessage } = useMessage();
  59. const { t } = useI18n();
  60. async function handleSubmit() {
  61. try {
  62. const values = await validate();
  63. setDrawerProps({ confirmLoading: true });
  64. // TODO custom api
  65. console.log(values);
  66. values.parentId ??= 0;
  67. const parent = tData.value.find((i) => i.menuId === values.parentId);
  68. if (values.type === 0) {
  69. values.component = 'LAYOUT';
  70. }
  71. if (values.type === 2 && parent && parent.type !== 1) {
  72. createMessage.error(t('routes.system.buttonMenuWaring'));
  73. return;
  74. }
  75. if (!unref(isUpdate)) {
  76. await saveMenuApi(values);
  77. } else {
  78. values.menuId = menuId.value;
  79. await updateMenuApi(values);
  80. }
  81. closeDrawer();
  82. emit('success');
  83. } finally {
  84. setDrawerProps({ confirmLoading: false });
  85. }
  86. }
  87. return { registerDrawer, registerForm, getTitle, handleSubmit };
  88. },
  89. });
  90. </script>