From ac3ed868f47eb616e815b564ae309a1fd2e8ef71 Mon Sep 17 00:00:00 2001 From: colin Date: Sat, 18 Jan 2025 08:35:41 +0800 Subject: [PATCH] =?UTF-8?q?:heavy=5Fplus=5Fsign:=20feat:=20=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E5=AE=9E=E4=BD=93=E5=8F=98=E6=9B=B4=E8=AE=B0=E5=BD=95?= =?UTF-8?q?.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../useRequireFeaturesSimpleStateChecker.ts | 2 +- .../@abp/core/src/hooks/useFeatures.ts | 44 ++++++--- .../@abp/core/src/hooks/useGlobalFeatures.ts | 7 +- .../@abp/core/src/hooks/useSettings.ts | 50 ++++++----- .../core/src/hooks/useSimpleStateCheck.ts | 6 +- .../@abp/core/src/hooks/useValidation.ts | 6 +- .../components/claim-types/ClaimTypeTable.vue | 6 +- .../src/components/roles/RoleTable.vue | 9 +- .../src/components/users/UserTable.vue | 8 +- .../packages/@abp/openiddict/package.json | 1 + .../applications/ApplicationTable.vue | 31 ++++++- .../src/components/scopes/ScopeTable.vue | 89 +++++++++++++------ 12 files changed, 181 insertions(+), 78 deletions(-) diff --git a/apps/vben5/packages/@abp/core/src/hooks/SimpleStateChecking/useRequireFeaturesSimpleStateChecker.ts b/apps/vben5/packages/@abp/core/src/hooks/SimpleStateChecking/useRequireFeaturesSimpleStateChecker.ts index 4ec027687..3a155dff3 100644 --- a/apps/vben5/packages/@abp/core/src/hooks/SimpleStateChecking/useRequireFeaturesSimpleStateChecker.ts +++ b/apps/vben5/packages/@abp/core/src/hooks/SimpleStateChecking/useRequireFeaturesSimpleStateChecker.ts @@ -50,7 +50,7 @@ export function useRequireFeaturesSimpleStateChecker< featureNames: string[], requiresAll: boolean = false, ): ISimpleStateChecker { - const { featureChecker } = useFeatures(); + const featureChecker = useFeatures(); return new RequireFeaturesSimpleStateChecker( featureChecker, featureNames, diff --git a/apps/vben5/packages/@abp/core/src/hooks/useFeatures.ts b/apps/vben5/packages/@abp/core/src/hooks/useFeatures.ts index 3ba7bdacf..9b1048f3e 100644 --- a/apps/vben5/packages/@abp/core/src/hooks/useFeatures.ts +++ b/apps/vben5/packages/@abp/core/src/hooks/useFeatures.ts @@ -1,24 +1,40 @@ import type { FeatureValue, IFeatureChecker } from '../types/features'; -import { computed } from 'vue'; +import { ref, watch } from 'vue'; import { useAbpStore } from '../store/abp'; -export function useFeatures() { +export function useFeatures(): IFeatureChecker { const abpStore = useAbpStore(); - const getFeatures = computed(() => { - const fetures = abpStore.application?.features.values ?? {}; - const fetureValues = Object.keys(fetures).map((key): FeatureValue => { - return { - name: key, - value: fetures[key] ?? '', - }; - }); - return fetureValues; - }); + + const features = ref([]); + + watch( + () => abpStore.application, + (application) => { + if (!application?.features.values) { + features.value = []; + return; + } + const featuresSet: FeatureValue[] = []; + Object.keys(application.features.values).forEach((name) => { + if (application.features.values[name]) { + featuresSet.push({ + name, + value: application.features.values[name], + }); + } + }); + features.value = featuresSet; + }, + { + deep: true, + immediate: true, + }, + ); function get(name: string): FeatureValue | undefined { - return getFeatures.value.find((feature) => name === feature.name); + return features.value.find((feature) => name === feature.name); } function _isEnabled(name: string): boolean { @@ -52,5 +68,5 @@ export function useFeatures() { }, }; - return { featureChecker }; + return featureChecker; } diff --git a/apps/vben5/packages/@abp/core/src/hooks/useGlobalFeatures.ts b/apps/vben5/packages/@abp/core/src/hooks/useGlobalFeatures.ts index 0e7da84f3..49149a3ca 100644 --- a/apps/vben5/packages/@abp/core/src/hooks/useGlobalFeatures.ts +++ b/apps/vben5/packages/@abp/core/src/hooks/useGlobalFeatures.ts @@ -4,10 +4,13 @@ import { useAbpStore } from '../store/abp'; import { isNullOrWhiteSpace } from '../utils/string'; export function useGlobalFeatures() { + const abpStore = useAbpStore(); const getGlobalFeatures = computed(() => { - const abpStore = useAbpStore(); + if (!abpStore.application) { + return []; + } const enabledFeatures = - abpStore.application?.globalFeatures.enabledFeatures ?? []; + abpStore.application.globalFeatures.enabledFeatures ?? []; return enabledFeatures; }); diff --git a/apps/vben5/packages/@abp/core/src/hooks/useSettings.ts b/apps/vben5/packages/@abp/core/src/hooks/useSettings.ts index 12bfcb17c..cca3d77e2 100644 --- a/apps/vben5/packages/@abp/core/src/hooks/useSettings.ts +++ b/apps/vben5/packages/@abp/core/src/hooks/useSettings.ts @@ -1,37 +1,47 @@ import type { ISettingProvider, SettingValue } from '../types/settings'; -import { computed } from 'vue'; +import { ref, watch } from 'vue'; import { useAbpStore } from '../store'; export function useSettings(): ISettingProvider { const abpStore = useAbpStore(); - const getSettings = computed(() => { - if (!abpStore.application) { - return []; - } - const { values: settings } = abpStore.application.setting; - const settingValues = Object.keys(settings).map((key): SettingValue => { - return { - name: key, - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - value: settings[key]!, - }; - }); - return settingValues; - }); + + const settings = ref([]); + + watch( + () => abpStore.application, + (application) => { + if (!application?.setting.values) { + settings.value = []; + return; + } + const settingsSet: SettingValue[] = []; + Object.keys(application.setting.values).forEach((name) => { + if (application.setting.values[name]) { + settingsSet.push({ + name, + value: application.setting.values[name], + }); + } + }); + settings.value = settingsSet; + }, + { + deep: true, + immediate: true, + }, + ); function get(name: string): SettingValue | undefined { - return getSettings.value.find((setting) => name === setting.name); + return settings.value.find((setting) => name === setting.name); } function getAll(...names: string[]): SettingValue[] { if (names) { - return getSettings.value.filter((setting) => - names.includes(setting.name), - ); + return settings.value.filter((setting) => names.includes(setting.name)); } - return getSettings.value; + return settings.value; } function getOrDefault(name: string, defaultValue: T): string | T { diff --git a/apps/vben5/packages/@abp/core/src/hooks/useSimpleStateCheck.ts b/apps/vben5/packages/@abp/core/src/hooks/useSimpleStateCheck.ts index df2a94c70..68f811602 100644 --- a/apps/vben5/packages/@abp/core/src/hooks/useSimpleStateCheck.ts +++ b/apps/vben5/packages/@abp/core/src/hooks/useSimpleStateCheck.ts @@ -128,8 +128,6 @@ class SimpleStateCheckerSerializer implements ISimpleStateCheckerSerializer { export function useSimpleStateCheck< TState extends IHasSimpleStateCheckers, ->() { - return { - serializer: new SimpleStateCheckerSerializer(), - }; +>(): ISimpleStateCheckerSerializer { + return new SimpleStateCheckerSerializer(); } diff --git a/apps/vben5/packages/@abp/core/src/hooks/useValidation.ts b/apps/vben5/packages/@abp/core/src/hooks/useValidation.ts index 8a04e63e7..afb24569e 100644 --- a/apps/vben5/packages/@abp/core/src/hooks/useValidation.ts +++ b/apps/vben5/packages/@abp/core/src/hooks/useValidation.ts @@ -17,7 +17,7 @@ import { ValidationEnum } from '../constants'; import { isEmail, isPhone } from '../utils/regex'; import { useLocalization } from './useLocalization'; -export function useValidation() { +export function useValidation(): RuleCreator { const { L } = useLocalization(['AbpValidation']); function _getFieldName(field: Field) { return __getFieldName( @@ -399,7 +399,5 @@ export function useValidation() { }, }; - return { - ruleCreator, - }; + return ruleCreator; } diff --git a/apps/vben5/packages/@abp/identity/src/components/claim-types/ClaimTypeTable.vue b/apps/vben5/packages/@abp/identity/src/components/claim-types/ClaimTypeTable.vue index 752596e27..cd76be4cb 100644 --- a/apps/vben5/packages/@abp/identity/src/components/claim-types/ClaimTypeTable.vue +++ b/apps/vben5/packages/@abp/identity/src/components/claim-types/ClaimTypeTable.vue @@ -12,6 +12,7 @@ import { createIconifyIcon } from '@vben/icons'; import { $t } from '@vben/locales'; import { AuditLogPermissions, EntityChangeDrawer } from '@abp/auditing'; +import { useFeatures } from '@abp/core'; import { useVbenVxeGrid } from '@abp/ui'; import { DeleteOutlined, @@ -36,6 +37,7 @@ const CheckIcon = createIconifyIcon('ant-design:check-outlined'); const CloseIcon = createIconifyIcon('ant-design:close-outlined'); const AuditLogIcon = createIconifyIcon('fluent-mdl2:compliance-audit'); +const { isEnabled } = useFeatures(); const { hasAccessByCodes } = useAccess(); const { cancel, deleteApi, getPagedListApi } = useClaimTypesApi(); @@ -194,7 +196,7 @@ const onMenuClick = (row: IdentityClaimTypeDto, info: MenuInfo) => { case 'entity-changes': { roleChangeDrawerApi.setData({ entityId: row.id, - entityTypeFullName: 'Volo.Abp.Identity.IdentityRole', + entityTypeFullName: 'Volo.Abp.Identity.IdentityClaimType', subject: row.name, }); roleChangeDrawerApi.open(); @@ -249,7 +251,7 @@ const onMenuClick = (row: IdentityClaimTypeDto, info: MenuInfo) => { > {{ $t('AbpUi.Delete') }} - +