diff --git a/apps/vben5/apps/app-antd/src/adapter/component/index.ts b/apps/vben5/apps/app-antd/src/adapter/component/index.ts index 199e349d2..87cd87bdf 100644 --- a/apps/vben5/apps/app-antd/src/adapter/component/index.ts +++ b/apps/vben5/apps/app-antd/src/adapter/component/index.ts @@ -14,6 +14,7 @@ import { $t } from '@vben/locales'; import { FeatureStateCheck, GlobalFeatureStateCheck } from '@abp/features'; import { PermissionStateCheck } from '@abp/permissions'; +import { TenantSelect } from '@abp/saas'; import { AutoComplete, Button, @@ -158,6 +159,7 @@ async function initComponentAdapter() { FeatureStateCheck, GlobalFeatureStateCheck, PermissionStateCheck, + TenantSelect, }; // 将组件注册到全局共享状态中 diff --git a/apps/vben5/packages/@abp/features/src/components/definitions/features/FeatureDefinitionModal.vue b/apps/vben5/packages/@abp/features/src/components/definitions/features/FeatureDefinitionModal.vue index 0fe59c2a4..8ac3265dc 100644 --- a/apps/vben5/packages/@abp/features/src/components/definitions/features/FeatureDefinitionModal.vue +++ b/apps/vben5/packages/@abp/features/src/components/definitions/features/FeatureDefinitionModal.vue @@ -259,7 +259,10 @@ function onValueTypeNameChange(valueTypeName: string) { break; } default: { - formModel.value.defaultValue ??= undefined; + formModel.value.defaultValue = undefined; + if (isBoolean(formModel.value.defaultValue)) { + formModel.value.defaultValue = 'false'; + } break; } } diff --git a/apps/vben5/packages/@abp/features/src/components/state-check/FeatureStateCheck.vue b/apps/vben5/packages/@abp/features/src/components/state-check/FeatureStateCheck.vue index 8b233215d..b4af32bde 100644 --- a/apps/vben5/packages/@abp/features/src/components/state-check/FeatureStateCheck.vue +++ b/apps/vben5/packages/@abp/features/src/components/state-check/FeatureStateCheck.vue @@ -7,10 +7,12 @@ import type { import { computed, onMounted, ref } from 'vue'; import { + isNullOrWhiteSpace, listToTree, useLocalization, useLocalizationSerializer, } from '@abp/core'; +import { valueTypeSerializer } from '@abp/ui'; import { Checkbox, FormItemRest, TreeSelect } from 'ant-design-vue'; import { useFeatureDefinitionsApi } from '../../api/useFeatureDefinitionsApi'; @@ -96,13 +98,24 @@ async function onInit() { displayName: Lr(displayName.resourceName, displayName.name), }; }); - features.value = featuresRes.items.map((item) => { - const displayName = deserialize(item.displayName); - return { - ...item, - displayName: Lr(displayName.resourceName, displayName.name), - }; - }); + features.value = featuresRes.items + .filter((item) => { + if (!isNullOrWhiteSpace(item.valueType)) { + const valueType = valueTypeSerializer.deserialize(item.valueType); + if (valueType.validator.name !== 'BOOLEAN') { + return false; + } + } + return true; + }) + .map((item) => { + const displayName = deserialize(item.displayName); + const feature = { + ...item, + displayName: Lr(displayName.resourceName, displayName.name), + }; + return feature; + }); } onMounted(onInit); diff --git a/apps/vben5/packages/@abp/saas/package.json b/apps/vben5/packages/@abp/saas/package.json index d8fe93258..f536c9515 100644 --- a/apps/vben5/packages/@abp/saas/package.json +++ b/apps/vben5/packages/@abp/saas/package.json @@ -31,9 +31,11 @@ "@vben/hooks": "workspace:*", "@vben/icons": "workspace:*", "@vben/locales": "workspace:*", + "@vueuse/integrations": "catalog:", "ant-design-vue": "catalog:", "dayjs": "catalog:", "lodash.debounce": "catalog:", + "universal-cookie": "catalog:", "vue": "catalog:*", "vxe-table": "catalog:" }, diff --git a/apps/vben5/packages/@abp/saas/src/api/index.ts b/apps/vben5/packages/@abp/saas/src/api/index.ts index beba3fb43..3474130f9 100644 --- a/apps/vben5/packages/@abp/saas/src/api/index.ts +++ b/apps/vben5/packages/@abp/saas/src/api/index.ts @@ -1,2 +1,3 @@ export { useEditionsApi } from './useEditionsApi'; +export { useMultiTenancyApi } from './useMultiTenancyApi'; export { useTenantsApi } from './useTenantsApi'; diff --git a/apps/vben5/packages/@abp/saas/src/api/useMultiTenancyApi.ts b/apps/vben5/packages/@abp/saas/src/api/useMultiTenancyApi.ts new file mode 100644 index 000000000..cee4f0b22 --- /dev/null +++ b/apps/vben5/packages/@abp/saas/src/api/useMultiTenancyApi.ts @@ -0,0 +1,31 @@ +import type { FindTenantResultDto } from '../types/multiTenancys'; + +import { useRequest } from '@abp/request'; + +export function useMultiTenancyApi() { + const { cancel, request } = useRequest(); + + function findTenantByNameApi(name: string): Promise { + return request( + `/api/abp/multi-tenancy/tenants/by-name/${name}`, + { + method: 'GET', + }, + ); + } + + function findTenantByIdApi(id: string): Promise { + return request( + `/api/abp/multi-tenancy/tenants/by-id/${id}`, + { + method: 'GET', + }, + ); + } + + return { + cancel, + findTenantByIdApi, + findTenantByNameApi, + }; +} diff --git a/apps/vben5/packages/@abp/saas/src/components/index.ts b/apps/vben5/packages/@abp/saas/src/components/index.ts index 88de3efdf..05d1bd8ae 100644 --- a/apps/vben5/packages/@abp/saas/src/components/index.ts +++ b/apps/vben5/packages/@abp/saas/src/components/index.ts @@ -1,2 +1,3 @@ export { default as EditionTable } from './editions/EditionTable.vue'; +export { default as TenantSelect } from './tenants/TenantSelect.vue'; export { default as TenantTable } from './tenants/TenantTable.vue'; diff --git a/apps/vben5/packages/@abp/saas/src/components/tenants/TenantSelect.vue b/apps/vben5/packages/@abp/saas/src/components/tenants/TenantSelect.vue new file mode 100644 index 000000000..d1c0b6ee7 --- /dev/null +++ b/apps/vben5/packages/@abp/saas/src/components/tenants/TenantSelect.vue @@ -0,0 +1,58 @@ + + + + + diff --git a/apps/vben5/packages/@abp/saas/src/components/tenants/TenantSelectModal.vue b/apps/vben5/packages/@abp/saas/src/components/tenants/TenantSelectModal.vue new file mode 100644 index 000000000..6ad05d021 --- /dev/null +++ b/apps/vben5/packages/@abp/saas/src/components/tenants/TenantSelectModal.vue @@ -0,0 +1,98 @@ + + + + + diff --git a/apps/vben5/packages/@abp/saas/src/types/index.ts b/apps/vben5/packages/@abp/saas/src/types/index.ts index 7227f5ab1..ca6eda68d 100644 --- a/apps/vben5/packages/@abp/saas/src/types/index.ts +++ b/apps/vben5/packages/@abp/saas/src/types/index.ts @@ -1,2 +1,3 @@ export * from './editions'; +export * from './multiTenancys'; export * from './tenants'; diff --git a/apps/vben5/packages/@abp/saas/src/types/multiTenancys.ts b/apps/vben5/packages/@abp/saas/src/types/multiTenancys.ts new file mode 100644 index 000000000..25d596565 --- /dev/null +++ b/apps/vben5/packages/@abp/saas/src/types/multiTenancys.ts @@ -0,0 +1,9 @@ +interface FindTenantResultDto { + isActive: boolean; + name?: string; + normalizedName?: string; + success: boolean; + tenantId?: string; +} + +export type { FindTenantResultDto }; diff --git a/apps/vben5/pnpm-workspace.yaml b/apps/vben5/pnpm-workspace.yaml index 790065150..830b2a3e2 100644 --- a/apps/vben5/pnpm-workspace.yaml +++ b/apps/vben5/pnpm-workspace.yaml @@ -174,6 +174,7 @@ catalog: turbo: ^2.4.0 typescript: ^5.7.3 unbuild: ^3.3.1 + universal-cookie: ^7 unplugin-element-plus: ^0.9.0 vee-validate: ^4.15.0 vditor: ^3.10.9