Browse Source

fix(vben5): fixed useVbenForm Component not registed

pull/1143/head
colin 11 months ago
parent
commit
bc65b830c1
  1. 49
      apps/vben5/apps/app-antd/src/adapter/form.ts
  2. 2
      apps/vben5/apps/app-antd/src/bootstrap.ts
  3. 8
      apps/vben5/packages/@abp/auditing/src/components/audit-logs/AuditLogTable.vue
  4. 2
      apps/vben5/packages/@abp/core/src/constants/events.ts
  5. 4
      apps/vben5/packages/@abp/features/src/components/definitions/features/FeatureDefinitionModal.vue
  6. 6
      apps/vben5/packages/@abp/features/src/components/definitions/features/FeatureDefinitionTable.vue
  7. 4
      apps/vben5/packages/@abp/features/src/components/definitions/groups/FeatureGroupDefinitionModal.vue
  8. 6
      apps/vben5/packages/@abp/features/src/components/definitions/groups/FeatureGroupDefinitionTable.vue
  9. 2
      apps/vben5/packages/@abp/gdpr/src/components/GdprTable.vue
  10. 2
      apps/vben5/packages/@abp/identity/src/api/useOrganizationUnitsApi.ts
  11. 4
      apps/vben5/packages/@abp/identity/src/components/claim-types/ClaimTypeModal.vue
  12. 6
      apps/vben5/packages/@abp/identity/src/components/claim-types/ClaimTypeTable.vue
  13. 4
      apps/vben5/packages/@abp/identity/src/components/claims/ClaimModal.vue
  14. 2
      apps/vben5/packages/@abp/identity/src/components/claims/ClaimTable.vue
  15. 15
      apps/vben5/packages/@abp/identity/src/components/organization-units/OrganizationUnitModal.vue
  16. 14
      apps/vben5/packages/@abp/identity/src/components/organization-units/OrganizationUnitRoleTable.vue
  17. 2
      apps/vben5/packages/@abp/identity/src/components/organization-units/OrganizationUnitTree.vue
  18. 6
      apps/vben5/packages/@abp/identity/src/components/organization-units/OrganizationUnitUserTable.vue
  19. 4
      apps/vben5/packages/@abp/identity/src/components/organization-units/SelectMemberModal.vue
  20. 12
      apps/vben5/packages/@abp/identity/src/components/organization-units/SelectRoleModal.vue
  21. 4
      apps/vben5/packages/@abp/identity/src/components/roles/RoleModal.vue
  22. 18
      apps/vben5/packages/@abp/identity/src/components/roles/RoleTable.vue
  23. 8
      apps/vben5/packages/@abp/identity/src/components/security-logs/SecurityLogTable.vue
  24. 4
      apps/vben5/packages/@abp/identity/src/components/sessions/SessionTable.vue
  25. 8
      apps/vben5/packages/@abp/identity/src/components/users/UserLockModal.vue
  26. 8
      apps/vben5/packages/@abp/identity/src/components/users/UserModal.vue
  27. 4
      apps/vben5/packages/@abp/identity/src/components/users/UserPasswordModal.vue
  28. 6
      apps/vben5/packages/@abp/identity/src/components/users/UserTable.vue
  29. 1
      apps/vben5/packages/@abp/identity/src/constants/index.ts
  30. 2
      apps/vben5/packages/@abp/identity/src/index.ts
  31. 4
      apps/vben5/packages/@abp/localization/src/components/languages/LocalizationLanguageTable.vue
  32. 4
      apps/vben5/packages/@abp/localization/src/components/resources/LocalizationResourceTable.vue
  33. 10
      apps/vben5/packages/@abp/localization/src/components/texts/LocalizationTextTable.vue
  34. 10
      apps/vben5/packages/@abp/localization/src/constants/permissions.ts
  35. 4
      apps/vben5/packages/@abp/notifications/src/components/definitions/groups/NotificationGroupDefinitionModal.vue
  36. 12
      apps/vben5/packages/@abp/notifications/src/components/definitions/groups/NotificationGroupDefinitionTable.vue
  37. 6
      apps/vben5/packages/@abp/notifications/src/components/definitions/notifications/NotificationDefinitionTable.vue
  38. 6
      apps/vben5/packages/@abp/notifications/src/components/my-notifilers/MyNotificationTable.vue
  39. 4
      apps/vben5/packages/@abp/openiddict/src/components/applications/ApplicationModal.vue
  40. 19
      apps/vben5/packages/@abp/openiddict/src/components/applications/ApplicationSecretModal.vue
  41. 6
      apps/vben5/packages/@abp/openiddict/src/components/applications/ApplicationTable.vue
  42. 6
      apps/vben5/packages/@abp/openiddict/src/components/authorizations/AuthorizationTable.vue
  43. 4
      apps/vben5/packages/@abp/openiddict/src/components/scopes/ScopeModal.vue
  44. 6
      apps/vben5/packages/@abp/openiddict/src/components/scopes/ScopeTable.vue
  45. 6
      apps/vben5/packages/@abp/openiddict/src/components/tokens/TokenTable.vue
  46. 1
      apps/vben5/packages/@abp/openiddict/src/constants/index.ts
  47. 1
      apps/vben5/packages/@abp/openiddict/src/index.ts
  48. 4
      apps/vben5/packages/@abp/permissions/src/components/definitions/groups/PermissionGroupDefinitionModal.vue
  49. 6
      apps/vben5/packages/@abp/permissions/src/components/definitions/groups/PermissionGroupDefinitionTable.vue
  50. 4
      apps/vben5/packages/@abp/permissions/src/components/definitions/permissions/PermissionDefinitionModal.vue
  51. 6
      apps/vben5/packages/@abp/permissions/src/components/definitions/permissions/PermissionDefinitionTable.vue
  52. 17
      apps/vben5/packages/@abp/permissions/src/components/permissions/PermissionModal.vue
  53. 1
      apps/vben5/packages/@abp/permissions/src/constants/index.ts
  54. 6
      apps/vben5/packages/@abp/platform/src/components/messages/email/EmailMessageTable.vue
  55. 6
      apps/vben5/packages/@abp/platform/src/components/messages/sms/SmsMessageTable.vue
  56. 1
      apps/vben5/packages/@abp/platform/src/constants/index.ts
  57. 1
      apps/vben5/packages/@abp/platform/src/index.ts
  58. 3
      apps/vben5/packages/@abp/saas/src/components/editions/EditionModal.vue
  59. 6
      apps/vben5/packages/@abp/saas/src/components/editions/EditionTable.vue
  60. 6
      apps/vben5/packages/@abp/saas/src/components/tenants/TenantTable.vue
  61. 1
      apps/vben5/packages/@abp/saas/src/constants/index.ts
  62. 1
      apps/vben5/packages/@abp/saas/src/index.ts
  63. 77
      apps/vben5/packages/@abp/settings/src/api/definitions.ts
  64. 4
      apps/vben5/packages/@abp/settings/src/api/index.ts
  65. 84
      apps/vben5/packages/@abp/settings/src/api/settings.ts
  66. 99
      apps/vben5/packages/@abp/settings/src/api/useDefinitionsApi.ts
  67. 103
      apps/vben5/packages/@abp/settings/src/api/useSettingsApi.ts
  68. 8
      apps/vben5/packages/@abp/settings/src/components/definitions/SettingDefinitionModal.vue
  69. 9
      apps/vben5/packages/@abp/settings/src/components/definitions/SettingDefinitionTable.vue
  70. 15
      apps/vben5/packages/@abp/settings/src/components/settings/SystemSetting.vue
  71. 4
      apps/vben5/packages/@abp/settings/src/components/settings/UserSetting.vue
  72. 1
      apps/vben5/packages/@abp/settings/src/constants/index.ts
  73. 1
      apps/vben5/packages/@abp/settings/src/index.ts
  74. 172
      apps/vben5/packages/@abp/ui/src/adapter/component/index.ts
  75. 47
      apps/vben5/packages/@abp/ui/src/adapter/form.ts
  76. 3
      apps/vben5/packages/@abp/ui/src/adapter/vxe-table.ts
  77. 2
      apps/vben5/packages/@abp/ui/src/index.ts

49
apps/vben5/apps/app-antd/src/adapter/form.ts

@ -0,0 +1,49 @@
import type {
VbenFormSchema as FormSchema,
VbenFormProps,
} from '@vben/common-ui';
import type { ComponentType } from './component';
import { setupVbenForm, useVbenForm as useForm, z } from '@vben/common-ui';
import { $t } from '@vben/locales';
async function initVbenForm() {
setupVbenForm<ComponentType>({
config: {
// ant design vue组件库默认都是 v-model:value
baseModelPropName: 'value',
// 一些组件是 v-model:checked 或者 v-model:fileList
modelPropNameMap: {
Checkbox: 'checked',
Radio: 'checked',
Switch: 'checked',
Upload: 'fileList',
},
},
defineRules: {
// 输入项目必填国际化适配
required: (value, _params, ctx) => {
if (value === undefined || value === null || value.length === 0) {
return $t('ui.formRules.required', [ctx.label]);
}
return true;
},
// 选择项目必填国际化适配
selectRequired: (value, _params, ctx) => {
if (value === undefined || value === null) {
return $t('ui.formRules.selectRequired', [ctx.label]);
}
return true;
},
},
});
}
const useVbenForm = useForm<ComponentType>;
export { initVbenForm, useVbenForm, z };
export type VbenFormSchema = FormSchema<ComponentType>;
export type { VbenFormProps };

2
apps/vben5/apps/app-antd/src/bootstrap.ts

@ -12,6 +12,7 @@ import { useTitle } from '@vueuse/core';
import { $t, setupI18n } from '#/locales';
import { initComponentAdapter } from './adapter/component';
import { initVbenForm } from './adapter/form';
import { initRequestClient } from './adapter/request';
import App from './app.vue';
import { router } from './router';
@ -19,6 +20,7 @@ import { router } from './router';
async function bootstrap(namespace: string) {
// 初始化组件适配器
await initComponentAdapter();
await initVbenForm();
initRequestClient();
const app = createApp(App);

8
apps/vben5/packages/@abp/auditing/src/components/audit-logs/AuditLogTable.vue

@ -1,6 +1,8 @@
<script setup lang="ts">
import type { SortOrder } from '@abp/core';
import type { VbenFormProps, VxeGridListeners, VxeGridProps } from '@abp/ui';
import type { VxeGridListeners, VxeGridProps } from '@abp/ui';
import type { VbenFormProps } from '@vben/common-ui';
import type { AuditLogDto } from '../../types/audit-logs';
@ -273,7 +275,7 @@ async function onDelete(row: AuditLogDto) {
content: $t('AbpUi.ItemWillBeDeletedMessage'),
onOk: async () => {
await deleteApi(row.id);
message.success($t('AbpUi.SuccessfullyDeleted'));
message.success($t('AbpUi.DeletedSuccessfully'));
gridApi.query();
},
title: $t('AbpUi.AreYouSure'),
@ -289,7 +291,7 @@ function onBulkDelete() {
ids: toValue(selectedKeys),
});
selectedKeys.value = [];
message.success($t('AbpUi.SuccessfullyDeleted'));
message.success($t('AbpUi.DeletedSuccessfully'));
gridApi.query();
},
title: $t('AbpUi.AreYouSure'),

2
apps/vben5/packages/@abp/core/src/constants/events.ts

@ -3,6 +3,8 @@ export const Events = {
GetNotification: 'get-notification',
/** 新通知消息 */
NotificationRecevied: 'sys_notifications_recevied',
/** 权限变更事件 */
PermissionChange: 'sys_permission_change',
/** 用户登录事件 */
UserLogin: 'sys_user_login',
/** 用户登出事件 */

4
apps/vben5/packages/@abp/features/src/components/definitions/features/FeatureDefinitionModal.vue

@ -165,7 +165,7 @@ const [Modal, modalApi] = useVbenModal({
const api = isEditModel.value
? updateApi(formModel.value.name, input)
: createApi(input);
modalApi.setState({ confirmLoading: true, loading: true });
modalApi.setState({ submitting: true });
api
.then((res) => {
message.success($t('AbpUi.SavedSuccessfully'));
@ -173,7 +173,7 @@ const [Modal, modalApi] = useVbenModal({
modalApi.close();
})
.finally(() => {
modalApi.setState({ confirmLoading: false, loading: false });
modalApi.setState({ submitting: false });
});
},
onOpenChange: async (isOpen: boolean) => {

6
apps/vben5/packages/@abp/features/src/components/definitions/features/FeatureDefinitionTable.vue

@ -1,5 +1,7 @@
<script setup lang="ts">
import type { VbenFormProps, VxeGridListeners, VxeGridProps } from '@abp/ui';
import type { VxeGridListeners, VxeGridProps } from '@abp/ui';
import type { VbenFormProps } from '@vben/common-ui';
import type { FeatureDefinitionDto } from '../../../types/definitions';
import type { FeatureGroupDefinitionDto } from '../../../types/groups';
@ -263,7 +265,7 @@ function onDelete(row: FeatureDefinitionDto) {
content: `${$t('AbpUi.ItemWillBeDeletedMessageWithFormat', [row.name])}`,
onOk: async () => {
await deleteApi(row.name);
message.success($t('AbpUi.SuccessfullyDeleted'));
message.success($t('AbpUi.DeletedSuccessfully'));
onGet();
},
title: $t('AbpUi.AreYouSure'),

4
apps/vben5/packages/@abp/features/src/components/definitions/groups/FeatureGroupDefinitionModal.vue

@ -50,7 +50,7 @@ const [Modal, modalApi] = useVbenModal({
const api = isEditModel.value
? updateApi(formModel.value.name, toValue(formModel))
: createApi(toValue(formModel));
modalApi.setState({ confirmLoading: true, loading: true });
modalApi.setState({ submitting: true });
api
.then((res) => {
message.success($t('AbpUi.SavedSuccessfully'));
@ -58,7 +58,7 @@ const [Modal, modalApi] = useVbenModal({
modalApi.close();
})
.finally(() => {
modalApi.setState({ confirmLoading: false, loading: false });
modalApi.setState({ submitting: false });
});
},
onOpenChange: async (isOpen: boolean) => {

6
apps/vben5/packages/@abp/features/src/components/definitions/groups/FeatureGroupDefinitionTable.vue

@ -1,7 +1,9 @@
<script setup lang="ts">
import type { VbenFormProps, VxeGridListeners, VxeGridProps } from '@abp/ui';
import type { VxeGridListeners, VxeGridProps } from '@abp/ui';
import type { MenuInfo } from 'ant-design-vue/es/menu/src/interface';
import type { VbenFormProps } from '@vben/common-ui';
import type { FeatureGroupDefinitionDto } from '../../../types/groups';
import { defineAsyncComponent, h, onMounted, reactive, ref } from 'vue';
@ -193,7 +195,7 @@ function onDelete(row: FeatureGroupDefinitionDto) {
content: `${$t('AbpUi.ItemWillBeDeletedMessageWithFormat', [row.name])}`,
onOk: async () => {
await deleteApi(row.name);
message.success($t('AbpUi.SuccessfullyDeleted'));
message.success($t('AbpUi.DeletedSuccessfully'));
onGet();
},
title: $t('AbpUi.AreYouSure'),

2
apps/vben5/packages/@abp/gdpr/src/components/GdprTable.vue

@ -161,7 +161,7 @@ const onDelete = (row: GdprRequestDto) => {
gridApi.setLoading(true);
try {
await deleteApi(row.id);
message.success($t('AbpUi.SuccessfullyDeleted'));
message.success($t('AbpUi.DeletedSuccessfully'));
await gridApi.query();
} finally {
gridApi.setLoading(false);

2
apps/vben5/packages/@abp/identity/src/api/useOrganizationUnitsApi.ts

@ -30,7 +30,7 @@ export function useOrganizationUnitsApi() {
): Promise<OrganizationUnitDto> {
return request<OrganizationUnitDto>('/api/identity/organization-units', {
data: input,
method: 'GET',
method: 'POST',
});
}

4
apps/vben5/packages/@abp/identity/src/components/claim-types/ClaimTypeModal.vue

@ -70,7 +70,7 @@ const [Modal, modalApi] = useVbenModal({
const api = formModel.value.id
? updateApi(formModel.value.id, toValue(formModel))
: createApi(toValue(formModel));
modalApi.setState({ loading: true });
modalApi.setState({ submitting: true });
api
.then((res) => {
message.success($t('AbpUi.Success'));
@ -78,7 +78,7 @@ const [Modal, modalApi] = useVbenModal({
modalApi.close();
})
.finally(() => {
modalApi.setState({ loading: false });
modalApi.setState({ submitting: false });
});
},
onOpenChange: async (isOpen: boolean) => {

6
apps/vben5/packages/@abp/identity/src/components/claim-types/ClaimTypeTable.vue

@ -1,7 +1,9 @@
<script setup lang="ts">
import type { VbenFormProps, VxeGridListeners, VxeGridProps } from '@abp/ui';
import type { VxeGridListeners, VxeGridProps } from '@abp/ui';
import type { MenuInfo } from 'ant-design-vue/es/menu/src/interface';
import type { VbenFormProps } from '@vben/common-ui';
import type { IdentityClaimTypeDto } from '../../types/claim-types';
import { defineAsyncComponent, h } from 'vue';
@ -184,7 +186,7 @@ const onDelete = (row: IdentityClaimTypeDto) => {
},
onOk: async () => {
await deleteApi(row.id);
message.success($t('AbpUi.SuccessfullyDeleted'));
message.success($t('AbpUi.DeletedSuccessfully'));
query();
},
title: $t('AbpUi.AreYouSure'),

4
apps/vben5/packages/@abp/identity/src/components/claims/ClaimModal.vue

@ -93,7 +93,7 @@ async function initAssignableClaims() {
/** 提交声明类型变更 */
async function onSubmit(values: Record<string, any>) {
try {
modalApi.setState({ confirmLoading: true });
modalApi.setState({ submitting: true });
const claimDto = modalApi.getData<IdentityClaimDto>();
const api = claimDto.id
? updateApi({
@ -109,7 +109,7 @@ async function onSubmit(values: Record<string, any>) {
emits('change', values as IdentityClaimDto);
modalApi.close();
} finally {
modalApi.setState({ confirmLoading: false });
modalApi.setState({ submitting: false });
}
}
</script>

2
apps/vben5/packages/@abp/identity/src/components/claims/ClaimTable.vue

@ -91,7 +91,7 @@ async function onDelete(row: IdentityClaimDto) {
claimType: row.claimType,
claimValue: row.claimValue,
});
message.success($t('AbpUi.SuccessfullyDeleted'));
message.success($t('AbpUi.DeletedSuccessfully'));
query();
emits('onDelete');
}

15
apps/vben5/packages/@abp/identity/src/components/organization-units/OrganizationUnitModal.vue

@ -5,11 +5,9 @@ import type {
OrganizationUnitUpdateDto,
} from '../../types/organization-units';
import { useVbenModal } from '@vben/common-ui';
import { useVbenForm, useVbenModal } from '@vben/common-ui';
import { $t } from '@vben/locales';
import { useVbenForm } from '@abp/ui';
import { useOrganizationUnitsApi } from '../../api/useOrganizationUnitsApi';
defineOptions({
@ -103,17 +101,16 @@ const [Modal, modalApi] = useVbenModal({
async function onSubmit(input: Record<string, any>) {
try {
modalApi.setState({
confirmLoading: true,
submitting: true,
});
const api = input.id
? updateApi(input.id, input as OrganizationUnitUpdateDto)
: createApi(input as OrganizationUnitCreateDto);
const dto = await api;
const dto = input.id
? await updateApi(input.id, input as OrganizationUnitUpdateDto)
: await createApi(input as OrganizationUnitCreateDto);
emits('change', dto);
modalApi.close();
} finally {
modalApi.setState({
confirmLoading: false,
submitting: false,
});
}
}

14
apps/vben5/packages/@abp/identity/src/components/organization-units/OrganizationUnitRoleTable.vue

@ -1,4 +1,6 @@
<script setup lang="ts">
import type { VxeGridListeners, VxeGridProps } from '@abp/ui';
import type { IdentityRoleDto } from '../../types/roles';
import { computed, defineAsyncComponent, h, nextTick, watch } from 'vue';
@ -7,11 +9,7 @@ import { useAccess } from '@vben/access';
import { useVbenModal } from '@vben/common-ui';
import { $t } from '@vben/locales';
import {
useVbenVxeGrid,
type VxeGridListeners,
type VxeGridProps,
} from '@abp/ui';
import { useVbenVxeGrid } from '@abp/ui';
import { DeleteOutlined, PlusOutlined } from '@ant-design/icons-vue';
import { Button, Modal } from 'ant-design-vue';
@ -137,8 +135,7 @@ const onShowRole = () => {
const onCreateRole = async (roles: IdentityRoleDto[]) => {
try {
roleModalApi.setState({
closable: false,
confirmLoading: true,
submitting: true,
});
await addRoles(props.selectedKey!, {
roleIds: roles.map((item) => item.id),
@ -147,8 +144,7 @@ const onCreateRole = async (roles: IdentityRoleDto[]) => {
await query();
} finally {
roleModalApi.setState({
closable: true,
confirmLoading: false,
submitting: false,
});
}
};

2
apps/vben5/packages/@abp/identity/src/components/organization-units/OrganizationUnitTree.vue

@ -137,7 +137,7 @@ function onDelete(id: string) {
maskClosable: false,
onOk: async () => {
await deleteApi(id);
message.success($t('AbpUi.SuccessfullyDeleted'));
message.success($t('AbpUi.DeletedSuccessfully'));
onRefresh();
},
title: $t('AbpUi.AreYouSure'),

6
apps/vben5/packages/@abp/identity/src/components/organization-units/OrganizationUnitUserTable.vue

@ -135,8 +135,7 @@ const onShowMember = () => {
const onCreateMember = (users: IdentityUserDto[]) => {
userModalApi.setState({
closable: false,
confirmLoading: true,
submitting: true,
});
addMembers(props.selectedKey!, {
userIds: users.map((item) => item.id),
@ -147,8 +146,7 @@ const onCreateMember = (users: IdentityUserDto[]) => {
})
.finally(() => {
userModalApi.setState({
closable: true,
confirmLoading: false,
submitting: false,
});
});
};

4
apps/vben5/packages/@abp/identity/src/components/organization-units/SelectMemberModal.vue

@ -1,11 +1,13 @@
<script setup lang="ts">
import type { VxeGridListeners, VxeGridProps } from '@abp/ui';
import type { VbenFormProps } from '@vben/common-ui';
import type { IdentityUserDto } from '../../types/users';
import { defineEmits, defineOptions, nextTick, ref, toValue } from 'vue';
import { useVbenModal, type VbenFormProps } from '@vben/common-ui';
import { useVbenModal } from '@vben/common-ui';
import { $t } from '@vben/locales';
import { useVbenVxeGrid } from '@abp/ui';

12
apps/vben5/packages/@abp/identity/src/components/organization-units/SelectRoleModal.vue

@ -1,16 +1,16 @@
<script setup lang="ts">
import type { VxeGridListeners, VxeGridProps } from '@abp/ui';
import type { VbenFormProps } from '@vben/common-ui';
import type { IdentityRoleDto } from '../../types/roles';
import { defineEmits, defineOptions, nextTick, ref, toValue } from 'vue';
import { useVbenModal, type VbenFormProps } from '@vben/common-ui';
import { useVbenModal } from '@vben/common-ui';
import { $t } from '@vben/locales';
import {
useVbenVxeGrid,
type VxeGridListeners,
type VxeGridProps,
} from '@abp/ui';
import { useVbenVxeGrid } from '@abp/ui';
import { useOrganizationUnitsApi } from '../../api/useOrganizationUnitsApi';

4
apps/vben5/packages/@abp/identity/src/components/roles/RoleModal.vue

@ -45,7 +45,7 @@ const [Modal, modalApi] = useVbenModal({
const api = formModel.value.id
? updateApi(formModel.value.id, toValue(formModel))
: createApi(toValue(formModel));
modalApi.setState({ loading: true });
modalApi.setState({ submitting: true });
api
.then((res) => {
message.success($t('AbpUi.Success'));
@ -53,7 +53,7 @@ const [Modal, modalApi] = useVbenModal({
modalApi.close();
})
.finally(() => {
modalApi.setState({ loading: false });
modalApi.setState({ submitting: false });
});
},
onOpenChange: async (isOpen: boolean) => {

18
apps/vben5/packages/@abp/identity/src/components/roles/RoleTable.vue

@ -1,7 +1,9 @@
<script setup lang="ts">
import type { VbenFormProps, VxeGridListeners, VxeGridProps } from '@abp/ui';
import type { VxeGridListeners, VxeGridProps } from '@abp/ui';
import type { MenuInfo } from 'ant-design-vue/es/menu/src/interface';
import type { VbenFormProps } from '@vben/common-ui';
import type { IdentityRoleDto } from '../../types/roles';
import { defineAsyncComponent, h } from 'vue';
@ -12,7 +14,7 @@ import { createIconifyIcon } from '@vben/icons';
import { $t } from '@vben/locales';
import { AuditLogPermissions, EntityChangeDrawer } from '@abp/auditing';
import { useAbpStore, useFeatures } from '@abp/core';
import { Events, useAbpStore, useEventBus, useFeatures } from '@abp/core';
import { PermissionModal } from '@abp/permissions';
import { useVbenVxeGrid } from '@abp/ui';
import {
@ -39,6 +41,7 @@ const RoleModal = defineAsyncComponent(() => import('./RoleModal.vue'));
const ClaimModal = defineAsyncComponent(() => import('./RoleClaimModal.vue'));
const abpStore = useAbpStore();
const { publish } = useEventBus();
const { isEnabled } = useFeatures();
const { hasAccessByCodes } = useAccess();
const { cancel, deleteApi, getPagedListApi } = useRolesApi();
@ -143,7 +146,7 @@ const handleDelete = (row: IdentityRoleDto) => {
},
onOk: async () => {
await deleteApi(row.id);
message.success($t('AbpUi.SuccessfullyDeleted'));
message.success($t('AbpUi.DeletedSuccessfully'));
query();
},
title: $t('AbpUi.AreYouSure'),
@ -179,6 +182,13 @@ const handleMenuClick = async (row: IdentityRoleDto, info: MenuInfo) => {
}
}
};
function onPermissionChange(_name: string, key: string) {
const roles = abpStore.application?.currentUser.roles ?? [];
if (roles.includes(key)) {
publish(Events.PermissionChange);
}
}
</script>
<template>
@ -271,7 +281,7 @@ const handleMenuClick = async (row: IdentityRoleDto, info: MenuInfo) => {
</Grid>
<RoleEditModal @change="() => query()" />
<RoleClaimModal @change="query" />
<RolePermissionModal />
<RolePermissionModal @change="onPermissionChange" />
<RoleChangeDrawer />
</template>

8
apps/vben5/packages/@abp/identity/src/components/security-logs/SecurityLogTable.vue

@ -1,6 +1,8 @@
<script setup lang="ts">
import type { SortOrder } from '@abp/core';
import type { VbenFormProps, VxeGridListeners, VxeGridProps } from '@abp/ui';
import type { VxeGridListeners, VxeGridProps } from '@abp/ui';
import type { VbenFormProps } from '@vben/common-ui';
import type { SecurityLogDto } from '../../types/security-logs';
@ -223,7 +225,7 @@ function onDelete(row: SecurityLogDto) {
},
onOk: async () => {
await deleteApi(row.id);
message.success($t('AbpUi.SuccessfullyDeleted'));
message.success($t('AbpUi.DeletedSuccessfully'));
gridApi.query();
},
title: $t('AbpUi.AreYouSure'),
@ -239,7 +241,7 @@ function onBulkDelete() {
ids: toValue(selectedKeys),
});
selectedKeys.value = [];
message.success($t('AbpUi.SuccessfullyDeleted'));
message.success($t('AbpUi.DeletedSuccessfully'));
gridApi.query();
},
title: $t('AbpUi.AreYouSure'),

4
apps/vben5/packages/@abp/identity/src/components/sessions/SessionTable.vue

@ -1,7 +1,9 @@
<script setup lang="ts">
import type { VbenFormProps, VxeGridListeners, VxeGridProps } from '@abp/ui';
import type { VxeGridListeners, VxeGridProps } from '@abp/ui';
import type { SelectValue } from 'ant-design-vue/es/select';
import type { VbenFormProps } from '@vben/common-ui';
import type { IdentityUserDto } from '../../types';
import type { IdentitySessionDto } from '../../types/sessions';

8
apps/vben5/packages/@abp/identity/src/components/users/UserLockModal.vue

@ -2,11 +2,9 @@
<script setup lang="ts">
import type { IdentityUserDto } from '../../types/users';
import { useVbenModal } from '@vben/common-ui';
import { useVbenForm, useVbenModal } from '@vben/common-ui';
import { $t } from '@vben/locales';
import { useVbenForm } from '@abp/ui';
import { useUsersApi } from '../../api/useUsersApi';
defineOptions({
@ -109,7 +107,7 @@ const [Modal, modalApi] = useVbenModal({
async function onSubmit(input: Record<string, any>) {
try {
modalApi.setState({
confirmLoading: true,
submitting: true,
});
const lockSeconds = input.type * input.seconds;
await lockApi(input.userId, lockSeconds);
@ -117,7 +115,7 @@ async function onSubmit(input: Record<string, any>) {
modalApi.close();
} finally {
modalApi.setState({
confirmLoading: false,
submitting: false,
});
}
}

8
apps/vben5/packages/@abp/identity/src/components/users/UserModal.vue

@ -79,7 +79,7 @@ const [Modal, modalApi] = useVbenModal({
const api = formModel.value.id
? updateApi(formModel.value.id, toValue(formModel))
: createApi(toValue(formModel));
modalApi.setState({ confirmLoading: true });
modalApi.setState({ submitting: true });
api
.then((res) => {
message.success($t('AbpUi.SavedSuccessfully'));
@ -87,7 +87,7 @@ const [Modal, modalApi] = useVbenModal({
modalApi.close();
})
.finally(() => {
modalApi.setState({ confirmLoading: false });
modalApi.setState({ submitting: false });
});
},
onOpenChange: async (isOpen: boolean) => {
@ -291,8 +291,8 @@ async function onLoadOuChildren(node: EventDataNode) {
}"
:render="(item) => item.title"
:titles="[
$t('AbpIdentityServer.Assigned'),
$t('AbpIdentityServer.Available'),
$t('AbpOpenIddict.Assigned'),
$t('AbpOpenIddict.Available'),
]"
class="tree-transfer"
/>

4
apps/vben5/packages/@abp/identity/src/components/users/UserPasswordModal.vue

@ -70,10 +70,10 @@ const [Modal, modalApi] = useVbenModal({
},
onConfirm: async () => {
try {
modalApi.setState({ confirmLoading: true });
modalApi.setState({ submitting: true });
await formApi.validateAndSubmitForm();
} finally {
modalApi.setState({ confirmLoading: false });
modalApi.setState({ submitting: false });
}
},
onOpenChange(isOpen) {

6
apps/vben5/packages/@abp/identity/src/components/users/UserTable.vue

@ -1,7 +1,9 @@
<script setup lang="ts">
import type { VbenFormProps, VxeGridListeners, VxeGridProps } from '@abp/ui';
import type { VxeGridListeners, VxeGridProps } from '@abp/ui';
import type { MenuInfo } from 'ant-design-vue/es/menu/src/interface';
import type { VbenFormProps } from '@vben/common-ui';
import type { IdentityUserDto } from '../../types/users';
import { computed, defineAsyncComponent, h } from 'vue';
@ -200,7 +202,7 @@ const handleDelete = (row: IdentityUserDto) => {
},
onOk: async () => {
await deleteApi(row.id);
message.success($t('AbpUi.SuccessfullyDeleted'));
message.success($t('AbpUi.DeletedSuccessfully'));
query();
},
title: $t('AbpUi.AreYouSure'),

1
apps/vben5/packages/@abp/identity/src/constants/index.ts

@ -1 +0,0 @@
export * from './permissions';

2
apps/vben5/packages/@abp/identity/src/index.ts

@ -1,4 +1,4 @@
export * from './api';
export * from './components';
export * from './constants';
export { UserLookupPermissions } from './constants/permissions';
export * from './types';

4
apps/vben5/packages/@abp/localization/src/components/languages/LocalizationLanguageTable.vue

@ -1,5 +1,7 @@
<script setup lang="ts">
import type { VbenFormProps, VxeGridListeners, VxeGridProps } from '@abp/ui';
import type { VxeGridListeners, VxeGridProps } from '@abp/ui';
import type { VbenFormProps } from '@vben/common-ui';
import type { LanguageDto } from '../../types/languages';

4
apps/vben5/packages/@abp/localization/src/components/resources/LocalizationResourceTable.vue

@ -1,5 +1,7 @@
<script setup lang="ts">
import type { VbenFormProps, VxeGridListeners, VxeGridProps } from '@abp/ui';
import type { VxeGridListeners, VxeGridProps } from '@abp/ui';
import type { VbenFormProps } from '@vben/common-ui';
import type { ResourceDto } from '../../types/resources';

10
apps/vben5/packages/@abp/localization/src/components/texts/LocalizationTextTable.vue

@ -1,5 +1,7 @@
<script setup lang="ts">
import type { VbenFormProps, VxeGridListeners, VxeGridProps } from '@abp/ui';
import type { VxeGridListeners, VxeGridProps } from '@abp/ui';
import type { VbenFormProps } from '@vben/common-ui';
import type { LanguageDto, ResourceDto } from '../../types';
import type { TextDifferenceDto, TextDto } from '../../types/texts';
@ -18,7 +20,7 @@ import { useLanguagesApi } from '../../api/useLanguagesApi';
import { useLocalizationsApi } from '../../api/useLocalizationsApi';
import { useResourcesApi } from '../../api/useResourcesApi';
import { useTextsApi } from '../../api/useTextsApi';
import { ResourcesPermissions } from '../../constants/permissions';
import { TextsPermissions } from '../../constants/permissions';
defineOptions({
name: 'LocalizationTextTable',
@ -291,7 +293,7 @@ onMounted(onInit);
<Button
:icon="h(PlusOutlined)"
type="primary"
v-access:code="[ResourcesPermissions.Create]"
v-access:code="[TextsPermissions.Create]"
@click="onCreate"
>
{{ $t('LocalizationManagement.Text:AddNew') }}
@ -303,7 +305,7 @@ onMounted(onInit);
:icon="h(EditOutlined)"
block
type="link"
v-access:code="[ResourcesPermissions.Update]"
v-access:code="[TextsPermissions.Update]"
@click="onUpdate(row)"
>
{{ $t('AbpUi.Edit') }}

10
apps/vben5/packages/@abp/localization/src/constants/permissions.ts

@ -18,3 +18,13 @@ export const LanguagesPermissions = {
/** 更新 */
Update: 'LocalizationManagement.Language.Update',
};
/** 文本管理权限 */
export const TextsPermissions = {
/** 新增 */
Create: 'LocalizationManagement.Text.Create',
Default: 'LocalizationManagement.Text',
/** 删除 */
Delete: 'LocalizationManagement.Text.Delete',
/** 更新 */
Update: 'LocalizationManagement.Text.Update',
};

4
apps/vben5/packages/@abp/notifications/src/components/definitions/groups/NotificationGroupDefinitionModal.vue

@ -51,7 +51,7 @@ const [Modal, modalApi] = useVbenModal({
const api = isEditModel.value
? updateApi(formModel.value.name, input)
: createApi(input);
modalApi.setState({ confirmLoading: true, loading: true });
modalApi.setState({ submitting: true });
api
.then((res) => {
message.success($t('AbpUi.SavedSuccessfully'));
@ -59,7 +59,7 @@ const [Modal, modalApi] = useVbenModal({
modalApi.close();
})
.finally(() => {
modalApi.setState({ confirmLoading: false, loading: false });
modalApi.setState({ submitting: false });
});
},
onOpenChange: async (isOpen: boolean) => {

12
apps/vben5/packages/@abp/notifications/src/components/definitions/groups/NotificationGroupDefinitionTable.vue

@ -1,7 +1,9 @@
<script setup lang="ts">
import type { VbenFormProps, VxeGridListeners, VxeGridProps } from '@abp/ui';
import type { VxeGridListeners, VxeGridProps } from '@abp/ui';
import type { MenuInfo } from 'ant-design-vue/es/menu/src/interface';
import type { VbenFormProps } from '@vben/common-ui';
import type { NotificationGroupDefinitionDto } from '../../../types/groups';
import { defineAsyncComponent, h, onMounted, reactive, ref } from 'vue';
@ -34,7 +36,7 @@ defineOptions({
const MenuItem = Menu.Item;
const DefinitionIcon = createIconifyIcon('nimbus:notification');
const permissionGroups = ref<NotificationGroupDefinitionDto[]>([]);
const dataSource = ref<NotificationGroupDefinitionDto[]>([]);
const pageState = reactive({
current: 1,
size: 10,
@ -130,7 +132,7 @@ async function onGet(input?: Record<string, string>) {
gridApi.setLoading(true);
const { items } = await getListApi(input);
pageState.total = items.length;
permissionGroups.value = items.map((item) => {
dataSource.value = items.map((item) => {
const localizableString = deserialize(item.displayName);
return {
...item,
@ -150,7 +152,7 @@ async function onReset() {
}
function onPageChange() {
const items = permissionGroups.value.slice(
const items = dataSource.value.slice(
(pageState.current - 1) * pageState.size,
pageState.current * pageState.size,
);
@ -180,7 +182,7 @@ function onDelete(row: NotificationGroupDefinitionDto) {
content: `${$t('AbpUi.ItemWillBeDeletedMessageWithFormat', [row.name])}`,
onOk: async () => {
await deleteApi(row.name);
message.success($t('AbpUi.SuccessfullyDeleted'));
message.success($t('AbpUi.DeletedSuccessfully'));
onGet();
},
title: $t('AbpUi.AreYouSure'),

6
apps/vben5/packages/@abp/notifications/src/components/definitions/notifications/NotificationDefinitionTable.vue

@ -1,7 +1,9 @@
<script setup lang="ts">
import type { VbenFormProps, VxeGridListeners, VxeGridProps } from '@abp/ui';
import type { VxeGridListeners, VxeGridProps } from '@abp/ui';
import type { MenuInfo } from 'ant-design-vue/es/menu/src/interface';
import type { VbenFormProps } from '@vben/common-ui';
import type { NotificationDefinitionDto } from '../../../types/definitions';
import type { NotificationGroupDefinitionDto } from '../../../types/groups';
@ -317,7 +319,7 @@ function onDelete(row: NotificationDefinitionDto) {
content: `${$t('AbpUi.ItemWillBeDeletedMessageWithFormat', [row.name])}`,
onOk: async () => {
await deleteApi(row.name);
message.success($t('AbpUi.SuccessfullyDeleted'));
message.success($t('AbpUi.DeletedSuccessfully'));
onGet();
},
title: $t('AbpUi.AreYouSure'),

6
apps/vben5/packages/@abp/notifications/src/components/my-notifilers/MyNotificationTable.vue

@ -1,7 +1,9 @@
<script setup lang="ts">
import type { VbenFormProps, VxeGridListeners, VxeGridProps } from '@abp/ui';
import type { VxeGridListeners, VxeGridProps } from '@abp/ui';
import type { MenuInfo } from 'ant-design-vue/es/menu/src/interface';
import type { VbenFormProps } from '@vben/common-ui';
import type { Notification } from '../../types/notifications';
import { defineAsyncComponent, h, ref } from 'vue';
@ -252,7 +254,7 @@ const onDelete = (row: Notification) => {
},
onOk: async () => {
await deleteMyNotifilerApi(row.id);
message.success($t('AbpUi.SuccessfullyDeleted'));
message.success($t('AbpUi.DeletedSuccessfully'));
await gridApi.query();
},
title: $t('AbpUi.AreYouSure'),

4
apps/vben5/packages/@abp/openiddict/src/components/applications/ApplicationModal.vue

@ -159,7 +159,7 @@ const [Modal, modalApi] = useVbenModal({
const api = formModel.value.id
? updateApi(formModel.value.id, toValue(formModel))
: createApi(toValue(formModel));
modalApi.setState({ confirmLoading: true, loading: true });
modalApi.setState({ submitting: true });
api
.then((res) => {
message.success($t('AbpUi.SavedSuccessfully'));
@ -167,7 +167,7 @@ const [Modal, modalApi] = useVbenModal({
modalApi.close();
})
.finally(() => {
modalApi.setState({ confirmLoading: false, loading: false });
modalApi.setState({ submitting: false });
});
},
onOpenChange: async (isOpen: boolean) => {

19
apps/vben5/packages/@abp/openiddict/src/components/applications/ApplicationSecretModal.vue

@ -71,13 +71,18 @@ async function onGet(id: string) {
applicationModel.value = dto;
}
async function onSubmit(input: Record<string, any>) {
const dto = await updateApi(applicationModel.value!.id, {
...applicationModel.value!,
clientSecret: input.clientSecret,
});
message.success($t('AbpUi.SavedSuccessfully'));
emits('change', dto);
modalApi.close();
try {
modalApi.setState({ submitting: true });
const dto = await updateApi(applicationModel.value!.id, {
...applicationModel.value!,
clientSecret: input.clientSecret,
});
message.success($t('AbpUi.SavedSuccessfully'));
emits('change', dto);
modalApi.close();
} finally {
modalApi.setState({ submitting: false });
}
}
</script>

6
apps/vben5/packages/@abp/openiddict/src/components/applications/ApplicationTable.vue

@ -1,7 +1,9 @@
<script setup lang="ts">
import type { VbenFormProps, VxeGridProps } from '@abp/ui';
import type { VxeGridProps } from '@abp/ui';
import type { MenuInfo } from 'ant-design-vue/es/menu/src/interface';
import type { VbenFormProps } from '@vben/common-ui';
import type { OpenIddictApplicationDto } from '../../types/applications';
import { defineAsyncComponent, h } from 'vue';
@ -178,7 +180,7 @@ const onDelete = (row: OpenIddictApplicationDto) => {
content: `${$t('AbpUi.ItemWillBeDeletedMessageWithFormat', [row.clientId])}`,
onOk: async () => {
await deleteApi(row.id);
message.success($t('AbpUi.SuccessfullyDeleted'));
message.success($t('AbpUi.DeletedSuccessfully'));
query();
},
title: $t('AbpUi.AreYouSure'),

6
apps/vben5/packages/@abp/openiddict/src/components/authorizations/AuthorizationTable.vue

@ -1,7 +1,9 @@
<script setup lang="ts">
import type { VbenFormProps, VxeGridProps } from '@abp/ui';
import type { VxeGridProps } from '@abp/ui';
import type { SelectValue } from 'ant-design-vue/es/select';
import type { VbenFormProps } from '@vben/common-ui';
import type { OpenIddictApplicationDto } from '../../types';
import type { OpenIddictAuthorizationDto } from '../../types/authorizations';
@ -198,7 +200,7 @@ function onDelete(row: OpenIddictAuthorizationDto) {
content: `${$t('AbpUi.ItemWillBeDeletedMessage')}`,
onOk: async () => {
await deleteApi(row.id);
message.success($t('AbpUi.SuccessfullyDeleted'));
message.success($t('AbpUi.DeletedSuccessfully'));
gridApi.query();
},
title: $t('AbpUi.AreYouSure'),

4
apps/vben5/packages/@abp/openiddict/src/components/scopes/ScopeModal.vue

@ -71,7 +71,7 @@ const [Modal, modalApi] = useVbenModal({
const api = formModel.value.id
? updateApi(formModel.value.id, toValue(formModel))
: createApi(toValue(formModel));
modalApi.setState({ confirmLoading: true, loading: true });
modalApi.setState({ submitting: true });
api
.then((res) => {
message.success($t('AbpUi.SavedSuccessfully'));
@ -79,7 +79,7 @@ const [Modal, modalApi] = useVbenModal({
modalApi.close();
})
.finally(() => {
modalApi.setState({ confirmLoading: false, loading: false });
modalApi.setState({ submitting: false });
});
},
onOpenChange: async (isOpen: boolean) => {

6
apps/vben5/packages/@abp/openiddict/src/components/scopes/ScopeTable.vue

@ -1,7 +1,9 @@
<script setup lang="ts">
import type { VbenFormProps, VxeGridProps } from '@abp/ui';
import type { VxeGridProps } from '@abp/ui';
import type { MenuInfo } from 'ant-design-vue/es/menu/src/interface';
import type { VbenFormProps } from '@vben/common-ui';
import type { OpenIddictScopeDto } from '../../types/scopes';
import { defineAsyncComponent, h } from 'vue';
@ -146,7 +148,7 @@ const onDelete = (row: OpenIddictScopeDto) => {
content: `${$t('AbpUi.ItemWillBeDeletedMessageWithFormat', [row.name])}`,
onOk: async () => {
await deleteApi(row.id);
message.success($t('AbpUi.SuccessfullyDeleted'));
message.success($t('AbpUi.DeletedSuccessfully'));
query();
},
title: $t('AbpUi.AreYouSure'),

6
apps/vben5/packages/@abp/openiddict/src/components/tokens/TokenTable.vue

@ -1,7 +1,9 @@
<script setup lang="ts">
import type { VbenFormProps, VxeGridProps } from '@abp/ui';
import type { VxeGridProps } from '@abp/ui';
import type { SelectValue } from 'ant-design-vue/es/select';
import type { VbenFormProps } from '@vben/common-ui';
import type { OpenIddictApplicationDto } from '../../types';
import type { OpenIddictTokenDto } from '../../types/tokens';
@ -222,7 +224,7 @@ function onDelete(row: OpenIddictTokenDto) {
content: `${$t('AbpUi.ItemWillBeDeletedMessage')}`,
onOk: async () => {
await deleteApi(row.id);
message.success($t('AbpUi.SuccessfullyDeleted'));
message.success($t('AbpUi.DeletedSuccessfully'));
gridApi.query();
},
title: $t('AbpUi.AreYouSure'),

1
apps/vben5/packages/@abp/openiddict/src/constants/index.ts

@ -1 +0,0 @@
export * from './permissions';

1
apps/vben5/packages/@abp/openiddict/src/index.ts

@ -1,4 +1,3 @@
export * from './api';
export * from './components';
export * from './constants';
export * from './types';

4
apps/vben5/packages/@abp/permissions/src/components/definitions/groups/PermissionGroupDefinitionModal.vue

@ -50,7 +50,7 @@ const [Modal, modalApi] = useVbenModal({
const api = isEditModel.value
? updateApi(formModel.value.name, toValue(formModel))
: createApi(toValue(formModel));
modalApi.setState({ confirmLoading: true, loading: true });
modalApi.setState({ submitting: true });
api
.then((res) => {
message.success($t('AbpUi.SavedSuccessfully'));
@ -58,7 +58,7 @@ const [Modal, modalApi] = useVbenModal({
modalApi.close();
})
.finally(() => {
modalApi.setState({ confirmLoading: false, loading: false });
modalApi.setState({ submitting: false });
});
},
onOpenChange: async (isOpen: boolean) => {

6
apps/vben5/packages/@abp/permissions/src/components/definitions/groups/PermissionGroupDefinitionTable.vue

@ -1,7 +1,9 @@
<script setup lang="ts">
import type { VbenFormProps, VxeGridListeners, VxeGridProps } from '@abp/ui';
import type { VxeGridListeners, VxeGridProps } from '@abp/ui';
import type { MenuInfo } from 'ant-design-vue/es/menu/src/interface';
import type { VbenFormProps } from '@vben/common-ui';
import type { PermissionGroupDefinitionDto } from '../../../types/groups';
import { defineAsyncComponent, h, onMounted, reactive, ref } from 'vue';
@ -193,7 +195,7 @@ function onDelete(row: PermissionGroupDefinitionDto) {
content: `${$t('AbpUi.ItemWillBeDeletedMessageWithFormat', [row.name])}`,
onOk: async () => {
await deleteApi(row.name);
message.success($t('AbpUi.SuccessfullyDeleted'));
message.success($t('AbpUi.DeletedSuccessfully'));
onGet();
},
title: $t('AbpUi.AreYouSure'),

4
apps/vben5/packages/@abp/permissions/src/components/definitions/permissions/PermissionDefinitionModal.vue

@ -82,7 +82,7 @@ const [Modal, modalApi] = useVbenModal({
const api = isEditModel.value
? updateApi(formModel.value.name, toValue(formModel))
: createApi(toValue(formModel));
modalApi.setState({ confirmLoading: true, loading: true });
modalApi.setState({ submitting: true });
api
.then((res) => {
message.success($t('AbpUi.SavedSuccessfully'));
@ -90,7 +90,7 @@ const [Modal, modalApi] = useVbenModal({
modalApi.close();
})
.finally(() => {
modalApi.setState({ confirmLoading: false, loading: false });
modalApi.setState({ submitting: false });
});
},
onOpenChange: async (isOpen: boolean) => {

6
apps/vben5/packages/@abp/permissions/src/components/definitions/permissions/PermissionDefinitionTable.vue

@ -1,5 +1,7 @@
<script setup lang="ts">
import type { VbenFormProps, VxeGridListeners, VxeGridProps } from '@abp/ui';
import type { VxeGridListeners, VxeGridProps } from '@abp/ui';
import type { VbenFormProps } from '@vben/common-ui';
import type { PermissionDefinitionDto } from '../../../types/definitions';
import type { PermissionGroupDefinitionDto } from '../../../types/groups';
@ -259,7 +261,7 @@ function onDelete(row: PermissionDefinitionDto) {
content: `${$t('AbpUi.ItemWillBeDeletedMessageWithFormat', [row.name])}`,
onOk: async () => {
await deleteApi(row.name);
message.success($t('AbpUi.SuccessfullyDeleted'));
message.success($t('AbpUi.DeletedSuccessfully'));
onGet();
},
title: $t('AbpUi.AreYouSure'),

17
apps/vben5/packages/@abp/permissions/src/components/permissions/PermissionModal.vue

@ -31,6 +31,10 @@ defineOptions({
name: 'PermissionModal',
});
const emits = defineEmits<{
(event: 'change', name: string, key?: string): void;
}>();
const TabPane = Tabs.TabPane;
interface ModalState {
@ -92,13 +96,14 @@ const [Modal, modalApi] = useVbenModal({
const permissions = toPermissionList(permissionTree.value);
try {
modalApi.setState({
closable: false,
confirmLoading: true,
submitting: true,
});
const providerName = modelState.value!.providerName;
const providerKey = modelState.value!.providerKey;
await updateApi(
{
providerKey: modelState.value!.providerKey,
providerName: modelState.value!.providerName,
providerKey,
providerName,
},
{
permissions,
@ -106,10 +111,10 @@ const [Modal, modalApi] = useVbenModal({
);
message.success($t('AbpUi.SavedSuccessfully'));
modalApi.close();
emits('change', providerName, providerKey);
} finally {
modalApi.setState({
closable: true,
confirmLoading: false,
submitting: false,
});
}
},

1
apps/vben5/packages/@abp/permissions/src/constants/index.ts

@ -1 +0,0 @@
export * from './permissions';

6
apps/vben5/packages/@abp/platform/src/components/messages/email/EmailMessageTable.vue

@ -1,7 +1,9 @@
<script setup lang="ts">
import type { VbenFormProps, VxeGridProps } from '@abp/ui';
import type { VxeGridProps } from '@abp/ui';
import type { MenuInfo } from 'ant-design-vue/es/menu/src/interface';
import type { VbenFormProps } from '@vben/common-ui';
import type { EmailMessageDto } from '../../../types/messages';
import { defineAsyncComponent, h } from 'vue';
@ -226,7 +228,7 @@ function onDelete(row: EmailMessageDto) {
try {
gridApi.setLoading(true);
await deleteApi(row.id);
message.success($t('AbpUi.SuccessfullyDeleted'));
message.success($t('AbpUi.DeletedSuccessfully'));
gridApi.query();
} finally {
gridApi.setLoading(false);

6
apps/vben5/packages/@abp/platform/src/components/messages/sms/SmsMessageTable.vue

@ -1,7 +1,9 @@
<script setup lang="ts">
import type { VbenFormProps, VxeGridProps } from '@abp/ui';
import type { VxeGridProps } from '@abp/ui';
import type { MenuInfo } from 'ant-design-vue/es/menu/src/interface';
import type { VbenFormProps } from '@vben/common-ui';
import type { SmsMessageDto } from '../../../types/messages';
import { h } from 'vue';
@ -198,7 +200,7 @@ function onDelete(row: SmsMessageDto) {
try {
gridApi.setLoading(true);
await deleteApi(row.id);
message.success($t('AbpUi.SuccessfullyDeleted'));
message.success($t('AbpUi.DeletedSuccessfully'));
gridApi.query();
} finally {
gridApi.setLoading(false);

1
apps/vben5/packages/@abp/platform/src/constants/index.ts

@ -1 +0,0 @@
export * from './permissions';

1
apps/vben5/packages/@abp/platform/src/index.ts

@ -1,4 +1,3 @@
export * from './api';
export * from './components';
export * from './constants';
export * from './types';

3
apps/vben5/packages/@abp/saas/src/components/editions/EditionModal.vue

@ -3,10 +3,9 @@ import type { EditionDto } from '../../types';
import { ref } from 'vue';
import { useVbenModal } from '@vben/common-ui';
import { useVbenForm, useVbenModal } from '@vben/common-ui';
import { $t } from '@vben/locales';
import { useVbenForm } from '@abp/ui';
import { message } from 'ant-design-vue';
import { useEditionsApi } from '../../api';

6
apps/vben5/packages/@abp/saas/src/components/editions/EditionTable.vue

@ -1,7 +1,9 @@
<script setup lang="ts">
import type { VbenFormProps, VxeGridListeners, VxeGridProps } from '@abp/ui';
import type { VxeGridListeners, VxeGridProps } from '@abp/ui';
import type { MenuInfo } from 'ant-design-vue/es/menu/src/interface';
import type { VbenFormProps } from '@vben/common-ui';
import type { EditionDto } from '../../types/editions';
import { defineAsyncComponent, h } from 'vue';
@ -142,7 +144,7 @@ const onDelete = (row: EditionDto) => {
},
onOk: async () => {
await deleteApi(row.id);
message.success($t('AbpUi.SuccessfullyDeleted'));
message.success($t('AbpUi.DeletedSuccessfully'));
query();
},
title: $t('AbpUi.AreYouSure'),

6
apps/vben5/packages/@abp/saas/src/components/tenants/TenantTable.vue

@ -1,7 +1,9 @@
<script setup lang="ts">
import type { VbenFormProps, VxeGridListeners, VxeGridProps } from '@abp/ui';
import type { VxeGridListeners, VxeGridProps } from '@abp/ui';
import type { MenuInfo } from 'ant-design-vue/es/menu/src/interface';
import type { VbenFormProps } from '@vben/common-ui';
import type { TenantDto } from '../../types/tenants';
import { defineAsyncComponent, h } from 'vue';
@ -161,7 +163,7 @@ const onDelete = (row: TenantDto) => {
},
onOk: async () => {
await deleteApi(row.id);
message.success($t('AbpUi.SuccessfullyDeleted'));
message.success($t('AbpUi.DeletedSuccessfully'));
query();
},
title: $t('AbpUi.AreYouSure'),

1
apps/vben5/packages/@abp/saas/src/constants/index.ts

@ -1 +0,0 @@
export * from './permissions';

1
apps/vben5/packages/@abp/saas/src/index.ts

@ -1,4 +1,3 @@
export * from './api';
export * from './components';
export * from './constants';
export * from './types';

77
apps/vben5/packages/@abp/settings/src/api/definitions.ts

@ -1,77 +0,0 @@
import type { ListResultDto } from '@abp/core';
import type {
SettingDefinitionCreateDto,
SettingDefinitionDto,
SettingDefinitionGetListInput,
SettingDefinitionUpdateDto,
} from '../types/definitions';
import { requestClient } from '@abp/request';
/**
*
* @param name
*/
export function deleteApi(name: string): Promise<void> {
return requestClient.delete(
`/api/setting-management/settings/definitions/${name}`,
);
}
/**
*
* @param name
* @returns
*/
export function getApi(name: string): Promise<SettingDefinitionDto> {
return requestClient.get<SettingDefinitionDto>(
`/api/setting-management/settings/definitions/${name}`,
);
}
/**
*
* @param input
* @returns
*/
export function getListApi(
input?: SettingDefinitionGetListInput,
): Promise<ListResultDto<SettingDefinitionDto>> {
return requestClient.get<ListResultDto<SettingDefinitionDto>>(
`/api/setting-management/settings/definitions`,
{
params: input,
},
);
}
/**
*
* @param input
* @returns
*/
export function createApi(
input: SettingDefinitionCreateDto,
): Promise<SettingDefinitionDto> {
return requestClient.post<SettingDefinitionDto>(
'/api/setting-management/settings/definitions',
input,
);
}
/**
*
* @param name
* @param input
* @returns
*/
export function updateApi(
name: string,
input: SettingDefinitionUpdateDto,
): Promise<SettingDefinitionDto> {
return requestClient.put<SettingDefinitionDto>(
`/api/setting-management/settings/definitions/${name}`,
input,
);
}

4
apps/vben5/packages/@abp/settings/src/api/index.ts

@ -1,2 +1,2 @@
export * as settingDefinitionsApi from './definitions';
export * as settingsApi from './settings';
export { useDefinitionsApi } from './useDefinitionsApi';
export { useSettingsApi } from './useSettingsApi';

84
apps/vben5/packages/@abp/settings/src/api/settings.ts

@ -1,84 +0,0 @@
import type { ListResultDto } from '@abp/core';
import type { SettingGroup, SettingsUpdateInput } from '../types/settings';
import { requestClient } from '@abp/request';
/**
*
* @returns
*/
export function getGlobalSettingsApi(): Promise<ListResultDto<SettingGroup>> {
return requestClient.get<ListResultDto<SettingGroup>>(
`/api/setting-management/settings/by-global`,
);
}
/**
*
* @returns
*/
export function setGlobalSettingsApi(
input: SettingsUpdateInput,
): Promise<void> {
return requestClient.put(
`/api/setting-management/settings/change-global`,
input,
);
}
/**
*
* @returns
*/
export function getTenantSettingsApi(): Promise<ListResultDto<SettingGroup>> {
return requestClient.get<ListResultDto<SettingGroup>>(
`/api/setting-management/settings/by-current-tenant`,
);
}
/**
*
* @returns
*/
export function setTenantSettingsApi(
input: SettingsUpdateInput,
): Promise<void> {
return requestClient.put(
`/api/setting-management/settings/change-current-tenant`,
input,
);
}
/**
*
* @returns
*/
export function getUserSettingsApi(): Promise<ListResultDto<SettingGroup>> {
return requestClient.get<ListResultDto<SettingGroup>>(
`/api/setting-management/settings/by-current-user`,
);
}
/**
*
* @returns
*/
export function setUserSettingsApi(input: SettingsUpdateInput): Promise<void> {
return requestClient.put(
`/api/setting-management/settings/change-current-user`,
input,
);
}
/**
*
* @param emailAddress
*/
export const sendTestEmailApi = (emailAddress: string) => {
return requestClient.post(
`/api/setting-management/settings/send-test-email`,
{
emailAddress,
},
);
};

99
apps/vben5/packages/@abp/settings/src/api/useDefinitionsApi.ts

@ -0,0 +1,99 @@
import type { ListResultDto } from '@abp/core';
import type {
SettingDefinitionCreateDto,
SettingDefinitionDto,
SettingDefinitionGetListInput,
SettingDefinitionUpdateDto,
} from '../types';
import { useRequest } from '@abp/request';
export function useDefinitionsApi() {
const { cancel, request } = useRequest();
/**
*
* @param name
*/
function deleteApi(name: string): Promise<void> {
return request(`/api/setting-management/settings/definitions/${name}`, {
method: 'DELETE',
});
}
/**
*
* @param name
* @returns
*/
function getApi(name: string): Promise<SettingDefinitionDto> {
return request<SettingDefinitionDto>(
`/api/setting-management/settings/definitions/${name}`,
{
method: 'GET',
},
);
}
/**
*
* @param input
* @returns
*/
function getListApi(
input?: SettingDefinitionGetListInput,
): Promise<ListResultDto<SettingDefinitionDto>> {
return request<ListResultDto<SettingDefinitionDto>>(
`/api/setting-management/settings/definitions`,
{
method: 'GET',
params: input,
},
);
}
/**
*
* @param input
* @returns
*/
function createApi(
input: SettingDefinitionCreateDto,
): Promise<SettingDefinitionDto> {
return request<SettingDefinitionDto>(
'/api/setting-management/settings/definitions',
{
data: input,
method: 'POST',
},
);
}
/**
*
* @param name
* @param input
* @returns
*/
function updateApi(
name: string,
input: SettingDefinitionUpdateDto,
): Promise<SettingDefinitionDto> {
return request<SettingDefinitionDto>(
`/api/setting-management/settings/definitions/${name}`,
{
data: input,
method: 'PUT',
},
);
}
return {
cancel,
createApi,
deleteApi,
getApi,
getListApi,
updateApi,
};
}

103
apps/vben5/packages/@abp/settings/src/api/useSettingsApi.ts

@ -0,0 +1,103 @@
import type { ListResultDto } from '@abp/core';
import type { SettingGroup, SettingsUpdateInput } from '../types';
import { useRequest } from '@abp/request';
export function useSettingsApi() {
const { cancel, request } = useRequest();
/**
*
* @returns
*/
function getGlobalSettingsApi(): Promise<ListResultDto<SettingGroup>> {
return request<ListResultDto<SettingGroup>>(
`/api/setting-management/settings/by-global`,
{
method: 'GET',
},
);
}
/**
*
* @returns
*/
function setGlobalSettingsApi(input: SettingsUpdateInput): Promise<void> {
return request(`/api/setting-management/settings/change-global`, {
data: input,
method: 'PUT',
});
}
/**
*
* @returns
*/
function getTenantSettingsApi(): Promise<ListResultDto<SettingGroup>> {
return request<ListResultDto<SettingGroup>>(
`/api/setting-management/settings/by-current-tenant`,
{
method: 'GET',
},
);
}
/**
*
* @returns
*/
function setTenantSettingsApi(input: SettingsUpdateInput): Promise<void> {
return request(`/api/setting-management/settings/change-current-tenant`, {
data: input,
method: 'PUT',
});
}
/**
*
* @returns
*/
function getUserSettingsApi(): Promise<ListResultDto<SettingGroup>> {
return request<ListResultDto<SettingGroup>>(
`/api/setting-management/settings/by-current-user`,
{
method: 'GET',
},
);
}
/**
*
* @returns
*/
function setUserSettingsApi(input: SettingsUpdateInput): Promise<void> {
return request(`/api/setting-management/settings/change-current-user`, {
data: input,
method: 'PUT',
});
}
/**
*
* @param emailAddress
*/
const sendTestEmailApi = (emailAddress: string) => {
return request(`/api/setting-management/settings/send-test-email`, {
data: {
emailAddress,
},
method: 'POST',
});
};
return {
cancel,
getGlobalSettingsApi,
getTenantSettingsApi,
getUserSettingsApi,
sendTestEmailApi,
setGlobalSettingsApi,
setTenantSettingsApi,
setUserSettingsApi,
};
}

8
apps/vben5/packages/@abp/settings/src/components/definitions/SettingDefinitionModal.vue

@ -27,7 +27,7 @@ import {
Textarea,
} from 'ant-design-vue';
import { createApi, getApi, updateApi } from '../../api/definitions';
import { useDefinitionsApi } from '../../api/useDefinitionsApi';
defineOptions({
name: 'SettingDefinitionModal',
@ -55,6 +55,8 @@ const providerOptions = reactive([
{ label: $t('AbpSettingManagement.Providers:User'), value: 'U' },
]);
const { createApi, getApi, updateApi } = useDefinitionsApi();
const [Modal, modalApi] = useVbenModal({
class: 'w-1/2',
draggable: true,
@ -67,7 +69,7 @@ const [Modal, modalApi] = useVbenModal({
const api = isEditModel.value
? updateApi(formModel.value.name, toValue(formModel))
: createApi(toValue(formModel));
modalApi.setState({ confirmLoading: true, loading: true });
modalApi.setState({ submitting: true });
api
.then((res) => {
message.success($t('AbpUi.SavedSuccessfully'));
@ -75,7 +77,7 @@ const [Modal, modalApi] = useVbenModal({
modalApi.close();
})
.finally(() => {
modalApi.setState({ confirmLoading: false, loading: false });
modalApi.setState({ submitting: false });
});
},
onOpenChange: async (isOpen: boolean) => {

9
apps/vben5/packages/@abp/settings/src/components/definitions/SettingDefinitionTable.vue

@ -1,5 +1,7 @@
<script setup lang="ts">
import type { VbenFormProps, VxeGridListeners, VxeGridProps } from '@abp/ui';
import type { VxeGridListeners, VxeGridProps } from '@abp/ui';
import type { VbenFormProps } from '@vben/common-ui';
import type { SettingDefinitionDto } from '../../types/definitions';
@ -17,7 +19,7 @@ import {
} from '@ant-design/icons-vue';
import { Button, message, Modal } from 'ant-design-vue';
import { deleteApi, getListApi } from '../../api/definitions';
import { useDefinitionsApi } from '../../api/useDefinitionsApi';
import { SettingDefinitionsPermissions } from '../../constants/permissions';
defineOptions({
@ -33,6 +35,7 @@ const pageState = reactive({
const { Lr } = useLocalization();
const { deserialize } = useLocalizationSerializer();
const { deleteApi, getListApi } = useDefinitionsApi();
const formOptions: VbenFormProps = {
//
@ -163,7 +166,7 @@ function onDelete(row: SettingDefinitionDto) {
content: `${$t('AbpUi.ItemWillBeDeletedMessageWithFormat', [row.name])}`,
onOk: async () => {
await deleteApi(row.name);
message.success($t('AbpUi.SuccessfullyDeleted'));
message.success($t('AbpUi.DeletedSuccessfully'));
onGet();
},
title: $t('AbpUi.AreYouSure'),

15
apps/vben5/packages/@abp/settings/src/components/settings/SystemSetting.vue

@ -10,13 +10,7 @@ import { isEmail, useAbpStore } from '@abp/core';
import { FeatureModal } from '@abp/features';
import { Button, Form, InputSearch, message, Modal } from 'ant-design-vue';
import {
getGlobalSettingsApi,
getTenantSettingsApi,
sendTestEmailApi,
setGlobalSettingsApi,
setTenantSettingsApi,
} from '../../api/settings';
import { useSettingsApi } from '../../api/useSettingsApi';
import SettingForm from './SettingForm.vue';
defineOptions({
@ -26,6 +20,13 @@ defineOptions({
const FormItem = Form.Item;
const abpStore = useAbpStore();
const {
getGlobalSettingsApi,
getTenantSettingsApi,
sendTestEmailApi,
setGlobalSettingsApi,
setTenantSettingsApi,
} = useSettingsApi();
const [HostFeatureModal, featureModalApi] = useVbenModal({
connectedComponent: FeatureModal,
});

4
apps/vben5/packages/@abp/settings/src/components/settings/UserSetting.vue

@ -1,13 +1,15 @@
<script setup lang="ts">
import type { SettingsUpdateInput } from '../../types';
import { getUserSettingsApi, setUserSettingsApi } from '../../api/settings';
import { useSettingsApi } from '../../api/useSettingsApi';
import SettingForm from './SettingForm.vue';
defineOptions({
name: 'UserSettingForm',
});
const { getUserSettingsApi, setUserSettingsApi } = useSettingsApi();
async function onGet() {
const { items } = await getUserSettingsApi();
return items;

1
apps/vben5/packages/@abp/settings/src/constants/index.ts

@ -1 +0,0 @@
export * from './permissions';

1
apps/vben5/packages/@abp/settings/src/index.ts

@ -1,4 +1,3 @@
export * from './api';
export * from './components';
export * from './constants';
export * from './types';

172
apps/vben5/packages/@abp/ui/src/adapter/component/index.ts

@ -1,172 +0,0 @@
/**
* 使 adapter/form 使便使
* vben-formvben-modalvben-drawer 使,
*/
import type { Component, SetupContext } from 'vue';
import type { BaseFormComponentType } from '@vben/common-ui';
import { h } from 'vue';
import { ApiComponent, globalShareState, IconPicker } from '@vben/common-ui';
import { $t } from '@vben/locales';
import {
AutoComplete,
Button,
Checkbox,
CheckboxGroup,
DatePicker,
Divider,
Input,
InputNumber,
InputPassword,
InputSearch,
Mentions,
notification,
Radio,
RadioGroup,
RangePicker,
Rate,
Select,
Space,
Switch,
Textarea,
TimePicker,
TreeSelect,
Upload,
} from 'ant-design-vue';
const withDefaultPlaceholder = <T extends Component>(
component: T,
type: 'input' | 'select',
) => {
return (props: any, { attrs, slots }: Omit<SetupContext, 'expose'>) => {
const placeholder = props?.placeholder || $t(`ui.placeholder.${type}`);
return h(component, { ...props, ...attrs, placeholder }, slots);
};
};
// 这里需要自行根据业务组件库进行适配,需要用到的组件都需要在这里类型说明
export type ComponentType =
| 'ApiSelect'
| 'ApiTreeSelect'
| 'AutoComplete'
| 'Checkbox'
| 'CheckboxGroup'
| 'DatePicker'
| 'DefaultButton'
| 'Divider'
| 'IconPicker'
| 'Input'
| 'InputNumber'
| 'InputPassword'
| 'InputSearch'
| 'Mentions'
| 'PrimaryButton'
| 'Radio'
| 'RadioGroup'
| 'RangePicker'
| 'Rate'
| 'Select'
| 'Space'
| 'Switch'
| 'Textarea'
| 'TimePicker'
| 'TreeSelect'
| 'Upload'
| BaseFormComponentType;
async function initComponentAdapter() {
const components: Partial<Record<ComponentType, Component>> = {
// 如果你的组件体积比较大,可以使用异步加载
// Button: () =>
// import('xxx').then((res) => res.Button),
ApiSelect: (props, { attrs, slots }) => {
return h(
ApiComponent,
{
placeholder: $t('ui.placeholder.select'),
...props,
...attrs,
component: Select,
loadingSlot: 'suffixIcon',
modelPropName: 'value',
visibleEvent: 'onDropdownVisibleChange',
},
slots,
);
},
ApiTreeSelect: (props, { attrs, slots }) => {
return h(
ApiComponent,
{
placeholder: $t('ui.placeholder.select'),
...props,
...attrs,
component: TreeSelect,
fieldNames: { label: 'label', value: 'value', children: 'children' },
loadingSlot: 'suffixIcon',
modelPropName: 'value',
optionsPropName: 'treeData',
visibleEvent: 'onVisibleChange',
},
slots,
);
},
AutoComplete,
Checkbox,
CheckboxGroup,
DatePicker,
// 自定义默认按钮
DefaultButton: (props, { attrs, slots }) => {
return h(Button, { ...props, attrs, type: 'default' }, slots);
},
Divider,
IconPicker: (props, { attrs, slots }) => {
return h(
IconPicker,
{ iconSlot: 'addonAfter', inputComponent: Input, ...props, ...attrs },
slots,
);
},
Input: withDefaultPlaceholder(Input, 'input'),
InputNumber: withDefaultPlaceholder(InputNumber, 'input'),
InputPassword: withDefaultPlaceholder(InputPassword, 'input'),
InputSearch: withDefaultPlaceholder(InputSearch, 'input'),
Mentions: withDefaultPlaceholder(Mentions, 'input'),
// 自定义主要按钮
PrimaryButton: (props, { attrs, slots }) => {
return h(Button, { ...props, attrs, type: 'primary' }, slots);
},
Radio,
RadioGroup,
RangePicker,
Rate,
Select: withDefaultPlaceholder(Select, 'select'),
Space,
Switch,
Textarea: withDefaultPlaceholder(Textarea, 'input'),
TimePicker,
TreeSelect: withDefaultPlaceholder(TreeSelect, 'select'),
Upload,
};
// 将组件注册到全局共享状态中
globalShareState.setComponents(components);
// 定义全局共享状态中的消息提示
globalShareState.defineMessage({
// 复制成功消息提示
copyPreferencesSuccess: (title, content) => {
notification.success({
description: content,
message: title,
placement: 'bottomRight',
});
},
});
}
export { initComponentAdapter };

47
apps/vben5/packages/@abp/ui/src/adapter/form.ts

@ -1,47 +0,0 @@
import type {
VbenFormSchema as FormSchema,
VbenFormProps,
} from '@vben/common-ui';
import type { ComponentType } from './component';
import { setupVbenForm, useVbenForm as useForm, z } from '@vben/common-ui';
import { $t } from '@vben/locales';
setupVbenForm<ComponentType>({
config: {
// ant design vue组件库默认都是 v-model:value
baseModelPropName: 'value',
// 一些组件是 v-model:checked 或者 v-model:fileList
modelPropNameMap: {
Checkbox: 'checked',
Radio: 'checked',
Switch: 'checked',
Upload: 'fileList',
},
},
defineRules: {
// 输入项目必填国际化适配
required: (value, _params, ctx) => {
if (value === undefined || value === null || value.length === 0) {
return $t('ui.formRules.required', [ctx.label]);
}
return true;
},
// 选择项目必填国际化适配
selectRequired: (value, _params, ctx) => {
if (value === undefined || value === null) {
return $t('ui.formRules.selectRequired', [ctx.label]);
}
return true;
},
},
});
const useVbenForm = useForm<ComponentType>;
export { useVbenForm, z };
export type VbenFormSchema = FormSchema<ComponentType>;
export type { VbenFormProps };

3
apps/vben5/packages/@abp/ui/src/adapter/vxe-table.ts

@ -2,11 +2,12 @@ import type { VxeGridProps } from '../components/vxe-table/types';
import { h } from 'vue';
import { useVbenForm } from '@vben/common-ui';
import { Button, Image } from 'ant-design-vue';
import { setupVbenVxeTable } from '../components/vxe-table';
import { useVbenVxeGrid as useVxeGrid } from '../components/vxe-table/use-vxe-grid';
import { useVbenForm } from './form';
function useVbenVxeGrid(options: VxeGridProps) {
setupVbenVxeTable({

2
apps/vben5/packages/@abp/ui/src/index.ts

@ -1,4 +1,2 @@
export * from './adapter/component';
export * from './adapter/form';
export * from './adapter/vxe-table';
export * from './components';

Loading…
Cancel
Save