RoleDrawer.vue 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  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. baseColProps: { span: 24 },
  41. schemas: formSchema,
  42. showActionButtonGroup: false,
  43. });
  44. const [registerDrawer, { setDrawerProps, closeDrawer }] = useDrawerInner(async (data) => {
  45. resetFields();
  46. setDrawerProps({ confirmLoading: false });
  47. // 需要在setFieldsValue之前先填充treeData,否则Tree组件可能会报key not exist警告
  48. if (unref(treeData).length === 0) {
  49. treeData.value = (await getMenuList()) as any as TreeItem[];
  50. }
  51. isUpdate.value = !!data?.isUpdate;
  52. if (unref(isUpdate)) {
  53. setFieldsValue({
  54. ...data.record,
  55. });
  56. }
  57. });
  58. const getTitle = computed(() => (!unref(isUpdate) ? '新增角色' : '编辑角色'));
  59. async function handleSubmit() {
  60. try {
  61. const values = await validate();
  62. setDrawerProps({ confirmLoading: true });
  63. // TODO custom api
  64. console.log(values);
  65. closeDrawer();
  66. emit('success');
  67. } finally {
  68. setDrawerProps({ confirmLoading: false });
  69. }
  70. }
  71. return {
  72. registerDrawer,
  73. registerForm,
  74. getTitle,
  75. handleSubmit,
  76. treeData,
  77. };
  78. },
  79. });
  80. </script>