RoleDrawer.vue 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. <template>
  2. <BasicDrawer
  3. v-bind="$attrs"
  4. @register="registerDrawer"
  5. showFooter
  6. :title="getTitle"
  7. width="500px"
  8. @ok="handleSubmit"
  9. >
  10. <BasicForm @register="registerForm">
  11. <template #menu="{ model, field }">
  12. <BasicTree
  13. v-model:value="model[field]"
  14. :treeData="treeData"
  15. :fieldNames="{ title: 'menuName', key: 'id' }"
  16. checkable
  17. toolbar
  18. title="菜单分配"
  19. />
  20. </template>
  21. </BasicForm>
  22. </BasicDrawer>
  23. </template>
  24. <script lang="ts">
  25. import { defineComponent, ref, computed, unref } from 'vue';
  26. import { BasicForm, useForm } from '/@/components/Form/index';
  27. import { formSchema } from './role.data';
  28. import { BasicDrawer, useDrawerInner } from '/@/components/Drawer';
  29. import { BasicTree, TreeItem } from '/@/components/Tree';
  30. import { getMenuList } from '/@/api/demo/system';
  31. export default defineComponent({
  32. name: 'RoleDrawer',
  33. components: { BasicDrawer, BasicForm, BasicTree },
  34. emits: ['success', 'register'],
  35. setup(_, { emit }) {
  36. const isUpdate = ref(true);
  37. const treeData = ref<TreeItem[]>([]);
  38. const [registerForm, { resetFields, setFieldsValue, validate }] = useForm({
  39. labelWidth: 90,
  40. schemas: formSchema,
  41. showActionButtonGroup: false,
  42. });
  43. const [registerDrawer, { setDrawerProps, closeDrawer }] = useDrawerInner(async (data) => {
  44. resetFields();
  45. setDrawerProps({ confirmLoading: false });
  46. // 需要在setFieldsValue之前先填充treeData,否则Tree组件可能会报key not exist警告
  47. if (unref(treeData).length === 0) {
  48. treeData.value = (await getMenuList()) as any as TreeItem[];
  49. }
  50. isUpdate.value = !!data?.isUpdate;
  51. if (unref(isUpdate)) {
  52. setFieldsValue({
  53. ...data.record,
  54. });
  55. }
  56. });
  57. const getTitle = computed(() => (!unref(isUpdate) ? '新增角色' : '编辑角色'));
  58. async function handleSubmit() {
  59. try {
  60. const values = await validate();
  61. setDrawerProps({ confirmLoading: true });
  62. // TODO custom api
  63. console.log(values);
  64. closeDrawer();
  65. emit('success');
  66. } finally {
  67. setDrawerProps({ confirmLoading: false });
  68. }
  69. }
  70. return {
  71. registerDrawer,
  72. registerForm,
  73. getTitle,
  74. handleSubmit,
  75. treeData,
  76. };
  77. },
  78. });
  79. </script>