| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139 |
- <script lang="ts" setup>
- import type { DataNode } from 'ant-design-vue/es/tree';
- import type { Recordable } from '@vben/types';
- import type { SystemRoleApi } from '#/api/system/role';
- import { computed, ref } from 'vue';
- import { useVbenDrawer, VbenTree } from '@vben/common-ui';
- import { IconifyIcon } from '@vben/icons';
- import { Spin } from 'ant-design-vue';
- import { useVbenForm } from '#/adapter/form';
- import { getMenuList } from '#/api/system/menu';
- import { createRole, updateRole } from '#/api/system/role';
- import { $t } from '#/locales';
- import { useFormSchema } from '../data';
- const emits = defineEmits(['success']);
- const formData = ref<SystemRoleApi.SystemRole>();
- const [Form, formApi] = useVbenForm({
- schema: useFormSchema(),
- showDefaultActions: false,
- });
- const permissions = ref<DataNode[]>([]);
- const loadingPermissions = ref(false);
- const id = ref();
- const [Drawer, drawerApi] = useVbenDrawer({
- async onConfirm() {
- const { valid } = await formApi.validate();
- if (!valid) return;
- const values = await formApi.getValues();
- drawerApi.lock();
- (id.value ? updateRole(id.value, values) : createRole(values))
- .then(() => {
- emits('success');
- drawerApi.close();
- })
- .catch(() => {
- drawerApi.unlock();
- });
- },
- onOpenChange(isOpen) {
- if (isOpen) {
- const data = drawerApi.getData<SystemRoleApi.SystemRole>();
- formApi.resetForm();
- if (data) {
- formData.value = data;
- id.value = data.id;
- formApi.setValues(data);
- } else {
- id.value = undefined;
- }
- if (permissions.value.length === 0) {
- loadPermissions();
- }
- }
- },
- });
- async function loadPermissions() {
- loadingPermissions.value = true;
- try {
- const res = await getMenuList();
- permissions.value = res as unknown as DataNode[];
- } finally {
- loadingPermissions.value = false;
- }
- }
- const getDrawerTitle = computed(() => {
- return formData.value?.id
- ? $t('common.edit', $t('system.role.name'))
- : $t('common.create', $t('system.role.name'));
- });
- function getNodeClass(node: Recordable<any>) {
- const classes: string[] = [];
- if (node.value?.type === 'button') {
- classes.push('inline-flex');
- if (node.index % 3 >= 1) {
- classes.push('!pl-0');
- }
- }
- return classes.join(' ');
- }
- </script>
- <template>
- <Drawer :title="getDrawerTitle">
- <Form>
- <template #permissions="slotProps">
- <Spin :spinning="loadingPermissions">
- <VbenTree
- :tree-data="permissions"
- multiple
- bordered
- :default-expanded-level="2"
- :get-node-class="getNodeClass"
- v-bind="slotProps"
- value-field="id"
- label-field="meta.title"
- icon-field="meta.icon"
- >
- <template #node="{ value }">
- <IconifyIcon v-if="value.meta.icon" :icon="value.meta.icon" />
- {{ $t(value.meta.title) }}
- </template>
- </VbenTree>
- </Spin>
- </template>
- </Form>
- </Drawer>
- </template>
- <style lang="css" scoped>
- :deep(.ant-tree-title) {
- .tree-actions {
- display: none;
- margin-left: 20px;
- }
- }
- :deep(.ant-tree-title:hover) {
- .tree-actions {
- display: flex;
- flex: auto;
- justify-content: flex-end;
- margin-left: 20px;
- }
- }
- </style>
|