Browse Source

Merge pull request #18818 from abpframework/auto-merge/rel-8-0/2436

Merge branch dev with rel-8.0
pull/18836/head
maliming 3 years ago
committed by GitHub
parent
commit
276c9f66a6
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 28
      framework/src/Volo.Abp.Autofac/Autofac/Extensions/DependencyInjection/AutofacRegistration.cs
  2. 4
      framework/src/Volo.Abp.Core/Microsoft/Extensions/DependencyInjection/ServiceCollectionCommonExtensions.cs
  3. 31
      framework/src/Volo.Abp.Core/Microsoft/Extensions/DependencyInjection/ServiceDescriptorExtensions.cs
  4. 19
      framework/src/Volo.Abp.Core/Microsoft/Extensions/DependencyInjection/ServiceProviderKeyedServiceExtensions.cs
  5. 31
      framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/CachedServiceProviderBase.cs
  6. 7
      framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/ICachedServiceProviderBase.cs
  7. 8
      framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/IRootServiceProviderAccessor.cs
  8. 15
      framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/RootServiceProvider.cs
  9. 54
      framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/ServiceIdentifier.cs
  10. 38
      framework/test/Volo.Abp.Core.Tests/Volo/Abp/DependencyInjection/CachedServiceProvider_Tests.cs
  11. 2
      modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/cs.json
  12. 2
      modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/en-GB.json
  13. 2
      modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/en.json
  14. 2
      modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/es.json
  15. 2
      modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/fi.json
  16. 2
      modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/fr.json
  17. 2
      modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/hr.json
  18. 2
      modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/hu.json
  19. 2
      modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/it.json
  20. 2
      modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/nl.json
  21. 2
      modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/pl-PL.json
  22. 2
      modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/ro-RO.json
  23. 2
      modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/ru.json
  24. 2
      modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/sk.json
  25. 2
      modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/sl.json
  26. 2
      modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/tr.json
  27. 6
      modules/openiddict/app/angular/angular.json
  28. 6
      npm/ng-packs/apps/dev-app/project.json
  29. 2
      npm/ng-packs/packages/account/src/lib/components/reset-password/reset-password.component.html
  30. 4
      npm/ng-packs/packages/components/tree/src/lib/components/tree.component.scss
  31. 7
      npm/ng-packs/packages/feature-management/src/lib/components/feature-management-tab/feature-management-tab.component.html
  32. 10
      npm/ng-packs/packages/feature-management/src/lib/components/feature-management/feature-management.component.html
  33. 2
      npm/ng-packs/packages/identity/src/lib/components/roles/roles.component.html
  34. 2
      npm/ng-packs/packages/identity/src/lib/components/users/users.component.html
  35. 2
      npm/ng-packs/packages/permission-management/src/lib/components/permission-management.component.html
  36. 1
      npm/ng-packs/packages/schematics/src/commands/change-theme/index.ts
  37. 10
      npm/ng-packs/packages/schematics/src/commands/change-theme/style-map.ts
  38. 16
      npm/ng-packs/packages/setting-management/config/src/lib/components/email-setting-group/email-setting-group.component.html
  39. 2
      npm/ng-packs/packages/tenant-management/src/lib/components/tenants/tenants.component.html
  40. 2
      npm/ng-packs/packages/theme-basic/src/lib/components/account-layout/tenant-box/tenant-box.component.html
  41. 4
      npm/ng-packs/packages/theme-shared/src/lib/components/confirmation/confirmation.component.html
  42. 17
      npm/ng-packs/packages/theme-shared/src/lib/components/confirmation/confirmation.component.scss
  43. 6
      templates/app-nolayers/angular/angular.json
  44. 6
      templates/app/angular/angular.json

28
framework/src/Volo.Abp.Autofac/Autofac/Extensions/DependencyInjection/AutofacRegistration.cs

@ -298,32 +298,4 @@ public static class AutofacRegistration
.ConfigureLifecycle(descriptor.Lifetime, null);
}
}
/// <summary>
/// Normalizes the implementation instance data between keyed and not keyed services.
/// </summary>
/// <param name="descriptor">
/// The <see cref="T:Microsoft.Extensions.DependencyInjection.ServiceDescriptor" /> to normalize.
/// </param>
/// <returns>
/// The appropriate implementation instance from the service descriptor.
/// </returns>
public static object? NormalizedImplementationInstance(this ServiceDescriptor descriptor)
{
return !descriptor.IsKeyedService ? descriptor.ImplementationInstance : descriptor.KeyedImplementationInstance;
}
/// <summary>
/// Normalizes the implementation type data between keyed and not keyed services.
/// </summary>
/// <param name="descriptor">
/// The <see cref="T:Microsoft.Extensions.DependencyInjection.ServiceDescriptor" /> to normalize.
/// </param>
/// <returns>
/// The appropriate implementation type from the service descriptor.
/// </returns>
public static Type? NormalizedImplementationType(this ServiceDescriptor descriptor)
{
return !descriptor.IsKeyedService ? descriptor.ImplementationType : descriptor.KeyedImplementationType;
}
}

4
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<T>(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 &&

31
framework/src/Volo.Abp.Core/Microsoft/Extensions/DependencyInjection/ServiceDescriptorExtensions.cs

@ -0,0 +1,31 @@
using System;
namespace Microsoft.Extensions.DependencyInjection;
/// <summary>
/// Extensions for working with <see cref="ServiceDescriptor"/>.
/// </summary>
public static class ServiceDescriptorExtensions
{
/// <summary>
/// Normalizes the implementation instance data between keyed and not keyed services.
/// </summary>
/// <param name="descriptor">
/// The <see cref="ServiceDescriptor"/> to normalize.
/// </param>
/// <returns>
/// The appropriate implementation instance from the service descriptor.
/// </returns>
public static object? NormalizedImplementationInstance(this ServiceDescriptor descriptor) => descriptor.IsKeyedService ? descriptor.KeyedImplementationInstance : descriptor.ImplementationInstance;
/// <summary>
/// Normalizes the implementation type data between keyed and not keyed services.
/// </summary>
/// <param name="descriptor">
/// The <see cref="ServiceDescriptor"/> to normalize.
/// </param>
/// <returns>
/// The appropriate implementation type from the service descriptor.
/// </returns>
public static Type? NormalizedImplementationType(this ServiceDescriptor descriptor) => descriptor.IsKeyedService ? descriptor.KeyedImplementationType : descriptor.ImplementationType;
}

19
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.");
}
}

31
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<Type, Lazy<object?>> CachedServices { get; }
protected ConcurrentDictionary<ServiceIdentifier, Lazy<object?>> CachedServices { get; }
protected CachedServiceProviderBase(IServiceProvider serviceProvider)
{
ServiceProvider = serviceProvider;
CachedServices = new ConcurrentDictionary<Type, Lazy<object?>>();
CachedServices.TryAdd(typeof(IServiceProvider), new Lazy<object?>(() => ServiceProvider));
CachedServices = new ConcurrentDictionary<ServiceIdentifier, Lazy<object?>>();
CachedServices.TryAdd(new ServiceIdentifier(typeof(IServiceProvider)), new Lazy<object?>(() => ServiceProvider));
}
public virtual object? GetService(Type serviceType)
{
return CachedServices.GetOrAdd(
serviceType,
new ServiceIdentifier(serviceType),
_ => new Lazy<object?>(() => ServiceProvider.GetService(serviceType))
).Value;
}
public T GetService<T>(T defaultValue)
{
return (T)GetService(typeof(T), defaultValue!);
@ -37,12 +38,28 @@ public abstract class CachedServiceProviderBase : ICachedServiceProviderBase
{
return (T)GetService(typeof(T), factory);
}
public object GetService(Type serviceType, Func<IServiceProvider, object> factory)
{
return CachedServices.GetOrAdd(
serviceType,
new ServiceIdentifier(serviceType),
_ => new Lazy<object?>(() => factory(ServiceProvider))
).Value!;
}
public object? GetKeyedService(Type serviceType, object? serviceKey)
{
return CachedServices.GetOrAdd(
new ServiceIdentifier(serviceKey, serviceType),
_ => new Lazy<object?>(() => ServiceProvider.GetKeyedService(serviceType, serviceKey))
).Value;
}
public object GetRequiredKeyedService(Type serviceType, object? serviceKey)
{
return CachedServices.GetOrAdd(
new ServiceIdentifier(serviceKey, serviceType),
_ => new Lazy<object?>(() => ServiceProvider.GetRequiredKeyedService(serviceType, serviceKey))
).Value!;
}
}

7
framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/ICachedServiceProviderBase.cs

@ -1,14 +1,15 @@
using System;
using Microsoft.Extensions.DependencyInjection;
namespace Volo.Abp.DependencyInjection;
public interface ICachedServiceProviderBase : IServiceProvider
public interface ICachedServiceProviderBase : IKeyedServiceProvider
{
T GetService<T>(T defaultValue);
object GetService(Type serviceType, object defaultValue);
T GetService<T>(Func<IServiceProvider, object> factory);
object GetService(Type serviceType, Func<IServiceProvider, object> factory);
}
}

8
framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/IRootServiceProviderAccessor.cs

@ -1,4 +1,4 @@
using System;
using Microsoft.Extensions.DependencyInjection;
namespace Volo.Abp.DependencyInjection;
@ -8,7 +8,7 @@ namespace Volo.Abp.DependencyInjection;
/// to release/dispose objects resolved from the root service provider.
/// So, always create a new scope if you need to resolve any service.
/// </summary>
public interface IRootServiceProvider : IServiceProvider
public interface IRootServiceProvider : IKeyedServiceProvider
{
}
}

15
framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/RootServiceProvider.cs

@ -1,4 +1,5 @@
using System;
using Microsoft.Extensions.DependencyInjection;
namespace Volo.Abp.DependencyInjection;
@ -6,7 +7,7 @@ namespace Volo.Abp.DependencyInjection;
public class RootServiceProvider : IRootServiceProvider, ISingletonDependency
{
protected IServiceProvider ServiceProvider { get; }
public RootServiceProvider(IObjectAccessor<IServiceProvider> objectAccessor)
{
ServiceProvider = objectAccessor.Value!;
@ -16,4 +17,14 @@ public class RootServiceProvider : IRootServiceProvider, ISingletonDependency
{
return ServiceProvider.GetService(serviceType);
}
}
public object? GetKeyedService(Type serviceType, object? serviceKey)
{
return ServiceProvider.GetKeyedService(serviceType, serviceKey);
}
public virtual object GetRequiredKeyedService(Type serviceType, object? serviceKey)
{
return ServiceProvider.GetRequiredKeyedService(serviceType, serviceKey);
}
}

54
framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/ServiceIdentifier.cs

@ -0,0 +1,54 @@
using System;
namespace Volo.Abp.DependencyInjection;
/// <summary>
/// https://github.com/dotnet/runtime/blob/release/8.0/src/libraries/Microsoft.Extensions.DependencyInjection/src/ServiceLookup/ServiceIdentifier.cs#L9
/// </summary>
public readonly struct ServiceIdentifier : IEquatable<ServiceIdentifier>
{
public object? ServiceKey { get; }
public Type ServiceType { get; }
public ServiceIdentifier(Type serviceType)
{
ServiceType = serviceType;
}
public ServiceIdentifier(object? serviceKey, Type serviceType)
{
ServiceKey = serviceKey;
ServiceType = serviceType;
}
public bool Equals(ServiceIdentifier other)
{
if (ServiceKey == null && other.ServiceKey == null)
{
return ServiceType == other.ServiceType;
}
else if (ServiceKey != null && other.ServiceKey != null)
{
return ServiceType == other.ServiceType && ServiceKey.Equals(other.ServiceKey);
}
return false;
}
public override bool Equals(object? obj)
{
return obj is ServiceIdentifier && Equals((ServiceIdentifier)obj);
}
public override int GetHashCode()
{
if (ServiceKey == null)
{
return ServiceType.GetHashCode();
}
unchecked
{
return (ServiceType.GetHashCode() * 397) ^ ServiceKey.GetHashCode();
}
}
}

38
framework/test/Volo.Abp.Core.Tests/Volo/Abp/DependencyInjection/CachedServiceProvider_Tests.cs

@ -21,7 +21,11 @@ public class CachedServiceProvider_Tests
var transientTestService1 = cachedServiceProvider1.GetRequiredService<TransientTestService>();
var transientTestService2 = cachedServiceProvider2.GetRequiredService<TransientTestService>();
transientTestService1.ShouldBeSameAs(transientTestService2);
var transientKeyedTestService1 = cachedServiceProvider1.GetRequiredKeyedService<TransientKeyedTestService>("key1");
var transientKeyedTestService2 = cachedServiceProvider2.GetRequiredKeyedService<TransientKeyedTestService>("key1");
transientKeyedTestService1.ShouldBeSameAs(transientKeyedTestService2);
var cachedServiceProvider3 = cachedServiceProvider1.GetRequiredService<IServiceProvider>().GetRequiredService<ICachedServiceProvider>();
cachedServiceProvider3.ShouldBeSameAs(cachedServiceProvider1);
}
@ -36,18 +40,18 @@ public class CachedServiceProvider_Tests
var testCounter = scope1.ServiceProvider.GetRequiredService<ITestCounter>();
testCounter.GetValue(nameof(TransientTestService)).ShouldBe(1);
}
using (var scope2 = application.ServiceProvider.CreateScope())
{
TestResolvingServices(scope2);
var testCounter = scope2.ServiceProvider.GetRequiredService<ITestCounter>();
//Resolved in a different scope, so should not cache the service!
testCounter.GetValue(nameof(TransientTestService)).ShouldBe(2);
}
}
}
[Fact]
public void TransientCachedServiceProvider_Should_Cache_Services()
{
@ -58,15 +62,26 @@ public class CachedServiceProvider_Tests
var transientTestService1_1 = transientCachedServiceProvider1.GetRequiredService<TransientTestService>();
var transientTestService1_2 = transientCachedServiceProvider1.GetRequiredService<TransientTestService>();
transientTestService1_1.ShouldBeSameAs(transientTestService1_2);
var transientKeyedTestService1 = transientCachedServiceProvider1.GetRequiredKeyedService<TransientKeyedTestService>("key1");
var transientKeyedTestService2 = transientCachedServiceProvider1.GetRequiredKeyedService<TransientKeyedTestService>("key1");
transientKeyedTestService1.ShouldBeSameAs(transientKeyedTestService2);
var transientKeyedTestService3 = transientCachedServiceProvider1.GetRequiredKeyedService<TransientKeyedTestService>("key2");
transientKeyedTestService2.ShouldNotBeSameAs(transientKeyedTestService3);
var transientCachedServiceProvider2 = scope.ServiceProvider.GetRequiredService<ITransientCachedServiceProvider>();
transientCachedServiceProvider1.ShouldNotBeSameAs(transientCachedServiceProvider2);
var transientTestService2_1 = transientCachedServiceProvider2.GetRequiredService<TransientTestService>();
var transientTestService2_2 = transientCachedServiceProvider2.GetRequiredService<TransientTestService>();
transientTestService2_1.ShouldBeSameAs(transientTestService2_2);
var transientKeyedTestService1_1 = transientCachedServiceProvider2.GetRequiredKeyedService<TransientKeyedTestService>("key1");
var transientKeyedTestService2_1 = transientCachedServiceProvider2.GetRequiredKeyedService<TransientKeyedTestService>("key1");
transientKeyedTestService1_1.ShouldBeSameAs(transientKeyedTestService2_1);
transientTestService1_1.ShouldNotBeSameAs(transientTestService2_1);
transientKeyedTestService1.ShouldNotBeSameAs(transientKeyedTestService1_1);
var transientCachedServiceProvider1_1 = transientCachedServiceProvider1.GetRequiredService<IServiceProvider>().GetRequiredService<ITransientCachedServiceProvider>();
var transientCachedServiceProvider1_2 = transientCachedServiceProvider1.GetRequiredService<IServiceProvider>().GetRequiredService<ITransientCachedServiceProvider>();
@ -87,7 +102,7 @@ public class CachedServiceProvider_Tests
}
}
}
[DependsOn(typeof(AbpTestBaseModule))]
private class TestModule : AbpModule
{
@ -99,6 +114,8 @@ public class CachedServiceProvider_Tests
public override void ConfigureServices(ServiceConfigurationContext context)
{
context.Services.AddType<TransientTestService>();
context.Services.AddKeyedTransient<TransientKeyedTestService>("key1");
context.Services.AddKeyedTransient<TransientKeyedTestService>("key2");
}
}
@ -109,4 +126,9 @@ public class CachedServiceProvider_Tests
counter.Increment(nameof(TransientTestService));
}
}
}
private class TransientKeyedTestService
{
}
}

2
modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/cs.json

@ -8,7 +8,7 @@
"Surname": "Příjmení",
"EmailAddress": "Email",
"PhoneNumber": "Telefonní číslo",
"UserInformations": "Uživatelské informace",
"UserInformations": "Uživatelské Informace",
"DisplayName:IsDefault": "Výchozí",
"DisplayName:IsStatic": "Statické",
"DisplayName:IsPublic": "Veřejné",

2
modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/en-GB.json

@ -8,7 +8,7 @@
"Surname": "Surname",
"EmailAddress": "Email address",
"PhoneNumber": "Phone number",
"UserInformations": "User information",
"UserInformations": "User Information",
"DisplayName:IsDefault": "Default",
"DisplayName:IsStatic": "Static",
"DisplayName:IsPublic": "Public",

2
modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/en.json

@ -8,7 +8,7 @@
"Surname":"Surname",
"EmailAddress": "Email address",
"PhoneNumber": "Phone number",
"UserInformations": "User information",
"UserInformations": "User Information",
"DisplayName:IsDefault": "Default",
"DisplayName:IsStatic": "Static",
"DisplayName:IsPublic": "Public",

2
modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/es.json

@ -8,7 +8,7 @@
"Surname": "Apellido",
"EmailAddress": "Dirección e-mail",
"PhoneNumber": "Número de teléfono",
"UserInformations": "Información de usuario",
"UserInformations": "Información de Usuario",
"DisplayName:IsDefault": "Predeterminado",
"DisplayName:IsStatic": "Estático",
"DisplayName:IsPublic": "Público",

2
modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/fi.json

@ -8,7 +8,7 @@
"Surname": "Sukunimi",
"EmailAddress": "Sähköpostiosoite",
"PhoneNumber": "Puhelinnumero",
"UserInformations": "Käyttäjän tiedot",
"UserInformations": "Käyttäjän Tiedot",
"DisplayName:IsDefault": "Oletus",
"DisplayName:IsStatic": "Staattinen",
"DisplayName:IsPublic": "Julkinen",

2
modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/fr.json

@ -8,7 +8,7 @@
"Surname": "Nom",
"EmailAddress": "Adresse e-mail",
"PhoneNumber": "Numéro de téléphone",
"UserInformations": "Informations utilisateur",
"UserInformations": "Informations Utilisateur",
"DisplayName:IsDefault": "Par défaut",
"DisplayName:IsStatic": "Statique",
"DisplayName:IsPublic": "Public",

2
modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/hr.json

@ -8,7 +8,7 @@
"Surname": "Prezime",
"EmailAddress": "Email adresa",
"PhoneNumber": "Broj telefona",
"UserInformations": "Informacije o korisniku",
"UserInformations": "Informacije o Korisniku",
"DisplayName:IsDefault": "Zadano",
"DisplayName:IsStatic": "Je statično",
"DisplayName:IsPublic": "Je javno",

2
modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/hu.json

@ -8,7 +8,7 @@
"Surname": "Vezetéknév",
"EmailAddress": "Email cím",
"PhoneNumber": "Telefonszám",
"UserInformations": "Felhasználói információ",
"UserInformations": "Felhasználói Információ",
"DisplayName:IsDefault": "Alapértelmezett",
"DisplayName:IsStatic": "Statikus",
"DisplayName:IsPublic": "Publikus",

2
modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/it.json

@ -8,7 +8,7 @@
"Surname": "Cognome",
"EmailAddress": "Indirizzo e-mail",
"PhoneNumber": "Numero di telefono",
"UserInformations": "Informazioni utente",
"UserInformations": "Informazioni Utente",
"DisplayName:IsDefault": "Predefinito",
"DisplayName:IsStatic": "Statico",
"DisplayName:IsPublic": "Pubblico",

2
modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/nl.json

@ -8,7 +8,7 @@
"Surname": "Achternaam",
"EmailAddress": "E-mail adres",
"PhoneNumber": "Telefoonnummer",
"UserInformations": "Gebruikers informatie",
"UserInformations": "Gebruikers Informatie",
"DisplayName:IsDefault": "Standaard",
"DisplayName:IsStatic": "Statisch",
"DisplayName:IsPublic": "Openbaar",

2
modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/pl-PL.json

@ -8,7 +8,7 @@
"Surname": "Nazwisko",
"EmailAddress": "Adres email",
"PhoneNumber": "Numer telefonu",
"UserInformations": "Notyfikacje użytkownika",
"UserInformations": "Notyfikacje Użytkownika",
"DisplayName:IsDefault": "Domyślny",
"DisplayName:IsStatic": "Statyczny",
"DisplayName:IsPublic": "Publiczny",

2
modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/ro-RO.json

@ -8,7 +8,7 @@
"Surname": "Nume",
"EmailAddress": "Adresa de email",
"PhoneNumber": "Număr de telefon",
"UserInformations": "Informaţii de utilizator",
"UserInformations": "Informaţii de Utilizator",
"DisplayName:IsDefault": "Implicit",
"DisplayName:IsStatic": "Static",
"DisplayName:IsPublic": "Public",

2
modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/ru.json

@ -8,7 +8,7 @@
"Surname": "Фамилия",
"EmailAddress": "Адрес электронной почты",
"PhoneNumber": "Номер телефона",
"UserInformations": "Информация о пользователе",
"UserInformations": "Информация о Пользователе",
"DisplayName:IsDefault": "По умолчанию",
"DisplayName:IsStatic": "Статичная",
"DisplayName:IsPublic": "Доступно",

2
modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/sk.json

@ -8,7 +8,7 @@
"Surname": "Priezvisko",
"EmailAddress": "Emailová adresa",
"PhoneNumber": "Telefónne číslo",
"UserInformations": "Informácie o používateľovi",
"UserInformations": "Informácie o Používateľovi",
"DisplayName:IsDefault": "Predvolený",
"DisplayName:IsStatic": "Statický",
"DisplayName:IsPublic": "Verejný",

2
modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/sl.json

@ -8,7 +8,7 @@
"Surname": "Priimek",
"EmailAddress": "E-poštni naslov",
"PhoneNumber": "Telefonska številka",
"UserInformations": "Informacije o uporabniku",
"UserInformations": "Informacije o Uporabniku",
"DisplayName:IsDefault": "Privzeto",
"DisplayName:IsStatic": "Statično",
"DisplayName:IsPublic": "Javno",

2
modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/tr.json

@ -8,7 +8,7 @@
"Surname": "Soyadı",
"EmailAddress": "E-posta adresi",
"PhoneNumber": "Telefon numarası",
"UserInformations": "Kullanıcı bilgileri",
"UserInformations": "Kullanıcı Bilgileri",
"DisplayName:IsDefault": "Varsayılan",
"DisplayName:IsStatic": "Sabit",
"DisplayName:IsPublic": "Herkese Açık",

6
modules/openiddict/app/angular/angular.json

@ -105,7 +105,11 @@
"inject": false,
"bundleName": "abp-bundle.rtl"
},
"node_modules/bootstrap-icons/font/bootstrap-icons.css",
{
"input": "node_modules/bootstrap-icons/font/bootstrap-icons.css",
"inject": true,
"bundleName": "bootstrap-icons"
},
"src/styles.scss"
],
"scripts": []

6
npm/ng-packs/apps/dev-app/project.json

@ -108,7 +108,11 @@
"inject": false,
"bundleName": "ng-zorro-antd-tree"
},
"node_modules/bootstrap-icons/font/bootstrap-icons.css",
{
"input": "node_modules/bootstrap-icons/font/bootstrap-icons.css",
"inject": true,
"bundleName": "bootstrap-icons"
},
"apps/dev-app/src/styles.scss"
],
"scripts": []

2
npm/ng-packs/packages/account/src/lib/components/reset-password/reset-password.component.html

@ -27,7 +27,7 @@
formControlName="confirmPassword"
/>
</div>
<button class="me-2 btn btn-secondary" type="button" routerLink="/account/login">
<button class="me-2 btn btn-outline-primary" type="button" routerLink="/account/login">
{{ 'AbpAccount::Cancel' | abpLocalization }}
</button>
<abp-button

4
npm/ng-packs/packages/components/tree/src/lib/components/tree.component.scss

@ -43,4 +43,8 @@ abp-tree .ant-tree {
top: 1px;
cursor: pointer;
}
.ant-tree-checkbox-inner{
background-color: transparent;
}
}

7
npm/ng-packs/packages/feature-management/src/lib/components/feature-management-tab/feature-management-tab.component.html

@ -1,7 +1,10 @@
<p class="text-wrap">{{ 'AbpFeatureManagement::ManageHostFeaturesText' | abpLocalization }}</p>
<h2>{{ 'AbpFeatureManagement::Menu:FeatureManagement' | abpLocalization }}</h2>
<hr class="my-2" />
<p class="pt-2 text-wrap">{{ 'AbpFeatureManagement::ManageHostFeaturesText' | abpLocalization }}</p>
<button class="btn btn-primary" type="button" (click)="openFeaturesModal()">
<i class="fa fa-cog" aria-hidden="true"></i>
<i class="me-1 fa fa-cog" aria-hidden="true"></i>
{{ 'AbpFeatureManagement::ManageHostFeatures' | abpLocalization }}
</button>
<ng-container *ngIf="visibleFeatures">

10
npm/ng-packs/packages/feature-management/src/lib/components/feature-management/feature-management.component.html

@ -107,7 +107,7 @@
<small *ngIf="description" class="d-block form-text text-muted">{{ description }}</small>
</ng-template>
<div class="col-md-8"><div [ngbNavOutlet]="nav"></div></div>
<div class="col-md-8"><div class="py-0" [ngbNavOutlet]="nav"></div></div>
</ng-container>
<div class="col" *ngIf="!groups.length">
@ -117,9 +117,14 @@
</ng-template>
<ng-template #abpFooter>
<button abpClose type="button" class="btn btn-link">
{{ 'AbpFeatureManagement::Cancel' | abpLocalization }}
</button>
<abp-button
*ngIf="groups.length"
iconClass="fa fa-refresh"
buttonClass="btn btn-outline-primary"
[disabled]="modalBusy"
(click)="resetToDefault()"
aria-hidden="true"
@ -127,9 +132,6 @@
{{ 'AbpFeatureManagement::ResetToDefault' | abpLocalization }}
</abp-button>
<button abpClose type="button" class="btn btn-secondary">
{{ 'AbpFeatureManagement::Cancel' | abpLocalization }}
</button>
<abp-button
*ngIf="groups.length"
iconClass="fa fa-check"

2
npm/ng-packs/packages/identity/src/lib/components/roles/roles.component.html

@ -21,7 +21,7 @@
</ng-template>
<ng-template #abpFooter>
<button type="button" class="btn btn-secondary" abpClose>
<button type="button" class="btn btn-outline-primary" abpClose>
{{ 'AbpIdentity::Cancel' | abpLocalization }}
</button>
<abp-button iconClass="fa fa-check" [disabled]="form?.invalid" (click)="save()">{{

2
npm/ng-packs/packages/identity/src/lib/components/users/users.component.html

@ -69,7 +69,7 @@
</ng-template>
<ng-template #abpFooter>
<button type="button" class="btn btn-secondary" abpClose>
<button type="button" class="btn btn-outline-primary" abpClose>
{{ 'AbpIdentity::Cancel' | abpLocalization }}
</button>
<abp-button iconClass="fa fa-check" [disabled]="form?.invalid" (click)="save()">{{

2
npm/ng-packs/packages/permission-management/src/lib/components/permission-management.component.html

@ -95,7 +95,7 @@
</div>
</ng-template>
<ng-template #abpFooter>
<button type="button" class="btn btn-secondary" abpClose>
<button type="button" class="btn btn-outline-primary" abpClose>
{{ 'AbpIdentity::Cancel' | abpLocalization }}
</button>
<abp-button iconClass="fa fa-check" (click)="submit()">{{

1
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');
}

10
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], []);

16
npm/ng-packs/packages/setting-management/config/src/lib/components/email-setting-group/email-setting-group.component.html

@ -1,14 +1,8 @@
<h2>{{ 'AbpSettingManagement::Menu:Emailing' | abpLocalization }}</h2>
<hr class="my-3" />
<hr class="my-2" />
<form
*ngIf="form"
[formGroup]="form"
class="abp-md-form"
(ngSubmit)="submit()"
[validateOnSubmit]="true"
>
<form *ngIf="form" [formGroup]="form" class="py-2 abp-md-form" (ngSubmit)="submit()" [validateOnSubmit]="true">
<div class="mb-3 form-group">
<label class="form-label"
>{{ 'AbpSettingManagement::DefaultFromDisplayName' | abpLocalization
@ -73,7 +67,7 @@
<input type="text" class="form-control" formControlName="smtpUserName" />
</div>
<div class="mb-3 form-group">
<div class="form-group">
<label class="form-label">{{ 'AbpSettingManagement::SmtpPassword' | abpLocalization }}</label>
<input type="password" class="form-control" formControlName="smtpPassword" />
</div>
@ -81,9 +75,9 @@
<hr />
<button type="submit" class="btn btn-primary">
<abp-button buttonType="submit" iconClass="fa fa-save">
{{ 'AbpSettingManagement::Save' | abpLocalization }}
</button>
</abp-button>
<button
*abpPermission="emailingPolicy"
type="button"

2
npm/ng-packs/packages/tenant-management/src/lib/components/tenants/tenants.component.html

@ -39,7 +39,7 @@
</ng-template>
<ng-template #abpFooter>
<button abpClose type="button" class="btn btn-secondary">
<button abpClose type="button" class="btn btn-outline-primary">
{{ 'AbpTenantManagement::Cancel' | abpLocalization }}
</button>
<abp-button iconClass="fa fa-check" (click)="save()" [disabled]="tenantForm?.invalid">{{

2
npm/ng-packs/packages/theme-basic/src/lib/components/account-layout/tenant-box/tenant-box.component.html

@ -49,7 +49,7 @@
</form>
</ng-template>
<ng-template #abpFooter>
<button abpClose type="button" class="btn btn-secondary">
<button abpClose type="button" class="btn btn-outline-primary">
{{ 'AbpTenantManagement::Cancel' | abpLocalization }}
</button>
<abp-button

4
npm/ng-packs/packages/theme-shared/src/lib/components/confirmation/confirmation.component.html

@ -25,14 +25,14 @@
<div class="footer">
<button
id="cancel"
class="confirmation-button confirmation-button--reject"
class="btn btn-outline-primary me-2"
[innerHTML]="data.options?.cancelText || 'AbpUi::Cancel' | abpLocalization"
*ngIf="!data?.options?.hideCancelBtn"
(click)="close(reject)"
></button>
<button
id="confirm"
class="confirmation-button confirmation-button--approve"
class="btn btn-primary"
[innerHTML]="data.options?.yesText || 'AbpUi::Yes' | abpLocalization"
*ngIf="!data?.options?.hideYesBtn"
(click)="close(confirm)"

17
npm/ng-packs/packages/theme-shared/src/lib/components/confirmation/confirmation.component.scss

@ -31,8 +31,7 @@
display: flex;
align-items: center;
justify-content: center;
margin: 0 0 10px 0;
padding: 20px;
padding: 40px 20px 10px;
.icon {
width: 100px;
height: 100px;
@ -54,29 +53,19 @@
}
.message {
display: block;
margin: 10px auto;
padding: 20px;
padding: 8px 20px 20px 20px;
font-size: 16px;
font-weight: 400;
text-align: center;
margin-bottom: 0;
}
}
.footer {
display: flex;
align-items: center;
justify-content: flex-end;
margin: 10px 0 0 0;
padding: 20px;
width: 100%;
.confirmation-button {
display: inline-block;
margin: 0px 5px;
padding: 10px 20px;
border: none;
border-radius: 6px;
font-size: 14px;
font-weight: 600;
}
}
}
}

6
templates/app-nolayers/angular/angular.json

@ -105,7 +105,11 @@
"inject": false,
"bundleName": "abp-bundle.rtl"
},
"node_modules/bootstrap-icons/font/bootstrap-icons.css",
{
"input": "node_modules/bootstrap-icons/font/bootstrap-icons.css",
"inject": true,
"bundleName": "bootstrap-icons"
},
"src/styles.scss"
],
"scripts": []

6
templates/app/angular/angular.json

@ -105,7 +105,11 @@
"inject": false,
"bundleName": "abp-bundle.rtl"
},
"node_modules/bootstrap-icons/font/bootstrap-icons.css",
{
"input": "node_modules/bootstrap-icons/font/bootstrap-icons.css",
"inject": true,
"bundleName": "bootstrap-icons"
},
"src/styles.scss"
],
"scripts": []

Loading…
Cancel
Save