MenuDrawer.vue 3.0 KB

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