diff --git a/Directory.Packages.props b/Directory.Packages.props
index 39cdffbe87..07eaa65740 100644
--- a/Directory.Packages.props
+++ b/Directory.Packages.props
@@ -3,187 +3,187 @@
true
-
+
-
-
+
+
-
+
-
-
+
+
-
-
-
-
-
-
+
+
+
+
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
-
+
+
+
-
+
-
-
+
+
-
+
-
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
+
+
+
+
+
-
-
-
+
+
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
-
-
-
-
+
+
+
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
-
+
-
-
-
+
+
+
-
-
-
-
+
+
+
+
-
+
-
+
-
-
-
-
-
+
+
+
+
+
-
-
-
-
+
+
+
+
-
+
diff --git a/docs/en/framework/architecture/modularity/extending/module-entity-extensions.md b/docs/en/framework/architecture/modularity/extending/module-entity-extensions.md
index 8a5b50652e..ac041895d7 100644
--- a/docs/en/framework/architecture/modularity/extending/module-entity-extensions.md
+++ b/docs/en/framework/architecture/modularity/extending/module-entity-extensions.md
@@ -151,6 +151,17 @@ property =>
> Tip: Use `DefaultValueFactory` option only if the default value may change over the time (like `DateTime.Now` in this example). If it is a constant value, then use the `DefaultValue` option.
+### DataTypeAttribute
+
+`DataTypeAttribute` is used to specify the type of the property. It is used to determine how to render the property on the user interface:
+
+```csharp
+property =>
+{
+ property.Attributes.Add(new DataTypeAttribute(DataType.Date));
+}
+```
+
### Validation
Entity extension system allows you to define validation for extension properties in a few ways.
diff --git a/docs/en/framework/data/entity-framework-core/index.md b/docs/en/framework/data/entity-framework-core/index.md
index 293e58daad..a50edb2d4a 100644
--- a/docs/en/framework/data/entity-framework-core/index.md
+++ b/docs/en/framework/data/entity-framework-core/index.md
@@ -755,7 +755,17 @@ public static class QADbContextModelCreatingExtensions
> The `Object Extension` feature need the `Change Tracking`, which means you can't use the read-only repositories for the entities that have `extension properties(MapEfCoreProperty)`, Please see the [Repositories documentation](../../architecture/domain-driven-design/repositories.md) to learn the change tracking behavior.
-See the "*ConfigureByConvention Method*" section above for more information.
+See the **ConfigureByConvention Method** section above for more information.
+
+### Accessing Extra Properties(Shadow Properties)
+
+Extra properties stored in separate fields in the database are known as **Shadow Properties**. These properties are not defined in the entity class, but are part of the EF Core model and can be referenced in LINQ queries using the EF.Property static method
+
+```csharp
+var query = (await GetQueryableAsync()).Where(x => EF.Property(x, "Title") == "MyTitle");
+```
+
+See the [EF Core Shadow and Indexer Properties document](https://learn.microsoft.com/en-us/ef/core/modeling/shadow-properties) for more information.
## Advanced Topics
diff --git a/docs/en/framework/fundamentals/localization.md b/docs/en/framework/fundamentals/localization.md
index 61118fd742..6e8a3f678a 100644
--- a/docs/en/framework/fundamentals/localization.md
+++ b/docs/en/framework/fundamentals/localization.md
@@ -248,6 +248,17 @@ namespace MyProject
The `L` property is also available for some other base classes like `AbpController` and `AbpPageModel`.
+## Supported Languages
+
+You can configure the `AbpLocalizationOptions`'s `Languages` property to add the languages supported by the application. The template already sets common languages, but you can add new languages as shown below:
+
+```csharp
+Configure(options =>
+{
+ options.Languages.Add(new LanguageInfo("uz", "uz", "Uzbek"));
+});
+```
+
## The Client Side
See the following documents to learn how to reuse the same localization texts in the JavaScript side;
diff --git a/docs/en/framework/ui/maui/index.md b/docs/en/framework/ui/maui/index.md
index 573278a060..28f74aa6a3 100644
--- a/docs/en/framework/ui/maui/index.md
+++ b/docs/en/framework/ui/maui/index.md
@@ -37,10 +37,15 @@ Open a command line terminal and run the `adb reverse` command to expose a port
`adb reverse tcp:44305 tcp:44305`
-> You should replace "44305" with the real port.
-> You should run the command after starting the emulator.
+> Replace `44305` with the port number your backend application is running on.
+>
+> Run this command **after** the Android emulator has started.
-> If you don't have a separate installation of Android Debug Bridge, you can open it from **Visual Studio** by following toolbar menu `Tools` > `Android` > `Android Adb Command Prompt`. Android emulator has to be running for this operation.
+> [!IMPORTANT]
+> If your project uses a **tiered** or **microservice** architecture, ensure that both the **auth server** and all **remote service ports** are properly proxied using the `adb reverse` command. You can find all the required remote service ports and AuthServer configurations in your `YourProjectName.Maui/appsettings.json` file.
+
+> [!NOTE]
+> If you don't have a separate installation of **Android Debug Bridge** _(adb)_, you can open it from **Visual Studio** by following toolbar menu `Tools` > `Android` > `Android Adb Command Prompt`. Android emulator has to be running for this operation.
### iOS
diff --git a/docs/en/framework/ui/mvc-razor-pages/customization-user-interface.md b/docs/en/framework/ui/mvc-razor-pages/customization-user-interface.md
index bc3b7d8fc2..c279f685c0 100644
--- a/docs/en/framework/ui/mvc-razor-pages/customization-user-interface.md
+++ b/docs/en/framework/ui/mvc-razor-pages/customization-user-interface.md
@@ -89,7 +89,10 @@ This example overrides the **login page** defined by the [Account Module](../../
Create a page model class deriving from the ` LoginModel ` (defined in the ` Volo.Abp.Account.Web.Pages.Account ` namespace):
+> If you are using the `AbpAccountWebOpenIddictModule` or `AbpAccountPublicWebOpenIddictModule`, the base class is `OpenIddictSupportedLoginModel` instead of `LoginModel`. And you should change the `ExposeServices` attribute to `[ExposeServices(typeof (MyLoginModel), typeof(OpenIddictSupportedLoginModel), typeof(LoginModel))]`
+
````csharp
+[ExposeServices(typeof (MyLoginModel), typeof(LoginModel))]
public class MyLoginModel : LoginModel
{
public MyLoginModel(
@@ -114,8 +117,6 @@ public class MyLoginModel : LoginModel
You can override any method or add new properties/methods if needed.
-> Notice that we didn't use `[Dependency(ReplaceServices = true)]` or `[ExposeServices(typeof(LoginModel))]` since we don't want to replace the existing class in the dependency injection, we define a new one.
-
Copy `Login.cshtml` file into your solution as just described above. Change the **@model** directive to point to the `MyLoginModel`:
````xml
diff --git a/docs/en/modules/cms-kit-pro/url-forwarding.md b/docs/en/modules/cms-kit-pro/url-forwarding.md
index a059ef1305..10ca0a7f98 100644
--- a/docs/en/modules/cms-kit-pro/url-forwarding.md
+++ b/docs/en/modules/cms-kit-pro/url-forwarding.md
@@ -37,6 +37,20 @@ You can create new forwardings or update/delete existing ones, in the admin side

+
+## Options
+
+### ShortenedUrlCacheOptions
+
+`ShortenedUrlCacheOptions` is used to configure the cache settings for the URL forwarding system. Example:
+
+```csharp
+Configure(options =>
+{
+ options.CacheAllOnStartup = true; // Cache all shortened URLs on startup
+});
+```
+
# Internals
## Domain Layer
diff --git a/docs/en/modules/language-management.md b/docs/en/modules/language-management.md
index 77490f28ef..3bce0d46b0 100644
--- a/docs/en/modules/language-management.md
+++ b/docs/en/modules/language-management.md
@@ -62,7 +62,7 @@ This module adds some initial data (see [the data seed system](../framework/infr
* Creates language records configured using `AbpLocalizationOptions`.
-If you want to change the seeded language list, see the next section.
+If you want to change the seeded language list, see the [Localization](../framework/fundamentals/localization.md#Supported-Languages) document.
## Internals
diff --git a/docs/en/release-info/migration-guides/abp-8-2.md b/docs/en/release-info/migration-guides/abp-8-2.md
index 15de922d4f..5f811da2d4 100644
--- a/docs/en/release-info/migration-guides/abp-8-2.md
+++ b/docs/en/release-info/migration-guides/abp-8-2.md
@@ -28,6 +28,7 @@ With this version on, ABP Framework allows you to use single blog mode, without
* `Volo.Blogging.Pages.Members` -> `Volo.Blogging.Pages.Blogs.Members` (members folder)
> If you haven't overridden the pages above, then you don't need to make any additional changes. See [#19418](https://github.com/abpframework/abp/pull/19418) for more information.
+
## Removed `FlagIcon` property from the `ILanguageInfo`
The `FlagIcon` property has been removed from the `ILanguageInfo` interface since we removed the flag icon library in the earlier versions from all of our themes and none of them using it now.
@@ -57,11 +58,20 @@ In this version, the Angular UI has been updated to use the Angular version 17.3
The **Session Management** feature allows you to prevent concurrent login and manage user sessions.
-In this version, a new entity called `IdentitySession` has been added to the framework and you should create a new migration and apply it to your database.
+In this version, a new entity called `IdentitySession` has been added to the framework and you need to add new `DbSet` to your `DbContext` class if it implements `IIdentityDbContext` interface.
+
+```csharp
+public class YourDbContext : AbpDbContext, IIdentityDbContext
+{
+ public DbSet Sessions { get; set; }
+}
+```
+
+You should also create a new migration and apply it to your database.
## Upgraded NuGet Dependencies
-You can see the following list of NuGet libraries that have been upgraded with this release, if you are using one of these packages explicitly, you may consider upgrading them in your solution:
+You can see the following list of NuGet libraries that have been upgraded with this release, **if you are using one of these packages explicitly**, you may consider upgrading them in your solution, especially **Microsoft.IdentityModel.*** packages:
| Package | Old Version | New Version |
| ---------------------------------------------------------- | ----------- | ----------- |
diff --git a/docs/en/tutorials/microservice/part-06.md b/docs/en/tutorials/microservice/part-06.md
index 18db56cc0b..1cc19bf6d8 100644
--- a/docs/en/tutorials/microservice/part-06.md
+++ b/docs/en/tutorials/microservice/part-06.md
@@ -107,9 +107,9 @@ public class ProductIntegrationService : ApplicationService, IProductIntegration
Now that we have created the `IProductIntegrationService` interface and the `ProductIntegrationService` class, we can consume this service from the Ordering service.
-### Adding a Reference to the `CloudCrm.CatalogService.Contracts` Package
+### Adding a Reference to the `CloudCrm.OrderingService` Package
-First, we need to add a reference to the `CloudCrm.CatalogService.Contracts` package in the Ordering service. Open the ABP Studio, and stop the application(s) if it is running. Then, open the *Solution Explorer* and right-click on the `CloudCrm.OrderingService` package. Select *Add* -> *Package Reference* command:
+First, we need to add a reference to the `CloudCrm.OrderingService` package in the Ordering service. Open the ABP Studio, and stop the application(s) if it is running. Then, open the *Solution Explorer* and right-click on the `CloudCrm.OrderingService` package. Select *Add* -> *Package Reference* command:

diff --git a/docs/en/tutorials/todo/layered/index.md b/docs/en/tutorials/todo/layered/index.md
index e6e310a39a..86a480ad42 100644
--- a/docs/en/tutorials/todo/layered/index.md
+++ b/docs/en/tutorials/todo/layered/index.md
@@ -528,7 +528,7 @@ The interesting part here is how we communicate with the server. See the *Dynami
### Index.css
-As the final touch, Create a file named `Index.css` in the `Pages` folder of the *TodoApp.Web* project and replace it with the following content:
+As the final touch, Create a file named `Index.css` in the `Pages` folder of the *TodoApp.Web* project and add the following content:
```css
#TodoList{
@@ -664,7 +664,7 @@ Open the `Index.razor` file in the `Pages` folder of the {{if UI=="Blazor" || UI
### Index.razor.css
-As the final touch, open the `Index.razor.css` file in the `Pages` folder of the {{if UI=="Blazor" || UI=="BlazorWebApp"}}*TodoApp.Blazor.Client*{{else if UI=="BlazorServer"}} *TodoApp.Blazor* {{else if UI=="MAUIBlazor"}} *TodoApp.MauiBlazor* {{end}} project and replace it with the following content:
+As the final touch, open the `Index.razor.css` file in the `Pages` folder of the {{if UI=="Blazor" || UI=="BlazorWebApp"}}*TodoApp.Blazor.Client*{{else if UI=="BlazorServer"}} *TodoApp.Blazor* {{else if UI=="MAUIBlazor"}} *TodoApp.MauiBlazor* {{end}} project and add the following content:
```css
#TodoList{
@@ -827,7 +827,7 @@ Open the `/angular/src/app/home/home.component.html` file and replace its conten
### home.component.scss
-As the final touch, open the `/angular/src/app/home/home.component.scss` file and replace its content with the following code block:
+As the final touch, open the `/angular/src/app/home/home.component.scss` file and add the following code block:
```css
#TodoList{
diff --git a/docs/en/tutorials/todo/single-layer/index.md b/docs/en/tutorials/todo/single-layer/index.md
index dc865a0a75..6ce5bec5b0 100644
--- a/docs/en/tutorials/todo/single-layer/index.md
+++ b/docs/en/tutorials/todo/single-layer/index.md
@@ -309,10 +309,8 @@ public interface ITodoAppService : IApplicationService
Create a `TodoAppService` class under the `Services` folder of {{if UI=="Blazor"}}your `TodoApp.Host` project{{else}}your project{{end}}, as shown below:
```csharp
-using TodoApp.Services;
using TodoApp.Services.Dtos;
using TodoApp.Entities;
-using Volo.Abp.Application.Services;
using Volo.Abp.Domain.Repositories;
namespace TodoApp.Services;
@@ -517,7 +515,7 @@ The interesting part here is how we communicate with the server. See the *Dynami
### Index.cshtml.css
-As for the final touch, open the `Index.cshtml.css` file in the `Pages` folder and replace with the following content:
+As for the final touch, open the `Index.cshtml.css` file in the `Pages` folder and add the following code block at the end of the file:
````css
#TodoList{
@@ -655,7 +653,7 @@ Open the `Index.razor` file in the `Pages` folder and replace the content with t
### Index.razor.css
-As the final touch, open the `Index.razor.css` file in the `Pages` folder and replace it with the following content:
+As the final touch, open the `Index.razor.css` file in the `Pages` folder and add the following code block at the end of the file:
````css
#TodoList{
@@ -801,7 +799,7 @@ Open the `/angular/src/app/home/home.component.html` file and replace its conten
### home.component.scss
-As the final touch, open the `/angular/src/app/home/home.component.scss` file and replace its content with the following code block:
+As the final touch, open the `/angular/src/app/home/home.component.scss` file and add the following code block at the end of the file:
````css
#TodoList{
diff --git a/docs/en/ui-themes/lepton-x/images/account-layout-background-style.png b/docs/en/ui-themes/lepton-x/images/account-layout-background-style.png
new file mode 100644
index 0000000000..5b2f32661d
Binary files /dev/null and b/docs/en/ui-themes/lepton-x/images/account-layout-background-style.png differ
diff --git a/docs/en/ui-themes/lepton-x/mvc.md b/docs/en/ui-themes/lepton-x/mvc.md
index 683306adfe..e41d12a331 100644
--- a/docs/en/ui-themes/lepton-x/mvc.md
+++ b/docs/en/ui-themes/lepton-x/mvc.md
@@ -47,7 +47,8 @@ Before starting to customize the theme, you can consider downloading the source
---
### Appearance
-You can set a default theme, add or remove appearance styles by using **LeptonXThemeOptions**.
+
+You can set a default theme, add or remove appearance styles and layout background styles by using **LeptonXThemeOptions**.
- `DefaultStyle`: Defines the default fallback theme. The default value is **Dim**
@@ -133,15 +134,26 @@ Layout options of the MVC Razor Pages UI can be manageable by using **LeptonXThe
- `MobileMenuSelector`: Defines items to be displayed at the mobile menu. The default value is the first 2 items from the main menu items.
+ ```csharp
+ Configure(options =>
+ {
+ options.MobileMenuSelector = items => items.Where(x => x.MenuItem.Name == "MyProjectName.Home" || x.MenuItem.Name == "MyProjectName.Dashboard");
+ });
+ ```
+

+- `AccountLayoutBackgroundStyle`: Defines the background style of the account layout.
+
```csharp
Configure(options =>
{
- options.MobileMenuSelector = items => items.Where(x => x.MenuItem.Name == "MyProjectName.Home" || x.MenuItem.Name == "MyProjectName.Dashboard");
+ options.AccountLayoutBackgroundStyle = "background-image: url('/images/login-background-image.svg') !important;";
});
```
+ 
+
### Layouts
**LeptonX** offers two **ready-made layouts** for your web application. One of them is **placed** with the **menu items** on the **top** and the other with the **menu items** on the **sides**.
diff --git a/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Theming/DefaultThemeManager.cs b/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Theming/DefaultThemeManager.cs
index 5abd114f83..76c7bbf556 100644
--- a/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Theming/DefaultThemeManager.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Theming/DefaultThemeManager.cs
@@ -29,6 +29,6 @@ public class DefaultThemeManager : IThemeManager, IScopedDependency, IServicePro
}
_currentTheme = (ITheme)ServiceProvider.GetRequiredService(ThemeSelector.GetCurrentThemeInfo().ThemeType);
- return CurrentTheme;
+ return _currentTheme;
}
}
diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/AbpApplicationConfigurationAppService.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/AbpApplicationConfigurationAppService.cs
index 8dfa51768d..73edea9fdf 100644
--- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/AbpApplicationConfigurationAppService.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/AbpApplicationConfigurationAppService.cs
@@ -313,17 +313,42 @@ public class AbpApplicationConfigurationAppService : ApplicationService, IAbpApp
{
var timeZone = await _settingProvider.GetOrNullAsync(TimingSettingNames.TimeZone);
+ string? timeZoneId = null;
+ string? timeZoneName = null;
+ if (!timeZone.IsNullOrWhiteSpace())
+ {
+ try
+ {
+ if (_timezoneProvider.GetIanaTimezones().Any(x => x.Value == timeZone))
+ {
+ timeZoneId = _timezoneProvider.IanaToWindows(timeZone);
+ timeZoneName = timeZone;
+ }
+ else if (_timezoneProvider.GetWindowsTimezones().Any(x => x.Value == timeZone))
+ {
+ timeZoneId = timeZone;
+ timeZoneName = _timezoneProvider.WindowsToIana(timeZone);
+ }
+ }
+ catch (Exception ex)
+ {
+ timeZoneId = null;
+ timeZoneName = null;
+ Logger.LogWarning(ex, $"Exception occurred while getting timezone({timeZone}) information");
+ }
+ }
+
return new TimingDto
{
TimeZone = new TimeZone
{
Windows = new WindowsTimeZone
{
- TimeZoneId = timeZone.IsNullOrWhiteSpace() ? null : _timezoneProvider.IanaToWindows(timeZone)
+ TimeZoneId = timeZoneId
},
Iana = new IanaTimeZone
{
- TimeZoneName = timeZone
+ TimeZoneName = timeZoneName
}
}
};
diff --git a/framework/src/Volo.Abp.Caching/Volo/Abp/Caching/AbpCachingModule.cs b/framework/src/Volo.Abp.Caching/Volo/Abp/Caching/AbpCachingModule.cs
index de5f60ee4e..632bfa416e 100644
--- a/framework/src/Volo.Abp.Caching/Volo/Abp/Caching/AbpCachingModule.cs
+++ b/framework/src/Volo.Abp.Caching/Volo/Abp/Caching/AbpCachingModule.cs
@@ -1,7 +1,5 @@
using Microsoft.Extensions.DependencyInjection;
using System;
-using Microsoft.Extensions.Caching.Hybrid;
-using Microsoft.Extensions.DependencyInjection.Extensions;
using Volo.Abp.Caching.Hybrid;
using Volo.Abp.Json;
using Volo.Abp.Modularity;
diff --git a/framework/src/Volo.Abp.Caching/Volo/Abp/Caching/Hybrid/AbpHybridCache.cs b/framework/src/Volo.Abp.Caching/Volo/Abp/Caching/Hybrid/AbpHybridCache.cs
index 2894af9f3d..66506a0b56 100644
--- a/framework/src/Volo.Abp.Caching/Volo/Abp/Caching/Hybrid/AbpHybridCache.cs
+++ b/framework/src/Volo.Abp.Caching/Volo/Abp/Caching/Hybrid/AbpHybridCache.cs
@@ -75,7 +75,7 @@ public class AbpHybridCache : IHybridCache : IHybridCache>.Instance;
KeyNormalizer = keyNormalizer;
@@ -215,10 +215,15 @@ public class AbpHybridCache : IHybridCache(bytes, 0, bytes.Length));;
+ // Because HybridCache wraps the cache in L2(distributed cache), we can’t unwrap it directly and can only retrieve the value through its API
+ return await HybridCache.GetOrCreateAsync(
+ key: NormalizeKey(key),
+ factory: async cancel => await factory(),
+ options: optionsFactory?.Invoke(),
+ tags: null,
+ cancellationToken: token);
}
value = await factory();
diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Bundling/PathHelper.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Bundling/PathHelper.cs
index 1618004bb5..4d3ff3ee77 100644
--- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Bundling/PathHelper.cs
+++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Bundling/PathHelper.cs
@@ -20,8 +20,9 @@ static internal class PathHelper
static internal string GetMauiBlazorAssemblyFilePath(string directory, string projectFileName)
{
- return Directory.GetFiles(directory, "*.dll", SearchOption.AllDirectories).FirstOrDefault(f =>
+ return Directory.GetFiles(Path.Combine(directory, "bin"), "*.dll", SearchOption.AllDirectories).FirstOrDefault(f =>
!f.Contains("android") &&
+ !f.Contains("windows10") &&
f.EndsWith(projectFileName + ".dll", StringComparison.OrdinalIgnoreCase));
}
diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/AbpEntityChangeOptions.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/AbpEntityChangeOptions.cs
index a42b921068..2c705a01fd 100644
--- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/AbpEntityChangeOptions.cs
+++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/AbpEntityChangeOptions.cs
@@ -10,8 +10,18 @@ public class AbpEntityChangeOptions
public IEntitySelectorList IgnoredNavigationEntitySelectors { get; set; }
+ ///
+ /// Default: true.
+ /// Update the aggregate root when any navigation property changes.
+ /// Some properties like ConcurrencyStamp,LastModificationTime,LastModifierId etc. will be updated.
+ ///
+ public bool UpdateAggregateRootWhenNavigationChanges { get; set; } = true;
+
+ public IEntitySelectorList IgnoredUpdateAggregateRootSelectors { get; set; }
+
public AbpEntityChangeOptions()
{
IgnoredNavigationEntitySelectors = new EntitySelectorList();
+ IgnoredUpdateAggregateRootSelectors = new EntitySelectorList();
}
}
diff --git a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpDbContext.cs b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpDbContext.cs
index 626daf0bb4..e91d08b8c9 100644
--- a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpDbContext.cs
+++ b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpDbContext.cs
@@ -274,7 +274,9 @@ public abstract class AbpDbContext : DbContext, IAbpEfCoreDbContext,
continue;
}
- if (entityEntry.State == EntityState.Unchanged)
+ if (EntityChangeOptions.Value.UpdateAggregateRootWhenNavigationChanges &&
+ EntityChangeOptions.Value.IgnoredUpdateAggregateRootSelectors.All(selector => !selector.Predicate(entityEntry.Entity.GetType())) &&
+ entityEntry.State == EntityState.Unchanged)
{
ApplyAbpConceptsForModifiedEntity(entityEntry, true);
}
@@ -446,7 +448,12 @@ public abstract class AbpDbContext : DbContext, IAbpEfCoreDbContext,
EntityChangeOptions.Value.IgnoredNavigationEntitySelectors.All(selector => !selector.Predicate(entry.Entity.GetType())) &&
AbpEfCoreNavigationHelper.IsNavigationEntryModified(entry))
{
- ApplyAbpConceptsForModifiedEntity(entry, true);
+ if (EntityChangeOptions.Value.UpdateAggregateRootWhenNavigationChanges &&
+ EntityChangeOptions.Value.IgnoredUpdateAggregateRootSelectors.All(selector => !selector.Predicate(entry.Entity.GetType())))
+ {
+ ApplyAbpConceptsForModifiedEntity(entry, true);
+ }
+
if (entry.Entity is ISoftDelete && entry.Entity.As().IsDeleted)
{
EntityChangeEventHelper.PublishEntityDeletedEvent(entry.Entity);
@@ -478,11 +485,13 @@ public abstract class AbpDbContext : DbContext, IAbpEfCoreDbContext,
}
}
- if (EntityChangeOptions.Value.PublishEntityUpdatedEventWhenNavigationChanges)
+ if (EntityChangeOptions.Value.PublishEntityUpdatedEventWhenNavigationChanges &&
+ EntityChangeOptions.Value.UpdateAggregateRootWhenNavigationChanges)
{
foreach (var entry in AbpEfCoreNavigationHelper.GetChangedEntityEntries()
.Where(x => x.State == EntityState.Unchanged)
- .Where(x=> EntityChangeOptions.Value.IgnoredNavigationEntitySelectors.All(selector => !selector.Predicate(x.Entity.GetType()))))
+ .Where(x => EntityChangeOptions.Value.IgnoredNavigationEntitySelectors.All(selector => !selector.Predicate(x.Entity.GetType())))
+ .Where(x => EntityChangeOptions.Value.IgnoredUpdateAggregateRootSelectors.All(selector => !selector.Predicate(x.Entity.GetType()))))
{
UpdateConcurrencyStamp(entry);
}
diff --git a/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/DomainEvents/DomainEvents_Tests.cs b/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/DomainEvents/DomainEvents_Tests.cs
index d82fb195ab..6249d588f5 100644
--- a/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/DomainEvents/DomainEvents_Tests.cs
+++ b/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/DomainEvents/DomainEvents_Tests.cs
@@ -396,3 +396,134 @@ public class AbpEfCoreDomainEvents_Tests : EntityFrameworkCoreTestBase
entityUpdatedEventTriggered.ShouldBeTrue();
}
}
+
+
+public abstract class AbpEfCoreDomainEvents_Disable_UpdateAggregateRoot_Tests : EntityFrameworkCoreTestBase
+{
+ protected readonly IRepository AppEntityWithNavigationsRepository;
+ protected readonly IRepository AppEntityWithNavigationForeignRepository;
+ protected readonly ILocalEventBus LocalEventBus;
+
+ protected AbpEfCoreDomainEvents_Disable_UpdateAggregateRoot_Tests()
+ {
+ AppEntityWithNavigationsRepository = GetRequiredService>();
+ AppEntityWithNavigationForeignRepository = GetRequiredService>();
+ LocalEventBus = GetRequiredService();
+ }
+
+ protected override void AfterAddApplication(IServiceCollection services)
+ {
+ services.Configure(options =>
+ {
+ options.PublishEntityUpdatedEventWhenNavigationChanges = true;
+ options.UpdateAggregateRootWhenNavigationChanges = false;
+ });
+
+ base.AfterAddApplication(services);
+ }
+
+ [Fact]
+ public async Task Should_Trigger_Domain_Events_But_Do_Not_Change_Aggregate_Root_When_Navigation_Changes_Tests()
+ {
+ var entityId = Guid.NewGuid();
+
+ var newEntity = await AppEntityWithNavigationsRepository.InsertAsync(new AppEntityWithNavigations(entityId, "TestEntity"));
+
+ var latestConcurrencyStamp = newEntity.ConcurrencyStamp;
+ var lastModificationTime = newEntity.LastModificationTime;
+
+ var entityUpdatedEventTriggered = false;
+
+ LocalEventBus.Subscribe>(data =>
+ {
+ entityUpdatedEventTriggered = true;
+
+ // The Aggregate will not be updated
+ data.Entity.ConcurrencyStamp.ShouldBe(latestConcurrencyStamp);
+ data.Entity.LastModificationTime.ShouldBe(lastModificationTime);
+ return Task.CompletedTask;
+ });
+
+ // Test with value object
+ entityUpdatedEventTriggered = false;
+ await WithUnitOfWorkAsync(async () =>
+ {
+ var entity = await AppEntityWithNavigationsRepository.GetAsync(entityId);
+ entity.AppEntityWithValueObjectAddress = new AppEntityWithValueObjectAddress("Turkey");
+ await AppEntityWithNavigationsRepository.UpdateAsync(entity);
+ });
+ entityUpdatedEventTriggered.ShouldBeTrue();
+
+ // Test with one to one
+ entityUpdatedEventTriggered = false;
+ await WithUnitOfWorkAsync(async () =>
+ {
+ var entity = await AppEntityWithNavigationsRepository.GetAsync(entityId);
+ entity.OneToOne = new AppEntityWithNavigationChildOneToOne
+ {
+ ChildName = "ChildName"
+ };
+ await AppEntityWithNavigationsRepository.UpdateAsync(entity);
+ });
+ entityUpdatedEventTriggered.ShouldBeTrue();
+
+ // Test with one to many
+ entityUpdatedEventTriggered = false;
+ await WithUnitOfWorkAsync(async () =>
+ {
+ var entity = await AppEntityWithNavigationsRepository.GetAsync(entityId);
+ entity.OneToMany = new List()
+ {
+ new AppEntityWithNavigationChildOneToMany
+ {
+ AppEntityWithNavigationId = entity.Id,
+ ChildName = "ChildName1"
+ }
+ };
+ await AppEntityWithNavigationsRepository.UpdateAsync(entity);
+ });
+ entityUpdatedEventTriggered.ShouldBeTrue();
+
+ // Test with many to many
+ entityUpdatedEventTriggered = false;
+ await WithUnitOfWorkAsync(async () =>
+ {
+ var entity = await AppEntityWithNavigationsRepository.GetAsync(entityId);
+ entity.ManyToMany = new List()
+ {
+ new AppEntityWithNavigationChildManyToMany
+ {
+ ChildName = "ChildName1"
+ }
+ };
+ await AppEntityWithNavigationsRepository.UpdateAsync(entity);
+ });
+ entityUpdatedEventTriggered.ShouldBeTrue();
+ }
+}
+
+public class AbpEfCoreDomainEvents_UpdateAggregateRootWhenNavigationChanges_Tests : AbpEfCoreDomainEvents_Disable_UpdateAggregateRoot_Tests
+{
+ protected override void AfterAddApplication(IServiceCollection services)
+ {
+ services.Configure(options =>
+ {
+ options.UpdateAggregateRootWhenNavigationChanges = false;
+ });
+
+ base.AfterAddApplication(services);
+ }
+}
+
+public class AbpEfCoreDomainEvents_IgnoredUpdateAggregateRootSelectors_Test : AbpEfCoreDomainEvents_Disable_UpdateAggregateRoot_Tests
+{
+ protected override void AfterAddApplication(IServiceCollection services)
+ {
+ services.Configure(options =>
+ {
+ options.IgnoredUpdateAggregateRootSelectors.Add("AppEntityWithValueObjectAddress", x => x == typeof(AppEntityWithNavigations));
+ });
+
+ base.AfterAddApplication(services);
+ }
+}
diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/ar.json b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/ar.json
index 52de9ea37a..30f4b647e8 100644
--- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/ar.json
+++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/ar.json
@@ -7,6 +7,7 @@
"SelectAllInAllTabs": "منح كافة الأذونات",
"SelectAllInThisTab": "تحديد الكل",
"SaveWithoutAnyPermissionsWarningMessage": "هل أنت متأكد أنك تريد الحفظ بدون أي أذونات؟",
- "PermissionGroup": "مجموعة الأذونات"
+ "PermissionGroup": "مجموعة الأذونات",
+ "Filter": "تصفية"
}
}
\ No newline at end of file
diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/cs.json b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/cs.json
index c0e38b9320..814b8e423c 100644
--- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/cs.json
+++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/cs.json
@@ -7,6 +7,7 @@
"SelectAllInAllTabs": "Dát veškerá oprávnění",
"SelectAllInThisTab": "Vybrat vše",
"SaveWithoutAnyPermissionsWarningMessage": "Opravdu chcete ukládat bez jakýchkoli oprávnění?",
- "PermissionGroup": "Skupina oprávnění"
+ "PermissionGroup": "Skupina oprávnění",
+ "Filter": "Filtr"
}
}
\ No newline at end of file
diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/de.json b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/de.json
index a2bb5fe72a..7a40c5d4d4 100644
--- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/de.json
+++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/de.json
@@ -7,6 +7,7 @@
"SelectAllInAllTabs": "Alle Berechtigungen erteilen",
"SelectAllInThisTab": "Alle auswählen",
"SaveWithoutAnyPermissionsWarningMessage": "Sind Sie sicher, dass Sie ohne Berechtigungen speichern möchten?",
- "PermissionGroup": "Berechtigungsgruppe"
+ "PermissionGroup": "Berechtigungsgruppe",
+ "Filter": "Filtern"
}
}
\ No newline at end of file
diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/el.json b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/el.json
index bc2c96db04..3449b7fab6 100644
--- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/el.json
+++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/el.json
@@ -7,6 +7,7 @@
"SelectAllInAllTabs": "Χορήγηση όλων των δικαιώματων",
"SelectAllInThisTab": "Επιλογή όλων",
"SaveWithoutAnyPermissionsWarningMessage": "Είστε βέβαιοι ότι θέλετε να αποθηκεύσετε χωρίς δικαιώματα;",
- "PermissionGroup": "Ομάδα δικαιωμάτων"
+ "PermissionGroup": "Ομάδα δικαιωμάτων",
+ "Filter": "Φίλτρο"
}
}
\ No newline at end of file
diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/en-GB.json b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/en-GB.json
index 62762d00a8..be6cbcd1f5 100644
--- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/en-GB.json
+++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/en-GB.json
@@ -7,6 +7,7 @@
"SelectAllInAllTabs": "Grant all permissions",
"SelectAllInThisTab": "Select all",
"SaveWithoutAnyPermissionsWarningMessage": "Are you sure you want to save without any permissions?",
- "PermissionGroup": "Permission Group"
+ "PermissionGroup": "Permission Group",
+ "Filter": "Filter"
}
}
\ No newline at end of file
diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/en.json b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/en.json
index 45aeb905e2..b8299d4e5b 100644
--- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/en.json
+++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/en.json
@@ -7,6 +7,7 @@
"SelectAllInAllTabs": "Grant all permissions",
"SelectAllInThisTab": "Select all",
"SaveWithoutAnyPermissionsWarningMessage": "Are you sure you want to save without any permissions?",
- "PermissionGroup": "Permission Group"
+ "PermissionGroup": "Permission Group",
+ "Filter": "Filter"
}
}
\ No newline at end of file
diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/es.json b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/es.json
index 610d86a2ff..622883b259 100644
--- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/es.json
+++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/es.json
@@ -7,6 +7,7 @@
"SelectAllInAllTabs": "Conceder todos los permisos",
"SelectAllInThisTab": "Seleccionar todo",
"SaveWithoutAnyPermissionsWarningMessage": "¿Estás seguro de que quieres guardar sin ningún permiso?",
- "PermissionGroup": "Grupo de permisos"
+ "PermissionGroup": "Grupo de permisos",
+ "Filter": "Filtrar"
}
}
diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/fa.json b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/fa.json
index 615ef79412..7ea9a6c4f3 100644
--- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/fa.json
+++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/fa.json
@@ -7,6 +7,7 @@
"SelectAllInAllTabs": "اعطای همه مجوزها",
"SelectAllInThisTab": "انتخاب همه",
"SaveWithoutAnyPermissionsWarningMessage": "آیا مطمئن هستید که می خواهید بدون هیچ دسترسی ذخیره کنید؟",
- "PermissionGroup": "گروه دسترسی"
+ "PermissionGroup": "گروه دسترسی",
+ "Filter": "فیلتر"
}
}
\ No newline at end of file
diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/fi.json b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/fi.json
index 2c24727ad5..f9b828ade4 100644
--- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/fi.json
+++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/fi.json
@@ -7,6 +7,7 @@
"SelectAllInAllTabs": "Myönnä kaikki käyttöoikeudet",
"SelectAllInThisTab": "Valitse kaikki",
"SaveWithoutAnyPermissionsWarningMessage": "Haluatko varmasti tallentaa ilman käyttöoikeuksia?",
- "PermissionGroup": "Käyttöoikeus"
+ "PermissionGroup": "Käyttöoikeus",
+ "Filter": "Suodatus"
}
}
\ No newline at end of file
diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/fr.json b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/fr.json
index b2676631a2..79f4e68377 100644
--- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/fr.json
+++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/fr.json
@@ -7,6 +7,7 @@
"SelectAllInAllTabs": "Accorder toutes les autorisations",
"SelectAllInThisTab": "Sélectionner tous les",
"SaveWithoutAnyPermissionsWarningMessage": "Êtes-vous sûr de vouloir enregistrer sans aucune autorisation ?",
- "PermissionGroup": "Groupe d'autorisations"
+ "PermissionGroup": "Groupe d'autorisations",
+ "Filter": "Filtrer"
}
}
\ No newline at end of file
diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/hi.json b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/hi.json
index fa271bc752..cdc030e8ef 100644
--- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/hi.json
+++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/hi.json
@@ -7,6 +7,7 @@
"SelectAllInAllTabs": "सभी अनुमतियां प्रदान करें",
"SelectAllInThisTab": "सभी का चयन करे",
"SaveWithoutAnyPermissionsWarningMessage": "क्या आप वाकई बिना किसी अनुमति के सहेजना चाहते हैं?",
- "PermissionGroup": "अनुमति समूह"
+ "PermissionGroup": "अनुमति समूह",
+ "Filter": "फ़िल्टर"
}
}
\ No newline at end of file
diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/hr.json b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/hr.json
index 45034a5bb6..531d0a35d2 100644
--- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/hr.json
+++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/hr.json
@@ -7,6 +7,7 @@
"SelectAllInAllTabs": "Dodijelite sva dopuštenja",
"SelectAllInThisTab": "Odaberi sve",
"SaveWithoutAnyPermissionsWarningMessage": "Jeste li sigurni da želite spremiti bez ikakvih dopuštenja?",
- "PermissionGroup": "Grupa dozvola"
+ "PermissionGroup": "Grupa dozvola",
+ "Filter": "Filtriraj"
}
}
diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/hu.json b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/hu.json
index fdb727bf2b..3177ef8fa7 100644
--- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/hu.json
+++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/hu.json
@@ -7,6 +7,7 @@
"SelectAllInAllTabs": "Adjon meg minden engedélyt",
"SelectAllInThisTab": "Mindet kiválaszt",
"SaveWithoutAnyPermissionsWarningMessage": "Biztos, hogy engedélyek nélkül akar menteni?",
- "PermissionGroup": "Engedélycsoport"
+ "PermissionGroup": "Engedélycsoport",
+ "Filter": "Szűrő"
}
}
\ No newline at end of file
diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/is.json b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/is.json
index 322e6b5580..7db32eb99e 100644
--- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/is.json
+++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/is.json
@@ -7,6 +7,7 @@
"SelectAllInAllTabs": "Veita allar heimildir",
"SelectAllInThisTab": "Velja allt",
"SaveWithoutAnyPermissionsWarningMessage": "Ertu viss um að þú viljir vista án nokkurra heimilda?",
- "PermissionGroup": "Heimildahópur"
+ "PermissionGroup": "Heimildahópur",
+ "Filter": "Sía"
}
}
\ No newline at end of file
diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/it.json b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/it.json
index 1312568b53..e473c7b310 100644
--- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/it.json
+++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/it.json
@@ -7,6 +7,7 @@
"SelectAllInAllTabs": "Concedi tutte le autorizzazioni",
"SelectAllInThisTab": "Seleziona tutto",
"SaveWithoutAnyPermissionsWarningMessage": "Sei sicuro di voler salvare senza alcuna autorizzazione?",
- "PermissionGroup": "Gruppo di autorizzazioni"
+ "PermissionGroup": "Gruppo di autorizzazioni",
+ "Filter": "Filtro"
}
}
\ No newline at end of file
diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/nl.json b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/nl.json
index 0dacfe8341..4b928c4d03 100644
--- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/nl.json
+++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/nl.json
@@ -7,6 +7,7 @@
"SelectAllInAllTabs": "Verleen alle rechten",
"SelectAllInThisTab": "Selecteer alles",
"SaveWithoutAnyPermissionsWarningMessage": "Weet u zeker dat u zonder rechten wilt opslaan?",
- "PermissionGroup": "Rechtengroep"
+ "PermissionGroup": "Rechtengroep",
+ "Filter": "Filter"
}
}
\ No newline at end of file
diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/pl-PL.json b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/pl-PL.json
index aa0bf32851..ee483651eb 100644
--- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/pl-PL.json
+++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/pl-PL.json
@@ -7,6 +7,7 @@
"SelectAllInAllTabs": "Udziel wszystkich uprawnień",
"SelectAllInThisTab": "Zaznacz wszystkie",
"SaveWithoutAnyPermissionsWarningMessage": "Czy na pewno chcesz zapisać bez żadnych uprawnień?",
- "PermissionGroup": "Grupa uprawnień"
+ "PermissionGroup": "Grupa uprawnień",
+ "Filter": "Filtr"
}
}
\ No newline at end of file
diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/pt-BR.json b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/pt-BR.json
index 14f45ec46a..28231b227f 100644
--- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/pt-BR.json
+++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/pt-BR.json
@@ -7,6 +7,7 @@
"SelectAllInAllTabs": "Conceder todas as permissões",
"SelectAllInThisTab": "Selecionar todos",
"SaveWithoutAnyPermissionsWarningMessage": "Tem certeza que deseja salvar sem nenhuma permissão?",
- "PermissionGroup": "Grupo de permissão"
+ "PermissionGroup": "Grupo de permissão",
+ "Filter": "Filtrar"
}
}
\ No newline at end of file
diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/ro-RO.json b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/ro-RO.json
index 6466540438..af7db26acb 100644
--- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/ro-RO.json
+++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/ro-RO.json
@@ -7,6 +7,7 @@
"SelectAllInAllTabs": "Acordă toate permisiunile",
"SelectAllInThisTab": "Selectează toate",
"SaveWithoutAnyPermissionsWarningMessage": "Sigur doriți să salvați fără nicio permisiune?",
- "PermissionGroup": "Grup de permisiuni"
+ "PermissionGroup": "Grup de permisiuni",
+ "Filter": "Filtru"
}
}
\ No newline at end of file
diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/ru.json b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/ru.json
index d46b4e289e..6041357b0e 100644
--- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/ru.json
+++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/ru.json
@@ -7,6 +7,7 @@
"SelectAllInAllTabs": "Предоставить все разрешения",
"SelectAllInThisTab": "Выбрать все",
"SaveWithoutAnyPermissionsWarningMessage": "Вы уверены, что хотите сохранить без каких-либо разрешений?",
- "PermissionGroup": "Группа разрешений"
+ "PermissionGroup": "Группа разрешений",
+ "Filter": "Фильтр"
}
}
\ No newline at end of file
diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/sk.json b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/sk.json
index 722582d28f..c079b8eba1 100644
--- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/sk.json
+++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/sk.json
@@ -7,6 +7,7 @@
"SelectAllInAllTabs": "Udeliť všetky oprávnenia",
"SelectAllInThisTab": "Vybrať všetky",
"SaveWithoutAnyPermissionsWarningMessage": "Naozaj chcete ukladať bez akýchkoľvek povolení?",
- "PermissionGroup": "Skupina oprávnení"
+ "PermissionGroup": "Skupina oprávnení",
+ "Filter": "Filtrovať"
}
}
\ No newline at end of file
diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/sl.json b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/sl.json
index 36640ffdbd..9c906f7387 100644
--- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/sl.json
+++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/sl.json
@@ -7,6 +7,7 @@
"SelectAllInAllTabs": "Dodeli vsa dovoljenja",
"SelectAllInThisTab": "Izberi vse",
"SaveWithoutAnyPermissionsWarningMessage": "Ali ste prepričani, da želite shraniti brez kakršnih koli dovoljenj?",
- "PermissionGroup": "Skupina dovoljenj"
+ "PermissionGroup": "Skupina dovoljenj",
+ "Filter": "Filtriraj"
}
}
\ No newline at end of file
diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/sv.json b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/sv.json
index 3671bf1422..d46fca4dc4 100644
--- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/sv.json
+++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/sv.json
@@ -7,6 +7,7 @@
"SelectAllInAllTabs": "Ge alla behörigheter",
"SelectAllInThisTab": "Välj alla",
"SaveWithoutAnyPermissionsWarningMessage": "Är du säker på att du vill spara utan några behörigheter?",
- "PermissionGroup": "Behörighetsgrupp"
+ "PermissionGroup": "Behörighetsgrupp",
+ "Filter": "Filtrera"
}
}
\ No newline at end of file
diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/tr.json b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/tr.json
index 3edfc2942f..960cd8cf02 100644
--- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/tr.json
+++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/tr.json
@@ -7,6 +7,7 @@
"SelectAllInAllTabs": "Tüm izinleri ver",
"SelectAllInThisTab": "Hepsini seç",
"SaveWithoutAnyPermissionsWarningMessage": "Hiçbir izin olmadan kaydetmek istediğinize emin misiniz?",
- "PermissionGroup": "İzin Grubu"
+ "PermissionGroup": "İzin Grubu",
+ "Filter": "Filtre"
}
}
diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/vi.json b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/vi.json
index d927f6a4a9..5e9a9d8565 100644
--- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/vi.json
+++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/vi.json
@@ -7,6 +7,7 @@
"SelectAllInAllTabs": "Cấp tất cả các quyền",
"SelectAllInThisTab": "Chọn tất cả",
"SaveWithoutAnyPermissionsWarningMessage": "Bạn có chắc chắn muốn lưu mà không có bất kỳ quyền nào không?",
- "PermissionGroup": "Nhóm quyền"
+ "PermissionGroup": "Nhóm quyền",
+ "Filter": "Lọc"
}
}
\ No newline at end of file
diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/zh-Hans.json b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/zh-Hans.json
index 3ae69c4d58..df844ca2bf 100644
--- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/zh-Hans.json
+++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/zh-Hans.json
@@ -7,6 +7,7 @@
"SelectAllInAllTabs": "授予所有权限",
"SelectAllInThisTab": "全选",
"SaveWithoutAnyPermissionsWarningMessage": "您确定要在没有任何权限的情况下保存吗?",
- "PermissionGroup": "权限组"
+ "PermissionGroup": "权限组",
+ "Filter": "过滤"
}
}
\ No newline at end of file
diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/zh-Hant.json b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/zh-Hant.json
index b2d46a42a5..72af56c960 100644
--- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/zh-Hant.json
+++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/zh-Hant.json
@@ -7,6 +7,7 @@
"SelectAllInAllTabs": "授予所有權限",
"SelectAllInThisTab": "全選",
"SaveWithoutAnyPermissionsWarningMessage": "您確定要在沒有任何權限的情況下保存嗎?",
- "PermissionGroup": "權限組"
+ "PermissionGroup": "權限組",
+ "Filter": "過濾"
}
}
\ No newline at end of file
diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Web/Pages/AbpPermissionManagement/PermissionManagementModal.cshtml b/modules/permission-management/src/Volo.Abp.PermissionManagement.Web/Pages/AbpPermissionManagement/PermissionManagementModal.cshtml
index 155eebfd5a..a9caf5c348 100644
--- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Web/Pages/AbpPermissionManagement/PermissionManagementModal.cshtml
+++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Web/Pages/AbpPermissionManagement/PermissionManagementModal.cshtml
@@ -23,7 +23,7 @@