diff --git a/Directory.Packages.props b/Directory.Packages.props
index a402f01450..6842c542ce 100644
--- a/Directory.Packages.props
+++ b/Directory.Packages.props
@@ -6,7 +6,7 @@
-
+
@@ -114,11 +114,11 @@
-
-
-
-
-
+
+
+
+
+
diff --git a/framework/src/Volo.Abp.Autofac/Autofac/Extensions/DependencyInjection/AutofacRegistration.cs b/framework/src/Volo.Abp.Autofac/Autofac/Extensions/DependencyInjection/AutofacRegistration.cs
index 17fd94c467..7804cbbd98 100644
--- a/framework/src/Volo.Abp.Autofac/Autofac/Extensions/DependencyInjection/AutofacRegistration.cs
+++ b/framework/src/Volo.Abp.Autofac/Autofac/Extensions/DependencyInjection/AutofacRegistration.cs
@@ -298,32 +298,4 @@ public static class AutofacRegistration
.ConfigureLifecycle(descriptor.Lifetime, null);
}
}
-
- ///
- /// Normalizes the implementation instance data between keyed and not keyed services.
- ///
- ///
- /// The to normalize.
- ///
- ///
- /// The appropriate implementation instance from the service descriptor.
- ///
- public static object? NormalizedImplementationInstance(this ServiceDescriptor descriptor)
- {
- return !descriptor.IsKeyedService ? descriptor.ImplementationInstance : descriptor.KeyedImplementationInstance;
- }
-
- ///
- /// Normalizes the implementation type data between keyed and not keyed services.
- ///
- ///
- /// The to normalize.
- ///
- ///
- /// The appropriate implementation type from the service descriptor.
- ///
- public static Type? NormalizedImplementationType(this ServiceDescriptor descriptor)
- {
- return !descriptor.IsKeyedService ? descriptor.ImplementationType : descriptor.KeyedImplementationType;
- }
}
diff --git a/framework/src/Volo.Abp.Core/Microsoft/Extensions/DependencyInjection/ServiceCollectionCommonExtensions.cs b/framework/src/Volo.Abp.Core/Microsoft/Extensions/DependencyInjection/ServiceCollectionCommonExtensions.cs
index 7301b0b7a9..16f5ba9a86 100644
--- a/framework/src/Volo.Abp.Core/Microsoft/Extensions/DependencyInjection/ServiceCollectionCommonExtensions.cs
+++ b/framework/src/Volo.Abp.Core/Microsoft/Extensions/DependencyInjection/ServiceCollectionCommonExtensions.cs
@@ -28,7 +28,7 @@ public static class ServiceCollectionCommonExtensions
{
return (T?)services
.FirstOrDefault(d => d.ServiceType == typeof(T))
- ?.ImplementationInstance;
+ ?.NormalizedImplementationInstance();
}
public static T GetSingletonInstance(this IServiceCollection services)
@@ -48,7 +48,7 @@ public static class ServiceCollectionCommonExtensions
foreach (var service in services)
{
- var factoryInterface = service.ImplementationInstance?.GetType()
+ var factoryInterface = service.NormalizedImplementationInstance()?.GetType()
.GetTypeInfo()
.GetInterfaces()
.FirstOrDefault(i => i.GetTypeInfo().IsGenericType &&
diff --git a/framework/src/Volo.Abp.Core/Microsoft/Extensions/DependencyInjection/ServiceDescriptorExtensions.cs b/framework/src/Volo.Abp.Core/Microsoft/Extensions/DependencyInjection/ServiceDescriptorExtensions.cs
new file mode 100644
index 0000000000..1a160edb54
--- /dev/null
+++ b/framework/src/Volo.Abp.Core/Microsoft/Extensions/DependencyInjection/ServiceDescriptorExtensions.cs
@@ -0,0 +1,31 @@
+using System;
+
+namespace Microsoft.Extensions.DependencyInjection;
+
+///
+/// Extensions for working with .
+///
+public static class ServiceDescriptorExtensions
+{
+ ///
+ /// Normalizes the implementation instance data between keyed and not keyed services.
+ ///
+ ///
+ /// The to normalize.
+ ///
+ ///
+ /// The appropriate implementation instance from the service descriptor.
+ ///
+ public static object? NormalizedImplementationInstance(this ServiceDescriptor descriptor) => descriptor.IsKeyedService ? descriptor.KeyedImplementationInstance : descriptor.ImplementationInstance;
+
+ ///
+ /// Normalizes the implementation type data between keyed and not keyed services.
+ ///
+ ///
+ /// The to normalize.
+ ///
+ ///
+ /// The appropriate implementation type from the service descriptor.
+ ///
+ public static Type? NormalizedImplementationType(this ServiceDescriptor descriptor) => descriptor.IsKeyedService ? descriptor.KeyedImplementationType : descriptor.ImplementationType;
+}
diff --git a/framework/src/Volo.Abp.Core/Microsoft/Extensions/DependencyInjection/ServiceProviderKeyedServiceExtensions.cs b/framework/src/Volo.Abp.Core/Microsoft/Extensions/DependencyInjection/ServiceProviderKeyedServiceExtensions.cs
new file mode 100644
index 0000000000..f31923f68c
--- /dev/null
+++ b/framework/src/Volo.Abp.Core/Microsoft/Extensions/DependencyInjection/ServiceProviderKeyedServiceExtensions.cs
@@ -0,0 +1,19 @@
+using System;
+using Volo.Abp;
+
+namespace Microsoft.Extensions.DependencyInjection;
+
+public static class ServiceProviderKeyedServiceExtensions
+{
+ public static object? GetKeyedService(this IServiceProvider provider, Type serviceType, object? serviceKey)
+ {
+ Check.NotNull(provider, nameof(provider));
+
+ if (provider is IKeyedServiceProvider keyedServiceProvider)
+ {
+ return keyedServiceProvider.GetKeyedService(serviceType, serviceKey);
+ }
+
+ throw new InvalidOperationException("This service provider doesn't support keyed services.");
+ }
+}
diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/CachedServiceProviderBase.cs b/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/CachedServiceProviderBase.cs
index 5e8d9d251a..770355428e 100644
--- a/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/CachedServiceProviderBase.cs
+++ b/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/CachedServiceProviderBase.cs
@@ -1,28 +1,29 @@
using System;
using System.Collections.Concurrent;
+using Microsoft.Extensions.DependencyInjection;
namespace Volo.Abp.DependencyInjection;
public abstract class CachedServiceProviderBase : ICachedServiceProviderBase
{
protected IServiceProvider ServiceProvider { get; }
- protected ConcurrentDictionary> CachedServices { get; }
+ protected ConcurrentDictionary> CachedServices { get; }
protected CachedServiceProviderBase(IServiceProvider serviceProvider)
{
ServiceProvider = serviceProvider;
- CachedServices = new ConcurrentDictionary>();
- CachedServices.TryAdd(typeof(IServiceProvider), new Lazy
+{{ 'AbpFeatureManagement::Menu:FeatureManagement' | abpLocalization }}
+
+
+{{ 'AbpFeatureManagement::ManageHostFeaturesText' | abpLocalization }}
diff --git a/npm/ng-packs/packages/feature-management/src/lib/components/feature-management/feature-management.component.html b/npm/ng-packs/packages/feature-management/src/lib/components/feature-management/feature-management.component.html
index 2e4e28fea8..a3324960e0 100644
--- a/npm/ng-packs/packages/feature-management/src/lib/components/feature-management/feature-management.component.html
+++ b/npm/ng-packs/packages/feature-management/src/lib/components/feature-management/feature-management.component.html
@@ -107,7 +107,7 @@
{{ description }}
-
+
@@ -117,9 +117,14 @@
+
+
-
-
-
+
{{ 'AbpIdentity::Cancel' | abpLocalization }}
{{
diff --git a/npm/ng-packs/packages/permission-management/src/lib/components/permission-management.component.html b/npm/ng-packs/packages/permission-management/src/lib/components/permission-management.component.html
index 581a5bd002..384070d2e7 100644
--- a/npm/ng-packs/packages/permission-management/src/lib/components/permission-management.component.html
+++ b/npm/ng-packs/packages/permission-management/src/lib/components/permission-management.component.html
@@ -95,7 +95,7 @@
-
+
{{ 'AbpIdentity::Cancel' | abpLocalization }}
{{
diff --git a/npm/ng-packs/packages/schematics/src/commands/change-theme/index.ts b/npm/ng-packs/packages/schematics/src/commands/change-theme/index.ts
index f524f705fa..f922288f31 100644
--- a/npm/ng-packs/packages/schematics/src/commands/change-theme/index.ts
+++ b/npm/ng-packs/packages/schematics/src/commands/change-theme/index.ts
@@ -24,6 +24,7 @@ export default function (_options: ChangeThemeOptions): Rule {
return async () => {
const targetThemeName = _options.name;
const selectedProject = _options.targetProject;
+
if (!targetThemeName) {
throw new SchematicsException('The theme name does not selected');
}
diff --git a/npm/ng-packs/packages/schematics/src/commands/change-theme/style-map.ts b/npm/ng-packs/packages/schematics/src/commands/change-theme/style-map.ts
index a0db18aaf2..0b9f724e57 100644
--- a/npm/ng-packs/packages/schematics/src/commands/change-theme/style-map.ts
+++ b/npm/ng-packs/packages/schematics/src/commands/change-theme/style-map.ts
@@ -191,6 +191,11 @@ styleMap.set(ThemeOptionsEnum.LeptonX, [
inject: false,
bundleName: 'abp-bundle.rtl',
},
+ {
+ input: 'node_modules/bootstrap-icons/font/bootstrap-icons.css',
+ inject: true,
+ bundleName: 'bootstrap-icons',
+ },
]);
styleMap.set(ThemeOptionsEnum.LeptonXLite, [
{
@@ -243,6 +248,11 @@ styleMap.set(ThemeOptionsEnum.LeptonXLite, [
inject: false,
bundleName: 'abp-bundle.rtl',
},
+ {
+ input: 'node_modules/bootstrap-icons/font/bootstrap-icons.css',
+ inject: true,
+ bundleName: 'bootstrap-icons',
+ },
]);
// the code written by Github co-pilot. thank go-pilot. You are the best sidekick.
export const allStyles = Array.from(styleMap.values()).reduce((acc, val) => [...acc, ...val], []);
diff --git a/npm/ng-packs/packages/setting-management/config/src/lib/components/email-setting-group/email-setting-group.component.html b/npm/ng-packs/packages/setting-management/config/src/lib/components/email-setting-group/email-setting-group.component.html
index 3ab5623492..72ff2b37d1 100644
--- a/npm/ng-packs/packages/setting-management/config/src/lib/components/email-setting-group/email-setting-group.component.html
+++ b/npm/ng-packs/packages/setting-management/config/src/lib/components/email-setting-group/email-setting-group.component.html
@@ -1,14 +1,8 @@
{{ 'AbpSettingManagement::Menu:Emailing' | abpLocalization }}
-
+
-