diff --git a/Directory.Packages.props b/Directory.Packages.props index 59aa37e3fe..33b26c64d9 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -59,71 +59,74 @@ - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + - - - - - - - - - + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - - - - + + + + - + @@ -164,18 +167,18 @@ - + - + - + - - - - + + + + diff --git a/README.md b/README.md index 7cf41d47eb..a6199aab9b 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,12 @@ -# ABP Framework - + ![build and test](https://img.shields.io/github/actions/workflow/status/abpframework/abp/build-and-test.yml?branch=dev&style=flat-square) šŸ”¹ [![codecov](https://codecov.io/gh/abpframework/abp/branch/dev/graph/badge.svg?token=jUKLCxa6HF)](https://codecov.io/gh/abpframework/abp) šŸ”¹ [![NuGet](https://img.shields.io/nuget/v/Volo.Abp.Core.svg?style=flat-square)](https://www.nuget.org/packages/Volo.Abp.Core) šŸ”¹ [![NuGet (with prereleases)](https://img.shields.io/nuget/vpre/Volo.Abp.Core.svg?style=flat-square)](https://www.nuget.org/packages/Volo.Abp.Core) šŸ”¹ [![MyGet (nightly builds)](https://img.shields.io/myget/abp-nightly/vpre/Volo.Abp.svg?style=flat-square)](https://abp.io/docs/latest/release-info/nightly-builds) šŸ”¹ [![NuGet Download](https://img.shields.io/nuget/dt/Volo.Abp.Core.svg?style=flat-square)](https://www.nuget.org/packages/Volo.Abp.Core) šŸ”¹ [![Code of Conduct](https://img.shields.io/badge/Contributor%20Covenant-v2.0%20adopted-ff69b4.svg)](https://github.com/abpframework/abp/blob/dev/CODE_OF_CONDUCT.md) šŸ”¹ [![CLA Signed](https://cla-assistant.io/readme/badge/abpframework/abp)](https://cla-assistant.io/abpframework/abp) šŸ”¹ [![Discord Shield](https://discord.com/api/guilds/951497912645476422/widget.png?style=shield)](https://abp.io/join-discord) [ABP](https://abp.io/) offers an **opinionated architecture** to build enterprise software solutions with **best practices** on top of the **.NET** and the **ASP.NET Core** platforms. It provides the fundamental infrastructure, production-ready startup templates, pre-built application modules, UI themes, tooling, guides and documentation to implement that architecture properly and **automate the details** and repetitive works as much as possible. -[![ABP Platform](https://github.com/user-attachments/assets/200653c0-0e69-4b47-b76a-3a83460aaab6)](https://abp.io) +[![ABP Platform](https://github.com/user-attachments/assets/c4356ec7-4d0f-4e00-a1d2-fc74ad985fb8)](https://abp.io) + + ## Getting Started diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Account/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Account/Localization/Resources/en.json index fdbcd040bb..59edeb9031 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Account/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Account/Localization/Resources/en.json @@ -17,6 +17,6 @@ "SelectYourOrganization": "Select your organization", "PleaseSelectOrganization": "Please select an organization to continue", "Continue": "Continue", - "CaptchaExplanation": "Calculate the given mathematical expression and enter the correct answer." + "CaptchaExplanation": "Calculate the below mathematical expression and enter the answer." } } diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/en.json index 78231bb1af..f1dcba47a8 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/en.json @@ -264,6 +264,7 @@ "EditProfile": "Edit Profile", "ConfirmEmailForPost": "To be able to post, you need to confirm your email. Go to account.abp.io/Account/Manage and verify your email in the Personal Info tab.", "DailyPostCreateLimitation": "You have reached the daily post creation limit. You can create a new post in {0}.", - "YourAccountDisabled": "Your user account is disabled!" + "YourAccountDisabled": "Your user account is disabled!", + "PostCreationFailed": "An error occurred while creating the post. Please try again later." } } diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json index ae7e608758..c56e50af4c 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json @@ -672,20 +672,20 @@ "ExternalPostUrl": "External Post Url", "ThankYouForContribution": "Thank you for contributing to the ABP Community. We accept articles and video tutorials on ABP Framework, .NET, ASP.NET Core and general software development topics.", "GithubPost": "GitHub Post", - "GithubPostSubmitStepOne": "1. Write a post on any public GitHub repository with the Markdown format. example", - "GithubPostSubmitStepTwo": "2. Submit your post URL using the form.", - "GithubPostSubmitStepThree": "3. Your post will be rendered in this website.", + "GithubPostSubmitStepOne": "1. Write a post on any public GitHub repository with the Markdown format. example", + "GithubPostSubmitStepTwo": "2. Submit your post URL using the form.", + "GithubPostSubmitStepThree": "3. Your post will be rendered in this website.", "YoutubeVideo": "Youtube Video", - "YoutubeVideoSubmitStepOne": "1. Publish your video on YouTube.", - "YoutubeVideoSubmitStepTwo": "2. Submit the video URL using the form.", - "YoutubeVideoSubmitStepThree": "3. Visitors will be able to watch your video content directly on this website.", + "YoutubeVideoSubmitStepOne": "1. Publish your video on YouTube.", + "YoutubeVideoSubmitStepTwo": "2. Submit the video URL using the form.", + "YoutubeVideoSubmitStepThree": "3. Visitors will be able to watch your video content directly on this website.", "ExternalContent": "External Content", - "ExternalContentSubmitStepOne": "1. Create a content on any public platform (Medium, your own blog or anywhere you like).", - "ExternalContentSubmitStepTwo": "2. Submit your content URL using the form.", - "ExternalContentSubmitStepThree": "3. Visitors are redirected to the content on the original website.", + "ExternalContentSubmitStepOne": "1. Create a content on any public platform (Medium, your own blog or anywhere you like).", + "ExternalContentSubmitStepTwo": "2. Submit your content URL using the form.", + "ExternalContentSubmitStepThree": "3. Visitors are redirected to the content on the original website.", "ChooseYourContentType": "Please choose the way you want to add your content.", - "PostContentViaGithub": "I want to add my post with GitHub in accordance with the markdown rules.", - "PostContentViaYoutube": "I want to share my videos available on Youtube here.", + "PostContentViaGithub": "I want to add my post with GitHub in accordance with the markdown rules.", + "PostContentViaYoutube": "I want to share my videos available on Youtube here.", "PostContentViaExternalSource": "I want to add the content I published on another platform here.", "GitHubUserNameValidationMessage": "Your Github username can not include whitespace, please make sure your Github username is correct.", "PersonalSiteUrlValidationMessage": "Your personal site URL can not include whitespace, please make sure your personal site URL is correct.", @@ -1875,6 +1875,17 @@ "RcStableDifferenceExplanation3": "Use the RC version for testing and early adoption but use the Stable version for production deployment.", "AddToCalendar": "Add To Calendar", "AddToGoogleCalendar": "Add To Google Calendar", - "DownloadICSFile": "Download ICS File" + "DownloadICSFile": "Download ICS File", + "AddToAppleCalendar": "Add To Apple Calendar", + "AddToOutlookCalendar": "Add To Outlook Calendar", + "FaqIyzicoPaymentIssuesTitle" : "What should I do if I encounter issues while purchasing the Iyzico payment gateway?", + "FaqIyzicoPaymentIssuesExplanation1": "This website uses two payment gateways to receive payments: Iyzico and 2Checkout. The default gateway is Iyzico. When you check the 'Automatic Renewal' option, it will automatically use the Iyzico payment gateway. If you’re experiencing issues while trying to purchase through the Iyzico payment gateway, it could be due to the following reasons:", + "FaqIyzicoPaymentIssuesExplanation2": "Card Type: Iyzico only supports VISA and MasterCard. If you’re using a different card type (e.g., American Express), please switch to the 2Checkout payment gateway.", + "FaqIyzicoPaymentIssuesExplanation3": "3D Secure: If your card has 3D Secure enabled, you’ll be redirected to your card provider’s 3D Secure page to complete the verification process. Once done, you’ll return to Iyzico to finalize the payment. If you encounter any issues with 3D Secure, please contact your card provider for assistance. Sometimes there might be problems with the redirection to the 3D Secure provider, in that case you can disable 3D Secure or contact us.", + "FaqIyzicoPaymentIssuesExplanation4": "If you’re unable to complete the payment through Iyzico, you can use our alternative payment gateway, 2Checkout which supports a wider range of payment options, including:", + "FaqIyzicoPaymentIssuesExplanation5": "Credit/Debit Cards: Visa, MasterCard, American Express, Discover, Diners Club, JCB", + "FaqIyzicoPaymentIssuesExplanation6": "Digital Wallets: PayPal, AliPay, WebMoney", + "FaqIyzicoPaymentIssuesExplanation7": "Alternatively, you can send the license amount directly via bank wire transfer. For our bank account details, please visit: Bank Account Information (use USD currency).", + "FaqIyzicoPaymentIssuesExplanation8": "ABP website doesn't save or process your credit card. We use payment gateways for this and the entire transaction is handled by payment gateways. We have no authority to interfere with the payment process or fix the payment steps. If you have further questions or need additional support, feel free to contact us at abp.io/contact." } } diff --git a/build/common.ps1 b/build/common.ps1 index 51ab56d972..356f2d8329 100644 --- a/build/common.ps1 +++ b/build/common.ps1 @@ -23,6 +23,11 @@ $solutionPaths = @( "../modules/blob-storing-database" ) + # Remove MAUI related projects if not on Windows +if ($env:OS -ne "Windows_NT") { + dotnet sln ../framework/Volo.Abp.sln remove ../framework/src/Volo.Abp.AspNetCore.Components.MauiBlazor.Bundling/Volo.Abp.AspNetCore.Components.MauiBlazor.Bundling.csproj +} + if ($full -eq "-f") { # List of additional solutions required for full build diff --git a/docs/en/Blog-Posts/2025-03-07 v9_1_Release_Stable/POST.md b/docs/en/Blog-Posts/2025-03-07 v9_1_Release_Stable/POST.md new file mode 100644 index 0000000000..96096807f1 --- /dev/null +++ b/docs/en/Blog-Posts/2025-03-07 v9_1_Release_Stable/POST.md @@ -0,0 +1,82 @@ +# ABP.IO Platform 9.1 Final Has Been Released! + +We are glad to announce that [ABP](https://abp.io/) 9.1 stable version has been released today. + +## What's New With Version 9.1? + +All the new features were explained in detail in the [9.1 RC Announcement Post](https://abp.io/community/articles/abp-platform-9.1-rc-has-been-released-wws5l00k), so there is no need to review them again. You can check it out for more details. + +## Getting Started with 9.1 + +### Creating New Solutions + +You can check the [Get Started page](https://abp.io/get-started) to see how to get started with ABP. You can either download [ABP Studio](https://abp.io/get-started#abp-studio-tab) (**recommended**, if you prefer a user-friendly GUI application - desktop application) or use the [ABP CLI](https://abp.io/docs/latest/cli) to create new solutions. + +By default, ABP Studio uses stable versions to create solutions. Therefore, it will be creating the solution with the latest stable version, which is v9.1 for now, so you don't need to specify the version. + +### How to Upgrade an Existing Solution + +You can upgrade your existing solutions with either ABP Studio or ABP CLI. In the following sections, both approaches are explained: + +### Upgrading via ABP Studio + +If you are already using the ABP Studio, you can upgrade it to the latest version to align it with ABP v9.1. ABP Studio periodically checks for updates in the background, and when a new version of ABP Studio is available, you will be notified through a modal. Then, you can update it by confirming the opened modal. See [the documentation](https://abp.io/docs/latest/studio/installation#upgrading) for more info. + +After upgrading the ABP Studio, then you can open your solution in the application, and simply click the **Upgrade ABP Packages** action button to instantly upgrade your solution: + +![](upgrade-abp-packages.png) + +### Upgrading via ABP CLI + +Alternatively, you can upgrade your existing solution via ABP CLI. First, you need to install the ABP CLI or upgrade it to the latest version. + +If you haven't installed it yet, you can run the following command: + +```bash +dotnet tool install -g Volo.Abp.Studio.Cli +``` + +Or to update the existing CLI, you can run the following command: + +```bash +dotnet tool update -g Volo.Abp.Studio.Cli +``` + +After installing/updating the ABP CLI, you can use the [`update` command](https://abp.io/docs/latest/CLI#update) to update all the ABP related NuGet and NPM packages in your solution as follows: + +```bash +abp update +``` + +You can run this command in the root folder of your solution to update all ABP related packages. + +## Migration Guides + +There are a few breaking changes in this version that may affect your application. Please read the migration guide carefully, if you are upgrading from v9.0: [ABP Version 9.1 Migration Guide](https://abp.io/docs/latest/release-info/migration-guides/abp-9-1) + +## Community News + +### New ABP Community Articles + +As always, exciting articles have been contributed by the ABP community. I will highlight some of them here: + +* [URL-Based Localization](https://abp.io/community/articles/urlbased-localization-3ivzinbb) by [Alper EbiƧoğlu](https://twitter.com/alperebicoglu) +* [Building a CRUD API with ABP Framework, ASP.NET Core, and PostgreSQL](https://abp.io/community/articles/building-a-crud-api-with-abp-framework-asp.net-core-and-postgresql-elrj0old) by [Berkan Şaşmaz](https://github.com/berkansasmaz) +* [Encryption and Decryption in ABP Framework](https://abp.io/community/articles/encryption-and-decryption-in-abp-framework-37uqhdwz) by [Liming Ma](https://github.com/maliming) +* [Migrate Your DB from the Web Application - Adding a DB Migration Controller](https://abp.io/community/articles/migrate-your-db-from-the-web-application-adding-a-db-migration-controller-in-abp-framework-x3u3uvk3) by [Alper EbiƧoğlu](https://twitter.com/alperebicoglu) +* [Containerization: Blazor WASM + JWT Web API => Docker](https://abp.io/community/articles/containerization-blazor-wasm-jwt-web-api-docker-i3eirlsf) by [Bart Van Hoey](https://abp.io/community/members/bartvanhoey) +* [Configuring Post-Logout Redirect URI in ABP Based Blazor Applications with OpenIddict](https://abp.io/community/articles/configuring-postlogout-redirect-uri-in-abp-based-blazor-applications-with-openiddict-1t84suxg) by [Engincan Veske](https://github.com/EngincanV) + +Thanks to the ABP Community for all the content they have published. You can also [post your ABP related (text or video) content](https://abp.io/community/posts/submit) to the ABP Community. + +### ABP Community Talks 2025.2: Real World Problems and Solutions with AI + +![](community-talks.png) + +In this episode of ABP Community Talks (2025.2), Decision Tree joined us to explore how AI is being leveraged to solve real-world problems, showcasing a practical use case of AI applications. + +> You can re-watch the talk from [here](https://www.youtube.com/watch?v=CXpWjxCIY_E). + +## About the Next Version + +The next feature version will be 9.2. You can follow the [release planning here](https://github.com/abpframework/abp/milestones). Please [submit an issue](https://github.com/abpframework/abp/issues/new) if you have any problems with this version. diff --git a/docs/en/Blog-Posts/2025-03-07 v9_1_Release_Stable/community-talks.png b/docs/en/Blog-Posts/2025-03-07 v9_1_Release_Stable/community-talks.png new file mode 100644 index 0000000000..2c2dd5a38a Binary files /dev/null and b/docs/en/Blog-Posts/2025-03-07 v9_1_Release_Stable/community-talks.png differ diff --git a/docs/en/Blog-Posts/2025-03-07 v9_1_Release_Stable/cover-image.png b/docs/en/Blog-Posts/2025-03-07 v9_1_Release_Stable/cover-image.png new file mode 100644 index 0000000000..0575db3f27 Binary files /dev/null and b/docs/en/Blog-Posts/2025-03-07 v9_1_Release_Stable/cover-image.png differ diff --git a/docs/en/Blog-Posts/2025-03-07 v9_1_Release_Stable/upgrade-abp-packages.png b/docs/en/Blog-Posts/2025-03-07 v9_1_Release_Stable/upgrade-abp-packages.png new file mode 100644 index 0000000000..ad5e9bd462 Binary files /dev/null and b/docs/en/Blog-Posts/2025-03-07 v9_1_Release_Stable/upgrade-abp-packages.png differ diff --git a/docs/en/Community-Articles/2022-11-14-How-to-add-a-custom-grant-type-in-OpenIddict/1.png b/docs/en/Community-Articles/2022-11-14-How-to-add-a-custom-grant-type-in-OpenIddict/1.png new file mode 100644 index 0000000000..8e6a25600f Binary files /dev/null and b/docs/en/Community-Articles/2022-11-14-How-to-add-a-custom-grant-type-in-OpenIddict/1.png differ diff --git a/docs/en/Community-Articles/2022-11-14-How-to-add-a-custom-grant-type-in-OpenIddict/2.png b/docs/en/Community-Articles/2022-11-14-How-to-add-a-custom-grant-type-in-OpenIddict/2.png new file mode 100644 index 0000000000..d758ca86cf Binary files /dev/null and b/docs/en/Community-Articles/2022-11-14-How-to-add-a-custom-grant-type-in-OpenIddict/2.png differ diff --git a/docs/en/Community-Articles/2022-11-14-How-to-add-a-custom-grant-type-in-OpenIddict/3.png b/docs/en/Community-Articles/2022-11-14-How-to-add-a-custom-grant-type-in-OpenIddict/3.png new file mode 100644 index 0000000000..dcca72e932 Binary files /dev/null and b/docs/en/Community-Articles/2022-11-14-How-to-add-a-custom-grant-type-in-OpenIddict/3.png differ diff --git a/docs/en/Community-Articles/2022-11-14-How-to-add-a-custom-grant-type-in-OpenIddict/POST.md b/docs/en/Community-Articles/2022-11-14-How-to-add-a-custom-grant-type-in-OpenIddict/POST.md index 8f45279b3d..e147058f67 100644 --- a/docs/en/Community-Articles/2022-11-14-How-to-add-a-custom-grant-type-in-OpenIddict/POST.md +++ b/docs/en/Community-Articles/2022-11-14-How-to-add-a-custom-grant-type-in-OpenIddict/POST.md @@ -2,17 +2,72 @@ ## ITokenExtensionGrant -Create a class that inherits `ITokenExtensionGrant`, and then register it with the framework. +Create a `MyTokenExtensionGrant` class that inherits `ITokenExtensionGrant`, and then register it with the framework. -In the `MyTokenExtensionGrant` class below we try to get the token details, The `ForbidResult` handles the failure case and `SignInResult` returns a new token response, You can pass more parameters to implement business checks. +```cs +public override void PreConfigureServices(ServiceConfigurationContext context) +{ + //... + PreConfigure(builder => + { + builder.Configure(openIddictServerOptions => + { + openIddictServerOptions.GrantTypes.Add(MyTokenExtensionGrant.ExtensionGrantName); + }); + }); + //... +} + +public override void ConfigureServices(ServiceConfigurationContext context) +{ + //... + Configure(options => + { + options.Grants.Add(MyTokenExtensionGrant.ExtensionGrantName, new MyTokenExtensionGrant()); + }); + //... +} +``` + +## Generate a new token response + +In the `MyTokenExtensionGrant` class below we have two methods to get a new token using a user token or user API key. You can choose one of them based on your business. + +These methods are just examples. Please add more logic to validate input data. ```cs +using System.Collections.Immutable; +using System.Security.Principal; +using Microsoft.AspNetCore.Authentication; +using Microsoft.AspNetCore.Identity; +using Microsoft.AspNetCore.Mvc; +using OpenIddict.Abstractions; +using OpenIddict.Server; +using OpenIddict.Server.AspNetCore; +using Volo.Abp.Identity; +using Volo.Abp.OpenIddict; +using Volo.Abp.OpenIddict.ExtensionGrantTypes; +using IdentityUser = Volo.Abp.Identity.IdentityUser; +using SignInResult = Microsoft.AspNetCore.Mvc.SignInResult; + +namespace OpenIddict.Demo.Server.ExtensionGrants; + public class MyTokenExtensionGrant : ITokenExtensionGrant { public const string ExtensionGrantName = "MyTokenExtensionGrant"; public string Name => ExtensionGrantName; + public async Task HandleAsync(ExtensionGrantContext context) + { + // You can get a new token using any of the following methods based on your business. + // They are just examples. You can implement your own logic here. + + return await HandleUserAccessTokenAsync(context); + return await HandleUserApiKeyAsync(context); + } + + public async Task HandleUserAccessTokenAsync(ExtensionGrantContext context) { var userToken = context.Request.GetParameter("token").ToString(); @@ -26,6 +81,9 @@ public class MyTokenExtensionGrant : ITokenExtensionGrant }!)); } + // We will validate the user token + // The Token is issued by the OpenIddict server, So we can validate it using the introspection endpoint + var transaction = await context.HttpContext.RequestServices.GetRequiredService().CreateTransactionAsync(); transaction.EndpointType = OpenIddictServerEndpointType.Introspection; transaction.Request = new OpenIddictRequest @@ -64,23 +122,92 @@ public class MyTokenExtensionGrant : ITokenExtensionGrant })); } + // We have validated the user token and got the user id + var userId = principal.FindUserId(); var userManager = context.HttpContext.RequestServices.GetRequiredService(); var user = await userManager.GetByIdAsync(userId.Value); var userClaimsPrincipalFactory = context.HttpContext.RequestServices.GetRequiredService>(); var claimsPrincipal = await userClaimsPrincipalFactory.CreateAsync(user); - claimsPrincipal.SetScopes(principal.GetScopes()); - claimsPrincipal.SetResources(await GetResourcesAsync(context, principal.GetScopes())); - //abp version < 7.3 - await context.HttpContext.RequestServices.GetRequiredService().SetAsync(claimsPrincipal); + // Prepare the scopes + var scopes = GetScopes(context); + + claimsPrincipal.SetScopes(scopes); + claimsPrincipal.SetResources(await GetResourcesAsync(context, scopes)); + await context.HttpContext.RequestServices.GetRequiredService().HandleAsync(context.Request, principal); + return new SignInResult(OpenIddictServerAspNetCoreDefaults.AuthenticationScheme, claimsPrincipal); + } - //For abp version >= 7.3 - await context.HttpContext.RequestServices.GetRequiredService().HandleAsync(context.Request, claimsPrincipal); + protected async Task HandleUserApiKeyAsync(ExtensionGrantContext context) + { + var userApiKey = context.Request.GetParameter("user_api_key").ToString(); + + if (string.IsNullOrEmpty(userApiKey)) + { + return new ForbidResult( + new[] {OpenIddictServerAspNetCoreDefaults.AuthenticationScheme}, + properties: new AuthenticationProperties(new Dictionary + { + [OpenIddictServerAspNetCoreConstants.Properties.Error] = OpenIddictConstants.Errors.InvalidRequest + }!)); + } + + // Here we can validate the user API key and get the user id + if (false) // Add your own logic here + { + // If the user API key is invalid + return new ForbidResult( + new[] {OpenIddictServerAspNetCoreDefaults.AuthenticationScheme}, + properties: new AuthenticationProperties(new Dictionary + { + [OpenIddictServerAspNetCoreConstants.Properties.Error] = OpenIddictConstants.Errors.InvalidRequest + }!)); + } + + // Add your own logic to get the user by API key + var userManager = context.HttpContext.RequestServices.GetRequiredService(); + var user = await userManager.FindByNameAsync("admin"); + if (user == null) + { + return new ForbidResult( + new[] {OpenIddictServerAspNetCoreDefaults.AuthenticationScheme}, + properties: new AuthenticationProperties(new Dictionary + { + [OpenIddictServerAspNetCoreConstants.Properties.Error] = OpenIddictConstants.Errors.InvalidRequest + }!)); + } + + // Create a principal for the user + var userClaimsPrincipalFactory = context.HttpContext.RequestServices.GetRequiredService>(); + var claimsPrincipal = await userClaimsPrincipalFactory.CreateAsync(user); + + // Prepare the scopes + var scopes = GetScopes(context); + + claimsPrincipal.SetScopes(scopes); + claimsPrincipal.SetResources(await GetResourcesAsync(context, scopes)); + await context.HttpContext.RequestServices.GetRequiredService().HandleAsync(context.Request, claimsPrincipal); return new SignInResult(OpenIddictServerAspNetCoreDefaults.AuthenticationScheme, claimsPrincipal); } + private ImmutableArray GetScopes(ExtensionGrantContext context) + { + // Prepare the scopes + // The scopes must be defined in the OpenIddict server + + // If you want to get the scopes from the request, you have to add `scope` parameter in the request + // scope: AbpAPI profile roles email phone offline_access + + //var scopes = context.Request.GetScopes(); + + // If you want to set the scopes here, you can use the following code + var scopes = new[] { "AbpAPI", "profile", "roles", "email", "phone", "offline_access" }.ToImmutableArray(); + + return scopes; + } + private async Task> GetResourcesAsync(ExtensionGrantContext context, ImmutableArray scopes) { var resources = new List(); @@ -98,38 +225,24 @@ public class MyTokenExtensionGrant : ITokenExtensionGrant } ``` -```cs -public override void PreConfigureServices(ServiceConfigurationContext context) -{ - //... - PreConfigure(builder => - { - builder.Configure(openIddictServerOptions => - { - openIddictServerOptions.GrantTypes.Add(MyTokenExtensionGrant.ExtensionGrantName); - }); - }); - //... -} +### Get a new token using user access token -public override void ConfigureServices(ServiceConfigurationContext context) -{ - //... - Configure(options => - { - options.Grants.Add(MyTokenExtensionGrant.ExtensionGrantName, new MyTokenExtensionGrant()); - }); - //... -} -``` +* Get a user token using the `password` grant type. +![Http request 1](1.png) -![Http request 1](postman1.png) +* Use the user token to get a new token using the `HandleUserAccessTokenAsync` method. -![Http request 2](postman2.png) +![Http request 2](2.png) -## Source code +### Get a new token using user API key + +* Directly get a new token using the `HandleUserApiKeyAsync` method. -https://github.com/abpframework/abp/commit/3210f138454697647689b4868c8d4b7b3da02d44 +![Http request 3](3.png) + +## Source code + +https://github.com/abpframework/abp/blob/dev/modules/openiddict/app/OpenIddict.Demo.Server/ExtensionGrants/MyTokenExtensionGrant.cs diff --git a/docs/en/Community-Articles/2022-11-14-How-to-add-a-custom-grant-type-in-OpenIddict/postman1.png b/docs/en/Community-Articles/2022-11-14-How-to-add-a-custom-grant-type-in-OpenIddict/postman1.png deleted file mode 100644 index e7ec1ccce0..0000000000 Binary files a/docs/en/Community-Articles/2022-11-14-How-to-add-a-custom-grant-type-in-OpenIddict/postman1.png and /dev/null differ diff --git a/docs/en/Community-Articles/2022-11-14-How-to-add-a-custom-grant-type-in-OpenIddict/postman2.png b/docs/en/Community-Articles/2022-11-14-How-to-add-a-custom-grant-type-in-OpenIddict/postman2.png deleted file mode 100644 index b44e756ed5..0000000000 Binary files a/docs/en/Community-Articles/2022-11-14-How-to-add-a-custom-grant-type-in-OpenIddict/postman2.png and /dev/null differ diff --git a/docs/en/Community-Articles/2023-10-03-basta-mainz-2023-what-a-blast-in-germany/post.md b/docs/en/Community-Articles/2023-10-03-basta-mainz-2023-what-a-blast-in-germany/post.md index 06fedcb41b..dd7cafc13f 100644 --- a/docs/en/Community-Articles/2023-10-03-basta-mainz-2023-what-a-blast-in-germany/post.md +++ b/docs/en/Community-Articles/2023-10-03-basta-mainz-2023-what-a-blast-in-germany/post.md @@ -1,59 +1,118 @@ -BASTA! Mainz 2023 has wrapped up, and what an extraordinary journey it has been! We can’t wait to share our impressions, highlights, and the incredible impact it had on the tech community in Germany and beyond. - -### A Glance Back at BASTA! Mainz 2023 - - -We just came back from the[Ā BASTA! Conference 2023](https://basta.net/), which is an incredible .NET event with over 600 in-person attendees and an additional 200+ tuning in virtually from across the globe. The buzz of excitement and anticipation in the air was undeniable, setting the stage for an unforgettable event forĀ [ABP.IO](https://abp.io/). - -![53227564247\_b7acafea68\_c.jpg](3a0e074506bcc60cad473655b6fd5da6.jpg) - -![53227631612\_eb38958391\_c.jpg](3a0e074555e8d6f62bc3d47c00f86762.jpg) - -![53227631792\_a6d87b4abf\_k.jpg](3a0e0745b6418472a66d905053d492e6.jpg) - -As one of the proud sponsors, we set up our booth, engaged with attendees, and delved into a wide range of sessions, workshops, and keynotes to absorb the latest software development trends. - -### Engaging with Enthusiastic Minds - - -As the lead developersĀ of ABP Core Team,Ā *[Alper](https://twitter.com/alperebicoglu)*Ā andĀ *[Ismail](https://twitter.com/ismcagdas)*Ā presented the ABP.IO platform modules and features were quite busy enjoying their presenting work with latest version of demos.Ā Alper also gave a great speech on ā€œBuilding Multi-tenant ASP.NET Core Application & the ABP Frameworkā€ at the BASTA! Mainz conference. - -![53229004005\_3312b6bfa2\_k.jpg](3a0e074625fddc3097efdc1bef3058d8.jpg) - -![20230926\_170335.jpg](3a0e074675731c4a59167a878d4cd04e.jpg) - -We introducedĀ **[ABP Framework](https://abp.io/)**, community-driven open-source web application framework, andĀ **[ABP Commercial](https://commercial.abp.io/)**, our enterprise-ready web development platform that is built on top of the open-source ABP Framework to the crowds. - -![53227632222\_0a5af1fcc1\_k.jpg](3a0e074703a63129e5713ff51653aaac.jpg) - -![53228506206\_24e22498fa\_o.jpg](3a0e07477e980a4c2104300557e8f7fb.jpg) - -![53228505931\_b2aea761f9\_k.jpg](3a0e0747c283919bbc5edfdc289db1d8.jpg) - -Apart from that, we were thrilled to give away theĀ **[ABP Commercial Licenses](https://commercial.abp.io/pricing)**Ā to the eager attendees on the venue, including the Raffle prize,Ā **Meta Quest 2**, on our last day in BASTA! Conference. - -![ęˆŖå±2023-10-03 11.06.01.png](3a0e0748c8752dfdc2bcb5b9b2ce5908.png) - -We are profoundly satisfied with the huge interest and engagement shown by the attendees. The sense of community, collaboration, and shared passion for .NET solutions was palpable throughout the event. - -![20230927\_171046.jpg](3a0e07495efa58bb9f1e523d982dbc65.jpg) - -![20230928\_150135.jpg](3a0e0749c23a9e3b06d66ed54bed0c7a.jpg) - -![20230928\_150533 20.57.50.jpg](3a0e074a268272e630d8422ace32b4c8.jpg) - -### A Great Partnership with LIS GmbH - - -![20230928\_161843.jpg](3a0e074aa3857a696cb941edc46dcb52.jpg) - -At BASTA! Mainz 2023, we were particularly thrilled to celebrate our collaboration withĀ ***LIS GmbH***, a leading software solutions provider. This partnership added a unique dimension to the conference, brought us a fresh perspective to the conference, fostering innovation and opening up new avenues for attendees. - -### A Big Thank-You from ABP Team - - -![53228503821\_27860119d9\_k.jpg](3a0e074b0a46662cf39a6796d0f23086.jpg) - -Now, a shout-out to BASTA! Mainz 2023. We want to thank to everyone who contributed to the success of this event – attendees, speakers, sponsors, and partners.The conference may have ended, but the knowledge gained, connections formed, and inspiration ignited will continue to shape the tech landscape for years to come. - -Until next time! \ No newline at end of file +BASTA! Mainz 2023 has wrapped up, and what an extraordinary journey it has been! We can’t wait to share our impressions, highlights, and the incredible impact it had on the tech community in Germany and beyond. + + + +### A Glance Back at BASTA! Mainz 2023 + + + + + +We just came back from the[Ā BASTA! Conference 2023](https://basta.net/), which is an incredible .NET event with over 600 in-person attendees and an additional 200+ tuning in virtually from across the globe. The buzz of excitement and anticipation in the air was undeniable, setting the stage for an unforgettable event forĀ [ABP.IO](https://abp.io/). + + + +![53227564247\_b7acafea68\_c.jpg](3a0e074506bcc60cad473655b6fd5da6.jpg) + + + +![53227631612\_eb38958391\_c.jpg](3a0e074555e8d6f62bc3d47c00f86762.jpg) + + + +![53227631792\_a6d87b4abf\_k.jpg](3a0e0745b6418472a66d905053d492e6.jpg) + + + +As one of the proud sponsors, we set up our booth, engaged with attendees, and delved into a wide range of sessions, workshops, and keynotes to absorb the latest software development trends. + + + +### Engaging with Enthusiastic Minds + + + + + +As the lead developersĀ of ABP Core Team,Ā *[Alper](https://twitter.com/alperebicoglu)*Ā andĀ *[Ismail](https://twitter.com/ismcagdas)*Ā presented the ABP.IO platform modules and features were quite busy enjoying their presenting work with latest version of demos.Ā Alper also gave a great speech on ā€œBuilding Multi-tenant ASP.NET Core Application & the ABP Frameworkā€ at the BASTA! Mainz conference. + + + +![53229004005\_3312b6bfa2\_k.jpg](3a0e074625fddc3097efdc1bef3058d8.jpg) + + + +![20230926\_170335.jpg](3a0e074675731c4a59167a878d4cd04e.jpg) + + + +We introducedĀ **[ABP Framework](https://abp.io/)**, community-driven open-source web application framework, andĀ **[ABP Commercial](https://commercial.abp.io/)**, our enterprise-ready web development platform that is built on top of the open-source ABP Framework to the crowds. + + + +![53227632222\_0a5af1fcc1\_k.jpg](3a0e074703a63129e5713ff51653aaac.jpg) + + + +![53228506206\_24e22498fa\_o.jpg](3a0e07477e980a4c2104300557e8f7fb.jpg) + + + +![53228505931\_b2aea761f9\_k.jpg](3a0e0747c283919bbc5edfdc289db1d8.jpg) + + + +Apart from that, we were thrilled to give away theĀ **[ABP Commercial Licenses](https://commercial.abp.io/pricing)**Ā to the eager attendees on the venue, including the Raffle prize,Ā **Meta Quest 2**, on our last day in BASTA! Conference. + + + +![ęˆŖå±2023-10-03 11.06.01.png](3a0e0748c8752dfdc2bcb5b9b2ce5908.png) + + + +We are profoundly satisfied with the huge interest and engagement shown by the attendees. The sense of community, collaboration, and shared passion for .NET solutions was palpable throughout the event. + + + +![20230927\_171046.jpg](3a0e07495efa58bb9f1e523d982dbc65.jpg) + + + +![20230928\_150135.jpg](3a0e0749c23a9e3b06d66ed54bed0c7a.jpg) + + + +![20230928\_150533 20.57.50.jpg](3a0e074a268272e630d8422ace32b4c8.jpg) + + + +### A Great Partnership with LIS GmbH + + + + + +![3a0e074aa3857a696cb941edc46dcb52](https://github.com/user-attachments/assets/ea0f6d32-e49b-4573-997f-9751ef16b303) + + + + +At BASTA! Mainz 2023, we were particularly thrilled to celebrate our collaboration withĀ ***LIS GmbH***, a leading software solutions provider. This partnership added a unique dimension to the conference, brought us a fresh perspective to the conference, fostering innovation and opening up new avenues for attendees. + + + +### A Big Thank-You from ABP Team + + + + + +![53228503821\_27860119d9\_k.jpg](3a0e074b0a46662cf39a6796d0f23086.jpg) + + + +Now, a shout-out to BASTA! Mainz 2023. We want to thank to everyone who contributed to the success of this event – attendees, speakers, sponsors, and partners.The conference may have ended, but the knowledge gained, connections formed, and inspiration ignited will continue to shape the tech landscape for years to come. + + + +Until next time! diff --git a/docs/en/Community-Articles/2024-03-05-URL-Based-Localization/Post.md b/docs/en/Community-Articles/2024-03-05-URL-Based-Localization/Post.md new file mode 100644 index 0000000000..a73fd2507a --- /dev/null +++ b/docs/en/Community-Articles/2024-03-05-URL-Based-Localization/Post.md @@ -0,0 +1,134 @@ +# URL-Based Localization + +In this article I'll show you how to optimize your ABP website localization with a URL parameter. URL Paths are commonly being used to change the current UI culture. This method makes our website SEO-Friendly as you structuring the URLs for multiple languages. And you can also share the link of your website with a specific language. Let's see implementing multi-language support with URL parameters in an ABP project. + +![Turkish and English Localization within URL](scrshot1.jpg) + + + +## Mastering Website Localization: Language Codes in URLs Explained + +Enhancing UX with URL-Based website localization is mainly done with ASP.NET Core's routing system. Also we need to automatically redirect the links without language code parameter. Our URL structures for the localization will be as following: + +- https://mywebsite.com/en/dashboard (English) +- https://mywebsite.com/tr/dashboard (Turkish) + + + +## Routing + +Before starting to explain how to do this, you can see [this commit](https://github.com/salihozkara/MultiLangRoute/commit/09e40cfd751562dec0dab890e54e0c5ca9ee256c) which implements this functionality. The routing module consists of these fundamental classes: + +### 1. **MultiLanguageSupportMetaData.cs** + +This class is used to add a language parameter to route templates. For example, it changes the `/about` route to `/language/about`. + +### 2. **MultiLanguageRedirectRequiredMetaData.cs** + +This class is used to redirect users to the correct language version. If a user visits the `/about` page and the current culture is `"tr-TR"`, this class will redirect them to `/tr-TR/about`. + +### 3. **UrlNormalizer.cs** + +This static class is used to normalize URLs by adding language information and improving performance using caching. + +```csharp +public static string NormalizeUrl(EndpointDataSource endpointDataSource, HttpContext httpContext, string url) +{ + // Normalize the URL and cache it + return Cache.GetOrAdd(url, (key) => + { + var absoluteUrl = GetAbsoluteUrl(key); + var multiLanguageRedirectRequiredMetaData = + GetMultiLanguageRedirectRequiredMetaData(endpointDataSource, absoluteUrl); + return multiLanguageRedirectRequiredMetaData?.ReBuildUrl(httpContext, key) ?? key; + }); +} +``` + +### 4. **MyLinkGenerator.cs** + +This class extends ASP.NET Core’s `LinkGenerator` class to automatically add language information to all generated links. + +### 5. **MyRouteDataRequestCultureProvider.cs** + +This class determines the current culture using the language parameter in the URL. For example, it extracts the `"tr-TR"` culture from the `/tr-TR/about` URL. + +### 6. **RoutingMiddleware.cs** + +This middleware processes HTTP requests and redirects users to the correct language version when necessary. + +```csharp +public override Task InvokeAsync(HttpContext context, RequestDelegate next) +{ + var endpoint = context.GetEndpoint(); + if(endpoint is not RouteEndpoint) + { + return next(context); + } + + // Redirect if necessary + var redirectMetaData = endpoint.Metadata.GetMetadata(); + if (redirectMetaData is not null) + { + redirectMetaData.Redirect(context); + return Task.CompletedTask; + } + + // ... +} +``` + + + +## CultureAnchorTagHelper.cs + +This **Tag Helper** processes `` tags in a Razor page and automatically adds language information to URLs if it's missing. + +```csharp +[HtmlTargetElement("a", Attributes = "href", TagStructure = TagStructure.NormalOrSelfClosing)] +public class CultureAnchorTagHelper(EndpointDataSource endpointDataSource, IHttpContextAccessor contextAccessor) + : TagHelper, ITransientDependency +{ + public override void Process(TagHelperContext context, TagHelperOutput output) + { + var href = output.Attributes["href"].Value.ToString(); + if (href != null) + { + output.Attributes.SetAttribute("href", + UrlNormalizer.NormalizeUrl(endpointDataSource, contextAccessor.HttpContext!, href)); + } + } +} +``` + +**How This Tag Helper Works:** + +- Finds all `` tags within your Razor pages. +- Retrieves the `href` attribute of each link. +- Uses the `UrlNormalizer.NormalizeUrl()` method to normalize the URL with the current culture information. +- Replaces the original URL with the normalized one. + +For example, if the current culture is `"tr"` and a page contains ``, this Tag Helper will transform it into ``. + + + +## Sample Project + +Salih Ɩzkara from ABP team created a sample working project which implements URL localization. He used ABP free tier MVC template and MongoDB. You can check out the related commit which implements URL localization: + +https://github.com/salihozkara/MultiLangRoute/commit/09e40cfd751562dec0dab890e54e0c5ca9ee256c + +And full working demo is available at: + +https://github.com/salihozkara/MultiLangRoute + +You can download the demo project at: + +[UrlLocalizationSampleProject.zip](https://github.com/abpframework/abp/blob/634ff52fb07d0b1281640695dbeffccdc943ca53/docs/en/Community-Articles/2024-03-05-URL-Based-Localization/UrlLocalizationSampleProject.zip) + + + +## Summary + +This implementation extends ASP.NET Core’s routing mechanism and utilizes caching for improved performance. It ensures multilingual support by normalizing URLs, redirecting users to the appropriate language version, and automatically handling language-specific links. + diff --git a/docs/en/Community-Articles/2024-03-05-URL-Based-Localization/UrlLocalizationSampleProject.zip b/docs/en/Community-Articles/2024-03-05-URL-Based-Localization/UrlLocalizationSampleProject.zip new file mode 100644 index 0000000000..a9079c5f6e Binary files /dev/null and b/docs/en/Community-Articles/2024-03-05-URL-Based-Localization/UrlLocalizationSampleProject.zip differ diff --git a/docs/en/Community-Articles/2024-03-05-URL-Based-Localization/cover.png b/docs/en/Community-Articles/2024-03-05-URL-Based-Localization/cover.png new file mode 100644 index 0000000000..b0f06080af Binary files /dev/null and b/docs/en/Community-Articles/2024-03-05-URL-Based-Localization/cover.png differ diff --git a/docs/en/Community-Articles/2024-03-05-URL-Based-Localization/scrshot1.jpg b/docs/en/Community-Articles/2024-03-05-URL-Based-Localization/scrshot1.jpg new file mode 100644 index 0000000000..0d35786717 Binary files /dev/null and b/docs/en/Community-Articles/2024-03-05-URL-Based-Localization/scrshot1.jpg differ diff --git a/docs/en/Community-Articles/2025-02-07-event-recap-ndc-london-2025/3a180ca3de1eb496455c4c3341721ab3.jpg b/docs/en/Community-Articles/2025-02-07-event-recap-ndc-london-2025/3a180ca3de1eb496455c4c3341721ab3.jpg new file mode 100644 index 0000000000..7bceee338c Binary files /dev/null and b/docs/en/Community-Articles/2025-02-07-event-recap-ndc-london-2025/3a180ca3de1eb496455c4c3341721ab3.jpg differ diff --git a/docs/en/Community-Articles/2025-02-07-event-recap-ndc-london-2025/3a180ca5122043881595c75c6ea661de.jpg b/docs/en/Community-Articles/2025-02-07-event-recap-ndc-london-2025/3a180ca5122043881595c75c6ea661de.jpg new file mode 100644 index 0000000000..95942671c8 Binary files /dev/null and b/docs/en/Community-Articles/2025-02-07-event-recap-ndc-london-2025/3a180ca5122043881595c75c6ea661de.jpg differ diff --git a/docs/en/Community-Articles/2025-02-07-event-recap-ndc-london-2025/3a180ca776481fe9cb89b439988e99e1.jpg b/docs/en/Community-Articles/2025-02-07-event-recap-ndc-london-2025/3a180ca776481fe9cb89b439988e99e1.jpg new file mode 100644 index 0000000000..847bff8724 Binary files /dev/null and b/docs/en/Community-Articles/2025-02-07-event-recap-ndc-london-2025/3a180ca776481fe9cb89b439988e99e1.jpg differ diff --git a/docs/en/Community-Articles/2025-02-20-Using-OutboxInbox-Pattern-for-Reliable-Event-Handling-in-a-Multi-Module-Monolithic-Application/POST.md b/docs/en/Community-Articles/2025-02-20-Using-OutboxInbox-Pattern-for-Reliable-Event-Handling-in-a-Multi-Module-Monolithic-Application/POST.md new file mode 100644 index 0000000000..b3a5b145e9 --- /dev/null +++ b/docs/en/Community-Articles/2025-02-20-Using-OutboxInbox-Pattern-for-Reliable-Event-Handling-in-a-Multi-Module-Monolithic-Application/POST.md @@ -0,0 +1,234 @@ +# Using Outbox/Inbox Pattern for Reliable Event Handling in a Multi-Module Monolithic Application + +This article explains how to implement reliable event handling using the `Outbox/Inbox` pattern in a modular monolithic application with multiple databases. We'll use the `ModularCRM` project as an example (how that project was created is explained in [this document](https://abp.io/docs/latest/tutorials/modular-crm)). + +## Project Background + +`ModularCRM` is a monolithic application that integrates multiple ABP framework open-source modules, including: + +- `Account` +- `Identity` +- `Tenant Management` +- `Permission Management` +- `Setting Management` +- And other open-source modules + +Besides the ABP framework modules, the project contains three business modules: + +- Order module (`Ordering`), using `MongoDB` database +- Product module (`Products`), using `SQL Server` database +- Payment module (`Payment`), using `MongoDB` database + +The project configures separate database connection strings for `ModularCRM` and the three business modules in `appsettings.json`: + +```json +{ + "ConnectionStrings": { + "Default": "Server=localhost,1434;Database=ModularCrm;User Id=sa;Password=1q2w3E***;TrustServerCertificate=true", + "Products": "Server=localhost,1434;Database=ModularCrm_Products;User Id=sa;Password=1q2w3E***;TrustServerCertificate=true", + "Ordering": "mongodb://localhost:27017/ModularCrm_Ordering?replicaSet=rs0", + "Payment": "mongodb://localhost:27017/ModularCrm_Payment?replicaSet=rs0" + } +} +``` + +## Business Scenario + +These modules communicate through the ABP framework's `DistributedEventBus` to implement the following business flow: + +> This is a simple example flow. Real business flows are more complex. The sample code is for demonstration purposes. + +1. Order module: Publishes `OrderPlacedEto` event when an order is placed +2. Product module: Subscribes to `OrderPlacedEto` event and reduce product stock +3. Payment module: Subscribes to `OrderPlacedEto` event, processes payment, then publishes `PaymentCompletedEto` event +4. Order module: Subscribes to `PaymentCompletedEto` event and updates order status to `Delivered` + +When implementing this flow, we need to ensure: + +- Transaction consistency between order creation and event publishing +- Transaction consistency when modules process messages +- Reliable message delivery (including persistence, confirmation, and retry mechanisms) + +Using the default implementation of the ABP framework's distributed event bus cannot meet these requirements, so we need to add a new mechanism that is also provided by the ABP Framework. + +## Outbox/Inbox Pattern Solution + +To meet these requirements, we use the `Outbox/Inbox` pattern: + +### Outbox Pattern + +- Saves distributed events with database operations in the same transaction +- Sends events to distributed message service through background jobs +- Ensures consistency between data updates and event publishing +- Prevents message loss during system failures + +### Inbox Pattern + +- First saves received distributed events to the database +- Processes events in a transactional way +- Ensures messages are processed only once by saving processed message records +- Maintains processing state for reliable handling + +> For how to enable and configure `Outbox/Inbox` in projects and modules, see: https://abp.io/docs/latest/framework/infrastructure/event-bus/distributed#outbox-inbox-for-transactional-events + +### Module Configuration + +Each module needs to configure separate `Outbox/Inbox`. Since it's a monolithic application, all message processing classes are in the same project, so we need to configure `Outbox/Inbox` for each module with `Selector/EventSelector` to ensure that the module only sends and receives the messages it cares about, avoiding message duplication processing. + +**ModularCRM Main Application Configuration** + +It will send and receive messages from all ABP framework open-source modules. + +```csharp +// This selector will match all abp built-in modules and the current module. +Func abpModuleSelector = type => type.Namespace != null && (type.Namespace.StartsWith("Volo.") || type.Assembly == typeof(ModularCrmModule).Assembly); + +Configure(options => +{ + options.Inboxes.Configure("ModularCrm", config => + { + config.UseDbContext(); + config.EventSelector = abpModuleSelector; + config.HandlerSelector = abpModuleSelector; + }); + + options.Outboxes.Configure("ModularCrm", config => + { + config.UseDbContext(); + config.Selector = abpModuleSelector; + }); +}); +``` + +**Order Module Configuration** + +It only sends `OrderPlacedEto` events and receives `PaymentCompletedEto` events and executes `OrderPaymentCompletedEventHandler`. + +```csharp +Configure(options => +{ + options.Inboxes.Configure(OrderingDbProperties.ConnectionStringName, config => + { + config.UseMongoDbContext(); + config.EventSelector = type => type == typeof(PaymentCompletedEto); + config.HandlerSelector = type => type == typeof(OrderPaymentCompletedEventHandler); + }); + + options.Outboxes.Configure(OrderingDbProperties.ConnectionStringName, config => + { + config.UseMongoDbContext(); + config.Selector = type => type == typeof(OrderPlacedEto); + }); +}); +``` + +> Here, the `EventSelector` and `HandlerSelector` checks only a single type. If you have multiple events and event handlers, you can check the given type if it is included in an array of types. + +**Product Module Configuration** + +It only receives `EntityCreatedEto` and `OrderPlacedEto` events and executes `ProductsOrderPlacedEventHandler` and `ProductsUserCreatedEventHandler`. It does not send any events now. + +```csharp +Configure(options => +{ + options.Inboxes.Configure(ProductsDbProperties.ConnectionStringName, config => + { + config.UseDbContext(); + config.EventSelector = type => type == typeof(EntityCreatedEto) || type == typeof(OrderPlacedEto); + config.HandlerSelector = type => type == typeof(ProductsOrderPlacedEventHandler) || type == typeof(ProductsUserCreatedEventHandler); + }); + + // Outboxes are not used in this module + options.Outboxes.Configure(ProductsDbProperties.ConnectionStringName, config => + { + config.UseDbContext(); + config.Selector = type => false; + }); +}); +``` + +**Payment Module Configuration** + +It only sends `PaymentCompletedEto` events and receives `OrderPlacedEto` events and executes `PaymentOrderPlacedEventHandler`. + +```csharp +Configure(options => +{ + options.Inboxes.Configure(PaymentDbProperties.ConnectionStringName, config => + { + config.UseMongoDbContext(); + config.EventSelector = type => type == typeof(OrderPlacedEto); + config.HandlerSelector = type => type == typeof(PaymentOrderPlacedEventHandler); + }); + + options.Outboxes.Configure(PaymentDbProperties.ConnectionStringName, config => + { + config.UseMongoDbContext(); + config.Selector = type => type == typeof(PaymentCompletedEto); + }); +}); +``` + +## Running ModularCRM Simulation Business Flow + +1. Run the following command in the `ModularCrm` directory: + +``` +# Start SQL Server and MongoDB databases in Docker +docker-compose up -d + +# Restore and install project npm dependencies +abp install-lib + +# Migrate databases +dotnet run --project ModularCrm --migrate-database + +# Start the application +dotnet run --project ModularCrm +``` + +2. Navigate to `https://localhost:44303/` to view the application homepage + +![index](index.png) + +3. Enter a customer name and select a product, then submit an order. After a moment, refresh the page to see the order, product, and payment information. + +![order](order.png) + +Application logs display the complete processing flow: + +``` +[Ordering Module] Order created: OrderId: b7ad3f47-0e77-bb81-082f-3a1834503e88, ProductId: 0f95689f-4cb6-36f5-68bd-3a18344d32c9, CustomerName: john + +[Products Module] OrderPlacedEto event received: OrderId: b7ad3f47-0e77-bb81-082f-3a1834503e88, CustomerName: john, ProductId: 0f95689f-4cb6-36f5-68bd-3a18344d32c9 +[Products Module] Stock count decreased for ProductId: 0f95689f-4cb6-36f5-68bd-3a18344d32c9 + +[Payment Module] OrderPlacedEto event received: OrderId: b7ad3f47-0e77-bb81-082f-3a1834503e88, CustomerName: john, ProductId: 0f95689f-4cb6-36f5-68bd-3a18344d32c9 +[Payment Module] Payment processing completed for OrderId: b7ad3f47-0e77-bb81-082f-3a1834503e88 + +[Ordering Module] PaymentCompletedEto event received: OrderId: b7ad3f47-0e77-bb81-082f-3a1834503e88, PaymentId: d0a41ead-ee0f-714c-e254-3a1834504d65, PaymentMethod: CreditCard, PaymentAmount: ModularCrm.Payment.Payment.PaymentCompletedEto +[Ordering Module] Order state updated to Delivered for OrderId: b7ad3f47-0e77-bb81-082f-3a1834503e88 +``` + +In addition, when a new user registers, the product module will also receive the `EntityCreatedEto` event, and we will send an email to the new user, just to demonstrate the `Outbox/Inbox Selector` mechanism. + +``` +[Products Module] UserCreated event received: UserId: "9a1f2bd0-5b28-210a-9e56-3a18344d310a", UserName: admin +[Products Module] Sending a popular products email to admin@abp.io... +``` + +## Summary + +By introducing the `Outbox/Inbox` pattern, we have achieved: + +1. Transactional message sending and receiving +2. Reliable message processing mechanism +3. Modular event processing in a multi-database environment + +ModularCRM project not only implements reliable message processing but also demonstrates how to handle multi-database scenarios gracefully in a monolithic application. Project source code: https://github.com/abpframework/abp-samples/tree/master/ModularCrm-OutboxInbox-Pattern + +## Reference + +- [Outbox/Inbox for transactional events](https://abp.io/docs/latest/framework/infrastructure/event-bus/distributed#outbox-inbox-for-transactional-events) +- [ConnectionStrings](https://abp.io/docs/latest/framework/fundamentals/connection-strings) +- [ABP Studio: Single Layer Solution Template](https://abp.io/docs/latest/solution-templates/single-layer-web-application) diff --git a/docs/en/Community-Articles/2025-02-20-Using-OutboxInbox-Pattern-for-Reliable-Event-Handling-in-a-Multi-Module-Monolithic-Application/index.png b/docs/en/Community-Articles/2025-02-20-Using-OutboxInbox-Pattern-for-Reliable-Event-Handling-in-a-Multi-Module-Monolithic-Application/index.png new file mode 100644 index 0000000000..cadd2c29c1 Binary files /dev/null and b/docs/en/Community-Articles/2025-02-20-Using-OutboxInbox-Pattern-for-Reliable-Event-Handling-in-a-Multi-Module-Monolithic-Application/index.png differ diff --git a/docs/en/Community-Articles/2025-02-20-Using-OutboxInbox-Pattern-for-Reliable-Event-Handling-in-a-Multi-Module-Monolithic-Application/order.png b/docs/en/Community-Articles/2025-02-20-Using-OutboxInbox-Pattern-for-Reliable-Event-Handling-in-a-Multi-Module-Monolithic-Application/order.png new file mode 100644 index 0000000000..4c66eff9c0 Binary files /dev/null and b/docs/en/Community-Articles/2025-02-20-Using-OutboxInbox-Pattern-for-Reliable-Event-Handling-in-a-Multi-Module-Monolithic-Application/order.png differ diff --git a/docs/en/Community-Articles/2025-02-21-catch-us-at-basta-frankfurt-2025/3a183abfe065ba8bacdd56ef05d9a4cd.jpg b/docs/en/Community-Articles/2025-02-21-catch-us-at-basta-frankfurt-2025/3a183abfe065ba8bacdd56ef05d9a4cd.jpg new file mode 100644 index 0000000000..a84abea379 Binary files /dev/null and b/docs/en/Community-Articles/2025-02-21-catch-us-at-basta-frankfurt-2025/3a183abfe065ba8bacdd56ef05d9a4cd.jpg differ diff --git a/docs/en/Community-Articles/2025-02-21-catch-us-at-basta-frankfurt-2025/3a183ac7b768a9a7523278ab07847b3c.jpg b/docs/en/Community-Articles/2025-02-21-catch-us-at-basta-frankfurt-2025/3a183ac7b768a9a7523278ab07847b3c.jpg new file mode 100644 index 0000000000..2a279d7ad2 Binary files /dev/null and b/docs/en/Community-Articles/2025-02-21-catch-us-at-basta-frankfurt-2025/3a183ac7b768a9a7523278ab07847b3c.jpg differ diff --git a/docs/en/Community-Articles/2025-02-21-catch-us-at-basta-frankfurt-2025/3a183ac7c4767cabf12d657ac90f4c17.jpg b/docs/en/Community-Articles/2025-02-21-catch-us-at-basta-frankfurt-2025/3a183ac7c4767cabf12d657ac90f4c17.jpg new file mode 100644 index 0000000000..57a50c2c6e Binary files /dev/null and b/docs/en/Community-Articles/2025-02-21-catch-us-at-basta-frankfurt-2025/3a183ac7c4767cabf12d657ac90f4c17.jpg differ diff --git a/docs/en/Community-Articles/2025-02-21-catch-us-at-basta-frankfurt-2025/post.md b/docs/en/Community-Articles/2025-02-21-catch-us-at-basta-frankfurt-2025/post.md new file mode 100644 index 0000000000..98b924409b --- /dev/null +++ b/docs/en/Community-Articles/2025-02-21-catch-us-at-basta-frankfurt-2025/post.md @@ -0,0 +1,28 @@ +We are excited to share some fantastic news with our community! We are proud to announce that ABP.IO is going to be at the BASTA! Conference on March 03-07, 2025 in Frankfurt and İsmail Ƈağdaş from our dev team is going to be a speaker on March 04! + +#### **About BASTA!** +For those who don’t know, BASTA! is the leading independent conference for Microsoft technologies in the German-speaking world. For over 20 years, it has been setting standards in the areas of C#, .NET and cloud and web technologies and is considered a must-attend event for Microsoft, cloud, web developers and key players in the software industry. BASTA! is a conference for developers and IT professionals who want to stay up to date with the latest technologies. + +#### **ABP at [BASTA! Mainz 2023](https://abp.io/blog/BASTA-Mainz-2023-What-a-Blast-in-Germany)** +![basta 2023.jpg](3a183abfe065ba8bacdd56ef05d9a4cd.jpg) + +![2222.jpg](3a183ac7b768a9a7523278ab07847b3c.jpg) + +![3333.jpg](3a183ac7c4767cabf12d657ac90f4c17.jpg) +##### +#### **What to Expect at [BASTA! 2025](https://basta.net/frankfurt-en/)** +The most exciting part is İsmail Ƈağdaş from the ABP developer team will be speaking at the conference on March 04 about the concepts of monoliths and microservices will be briefly explored, along with how modular monoliths bring together the advantages of these two architectures. Using the ABP Framework as an example, the session will highlight its modularity features and demonstrate how it can assist in creating and developing a modular monolith application. Finally, best practices for developing modular monoliths will be discussed, showing how these practices can pave the way for transitioning to a microservice-based architecture when necessary. + +If you want to find out more information about İsmail Ƈağdaş's session, [check here](https://basta.net/microservices-apis/modular-monoliths-architecture-abp/?loc=ffm): + +#### **Connect with Us** +We have exciting raffles and surprises planned at our booth and look forward to sharing more information about our solutions with you there. + +#### **Join Us Online** +Don't worry if you can't join us in person, our online booth is going to be there for you! The Expo of the online version of BASTA! is open for the main conference days. + +Tuesday, March 4, 2025: 9:00 am – approx. 6:00 pm + +Wednesday, March 5, 2025: 9:00 am – approx. 6:00 pm + +Thursday, March 6, 2025: 9:00 am – approx. 5:45 pm diff --git a/docs/en/Community-Articles/2025-03-10-WE-HAD-A-BLAST-AT-BASTA-FRANKFURT-2025/20250304_122158.webp b/docs/en/Community-Articles/2025-03-10-WE-HAD-A-BLAST-AT-BASTA-FRANKFURT-2025/20250304_122158.webp new file mode 100644 index 0000000000..0157ed9011 Binary files /dev/null and b/docs/en/Community-Articles/2025-03-10-WE-HAD-A-BLAST-AT-BASTA-FRANKFURT-2025/20250304_122158.webp differ diff --git a/docs/en/Community-Articles/2025-03-10-WE-HAD-A-BLAST-AT-BASTA-FRANKFURT-2025/20250304_153010.webp b/docs/en/Community-Articles/2025-03-10-WE-HAD-A-BLAST-AT-BASTA-FRANKFURT-2025/20250304_153010.webp new file mode 100644 index 0000000000..3d563385fe Binary files /dev/null and b/docs/en/Community-Articles/2025-03-10-WE-HAD-A-BLAST-AT-BASTA-FRANKFURT-2025/20250304_153010.webp differ diff --git a/docs/en/Community-Articles/2025-03-10-WE-HAD-A-BLAST-AT-BASTA-FRANKFURT-2025/20250304_153413.webp b/docs/en/Community-Articles/2025-03-10-WE-HAD-A-BLAST-AT-BASTA-FRANKFURT-2025/20250304_153413.webp new file mode 100644 index 0000000000..c6789858c7 Binary files /dev/null and b/docs/en/Community-Articles/2025-03-10-WE-HAD-A-BLAST-AT-BASTA-FRANKFURT-2025/20250304_153413.webp differ diff --git a/docs/en/Community-Articles/2025-03-10-WE-HAD-A-BLAST-AT-BASTA-FRANKFURT-2025/20250305_151043.webp b/docs/en/Community-Articles/2025-03-10-WE-HAD-A-BLAST-AT-BASTA-FRANKFURT-2025/20250305_151043.webp new file mode 100644 index 0000000000..13feb34d6b Binary files /dev/null and b/docs/en/Community-Articles/2025-03-10-WE-HAD-A-BLAST-AT-BASTA-FRANKFURT-2025/20250305_151043.webp differ diff --git a/docs/en/Community-Articles/2025-03-10-WE-HAD-A-BLAST-AT-BASTA-FRANKFURT-2025/IMG_4732-2000px.webp b/docs/en/Community-Articles/2025-03-10-WE-HAD-A-BLAST-AT-BASTA-FRANKFURT-2025/IMG_4732-2000px.webp new file mode 100644 index 0000000000..9b566f8509 Binary files /dev/null and b/docs/en/Community-Articles/2025-03-10-WE-HAD-A-BLAST-AT-BASTA-FRANKFURT-2025/IMG_4732-2000px.webp differ diff --git a/docs/en/Community-Articles/2025-03-10-WE-HAD-A-BLAST-AT-BASTA-FRANKFURT-2025/IMG_4770-2000px.webp b/docs/en/Community-Articles/2025-03-10-WE-HAD-A-BLAST-AT-BASTA-FRANKFURT-2025/IMG_4770-2000px.webp new file mode 100644 index 0000000000..6f0b03ffa4 Binary files /dev/null and b/docs/en/Community-Articles/2025-03-10-WE-HAD-A-BLAST-AT-BASTA-FRANKFURT-2025/IMG_4770-2000px.webp differ diff --git a/docs/en/Community-Articles/2025-03-10-WE-HAD-A-BLAST-AT-BASTA-FRANKFURT-2025/IMG_4915-2000px.webp b/docs/en/Community-Articles/2025-03-10-WE-HAD-A-BLAST-AT-BASTA-FRANKFURT-2025/IMG_4915-2000px.webp new file mode 100644 index 0000000000..fc30a3d4b2 Binary files /dev/null and b/docs/en/Community-Articles/2025-03-10-WE-HAD-A-BLAST-AT-BASTA-FRANKFURT-2025/IMG_4915-2000px.webp differ diff --git a/docs/en/Community-Articles/2025-03-10-WE-HAD-A-BLAST-AT-BASTA-FRANKFURT-2025/Screenshot_2025-03-04_at_13.47.28.webp b/docs/en/Community-Articles/2025-03-10-WE-HAD-A-BLAST-AT-BASTA-FRANKFURT-2025/Screenshot_2025-03-04_at_13.47.28.webp new file mode 100644 index 0000000000..4df621a674 Binary files /dev/null and b/docs/en/Community-Articles/2025-03-10-WE-HAD-A-BLAST-AT-BASTA-FRANKFURT-2025/Screenshot_2025-03-04_at_13.47.28.webp differ diff --git a/docs/en/Community-Articles/2025-03-10-WE-HAD-A-BLAST-AT-BASTA-FRANKFURT-2025/post.md b/docs/en/Community-Articles/2025-03-10-WE-HAD-A-BLAST-AT-BASTA-FRANKFURT-2025/post.md new file mode 100644 index 0000000000..7f11d88059 --- /dev/null +++ b/docs/en/Community-Articles/2025-03-10-WE-HAD-A-BLAST-AT-BASTA-FRANKFURT-2025/post.md @@ -0,0 +1,39 @@ +![](20250304_122158.webp) + +Our team had an amazing time at BASTA\! Frankfurt 2025, held from March 3 to 8 at the Frankfurt am Main Marriott Hotel. As a sponsor for this major conference for asp.net web developers, we were thrilled to connect with so many talented participants. + +**Event Highlights** + +![](20250304_153010.webp) + +![](20250304_153413.webp) + +The conference hosted many talented developers as speakers. One of them was İsmail Ƈağdaş who’s a lead developer from ABP team who talked about the concepts of monoliths and microservices. He explained how modular monoliths combine the strengths of these two architectures, using the ABP Framework as an example to showcase its modularity features and demonstrate how to build and develop a modular monolith application. + +**ABP’S Presence** + +![](IMG_4732-2000px.webp) + +![](IMG_4770-2000px.webp) + +At our booth we displayed the latest features of the ABP Framework and gathered valuable feedback from especially dotnet developers. So many attendees showed interest in ABP which was very exciting. It was great engaging with so many participants who wanted to learn more about how ABP provides the infrastructure and tools to create business solutions. + +We're also very grateful to our booth neighbor, Xceed and it was a lot of fun connecting with them during the conference. For those who don’t know, Xceed provides comprehensive UI components that allow developers to focus on innovation and their business requirements. + +**Networking and Community Engagement** + +We organized two raffles during the event, where attendees had the chance to win 2 great prizes. One attendee won a LEGO set and another won an Amazon Kindle. We were happy to see many people attending our raffles, it definitely made this event more fun. Congratulations to the winners and thanks to those who participated\! + +![](IMG_4915-2000px.webp) + +![](20250305_151043.webp) + +**Looking Ahead** + +BASTA\! Frankfurt 2025 strengthened our commitment to the developer community. We want to continue our support for asp.net core developers, helping them create asp.net applications and optimize their workflows for web applications. + +**Gratitude and Future Events** + +Thank you to the organizers, speakers, and attendees for making BASTA\! Frankfurt 2025 such a fantastic experience. We look forward to future events and continued contributions to the net framework developers. + +We look forward to sharing more updates with you soon. We hope to see you at our next event\! diff --git a/docs/en/Community-Articles/2025-03-18-Using-Vue-Components/abp-js-proxy.png b/docs/en/Community-Articles/2025-03-18-Using-Vue-Components/abp-js-proxy.png new file mode 100644 index 0000000000..d7cfd05c5e Binary files /dev/null and b/docs/en/Community-Articles/2025-03-18-Using-Vue-Components/abp-js-proxy.png differ diff --git a/docs/en/Community-Articles/2025-03-18-Using-Vue-Components/post.md b/docs/en/Community-Articles/2025-03-18-Using-Vue-Components/post.md new file mode 100644 index 0000000000..bc0b390b03 --- /dev/null +++ b/docs/en/Community-Articles/2025-03-18-Using-Vue-Components/post.md @@ -0,0 +1,324 @@ +# Using Vue components in a Razor Pages ABP Application + +In modern web development, integrating dynamic front-end frameworks with server-side technologies has become increasingly essential for creating responsive and interactive applications. This article explores how to effectively use Vue components within Razor Pages in an ABP Framework application. We will delve into the process of consuming endpoints through ABP Client Proxies, leveraging ABP's powerful localization features to enhance user experience, and implementing ABP permissions to ensure secure access control. By the end of this guide, you will have a comprehensive understanding of how to seamlessly blend Vue.js with Razor Pages, empowering you to build robust and user-friendly applications. + +This article won't use any SPA approach. The goal of this article is to use Razor Pages with simple Vue components to eliminate jQuery while developing MVC application. + +> **šŸŽ‰ Also video version is available!** +> +> [Watch on YouTube Now!](https://youtu.be/sZ8iSMovHZs?si=GynuJjsLEI1p2g6w) + +## Creating the Solution + +Let's create a simple TODO list application to demonstrate how to use Vue components in Razor Pages. I'll build a really simple backend without a connection to a database for demonstration purposes. We will focus on the frontend part. + +- Creating a solution with ABP CLI: + +```bash +abp new MyTodoApp -t app-nolayers -csf +``` + +## Configure Vue + +We need to add the `@abp/vue` package to the project to use Vue components. + +```bash +npm install @abp/vue +``` + +- Install client libraries by using ABP CLI: + +```bash +abp install-libs +``` + +As a last step, we need to configure our bundle in the `ConfigureBundles` method in the `MyTodoAppModule.cs` file: + +```csharp +private void ConfigureBundles() +{ + Configure(options => + { + // ... + + options.ScriptBundles.Configure( + // Or BasicThemeBundles.Scripts.Global + // Or LeptonXLiteThemeBundles.Scripts.Global + // šŸ‘‡ Depends on the theme you are using + LeptonXThemeBundles.Scripts.Global, + bundle => + { + bundle.AddFiles("/global-scripts.js"); + // šŸ‘‡ Make sure to add this line + bundle.AddContributors(typeof(VueScriptContributor)); + } + ); + }); +} +``` + +> If your IDE doesn't recognize the namespace of the `VueScriptContributor`, you can add it manually: +> +> ```csharp +> using Volo.Abp.AspNetCore.Mvc.UI.Packages.Vue; +> ``` + +Now we're ready to use Vue components in our Razor Pages. + +## Creating a Vue Component + +Let's create a simple Vue component to display the TODO list. + +### Passing a simple message to the component + +- Remove existing HTML codes in `Index.cshtml` and replace with the following code: + +```html +
+ +
+``` + +- Navigate to the `Index.cshtml.js` file and add the following code: +```js +Vue.component('message-component', { + template: '
Hello, {{ message }}
', + props: ['message'] +}); + +new Vue({ + el: '#vue-app' +}); +``` + +Run the application and you should see the following output: + +![Vue Component](./vue-message.png) + +> _Hard refresh might be required to see the component since we added a new vue js file to the bundle._ +> +> If still you can't see the component, please check the browser console for any errors. + +### Interacting with the component + +Let's add a button to the component to interact with the component. + +- Add another component in the `Index.cshtml` file: + +```html +
+ + +
+``` + +```js +Vue.component('counter-component', { + template:` +
+
+

Count: {{ count }}

+ +
+
+ `, + data: function () { + return { + count: 0 + }; + }, + methods: { + increment: function () { + this.count++; + } + } +}); +``` + +> _Do not replicate `new Vue({})` code block in the file. It's already in the `Index.cshtml.js` file. Keep it at the bottom of the file as it is._ + +Run the application and you should see the following output: + +![Vue Component](./vue-counter-result.gif) + + +## Using ABP Client Proxy, Authorization and Localization + + +### Building the backend +Before we go, let's build our backend to use in the component. + +- Creating a simple Application Service: + +```csharp +public class TodoAppService : MyTodoAppAppService, ITodoAppService +{ + public static List Items { get; } = new List(); + + [Authorize("Todo.Create")] + public async Task AddTodoItemAsync(TodoItem input) + { + Items.Add(input); + return input; + } + + [Authorize("Todo")] + public async Task> GetAllAsync() + { + await Task.Delay(1500); + return Items; + } +} +``` + +- `TodoItem.cs` + +```csharp +public class TodoItem +{ + public string Description { get; set; } + public bool IsDone { get; set; } +} +``` + +- `ITodoAppService.cs` + +```csharp +public interface ITodoAppService +{ + Task> GetAllAsync(); + Task AddTodoItemAsync(TodoItem input); +} +``` + +- Run the application and if you can see the following client proxy in the browser console, you're ready to go: + + ![Client Proxy](./abp-js-proxy.png) + +> [!NOTE] +> If you can't see the client proxy in the browser console, please check the [Dynamic JavaScript Proxies](https://abp.io/docs/latest/framework/ui/mvc-razor-pages/dynamic-javascript-proxies) to learn how to enable it. + +- Add a new permission in the `MyTodoAppPermissionDefinitionProvider.cs` file: +```csharp +public override void Define(IPermissionDefinitionContext context) +{ + var myGroup = context.AddGroup(MyTodoAppPermissions.GroupName); + + var todo = myGroup.AddPermission("Todo"); + todo.AddChild("Todo.Create"); +} +``` +> _I go without localization or constants for simplicity._ + +- Add a localization key in the `en.json` file: + +```json +{ + "TodoItems": "Todo Items Localized" +} +``` + +### Building the Vue Component: Using ABP Localization, Authorization and Client Proxy + +Since the component it directly loaded into the page, we can access the `abp` object on the page. + +So we can use: + +- `abp.localization.localize()` to localize a string. +- `abp.auth.isGranted()` to check the authorization. +- `myTodoApp.todo.getAll()` and `myTodoApp.todo.addTodoItem` to call the Application Service. + +inside **Vue Component** code. + +- Let's add another component named `todo-component` and usee all the **ABP Features** in it. + +```html +
+ + +
+``` + +- Implement the `todo-component` in `Index.cshtml.js` file: + +```js +Vue.component('todo-component', { + template: ` +
+
+

{{ abp.localization.localize('TodoItems') }}

+
+
+
+
+ Loading... +
+
+
    +
  • + + +
  • +
+

No todos yet

+
+ +
+ `, + data: function () { + return { + newTodo: { + description: '', + isDone: false + }, + isBusy: false, + todos: [] + }; + }, + methods: { + addTodo() { + myTodoApp.todo.addTodoItem(this.newTodo); + this.newTodo = { description: '', isDone: false }; + this.todos.push(this.newTodo); + + // Preferrable, you can load entire list of todos again. + // this.loadTodos(); + }, + async loadTodos() { + if (!abp.auth.isGranted('Todo')) { + return; + } + this.isBusy = true; + this.todos = await myTodoApp.todo.getAll(); + this.isBusy = false; + } + }, + mounted() { + this.loadTodos(); + } +}); +``` + +And see the result: + +![Vue Component](./todo-component-result.gif) + + +Since we use `abp.auth.isGranted()` to check the authorization, we can see the component only if we have the permission. + +Whenever you remove `Todo.Create` permission, you can see the component is not rendered. + +![Todo Permission](./todo-permission.png) + + +You won't see the card footer: + +![Todo Permission](./todo-permission-vue.png) diff --git a/docs/en/Community-Articles/2025-03-18-Using-Vue-Components/todo-component-result.gif b/docs/en/Community-Articles/2025-03-18-Using-Vue-Components/todo-component-result.gif new file mode 100644 index 0000000000..2eb50ee5c3 Binary files /dev/null and b/docs/en/Community-Articles/2025-03-18-Using-Vue-Components/todo-component-result.gif differ diff --git a/docs/en/Community-Articles/2025-03-18-Using-Vue-Components/todo-permission-vue.png b/docs/en/Community-Articles/2025-03-18-Using-Vue-Components/todo-permission-vue.png new file mode 100644 index 0000000000..10a11c146f Binary files /dev/null and b/docs/en/Community-Articles/2025-03-18-Using-Vue-Components/todo-permission-vue.png differ diff --git a/docs/en/Community-Articles/2025-03-18-Using-Vue-Components/todo-permission.png b/docs/en/Community-Articles/2025-03-18-Using-Vue-Components/todo-permission.png new file mode 100644 index 0000000000..f68e6eb20c Binary files /dev/null and b/docs/en/Community-Articles/2025-03-18-Using-Vue-Components/todo-permission.png differ diff --git a/docs/en/Community-Articles/2025-03-18-Using-Vue-Components/vue-counter-result.gif b/docs/en/Community-Articles/2025-03-18-Using-Vue-Components/vue-counter-result.gif new file mode 100644 index 0000000000..656f001535 Binary files /dev/null and b/docs/en/Community-Articles/2025-03-18-Using-Vue-Components/vue-counter-result.gif differ diff --git a/docs/en/Community-Articles/2025-03-18-Using-Vue-Components/vue-message.png b/docs/en/Community-Articles/2025-03-18-Using-Vue-Components/vue-message.png new file mode 100644 index 0000000000..a61963af44 Binary files /dev/null and b/docs/en/Community-Articles/2025-03-18-Using-Vue-Components/vue-message.png differ diff --git a/docs/en/Community-Articles/2025-03-23-Understanding-the-Embedded-Files-in-ABP-Framework/1.png b/docs/en/Community-Articles/2025-03-23-Understanding-the-Embedded-Files-in-ABP-Framework/1.png new file mode 100644 index 0000000000..f5cabbd4ef Binary files /dev/null and b/docs/en/Community-Articles/2025-03-23-Understanding-the-Embedded-Files-in-ABP-Framework/1.png differ diff --git a/docs/en/Community-Articles/2025-03-23-Understanding-the-Embedded-Files-in-ABP-Framework/2.png b/docs/en/Community-Articles/2025-03-23-Understanding-the-Embedded-Files-in-ABP-Framework/2.png new file mode 100644 index 0000000000..0aee0bf048 Binary files /dev/null and b/docs/en/Community-Articles/2025-03-23-Understanding-the-Embedded-Files-in-ABP-Framework/2.png differ diff --git a/docs/en/Community-Articles/2025-03-23-Understanding-the-Embedded-Files-in-ABP-Framework/3.png b/docs/en/Community-Articles/2025-03-23-Understanding-the-Embedded-Files-in-ABP-Framework/3.png new file mode 100644 index 0000000000..6c008bc372 Binary files /dev/null and b/docs/en/Community-Articles/2025-03-23-Understanding-the-Embedded-Files-in-ABP-Framework/3.png differ diff --git a/docs/en/Community-Articles/2025-03-23-Understanding-the-Embedded-Files-in-ABP-Framework/post.md b/docs/en/Community-Articles/2025-03-23-Understanding-the-Embedded-Files-in-ABP-Framework/post.md new file mode 100644 index 0000000000..5664fd8091 --- /dev/null +++ b/docs/en/Community-Articles/2025-03-23-Understanding-the-Embedded-Files-in-ABP-Framework/post.md @@ -0,0 +1,248 @@ +# Understanding the Embedded Files in ABP Framework + +Embedded Files functionality in .NET applications allows external files (like configuration files, images, etc.) to be directly embedded into assemblies (.exe or .dll). This simplifies deployment, prevents file loss or tampering, improves security and performance, and reduces path and dependency management issues. Through embedded resources, programs can access these files more conveniently without additional file operations. + +## Embedding Files in Your Project + +We embed `Volo\Abp\MyModule\Localization\*.json` files into the assembly in our `MyModule.csproj`. + +```xml + + + + net9.0 + Exe + enable + + + + + + + + + + + + + +``` + +If we check the `en.json` file in our IDE, we'll see it's embedded in the assembly. + +![image](1.png) + +When we decompile the built `MyModule.dll` file, we can also see the `en.json` file. + +![image](2.png) + +## Accessing Embedded Files in Code + +```csharp +public class Program +{ + public static async Task Main(string[] args) + { + var embeddedFiles = typeof(Program).Assembly.GetManifestResourceNames(); + foreach (var embeddedFile in embeddedFiles) + { + Console.WriteLine(embeddedFile); + var fileStream = typeof(Program).Assembly.GetManifestResourceStream(embeddedFile); + if (fileStream != null) + { + using var reader = new System.IO.StreamReader(fileStream); + var content = await reader.ReadToEndAsync(); + Console.WriteLine(content); + } + } + } +} +``` +This code will output the embedded file names and their contents. + +``` +MyModule.Volo.Abp.MyModule.Localization.en.json + +{ + "key":"value" +} +``` + +## Integrating with ABP Virtual File System + +The ABP Virtual File System makes it possible to manage files that don't physically exist on the file system (disk). It's mainly used to embed (js, css, image..) files into assemblies and use them like physical files at runtime. + +The following code shows how to add embedded files from the current application assembly to the ABP virtual file system: + +```csharp +[DependsOn(typeof(AbpVirtualFileSystemModule))] +public class MyModule : AbpModule +{ + public override void ConfigureServices(ServiceConfigurationContext context) + { + Configure(options => + { + options.FileSets.AddEmbedded(); + }); + } +} +``` + +ABP creates an `AbpEmbeddedFileProvider` to access the embedded files. + +The full name of `en.json` is `MyModule.Volo.Abp.MyModule.Localization.en.json`. Without directory information, ABP uses `.` to split and assume directory information. This creates the following directory structure in the virtual file system: + +``` +[Dir] [/MyModule] +[Dir] [/MyModule/Volo] +[Dir] [/MyModule/Volo/Abp] +[Dir] [/MyModule/Volo/Abp/MyModule] +[Dir] [/MyModule/Volo/Abp/MyModule/Localization] +[File] [/MyModule/Volo/Abp/MyModule/Localization/en.json] +``` + +Now you can inject `IVirtualFileProvider` to access embedded files using the directory/file structure above. + +## Manifest Embedded File Provider + +You might have noticed that using `.` to split and assume directory information can cause confusion if filenames contain dots. + +For example, if your filename is `zh.hans.json`, ABP will generate the following directory structure, which isn't what we want: + +``` +[Dir] [/MyModule] +[Dir] [/MyModule/Volo] +[Dir] [/MyModule/Volo/Abp] +[Dir] [/MyModule/Volo/Abp/MyModule] +[Dir] [/MyModule/Volo/Abp/MyModule/Localization] +[Dir] [/MyModule/Volo/Abp/MyModule/Localization/zh] +[File] [/MyModule/Volo/Abp/MyModule/Localization/zh/hans.json] +``` + +Microsoft provides the `Microsoft.Extensions.FileProviders.Manifest` library to solve this problem. + +We need to add this package dependency and set `true` in our project: + +```xml + + + + net9.0 + Exe + enable + true + + + + + + + + + + + + + + +``` + +After rebuilding the project, when we decompile `MyModule.dll`, we'll see an additional `Microsoft.Extensions.FileProviders.Embedded.Manifest.xml` file. + +![image](3.png) + +This manifest file stores all the directory and file information of embedded resources. When ABP finds this file, it will use `ManifestEmbeddedFileProvider` instead of `AbpEmbeddedFileProvider` to access embedded files: + +```xml + + + 1.0 + + + Microsoft.Extensions.FileProviders.Embedded.Manifest.xml + + + + + + + MyModule.Volo.Abp.MyModule.Localization.zh.hans.json + + + + + + + +``` + +## Parameters of AddEmbedded Method + +The `AddEmbedded` method can take two parameters: + +### baseNamespace + +This may only be needed if you haven't used the `Manifest Embedded File Provider` and your project's `root namespace` isn't empty. In this case, set your root namespace here. + +The `root namespace` is your project's name by default. You can change it or set it to empty in the `csproj` file. + +```xml + + + MyModule + + +``` + +```xml + + + + + +``` + +```csharp +Configure(options => +{ + options.FileSets.AddEmbedded(baseNamespace: "MyModule"); +}); +``` + +``` +[Dir] [/Volo] +[Dir] [/Volo/Abp] +[Dir] [/Volo/Abp/MyModule] +[Dir] [/Volo/Abp/MyModule/Localization] +[File] [/Volo/Abp/MyModule/Localization/en.json] +``` + +### baseFolder + +If you don't want to expose all embedded files in the project, but only want to expose a specific folder (and sub folders/files), you can set the base folder relative to your project root folder. + +> baseFolder is only effective when using `Manifest Embedded File Provider`. + +You can set the `baseFolder` parameter to `/Volo/Abp/MyModule`, resulting in this directory structure: + +```csharp +Configure(options => +{ + options.FileSets.AddEmbedded(baseFolder: "/Volo/Abp/MyModule"); +}); +``` + +``` +[Dir] [Localization] +[File] [Localization/en.json] +``` + +## Summary + +We recommend using the `Manifest Embedded File Provider` in your projects and libraries. Hope this article has been helpful. + +## References + +[ABP Virtual File System](https://abp.io/docs/latest/framework/infrastructure/virtual-file-system) + +[Manifest Embedded File Provider](https://learn.microsoft.com/en-us/aspnet/core/fundamentals/file-providers#manifest-embedded-file-provider) diff --git a/docs/en/cli/index.md b/docs/en/cli/index.md index 940c8acccd..38503b73be 100644 --- a/docs/en/cli/index.md +++ b/docs/en/cli/index.md @@ -918,6 +918,8 @@ Usage: abp bundle [options] ```` +> This command is no longer needed if you are using Global Assets feature. See [Managing Global Scripts & Styles](../framework/ui/blazor/global-scripts-styles.md) for more information. + #### Options * ```--working-directory``` or ```-wd```: Specifies the working directory. This option is useful when executing directory doesn't contain a Blazor project file. diff --git a/docs/en/docs-nav.json b/docs/en/docs-nav.json index 03640f506c..d6d24fa271 100644 --- a/docs/en/docs-nav.json +++ b/docs/en/docs-nav.json @@ -783,78 +783,6 @@ "path": "framework/architecture", "isIndex": true }, - { - "text": "Module Development Best Practices", - "items": [ - { - "text": "Overview", - "path": "framework/architecture/best-practices", - "isIndex": true - }, - { - "text": "Module Architecture", - "path": "framework/architecture/best-practices/module-architecture.md" - }, - { - "text": "Domain Layer", - "items": [ - { - "text": "Overview", - "path": "framework/architecture/best-practices/domain-layer-overview.md", - "isIndex": true - }, - { - "text": "Entities", - "path": "framework/architecture/best-practices/entities.md" - }, - { - "text": "Repositories", - "path": "framework/architecture/best-practices/repositories.md" - }, - { - "text": "Domain Services", - "path": "framework/architecture/best-practices/domain-services.md" - } - ] - }, - { - "text": "Application Layer", - "items": [ - { - "text": "Overview", - "path": "framework/architecture/best-practices/application-layer-overview.md", - "isIndex": true - }, - { - "text": "Application Services", - "path": "framework/architecture/best-practices/application-services.md" - }, - { - "text": "Data Transfer Objects", - "path": "framework/architecture/best-practices/data-transfer-objects.md" - } - ] - }, - { - "text": "Data Access", - "items": [ - { - "text": "Overview", - "path": "framework/architecture/best-practices/data-access-overview.md", - "isIndex": true - }, - { - "text": "Entity Framework Core Integration", - "path": "framework/architecture/best-practices/entity-framework-core-integration.md" - }, - { - "text": "MongoDB Integration", - "path": "framework/architecture/best-practices/mongodb-integration.md" - } - ] - } - ] - }, { "text": "Modularity", "items": [ @@ -970,7 +898,8 @@ "items": [ { "text": "Overview", - "path": "framework/architecture/best-practices" + "path": "framework/architecture/best-practices", + "isIndex": true }, { "text": "Module Architecture", @@ -981,7 +910,8 @@ "items": [ { "text": "Overview", - "path": "framework/architecture/best-practices/domain-layer-overview.md" + "path": "framework/architecture/best-practices/domain-layer-overview.md", + "isIndex": true }, { "text": "Entities", @@ -1002,7 +932,8 @@ "items": [ { "text": "Overview", - "path": "framework/architecture/best-practices/application-layer-overview.md" + "path": "framework/architecture/best-practices/application-layer-overview.md", + "isIndex": true }, { "text": "Application Services", @@ -1019,7 +950,8 @@ "items": [ { "text": "Overview", - "path": "framework/architecture/best-practices/data-access-overview.md" + "path": "framework/architecture/best-practices/data-access-overview.md", + "isIndex": true }, { "text": "Entity Framework Core Integration", @@ -1032,7 +964,7 @@ ] } ] - } + }, ] }, { diff --git a/docs/en/framework/api-development/dynamic-csharp-clients.md b/docs/en/framework/api-development/dynamic-csharp-clients.md index def0b76360..a5dc2ec1cf 100644 --- a/docs/en/framework/api-development/dynamic-csharp-clients.md +++ b/docs/en/framework/api-development/dynamic-csharp-clients.md @@ -163,6 +163,30 @@ context.Services.AddHttpClientProxies( `remoteServiceConfigurationName` parameter matches the service endpoint configured via `AbpRemoteServiceOptions`. If the `BookStore` endpoint is not defined then it fallbacks to the `Default` endpoint. +#### Remote Service Configuration Provider + +You may need to get the remote service configuration for a specific remote service in some cases. For this, you can use the `IRemoteServiceConfigurationProvider` interface. + +**Example: Get the remote service configuration for the "BookStore" remote service** + +````csharp +public class MyService : ITransientDependency +{ + private readonly IRemoteServiceConfigurationProvider _remoteServiceConfigurationProvider; + + public MyService(IRemoteServiceConfigurationProvider remoteServiceConfigurationProvider) + { + _remoteServiceConfigurationProvider = remoteServiceConfigurationProvider; + } + + public async Task GetRemoteServiceConfiguration() + { + var configuration = await _remoteServiceConfigurationProvider.GetConfigurationOrDefaultAsync("BookStore"); + Console.WriteLine(configuration.BaseUrl); + } +} +```` + ### As Default Services When you create a service proxy for `IBookAppService`, you can directly inject the `IBookAppService` to use the proxy client (as shown in the usage section). You can pass `asDefaultServices: false` to the `AddHttpClientProxies` method to disable this feature. @@ -204,6 +228,8 @@ public override void PreConfigureServices(ServiceConfigurationContext context) This example uses the [Microsoft.Extensions.Http.Polly](https://www.nuget.org/packages/Microsoft.Extensions.Http.Polly) package. You also need to import the `Polly` namespace (`using Polly;`) to be able to use the `WaitAndRetryAsync` method. + + ## See Also * [Static C# Client Proxies](./static-csharp-clients.md) diff --git a/docs/en/framework/api-development/static-csharp-clients.md b/docs/en/framework/api-development/static-csharp-clients.md index 696507bd09..c8eaea4231 100644 --- a/docs/en/framework/api-development/static-csharp-clients.md +++ b/docs/en/framework/api-development/static-csharp-clients.md @@ -244,6 +244,30 @@ context.Services.AddStaticHttpClientProxies( `remoteServiceConfigurationName` parameter matches the service endpoint configured via `AbpRemoteServiceOptions`. If the `BookStore` endpoint is not defined then it fallbacks to the `Default` endpoint. +#### Remote Service Configuration Provider + +You may need to get the remote service configuration for a specific remote service in some cases. For this, you can use the `IRemoteServiceConfigurationProvider` interface. + +**Example: Get the remote service configuration for the "BookStore" remote service** + +````csharp +public class MyService : ITransientDependency +{ + private readonly IRemoteServiceConfigurationProvider _remoteServiceConfigurationProvider; + + public MyService(IRemoteServiceConfigurationProvider remoteServiceConfigurationProvider) + { + _remoteServiceConfigurationProvider = remoteServiceConfigurationProvider; + } + + public async Task GetRemoteServiceConfiguration() + { + var configuration = await _remoteServiceConfigurationProvider.GetConfigurationOrDefaultAsync("BookStore"); + Console.WriteLine(configuration.BaseUrl); + } +} +```` + ### Retry/Failure Logic & Polly Integration If you want to add retry logic for the failing remote HTTP calls for the client proxies, you can configure the `AbpHttpClientBuilderOptions` in the `PreConfigureServices` method of your module class. diff --git a/docs/en/framework/data/mongodb/index.md b/docs/en/framework/data/mongodb/index.md index 57532f4f59..d5bb4124aa 100644 --- a/docs/en/framework/data/mongodb/index.md +++ b/docs/en/framework/data/mongodb/index.md @@ -309,16 +309,39 @@ public class BookService ### Transactions -MongoDB supports multi-document transactions starting from the version 4.0 and the ABP supports it. However, the [startup template](../../../solution-templates) **disables** transactions by default. If your MongoDB **server** supports transactions, you can enable the it in the *YourProjectMongoDbModule* class: +MongoDB supports multi-document transactions starting from the version 4.0 and the ABP supports it. However, the [startup template](../../../solution-templates) **disables** transactions by default. If your MongoDB **server** supports transactions, you can enable them in the *YourProjectMongoDbModule* class: -```csharp -Configure(options => -{ - options.TransactionBehavior = UnitOfWorkTransactionBehavior.Auto; -}); +Remove the following code to enable transactions: + +```diff +- context.Services.AddAlwaysDisableUnitOfWorkTransaction(); +- Configure(options => +- { +- options.TransactionBehavior = UnitOfWorkTransactionBehavior.Disabled; +- }); ``` -> Or you can delete this code since this is already the default behavior. +#### Setting up a Transaction-Enabled MongoDB Replica Set in Docker + +Use the following `docker-compose.yml` to create a local MongoDB Replica Set that supports transactions. The connection string will be `mongodb://localhost:27017/YourProjectName?replicaSet=rs0`. + +```yaml +version: "3.8" + +services: + mongo: + image: mongo:8.0 + command: ["--replSet", "rs0", "--bind_ip_all", "--port", "27017"] + ports: + - 27017:27017 + healthcheck: + test: echo "try { rs.status() } catch (err) { rs.initiate({_id:'rs0',members:[{_id:0,host:'127.0.0.1:27017'}]}) }" | mongosh --port 27017 --quiet + interval: 5s + timeout: 30s + start_period: 0s + start_interval: 1s + retries: 30 +``` ### Advanced Topics @@ -510,4 +533,4 @@ public class MyCustomMongoDbBulkOperationProvider * [Entities](../../architecture/domain-driven-design/entities.md) * [Repositories](../../architecture/domain-driven-design/repositories.md) -* [Video tutorial](https://abp.io/video-courses/essentials/abp-mongodb) \ No newline at end of file +* [Video tutorial](https://abp.io/video-courses/essentials/abp-mongodb) diff --git a/docs/en/framework/infrastructure/background-jobs/index.md b/docs/en/framework/infrastructure/background-jobs/index.md index 35f761ddf1..5aa58a7d3e 100644 --- a/docs/en/framework/infrastructure/background-jobs/index.md +++ b/docs/en/framework/infrastructure/background-jobs/index.md @@ -236,6 +236,79 @@ Background Jobs module implements `IBackgroundJobStore` using various data acces > Background Jobs module is already installed to the startup templates by default and it works based on your ORM/data access choice. +### Using the Same Storage for Background Jobs & Workers + +If multiple applications share the same storage for background jobs and workers (`Default, Hangfire, RabbitMQ, and Quartz`), you should configure the provider options to use the application name for isolation. + +#### Default Background Job/Workers + +Set `ApplicationName` property in `AbpBackgroundJobWorkerOptions` to your application's name: + +````csharp +public override void PreConfigureServices(ServiceConfigurationContext context) +{ + PreConfigure(options => + { + options.ApplicationName = context.Services.GetApplicationName()!; + }); +} +```` + +#### Hangfire Background Job/Workers + +Set `DefaultQueuePrefix` property in `AbpHangfireOptions` to your application's name: + +````csharp +public override void ConfigureServices(ServiceConfigurationContext context) +{ + Configure(options => + { + options.DefaultQueuePrefix = context.Services.GetApplicationName()!; + }); +} +```` + +#### Quartz Background Job/Workers + +Set the `quartz.scheduler.instanceName` property to your application's name: + +````csharp +public override void PreConfigureServices(ServiceConfigurationContext context) +{ + var configuration = context.Services.GetConfiguration(); + PreConfigure(options => + { + options.Properties = new NameValueCollection + { + ["quartz.scheduler.instanceName"] = context.Services.GetApplicationName(), + + ["quartz.jobStore.dataSource"] = "BackgroundJobsDemoApp", + ["quartz.jobStore.type"] = "Quartz.Impl.AdoJobStore.JobStoreTX, Quartz", + ["quartz.jobStore.tablePrefix"] = "QRTZ_", + ["quartz.serializer.type"] = "json", + ["quartz.dataSource.BackgroundJobsDemoApp.connectionString"] = configuration.GetConnectionString("Default"), + ["quartz.dataSource.BackgroundJobsDemoApp.provider"] = "SqlServer", + ["quartz.jobStore.driverDelegateType"] = "Quartz.Impl.AdoJobStore.SqlServerDelegate, Quartz", + }; + }); +} +```` + +#### RabbitMQ Background Job + +Set `DefaultQueueNamePrefix` and `DefaultDelayedQueueNamePrefix` properties in `AbpRabbitMqBackgroundJobOptions` to your application's name: + +````csharp +public override void PreConfigureServices(ServiceConfigurationContext context) +{ + PreConfigure(options => + { + options.DefaultQueueNamePrefix = context.Services.GetApplicationName()!.EndsWith('.') + options.DefaultQueueNamePrefix; + options.DefaultDelayedQueueNamePrefix = context.Services.GetApplicationName()!.EndsWith('.') + options.DefaultDelayedQueueNamePrefix; + }); +} +```` + ### Clustered Deployment The default background job manager is compatible with [clustered environments](../../../deployment/clustered-environment.md) (where multiple instances of your application run concurrently). It uses a [distributed lock](../distributed-locking.md) to ensure that the jobs are executed only in a single application instance at a time. diff --git a/docs/en/framework/infrastructure/background-workers/index.md b/docs/en/framework/infrastructure/background-workers/index.md index 9f5d15e114..884ea60c25 100644 --- a/docs/en/framework/infrastructure/background-workers/index.md +++ b/docs/en/framework/infrastructure/background-workers/index.md @@ -132,6 +132,80 @@ If that's a problem for your workers, you have the following options: * Stop the background workers (set `AbpBackgroundWorkerOptions.IsEnabled` to `false`) in all application instances except one of them, so only the single instance runs the workers. * Stop the background workers (set `AbpBackgroundWorkerOptions.IsEnabled` to `false`) in all application instances and create a dedicated application (maybe a console application running in its own container or a Windows Service running in the background) to execute all the background tasks. This can be a good option if your background workers consume high system resources (CPU, RAM or Disk), so you can deploy that background application to a dedicated server and your background tasks don't affect your application's performance. + +### Using the Same Storage for Background Jobs & Workers + +If multiple applications share the same storage for background jobs and workers (`Default, Hangfire, RabbitMQ, and Quartz`), you should configure the provider options to use the application name for isolation. + +#### Default Background Job/Workers + +Set `ApplicationName` property in `AbpBackgroundJobWorkerOptions` to your application's name: + +````csharp +public override void PreConfigureServices(ServiceConfigurationContext context) +{ + PreConfigure(options => + { + options.ApplicationName = context.Services.GetApplicationName()!; + }); +} +```` + +#### Hangfire Background Job/Workers + +Set `DefaultQueuePrefix` property in `AbpHangfireOptions` to your application's name: + +````csharp +public override void ConfigureServices(ServiceConfigurationContext context) +{ + Configure(options => + { + options.DefaultQueuePrefix = context.Services.GetApplicationName()!; + }); +} +```` + +#### Quartz Background Job/Workers + +Set `quartz.scheduler.instanceName` property to your application's name: + +````csharp +public override void PreConfigureServices(ServiceConfigurationContext context) +{ + var configuration = context.Services.GetConfiguration(); + PreConfigure(options => + { + options.Properties = new NameValueCollection + { + ["quartz.scheduler.instanceName"] = context.Services.GetApplicationName(), + + ["quartz.jobStore.dataSource"] = "BackgroundJobsDemoApp", + ["quartz.jobStore.type"] = "Quartz.Impl.AdoJobStore.JobStoreTX, Quartz", + ["quartz.jobStore.tablePrefix"] = "QRTZ_", + ["quartz.serializer.type"] = "json", + ["quartz.dataSource.BackgroundJobsDemoApp.connectionString"] = configuration.GetConnectionString("Default"), + ["quartz.dataSource.BackgroundJobsDemoApp.provider"] = "SqlServer", + ["quartz.jobStore.driverDelegateType"] = "Quartz.Impl.AdoJobStore.SqlServerDelegate, Quartz", + }; + }); +} +```` + +#### RabbitMQ Background Job + +Set `DefaultQueueNamePrefix` and `DefaultDelayedQueueNamePrefix` properties in `AbpRabbitMqBackgroundJobOptions` to your application's name: + +````csharp +public override void PreConfigureServices(ServiceConfigurationContext context) +{ + PreConfigure(options => + { + options.DefaultQueueNamePrefix = context.Services.GetApplicationName()!.EndsWith('.') + options.DefaultQueueNamePrefix; + options.DefaultDelayedQueueNamePrefix = context.Services.GetApplicationName()!.EndsWith('.') + options.DefaultDelayedQueueNamePrefix; + }); +} +```` + ## Integrations Background worker system is extensible and you can change the default background worker manager with your own implementation or on of the pre-built integrations. diff --git a/docs/en/framework/infrastructure/cancellation-token-provider.md b/docs/en/framework/infrastructure/cancellation-token-provider.md index aea703403e..957e90e7bc 100644 --- a/docs/en/framework/infrastructure/cancellation-token-provider.md +++ b/docs/en/framework/infrastructure/cancellation-token-provider.md @@ -1,10 +1,14 @@ # Cancellation Token Provider -A `CancellationToken` enables cooperative cancellation between threads, thread pool work items, or `Task` objects. To handle the possible cancellation of the operation, ABP provides `ICancellationTokenProvider` to obtain the `CancellationToken` itself from the source. +A [`CancellationToken`](https://learn.microsoft.com/en-us/dotnet/api/system.threading.cancellationtoken) enables cooperative cancellation between threads, thread pool work items, or `Task` objects. To handle the possible cancellation of the operation, ABP provides `ICancellationTokenProvider` to obtain the `CancellationToken` itself from the source. -> To get more information about `CancellationToken`, see [Microsoft Documentation](https://docs.microsoft.com/en-us/dotnet/api/system.threading.cancellationtoken). +## When To Use Manual Cancellation Tokens -## ICancellationTokenProvider +**ABP automates cancellation token usage wherever possible**. For example, in ASP.NET Core applications, ABP automatically obtains the `CancellationToken` from the `HttpContext.RequestAborted` and uses it in database queries and other cancellable places. So, most of the times, you don't need to deal with `CancellationToken` objects to pass them between methods. + +> You do not need to use the `ICancellationTokenProvider` unless you want to add cancellation support in your own logic or to pass a cancellation token to a method outside of the ABP framework. + +## ICancellationTokenProvider Service `ICancellationTokenProvider` is an abstraction to provide `CancellationToken` for different scenarios. @@ -39,33 +43,27 @@ namespace MyProject } ``` -## Built-in providers +## Built-in Providers -- `NullCancellationTokenProvider` +- `HttpContextCancellationTokenProvider`: The **default provider** for ASP.NET Core applications. It simply provides a `CancellationToken` that is source of the web request from the `HttpContext.RequestAborted`. - The `NullCancellationTokenProvider` is a built in provider and it supply always `CancellationToken.None`. +- `NullCancellationTokenProvider`: A built in provider and it supply always `CancellationToken.None`. It is used if no other providers can be used. -- `HttpContextCancellationTokenProvider` - The `HttpContextCancellationTokenProvider` is a built in default provider for ABP Web applications. It simply provides a `CancellationToken` that is source of the web request from the `HttpContext`. +## Implementing a Custom Cancellation Token Provider -## Implementing the ICancellationTokenProvider - -You can easily create your CancellationTokenProvider by creating a class that implements the `ICancellationTokenProvider` interface, as shown below: +You can easily create your `ICancellationTokenProvider` implementation by creating a class that implements the `ICancellationTokenProvider` interface, as shown below: ```csharp using System.Threading; namespace AbpDemo { - public class MyCancellationTokenProvider : ICancellationTokenProvider + public class MyCancellationTokenProvider + : ICancellationTokenProvider, + ITransientDependency // Can also be singleton or scoped { - public CancellationToken Token { get; } - - private MyCancellationTokenProvider() - { - - } + public CancellationToken Token { get; } // TODO: Return a cancellation token } } ``` diff --git a/docs/en/framework/ui/blazor/basic-theme.md b/docs/en/framework/ui/blazor/basic-theme.md index 031a5f0fd5..bf4684b668 100644 --- a/docs/en/framework/ui/blazor/basic-theme.md +++ b/docs/en/framework/ui/blazor/basic-theme.md @@ -19,17 +19,26 @@ If you need to manually this theme, follow the steps below: {{if UI == "Blazor"}} -* Install the [Volo.Abp.AspNetCore.Components.WebAssembly.BasicTheme](https://www.nuget.org/packages/Volo.Abp.AspNetCore.Components.WebAssembly.BasicTheme) NuGet package to your web project. -* Add `AbpAspNetCoreComponentsWebAssemblyBasicThemeModule` into the `[DependsOn(...)]` attribute for your [module class](../../architecture/modularity/basics.md) in the your Blazor UI project. -* Use `Volo.Abp.AspNetCore.Components.WebAssembly.BasicTheme.Themes.Basic.App` as the root component of your application in the `ConfigureServices` method of your module: - - ```csharp - var builder = context.Services.GetSingletonInstance(); - builder.RootComponents.Add("#ApplicationContainer"); - ``` - `#ApplicationContainer` is a selector (like `
Loading...
`) in the `index.html`. - -* Execute `abp bundle` command under blazor project once. +* Install the [Volo.Abp.AspNetCore.Components.WebAssembly.BasicTheme.Bundling](https://www.nuget.org/packages/Volo.Abp.AspNetCore.Components.WebAssembly.BasicTheme.Bundling) NuGet package to your `Blazor` project. +* Add `AbpAspNetCoreComponentsWebAssemblyBasicThemeBundlingModule` into the `[DependsOn(...)]` attribute for your [module class](../../architecture/modularity/basics.md) in the your `Blazor` project. +* Install the [Volo.Abp.AspNetCore.Components.WebAssembly.BasicTheme](https://www.nuget.org/packages/Volo.Abp.AspNetCore.Components.WebAssembly.BasicTheme) NuGet package to your `Blazor.Client` project. +* Add `AbpAspNetCoreComponentsWebAssemblyBasicThemeModule` into the `[DependsOn(...)]` attribute for your [module class](../../architecture/modularity/basics.md) in the your `Blazor.Client` project. + +Update `Routes.razor` file in `Blazor.Client` project as below: + +````csharp +@using Volo.Abp.AspNetCore.Components.Web.BasicTheme.Themes.Basic +@using Volo.Abp.AspNetCore.Components.WebAssembly.WebApp + + + + + + + + + +```` {{end}} @@ -41,21 +50,38 @@ If you need to manually this theme, follow the steps below: * Add `AbpAspNetCoreComponentsServerBasicThemeModule` into the `[DependsOn(...)]` attribute for your [module class](../../architecture/modularity/basics.md) in the your Blazor UI project. -* Perform following changes in `Pages/_Host.cshtml` file +* Perform following changes in `App.razor` file * Add usings at the top of the page. ```html @using Volo.Abp.AspNetCore.Components.Server.BasicTheme.Bundling - @using Volo.Abp.AspNetCore.Components.Web.BasicTheme.Themes.Basic ``` - * Add Basic theme style bundles between `` tags. - ```html - + * Then replace script & style bunles as following ``` - * Add `App` component of Basic Theme in the body section of page. - ```html - + ``` + ``` + + ``` + +Update `Routes.razor` file as below: + +````csharp +@using Volo.Abp.AspNetCore.Components.Web.BasicTheme.Themes.Basic +@using Volo.Abp.AspNetCore.Components.Web.Theming.Routing +@using Microsoft.Extensions.Options +@inject IOptions RouterOptions + + + + + + + + + +```` + {{end}} ## The Layout diff --git a/docs/en/framework/ui/blazor/navigation-menu.md b/docs/en/framework/ui/blazor/navigation-menu.md index c9314d6022..4019538d42 100644 --- a/docs/en/framework/ui/blazor/navigation-menu.md +++ b/docs/en/framework/ui/blazor/navigation-menu.md @@ -123,6 +123,25 @@ if (await context.IsGrantedAsync("MyPermissionName")) > You can use `context.AuthorizationService` to directly access to the `IAuthorizationService`. + +### Custom Components + +Custom components can be used to render the menu items instead of the default components of the theme. The extension method named `UseComponent` from `Volo.Abp.UI.Navigation` namespace can be used to set a custom component for a menu item. + +**Example: Set a custom component for a menu item** + +```csharp +context.Menu.Items.Add( + new ApplicationMenuItem("MyProject.Crm.About", "About", "/about") + .UseComponent() + ); +``` + +_AboutMenuItemComponent.razor component will be renderd for the menu item._ + + + + ### Resolving Dependencies `context.ServiceProvider` can be used to resolve any service dependency. diff --git a/docs/en/framework/ui/blazor/theming.md b/docs/en/framework/ui/blazor/theming.md index 9a056580bb..dd942fd92f 100644 --- a/docs/en/framework/ui/blazor/theming.md +++ b/docs/en/framework/ui/blazor/theming.md @@ -106,22 +106,35 @@ using Volo.Abp.Bundling; namespace MyTheme { - public class MyThemeBundleContributor : IBundleContributor + public class MyThemeBundleContributor : BundleContributor { - public void AddScripts(BundleContext context) + public override void ConfigureBundle(BundleConfigurationContext context) { - + context.Files.AddIfNotContains("_content/MyTheme/styles.css"); } + } +} +```` - public void AddStyles(BundleContext context) +```cs +[DependsOn( + typeof(AbpAspNetCoreComponentsWebAssemblyThemingBundlingModule) +)] +public class MyBlazorWebAssemblyBundlingModule : AbpModule +{ + public override void ConfigureServices(ServiceConfigurationContext context) + { + Configure(options => { - context.Add("_content/MyTheme/styles.css"); - } + // Add style bundle + options.StyleBundles.Get(BlazorWebAssemblyStandardBundles.Styles.Global) + .AddContributors(typeof(MyThemeBundleContributor)); + }); } } -```` +``` -`styles.css` file should be added into the `wwwroot` folder of the theme project for this example. When you use the `abp bundle` command, this class is automatically discovered and executed to add the style to the page. +`styles.css` file should be added into the `wwwroot` folder of the theme project for this example. See the [Global Styles and Scripts](global-scripts-styles.md) document for more. diff --git a/docs/en/get-started/images/abp-studio-new-microservice-solution-dialog-optional-modules.png b/docs/en/get-started/images/abp-studio-new-microservice-solution-dialog-optional-modules.png index 2ac5685438..a268e4cde5 100644 Binary files a/docs/en/get-started/images/abp-studio-new-microservice-solution-dialog-optional-modules.png and b/docs/en/get-started/images/abp-studio-new-microservice-solution-dialog-optional-modules.png differ diff --git a/docs/en/get-started/images/abp-studio-new-microservice-solution-dialog-properties.png b/docs/en/get-started/images/abp-studio-new-microservice-solution-dialog-properties.png index 509033348d..fd811125c7 100644 Binary files a/docs/en/get-started/images/abp-studio-new-microservice-solution-dialog-properties.png and b/docs/en/get-started/images/abp-studio-new-microservice-solution-dialog-properties.png differ diff --git a/docs/en/get-started/images/abp-studio-new-solution-dialog-additional-options-microservice.png b/docs/en/get-started/images/abp-studio-new-solution-dialog-additional-options-microservice.png index af701b00d8..da7a5f22ea 100644 Binary files a/docs/en/get-started/images/abp-studio-new-solution-dialog-additional-options-microservice.png and b/docs/en/get-started/images/abp-studio-new-solution-dialog-additional-options-microservice.png differ diff --git a/docs/en/get-started/images/abp-studio-new-solution-dialog-additional-services.png b/docs/en/get-started/images/abp-studio-new-solution-dialog-additional-services.png new file mode 100644 index 0000000000..f7f088804b Binary files /dev/null and b/docs/en/get-started/images/abp-studio-new-solution-dialog-additional-services.png differ diff --git a/docs/en/get-started/images/abp-studio-new-solution-dialog-database-configurations-microservice.png b/docs/en/get-started/images/abp-studio-new-solution-dialog-database-configurations-microservice.png index 375e196fa5..910b522dd3 100644 Binary files a/docs/en/get-started/images/abp-studio-new-solution-dialog-database-configurations-microservice.png and b/docs/en/get-started/images/abp-studio-new-solution-dialog-database-configurations-microservice.png differ diff --git a/docs/en/get-started/images/abp-studio-new-solution-dialog-database-provider-microservice.png b/docs/en/get-started/images/abp-studio-new-solution-dialog-database-provider-microservice.png index 230e987365..4b8965456c 100644 Binary files a/docs/en/get-started/images/abp-studio-new-solution-dialog-database-provider-microservice.png and b/docs/en/get-started/images/abp-studio-new-solution-dialog-database-provider-microservice.png differ diff --git a/docs/en/get-started/images/abp-studio-new-solution-dialog-dynamic-localization.png b/docs/en/get-started/images/abp-studio-new-solution-dialog-dynamic-localization.png new file mode 100644 index 0000000000..3dedb0aba0 Binary files /dev/null and b/docs/en/get-started/images/abp-studio-new-solution-dialog-dynamic-localization.png differ diff --git a/docs/en/get-started/images/abp-studio-new-solution-dialog-mobile-framework-microservice.png b/docs/en/get-started/images/abp-studio-new-solution-dialog-mobile-framework-microservice.png index 7e43e784f3..f883555e4a 100644 Binary files a/docs/en/get-started/images/abp-studio-new-solution-dialog-mobile-framework-microservice.png and b/docs/en/get-started/images/abp-studio-new-solution-dialog-mobile-framework-microservice.png differ diff --git a/docs/en/get-started/images/abp-studio-new-solution-dialog-multi-tenancy.png b/docs/en/get-started/images/abp-studio-new-solution-dialog-multi-tenancy.png new file mode 100644 index 0000000000..2bc29805ee Binary files /dev/null and b/docs/en/get-started/images/abp-studio-new-solution-dialog-multi-tenancy.png differ diff --git a/docs/en/get-started/images/abp-studio-new-solution-dialog-public-web-site.png b/docs/en/get-started/images/abp-studio-new-solution-dialog-public-web-site.png index bb9f57e693..3dff0567fd 100644 Binary files a/docs/en/get-started/images/abp-studio-new-solution-dialog-public-web-site.png and b/docs/en/get-started/images/abp-studio-new-solution-dialog-public-web-site.png differ diff --git a/docs/en/get-started/images/abp-studio-new-solution-dialog-ui-framework-microservice.png b/docs/en/get-started/images/abp-studio-new-solution-dialog-ui-framework-microservice.png index 8969beba47..4a6fbf2d40 100644 Binary files a/docs/en/get-started/images/abp-studio-new-solution-dialog-ui-framework-microservice.png and b/docs/en/get-started/images/abp-studio-new-solution-dialog-ui-framework-microservice.png differ diff --git a/docs/en/get-started/images/abp-studio-new-solution-dialog-ui-theme-microservice.png b/docs/en/get-started/images/abp-studio-new-solution-dialog-ui-theme-microservice.png index 15d74ec7c2..553f0ca395 100644 Binary files a/docs/en/get-started/images/abp-studio-new-solution-dialog-ui-theme-microservice.png and b/docs/en/get-started/images/abp-studio-new-solution-dialog-ui-theme-microservice.png differ diff --git a/docs/en/get-started/microservice.md b/docs/en/get-started/microservice.md index e29c4cbe10..cca7d3c02e 100644 --- a/docs/en/get-started/microservice.md +++ b/docs/en/get-started/microservice.md @@ -49,7 +49,11 @@ On that screen, you can decide on your database provider by selecting one of the ![abp-studio-new-solution-dialog-database-configurations](images/abp-studio-new-solution-dialog-database-configurations-microservice.png) -Here, select the DBMS right for you, then click the *Next* button to navigate to the *UI Framework* selection: +Here, select the DBMS right for you, then click the *Next* button to navigate to the *Multi-Tenancy* selection: + +![abp-studio-new-solution-dialog-multi-tenancy](images/abp-studio-new-solution-dialog-multi-tenancy.png) + +On that screen, you can enable multi-tenancy for your solution. After selecting this option, click the Next button to proceed to the *UI Framework* selection screen. ![abp-studio-new-solution-dialog-ui-framework](images/abp-studio-new-solution-dialog-ui-framework-microservice.png) @@ -67,6 +71,10 @@ Pick the one best for you, or select the *None* if you don't want a mobile appli You can select a public website to be created in your solution. The public website is a simple landing page that can be used to introduce your product, provide documentation, and so on. +![abp-studio-new-solution-dialog-dynamic-localization](images/abp-studio-new-solution-dialog-dynamic-localization.png) + +On that screen, you can enable dynamic localization. After selecting this option, click the Next button to proceed to the *Optional Modules* selection screen. + ![abp-studio-new-microservice-solution-dialog-optional-modules](images/abp-studio-new-microservice-solution-dialog-optional-modules.png) Each item in that list is a pre-built application module. You can click the blue icon near to the module name to get more information about the module. You can leave the list as is (so, it installs the most common and used modules for you) or customize based on your preference. @@ -88,6 +96,12 @@ Click the Next button to see *Additional Options* selection: If you unchecked the *Kubernetes Configuration* option, the solution will not include the Kubernetes configuration files which include the Helm charts and other Kubernetes related files. You can also specify *Social Logins*; if you uncheck this option, the solution will not be configured for social login. Lastly, you can specify the *Include Tests* option to include the test projects in the solution. +Click the Next button to see *Additional Services* screen: + +![abp-studio-new-solution-dialog-additional-services](images/abp-studio-new-solution-dialog-additional-services.png) + +On that screen, allows you to include extra microservices in your ABP solution during the creation process. This feature lets you extend your solution with business-specific services right from the start. + Now, we are ready to allow ABP Studio to create our solution. Just click the *Create* button and let the ABP Studio do the rest for you. After clicking the *Create* button, the dialog is closed and your solution is loaded into ABP Studio: ![abp-studio-created-new-microservice-solution](images/abp-studio-created-new-microservice-solution.png) diff --git a/docs/en/guides/microservice-mongodb.md b/docs/en/guides/microservice-mongodb.md index 087668ba7a..4c5042802b 100644 --- a/docs/en/guides/microservice-mongodb.md +++ b/docs/en/guides/microservice-mongodb.md @@ -1,12 +1,12 @@ # Change Microservice project to use MongoDB Provider -This guide explains how to change Microservice project to use MongoDB as the database provider. +This guide explains how to change the Microservice project to use MongoDB as the database provider. ## Create a new Microservice project -Use the ABP Suite to create a new Microservice project, in this guide we use `BookStore` as project name. +> You can use [ABP Studio](../studio/index.md) to create a new Microservice project. In this guide, we assume that you have already created a microservice solution and used `BookStore` as your project name. -You will get the solution as shown below: +Currently, your microservice solution should be similar to that in the figure below: ![microservce-mongodb-project](../images/microservice-mongodb.png) @@ -16,9 +16,9 @@ You need to replace all EF Core references with MongoDB and update module depend Example: -* Remove `Volo.Abp.EntityFrameworkCore.SqlServer` Nuget package reference. -* Remove `Microsoft.EntityFrameworkCore.Tools` Nuget package reference -* Remove `AbpEntityFrameworkCoreSqlServerModule` depend. +* Remove `Volo.Abp.EntityFrameworkCore.SqlServer` NuGet package reference. (instead use `Volo.Abp.MongoDB` NuGet package and also add the relevant depends on statement) +* Remove `Microsoft.EntityFrameworkCore.Tools` NuGet package reference. +* Remove `AbpEntityFrameworkCoreSqlServerModule` dependency. * Replace `Volo.Abp.PermissionManagement.EntityFrameworkCore` with `Volo.Abp.PermissionManagement.MongoDB`. * Update `AbpPermissionManagementEntityFrameworkCoreModule` to `AbpPermissionManagementMongoDbModule`. @@ -43,9 +43,9 @@ Here we use `BookStore.ProductService` project as an example: protected override void CreateModel(IMongoModelBuilder modelBuilder) { modelBuilder.Entity(b => - { - b.CollectionName = ProductServiceDbProperties.DbTablePrefix + "Products"; - }); + { + b.CollectionName = ProductServiceDbProperties.DbTablePrefix + "Products"; + }); } } ``` diff --git a/docs/en/images/account-pro-external-login-settings.png b/docs/en/images/account-pro-external-login-settings.png index da10489599..05ff28c045 100644 Binary files a/docs/en/images/account-pro-external-login-settings.png and b/docs/en/images/account-pro-external-login-settings.png differ diff --git a/docs/en/images/account-pro-select-account-parameter.png b/docs/en/images/account-pro-select-account-parameter.png new file mode 100644 index 0000000000..0037fe50e8 Binary files /dev/null and b/docs/en/images/account-pro-select-account-parameter.png differ diff --git a/docs/en/images/account-pro-select-account.png b/docs/en/images/account-pro-select-account.png new file mode 100644 index 0000000000..559b33f9c8 Binary files /dev/null and b/docs/en/images/account-pro-select-account.png differ diff --git a/docs/en/images/books.png b/docs/en/images/books.png new file mode 100644 index 0000000000..d3f2e6de6e Binary files /dev/null and b/docs/en/images/books.png differ diff --git a/docs/en/index.md b/docs/en/index.md index 187bd6ff83..c65f9ab548 100644 --- a/docs/en/index.md +++ b/docs/en/index.md @@ -93,21 +93,12 @@ ABP provides a UI theming system where you can use [pre-built themes](ui-themes) ## Books -### Mastering ABP Framework +You can check the following books to expertise the ABP platform: -Mastering ABP - Halil İbrahim Kalkan +![books](images/books.png) -*Mastering ABP Framework* is an ultimate guide to get started and expertise with the ABP Framework. It is authored by Halil İbrahim Kalkan, the creator and the lead developer of the ABP Framework. - -**[Click here to see the details and order the book](https://abp.io/books/mastering-abp-framework)**. - -### Free E-Book: Implementing Domain Driven Design - -Implementing Domain Driven Design - -A **practical guide** for implementing Domain Driven Design (DDD). While the implementation details are **based on the ABP** infrastructure, the basic concepts, principles and models can be applied to any solution, even if it is not a .NET solution. - -**[Click here to get your free copy](https://abp.io/books/implementing-domain-driven-design?ref=doc).** +* [See the details and **order** the **Mastering ABP Framework** book](https://abp.io/books/mastering-abp-framework) +* [**Download** your free copy of the **Implementing Domain Driven Design** book](https://abp.io/books/implementing-domain-driven-design?ref=doc) ## Samples diff --git a/docs/en/kb/can-not-login-with-admin-user.md b/docs/en/kb/can-not-login-with-admin-user.md index d69695b503..300a1a5c8f 100644 --- a/docs/en/kb/can-not-login-with-admin-user.md +++ b/docs/en/kb/can-not-login-with-admin-user.md @@ -1,5 +1,36 @@ -# KB#0003: Can not login with the admin user +# KB#0003: Cannot login with the admin user -* Try username `admin` and Password `1q2w3E*`. -* Try to migrate database. If you have a `DbMigrator` application in your solution, use it. It will seed initial data and create the admin user for you. -* If not works, read the README.MD file in your solution, or check the [Getting Started](https://abp.io/docs/latest/get-started) document. +## Use the Correct Username and Password + +You may have entered the wrong password. The username is `admin`, and the password is `1q2w3E*`. Note that the password is case-sensitive. + +## Forgot to Seed Initial Data + +You may need to add migrations and update the database using the EF Core CLI. If your solution includes a `DbMigrator` application, you must run the `DbMigrator` application to seed the initial data. + +If your project does not include a `DbMigrator` application, there might be a `migrate-database.ps1` script available. You can use it to migrate and seed the initial data. + +> The no-layer application typically support a `--migrate-database` option for migrating and seeding initial data. + +> Example: +> ```bash +> dotnet run --migrate-database +> ``` + +## Tenant Admin User + +If you cannot log in as a tenant admin user, ensure the tenant database is created and seeded, Use the password that was set during tenant creation. + +> The tenant seeding process is handled by the template project. If it is not completed, please check the `Logs` file for any error logs. + +## Check the `AbpUsers` Table + +If you have performed migration and seeded the initial data, check the `AbpUsers` table in the database. Ensure that the user record exists. If your tenant has a separate database, check the tenant database as well. + +Passwords are stored in hashed format, not plain text. If you suspect the password is incorrect, you can delete the user record and re-seed the initial data using the `DbMigrator` application or the `migrate-database.ps1` script. + +## Other Issues + +If the issue persists, refer to the `README.MD` file in your solution or consult the [Getting Started](https://abp.io/docs/latest/get-started) documentation. + +Feel free to create an issue in the [ABP GitHub repository](https://github.com/abpframework/abp/issues/new/choose) or contact [ABP Commercial Support](https://abp.io/support/questions/New) for assistance. diff --git a/docs/en/modules/account-pro.md b/docs/en/modules/account-pro.md index e3e7884cc0..4ccc8b316a 100644 --- a/docs/en/modules/account-pro.md +++ b/docs/en/modules/account-pro.md @@ -104,6 +104,48 @@ If you use `Social / External Logins`, It is automatically called for authentica ![account-pro-module-local-login-setting](../images/account-pro-module-local-login-setting.png) +### Switching users during OAuth login + +If you have an OAuth/Auth Server application using the Account Pro module, you can pass the `prompt=select_account` parameter to force the user to select an account. + +Example to pass `prompt=select_account` parameter in OpenIdConnect: + +```csharp +.AddAbpOpenIdConnect("oidc", options => +{ + // ... + options.Events = new OpenIdConnectEvents + { + OnRedirectToIdentityProvider = redirectContext => + { + redirectContext.ProtocolMessage.Prompt = "select_account"; + return Task.CompletedTask; + } + }; + // ... +}); +``` + +![account-pro-secect-account](../images/account-pro-select-account-parameter.png) + +You have three options: + +- Continue: The login process will continue with the current account. +- Switch to another account: Will be redirected to the login page to log in with another account. +- Create a new account: Will be redirected to the register page to create a new account. + +> The OAuth login process will continue after the user selects one of the options. + +![account-pro-secect-account](../images/account-pro-select-account.png) + +All available prompt parameters: + +| **Parameter** | **Description** | +|------------------|-------------------------------------------------------------------------------------------------------------| +| `login` | Forces the user to re-authenticate, even if they are already logged in. | +| `consent` | Forces the user to re-consent to the requested permissions, even if they have consented before. | +| `select_account` | Forces the user to select an account, even if they are already logged in (especially relevant if multiple accounts are available). | +| `none` | Does not trigger any prompt. If the user is not logged in, or their consent is not granted, it will return an error or redirect accordingly. | ## Social / External Logins @@ -113,7 +155,7 @@ The application startup template comes with **Twitter**, **Google** and **Micros ![account-pro-external-login-settings](../images/account-pro-external-login-settings.png) -The social/External login system is compatible with the multi-tenancy. Each tenant can configure their own provider settings if your application is multi-tenant. +The social/External login system is compatible with the multi-tenancy. Each tenant can enable or disable the external login provider and configure their own provider settings if your application is multi-tenant. ### Install a new External Login @@ -137,7 +179,7 @@ context.Services.AddAuthentication() facebook.Scope.Add("public_profile"); }) .WithDynamicOptions( - FacebookDefaults.AuthenticationScheme, + FacebookDefaults.AuthenticationScheme, // Facebook options => { options.WithProperty(x => x.AppId); @@ -149,6 +191,18 @@ context.Services.AddAuthentication() * `AddFacebook()` is the standard method that you can set hard-coded configuration. * `WithDynamicOptions` is provided by the Account Module which makes possible to configure the provided properties on the UI. +#### Localize Provider Properties + +You can add following translation to localize the properties of the external login providers: + +`en.json`: + +````json +"ExternalProvider:Facebook": "Facebook", +"ExternalProvider:Facebook:AppId": "App ID", +"ExternalProvider:Facebook:AppSecret": "App Secret", +```` + ### IPostConfigureAccountExternalProviderOptions Some external logins may be initialized based on dynamic properties. You can implement an `IPostConfigureAccountExternalProviderOptions` to initialize again after dynamic properties are initialized. diff --git a/docs/en/modules/gdpr.md b/docs/en/modules/gdpr.md index 76875e0403..c94fcbb4a0 100644 --- a/docs/en/modules/gdpr.md +++ b/docs/en/modules/gdpr.md @@ -48,7 +48,14 @@ The "Personal Data" page is used to manage personal data requests. You can view ![gdpr](../images/gdpr-personal-data-page.png) -To see the other features of the GDPR module, visit [the module description page](https://abp.io/modules/Volo.Gdpr). +The GDPR module is designed for distributed architectures. When a user requests their personal data, the module publishes two events: + +- `GdprUserDataRequestedEto`: Triggers personal data collectors to prepare user data +- `GdprUserDataDeletionRequestedEto`: Triggers personal data collectors to delete user data + +You can subscribe to these events to implement custom data collection and deletion logic in your modules. See the [Distributed Events](#distributed-events) section for more details. + +> To see the other features of the GDPR module, visit [the module description page](https://abp.io/modules/Volo.Gdpr). ## Options @@ -227,8 +234,13 @@ This [Event Transfer Object](../framework/infrastructure/event-bus/distributed#e ### GdprUserDataPreparedEto -This [Event Transfer Object](../framework/infrastructure/event-bus/distributed#event-transfer-object) is used to save the collected personal data into a single JSON file by module. +This [Event Transfer Object](../framework/infrastructure/event-bus/distributed#event-transfer-object) is used to save the collected personal data into a single JSON file per module. Typically, you don't need to implement this event handler since the module already has an implementation that returns the collected data within a zip file containing multiple JSON files, with each file containing data collected from a specific module. + +### GdprUserDataDeletionRequestedEto + +This [Event Transfer Object](../framework/infrastructure/event-bus/distributed#event-transfer-object) is published when a user requests to permanently delete their personal data and account. By default, only the `IdentityGdprEventHandler` in the [Identity Pro Module](../modules/identity-pro) subscribes to this event to anonymize the user's data and delete their account (using soft-delete unless configured otherwise). +If you want to delete additional sensitive user data stored in other modules, you can subscribe to this event and implement custom deletion (or anonymization) logic in those modules. ## Cookie Consent diff --git a/docs/en/release-info/migration-guides/abp-9-0.md b/docs/en/release-info/migration-guides/abp-9-0.md index d211c9db55..b63b6bd030 100644 --- a/docs/en/release-info/migration-guides/abp-9-0.md +++ b/docs/en/release-info/migration-guides/abp-9-0.md @@ -2,7 +2,7 @@ This document is a guide for upgrading ABP v8.x solutions to ABP v9.0. There are some changes in this version that may affect your applications, please read it carefully and apply the necessary changes to your application. -> ABP has upgraded to .NET 9.0, so if you plan to use ABP 9.0, you’ll need to migrate your solutions to .NET 9.0. You can refer to the [Migrate from ASP.NET Core 8.0 to 9.0](https://learn.microsoft.com/en-us/aspnet/core/migration/80-90) documentation for guidance. However, ABP’s NuGet packages are compatible with both .NET 8 and .NET 9, allowing developers to continue using .NET 8 while still enjoying the latest features and improvements of the ABP Framework without upgrading their SDK. +> ABP has upgraded to .NET 9.0, so if you plan to use ABP 9.0, you’ll need to migrate your solutions to .NET 9.0. You can refer to the [Migrate from ASP.NET Core 8.0 to 9.0](https://learn.microsoft.com/en-us/aspnet/core/migration/80-90) documentation for guidance. ## Open-Source (Framework) diff --git a/docs/en/release-info/migration-guides/abp-9-1.md b/docs/en/release-info/migration-guides/abp-9-1.md index 0e80da824a..5808f8f028 100644 --- a/docs/en/release-info/migration-guides/abp-9-1.md +++ b/docs/en/release-info/migration-guides/abp-9-1.md @@ -2,6 +2,8 @@ This document is a guide for upgrading ABP v9.0 solutions to ABP v9.1. There are no breaking changes in this version that would affect your application. -Only you might need to update some constant names due to the OpenIddict 6.0 upgrade, which is explained in the following migration guide: +You might need to update some constant names due to the OpenIddict 6.0 upgrade, which is explained in the following migration guide: -- [OpenIddict 5.x to 6.x Migration Guide](./openiddict5-to-6.md) \ No newline at end of file +- [OpenIddict 5.x to 6.x Migration Guide](./openiddict5-to-6.md) + +In addition, ABP version 9.1 has been upgraded to incorporate Angular version 19. Consequently, we recommend migrating your application to [Angular v19](https://angular.dev/update-guide) to ensure compatibility. \ No newline at end of file diff --git a/docs/en/release-info/migration-guides/identityserver4-step-by-step.md b/docs/en/release-info/migration-guides/identityserver4-step-by-step.md index 6e58edc023..12973b6073 100644 --- a/docs/en/release-info/migration-guides/identityserver4-step-by-step.md +++ b/docs/en/release-info/migration-guides/identityserver4-step-by-step.md @@ -76,7 +76,7 @@ typeof(AbpPermissionManagementDomainIdentityServerModule), DataSeeder is the most important part for starting the application since it seeds the initial data for both OpenID providers. -- Create a folder named *IdentityServer* under the Domain project and copy the [IdentityServerDataSeedContributor.cs](https://github.com/abpframework/abp-samples/blob/master/Ids2OpenId/src/Ids2OpenId.Domain/IdentityServer/IdentityServerDataSeedContributor.cs) under this folder. **Rename** all the `OpenId2Ids` with your project name. +- Create a folder named *IdentityServer* under the Domain project and copy the [IdentityServerDataSeedContributor.cs](https://github.com/abpframework/abp-samples/blob/1dc297255ca22af02ef6d71092dbc1b394f9260a/Ids2OpenId/src/Ids2OpenId.Domain/IdentityServer/IdentityServerDataSeedContributor.cs) under this folder. **Rename** all the `OpenId2Ids` with your project name. - Delete *OpenIddict* folder that contains `OpenIddictDataSeedContributor.cs` which is no longer needed. ### EntityFrameworkCore Layer diff --git a/docs/en/solution-templates/layered-web-application/cors-configuration.md b/docs/en/solution-templates/layered-web-application/cors-configuration.md index 6df207c107..73e7b6952b 100644 --- a/docs/en/solution-templates/layered-web-application/cors-configuration.md +++ b/docs/en/solution-templates/layered-web-application/cors-configuration.md @@ -8,8 +8,8 @@ "Path": "solution-templates/layered-web-application/blob-storing" }, "Next": { - "Name": "Helm Charts and Kubernetes", - "Path": "solution-templates/layered-web-application/helm-charts-and-kubernetes" + "Name": "Health Check Configuration", + "Path": "solution-templates/layered-web-application/health-check-configuration" } } ``` diff --git a/docs/en/solution-templates/layered-web-application/deployment/deployment-iis.md b/docs/en/solution-templates/layered-web-application/deployment/deployment-iis.md index 79382f1b0a..3d33cbd7a1 100644 --- a/docs/en/solution-templates/layered-web-application/deployment/deployment-iis.md +++ b/docs/en/solution-templates/layered-web-application/deployment/deployment-iis.md @@ -254,6 +254,35 @@ We can visit the websites from a browser. ![Tiered IIS deployment](../../../images/iis-sample-tiered-deployment.gif) +## Fix 405 Method Not Allowed Error + +Remove `WebDAV` modules and handlers from the `Web.config` file. + +```xml + + + + + + + + + + + +``` + +Also remove the `WebDAV Publishing` feature from your computer if it's not being used. To do so, follow these steps: + +1. Select Start, type Turn Windows features on or off in the Start Search box, and then select Turn Windows features on or off. +2. In the Windows Features window, expand Internet Information Services -> World Wide Web Services -> Common HTTP Features. +3. Uncheck the WebDAV Publishing feature. + +See: + +- https://learn.microsoft.com/en-us/aspnet/web-api/overview/testing-and-debugging/troubleshooting-http-405-errors-after-publishing-web-api-applications#resolve-http-405-errors +- https://learn.microsoft.com/en-us/troubleshoot/developer/webapps/iis/site-behavior-performance/http-error-405-website#resolution-for-cause-3 + ## How to get stdout-log If your application is running on IIS and getting errors like `502.5, 500.3x`, you can enable stdout logs to see the error details. diff --git a/docs/en/solution-templates/layered-web-application/health-check-configuration.md b/docs/en/solution-templates/layered-web-application/health-check-configuration.md new file mode 100644 index 0000000000..cd1f69c99b --- /dev/null +++ b/docs/en/solution-templates/layered-web-application/health-check-configuration.md @@ -0,0 +1,121 @@ +# Layered Solution: Health Check Configuration + +```json +//[doc-nav] +{ + "Previous": { + "Name": "CORS Configuration", + "Path": "solution-templates/single-layer-web-application/cors-configuration" + }, + "Next": { + "Name": "Helm Charts and Kubernetes", + "Path": "solution-templates/layered-web-application/helm-charts-and-kubernetes" + } +} +``` + +Health Check is a feature that allows applications to monitor their health and diagnose potential issues. The layered solution template comes with pre-configured Health Check system. + +In the layered solution template, Health Check configuration is applied in the following cases: + +- When [MVC](https://abp.io/docs/latest/solution-templates/single-layer-web-application/web-applications#mvc) is selected as the web application type. +- When [Blazor Server](https://abp.io/docs/latest/solution-templates/single-layer-web-application/web-applications#blazor-server) is selected as the web application type. +- When [Blazor WebAssembly](https://abp.io/docs/latest/solution-templates/single-layer-web-application/web-applications#blazor-webassembly) is selected as the web application type (configured at the backend). +- When [Blazor WebApp](https://abp.io/docs/latest/solution-templates/single-layer-web-application/web-applications#blazor-webapp) is selected as the web application type (configured at the backend). +- When [Angular](https://abp.io/docs/latest/solution-templates/single-layer-web-application/web-applications#angular) is selected as the web application type (configured at the backend). +- When [No UI](https://abp.io/docs/latest/solution-templates/single-layer-web-application/web-applications#no-ui) is selected as the web application type (configured at the backend). + +### Configuration in `HealthChecksBuilderExtensions.cs` + +Health Checks are configured in the `HealthChecksBuilderExtensions` class. This class extends `IServiceCollection` to register health check services and configure health check UI endpoints. + +#### Default Configuration + +The default setup is as follows: + +```csharp +using HealthChecks.UI.Client; +using Microsoft.AspNetCore.Diagnostics.HealthChecks; + +namespace MyCompanyName.MyProjectName.HealthChecks; + +public static class HealthChecksBuilderExtensions +{ + public static void AddMyProjectNameHealthChecks(this IServiceCollection services) + { + // Add your health checks here + var healthChecksBuilder = services.AddHealthChecks(); + healthChecksBuilder.AddCheck("MyProjectName DbContext Check", tags: new string[] { "database" }); + + // Read configuration for health check URL + var configuration = services.GetConfiguration(); + var healthCheckUrl = configuration["App:HealthCheckUrl"] ?? "/health-status"; + + services.ConfigureHealthCheckEndpoint(healthCheckUrl); + + // Configure HealthChecks UI + var healthChecksUiBuilder = services.AddHealthChecksUI(settings => + { + settings.AddHealthCheckEndpoint("MyProjectName Health Status", healthCheckUrl); + }); + + // Set HealthCheck UI storage + healthChecksUiBuilder.AddInMemoryStorage(); + + services.MapHealthChecksUiEndpoints(options => + { + options.UIPath = "/health-ui"; + options.ApiPath = "/health-api"; + }); + } + + private static IServiceCollection ConfigureHealthCheckEndpoint(this IServiceCollection services, string path) + { + .... + } + + private static IServiceCollection MapHealthChecksUiEndpoints(this IServiceCollection services, Action? setupOption = null) + { + .... + } +} +``` + +### Database Health Check Implementation + +The `MyProjectNameDatabaseCheck` class is a custom implementation of a health check that verifies database connectivity using `IIdentityRoleRepository`. + +```csharp +using System; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.Extensions.Diagnostics.HealthChecks; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Identity; + +namespace MyCompanyName.MyProjectName.HealthChecks; + +public class MyProjectNameDatabaseCheck : IHealthCheck, ITransientDependency +{ + protected readonly IIdentityRoleRepository IdentityRoleRepository; + + public MyProjectNameDatabaseCheck(IIdentityRoleRepository identityRoleRepository) + { + IdentityRoleRepository = identityRoleRepository; + } + + public async Task CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken = default) + { + try + { + await IdentityRoleRepository.GetListAsync(sorting: nameof(IdentityRole.Id), maxResultCount: 1, cancellationToken: cancellationToken); + return HealthCheckResult.Healthy($"Could connect to database and get record."); + } + catch (Exception e) + { + return HealthCheckResult.Unhealthy($"Error when trying to get database record. ", e); + } + } +} +``` + diff --git a/docs/en/solution-templates/microservice/adding-new-microservices.md b/docs/en/solution-templates/microservice/adding-new-microservices.md index 9cb482c552..610beaef7f 100644 --- a/docs/en/solution-templates/microservice/adding-new-microservices.md +++ b/docs/en/solution-templates/microservice/adding-new-microservices.md @@ -24,6 +24,8 @@ To add a new microservice to the solution, you can use the `service_nolayers` te In ABP Studio [Solution Explorer](../../studio/solution-explorer.md#adding-a-new-microservice-module), right-click on the `services` folder and select `Add` -> `New Module` -> `Microservice`. +You can also add microservices during the project creation process by using the Additional Services screen. For more details, refer to the [Additional Services](../../get-started/microservice.md) section. + ![new-microservice](images/new-microservice.png) It opens the `Create New Module` dialog. Enter the name of the new microservice, specify the output directory if needed, and click the `Next` button. There is a naming convention: the *Module name* should include the solution name as a prefix, and the use of the dot (.) character in the *Module name* is not allowed. diff --git a/docs/en/solution-templates/microservice/cors-configuration.md b/docs/en/solution-templates/microservice/cors-configuration.md index 2ca44342f4..8157bb95ae 100644 --- a/docs/en/solution-templates/microservice/cors-configuration.md +++ b/docs/en/solution-templates/microservice/cors-configuration.md @@ -4,8 +4,8 @@ //[doc-nav] { "Next": { - "Name": "Communication in the Microservice solution", - "Path": "solution-templates/microservice/communication" + "Name": "Health Check Configuration", + "Path": "solution-templates/microservice/health-check-configuration" } } ```` diff --git a/docs/en/solution-templates/microservice/health-check-configuration.md b/docs/en/solution-templates/microservice/health-check-configuration.md new file mode 100644 index 0000000000..37cd515209 --- /dev/null +++ b/docs/en/solution-templates/microservice/health-check-configuration.md @@ -0,0 +1,110 @@ +# Microservice Solution: Health Check Configuration + +```json +//[doc-nav] +{ + "Next": { + "Name": "Communication in the Microservice solution", + "Path": "solution-templates/microservice/communication" + } +} +``` + +Health Check is a feature that allows applications to monitor their health and diagnose potential issues. The Microservice solution template comes with pre-configured Health Check system. + +In the Microservice solution template, Health Check configuration is applied in all the services, gateways and UI applications (except Blazor Wasm & Blazor WebApp applications UI applications). + +### Configuration in `HealthChecksBuilderExtensions.cs` + +Health Checks are configured in the `HealthChecksBuilderExtensions` class. This class extends `IServiceCollection` to register health check services and configure health check UI endpoints. + +#### Default Configuration + +The default setup is as follows: + +```csharp +using HealthChecks.UI.Client; +using Microsoft.AspNetCore.Diagnostics.HealthChecks; + +namespace MyCompanyName.MyProjectName.HealthChecks; + +public static class HealthChecksBuilderExtensions +{ + public static void AddMyProjectNameHealthChecks(this IServiceCollection services) + { + // Add your health checks here + var healthChecksBuilder = services.AddHealthChecks(); + healthChecksBuilder.AddCheck("MyProjectName DbContext Check", tags: new string[] { "database" }); + + // Read configuration for health check URL + var configuration = services.GetConfiguration(); + var healthCheckUrl = configuration["App:HealthCheckUrl"] ?? "/health-status"; + + services.ConfigureHealthCheckEndpoint(healthCheckUrl); + + // Configure HealthChecks UI + var healthChecksUiBuilder = services.AddHealthChecksUI(settings => + { + settings.AddHealthCheckEndpoint("MyProjectName Health Status", healthCheckUrl); + }); + + // Set HealthCheck UI storage + healthChecksUiBuilder.AddInMemoryStorage(); + + services.MapHealthChecksUiEndpoints(options => + { + options.UIPath = "/health-ui"; + options.ApiPath = "/health-api"; + }); + } + + private static IServiceCollection ConfigureHealthCheckEndpoint(this IServiceCollection services, string path) + { + .... + } + + private static IServiceCollection MapHealthChecksUiEndpoints(this IServiceCollection services, Action? setupOption = null) + { + .... + } +} +``` + +### Database Health Check Implementation + +The `MyProjectNameDatabaseCheck` class is a custom implementation of a health check that verifies database connectivity in the applications with database connection. Example: + +```csharp +using System; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.Extensions.Diagnostics.HealthChecks; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Identity; + +namespace MyCompanyName.MyProjectName.HealthChecks; + +public class MyProjectNameDatabaseCheck : IHealthCheck, ITransientDependency +{ + protected readonly IIdentityRoleRepository IdentityRoleRepository; + + public MyProjectNameDatabaseCheck(IIdentityRoleRepository identityRoleRepository) + { + IdentityRoleRepository = identityRoleRepository; + } + + public async Task CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken = default) + { + try + { + await IdentityRoleRepository.GetListAsync(sorting: nameof(IdentityRole.Id), maxResultCount: 1, cancellationToken: cancellationToken); + return HealthCheckResult.Healthy($"Could connect to database and get record."); + } + catch (Exception e) + { + return HealthCheckResult.Unhealthy($"Error when trying to get database record. ", e); + } + } +} +``` + diff --git a/docs/en/solution-templates/single-layer-web-application/cors-configuration.md b/docs/en/solution-templates/single-layer-web-application/cors-configuration.md index f54c73ad79..71f1991e59 100644 --- a/docs/en/solution-templates/single-layer-web-application/cors-configuration.md +++ b/docs/en/solution-templates/single-layer-web-application/cors-configuration.md @@ -6,6 +6,10 @@ "Previous": { "Name": "BLOB Storing", "Path": "solution-templates/single-layer-web-application/blob-storing" + }, + "Next": { + "Name": "Health Check Configuration", + "Path": "solution-templates/single-layer-web-application/health-check-configuration" } } ``` diff --git a/docs/en/solution-templates/single-layer-web-application/health-check-configuration.md b/docs/en/solution-templates/single-layer-web-application/health-check-configuration.md new file mode 100644 index 0000000000..b62b544cbd --- /dev/null +++ b/docs/en/solution-templates/single-layer-web-application/health-check-configuration.md @@ -0,0 +1,115 @@ +# Single Layer Solution: Health Check Configuration + +```json +//[doc-nav] +{ + "Previous": { + "Name": "CORS Configuration", + "Path": "solution-templates/single-layer-web-application/cors-configuration" + } +} +``` + +Health Check is a feature that allows applications to monitor their health and diagnose potential issues. The single-layer solution template comes with pre-configured Health Check system. + +In the single-layer solution template, Health Check configuration is applied in the following cases: + +- When [MVC](https://abp.io/docs/latest/solution-templates/single-layer-web-application/web-applications#mvc) is selected as the web application type. +- When [Blazor Server](https://abp.io/docs/latest/solution-templates/single-layer-web-application/web-applications#blazor-server) is selected as the web application type. +- When [Angular](https://abp.io/docs/latest/solution-templates/single-layer-web-application/web-applications#angular) is selected as the web application type (configured at the backend). +- When [No UI](https://abp.io/docs/latest/solution-templates/single-layer-web-application/web-applications#no-ui) is selected as the web application type (configured at the backend). + +### Configuration in `HealthChecksBuilderExtensions.cs` + +Health Checks are configured in the `HealthChecksBuilderExtensions` class. This class extends `IServiceCollection` to register health check services and configure health check UI endpoints. + +#### Default Configuration + +The default setup is as follows: + +```csharp +using HealthChecks.UI.Client; +using Microsoft.AspNetCore.Diagnostics.HealthChecks; + +namespace MyCompanyName.MyProjectName.HealthChecks; + +public static class HealthChecksBuilderExtensions +{ + public static void AddMyProjectNameHealthChecks(this IServiceCollection services) + { + // Add your health checks here + var healthChecksBuilder = services.AddHealthChecks(); + healthChecksBuilder.AddCheck("MyProjectName DbContext Check", tags: new string[] { "database" }); + + // Read configuration for health check URL + var configuration = services.GetConfiguration(); + var healthCheckUrl = configuration["App:HealthCheckUrl"] ?? "/health-status"; + + services.ConfigureHealthCheckEndpoint(healthCheckUrl); + + // Configure HealthChecks UI + var healthChecksUiBuilder = services.AddHealthChecksUI(settings => + { + settings.AddHealthCheckEndpoint("MyProjectName Health Status", healthCheckUrl); + }); + + // Set HealthCheck UI storage + healthChecksUiBuilder.AddInMemoryStorage(); + + services.MapHealthChecksUiEndpoints(options => + { + options.UIPath = "/health-ui"; + options.ApiPath = "/health-api"; + }); + } + + private static IServiceCollection ConfigureHealthCheckEndpoint(this IServiceCollection services, string path) + { + .... + } + + private static IServiceCollection MapHealthChecksUiEndpoints(this IServiceCollection services, Action? setupOption = null) + { + .... + } +} +``` + +### Database Health Check Implementation + +The `MyProjectNameDatabaseCheck` class is a custom implementation of a health check that verifies database connectivity using `IIdentityRoleRepository`. + +```csharp +using System; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.Extensions.Diagnostics.HealthChecks; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Identity; + +namespace MyCompanyName.MyProjectName.HealthChecks; + +public class MyProjectNameDatabaseCheck : IHealthCheck, ITransientDependency +{ + protected readonly IIdentityRoleRepository IdentityRoleRepository; + + public MyProjectNameDatabaseCheck(IIdentityRoleRepository identityRoleRepository) + { + IdentityRoleRepository = identityRoleRepository; + } + + public async Task CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken = default) + { + try + { + await IdentityRoleRepository.GetListAsync(sorting: nameof(IdentityRole.Id), maxResultCount: 1, cancellationToken: cancellationToken); + return HealthCheckResult.Healthy($"Could connect to database and get record."); + } + catch (Exception e) + { + return HealthCheckResult.Unhealthy($"Error when trying to get database record. ", e); + } + } +} +``` + diff --git a/docs/en/studio/images/monitoring-applications/overall.png b/docs/en/studio/images/monitoring-applications/overall.png index a56ed043f9..dfd0f71ae3 100644 Binary files a/docs/en/studio/images/monitoring-applications/overall.png and b/docs/en/studio/images/monitoring-applications/overall.png differ diff --git a/docs/en/studio/images/solution-runner/csharp-application-context-menu-build.png b/docs/en/studio/images/solution-runner/csharp-application-context-menu-build.png index aec7d5d0d7..5b0fe32119 100644 Binary files a/docs/en/studio/images/solution-runner/csharp-application-context-menu-build.png and b/docs/en/studio/images/solution-runner/csharp-application-context-menu-build.png differ diff --git a/docs/en/studio/images/solution-runner/csharp-application-context-menu-monitor.png b/docs/en/studio/images/solution-runner/csharp-application-context-menu-monitor.png index 42eca8cf00..bdc601c2a9 100644 Binary files a/docs/en/studio/images/solution-runner/csharp-application-context-menu-monitor.png and b/docs/en/studio/images/solution-runner/csharp-application-context-menu-monitor.png differ diff --git a/docs/en/studio/images/solution-runner/csharp-application-context-menu.png b/docs/en/studio/images/solution-runner/csharp-application-context-menu.png index 76c90a2e95..fbe7e6993d 100644 Binary files a/docs/en/studio/images/solution-runner/csharp-application-context-menu.png and b/docs/en/studio/images/solution-runner/csharp-application-context-menu.png differ diff --git a/docs/en/studio/images/solution-runner/solutioın-runner-properties.png b/docs/en/studio/images/solution-runner/solutioın-runner-properties.png index 8611f8be3d..9a6505a7d1 100644 Binary files a/docs/en/studio/images/solution-runner/solutioın-runner-properties.png and b/docs/en/studio/images/solution-runner/solutioın-runner-properties.png differ diff --git a/docs/en/studio/monitoring-applications.md b/docs/en/studio/monitoring-applications.md index 6d0c5523a3..5ef2dc0f91 100644 --- a/docs/en/studio/monitoring-applications.md +++ b/docs/en/studio/monitoring-applications.md @@ -59,6 +59,7 @@ In the data grid, details for each application are displayed. It's possible to s - `Name`: The name of the application. - `State`: The state of the application. It can take on several values such as *Scheduled*, *Starting*, *Started*, *Stopping* and *Stopped*. In the event of an application crash during its starting, the state is mark as *Scheduled*, we can cancel the starting process at that stage. +- `Health` : The health state of the application. Clicking on the icon shows the latest health check response. Displays `N/A` if the application is not running or health check is not configured for the application. - `Instances`: Indicates the count of running instances for the application. This value is particularly helpful when scaling the application within a Kubernetes, providing visibility into the number of currently active instances. - `Uptime`: The time elapsed since the application started. - `Requests`: The number of HTTP requests received by the application. diff --git a/docs/en/studio/release-notes.md b/docs/en/studio/release-notes.md index 94ec619a34..ef498fcac5 100644 --- a/docs/en/studio/release-notes.md +++ b/docs/en/studio/release-notes.md @@ -2,6 +2,26 @@ This document contains **brief release notes** for each ABP Studio release. Release notes only include **major features** and **visible enhancements**. Therefore, they don't include all the development done in the related version. +## 0.9.25 (2025-03-12) + +* Added ready/health check for solution runner. + +## 0.9.24 (2025-03-11) + +* Added automatic installation of necessary dependencies. +* Added user feedback collection after the first week of application usage. +* Added ability to add business services while creating a new microservice solution. +* Fixed database migration issue during module installation. +* Fixed angular ESLint dependency issue. +* Upgraded templates to version `9.1.0`. + +## 0.9.23 (2025-02-04) + +* Fixed **Open with Terminal** option not working on macOS. +* Fixed dynamic port assignment for Abp Suite if the default port is unavailable. +* Added suite templates package to module templates. +* Added warning message in CLI if the connection string is broken. + ## 0.9.22 (2025-01-22) * Allowed to display multiple installation notes. diff --git a/docs/en/studio/running-applications.md b/docs/en/studio/running-applications.md index 5392250153..9188f202ae 100644 --- a/docs/en/studio/running-applications.md +++ b/docs/en/studio/running-applications.md @@ -196,16 +196,19 @@ When the C# application is connected to ABP Studio, it starts sending telemetry ![csharp-application-context-menu-monitor](images/solution-runner/csharp-application-context-menu-monitor.png) - `Browse`: ABP Studio includes a browser tool for accessing websites and running applications. You can click this option to view the application in the ABP Studio browser. However, this option is only accessible if the application is started. +- Health Status : If Health Check endpoints are defined, it allows you to browse Health UI and see the latest health check response. - `Requests`: It opens the *HTTP Requests* tab with adding the selected application filter. You can view all *HTTP Requests* received by your applications. - `Exceptions`: We can display all exceptions on this tab. It opens the *Exceptions* tab with selected application. - `Logs`: Clicking this option opens the *Logs* tab with adding the selected application filter. ### Properties -We can open the *Application Properties* window to change *Launch url*, *Kubernetes service* and *run* information. To access the *Application Properties* window, navigate to a C# application, right-click to view the context menu, and select the Properties option. +We can open the *Application Properties* window to change *Launch url*, *Health check endpoints*, *Kubernetes service* and *run* information. To access the *Application Properties* window, navigate to a C# application, right-click to view the context menu, and select the Properties option. ![solutioın-runner-properties](images/solution-runner/solutioın-runner-properties.png) +- **Health check endpoint**: Endpoint for controlling the health status of the application periodically. If the application doesn't have a endpoint for health check, you can enter `/` to use the home page of the application as health check endpoint. +- **Health UI endpoint**: Endpoint of the Health UI page of the application. - **Skip build before starting**: When enabled, application is started without build and it makes starting faster. This is useful when you are working on a single application out of multiple, so you don't need to build others everytime they start. - **Watch changes while running**: When enabled, you should see an *eye* icon next to the application name. diff --git a/docs/en/studio/version-mapping.md b/docs/en/studio/version-mapping.md index fe39fb7c67..cd82da602a 100644 --- a/docs/en/studio/version-mapping.md +++ b/docs/en/studio/version-mapping.md @@ -4,7 +4,8 @@ This document provides a general overview of the relationship between various ve | **ABP Studio Version** | **ABP Version of Startup Template** | |------------------------|---------------------------| -| 0.9.22 | 9.0.4 | +| 0.9.24 - 0.9.25 | 9.1.0 | +| 0.9.22 - 0.9.23 | 9.0.4 | | 0.9.20 - 0.9.21 | 9.0.3 | | 0.9.17 to 0.9.19 | 9.0.2 | | 0.9.15 - 0.9.16 | 9.0.1 | diff --git a/docs/en/tutorials/book-store/part-01.md b/docs/en/tutorials/book-store/part-01.md index 51bfcd1b09..61de79d035 100644 --- a/docs/en/tutorials/book-store/part-01.md +++ b/docs/en/tutorials/book-store/part-01.md @@ -36,22 +36,6 @@ abp install-libs > We suggest you install [Yarn v1.22+ (not v2)](https://classic.yarnpkg.com/en/docs/install) to prevent possible package inconsistencies, if you haven't installed it yet. -{{if UI=="Blazor" || UI=="BlazorWebApp"}} - -### Bundling and Minification - -`abp bundle` command offers bundling and minification support for client-side resources (JavaScript and CSS files) for Blazor projects. This command automatically run when you create a new solution with the [ABP CLI](../../cli). - -However, sometimes you might need to run this command manually. To update script & style references without worrying about dependencies, ordering, etc. in a project, you can run this command in the directory of your `*.Blazor.Client` project: - -```bash -abp bundle -``` - -> For more details about managing style and script references in Blazor or MAUI Blazor apps, see [Managing Global Scripts & Styles](../../framework/ui/blazor/global-scripts-styles.md). - -{{end}} - ## Create the Book Entity **Domain layer** in the startup template is separated into two projects: diff --git a/docs/en/tutorials/todo/layered/index.md b/docs/en/tutorials/todo/layered/index.md index 5ba38380f3..e6e310a39a 100644 --- a/docs/en/tutorials/todo/layered/index.md +++ b/docs/en/tutorials/todo/layered/index.md @@ -113,23 +113,6 @@ abp install-libs > We suggest you install [Yarn v1.22+ (not v2)](https://classic.yarnpkg.com/en/docs/install) to prevent possible package inconsistencies, if you haven't installed it yet. -{{if UI=="Blazor" || UI=="BlazorWebApp" || UI=="MAUIBlazor"}} - -#### Bundling and Minification - -`abp bundle` command offers bundling and minification support for client-side resources (JavaScript and CSS files) for Blazor projects. This command automatically run when you create a new solution with the [ABP CLI](../../../cli/index.md). - -However, sometimes you might need to run this command manually. To update script & style references without worrying about dependencies, ordering, etc. in a project, you can run this command in the directory of your `Blazor.Client` application: - - -````bash -abp bundle -```` - -> For more details about managing style and script references in Blazor or MAUI Blazor apps, see [Managing Global Scripts & Styles](../../../framework/ui/blazor/global-scripts-styles.md). - -{{end}} - ### Run the Application {{if UI=="MVC" || UI=="BlazorServer" || UI=="BlazorWebApp"}} diff --git a/docs/en/tutorials/todo/single-layer/index.md b/docs/en/tutorials/todo/single-layer/index.md index c96c3715ef..dc865a0a75 100644 --- a/docs/en/tutorials/todo/single-layer/index.md +++ b/docs/en/tutorials/todo/single-layer/index.md @@ -115,20 +115,6 @@ abp install-libs > We suggest you install [Yarn v1.22+ (not v2)](https://classic.yarnpkg.com/en/docs/install) to prevent possible package inconsistencies, if you haven't installed it yet. -{{if UI=="Blazor" || UI=="BlazorServer"}} - -#### Bundling and Minification - -Run the following command in the directory of your blazor application: - -```bash -abp bundle -``` - -> For more details about managing style and script references in Blazor or MAUI Blazor apps, see [Managing Global Scripts & Styles](../../../framework/ui/blazor/global-scripts-styles.md). - -{{end}} - ### Run the Application {{if UI=="MVC" || UI=="BlazorServer"}} diff --git a/docs/en/ui-themes/lepton-x-lite/blazor.md b/docs/en/ui-themes/lepton-x-lite/blazor.md index 3a9051b760..3f9a7ce7a5 100644 --- a/docs/en/ui-themes/lepton-x-lite/blazor.md +++ b/docs/en/ui-themes/lepton-x-lite/blazor.md @@ -21,7 +21,27 @@ This theme is **already installed** when you create a new solution using the sta - Complete the [MVC Razor Pages Installation](asp-net-core.md#installation) for the **HttpApi.Host** application first. _If the solution is tiered/micro-service, complete the MVC steps for all MVC applications such as **HttpApi.Host** and if Auth Server is separated, install to the **OpenIddict**_. -- Add **Volo.Abp.AspNetCore.Components.WebAssembly.LeptonXLiteTheme** package to your **Blazor WebAssembly** application with the following command: +- Add **Volo.Abp.AspNetCore.Components.WebAssembly.LeptonXLiteTheme.Bundling** package to your **Blazor** application with the following command: + + ```bash + dotnet add package Volo.Abp.AspNetCore.Components.WebAssembly.LeptonXLiteTheme.Bundling --prerelease + ``` + +- Remove **Volo.Abp.AspNetCore.Components.WebAssembly.BasicTheme.Bundling** reference from the project since it's not necessary after switching to LeptonX Lite. + +- Remove the old theme from the **DependsOn** attribute in your module class and add the **AbpAspNetCoreComponentsWebAssemblyLeptonXLiteThemeBundlingModule** type to the **DependsOn** attribute. + +```diff +[DependsOn( + // Remove BasicTheme module from DependsOn attribute +- typeof(AbpAspNetCoreComponentsWebAssemblyBasicThemeBundlingModule), + + // Add LeptonX Lite module to DependsOn attribute ++ typeof(AbpAspNetCoreComponentsWebAssemblyLeptonXLiteThemeBundlingModule), +)] +``` + +- Add **Volo.Abp.AspNetCore.Components.WebAssembly.LeptonXLiteTheme** package to your **Blazor.Client** application with the following command: ```bash dotnet add package Volo.Abp.AspNetCore.Components.WebAssembly.LeptonXLiteTheme --prerelease @@ -41,14 +61,21 @@ This theme is **already installed** when you create a new solution using the sta )] ``` -- Change startup App component with the LeptonX one. - -```csharp -// Make sure the 'App' comes from 'Volo.Abp.AspNetCore.Components.Web.LeptonXLiteTheme.Themes.LeptonXLite' namespace. -builder.RootComponents.Add("#ApplicationContainer"); -``` - -- Run the `abp bundle` command in your **Blazor** application folder. +Update `Routes.razor` file in `Blazor.Client` project as below: + +````csharp +@using Volo.Abp.AspNetCore.Components.Web.LeptonXLiteTheme.Themes.LeptonXLite +@using Volo.Abp.AspNetCore.Components.WebAssembly.WebApp + + + + + + + + + +```` {{end}} @@ -93,27 +120,37 @@ builder.RootComponents.Add("#ApplicationContainer"); }); ``` -- Update `_Host.cshtml` file. _(located under **Pages** folder by default.)_ - - - Add following usings to Locate **App** and **BlazorLeptonXLiteThemeBundles** classes. +- Update `App.razor` file. _(located under **Components** folder by default.)_ + - Add following namespace at the top of the page. ```csharp - @using Volo.Abp.AspNetCore.Components.Web.LeptonXLiteTheme.Themes.LeptonXLite - @using Volo.Abp.AspNetCore.Components.Server.LeptonXLiteTheme.Bundling + @ using Volo.Abp.AspNetCore.Components.Server.LeptonXLiteTheme.Bundling ``` - - Then replace script & style bundles as following: - ```diff - // Remove following line - - - // Add following line instead - + + - Then replace script & style bunles as following + ``` + ``` - ```diff - // Remove following line - - - // Add following line instead - + ``` + + ``` + +Update `Routes.razor` file as below: + +````csharp +@using Volo.Abp.AspNetCore.Components.Web.LeptonXLiteTheme.Themes.LeptonXLite +@using Volo.Abp.AspNetCore.Components.Web.Theming.Routing +@using Microsoft.Extensions.Options +@inject IOptions RouterOptions + + + + + + + + + +```` {{end}} diff --git a/docs/en/ui-themes/lepton-x/blazor.md b/docs/en/ui-themes/lepton-x/blazor.md index 24f17b50ea..5e49752ebb 100644 --- a/docs/en/ui-themes/lepton-x/blazor.md +++ b/docs/en/ui-themes/lepton-x/blazor.md @@ -13,37 +13,95 @@ LeptonX theme is implemented and ready to use with ABP. No custom implementation {{if UI == "Blazor"}} -- Add **Volo.Abp.AspNetCore.Components.WebAssembly.LeptonXTheme** package to your **Blazor WASM** application. +- Complete the [MVC Razor Pages Installation](asp-net-core.md#installation) for the **HttpApi.Host** application first. _If the solution is tiered/micro-service, complete the MVC steps for all MVC applications such as **HttpApi.Host** and if Auth Server is separated, install to the **OpenIddict**_. + + +- Add **Volo.Abp.AspNetCore.Components.WebAssembly.LeptonXTheme.Bundling** package to your **Blazor** application with the following command: + ```bash - dotnet add package Volo.Abp.AspNetCore.Components.WebAssembly.LeptonXTheme + dotnet add package Volo.Abp.AspNetCore.Components.WebAssembly.LeptonXTheme.Bundling --prerelease ``` -- Remove old theme from **DependsOn** attribute in your module class and add **AbpAspNetCoreComponentsWebAssemblyLeptonXThemeModule** type to **DependsOn** attribute. +- Remove **Volo.Abp.AspNetCore.Components.WebAssembly.LeptonTheme.Bundling** reference from the project since it's not necessary after switching to LeptonX Lite. + +- Remove the old theme from the **DependsOn** attribute in your module class and add the **AbpAspNetCoreComponentsWebAssemblyLeptonXThemeBundlingModule** type to the **DependsOn** attribute. ```diff [DependsOn( -- typeof(LeptonThemeManagementBlazorModule), -- typeof(AbpAspNetCoreComponentsWebAssemblyLeptonThemeModule), -+ typeof(AbpAspNetCoreComponentsWebAssemblyLeptonXThemeModule) + // Remove LeptonTheme module from DependsOn attribute +- typeof(AbpAspNetCoreComponentsWebAssemblyLeptonThemeBundlingModule), + + // Add LeptonX Lite module to DependsOn attribute ++ typeof(AbpAspNetCoreComponentsWebAssemblyLeptonXThemeBundlingModule), )] ``` -- Change startup `App` component with the LeptonX one. - - Add following using declaration and remove your old theme using declaration. - ```csharp - using Volo.Abp.AspNetCore.Components.Web.LeptonXTheme.Components; - ``` +- Add **Volo.Abp.AspNetCore.Components.WebAssembly.LeptonXTheme** package to your **Blazor.Client** application with the following command: - - Make sure `App` component in following block is `Volo.Abp.AspNetCore.Components.Web.LeptonXTheme.Components.App` - ```csharp - // Make sure the 'App' comes from 'Volo.Abp.AspNetCore.Components.Web.LeptonXTheme.Components' namespace. - builder.RootComponents.Add("#ApplicationContainer"); - ``` - - If you can't remove or not sure which one is the old theme's using statements, you can use full name of that class: - ```csharp - builder.RootComponents.Add("#ApplicationContainer"); - ``` + ```bash + dotnet add package Volo.Abp.AspNetCore.Components.WebAssembly.LeptonXTheme --prerelease + ``` + +- Remove **Volo.Abp.AspNetCore.Components.WebAssembly.LeptonTheme** reference from the project since it's not necessary after switching to LeptonX Lite. + +- Remove the old theme from the **DependsOn** attribute in your module class and add the **AbpAspNetCoreComponentsWebAssemblyLeptonXThemeModule** type to the **DependsOn** attribute. + +```diff +[DependsOn( + // Remove LeptonTheme module from DependsOn attribute +- typeof(AbpAspNetCoreComponentsWebAssemblyLeptonThemeModule), + + // Add LeptonX Lite module to DependsOn attribute ++ typeof(AbpAspNetCoreComponentsWebAssemblyLeptonXThemeModule), +)] +``` + +Update `Routes.razor` file in `Blazor.Client` project as below: + +````csharp +@using Microsoft.Extensions.Options +@using Microsoft.Extensions.Localization +@using global::Localization.Resources.AbpUi +@using Volo.Abp.AspNetCore.Components.Web.LeptonXTheme +@using Volo.Abp.AspNetCore.Components.Web.LeptonXTheme.Components +@using Volo.Abp.AspNetCore.Components.Web.LeptonXTheme.Components.ApplicationLayout +@using Volo.Abp.AspNetCore.Components.Web.Theming.Routing +@using Volo.Abp.AspNetCore.Components.WebAssembly.WebApp +@inject IOptions RouterOptions +@inject IOptions LayoutOptions +@inject IStringLocalizer UiLocalizer + + + + + + + @if (context.User?.Identity?.IsAuthenticated != true) + { + + } + else + { + + } + + + + + + + + + + +```` {{end}} @@ -78,22 +136,66 @@ LeptonX theme is implemented and ready to use with ABP. No custom implementation }); ``` -- Update `_Host.cshtml` file. _(located under **Pages** folder by default.)_ - - Add following usings to Locate **App** and **BlazorLeptonXThemeBundles** classes. +- Update `App.razor` file. _(located under **Components** folder by default.)_ + - Add following namespace at the top of the page. ```csharp - @using Volo.Abp.AspNetCore.Components.Web.LeptonXTheme.Components @using Volo.Abp.AspNetCore.Components.Server.LeptonXTheme.Bundling ``` - Then replace script & style bunles as following - ```diff - - - + + ``` + ``` - ```diff - - - + ``` + + ``` + +Update `Routes.razor` file as below: + +````csharp +@using Microsoft.Extensions.Options +@using Microsoft.Extensions.Localization +@using global::Localization.Resources.AbpUi +@using Volo.Abp.AspNetCore.Components.Web.LeptonXTheme +@using Volo.Abp.AspNetCore.Components.Web.LeptonXTheme.Components +@using Volo.Abp.AspNetCore.Components.Web.LeptonXTheme.Components.ApplicationLayout +@using Volo.Abp.AspNetCore.Components.Web.Theming.Routing +@using Volo.Abp.AspNetCore.Components.WebAssembly.WebApp +@inject IOptions RouterOptions +@inject IOptions LayoutOptions +@inject IStringLocalizer UiLocalizer + + + + + + + @if (context.User?.Identity?.IsAuthenticated != true) + { + + } + else + { + + } + + + + + + + + + + +```` + {{end}} --- @@ -167,33 +269,6 @@ Layout options of Blazor UI can be manageable via using **LeptonXThemeMvcOptions }); ``` -{{if UI == "Blazor"}} - -#### Updating Bundles on Layout Changes -Layout changes requires bundling and restarting the application. Before bundling, you have to add your layout to `appsettings.json`. Make sure `AbpCli:Bundle:Paramters` has `LeptonXTheme.Layout` key with your layout name. Available values are `side-menu` & `top-menu`. - - -_You can add the following section to root level of your appsettings.json file if not added._ -```json - "AbpCli": { - "Bundle": { - "Mode": "BundleAndMinify", /* Options: None, Bundle, BundleAndMinify */ - "Name": "global", - "Parameters": { - "LeptonXTheme.Layout": "top-menu" /* Options: side-menu, top-menu */ - } - } - } -``` - -Then you can run bundling command with ABP Cli - -```bash -abp bundle -``` - -{{end}} - ### Toolbars LeptonX includes separeted toolbars for desktop & mobile. You can manage toolbars independently. Toolbar names can be accessible in the **LeptonXToolbars** class. @@ -224,6 +299,7 @@ public async Task ConfigureToolbarAsync(IToolbarConfigurationContext context) {{end}} + ## 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**. @@ -258,7 +334,7 @@ You can override layouts by following the steps below: using Volo.Abp.AspNetCore.Components.Web.LeptonXTheme.Components.ApplicationLayout; using Volo.Abp.DependencyInjection; -namespace LeptonXLite.DemoApp.Blazor.MyComponents +namespace LeptonX.DemoApp.Blazor.MyComponents { [ExposeServices(typeof(SideMenuLayout))] [Dependency(ReplaceServices = true)] @@ -305,7 +381,7 @@ If you need to replace the component, you can follow the steps below. using Volo.Abp.AspNetCore.Components.Web.LeptonXTheme.Components.ApplicationLayout.Common; using Volo.Abp.DependencyInjection; -namespace LeptonXLite.DemoApp.Blazor.MyComponents +namespace LeptonX.DemoApp.Blazor.MyComponents { [ExposeServices(typeof(Breadcrumbs))] [Dependency(ReplaceServices = true)] @@ -338,7 +414,7 @@ namespace LeptonXLite.DemoApp.Blazor.MyComponents using Volo.Abp.AspNetCore.Components.Web.LeptonXTheme.Components.ApplicationLayout.Common; using Volo.Abp.DependencyInjection; -namespace LeptonXLite.DemoApp.Blazor.MyComponents +namespace LeptonX.DemoApp.Blazor.MyComponents { [ExposeServices(typeof(ContentToolbar))] [Dependency(ReplaceServices = true)] @@ -371,7 +447,7 @@ namespace LeptonXLite.DemoApp.Blazor.MyComponents using Volo.Abp.AspNetCore.Components.Web.LeptonXTheme.Components.ApplicationLayout.Common; using Volo.Abp.DependencyInjection; -namespace LeptonXLite.DemoApp.Blazor.MyComponents +namespace LeptonX.DemoApp.Blazor.MyComponents { [ExposeServices(typeof(GeneralSettings))] [Dependency(ReplaceServices = true)] @@ -404,7 +480,7 @@ namespace LeptonXLite.DemoApp.Blazor.MyComponents using Volo.Abp.AspNetCore.Components.Web.LeptonXTheme.Components.ApplicationLayout.Common; using Volo.Abp.DependencyInjection; -namespace LeptonXLite.DemoApp.Blazor.MyComponents +namespace LeptonX.DemoApp.Blazor.MyComponents { [ExposeServices(typeof(MobileGeneralSettings))] [Dependency(ReplaceServices = true)] @@ -443,7 +519,7 @@ Components used in the side menu layout. using Volo.Abp.AspNetCore.Components.Web.LeptonXTheme.Components.ApplicationLayout.SideMenu.Navigation; using Volo.Abp.DependencyInjection; -namespace LeptonXLite.DemoApp.Blazor.MyComponents +namespace LeptonX.DemoApp.Blazor.MyComponents { [ExposeServices(typeof(MainMenu))] [Dependency(ReplaceServices = true)] @@ -474,7 +550,7 @@ namespace LeptonXLite.DemoApp.Blazor.MyComponents using Volo.Abp.AspNetCore.Components.Web.LeptonXTheme.Components.ApplicationLayout.SideMenu.Navigation; using Volo.Abp.DependencyInjection; -namespace LeptonXLite.DemoApp.Blazor.MyComponents +namespace LeptonX.DemoApp.Blazor.MyComponents { [ExposeServices(typeof(MainMenu))] [Dependency(ReplaceServices = true)] @@ -507,7 +583,7 @@ namespace LeptonXLite.DemoApp.Blazor.MyComponents using Volo.Abp.AspNetCore.Components.Web.LeptonXTheme.Components.ApplicationLayout.SideMenu.Navigation; using Volo.Abp.DependencyInjection; -namespace LeptonXLite.DemoApp.Blazor.MyComponents +namespace LeptonX.DemoApp.Blazor.MyComponents { [ExposeServices(typeof(MobileNavbar))] [Dependency(ReplaceServices = true)] @@ -540,7 +616,7 @@ namespace LeptonXLite.DemoApp.Blazor.MyComponents using Volo.Abp.AspNetCore.Components.Web.LeptonXTheme.Components.ApplicationLayout.SideMenu.MainHeader; using Volo.Abp.DependencyInjection; -namespace LeptonXLite.DemoApp.Blazor.MyComponents +namespace LeptonX.DemoApp.Blazor.MyComponents { [ExposeServices(typeof(MainHeader))] [Dependency(ReplaceServices = true)] @@ -577,7 +653,7 @@ If you need to replace the component, you can follow the steps below. using Volo.Abp.AspNetCore.Components.Web.LeptonXTheme.Components.ApplicationLayout.SideMenu.MainHeader; using Volo.Abp.DependencyInjection; -namespace LeptonXLite.DemoApp.Blazor.MyComponents +namespace LeptonX.DemoApp.Blazor.MyComponents { [ExposeServices(typeof(MainHeaderBranding))] [Dependency(ReplaceServices = true)] @@ -614,7 +690,7 @@ If you need to replace the component, you can follow the steps below. using Volo.Abp.AspNetCore.Components.Web.LeptonXTheme.Components.ApplicationLayout.SideMenu.MainHeader; using Volo.Abp.DependencyInjection; -namespace LeptonXLite.DemoApp.Blazor.MyComponents +namespace LeptonX.DemoApp.Blazor.MyComponents { [ExposeServices(typeof(MainHeaderToolbar))] [Dependency(ReplaceServices = true)] @@ -653,7 +729,7 @@ Components used in the top menu layout. using Volo.Abp.AspNetCore.Components.Web.LeptonXTheme.Components.ApplicationLayout.TopMenu.Navigation; using Volo.Abp.DependencyInjection; -namespace LeptonXLite.DemoApp.Blazor.MyComponents +namespace LeptonX.DemoApp.Blazor.MyComponents { [ExposeServices(typeof(MainMenu))] [Dependency(ReplaceServices = true)] @@ -684,7 +760,7 @@ namespace LeptonXLite.DemoApp.Blazor.MyComponents using Volo.Abp.AspNetCore.Components.Web.LeptonXTheme.Components.ApplicationLayout.TopMenu.Navigation; using Volo.Abp.DependencyInjection; -namespace LeptonXLite.DemoApp.Blazor.MyComponents +namespace LeptonX.DemoApp.Blazor.MyComponents { [ExposeServices(typeof(MainMenu))] [Dependency(ReplaceServices = true)] @@ -717,7 +793,7 @@ namespace LeptonXLite.DemoApp.Blazor.MyComponents using Volo.Abp.AspNetCore.Components.Web.LeptonXTheme.Components.ApplicationLayout.TopMenu.Navigation; using Volo.Abp.DependencyInjection; -namespace LeptonXLite.DemoApp.Blazor.MyComponents +namespace LeptonX.DemoApp.Blazor.MyComponents { [ExposeServices(typeof(MobileNavbar))] [Dependency(ReplaceServices = true)] @@ -750,7 +826,7 @@ namespace LeptonXLite.DemoApp.Blazor.MyComponents using Volo.Abp.AspNetCore.Components.Web.LeptonXTheme.Components.ApplicationLayout.TopMenu.MainHeader; using Volo.Abp.DependencyInjection; -namespace LeptonXLite.DemoApp.Blazor.MyComponents +namespace LeptonX.DemoApp.Blazor.MyComponents { [ExposeServices(typeof(MainHeader))] [Dependency(ReplaceServices = true)] @@ -785,7 +861,7 @@ Application branding can be customized with the `IBrandingProvider`. See the [Br using Volo.Abp.AspNetCore.Components.Web.LeptonXTheme.Components.ApplicationLayout.TopMenu.MainHeader; using Volo.Abp.DependencyInjection; -namespace LeptonXLite.DemoApp.Blazor.MyComponents +namespace LeptonX.DemoApp.Blazor.MyComponents { [ExposeServices(typeof(MainHeaderBranding))] [Dependency(ReplaceServices = true)] @@ -822,7 +898,7 @@ If you need to replace the component, you can follow the steps below. using Volo.Abp.AspNetCore.Components.Web.LeptonXTheme.Components.ApplicationLayout.TopMenu.MainHeader; using Volo.Abp.DependencyInjection; -namespace LeptonXLite.DemoApp.Blazor.MyComponents +namespace LeptonX.DemoApp.Blazor.MyComponents { [ExposeServices(typeof(MainHeaderToolbar))] [Dependency(ReplaceServices = true)] diff --git a/docs/en/ui-themes/lepton/customizing-lepton-theme.md b/docs/en/ui-themes/lepton/customizing-lepton-theme.md index c94ccaafce..33cdcfc5c2 100644 --- a/docs/en/ui-themes/lepton/customizing-lepton-theme.md +++ b/docs/en/ui-themes/lepton/customizing-lepton-theme.md @@ -229,12 +229,6 @@ Configure<(op } ``` -Run the following ABP CLI command to bundle the `custom.css` - -```bash -abp bundle -``` - {{end}} diff --git a/framework/Volo.Abp.sln b/framework/Volo.Abp.sln index ca471bb304..db7bc55ff2 100644 --- a/framework/Volo.Abp.sln +++ b/framework/Volo.Abp.sln @@ -481,6 +481,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.Sms.TencentCloud", EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.Sms.TencentCloud.Tests", "test\Volo.Abp.Sms.TencenCloud.Tests\Volo.Abp.Sms.TencentCloud.Tests.csproj", "{C753DDD6-5699-45F8-8669-08CE0BB816DE}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.AspNetCore.Bundling", "src\Volo.Abp.AspNetCore.Bundling\Volo.Abp.AspNetCore.Bundling.csproj", "{75AA8A90-B3F6-43DF-ADA7-0990DEF44E2C}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.AspNetCore.Components.MauiBlazor.Bundling", "src\Volo.Abp.AspNetCore.Components.MauiBlazor.Bundling\Volo.Abp.AspNetCore.Components.MauiBlazor.Bundling.csproj", "{70720321-DED4-464F-B913-BDA5BBDD7982}" +EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.BlobStoring.Bunny", "src\Volo.Abp.BlobStoring.Bunny\Volo.Abp.BlobStoring.Bunny.csproj", "{1BBCBA72-CDB6-4882-96EE-D4CD149433A2}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.BlobStoring.Bunny.Tests", "test\Volo.Abp.BlobStoring.Bunny.Tests\Volo.Abp.BlobStoring.Bunny.Tests.csproj", "{BC4BB2D6-DFD8-4190-AAC3-32C0A7A8E915}" @@ -1439,6 +1443,14 @@ Global {C753DDD6-5699-45F8-8669-08CE0BB816DE}.Debug|Any CPU.Build.0 = Debug|Any CPU {C753DDD6-5699-45F8-8669-08CE0BB816DE}.Release|Any CPU.ActiveCfg = Release|Any CPU {C753DDD6-5699-45F8-8669-08CE0BB816DE}.Release|Any CPU.Build.0 = Release|Any CPU + {75AA8A90-B3F6-43DF-ADA7-0990DEF44E2C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {75AA8A90-B3F6-43DF-ADA7-0990DEF44E2C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {75AA8A90-B3F6-43DF-ADA7-0990DEF44E2C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {75AA8A90-B3F6-43DF-ADA7-0990DEF44E2C}.Release|Any CPU.Build.0 = Release|Any CPU + {70720321-DED4-464F-B913-BDA5BBDD7982}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {70720321-DED4-464F-B913-BDA5BBDD7982}.Debug|Any CPU.Build.0 = Debug|Any CPU + {70720321-DED4-464F-B913-BDA5BBDD7982}.Release|Any CPU.ActiveCfg = Release|Any CPU + {70720321-DED4-464F-B913-BDA5BBDD7982}.Release|Any CPU.Build.0 = Release|Any CPU {1BBCBA72-CDB6-4882-96EE-D4CD149433A2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1BBCBA72-CDB6-4882-96EE-D4CD149433A2}.Debug|Any CPU.Build.0 = Debug|Any CPU {1BBCBA72-CDB6-4882-96EE-D4CD149433A2}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -1689,6 +1701,8 @@ Global {E50739A7-5E2F-4EB5-AEA9-554115CB9613} = {447C8A77-E5F0-4538-8687-7383196D04EA} {BE7109C5-7368-4688-8557-4A15D3F4776A} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} {C753DDD6-5699-45F8-8669-08CE0BB816DE} = {447C8A77-E5F0-4538-8687-7383196D04EA} + {75AA8A90-B3F6-43DF-ADA7-0990DEF44E2C} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} + {70720321-DED4-464F-B913-BDA5BBDD7982} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} {1BBCBA72-CDB6-4882-96EE-D4CD149433A2} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} {BC4BB2D6-DFD8-4190-AAC3-32C0A7A8E915} = {447C8A77-E5F0-4538-8687-7383196D04EA} EndGlobalSection diff --git a/framework/src/Volo.Abp.AspNetCore.Bundling/Volo.Abp.AspNetCore.Bundling.csproj b/framework/src/Volo.Abp.AspNetCore.Bundling/Volo.Abp.AspNetCore.Bundling.csproj new file mode 100644 index 0000000000..2654005740 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Bundling/Volo.Abp.AspNetCore.Bundling.csproj @@ -0,0 +1,19 @@ + + + + + + + net9.0 + enable + Nullable + + + + + + + + + + \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.Bundling/Volo/Abp/AspNetCore/Bundling/AbpAspNetCoreBundlingModule.cs b/framework/src/Volo.Abp.AspNetCore.Bundling/Volo/Abp/AspNetCore/Bundling/AbpAspNetCoreBundlingModule.cs new file mode 100644 index 0000000000..5e4967719f --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Bundling/Volo/Abp/AspNetCore/Bundling/AbpAspNetCoreBundlingModule.cs @@ -0,0 +1,15 @@ +using Volo.Abp.AspNetCore.Mvc.UI.Bundling; +using Volo.Abp.Minify; +using Volo.Abp.Modularity; +using Volo.Abp.VirtualFileSystem; + +namespace Volo.Abp.AspNetCore.Bundling; + +[DependsOn( + typeof(AbpAspNetCoreMvcUiBundlingAbstractionsModule), + typeof(AbpMinifyModule), + typeof(AbpVirtualFileSystemModule) +)] +public class AbpAspNetCoreBundlingModule : AbpModule +{ +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleCache.cs b/framework/src/Volo.Abp.AspNetCore.Bundling/Volo/Abp/AspNetCore/Bundling/BundleCache.cs similarity index 88% rename from framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleCache.cs rename to framework/src/Volo.Abp.AspNetCore.Bundling/Volo/Abp/AspNetCore/Bundling/BundleCache.cs index e00bc84d6c..5ade7fc088 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleCache.cs +++ b/framework/src/Volo.Abp.AspNetCore.Bundling/Volo/Abp/AspNetCore/Bundling/BundleCache.cs @@ -1,9 +1,10 @@ using System; using System.Collections.Concurrent; using System.Collections.Generic; +using Volo.Abp.AspNetCore.Mvc.UI.Bundling; using Volo.Abp.DependencyInjection; -namespace Volo.Abp.AspNetCore.Mvc.UI.Bundling; +namespace Volo.Abp.AspNetCore.Bundling; public class BundleCache : IBundleCache, ISingletonDependency { diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleCacheItem.cs b/framework/src/Volo.Abp.AspNetCore.Bundling/Volo/Abp/AspNetCore/Bundling/BundleCacheItem.cs similarity index 79% rename from framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleCacheItem.cs rename to framework/src/Volo.Abp.AspNetCore.Bundling/Volo/Abp/AspNetCore/Bundling/BundleCacheItem.cs index f6830cbd74..f75f8b66db 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleCacheItem.cs +++ b/framework/src/Volo.Abp.AspNetCore.Bundling/Volo/Abp/AspNetCore/Bundling/BundleCacheItem.cs @@ -1,7 +1,8 @@ using System; using System.Collections.Generic; +using Volo.Abp.AspNetCore.Mvc.UI.Bundling; -namespace Volo.Abp.AspNetCore.Mvc.UI.Bundling; +namespace Volo.Abp.AspNetCore.Bundling; public class BundleCacheItem { diff --git a/framework/src/Volo.Abp.AspNetCore.Bundling/Volo/Abp/AspNetCore/Bundling/BundleManagerBase.cs b/framework/src/Volo.Abp.AspNetCore.Bundling/Volo/Abp/AspNetCore/Bundling/BundleManagerBase.cs new file mode 100644 index 0000000000..8563918113 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Bundling/Volo/Abp/AspNetCore/Bundling/BundleManagerBase.cs @@ -0,0 +1,248 @@ +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Microsoft.Extensions.FileProviders; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Logging.Abstractions; +using Microsoft.Extensions.Options; +using Volo.Abp.AspNetCore.Bundling.Scripts; +using Volo.Abp.AspNetCore.Bundling.Styles; +using Volo.Abp.AspNetCore.Mvc.UI.Bundling; +using Volo.Abp.VirtualFileSystem; + +namespace Volo.Abp.AspNetCore.Bundling; + +public abstract class BundleManagerBase : IBundleManager +{ + public ILogger Logger { get; set; } + + protected readonly AbpBundlingOptions Options; + protected readonly AbpBundleContributorOptions ContributorOptions; + protected readonly IScriptBundler ScriptBundler; + protected readonly IStyleBundler StyleBundler; + protected readonly IServiceProvider ServiceProvider; + protected readonly IDynamicFileProvider DynamicFileProvider; + protected readonly IBundleCache BundleCache; + + public BundleManagerBase( + IOptions options, + IOptions contributorOptions, + IScriptBundler scriptBundler, + IStyleBundler styleBundler, + IServiceProvider serviceProvider, + IDynamicFileProvider dynamicFileProvider, + IBundleCache bundleCache) + { + Options = options.Value; + ContributorOptions = contributorOptions.Value; + ScriptBundler = scriptBundler; + ServiceProvider = serviceProvider; + DynamicFileProvider = dynamicFileProvider; + BundleCache = bundleCache; + StyleBundler = styleBundler; + + Logger = NullLogger.Instance; + } + + public virtual async Task> GetStyleBundleFilesAsync(string bundleName) + { + return await GetBundleFilesAsync(Options.StyleBundles, bundleName, StyleBundler); + } + + public virtual async Task> GetScriptBundleFilesAsync(string bundleName) + { + return await GetBundleFilesAsync(Options.ScriptBundles, bundleName, ScriptBundler); + } + + protected virtual async Task> GetBundleFilesAsync(BundleConfigurationCollection bundles, + string bundleName, IBundler bundler) + { + var files = new List(); + + var contributors = GetContributors(bundles, bundleName); + var bundleFiles = await GetBundleFilesAsync(contributors); + var dynamicResources = await GetDynamicResourcesAsync(contributors); + + if (!IsBundlingEnabled()) + { + return bundleFiles.Union(dynamicResources).ToImmutableList(); + } + + var localBundleFiles = new List(); + foreach (var bundleFile in bundleFiles) + { + if (!bundleFile.IsExternalFile) + { + localBundleFiles.Add(bundleFile.FileName); + } + else + { + if (localBundleFiles.Count != 0) + { + files.AddRange(AddToBundleCache(bundleName, bundler, localBundleFiles).Files); + localBundleFiles.Clear(); + } + + files.Add(bundleFile); + } + } + + if (localBundleFiles.Count != 0) + { + files.AddRange(AddToBundleCache(bundleName, bundler, localBundleFiles).Files); + } + + return files.Union(dynamicResources).ToImmutableList(); + } + + private BundleCacheItem AddToBundleCache(string bundleName, IBundler bundler, List bundleFiles) + { + var bundleRelativePath = + Options.BundleFolderName.EnsureEndsWith('/') + + bundleName + "." + bundleFiles.JoinAsString("|").ToMd5() + "." + bundler.FileExtension; + + return BundleCache.GetOrAdd(bundleRelativePath, () => + { + var cacheValue = new BundleCacheItem( + new List { new BundleFile("/" + bundleRelativePath) } + ); + + WatchChanges(cacheValue, bundleFiles, bundleRelativePath); + + var bundleResult = bundler.Bundle( + new BundlerContext( + bundleRelativePath, + bundleFiles, + IsMinficationEnabled() + ) + ); + + SaveBundleResult(bundleRelativePath, bundleResult); + + return cacheValue; + }); + } + + private void WatchChanges(BundleCacheItem cacheValue, List files, string bundleRelativePath) + { + lock (cacheValue.WatchDisposeHandles) + { + foreach (var file in files) + { + var watchDisposeHandle = GetFileProvider().Watch(file).RegisterChangeCallback(_ => + { + lock (cacheValue.WatchDisposeHandles) + { + cacheValue.WatchDisposeHandles.ForEach(h => h.Dispose()); + cacheValue.WatchDisposeHandles.Clear(); + } + + BundleCache.Remove(bundleRelativePath); + DynamicFileProvider.Delete("/wwwroot/" + bundleRelativePath); //TODO: get rid of wwwroot! + }, null); + + cacheValue.WatchDisposeHandles.Add(watchDisposeHandle); + } + } + } + + protected virtual void SaveBundleResult(string bundleRelativePath, BundleResult bundleResult) + { + var fileName = bundleRelativePath.Substring(bundleRelativePath.IndexOf('/') + 1); + + DynamicFileProvider.AddOrUpdate( + new InMemoryFileInfo( + "/wwwroot/" + bundleRelativePath, //TODO: get rid of wwwroot! + Encoding.UTF8.GetBytes(bundleResult.Content), + fileName + ) + ); + } + + public abstract bool IsBundlingEnabled(); + + + protected abstract bool IsMinficationEnabled(); + + protected virtual async Task> GetBundleFilesAsync(List contributors) + { + var context = CreateBundleConfigurationContext(); + + foreach (var contributor in contributors) + { + await contributor.PreConfigureBundleAsync(context); + } + + foreach (var contributor in contributors) + { + await contributor.ConfigureBundleAsync(context); + } + + foreach (var contributor in contributors) + { + await contributor.PostConfigureBundleAsync(context); + } + + return context.Files; + } + + protected virtual async Task> GetDynamicResourcesAsync(List contributors) + { + var context = CreateBundleConfigurationContext(); + + foreach (var contributor in contributors) + { + await contributor.ConfigureDynamicResourcesAsync(context); + } + + return context.Files; + } + + protected virtual BundleConfigurationContext CreateBundleConfigurationContext() + { + return new BundleConfigurationContext(ServiceProvider, GetFileProvider(), + Options.Parameters); + } + + protected abstract IFileProvider GetFileProvider(); + + protected virtual List GetContributors(BundleConfigurationCollection bundles, string bundleName) + { + var contributors = new List(); + + AddContributorsWithBaseBundles(contributors, bundles, bundleName); + + for (var i = 0; i < contributors.Count; ++i) + { + var extensions = ContributorOptions.Extensions(contributors[i].GetType()).GetAll(); + if (extensions.Count > 0) + { + contributors.InsertRange(i + 1, extensions); + i += extensions.Count; + } + } + + return contributors; + } + + protected virtual void AddContributorsWithBaseBundles(List contributors, + BundleConfigurationCollection bundles, string bundleName) + { + var bundleConfiguration = bundles.Get(bundleName); + + foreach (var baseBundleName in bundleConfiguration.BaseBundles) + { + AddContributorsWithBaseBundles(contributors, bundles, baseBundleName); //Recursive call + } + + var selfContributors = bundleConfiguration.Contributors.GetAll(); + + if (selfContributors.Any()) + { + contributors.AddRange(selfContributors); + } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleResult.cs b/framework/src/Volo.Abp.AspNetCore.Bundling/Volo/Abp/AspNetCore/Bundling/BundleResult.cs similarity index 75% rename from framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleResult.cs rename to framework/src/Volo.Abp.AspNetCore.Bundling/Volo/Abp/AspNetCore/Bundling/BundleResult.cs index eb44dd585e..60ac2c0bc6 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleResult.cs +++ b/framework/src/Volo.Abp.AspNetCore.Bundling/Volo/Abp/AspNetCore/Bundling/BundleResult.cs @@ -1,4 +1,4 @@ -namespace Volo.Abp.AspNetCore.Mvc.UI.Bundling; +namespace Volo.Abp.AspNetCore.Bundling; public class BundleResult { diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundlerBase.cs b/framework/src/Volo.Abp.AspNetCore.Bundling/Volo/Abp/AspNetCore/Bundling/BundlerBase.cs similarity index 93% rename from framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundlerBase.cs rename to framework/src/Volo.Abp.AspNetCore.Bundling/Volo/Abp/AspNetCore/Bundling/BundlerBase.cs index 4b0efe54ab..b52b9c204f 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundlerBase.cs +++ b/framework/src/Volo.Abp.AspNetCore.Bundling/Volo/Abp/AspNetCore/Bundling/BundlerBase.cs @@ -1,31 +1,27 @@ using System; using System.Text; -using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.FileProviders; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Options; +using Volo.Abp.AspNetCore.Mvc.UI.Bundling; using Volo.Abp.DependencyInjection; using Volo.Abp.Minify; -namespace Volo.Abp.AspNetCore.Mvc.UI.Bundling; +namespace Volo.Abp.AspNetCore.Bundling; public abstract class BundlerBase : IBundler, ITransientDependency { private static string[] _minFileSuffixes = { "min", "prod" }; public ILogger Logger { get; set; } - - protected IWebHostEnvironment HostEnvironment { get; } protected IMinifier Minifier { get; } protected AbpBundlingOptions BundlingOptions { get; } protected BundlerBase( - IWebHostEnvironment hostEnvironment, IMinifier minifier, IOptions bundlingOptions) { - HostEnvironment = hostEnvironment; Minifier = minifier; BundlingOptions = bundlingOptions.Value; @@ -123,7 +119,7 @@ public abstract class BundlerBase : IBundler, ITransientDependency protected virtual IFileInfo GetFileInfo(IBundlerContext context, string file) { - var fileInfo = HostEnvironment.WebRootFileProvider.GetFileInfo(file); + var fileInfo = FindFileInfo(file); if (!fileInfo.Exists) { @@ -150,7 +146,7 @@ public abstract class BundlerBase : IBundler, ITransientDependency { foreach (var suffix in _minFileSuffixes) { - var fileInfo = HostEnvironment.WebRootFileProvider.GetFileInfo( + var fileInfo = FindFileInfo( $"{file.RemovePostFix($".{FileExtension}")}.{suffix}.{FileExtension}" ); @@ -163,6 +159,8 @@ public abstract class BundlerBase : IBundler, ITransientDependency return null; } + protected abstract IFileInfo FindFileInfo(string file); + protected virtual string ProcessBeforeAddingToTheBundle(IBundlerContext context, string filePath, string fileContent) { return fileContent; diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundlerContext.cs b/framework/src/Volo.Abp.AspNetCore.Bundling/Volo/Abp/AspNetCore/Bundling/BundlerContext.cs similarity index 91% rename from framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundlerContext.cs rename to framework/src/Volo.Abp.AspNetCore.Bundling/Volo/Abp/AspNetCore/Bundling/BundlerContext.cs index 9c9c60a9eb..e39fa90880 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundlerContext.cs +++ b/framework/src/Volo.Abp.AspNetCore.Bundling/Volo/Abp/AspNetCore/Bundling/BundlerContext.cs @@ -1,6 +1,6 @@ using System.Collections.Generic; -namespace Volo.Abp.AspNetCore.Mvc.UI.Bundling; +namespace Volo.Abp.AspNetCore.Bundling; public class BundlerContext : IBundlerContext { diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/IBundleCache.cs b/framework/src/Volo.Abp.AspNetCore.Bundling/Volo/Abp/AspNetCore/Bundling/IBundleCache.cs similarity index 78% rename from framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/IBundleCache.cs rename to framework/src/Volo.Abp.AspNetCore.Bundling/Volo/Abp/AspNetCore/Bundling/IBundleCache.cs index 9c2f19d4ca..6f80d23a60 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/IBundleCache.cs +++ b/framework/src/Volo.Abp.AspNetCore.Bundling/Volo/Abp/AspNetCore/Bundling/IBundleCache.cs @@ -1,6 +1,6 @@ using System; -namespace Volo.Abp.AspNetCore.Mvc.UI.Bundling; +namespace Volo.Abp.AspNetCore.Bundling; public interface IBundleCache { diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/IBundleManager.cs b/framework/src/Volo.Abp.AspNetCore.Bundling/Volo/Abp/AspNetCore/Bundling/IBundleManager.cs similarity index 76% rename from framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/IBundleManager.cs rename to framework/src/Volo.Abp.AspNetCore.Bundling/Volo/Abp/AspNetCore/Bundling/IBundleManager.cs index 067554e102..3c3a50ece1 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/IBundleManager.cs +++ b/framework/src/Volo.Abp.AspNetCore.Bundling/Volo/Abp/AspNetCore/Bundling/IBundleManager.cs @@ -1,7 +1,8 @@ using System.Collections.Generic; using System.Threading.Tasks; +using Volo.Abp.AspNetCore.Mvc.UI.Bundling; -namespace Volo.Abp.AspNetCore.Mvc.UI.Bundling; +namespace Volo.Abp.AspNetCore.Bundling; public interface IBundleManager { diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/IBundler.cs b/framework/src/Volo.Abp.AspNetCore.Bundling/Volo/Abp/AspNetCore/Bundling/IBundler.cs similarity index 58% rename from framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/IBundler.cs rename to framework/src/Volo.Abp.AspNetCore.Bundling/Volo/Abp/AspNetCore/Bundling/IBundler.cs index 9f396767ee..68e50f4ec7 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/IBundler.cs +++ b/framework/src/Volo.Abp.AspNetCore.Bundling/Volo/Abp/AspNetCore/Bundling/IBundler.cs @@ -1,4 +1,6 @@ -namespace Volo.Abp.AspNetCore.Mvc.UI.Bundling; +using Volo.Abp.AspNetCore.Mvc.UI.Bundling; + +namespace Volo.Abp.AspNetCore.Bundling; public interface IBundler { diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/IBundlerContext.cs b/framework/src/Volo.Abp.AspNetCore.Bundling/Volo/Abp/AspNetCore/Bundling/IBundlerContext.cs similarity index 81% rename from framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/IBundlerContext.cs rename to framework/src/Volo.Abp.AspNetCore.Bundling/Volo/Abp/AspNetCore/Bundling/IBundlerContext.cs index d59bc154b5..83d49df220 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/IBundlerContext.cs +++ b/framework/src/Volo.Abp.AspNetCore.Bundling/Volo/Abp/AspNetCore/Bundling/IBundlerContext.cs @@ -1,6 +1,6 @@ using System.Collections.Generic; -namespace Volo.Abp.AspNetCore.Mvc.UI.Bundling; +namespace Volo.Abp.AspNetCore.Bundling; public interface IBundlerContext { diff --git a/framework/src/Volo.Abp.AspNetCore.Bundling/Volo/Abp/AspNetCore/Bundling/Scripts/IScriptBundler.cs b/framework/src/Volo.Abp.AspNetCore.Bundling/Volo/Abp/AspNetCore/Bundling/Scripts/IScriptBundler.cs new file mode 100644 index 0000000000..2af5f655a7 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Bundling/Volo/Abp/AspNetCore/Bundling/Scripts/IScriptBundler.cs @@ -0,0 +1,6 @@ +namespace Volo.Abp.AspNetCore.Bundling.Scripts; + +public interface IScriptBundler : IBundler +{ + +} diff --git a/framework/src/Volo.Abp.AspNetCore.Bundling/Volo/Abp/AspNetCore/Bundling/Styles/IStyleBundler.cs b/framework/src/Volo.Abp.AspNetCore.Bundling/Volo/Abp/AspNetCore/Bundling/Styles/IStyleBundler.cs new file mode 100644 index 0000000000..c8fe1cbf2a --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Bundling/Volo/Abp/AspNetCore/Bundling/Styles/IStyleBundler.cs @@ -0,0 +1,6 @@ +namespace Volo.Abp.AspNetCore.Bundling.Styles; + +public interface IStyleBundler : IBundler +{ + +} diff --git a/framework/src/Volo.Abp.AspNetCore.Components.MauiBlazor.Bundling/AbpAspNetCoreComponentsMauiBlazorBundlingModule.cs b/framework/src/Volo.Abp.AspNetCore.Components.MauiBlazor.Bundling/AbpAspNetCoreComponentsMauiBlazorBundlingModule.cs new file mode 100644 index 0000000000..2ffa74b833 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Components.MauiBlazor.Bundling/AbpAspNetCoreComponentsMauiBlazorBundlingModule.cs @@ -0,0 +1,106 @@ +using System.Text; +using Microsoft.Extensions.FileProviders; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Volo.Abp.AspNetCore.Bundling; +using Volo.Abp.AspNetCore.Mvc.UI.Bundling; +using Volo.Abp.Bundling.Styles; +using Volo.Abp.Modularity; +using Volo.Abp.Threading; +using Volo.Abp.VirtualFileSystem; + +namespace Volo.Abp.AspNetCore.Components.MauiBlazor.Bundling; + +[DependsOn( + typeof(AbpAspNetCoreComponentsMauiBlazorModule), + typeof(AbpAspNetCoreBundlingModule) +)] +public class AbpAspNetCoreComponentsMauiBlazorBundlingModule : AbpModule +{ + public override void OnApplicationInitialization(ApplicationInitializationContext context) + { + AsyncHelper.RunSync(() => OnApplicationInitializationAsync(context)); + } + + public async override Task OnApplicationInitializationAsync(ApplicationInitializationContext context) + { + await InitialGlobalAssetsAsync(context); + } + + protected virtual async Task InitialGlobalAssetsAsync(ApplicationInitializationContext context) + { + var bundlingOptions = context.ServiceProvider.GetRequiredService>().Value; + var logger = context.ServiceProvider.GetRequiredService>(); + if (!bundlingOptions.GlobalAssets.Enabled) + { + return; + } + + var bundleManager = context.ServiceProvider.GetRequiredService(); + var mauiBlazorContentFileProvider = context.ServiceProvider.GetRequiredService(); + var dynamicFileProvider = context.ServiceProvider.GetRequiredService(); + if (!bundlingOptions.GlobalAssets.GlobalStyleBundleName.IsNullOrWhiteSpace()) + { + var styleFiles = await bundleManager.GetStyleBundleFilesAsync(bundlingOptions.GlobalAssets.GlobalStyleBundleName); + var styles = string.Empty; + foreach (var file in styleFiles) + { + var fileInfo = mauiBlazorContentFileProvider.GetFileInfo(file.FileName); + if (!fileInfo.Exists) + { + logger.LogError($"Could not find the file: {file.FileName}"); + continue; + } + + var fileContent = await fileInfo.ReadAsStringAsync(); + if (!bundleManager.IsBundlingEnabled()) + { + fileContent = CssRelativePath.Adjust(fileContent, + file.FileName, + Path.Combine(Directory.GetCurrentDirectory(), "wwwroot")); + + styles += $"/*{file.FileName}*/{Environment.NewLine}{fileContent}{Environment.NewLine}{Environment.NewLine}"; + } + else + { + styles += $"{fileContent}{Environment.NewLine}{Environment.NewLine}"; + } + } + + dynamicFileProvider.AddOrUpdate( + new InMemoryFileInfo("/wwwroot/" + bundlingOptions.GlobalAssets.CssFileName, + Encoding.UTF8.GetBytes(styles), + bundlingOptions.GlobalAssets.CssFileName)); + } + + if (!bundlingOptions.GlobalAssets.GlobalScriptBundleName.IsNullOrWhiteSpace()) + { + var scriptFiles = await bundleManager.GetScriptBundleFilesAsync(bundlingOptions.GlobalAssets.GlobalScriptBundleName); + var scripts = string.Empty; + foreach (var file in scriptFiles) + { + var fileInfo = mauiBlazorContentFileProvider.GetFileInfo(file.FileName); + if (!fileInfo.Exists) + { + logger.LogError($"Could not find the file: {file.FileName}"); + continue; + } + + var fileContent = await fileInfo.ReadAsStringAsync(); + if (!bundleManager.IsBundlingEnabled()) + { + scripts += $"{fileContent.EnsureEndsWith(';')}{Environment.NewLine}{Environment.NewLine}"; + } + else + { + scripts += $"//{file.FileName}{Environment.NewLine}{fileContent.EnsureEndsWith(';')}{Environment.NewLine}{Environment.NewLine}"; + } + } + + dynamicFileProvider.AddOrUpdate( + new InMemoryFileInfo("/wwwroot/" + bundlingOptions.GlobalAssets.JavaScriptFileName, + Encoding.UTF8.GetBytes(scripts), + bundlingOptions.GlobalAssets.JavaScriptFileName)); + } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.Components.MauiBlazor.Bundling/AbpBlazorWebView.cs b/framework/src/Volo.Abp.AspNetCore.Components.MauiBlazor.Bundling/AbpBlazorWebView.cs new file mode 100644 index 0000000000..dce9f6d644 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Components.MauiBlazor.Bundling/AbpBlazorWebView.cs @@ -0,0 +1,13 @@ +using Microsoft.AspNetCore.Components.WebView.Maui; +using Microsoft.Extensions.FileProviders; +using Volo.Abp.VirtualFileSystem; + +namespace Volo.Abp.AspNetCore.Components.MauiBlazor.Bundling; + +public class AbpBlazorWebView : BlazorWebView +{ + public override IFileProvider CreateFileProvider(string contentRootDir) + { + return new CompositeFileProvider(Handler!.GetRequiredService(), base.CreateFileProvider(contentRootDir)); + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.Components.MauiBlazor.Bundling/BundleManager.cs b/framework/src/Volo.Abp.AspNetCore.Components.MauiBlazor.Bundling/BundleManager.cs new file mode 100644 index 0000000000..3d8b0ab938 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Components.MauiBlazor.Bundling/BundleManager.cs @@ -0,0 +1,125 @@ +using Microsoft.Extensions.FileProviders; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Volo.Abp.AspNetCore.Bundling; +using Volo.Abp.AspNetCore.Bundling.Scripts; +using Volo.Abp.AspNetCore.Bundling.Styles; +using Volo.Abp.AspNetCore.Mvc.UI.Bundling; +using Volo.Abp.DependencyInjection; +using Volo.Abp.VirtualFileSystem; + +namespace Volo.Abp.AspNetCore.Components.MauiBlazor.Bundling; + +public class BundleManager : BundleManagerBase, ITransientDependency +{ + protected IMauiBlazorContentFileProvider MauiBlazorContentFileProvider { get; } + + public BundleManager( + IOptions options, + IOptions contributorOptions, + IScriptBundler scriptBundler, + IStyleBundler styleBundler, + IServiceProvider serviceProvider, + IDynamicFileProvider dynamicFileProvider, + IBundleCache bundleCache, + IMauiBlazorContentFileProvider mauiBlazorContentFileProvider) : base( + options, + contributorOptions, + scriptBundler, + styleBundler, + serviceProvider, + dynamicFileProvider, + bundleCache) + { + MauiBlazorContentFileProvider = mauiBlazorContentFileProvider; + } + + public override bool IsBundlingEnabled() + { + switch (Options.Mode) + { + case BundlingMode.None: + return false; + case BundlingMode.Bundle: + case BundlingMode.BundleAndMinify: + return true; + case BundlingMode.Auto: + return !IsDebug(); + default: + throw new AbpException($"Unhandled {nameof(BundlingMode)}: {Options.Mode}"); + } + } + + protected async override Task> GetBundleFilesAsync(List contributors) + { + var files = await base.GetBundleFilesAsync(contributors); + + foreach (var file in files) + { + await CopyFileToAppDataDirectoryAsync(file); + } + + return files; + } + + protected virtual async Task CopyFileToAppDataDirectoryAsync(BundleFile file) + { + if (file.IsExternalFile) + { + return; + } + + var fileName = Path.Combine("wwwroot", file.FileName); + if(MauiBlazorContentFileProvider.GetFileInfo(fileName).Exists) + { + return; + } + + try + { + await using var inputStream = await FileSystem.Current.OpenAppPackageFileAsync(fileName); + var targetFile = Path.Combine(FileSystem.Current.AppDataDirectory, fileName); + var fileDirectory = Path.GetDirectoryName(targetFile)!; + if (!Path.Exists(fileDirectory)) + { + Directory.CreateDirectory(fileDirectory); + } + await using var outputStream = File.Create(targetFile); + await inputStream.CopyToAsync(outputStream); + } + catch (Exception e) + { + Logger.LogError($"Could not copy the file to the app data directory: {fileName}", e); + } + } + + protected override bool IsMinficationEnabled() + { + switch (Options.Mode) + { + case BundlingMode.None: + case BundlingMode.Bundle: + return false; + case BundlingMode.BundleAndMinify: + return true; + case BundlingMode.Auto: + return !IsDebug(); + default: + throw new AbpException($"Unhandled {nameof(BundlingMode)}: {Options.Mode}"); + } + } + + protected virtual bool IsDebug() + { + #if DEBUG + return true; + #else + retur false; + #endif + } + + protected override IFileProvider GetFileProvider() + { + return MauiBlazorContentFileProvider; + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.Components.MauiBlazor.Bundling/IMauiBlazorContentFileProvide.cs b/framework/src/Volo.Abp.AspNetCore.Components.MauiBlazor.Bundling/IMauiBlazorContentFileProvide.cs new file mode 100644 index 0000000000..4c7a50a339 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Components.MauiBlazor.Bundling/IMauiBlazorContentFileProvide.cs @@ -0,0 +1,8 @@ +using Microsoft.Extensions.FileProviders; + +namespace Volo.Abp.AspNetCore.Components.MauiBlazor.Bundling; + +public interface IMauiBlazorContentFileProvider : IFileProvider +{ + string ContentRootPath { get; } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.Components.MauiBlazor.Bundling/MauiBlazorBundlerBase.cs b/framework/src/Volo.Abp.AspNetCore.Components.MauiBlazor.Bundling/MauiBlazorBundlerBase.cs new file mode 100644 index 0000000000..b02c80435a --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Components.MauiBlazor.Bundling/MauiBlazorBundlerBase.cs @@ -0,0 +1,26 @@ +using Microsoft.Extensions.FileProviders; +using Microsoft.Extensions.Options; +using Volo.Abp.AspNetCore.Bundling; +using Volo.Abp.AspNetCore.Mvc.UI.Bundling; +using Volo.Abp.Minify; + +namespace Volo.Abp.AspNetCore.Components.MauiBlazor.Bundling; + +public abstract class MauiBlazorBundlerBase : BundlerBase +{ + protected IMauiBlazorContentFileProvider MauiBlazorContentFileProvider { get; } + + public MauiBlazorBundlerBase( + IMauiBlazorContentFileProvider mauiBlazorContentFileProvider, + IMinifier minifier, + IOptions bundlingOptions) : base(minifier, + bundlingOptions) + { + MauiBlazorContentFileProvider = mauiBlazorContentFileProvider; + } + + protected override IFileInfo FindFileInfo(string file) + { + return MauiBlazorContentFileProvider.GetFileInfo(file); + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.Components.MauiBlazor.Bundling/MauiBlazorContentFileProvider.cs b/framework/src/Volo.Abp.AspNetCore.Components.MauiBlazor.Bundling/MauiBlazorContentFileProvider.cs new file mode 100644 index 0000000000..a9ee633e6c --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Components.MauiBlazor.Bundling/MauiBlazorContentFileProvider.cs @@ -0,0 +1,65 @@ +using Microsoft.Extensions.FileProviders; +using Microsoft.Extensions.Primitives; +using Microsoft.Maui.Controls.PlatformConfiguration; +using Volo.Abp.DependencyInjection; +using Volo.Abp.VirtualFileSystem; + +namespace Volo.Abp.AspNetCore.Components.MauiBlazor.Bundling; + +public class MauiBlazorContentFileProvider : IMauiBlazorContentFileProvider, ISingletonDependency +{ + private readonly IVirtualFileProvider _virtualFileProvider; + private readonly IFileProvider _fileProvider; + private string _rootPath = "/wwwroot"; + + public MauiBlazorContentFileProvider(IVirtualFileProvider virtualFileProvider) + { + _virtualFileProvider = virtualFileProvider; + _fileProvider = CreateFileProvider(); + } + + public string ContentRootPath => FileSystem.Current.AppDataDirectory; + + public IFileInfo GetFileInfo(string subpath) + { + if (string.IsNullOrEmpty(subpath)) + { + return new NotFoundFileInfo(subpath); + } + + var fileInfo = _fileProvider.GetFileInfo(subpath); + return fileInfo.Exists ? fileInfo : _fileProvider.GetFileInfo( _rootPath + subpath.EnsureStartsWith('/')); + } + + public IDirectoryContents GetDirectoryContents(string subpath) + { + if (string.IsNullOrEmpty(subpath)) + { + return NotFoundDirectoryContents.Singleton; + } + + var directory = _fileProvider.GetDirectoryContents(subpath); + return directory.Exists ? directory : _fileProvider.GetDirectoryContents( _rootPath + subpath.EnsureStartsWith('/')); + } + + public IChangeToken Watch(string filter) + { + return new CompositeChangeToken( + [ + _fileProvider.Watch(_rootPath + filter), + _fileProvider.Watch(filter) + ] + ); + } + + protected virtual IFileProvider CreateFileProvider() + { + var assetsDirectory = Path.Combine(ContentRootPath, _rootPath.TrimStart('/')); + if (!Path.Exists(assetsDirectory)) + { + Directory.CreateDirectory(assetsDirectory); + } + + return new CompositeFileProvider(new PhysicalFileProvider(assetsDirectory), _virtualFileProvider); + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.Components.MauiBlazor.Bundling/Scripts/ScriptBundler.cs b/framework/src/Volo.Abp.AspNetCore.Components.MauiBlazor.Bundling/Scripts/ScriptBundler.cs new file mode 100644 index 0000000000..8e3d36b5da --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Components.MauiBlazor.Bundling/Scripts/ScriptBundler.cs @@ -0,0 +1,28 @@ +using Microsoft.Extensions.Options; +using Volo.Abp.AspNetCore.Bundling; +using Volo.Abp.AspNetCore.Bundling.Scripts; +using Volo.Abp.AspNetCore.Mvc.UI.Bundling; +using Volo.Abp.Minify.Scripts; + +namespace Volo.Abp.AspNetCore.Components.MauiBlazor.Bundling.Scripts; + +public class ScriptBundler : MauiBlazorBundlerBase, IScriptBundler +{ + public override string FileExtension => "js"; + + public ScriptBundler( + IMauiBlazorContentFileProvider mauiBlazorContentFileProvider, + IJavascriptMinifier minifier, + IOptions bundlingOptions) + : base( + mauiBlazorContentFileProvider, + minifier, + bundlingOptions) + { + } + + protected override string ProcessBeforeAddingToTheBundle(IBundlerContext context, string filePath, string fileContent) + { + return fileContent.EnsureEndsWith(';') + Environment.NewLine; + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.Components.MauiBlazor.Bundling/Styles/StyleBundler.cs b/framework/src/Volo.Abp.AspNetCore.Components.MauiBlazor.Bundling/Styles/StyleBundler.cs new file mode 100644 index 0000000000..f617c21761 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Components.MauiBlazor.Bundling/Styles/StyleBundler.cs @@ -0,0 +1,40 @@ +using Microsoft.Extensions.Options; +using Volo.Abp.AspNetCore.Bundling; +using Volo.Abp.AspNetCore.Bundling.Styles; +using Volo.Abp.AspNetCore.Mvc.UI.Bundling; +using Volo.Abp.Bundling.Styles; +using Volo.Abp.Minify.Styles; + +namespace Volo.Abp.AspNetCore.Components.MauiBlazor.Bundling.Styles; + +public class StyleBundler : MauiBlazorBundlerBase, IStyleBundler +{ + private readonly IMauiBlazorContentFileProvider _mauiBlazorContentFileProvider; + public override string FileExtension => "css"; + + public StyleBundler( + IMauiBlazorContentFileProvider mauiBlazorContentFileProvider, + ICssMinifier minifier, + IOptions bundlingOptions) + : base( + mauiBlazorContentFileProvider, + minifier, + bundlingOptions) + { + _mauiBlazorContentFileProvider = mauiBlazorContentFileProvider; + } + + public string GetAbsolutePath(string relativePath) + { + return Path.Combine(_mauiBlazorContentFileProvider.ContentRootPath, "wwwroot", relativePath.RemovePreFix("/")).Replace("file://", ""); + } + + protected override string ProcessBeforeAddingToTheBundle(IBundlerContext context, string filePath, string fileContent) + { + return CssRelativePath.Adjust( + fileContent, + GetAbsolutePath(filePath), + GetAbsolutePath(context.BundleRelativePath) + ); + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.Components.MauiBlazor.Bundling/Volo.Abp.AspNetCore.Components.MauiBlazor.Bundling.csproj b/framework/src/Volo.Abp.AspNetCore.Components.MauiBlazor.Bundling/Volo.Abp.AspNetCore.Components.MauiBlazor.Bundling.csproj new file mode 100644 index 0000000000..6591bd5359 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Components.MauiBlazor.Bundling/Volo.Abp.AspNetCore.Components.MauiBlazor.Bundling.csproj @@ -0,0 +1,41 @@ + + + + + + + + net9.0-android;net9.0-ios;net9.0-maccatalyst + $(TargetFrameworks);net9.0-windows10.0.19041.0 + + + true + true + enable + enable + + 15.0 + 15.0 + 21.0 + 10.0.17763.0 + 10.0.17763.0 + 6.5 + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.Components.Server.Theming/Bundling/BlazorServerComponentBundleManager.cs b/framework/src/Volo.Abp.AspNetCore.Components.Server.Theming/Bundling/BlazorServerComponentBundleManager.cs index 9ba0baff2d..98ca1b54a4 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.Server.Theming/Bundling/BlazorServerComponentBundleManager.cs +++ b/framework/src/Volo.Abp.AspNetCore.Components.Server.Theming/Bundling/BlazorServerComponentBundleManager.cs @@ -1,8 +1,8 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; +using Volo.Abp.AspNetCore.Bundling; using Volo.Abp.AspNetCore.Components.Web.Theming.Bundling; -using Volo.Abp.AspNetCore.Mvc.UI.Bundling; using Volo.Abp.DependencyInjection; namespace Volo.Abp.AspNetCore.Components.Server.Theming.Bundling; diff --git a/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Bundling/AbpScripts.razor b/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Bundling/AbpScripts.razor index 8c9d070764..921937a124 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Bundling/AbpScripts.razor +++ b/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Bundling/AbpScripts.razor @@ -1,4 +1,6 @@ +@implements IDisposable @inject IComponentBundleManager BundleManager +@inject PersistentComponentState ApplicationState @if (ScriptFiles != null) { foreach (var file in ScriptFiles) @@ -8,6 +10,9 @@ } @code { + + private const string PrerenderedKey = "abp_script_prerendered"; + [Parameter] public List? WebAssemblyScriptFiles { get; set; } @@ -16,18 +21,33 @@ private List? ScriptFiles { get; set; } + private PersistingComponentStateSubscription _persistingSubscription; + protected override async Task OnInitializedAsync() { - ScriptFiles = new List(); - - if (!BundleName.IsNullOrWhiteSpace()) + _persistingSubscription = ApplicationState.RegisterOnPersisting(Callback); + if (!ApplicationState.TryTakeFromJson(PrerenderedKey, out _)) { - ScriptFiles = (await BundleManager.GetScriptBundleFilesAsync(BundleName!)).ToList(); + // We are in prerendering mode + if (!BundleName.IsNullOrWhiteSpace()) + { + ScriptFiles = (await BundleManager.GetScriptBundleFilesAsync(BundleName!)).ToList(); + } } - - if (OperatingSystem.IsBrowser() && WebAssemblyScriptFiles != null) + else { - ScriptFiles.AddIfNotContains(WebAssemblyScriptFiles); + if (OperatingSystem.IsBrowser() && WebAssemblyScriptFiles != null) + { + ScriptFiles = WebAssemblyScriptFiles; + } } } + + private Task Callback() + { + ApplicationState.PersistAsJson(PrerenderedKey, PrerenderedKey); + return Task.CompletedTask; + } + + public void Dispose() => _persistingSubscription.Dispose(); } diff --git a/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Bundling/AbpStyles.razor b/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Bundling/AbpStyles.razor index bdcfd26bec..0b522c02e4 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Bundling/AbpStyles.razor +++ b/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Bundling/AbpStyles.razor @@ -1,4 +1,6 @@ +@implements IDisposable @inject IComponentBundleManager BundleManager +@inject PersistentComponentState ApplicationState @if (StyleFiles != null) { foreach (var file in StyleFiles) @@ -8,6 +10,9 @@ } @code { + + private const string PrerenderedKey = "abp_style_prerendered"; + [Parameter] public List? WebAssemblyStyleFiles { get; set; } @@ -16,18 +21,47 @@ private List? StyleFiles { get; set; } + private PersistingComponentStateSubscription _persistingSubscription; + protected override async Task OnInitializedAsync() { - StyleFiles = new List(); - - if (!BundleName.IsNullOrWhiteSpace()) + _persistingSubscription = ApplicationState.RegisterOnPersisting(Callback); + if (!ApplicationState.TryTakeFromJson>(PrerenderedKey, out var scriptFiles)) { - StyleFiles = (await BundleManager.GetStyleBundleFilesAsync(BundleName!)).ToList(); + // We are in prerendering mode + if (!BundleName.IsNullOrWhiteSpace()) + { + StyleFiles = (await BundleManager.GetStyleBundleFilesAsync(BundleName!)).ToList(); + } } + else + { + StyleFiles = scriptFiles; + if (OperatingSystem.IsBrowser() && StyleFiles != null && WebAssemblyStyleFiles != null) + { + StyleFiles.AddIfNotContains(WebAssemblyStyleFiles); + } + } + } - if (OperatingSystem.IsBrowser() && WebAssemblyStyleFiles != null) + private bool _hasRemoveServerStyle = false; + + protected override async Task OnAfterRenderAsync(bool firstRender) + { + if (!_hasRemoveServerStyle && OperatingSystem.IsBrowser() && WebAssemblyStyleFiles != null) { - StyleFiles.AddIfNotContains(WebAssemblyStyleFiles); + _hasRemoveServerStyle = true; + await Task.Delay(3000); + StyleFiles = WebAssemblyStyleFiles; + StateHasChanged(); } } + + private Task Callback() + { + ApplicationState.PersistAsJson(PrerenderedKey, StyleFiles); + return Task.CompletedTask; + } + + public void Dispose() => _persistingSubscription.Dispose(); } diff --git a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly.Theming/ComponentsComponentsBundleContributor.cs b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly.Theming/ComponentsComponentsBundleContributor.cs index 816dd51889..0ad3ddb1c5 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly.Theming/ComponentsComponentsBundleContributor.cs +++ b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly.Theming/ComponentsComponentsBundleContributor.cs @@ -17,17 +17,14 @@ public class ComponentsComponentsBundleContributor : IBundleContributor public void AddStyles(BundleContext context) { - if (!context.InteractiveAuto) + context.BundleDefinitions.Insert(0, new BundleDefinition { - context.BundleDefinitions.Insert(0, new BundleDefinition - { - Source = "_content/Volo.Abp.AspNetCore.Components.WebAssembly.Theming/libs/bootstrap/css/bootstrap.min.css" - }); - context.BundleDefinitions.Insert(1, new BundleDefinition - { - Source = "_content/Volo.Abp.AspNetCore.Components.WebAssembly.Theming/libs/fontawesome/css/all.css" - }); - } + Source = "_content/Volo.Abp.AspNetCore.Components.WebAssembly.Theming/libs/bootstrap/css/bootstrap.min.css" + }); + context.BundleDefinitions.Insert(1, new BundleDefinition + { + Source = "_content/Volo.Abp.AspNetCore.Components.WebAssembly.Theming/libs/fontawesome/css/all.css" + }); context.Add("_content/Volo.Abp.AspNetCore.Components.Web/libs/abp/css/abp.css"); context.Add("_content/Volo.Abp.AspNetCore.Components.WebAssembly.Theming/libs/flag-icon/css/flag-icon.css"); diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDatePickerBaseTagHelper.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDatePickerBaseTagHelper.cs index e69c4300e3..96c06fad2b 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDatePickerBaseTagHelper.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDatePickerBaseTagHelper.cs @@ -46,9 +46,9 @@ public abstract class public bool AddMarginBottomClass { get; set; } = true; - protected AbpDatePickerBaseTagHelper(AbpDatePickerBaseTagHelperService service, IOptions options) : base(service) + protected AbpDatePickerBaseTagHelper(AbpDatePickerBaseTagHelperService service, IOptionsFactory optionsFactory) : base(service) { - _abpDatePickerOptionsImplementation = options.Value; + _abpDatePickerOptionsImplementation = optionsFactory.Create(string.Empty); } public void SetDatePickerOptions(IAbpDatePickerOptions options) diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDatePickerTagHelper.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDatePickerTagHelper.cs index 047e6f2720..74f58b0f23 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDatePickerTagHelper.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDatePickerTagHelper.cs @@ -9,7 +9,10 @@ public class AbpDatePickerTagHelper : AbpDatePickerBaseTagHelper options) : base(service, options) + public AbpDatePickerTagHelper( + AbpDatePickerTagHelperService service, + IOptionsFactory optionsFactory) + : base(service, optionsFactory) { } } \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDateRangePickerTagHelper.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDateRangePickerTagHelper.cs index 7ccd3afc80..5717e283a9 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDateRangePickerTagHelper.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDateRangePickerTagHelper.cs @@ -11,8 +11,10 @@ public class AbpDateRangePickerTagHelper : AbpDatePickerBaseTagHelper options) : - base(tagHelperService, options) + public AbpDateRangePickerTagHelper( + AbpDateRangePickerTagHelperService service, + IOptionsFactory optionsFactory) + : base(service, optionsFactory) { } } \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/AbpBundleContributorOptions.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions/Volo/Abp/AspNetCore/Mvc/UI/Bundling/AbpBundleContributorOptions.cs similarity index 93% rename from framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/AbpBundleContributorOptions.cs rename to framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions/Volo/Abp/AspNetCore/Mvc/UI/Bundling/AbpBundleContributorOptions.cs index 79a6272e89..dfc706607e 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/AbpBundleContributorOptions.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions/Volo/Abp/AspNetCore/Mvc/UI/Bundling/AbpBundleContributorOptions.cs @@ -1,6 +1,6 @@ -using System; +using System; using System.Collections.Concurrent; -using JetBrains.Annotations; +using System.Diagnostics.CodeAnalysis; namespace Volo.Abp.AspNetCore.Mvc.UI.Bundling; @@ -27,4 +27,4 @@ public class AbpBundleContributorOptions _ => new BundleContributorCollection() ); } -} +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo.Abp.AspNetCore.Mvc.UI.Bundling.csproj b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo.Abp.AspNetCore.Mvc.UI.Bundling.csproj index fd3995f797..aadb26f388 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo.Abp.AspNetCore.Mvc.UI.Bundling.csproj +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo.Abp.AspNetCore.Mvc.UI.Bundling.csproj @@ -19,6 +19,7 @@ + diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/AbpAspNetCoreMvcUiBundlingModule.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/AbpAspNetCoreMvcUiBundlingModule.cs index 2292c93a53..13b157748b 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/AbpAspNetCoreMvcUiBundlingModule.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/AbpAspNetCoreMvcUiBundlingModule.cs @@ -7,6 +7,7 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.FileProviders; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; +using Volo.Abp.AspNetCore.Bundling; using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap; using Volo.Abp.AspNetCore.VirtualFileSystem; using Volo.Abp.Bundling.Styles; @@ -21,8 +22,7 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bundling; [DependsOn( typeof(AbpAspNetCoreMvcUiBootstrapModule), - typeof(AbpMinifyModule), - typeof(AbpAspNetCoreMvcUiBundlingAbstractionsModule) + typeof(AbpAspNetCoreBundlingModule) )] public class AbpAspNetCoreMvcUiBundlingModule : AbpModule { diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleManager.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleManager.cs index 9ac43585c0..c28c19a716 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleManager.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleManager.cs @@ -9,6 +9,10 @@ using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Options; +using Microsoft.Extensions.FileProviders; +using Volo.Abp.AspNetCore.Bundling; +using Volo.Abp.AspNetCore.Bundling.Scripts; +using Volo.Abp.AspNetCore.Bundling.Styles; using Volo.Abp.AspNetCore.Mvc.UI.Bundling.Scripts; using Volo.Abp.AspNetCore.Mvc.UI.Bundling.Styles; using Volo.Abp.AspNetCore.Mvc.UI.Resources; @@ -17,162 +21,47 @@ using Volo.Abp.VirtualFileSystem; namespace Volo.Abp.AspNetCore.Mvc.UI.Bundling; -public class BundleManager : IBundleManager, ITransientDependency +public class BundleManager : BundleManagerBase, ITransientDependency { - public ILogger Logger { get; set; } - - protected readonly AbpBundlingOptions Options; - protected readonly AbpBundleContributorOptions ContributorOptions; - protected readonly IWebHostEnvironment HostingEnvironment; - protected readonly IScriptBundler ScriptBundler; - protected readonly IStyleBundler StyleBundler; - protected readonly IServiceProvider ServiceProvider; - protected readonly IDynamicFileProvider DynamicFileProvider; - protected readonly IBundleCache BundleCache; - protected readonly IWebRequestResources RequestResources; - public BundleManager( IOptions options, IOptions contributorOptions, - IScriptBundler scriptBundler, + IScriptBundler scriptBundler, IStyleBundler styleBundler, - IWebHostEnvironment hostingEnvironment, IServiceProvider serviceProvider, IDynamicFileProvider dynamicFileProvider, IBundleCache bundleCache, - IWebRequestResources requestResources) + IWebHostEnvironment hostingEnvironment, + IWebRequestResources requestResources) : base( + options, + contributorOptions, + scriptBundler, + styleBundler, + serviceProvider, + dynamicFileProvider, + bundleCache) { - Options = options.Value; - ContributorOptions = contributorOptions.Value; HostingEnvironment = hostingEnvironment; - ScriptBundler = scriptBundler; - ServiceProvider = serviceProvider; - DynamicFileProvider = dynamicFileProvider; - BundleCache = bundleCache; RequestResources = requestResources; - StyleBundler = styleBundler; - - Logger = NullLogger.Instance; - } - - public virtual async Task> GetStyleBundleFilesAsync(string bundleName) - { - return await GetBundleFilesAsync(Options.StyleBundles, bundleName, StyleBundler); - } - - public virtual async Task> GetScriptBundleFilesAsync(string bundleName) - { - return await GetBundleFilesAsync(Options.ScriptBundles, bundleName, ScriptBundler); - } - - protected virtual async Task> GetBundleFilesAsync(BundleConfigurationCollection bundles, string bundleName, IBundler bundler) - { - var files = new List(); - - var contributors = GetContributors(bundles, bundleName); - var bundleFiles = RequestResources.TryAdd(await GetBundleFilesAsync(contributors)); - var dynamicResources = RequestResources.TryAdd(await GetDynamicResourcesAsync(contributors)); - - if (!IsBundlingEnabled()) - { - return bundleFiles.Union(dynamicResources).ToImmutableList(); - } - - var localBundleFiles = new List(); - foreach (var bundleFile in bundleFiles) - { - if (!bundleFile.IsExternalFile) - { - localBundleFiles.Add(bundleFile.FileName); - } - else - { - if (localBundleFiles.Count != 0) - { - files.AddRange(AddToBundleCache(bundleName, bundler, localBundleFiles).Files); - localBundleFiles.Clear(); - } - - files.Add(bundleFile); - } - } - - if (localBundleFiles.Count != 0) - { - files.AddRange(AddToBundleCache(bundleName, bundler, localBundleFiles).Files); - } - - return files.Union(dynamicResources).ToImmutableList(); } - private BundleCacheItem AddToBundleCache(string bundleName, IBundler bundler, List bundleFiles) - { - var bundleRelativePath = - Options.BundleFolderName.EnsureEndsWith('/') + - bundleName + "." + bundleFiles.JoinAsString("|").ToMd5() + "." + bundler.FileExtension; - - return BundleCache.GetOrAdd(bundleRelativePath, () => - { - var cacheValue = new BundleCacheItem( - new List - { - new BundleFile("/" + bundleRelativePath) - } - ); - - WatchChanges(cacheValue, bundleFiles, bundleRelativePath); + protected IWebHostEnvironment HostingEnvironment { get; } - var bundleResult = bundler.Bundle( - new BundlerContext( - bundleRelativePath, - bundleFiles, - IsMinficationEnabled() - ) - ); + protected IWebRequestResources RequestResources { get; } - SaveBundleResult(bundleRelativePath, bundleResult); - return cacheValue; - }); - } - private void WatchChanges(BundleCacheItem cacheValue, List files, string bundleRelativePath) + protected async override Task> GetBundleFilesAsync(List contributors) { - lock (cacheValue.WatchDisposeHandles) - { - foreach (var file in files) - { - var watchDisposeHandle = HostingEnvironment.WebRootFileProvider.Watch(file).RegisterChangeCallback(_ => - { - lock (cacheValue.WatchDisposeHandles) - { - cacheValue.WatchDisposeHandles.ForEach(h => h.Dispose()); - cacheValue.WatchDisposeHandles.Clear(); - } - - BundleCache.Remove(bundleRelativePath); - DynamicFileProvider.Delete("/wwwroot/" + bundleRelativePath); //TODO: get rid of wwwroot! - }, null); - - cacheValue.WatchDisposeHandles.Add(watchDisposeHandle); - } - } + return RequestResources.TryAdd(await base.GetBundleFilesAsync(contributors)); } - protected virtual void SaveBundleResult(string bundleRelativePath, BundleResult bundleResult) + protected async override Task> GetDynamicResourcesAsync(List contributors) { - var fileName = bundleRelativePath.Substring(bundleRelativePath.IndexOf('/') + 1); - - DynamicFileProvider.AddOrUpdate( - new InMemoryFileInfo( - "/wwwroot/" + bundleRelativePath, //TODO: get rid of wwwroot! - Encoding.UTF8.GetBytes(bundleResult.Content), - fileName - ) - ); + return RequestResources.TryAdd(await base.GetDynamicResourcesAsync(contributors)); } - public virtual bool IsBundlingEnabled() + public override bool IsBundlingEnabled() { switch (Options.Mode) { @@ -188,7 +77,7 @@ public class BundleManager : IBundleManager, ITransientDependency } } - protected virtual bool IsMinficationEnabled() + protected override bool IsMinficationEnabled() { switch (Options.Mode) { @@ -204,78 +93,8 @@ public class BundleManager : IBundleManager, ITransientDependency } } - protected async Task> GetBundleFilesAsync(List contributors) - { - var context = CreateBundleConfigurationContext(); - - foreach (var contributor in contributors) - { - await contributor.PreConfigureBundleAsync(context); - } - - foreach (var contributor in contributors) - { - await contributor.ConfigureBundleAsync(context); - } - - foreach (var contributor in contributors) - { - await contributor.PostConfigureBundleAsync(context); - } - - return context.Files; - } - - protected virtual async Task> GetDynamicResourcesAsync(List contributors) - { - var context = CreateBundleConfigurationContext(); - - foreach (var contributor in contributors) - { - await contributor.ConfigureDynamicResourcesAsync(context); - } - - return context.Files; - } - - protected virtual BundleConfigurationContext CreateBundleConfigurationContext() - { - return new BundleConfigurationContext(ServiceProvider, HostingEnvironment.WebRootFileProvider, Options.Parameters); - } - - protected virtual List GetContributors(BundleConfigurationCollection bundles, string bundleName) - { - var contributors = new List(); - - AddContributorsWithBaseBundles(contributors, bundles, bundleName); - - for (var i = 0; i < contributors.Count; ++i) - { - var extensions = ContributorOptions.Extensions(contributors[i].GetType()).GetAll(); - if (extensions.Count > 0) - { - contributors.InsertRange(i + 1, extensions); - i += extensions.Count; - } - } - - return contributors; - } - - protected virtual void AddContributorsWithBaseBundles(List contributors, BundleConfigurationCollection bundles, string bundleName) + protected override IFileProvider GetFileProvider() { - var bundleConfiguration = bundles.Get(bundleName); - - foreach (var baseBundleName in bundleConfiguration.BaseBundles) - { - AddContributorsWithBaseBundles(contributors, bundles, baseBundleName); //Recursive call - } - - var selfContributors = bundleConfiguration.Contributors.GetAll(); - - if (selfContributors.Any()) - { - contributors.AddRange(selfContributors); - } + return HostingEnvironment.WebRootFileProvider; } -} +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/MvcUiBundlerBase.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/MvcUiBundlerBase.cs new file mode 100644 index 0000000000..87ba769f75 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/MvcUiBundlerBase.cs @@ -0,0 +1,25 @@ +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.FileProviders; +using Microsoft.Extensions.Options; +using Volo.Abp.AspNetCore.Bundling; +using Volo.Abp.Minify; + +namespace Volo.Abp.AspNetCore.Mvc.UI.Bundling; + +public abstract class MvcUiBundlerBase : BundlerBase +{ + protected IWebHostEnvironment WebHostingEnvironment { get; } + + protected MvcUiBundlerBase( + IWebHostEnvironment webHostingEnvironment, + IMinifier minifier, + IOptions bundlingOptions) : base(minifier, bundlingOptions) + { + WebHostingEnvironment = webHostingEnvironment; + } + + protected override IFileInfo FindFileInfo(string file) + { + return WebHostingEnvironment.WebRootFileProvider.GetFileInfo(file); + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/Scripts/IScriptBundler.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/Scripts/IScriptBundler.cs deleted file mode 100644 index a0204fdb87..0000000000 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/Scripts/IScriptBundler.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace Volo.Abp.AspNetCore.Mvc.UI.Bundling.Scripts; - -public interface IScriptBundler : IBundler -{ - -} diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/Scripts/ScriptBundler.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/Scripts/ScriptBundler.cs index 7e3360e4c8..8f48ad31e8 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/Scripts/ScriptBundler.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/Scripts/ScriptBundler.cs @@ -1,20 +1,22 @@ using System; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Options; +using Volo.Abp.AspNetCore.Bundling; +using Volo.Abp.AspNetCore.Bundling.Scripts; using Volo.Abp.Minify.Scripts; namespace Volo.Abp.AspNetCore.Mvc.UI.Bundling.Scripts; -public class ScriptBundler : BundlerBase, IScriptBundler +public class ScriptBundler : MvcUiBundlerBase, IScriptBundler { public override string FileExtension => "js"; public ScriptBundler( - IWebHostEnvironment hostEnvironment, + IWebHostEnvironment hostingEnvironment, IJavascriptMinifier minifier, IOptions bundlingOptions) : base( - hostEnvironment, + hostingEnvironment, minifier, bundlingOptions) { diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/Styles/IStyleBundler.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/Styles/IStyleBundler.cs deleted file mode 100644 index 1550730d38..0000000000 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/Styles/IStyleBundler.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace Volo.Abp.AspNetCore.Mvc.UI.Bundling.Styles; - -public interface IStyleBundler : IBundler -{ - -} diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/Styles/StyleBundler.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/Styles/StyleBundler.cs index b20e9af7ee..9d6277fa8e 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/Styles/StyleBundler.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/Styles/StyleBundler.cs @@ -2,27 +2,28 @@ using System; using System.IO; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Options; -using Volo.Abp.AspNetCore.VirtualFileSystem; +using Volo.Abp.AspNetCore.Bundling; +using Volo.Abp.AspNetCore.Bundling.Styles; using Volo.Abp.Bundling.Styles; using Volo.Abp.Minify.Styles; namespace Volo.Abp.AspNetCore.Mvc.UI.Bundling.Styles; -public class StyleBundler : BundlerBase, IStyleBundler +public class StyleBundler : MvcUiBundlerBase, IStyleBundler { private readonly IWebHostEnvironment _hostingEnvironment; public override string FileExtension => "css"; public StyleBundler( - IWebHostEnvironment hostEnvironment, + IWebHostEnvironment hostingEnvironment, ICssMinifier minifier, IOptions bundlingOptions) : base( - hostEnvironment, + hostingEnvironment, minifier, bundlingOptions) { - _hostingEnvironment = hostEnvironment; + _hostingEnvironment = hostingEnvironment; } public string GetAbsolutePath(string relativePath) diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/AbpTagHelperResourceService.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/AbpTagHelperResourceService.cs index 7939cb7912..b83d090f11 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/AbpTagHelperResourceService.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/AbpTagHelperResourceService.cs @@ -10,6 +10,7 @@ using Microsoft.Extensions.FileProviders; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Options; +using Volo.Abp.AspNetCore.Bundling; using Volo.Abp.DependencyInjection; namespace Volo.Abp.AspNetCore.Mvc.UI.Bundling.TagHelpers; diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/AbpTagHelperScriptService.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/AbpTagHelperScriptService.cs index c8486ebadd..c4701aa7d5 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/AbpTagHelperScriptService.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/AbpTagHelperScriptService.cs @@ -9,6 +9,7 @@ using Microsoft.AspNetCore.Razor.TagHelpers; using Microsoft.Extensions.FileProviders; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Options; +using Volo.Abp.AspNetCore.Bundling; namespace Volo.Abp.AspNetCore.Mvc.UI.Bundling.TagHelpers; diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/AbpTagHelperStyleService.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/AbpTagHelperStyleService.cs index bcfd7d95e2..1ed3a76fe1 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/AbpTagHelperStyleService.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/AbpTagHelperStyleService.cs @@ -9,6 +9,7 @@ using Microsoft.AspNetCore.Razor.TagHelpers; using Microsoft.Extensions.FileProviders; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Options; +using Volo.Abp.AspNetCore.Bundling; using Volo.Abp.AspNetCore.Security; namespace Volo.Abp.AspNetCore.Mvc.UI.Bundling.TagHelpers; diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/datatables/datatables-extensions.js b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/datatables/datatables-extensions.js index e3e1f8fe6c..9bbf0abd28 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/datatables/datatables-extensions.js +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/datatables/datatables-extensions.js @@ -84,12 +84,9 @@ var abp = abp || {}; }; var _createButtonDropdown = function (record, field, tableInstance) { - if (field.items.length === 1) { + if (field.items.length === 1 && getVisibilityValue(field.items[0].visible, record, tableInstance)) { var firstItem = field.items[0]; - if (!getVisibilityValue(firstItem.visible, record, tableInstance)) { - return $(''); - } - + var $button = $(''); if (firstItem.displayNameHtml) { @@ -159,8 +156,9 @@ var abp = abp || {}; $dropdownButton.addClass(field.cssClass); } + var isEntityActionsDisabled = true; var $dropdownItemsContainer = $('
    ').addClass('dropdown-menu'); - + for (var i = 0; i < field.items.length; i++) { var fieldItem = field.items[i]; @@ -169,6 +167,7 @@ var abp = abp || {}; continue; } + isEntityActionsDisabled = false; var $dropdownItem = _createDropdownItem(record, fieldItem, tableInstance); if (fieldItem.enabled && !fieldItem.enabled({ record: record, table: tableInstance })) { @@ -180,11 +179,22 @@ var abp = abp || {}; if ($dropdownItemsContainer.find('li').length > 0) { $dropdownItemsContainer.appendTo($container); - } else { - $dropdownButton.addClass('d-none'); } - $dropdownButton.prependTo($container); + if (isEntityActionsDisabled) { + + $dropdownButton.attr('disabled', 'disabled'); + + var $tooltip = $('
    '); + $tooltip.attr('title', localize("EntityActionsDisabledTooltip")); + $tooltip.attr('data-bs-toggle', 'tooltip'); + new bootstrap.Tooltip($tooltip); + + $dropdownButton.appendTo($tooltip); + $tooltip.prependTo($container); + }else{ + $dropdownButton.prependTo($container); + } if (bootstrap) { new bootstrap.Dropdown($dropdownButton, { diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ExceptionHandling/AbpExceptionFilter.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ExceptionHandling/AbpExceptionFilter.cs index f09cde9815..1c616e7a8a 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ExceptionHandling/AbpExceptionFilter.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ExceptionHandling/AbpExceptionFilter.cs @@ -109,9 +109,12 @@ public class AbpExceptionFilter : IAsyncExceptionFilter, IAbpFilter, ITransientD remoteServiceErrorInfoBuilder.AppendLine($"---------- {nameof(RemoteServiceErrorInfo)} ----------"); remoteServiceErrorInfoBuilder.AppendLine(context.GetRequiredService().Serialize(remoteServiceErrorInfo, indented: true)); - var logger = context.GetService>(NullLogger.Instance)!; - var logLevel = context.Exception.GetLogLevel(); - logger.LogWithLevel(logLevel, remoteServiceErrorInfoBuilder.ToString()); - logger.LogException(context.Exception, logLevel); + if(exceptionHandlingOptions.ShouldLogException(context.Exception)) + { + var logger = context.GetService>(NullLogger.Instance)!; + var logLevel = context.Exception.GetLogLevel(); + logger.LogWithLevel(logLevel, remoteServiceErrorInfoBuilder.ToString()); + logger.LogException(context.Exception, logLevel); + } } } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ExceptionHandling/AbpExceptionPageFilter.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ExceptionHandling/AbpExceptionPageFilter.cs index 0e53b01cad..d8300eef04 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ExceptionHandling/AbpExceptionPageFilter.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ExceptionHandling/AbpExceptionPageFilter.cs @@ -90,10 +90,12 @@ public class AbpExceptionPageFilter : IAsyncPageFilter, IAbpFilter, ITransientDe remoteServiceErrorInfoBuilder.AppendLine($"---------- {nameof(RemoteServiceErrorInfo)} ----------"); remoteServiceErrorInfoBuilder.AppendLine(context.GetRequiredService().Serialize(remoteServiceErrorInfo, indented: true)); - var logger = context.GetService>(NullLogger.Instance)!; - logger.LogWithLevel(logLevel, remoteServiceErrorInfoBuilder.ToString()); - - logger.LogException(context.Exception!, logLevel); + if (context.Exception != null && exceptionHandlingOptions.ShouldLogException(context.Exception)) + { + var logger = context.GetService>(NullLogger.Instance)!; + logger.LogWithLevel(logLevel, remoteServiceErrorInfoBuilder.ToString()); + logger.LogException(context.Exception!, logLevel); + } await context.GetRequiredService().NotifyAsync(new ExceptionNotificationContext(context.Exception!)); @@ -113,6 +115,7 @@ public class AbpExceptionPageFilter : IAsyncPageFilter, IAbpFilter, ITransientDe } else { + var logger = context.GetService>(NullLogger.Instance)!; logger.LogWarning("HTTP response has already started, cannot set headers and status code!"); } diff --git a/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/Builder/AbpApplicationBuilderExtensions.cs b/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/Builder/AbpApplicationBuilderExtensions.cs index f0ca14657b..b4d5d4499c 100644 --- a/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/Builder/AbpApplicationBuilderExtensions.cs +++ b/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/Builder/AbpApplicationBuilderExtensions.cs @@ -1,5 +1,6 @@ using System; using System.IO; +using System.Linq; using System.Threading.Tasks; using JetBrains.Annotations; using Microsoft.AspNetCore.Hosting; @@ -9,8 +10,10 @@ using Microsoft.AspNetCore.StaticAssets; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.FileProviders; using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Volo.Abp; +using Volo.Abp.AspNetCore; using Volo.Abp.AspNetCore.Auditing; using Volo.Abp.AspNetCore.ExceptionHandling; using Volo.Abp.AspNetCore.Security; @@ -184,6 +187,27 @@ public static class AbpApplicationBuilderExtensions // https://github.com/dotnet/aspnetcore/issues/59673 app.UseStaticFiles(); + if (!staticAssetsManifestPath.IsNullOrWhiteSpace()) + { + app.ApplicationServices.GetRequiredService>().LogWarning( + $"The staticAssetsManifestPath({staticAssetsManifestPath}) parameter your provided in MapAbpStaticAssets method is ignored in development mode."); + } + + var blazorClientProjectPaths = new[] + { + Path.Combine(AppContext.BaseDirectory, $"{environment.ApplicationName}.Client.staticwebassets.endpoints.json"), + Path.Combine(AppContext.BaseDirectory, $"{environment.ApplicationName.RemovePostFix(".Host")}.Blazor.staticwebassets.endpoints.json"), + }; + + var blazorClientStaticAssetsManifest = blazorClientProjectPaths.FirstOrDefault(File.Exists); + if (blazorClientStaticAssetsManifest != null) + { + // We have a blazor client project and we need to map the static assets from the client project. + var blazorHostStaticAssetsManifest = Path.Combine(AppContext.BaseDirectory, $"{environment.ApplicationName}.staticwebassets.endpoints.json"); + File.Copy(blazorClientStaticAssetsManifest, blazorHostStaticAssetsManifest, true); + return endpoints.MapStaticAssets(blazorHostStaticAssetsManifest); + } + // Volo.Abp.AspNetCore.staticwebassets.endpoints.json is an empty file. Just compatible with the return type of MapAbpStaticAssets. var tempStaticAssetsManifestPath = Path.Combine(AppContext.BaseDirectory, "Volo.Abp.AspNetCore.staticwebassets.endpoints.json"); if (!File.Exists(tempStaticAssetsManifestPath)) diff --git a/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/ExceptionHandling/AbpExceptionHandlingMiddleware.cs b/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/ExceptionHandling/AbpExceptionHandlingMiddleware.cs index c99ac00fcc..c098ba2c15 100644 --- a/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/ExceptionHandling/AbpExceptionHandlingMiddleware.cs +++ b/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/ExceptionHandling/AbpExceptionHandlingMiddleware.cs @@ -58,7 +58,12 @@ public class AbpExceptionHandlingMiddleware : AbpMiddlewareBase, ITransientDepen private async Task HandleAndWrapException(HttpContext httpContext, Exception exception) { - _logger.LogException(exception); + var exceptionHandlingOptions = httpContext.RequestServices.GetRequiredService>().Value; + + if (exceptionHandlingOptions.ShouldLogException(exception)) + { + _logger.LogException(exception); + } await httpContext .RequestServices @@ -77,7 +82,6 @@ public class AbpExceptionHandlingMiddleware : AbpMiddlewareBase, ITransientDepen var errorInfoConverter = httpContext.RequestServices.GetRequiredService(); var statusCodeFinder = httpContext.RequestServices.GetRequiredService(); var jsonSerializer = httpContext.RequestServices.GetRequiredService(); - var exceptionHandlingOptions = httpContext.RequestServices.GetRequiredService>().Value; httpContext.Response.Clear(); httpContext.Response.StatusCode = (int)statusCodeFinder.GetStatusCode(httpContext, exception); diff --git a/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/HangfireBackgroundJobManager.cs b/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/HangfireBackgroundJobManager.cs index a94426adad..0a47399e49 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/HangfireBackgroundJobManager.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/HangfireBackgroundJobManager.cs @@ -5,17 +5,20 @@ using Hangfire; using Hangfire.States; using Microsoft.Extensions.Options; using Volo.Abp.DependencyInjection; +using Volo.Abp.Hangfire; namespace Volo.Abp.BackgroundJobs.Hangfire; [Dependency(ReplaceServices = true)] public class HangfireBackgroundJobManager : IBackgroundJobManager, ITransientDependency { - protected AbpBackgroundJobOptions Options { get; } + protected IOptions BackgroundJobOptions { get; } + protected IOptions HangfireOptions { get; } - public HangfireBackgroundJobManager(IOptions options) + public HangfireBackgroundJobManager(IOptions backgroundJobOptions, IOptions hangfireOptions) { - Options = options.Value; + BackgroundJobOptions = backgroundJobOptions; + HangfireOptions = hangfireOptions; } public virtual Task EnqueueAsync(TArgs args, BackgroundJobPriority priority = BackgroundJobPriority.Normal, @@ -33,13 +36,7 @@ public class HangfireBackgroundJobManager : IBackgroundJobManager, ITransientDep protected virtual string GetQueueName(Type argsType) { - var queueName = EnqueuedState.DefaultQueue; - var queueAttribute = Options.GetJob(argsType).JobType.GetCustomAttribute(); - if (queueAttribute != null) - { - queueName = queueAttribute.Queue; - } - - return queueName; + var queueAttribute = BackgroundJobOptions.Value.GetJob(argsType).JobType.GetCustomAttribute(); + return queueAttribute != null ? HangfireOptions.Value.DefaultQueuePrefix + queueAttribute.Queue : HangfireOptions.Value.DefaultQueue; } } diff --git a/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/AbpBackgroundJobWorkerOptions.cs b/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/AbpBackgroundJobWorkerOptions.cs index 3bc31e7a39..b339508028 100644 --- a/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/AbpBackgroundJobWorkerOptions.cs +++ b/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/AbpBackgroundJobWorkerOptions.cs @@ -2,6 +2,11 @@ public class AbpBackgroundJobWorkerOptions { + /// + /// Application name. + /// + public string? ApplicationName { get; set; } + /// /// Interval between polling jobs from . /// Default value: 5000 (5 seconds). diff --git a/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/BackgroundJobInfo.cs b/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/BackgroundJobInfo.cs index 0d5441a4bc..4a9cec922c 100644 --- a/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/BackgroundJobInfo.cs +++ b/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/BackgroundJobInfo.cs @@ -9,6 +9,11 @@ public class BackgroundJobInfo { public Guid Id { get; set; } + /// + /// Application name. + /// + public virtual string? ApplicationName { get; set; } + /// /// Name of the job. /// diff --git a/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/BackgroundJobWorker.cs b/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/BackgroundJobWorker.cs index 4313350098..a015e32d66 100644 --- a/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/BackgroundJobWorker.cs +++ b/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/BackgroundJobWorker.cs @@ -43,7 +43,7 @@ public class BackgroundJobWorker : AsyncPeriodicBackgroundWorkerBase, IBackgroun { var store = workerContext.ServiceProvider.GetRequiredService(); - var waitingJobs = await store.GetWaitingJobsAsync(WorkerOptions.MaxJobFetchCount); + var waitingJobs = await store.GetWaitingJobsAsync(WorkerOptions.ApplicationName, WorkerOptions.MaxJobFetchCount); if (!waitingJobs.Any()) { diff --git a/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/DefaultBackgroundJobManager.cs b/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/DefaultBackgroundJobManager.cs index 7218776cfe..68851c5043 100644 --- a/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/DefaultBackgroundJobManager.cs +++ b/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/DefaultBackgroundJobManager.cs @@ -1,5 +1,7 @@ using System; using System.Threading.Tasks; +using Microsoft.Extensions.Options; +using Volo.Abp.BackgroundWorkers; using Volo.Abp.DependencyInjection; using Volo.Abp.Guids; using Volo.Abp.Timing; @@ -16,16 +18,19 @@ public class DefaultBackgroundJobManager : IBackgroundJobManager, ITransientDepe protected IBackgroundJobSerializer Serializer { get; } protected IGuidGenerator GuidGenerator { get; } protected IBackgroundJobStore Store { get; } + protected IOptions BackgroundJobWorkerOptions { get; } public DefaultBackgroundJobManager( IClock clock, IBackgroundJobSerializer serializer, IBackgroundJobStore store, - IGuidGenerator guidGenerator) + IGuidGenerator guidGenerator, + IOptions backgroundJobWorkerOptions) { Clock = clock; Serializer = serializer; GuidGenerator = guidGenerator; + BackgroundJobWorkerOptions = backgroundJobWorkerOptions; Store = store; } @@ -41,6 +46,7 @@ public class DefaultBackgroundJobManager : IBackgroundJobManager, ITransientDepe var jobInfo = new BackgroundJobInfo { Id = GuidGenerator.Create(), + ApplicationName = BackgroundJobWorkerOptions.Value.ApplicationName, JobName = jobName, JobArgs = Serializer.Serialize(args), Priority = priority, diff --git a/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/IBackgroundJobStore.cs b/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/IBackgroundJobStore.cs index 4a3a8d1ac0..7fcf8cc5b6 100644 --- a/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/IBackgroundJobStore.cs +++ b/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/IBackgroundJobStore.cs @@ -24,12 +24,13 @@ public interface IBackgroundJobStore /// /// Gets waiting jobs. It should get jobs based on these: - /// Conditions: !IsAbandoned And NextTryTime <= Clock.Now. + /// Conditions: ApplicationName is applicationName And !IsAbandoned And NextTryTime <= Clock.Now. /// Order by: Priority DESC, TryCount ASC, NextTryTime ASC. /// Maximum result: . /// + /// Application name. /// Maximum result count. - Task> GetWaitingJobsAsync(int maxResultCount); + Task> GetWaitingJobsAsync(string? applicationName, int maxResultCount); /// /// Deletes a job. diff --git a/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/InMemoryBackgroundJobStore.cs b/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/InMemoryBackgroundJobStore.cs index 7abbc188ce..85916e8c37 100644 --- a/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/InMemoryBackgroundJobStore.cs +++ b/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/InMemoryBackgroundJobStore.cs @@ -35,9 +35,10 @@ public class InMemoryBackgroundJobStore : IBackgroundJobStore, ISingletonDepende return Task.CompletedTask; } - public virtual Task> GetWaitingJobsAsync(int maxResultCount) + public virtual Task> GetWaitingJobsAsync(string? applicationName, int maxResultCount) { var waitingJobs = _jobs.Values + .Where(t => t.ApplicationName == applicationName) .Where(t => !t.IsAbandoned && t.NextTryTime <= Clock.Now) .OrderByDescending(t => t.Priority) .ThenBy(t => t.TryCount) diff --git a/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireBackgroundWorkerBase.cs b/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireBackgroundWorkerBase.cs index 0c1a5f3d26..0c9ba67603 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireBackgroundWorkerBase.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireBackgroundWorkerBase.cs @@ -13,7 +13,7 @@ public abstract class HangfireBackgroundWorkerBase : BackgroundWorkerBase, IHang public TimeZoneInfo? TimeZone { get; set; } = TimeZoneInfo.Utc; - public string Queue { get; set; } = EnqueuedState.DefaultQueue; + public string Queue { get; set; } = default!; public abstract Task DoWorkAsync(CancellationToken cancellationToken = default); } diff --git a/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireBackgroundWorkerManager.cs b/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireBackgroundWorkerManager.cs index 9c79056ec2..1ed3561cac 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireBackgroundWorkerManager.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireBackgroundWorkerManager.cs @@ -4,6 +4,7 @@ using System.Threading; using System.Threading.Tasks; using Hangfire; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Options; using Volo.Abp.DependencyInjection; using Volo.Abp.DynamicProxy; using Volo.Abp.Hangfire; @@ -30,15 +31,19 @@ public class HangfireBackgroundWorkerManager : BackgroundWorkerManager, ISinglet public async override Task AddAsync(IBackgroundWorker worker, CancellationToken cancellationToken = default) { + var abpHangfireOptions = ServiceProvider.GetRequiredService>().Value; + var defaultQueuePrefix = abpHangfireOptions.DefaultQueuePrefix; + var defaultQueue = abpHangfireOptions.DefaultQueue; + switch (worker) { case IHangfireBackgroundWorker hangfireBackgroundWorker: { var unProxyWorker = ProxyHelper.UnProxy(hangfireBackgroundWorker); - + RecurringJob.AddOrUpdate( hangfireBackgroundWorker.RecurringJobId, - hangfireBackgroundWorker.Queue, + hangfireBackgroundWorker.Queue.IsNullOrWhiteSpace() ? defaultQueue : defaultQueuePrefix + hangfireBackgroundWorker.Queue, () => ((IHangfireBackgroundWorker)unProxyWorker).DoWorkAsync(cancellationToken), hangfireBackgroundWorker.CronExpression, new RecurringJobOptions @@ -57,24 +62,24 @@ public class HangfireBackgroundWorkerManager : BackgroundWorkerManager, ISinglet { return; } - + var adapterType = typeof(HangfirePeriodicBackgroundWorkerAdapter<>).MakeGenericType(ProxyHelper.GetUnProxiedType(worker)); var workerAdapter = (Activator.CreateInstance(adapterType) as IHangfireBackgroundWorker)!; if (workerAdapter.RecurringJobId.IsNullOrWhiteSpace()) { - RecurringJob.AddOrUpdate( + RecurringJob.AddOrUpdate( () => workerAdapter.DoWorkAsync(cancellationToken), GetCron(period.Value), workerAdapter.TimeZone , - workerAdapter.Queue); + workerAdapter.Queue.IsNullOrWhiteSpace() ? defaultQueue : defaultQueuePrefix + workerAdapter.Queue); } else { - + RecurringJob.AddOrUpdate( workerAdapter.RecurringJobId, - workerAdapter.Queue, + workerAdapter.Queue.IsNullOrWhiteSpace() ? defaultQueue : defaultQueuePrefix + workerAdapter.Queue, () => workerAdapter.DoWorkAsync(cancellationToken), GetCron(period.Value), new RecurringJobOptions @@ -82,7 +87,7 @@ public class HangfireBackgroundWorkerManager : BackgroundWorkerManager, ISinglet TimeZone = workerAdapter.TimeZone }); } - + break; } @@ -121,4 +126,4 @@ public class HangfireBackgroundWorkerManager : BackgroundWorkerManager, ISinglet return cron; } -} \ No newline at end of file +} diff --git a/framework/src/Volo.Abp.BlazoriseUI/Components/EntityActions.razor b/framework/src/Volo.Abp.BlazoriseUI/Components/EntityActions.razor index 5e686afbda..cd1f908dcc 100644 --- a/framework/src/Volo.Abp.BlazoriseUI/Components/EntityActions.razor +++ b/framework/src/Volo.Abp.BlazoriseUI/Components/EntityActions.razor @@ -1,27 +1,29 @@ @typeparam TItem - @if ( Type == ActionType.Dropdown ) + @if ( Type == ActionType.Dropdown || (Type == ActionType.Button && DisabledOrNoActions())) { - @if ( HasPrimaryAction ) - { - - - } - else - { - - @ToggleText - - } - - @ChildContent - + + @if ( HasPrimaryAction ) + { + + + } + else + { + + @ToggleText + + } + + @ChildContent + + } else diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/CreateMigrationAndRunMigratorCommand.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/CreateMigrationAndRunMigratorCommand.cs index fcdbe094aa..b8b6a02d72 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/CreateMigrationAndRunMigratorCommand.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/CreateMigrationAndRunMigratorCommand.cs @@ -5,12 +5,14 @@ using System.Threading.Tasks; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; using Volo.Abp.Cli.Args; +using Volo.Abp.Cli.Commands.Internal; using Volo.Abp.Cli.Commands.Services; using Volo.Abp.Cli.Utils; using Volo.Abp.DependencyInjection; namespace Volo.Abp.Cli.Commands; +[HideFromCommandList] public class CreateMigrationAndRunMigratorCommand : IConsoleCommand, ITransientDependency { private readonly InitialMigrationCreator _initialMigrationCreator; diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/HelpCommand.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/HelpCommand.cs index 5b6c80d3be..9fb647806b 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/HelpCommand.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/HelpCommand.cs @@ -1,4 +1,6 @@ -using System.Linq; +using System; +using System.Collections.Generic; +using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; @@ -7,6 +9,7 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Options; using Volo.Abp.Cli.Args; +using Volo.Abp.Cli.Commands.Internal; using Volo.Abp.DependencyInjection; namespace Volo.Abp.Cli.Commands; @@ -65,7 +68,7 @@ public class HelpCommand : IConsoleCommand, ITransientDependency sb.AppendLine("Command List:"); sb.AppendLine(""); - foreach (var command in AbpCliOptions.Commands.ToArray()) + foreach (var command in AbpCliOptions.Commands.ToArray().Where(NotHiddenFromCommandList)) { var method = command.Value.GetMethod("GetShortDescription", BindingFlags.Static | BindingFlags.Public); if (method == null) @@ -92,6 +95,11 @@ public class HelpCommand : IConsoleCommand, ITransientDependency return sb.ToString(); } + private bool NotHiddenFromCommandList(KeyValuePair command) + { + return command.Value.GetCustomAttribute(typeof(HideFromCommandList)) == null; + } + public static string GetShortDescription() { return "Show command line help. Write ` abp help `"; diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/Internal/HideFromCommandList.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/Internal/HideFromCommandList.cs new file mode 100644 index 0000000000..9660223a96 --- /dev/null +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/Internal/HideFromCommandList.cs @@ -0,0 +1,6 @@ +using System; + +namespace Volo.Abp.Cli.Commands.Internal; + +public class HideFromCommandList : Attribute +{} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/Internal/RecreateInitialMigrationCommand.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/Internal/RecreateInitialMigrationCommand.cs index 47c1ac78f4..857edf6bd7 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/Internal/RecreateInitialMigrationCommand.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/Internal/RecreateInitialMigrationCommand.cs @@ -9,6 +9,7 @@ using Volo.Abp.DependencyInjection; namespace Volo.Abp.Cli.Commands.Internal; +[HideFromCommandList] public class RecreateInitialMigrationCommand : IConsoleCommand, ITransientDependency { public const string Name = "recreate-initial-migration"; diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/SuiteCommand.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/SuiteCommand.cs index d8a3b6d154..48f5eca5f8 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/SuiteCommand.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/SuiteCommand.cs @@ -107,6 +107,9 @@ public class SuiteCommand : IConsoleCommand, ITransientDependency Logger.LogInformation("Removing ABP Suite..."); RemoveSuite(); break; + + default: + throw new CliUsageException("Invalid Suite command! Run \"abp help suite\" command to see available Suite commands."); } } diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/AbpIoSourceCodeStore.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/AbpIoSourceCodeStore.cs index 5ef3657529..411be841ed 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/AbpIoSourceCodeStore.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/AbpIoSourceCodeStore.cs @@ -137,10 +137,18 @@ public class AbpIoSourceCodeStore : ISourceCodeStore, ITransientDependency ? $"The specified template version ({templateVersion}) is different than the CLI version ({currentCliVersion}). This may cause compatibility issues." : $"The latest template version ({templateVersion}) is different than the CLI version ({currentCliVersion}). This may cause compatibility issues."); Logger.LogWarning("Please upgrade/downgrade the CLI version to the template version."); - Logger.LogWarning($"> dotnet tool uninstall -g volo.abp.cli"); - Logger.LogWarning(!templateVersion.IsPrerelease - ? $"> dotnet tool install -g volo.abp.cli --version \"{templateVersion.Major}.{templateVersion.Minor}.*\"" - : $"> dotnet tool install -g volo.abp.cli --version {templateVersion}"); + + if (currentCliVersion.ToString().EndsWith("-studio")) + { + Logger.LogWarning($"> abp install-old-cli --version {templateVersion}"); + } + else + { + Logger.LogWarning($"> dotnet tool uninstall -g volo.abp.cli"); + Logger.LogWarning(!templateVersion.IsPrerelease + ? $"> dotnet tool install -g volo.abp.cli --version \"{templateVersion.Major}.{templateVersion.Minor}.*\"" + : $"> dotnet tool install -g volo.abp.cli --version {templateVersion}"); + } if (userSpecifiedVersion) { diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Version/CliVersionService.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Version/CliVersionService.cs index eb5c13a561..0bb8536162 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Version/CliVersionService.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Version/CliVersionService.cs @@ -34,6 +34,11 @@ public class CliVersionService : ITransientDependency break; } + if (line.StartsWith("volo.abp.studio.cli", StringComparison.InvariantCultureIgnoreCase)) + { + var assemblyVersion = string.Join(".", Assembly.GetExecutingAssembly().GetFileVersion().Split('.').Take(3)); + return SemanticVersion.Parse(assemblyVersion + "-studio"); + } } if (currentCliVersion == null) diff --git a/framework/src/Volo.Abp.Core/Microsoft/Extensions/Logging/AbpLoggerExtensions.cs b/framework/src/Volo.Abp.Core/Microsoft/Extensions/Logging/AbpLoggerExtensions.cs index 18a93f7348..e1899f7efc 100644 --- a/framework/src/Volo.Abp.Core/Microsoft/Extensions/Logging/AbpLoggerExtensions.cs +++ b/framework/src/Volo.Abp.Core/Microsoft/Extensions/Logging/AbpLoggerExtensions.cs @@ -70,12 +70,12 @@ public static class AbpLoggerExtensions private static void LogKnownProperties(ILogger logger, Exception exception, LogLevel logLevel) { - if (exception is IHasErrorCode exceptionWithErrorCode) + if (exception is IHasErrorCode exceptionWithErrorCode && !exceptionWithErrorCode.Code.IsNullOrWhiteSpace()) { logger.LogWithLevel(logLevel, "Code:" + exceptionWithErrorCode.Code); } - if (exception is IHasErrorDetails exceptionWithErrorDetails) + if (exception is IHasErrorDetails exceptionWithErrorDetails && !exceptionWithErrorDetails.Details.IsNullOrWhiteSpace()) { logger.LogWithLevel(logLevel, "Details:" + exceptionWithErrorDetails.Details); } 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 0d8d74f7b2..a42b921068 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 @@ -7,4 +7,11 @@ public class AbpEntityChangeOptions /// Publish the EntityUpdatedEvent when any navigation property changes. /// public bool PublishEntityUpdatedEventWhenNavigationChanges { get; set; } = true; + + public IEntitySelectorList IgnoredNavigationEntitySelectors { get; set; } + + public AbpEntityChangeOptions() + { + IgnoredNavigationEntitySelectors = new EntitySelectorList(); + } } diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/EntitySelectorList.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/EntitySelectorList.cs new file mode 100644 index 0000000000..f0c89979f9 --- /dev/null +++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/EntitySelectorList.cs @@ -0,0 +1,8 @@ +using System.Collections.Generic; + +namespace Volo.Abp.Domain.Entities.Events; + +internal class EntitySelectorList : List, IEntitySelectorList +{ + +} diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/EntitySelectorListExtensions.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/EntitySelectorListExtensions.cs new file mode 100644 index 0000000000..a05aaa616a --- /dev/null +++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/EntitySelectorListExtensions.cs @@ -0,0 +1,12 @@ +using System; + +namespace Volo.Abp.Domain.Entities.Events; + +public static class EntitySelectorListExtensions +{ + public static IEntitySelectorList Add(this IEntitySelectorList selectors, string name, Func predicate) + { + selectors.Add(new NamedTypeSelector(name, predicate)); + return selectors; + } +} diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/IEntitySelectorList.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/IEntitySelectorList.cs new file mode 100644 index 0000000000..b3ed916dee --- /dev/null +++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/IEntitySelectorList.cs @@ -0,0 +1,8 @@ +using System.Collections.Generic; + +namespace Volo.Abp.Domain.Entities.Events; + +public interface IEntitySelectorList : IList +{ + +} diff --git a/framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo.Abp.EntityFrameworkCore.MySQL.csproj b/framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo.Abp.EntityFrameworkCore.MySQL.csproj index bc8ec71f9a..3b039a3ef0 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo.Abp.EntityFrameworkCore.MySQL.csproj +++ b/framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo.Abp.EntityFrameworkCore.MySQL.csproj @@ -22,7 +22,6 @@ - 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 e9bf710d7d..626daf0bb4 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpDbContext.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpDbContext.cs @@ -202,46 +202,11 @@ public abstract class AbpDbContext : DbContext, IAbpEfCoreDbContext, } } - public override async Task SaveChangesAsync(bool acceptAllChangesOnSuccess, CancellationToken cancellationToken = default) + public async override Task SaveChangesAsync(bool acceptAllChangesOnSuccess, CancellationToken cancellationToken = default) { try { - foreach (var entityEntry in AbpEfCoreNavigationHelper.GetChangedEntityEntries()) - { - if (EntityChangeOptions.Value.PublishEntityUpdatedEventWhenNavigationChanges) - { - if (entityEntry.State == EntityState.Unchanged) - { - ApplyAbpConceptsForModifiedEntity(entityEntry, true); - } - - if (entityEntry.Entity is ISoftDelete && entityEntry.Entity.As().IsDeleted) - { - EntityChangeEventHelper.PublishEntityDeletedEvent(entityEntry.Entity); - } - else - { - EntityChangeEventHelper.PublishEntityUpdatedEvent(entityEntry.Entity); - } - } - else if (entityEntry.Properties.Any(x => x.IsModified && (x.Metadata.ValueGenerated == ValueGenerated.Never || x.Metadata.ValueGenerated == ValueGenerated.OnAdd))) - { - if (entityEntry.Properties.Where(x => x.IsModified).All(x => x.Metadata.IsForeignKey())) - { - // Skip `PublishEntityDeletedEvent/PublishEntityUpdatedEvent` if only foreign keys have changed. - break; - } - - if (entityEntry.Entity is ISoftDelete && entityEntry.Entity.As().IsDeleted) - { - EntityChangeEventHelper.PublishEntityDeletedEvent(entityEntry.Entity); - } - else - { - EntityChangeEventHelper.PublishEntityUpdatedEvent(entityEntry.Entity); - } - } - } + await PublishEventsForChangedEntityOnSaveChangeAsync(); var auditLog = AuditingManager?.Current?.Log; List? entityChangeList = null; @@ -296,6 +261,55 @@ public abstract class AbpDbContext : DbContext, IAbpEfCoreDbContext, } } + protected virtual Task PublishEventsForChangedEntityOnSaveChangeAsync() + { + foreach (var entityEntry in AbpEfCoreNavigationHelper.GetChangedEntityEntries()) + { + if (EntityChangeOptions.Value.PublishEntityUpdatedEventWhenNavigationChanges) + { + var ignoredEntity = EntityChangeOptions.Value.IgnoredNavigationEntitySelectors.Any(selector => selector.Predicate(entityEntry.Entity.GetType())); + var onlyForeignKeyModifiedEntity = entityEntry.State == EntityState.Modified && entityEntry.Properties.Where(x => x.IsModified).All(x => x.Metadata.IsForeignKey()); + if ((entityEntry.State == EntityState.Unchanged && ignoredEntity) || onlyForeignKeyModifiedEntity && ignoredEntity) + { + continue; + } + + if (entityEntry.State == EntityState.Unchanged) + { + ApplyAbpConceptsForModifiedEntity(entityEntry, true); + } + + if (entityEntry.Entity is ISoftDelete && entityEntry.Entity.As().IsDeleted) + { + EntityChangeEventHelper.PublishEntityDeletedEvent(entityEntry.Entity); + } + else + { + EntityChangeEventHelper.PublishEntityUpdatedEvent(entityEntry.Entity); + } + } + else if (entityEntry.Properties.Any(x => x.IsModified && (x.Metadata.ValueGenerated == ValueGenerated.Never || x.Metadata.ValueGenerated == ValueGenerated.OnAdd))) + { + if (entityEntry.Properties.Where(x => x.IsModified).All(x => x.Metadata.IsForeignKey())) + { + // Skip `PublishEntityDeletedEvent/PublishEntityUpdatedEvent` if only foreign keys have changed. + break; + } + + if (entityEntry.Entity is ISoftDelete && entityEntry.Entity.As().IsDeleted) + { + EntityChangeEventHelper.PublishEntityDeletedEvent(entityEntry.Entity); + } + else + { + EntityChangeEventHelper.PublishEntityUpdatedEvent(entityEntry.Entity); + } + } + } + + return Task.CompletedTask; + } + protected virtual void PublishEntityEvents(EntityEventReport changeReport) { foreach (var localEvent in changeReport.DomainEvents) @@ -428,7 +442,9 @@ public abstract class AbpDbContext : DbContext, IAbpEfCoreDbContext, EntityChangeEventHelper.PublishEntityUpdatedEvent(entry.Entity); } } - else if (EntityChangeOptions.Value.PublishEntityUpdatedEventWhenNavigationChanges && AbpEfCoreNavigationHelper.IsNavigationEntryModified(entry)) + else if (EntityChangeOptions.Value.PublishEntityUpdatedEventWhenNavigationChanges && + EntityChangeOptions.Value.IgnoredNavigationEntitySelectors.All(selector => !selector.Predicate(entry.Entity.GetType())) && + AbpEfCoreNavigationHelper.IsNavigationEntryModified(entry)) { ApplyAbpConceptsForModifiedEntity(entry, true); if (entry.Entity is ISoftDelete && entry.Entity.As().IsDeleted) @@ -464,7 +480,9 @@ public abstract class AbpDbContext : DbContext, IAbpEfCoreDbContext, if (EntityChangeOptions.Value.PublishEntityUpdatedEventWhenNavigationChanges) { - foreach (var entry in AbpEfCoreNavigationHelper.GetChangedEntityEntries().Where(x => x.State == EntityState.Unchanged)) + foreach (var entry in AbpEfCoreNavigationHelper.GetChangedEntityEntries() + .Where(x => x.State == EntityState.Unchanged) + .Where(x=> EntityChangeOptions.Value.IgnoredNavigationEntitySelectors.All(selector => !selector.Predicate(x.Entity.GetType())))) { UpdateConcurrencyStamp(entry); } diff --git a/framework/src/Volo.Abp.ExceptionHandling/Volo/Abp/AspNetCore/ExceptionHandling/AbpExceptionHandlingOptions.cs b/framework/src/Volo.Abp.ExceptionHandling/Volo/Abp/AspNetCore/ExceptionHandling/AbpExceptionHandlingOptions.cs index e3bde2e813..cc751fc621 100644 --- a/framework/src/Volo.Abp.ExceptionHandling/Volo/Abp/AspNetCore/ExceptionHandling/AbpExceptionHandlingOptions.cs +++ b/framework/src/Volo.Abp.ExceptionHandling/Volo/Abp/AspNetCore/ExceptionHandling/AbpExceptionHandlingOptions.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Linq; namespace Volo.Abp.AspNetCore.ExceptionHandling; @@ -11,6 +12,12 @@ public class AbpExceptionHandlingOptions public List SendExceptionDataToClientTypes { get; set; } + /// + /// Selectors to exclude exception from logging. + /// If a selector returns true, the exception is not logged in to the logging. + /// + public List> ExcludeExceptionFromLoggerSelectors { get; } + public AbpExceptionHandlingOptions() { SendExceptionsDetailsToClients = false; @@ -19,5 +26,11 @@ public class AbpExceptionHandlingOptions [ typeof(IBusinessException) ]; + ExcludeExceptionFromLoggerSelectors = new List>(); + } + + public bool ShouldLogException(Exception exception) + { + return ExcludeExceptionFromLoggerSelectors.All(selector => !selector(exception)); } } diff --git a/framework/src/Volo.Abp.HangFire/Volo/Abp/Hangfire/AbpHangfireModule.cs b/framework/src/Volo.Abp.HangFire/Volo/Abp/Hangfire/AbpHangfireModule.cs index 6c34b86904..2b75155e7b 100644 --- a/framework/src/Volo.Abp.HangFire/Volo/Abp/Hangfire/AbpHangfireModule.cs +++ b/framework/src/Volo.Abp.HangFire/Volo/Abp/Hangfire/AbpHangfireModule.cs @@ -1,5 +1,6 @@ using Hangfire; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.Options; using Volo.Abp.Authorization; using Volo.Abp.Modularity; @@ -24,7 +25,10 @@ public class AbpHangfireModule : AbpModule var options = serviceProvider.GetRequiredService>().Value; return new AbpHangfireBackgroundJobServer(options.BackgroundJobServerFactory.Invoke(serviceProvider)); }); + + context.Services.TryAddEnumerable(ServiceDescriptor.Singleton, AbpHangfireOptionsConfiguration>()); } + public override void OnApplicationInitialization(ApplicationInitializationContext context) { _backgroundJobServer = context.ServiceProvider.GetRequiredService(); diff --git a/framework/src/Volo.Abp.HangFire/Volo/Abp/Hangfire/AbpHangfireOptions.cs b/framework/src/Volo.Abp.HangFire/Volo/Abp/Hangfire/AbpHangfireOptions.cs index 98c45348c7..8ed90d17c7 100644 --- a/framework/src/Volo.Abp.HangFire/Volo/Abp/Hangfire/AbpHangfireOptions.cs +++ b/framework/src/Volo.Abp.HangFire/Volo/Abp/Hangfire/AbpHangfireOptions.cs @@ -12,6 +12,18 @@ namespace Volo.Abp.Hangfire; public class AbpHangfireOptions { + /// + /// This value is used to add prefix to all of the queues. Default is empty. + /// + public string DefaultQueuePrefix { get; set; } = string.Empty; + + /// + /// Hangfire queue name max length, default is 50. + /// + public int MaxQueueNameLength { get; set; } = 50; + + public string DefaultQueue { get; set; } = EnqueuedState.DefaultQueue; + public BackgroundJobServerOptions? ServerOptions { get; set; } public IEnumerable? AdditionalProcesses { get; set; } diff --git a/framework/src/Volo.Abp.HangFire/Volo/Abp/Hangfire/AbpHangfireOptionsConfiguration.cs b/framework/src/Volo.Abp.HangFire/Volo/Abp/Hangfire/AbpHangfireOptionsConfiguration.cs new file mode 100644 index 0000000000..1fb5dcd8dc --- /dev/null +++ b/framework/src/Volo.Abp.HangFire/Volo/Abp/Hangfire/AbpHangfireOptionsConfiguration.cs @@ -0,0 +1,65 @@ +using System; +using System.Linq; +using System.Text.RegularExpressions; +using Hangfire; +using Hangfire.States; +using Microsoft.Extensions.Options; + +namespace Volo.Abp.Hangfire; + +public class AbpHangfireOptionsConfiguration : IPostConfigureOptions +{ + public void PostConfigure(string? name, AbpHangfireOptions options) + { + if (options.DefaultQueuePrefix.IsNullOrWhiteSpace()) + { + return;; + } + + // The Queue name argument must consist of lowercase letters, digits, underscore, and dash characters only. + var queuesPrefix = Regex.Replace(options.DefaultQueuePrefix.ToLower().Replace(".", "_"), "[^a-z0-9_-]", ""); + if (queuesPrefix.IsNullOrWhiteSpace()) + { + throw new AbpException($"The QueuesPrefix({options.DefaultQueuePrefix}) is not valid, it must consist of lowercase letters, digits, underscore, and dash characters only."); + } + + options.DefaultQueuePrefix = queuesPrefix.EnsureEndsWith('_'); + + if (options.ServerOptions == null) + { + var queue = $"{options.DefaultQueuePrefix}{EnqueuedState.DefaultQueue}"; + if (queue.Length > options.MaxQueueNameLength) + { + throw new AbpException($"The maximum length of the Hangfire queue name({queue}) is {options.MaxQueueNameLength}, Please configure the AbpHangfireOptions.DefaultQueuePrefix manually."); + } + options.ServerOptions = new BackgroundJobServerOptions + { + Queues = new[] { queue } + }; + options.DefaultQueue = queue; + } + else + { + var queues = options.ServerOptions.Queues; + for (var i = 0; i < queues.Length; i++) + { + var queue = $"{options.DefaultQueuePrefix}{queues[i]}"; + if (queue.Length > options.MaxQueueNameLength) + { + throw new AbpException($"The maximum length of the Hangfire queue name({queue}) is {options.MaxQueueNameLength}, Please configure the AbpHangfireOptions.DefaultQueuePrefix manually."); + } + queues[i] = queue; + } + var defaultQueue = queues.FirstOrDefault(q => q.EndsWith(EnqueuedState.DefaultQueue)); + if (defaultQueue.IsNullOrWhiteSpace()) + { + defaultQueue = queues.FirstOrDefault(); + if (defaultQueue.IsNullOrWhiteSpace()) + { + throw new AbpException("There is no queue defined in the Hangfire configuration!"); + } + } + options.DefaultQueue = defaultQueue; + } + } +} diff --git a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/ar.json b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/ar.json index c1097000c1..93cf62ab84 100644 --- a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/ar.json +++ b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/ar.json @@ -60,6 +60,7 @@ "AddNew": "اضف جديد", "ProfilePicture": "Ų§Ł„ŲµŁˆŲ±Ł‡ Ų§Ł„Ų“Ų®ŲµŁŠŁ‡", "Theme": "سمة", - "NotAssigned": "ŲŗŁŠŲ±Ł…Ų¹ŲŖŁ…ŲÆ" + "NotAssigned": "ŲŗŁŠŲ±Ł…Ų¹ŲŖŁ…ŲÆ", + "EntityActionsDisabledTooltip": "Ł„ŁŠŲ³ Ł„ŲÆŁŠŁƒ ؄ذن Ł„ŲŖŁ†ŁŁŠŲ° أي Ų„Ų¬Ų±Ų§Ų”." } } diff --git a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/cs.json b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/cs.json index 710a57a2a9..ff2d09fdf8 100644 --- a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/cs.json +++ b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/cs.json @@ -60,6 +60,7 @@ "AddNew": "Přidat nový", "ProfilePicture": "Profilový obrĆ”zek", "Theme": "TĆ©ma", - "NotAssigned": "Nepřiřazena" + "NotAssigned": "Nepřiřazena", + "EntityActionsDisabledTooltip": "NemĆ”te oprĆ”vněnĆ­ provĆ©st žÔdnou akci." } } diff --git a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/de.json b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/de.json index a955a9066d..37c361c1e3 100644 --- a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/de.json +++ b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/de.json @@ -60,6 +60,7 @@ "AddNew": "Neue hinzufügen", "ProfilePicture": "Profilbild", "Theme": "Thema", - "NotAssigned": "Nicht zugeordnet" + "NotAssigned": "Nicht zugeordnet", + "EntityActionsDisabledTooltip": "Sie haben keine Berechtigung, Aktionen auszuführen." } } diff --git a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/el.json b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/el.json index 2abb92eab7..f7d837a361 100644 --- a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/el.json +++ b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/el.json @@ -54,6 +54,7 @@ "ManageYourAccount": "Ī”Ī¹Ī±Ļ‡ĪµĪÆĻĪ¹ĻƒĪ· Ī›ĪæĪ³Ī±ĻĪ¹Ī±ĻƒĪ¼ĪæĻ", "OthersGroup": "άλλος", "Today": "Σήμερα", - "Apply": "Ī™ĻƒĻ‡ĻĪæĻ…Ī½" + "Apply": "Ī™ĻƒĻ‡ĻĪæĻ…Ī½", + "EntityActionsDisabledTooltip": "Δεν έχετε Γικαίωμα να ĪµĪŗĻ„ĪµĪ»Ī­ĻƒĪµĻ„Īµ καμία ενέργεια." } } diff --git a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/en-GB.json b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/en-GB.json index 7bbcc9d82f..c5aaa5957c 100644 --- a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/en-GB.json +++ b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/en-GB.json @@ -55,6 +55,7 @@ "OthersGroup": "Other", "NotAssigned": "Not Assigned", "Today": "Today", - "Apply": "Apply" + "Apply": "Apply", + "EntityActionsDisabledTooltip": "You do not have permission to perform any action." } } diff --git a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/en.json b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/en.json index 8ea53bba77..7a5a806124 100644 --- a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/en.json +++ b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/en.json @@ -60,6 +60,7 @@ "AddNew": "Add new", "ProfilePicture": "Profile picture", "Theme": "Theme", - "NotAssigned": "Not Assigned" + "NotAssigned": "Not Assigned", + "EntityActionsDisabledTooltip": "You do not have permission to perform any action." } } diff --git a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/es.json b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/es.json index 7870ccff7b..132243a740 100644 --- a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/es.json +++ b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/es.json @@ -60,6 +60,7 @@ "AddNew": "Agregar nuevo", "ProfilePicture": "Foto de perfil", "Theme": "Tema", - "NotAssigned": "No asignado" + "NotAssigned": "No asignado", + "EntityActionsDisabledTooltip": "No tienes permisos para realizar ninguna acción." } } diff --git a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/fa.json b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/fa.json index c5cb5960bd..f1738957c9 100644 --- a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/fa.json +++ b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/fa.json @@ -54,6 +54,7 @@ "ManageYourAccount": "Ų­Ų³Ų§ŲØ خود Ų±Ų§ Ł…ŲÆŪŒŲ±ŪŒŲŖ Ś©Ł†ŪŒŲÆ", "OthersGroup": "دیگر", "Today": "Ų§Ł…Ų±ŁˆŲ²", - "Apply": "درخواست دادن" + "Apply": "درخواست دادن", + "EntityActionsDisabledTooltip": "Ų“Ł…Ų§ دسترسی به انجام هر ŚÆŁˆŁ†Ł‡ Ų¹Ł…Ł„ŪŒŲ§ŲŖ Ł†ŲÆŲ§Ų±ŪŒŲÆ." } } diff --git a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/fi.json b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/fi.json index d2b5018e73..1af59eb720 100644 --- a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/fi.json +++ b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/fi.json @@ -60,6 +60,7 @@ "AddNew": "LisƤƤ uusi", "ProfilePicture": "Profiilikuva", "Theme": "Teema", - "NotAssigned": "Ei mƤƤritetty" + "NotAssigned": "Ei mƤƤritetty", + "EntityActionsDisabledTooltip": "Sinulla ei ole oikeutta suorittaa mitƤƤn toimintoa." } } diff --git a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/fr.json b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/fr.json index 66e37491fb..8af5661d1a 100644 --- a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/fr.json +++ b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/fr.json @@ -60,6 +60,7 @@ "AddNew": "Ajouter un nouveau", "ProfilePicture": "Image de profil", "Theme": "ThĆØme", - "NotAssigned": "Non attribuĆ©" + "NotAssigned": "Non attribuĆ©", + "EntityActionsDisabledTooltip": "Vous n'avez pas les permissions pour effectuer une action." } } diff --git a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/hi.json b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/hi.json index 7da0065d95..ba873b7685 100644 --- a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/hi.json +++ b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/hi.json @@ -60,6 +60,7 @@ "AddNew": "नया ą¤œą„‹ą¤”ą¤¼ą„‹", "ProfilePicture": "ą¤Ŗą„ą¤°ą„‹ą¤«ą¤¼ą¤¾ą¤‡ą¤² ą¤«ą„‹ą¤Ÿą„‹", "Theme": "विषय", - "NotAssigned": "ą¤øą„Œą¤‚ą¤Ŗą¤¾ ą¤Øą¤¹ą„€ą¤‚ गया ą¤¹ą„ˆ" + "NotAssigned": "ą¤øą„Œą¤‚ą¤Ŗą¤¾ ą¤Øą¤¹ą„€ą¤‚ गया ą¤¹ą„ˆ", + "EntityActionsDisabledTooltip": "ą¤†ą¤Ŗą¤•ą„‡ पास ą¤•ą„‹ą¤ˆ ą¤•ą¤¾ą¤°ą„ą¤°ą¤µą¤¾ą¤ˆ ą¤Øą¤¹ą„€ą¤‚ ą¤¹ą„ˆ ą¤œą„‹ ą¤•ą¤°ą¤Øą„‡ ą¤•ą„‡ ą¤²ą¤æą¤ ą¤¹ą„ˆą„¤" } } diff --git a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/hr.json b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/hr.json index b1073d62e7..5b16c84963 100644 --- a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/hr.json +++ b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/hr.json @@ -60,6 +60,7 @@ "AddNew": "Dodaj novi", "ProfilePicture": "Profilna slika", "Theme": "Tema", - "NotAssigned": "Nije dodijeljeno" + "NotAssigned": "Nije dodijeljeno", + "EntityActionsDisabledTooltip": "Nemate dozvolu za izvođenje bilo kakve akcije." } } diff --git a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/hu.json b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/hu.json index 3df6177a9f..0539276498 100644 --- a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/hu.json +++ b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/hu.json @@ -60,6 +60,7 @@ "AddNew": "Új hozzĆ”adĆ”sa", "ProfilePicture": "Profil kĆ©p", "Theme": "TĆ©ma", - "NotAssigned": "Nem kijelƶlt" + "NotAssigned": "Nem kijelƶlt", + "EntityActionsDisabledTooltip": "Nincs jogosultsĆ”ga bĆ”rmely művelethez." } } diff --git a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/is.json b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/is.json index d2eba16bd8..8a1eda9e4e 100644 --- a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/is.json +++ b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/is.json @@ -60,6 +60,7 @@ "AddNew": "BƦta viư nýju", "ProfilePicture": "Forsƭưumynd", "Theme": "ƞema", - "NotAssigned": "Ekki skrƔưur" + "NotAssigned": "Ekki skrƔưur", + "EntityActionsDisabledTooltip": "ĆžĆŗ hefur ekki aưgang aư þessum aưgerưum." } } diff --git a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/it.json b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/it.json index ef255274df..77d4742680 100644 --- a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/it.json +++ b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/it.json @@ -60,6 +60,7 @@ "AddNew": "Aggiungere nuova", "ProfilePicture": "Immagine del profilo", "Theme": "Tema", - "NotAssigned": "Non assegnato" + "NotAssigned": "Non assegnato", + "EntityActionsDisabledTooltip": "Non hai i permessi per eseguire alcuna azione." } } diff --git a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/nl.json b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/nl.json index 85b8b4f88b..38182ec9e6 100644 --- a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/nl.json +++ b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/nl.json @@ -60,6 +60,7 @@ "AddNew": "Nieuw toevoegen", "ProfilePicture": "Profielfoto", "Theme": "Thema", - "NotAssigned": "Niet toegekend" + "NotAssigned": "Niet toegekend", + "EntityActionsDisabledTooltip": "U hebt geen toegang tot deze acties." } } diff --git a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/pl-PL.json b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/pl-PL.json index 6739b673d7..d7f321f3d6 100644 --- a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/pl-PL.json +++ b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/pl-PL.json @@ -60,6 +60,7 @@ "AddNew": "Dodaj nowe", "ProfilePicture": "Zdjęcie profilowe", "Theme": "Temat", - "NotAssigned": "Nie przypisano" + "NotAssigned": "Nie przypisano", + "EntityActionsDisabledTooltip": "Nie masz uprawnień do wykonania żadnej akcji." } } diff --git a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/pt-BR.json b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/pt-BR.json index 5c4a6790f7..13c8380fa3 100644 --- a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/pt-BR.json +++ b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/pt-BR.json @@ -60,6 +60,7 @@ "AddNew": "Adicionar novo", "ProfilePicture": "Foto do perfil", "Theme": "Tema", - "NotAssigned": "NĆ£o atribuĆ­do" + "NotAssigned": "NĆ£o atribuĆ­do", + "EntityActionsDisabledTooltip": "VocĆŖ nĆ£o tem permissĆ£o para executar qualquer ação." } } diff --git a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/ro-RO.json b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/ro-RO.json index c5850bef00..e03fd91f50 100644 --- a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/ro-RO.json +++ b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/ro-RO.json @@ -60,6 +60,7 @@ "AddNew": "Adăuga nou", "ProfilePicture": "Poză de profil", "Theme": "Temă", - "NotAssigned": "Nealocat" + "NotAssigned": "Nealocat", + "EntityActionsDisabledTooltip": "Nu aveți permisiune să efectuați nicio acțiune." } } diff --git a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/ru.json b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/ru.json index f329315488..57f3079cb4 100644 --- a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/ru.json +++ b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/ru.json @@ -60,6 +60,7 @@ "AddNew": "Š”Š¾Š±Š°Š²ŠøŃ‚ŃŒ новое", "ProfilePicture": "Š˜Š·Š¾Š±Ń€Š°Š¶ŠµŠ½ŠøŠµ ŠæŃ€Š¾Ń„ŠøŠ»Ń", "Theme": "Тема", - "NotAssigned": "ŠŠµ назначен" + "NotAssigned": "ŠŠµ назначен", + "EntityActionsDisabledTooltip": "Š£ вас нет прав на выполнение каких-либо Гействий." } } diff --git a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/sk.json b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/sk.json index 6cc73f0cc6..eb0ba2958f 100644 --- a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/sk.json +++ b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/sk.json @@ -60,6 +60,7 @@ "AddNew": "PridaÅ„ novĆ©", "ProfilePicture": "Profilový obrĆ”zok", "Theme": "TĆ©ma", - "NotAssigned": "NepridelenĆ©" + "NotAssigned": "NepridelenĆ©", + "EntityActionsDisabledTooltip": "NemĆ”te oprĆ”vnenie vykonĆ”vaÅ„ žiadnu akciu." } } diff --git a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/sl.json b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/sl.json index 36d1bb14a6..bc3f795b34 100644 --- a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/sl.json +++ b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/sl.json @@ -60,6 +60,7 @@ "AddNew": "Dodaj novo", "ProfilePicture": "Profilna slika", "Theme": "Tema", - "NotAssigned": "Ni dodeljena" + "NotAssigned": "Ni dodeljena", + "EntityActionsDisabledTooltip": "Nimate pravic za izvajanje kakrÅ”ne koli dejanje." } } diff --git a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/sv.json b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/sv.json index 40aaa0073f..f0257637c1 100644 --- a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/sv.json +++ b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/sv.json @@ -59,6 +59,7 @@ "AddNew": "LƤgg till ny", "ProfilePicture": "Profilbild", "Theme": "Tema", - "NotAssigned": "Ej tilldelad" + "NotAssigned": "Ej tilldelad", + "EntityActionsDisabledTooltip": "Du har inte tillgĆ„ng till dessa Ć„tgƤrder." } } \ No newline at end of file diff --git a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/tr.json b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/tr.json index 2636d1087a..b21adf632a 100644 --- a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/tr.json +++ b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/tr.json @@ -60,6 +60,7 @@ "AddNew": "Yeni ekle", "ProfilePicture": "Profil resmi", "Theme": "Tema", - "NotAssigned": "Atanmadı" + "NotAssigned": "Atanmadı", + "EntityActionsDisabledTooltip": "Bu işlemi gerƧekleştirmek iƧin yeterli yetkiniz yok." } } diff --git a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/vi.json b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/vi.json index fca1f0954c..700798895f 100644 --- a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/vi.json +++ b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/vi.json @@ -60,6 +60,7 @@ "AddNew": "ThĆŖm mį»›i", "ProfilePicture": "įŗ¢nh đẔi diện", "Theme": "chį»§ đề", - "NotAssigned": "KhĆ“ng được chỉ định" + "NotAssigned": "KhĆ“ng được chỉ định", + "EntityActionsDisabledTooltip": "Bįŗ”n khĆ“ng có quyền thį»±c hiện bįŗ„t kỳ hĆ nh động nĆ o." } } diff --git a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/zh-Hans.json b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/zh-Hans.json index 2824c1bbbc..60f70e1545 100644 --- a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/zh-Hans.json +++ b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/zh-Hans.json @@ -60,6 +60,7 @@ "AddNew": "귻ꖰ", "ProfilePicture": "个人资料图片", "Theme": "主题", - "NotAssigned": "ęœŖåˆ†é…" + "NotAssigned": "ęœŖåˆ†é…", + "EntityActionsDisabledTooltip": "ę‚Øę²”ęœ‰ęƒé™ę‰§č”Œä»»ä½•ę“ä½œć€‚" } } diff --git a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/zh-Hant.json b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/zh-Hant.json index 17dac54739..0f8fdeb254 100644 --- a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/zh-Hant.json +++ b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/zh-Hant.json @@ -60,6 +60,7 @@ "AddNew": "귻ꖰ", "ProfilePicture": "å€‹äŗŗč³‡ę–™åœ–ē‰‡", "Theme": "主锌", - "NotAssigned": "ęœŖåˆ†é…" + "NotAssigned": "ęœŖåˆ†é…", + "EntityActionsDisabledTooltip": "ę‚Øę²’ęœ‰ę¬Šé™åŸ·č”Œä»»ä½•ę“ä½œć€‚" } } 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 f1b072c0ee..d82fb195ab 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 @@ -18,8 +18,31 @@ public class DomainEvents_Tests : DomainEvents_Tests +public class AbpEntityChangeOptions_DomainEvents_PublishEntityUpdatedEventWhenNavigationChanges_Tests : AbpEntityChangeOptions_DomainEvents_Tests { + protected override void AfterAddApplication(IServiceCollection services) + { + services.Configure(options => + { + options.PublishEntityUpdatedEventWhenNavigationChanges = false; + }); + + base.AfterAddApplication(services); + } +} + +public class AbpEntityChangeOptions_DomainEvents_IgnoreEntityChangeSelectorList_Tests : AbpEntityChangeOptions_DomainEvents_Tests +{ + protected override void AfterAddApplication(IServiceCollection services) + { + services.Configure(options => + { + options.PublishEntityUpdatedEventWhenNavigationChanges = true; + options.IgnoredNavigationEntitySelectors.Add("DisableAllEntity", _ => true); + }); + + base.AfterAddApplication(services); + } } public class AbpEfCoreDomainEvents_Tests : EntityFrameworkCoreTestBase diff --git a/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Testing/DomainEvents_Tests.cs b/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Testing/DomainEvents_Tests.cs index 8ac64d40c9..032d714390 100644 --- a/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Testing/DomainEvents_Tests.cs +++ b/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Testing/DomainEvents_Tests.cs @@ -259,16 +259,6 @@ public abstract class AbpEntityChangeOptions_DomainEvents_Tests LocalEventBus = GetRequiredService(); } - protected override void AfterAddApplication(IServiceCollection services) - { - services.Configure(options => - { - options.PublishEntityUpdatedEventWhenNavigationChanges = false; - }); - - base.AfterAddApplication(services); - } - [Fact] public async Task Should_Not_Trigger_Domain_Events_For_Aggregate_Root_When_Navigation_Changes_Tests() { diff --git a/latest-versions.json b/latest-versions.json index 2e5e6b0d81..0ced5df485 100644 --- a/latest-versions.json +++ b/latest-versions.json @@ -1,4 +1,22 @@ [ + { + "version": "9.1.0", + "releaseDate": "", + "type": "stable", + "message": "", + "leptonx": { + "version": "4.1.0" + } + }, + { + "version": "9.0.6", + "releaseDate": "", + "type": "stable", + "message": "", + "leptonx": { + "version": "4.0.8" + } + }, { "version": "9.0.5", "releaseDate": "", diff --git a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/ar.json b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/ar.json index 86d0ad8325..d3db345a9b 100644 --- a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/ar.json +++ b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/ar.json @@ -68,6 +68,8 @@ "AccessDenied": "ŲŖŁ… الرفض!", "AccessDeniedMessage": "Ł„ŁŠŲ³ Ł„ŲÆŁŠŁƒ Ų­Ł‚ Ų§Ł„ŁˆŲµŁˆŁ„ ؄لى هذا Ų§Ł„Ł…ŁˆŲ±ŲÆ.", "OrRegisterWith": "أو Ų§Ł„ŲŖŲ³Ų¬ŁŠŁ„ ŲØŁ€:", - "RegisterUsingYourProviderAccount": "قم ŲØŲ§Ł„ŲŖŲ³Ų¬ŁŠŁ„ ŲØŲ§Ų³ŲŖŲ®ŲÆŲ§Ł… حسابك في {0}" + "RegisterUsingYourProviderAccount": "قم ŲØŲ§Ł„ŲŖŲ³Ų¬ŁŠŁ„ ŲØŲ§Ų³ŲŖŲ®ŲÆŲ§Ł… حسابك في {0}", + "RequireMigrateSeedTitle": "ŲŖŲ¹Ų°Ų± Ų§Ł„Ų¹Ų«ŁˆŲ± على المستخدم Ų§Ł„Ł…Ų³Ų¤ŁˆŁ„", + "RequireMigrateSeedMessage": "ŁŠŲ±Ų¬Ł‰ Ų§Ł„ŲŖŲ£ŁƒŲÆ من ŲŖŁ†ŁŁŠŲ° seed قاعدة Ų§Ł„ŲØŁŠŲ§Ł†Ų§ŲŖ. Ų±Ų§Ų¬Ų¹ Ų§Ł„ŁˆŲ«Ų§Ų¦Ł‚ Ł„Ł„Ų­Ł„ŁˆŁ„ Ų§Ł„Ł…Ł…ŁƒŁ†Ų©." } } \ No newline at end of file diff --git a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/cs.json b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/cs.json index aebaadc543..6967ed0d61 100644 --- a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/cs.json +++ b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/cs.json @@ -68,6 +68,8 @@ "AccessDenied": "Přístup odepřen!", "AccessDeniedMessage": "K tomuto zdroji nemĆ”te přístup.", "OrRegisterWith": "Nebo se registrujte pomocĆ­:", - "RegisterUsingYourProviderAccount": "Registrovat pomocĆ­ vaÅ”eho ĆŗÄtu {0}" + "RegisterUsingYourProviderAccount": "Registrovat pomocĆ­ vaÅ”eho ĆŗÄtu {0}", + "RequireMigrateSeedTitle": "Nelze najĆ­t uživatele sprĆ”vce", + "RequireMigrateSeedMessage": "Ujistěte se, že je spuÅ”těn seed databĆ”ze. PodĆ­vejte se na dokumentaci pro možnĆ” řeÅ”enĆ­." } } \ No newline at end of file diff --git a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/da.json b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/da.json index 24283d06c8..98cc684389 100644 --- a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/da.json +++ b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/da.json @@ -65,6 +65,8 @@ "AccessDenied": "Adgang nƦgtet!", "AccessDeniedMessage": "Du har ikke adgang til denne ressource.", "OrRegisterWith": "Eller registrĆ©r med:", - "RegisterUsingYourProviderAccount": "RegistrĆ©r med din {0} konto" + "RegisterUsingYourProviderAccount": "RegistrĆ©r med din {0} konto", + "RequireMigrateSeedTitle": "Kunne ikke finde administratorbrugeren", + "RequireMigrateSeedMessage": "SĆørg for, at databasens seed bliver udfĆørt. Se dokumentationen for mulige lĆøsninger." } } diff --git a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/de.json b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/de.json index a6ff6d68c1..982a213753 100644 --- a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/de.json +++ b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/de.json @@ -68,6 +68,8 @@ "AccessDenied": "Zugriff abgelehnt!", "AccessDeniedMessage": "Sie haben keinen Zugriff auf diese Ressource.", "OrRegisterWith": "Oder registrieren Sie sich mit:", - "RegisterUsingYourProviderAccount": "Registrieren Sie sich mit Ihrem {0} Benutzerkonto" + "RegisterUsingYourProviderAccount": "Registrieren Sie sich mit Ihrem {0} Benutzerkonto", + "RequireMigrateSeedTitle": "Der Administrator-Benutzer konnte nicht gefunden werden", + "RequireMigrateSeedMessage": "Bitte stellen Sie sicher, dass die Datenbank-Seed ausgeführt wird. Siehe Dokumentation für mƶgliche Lƶsungen." } } \ No newline at end of file diff --git a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/el.json b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/el.json index a64dca5ef5..594adbd31f 100644 --- a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/el.json +++ b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/el.json @@ -66,6 +66,8 @@ "AccessDenied": "Δεν επιτρέπεται Ī· Ļ€ĻĻŒĻƒĪ²Ī±ĻƒĪ·!", "AccessDeniedMessage": "Δεν έχετε Ļ€ĻĻŒĻƒĪ²Ī±ĻƒĪ· σε Ī±Ļ…Ļ„ĻŒĪ½ τον Ļ€ĻŒĻĪæ.", "OrRegisterWith": "Ή εγγραφείτε με:", - "RegisterUsingYourProviderAccount": "Εγγραφείτε Ļ‡ĻĪ·ĻƒĪ¹Ī¼ĪæĻ€ĪæĪ¹ĻŽĪ½Ļ„Ī±Ļ‚ τον λογαριασμό ĻƒĪ±Ļ‚ {0}" + "RegisterUsingYourProviderAccount": "Εγγραφείτε Ļ‡ĻĪ·ĻƒĪ¹Ī¼ĪæĻ€ĪæĪ¹ĻŽĪ½Ļ„Ī±Ļ‚ τον λογαριασμό ĻƒĪ±Ļ‚ {0}", + "RequireMigrateSeedTitle": "Δεν βρέθηκε Īæ Ļ‡ĻĪ®ĻƒĻ„Ī·Ļ‚ Ī“Ī¹Ī±Ļ‡ĪµĪ¹ĻĪ¹ĻƒĻ„Ī®", + "RequireMigrateSeedMessage": "Βεβαιωθείτε ĻŒĻ„Ī¹ εκτελείται το seed της Ī²Ī¬ĻƒĪ·Ļ‚ ΓεΓομένων. Δείτε την Ļ„ĪµĪŗĪ¼Ī·ĻĪÆĻ‰ĻƒĪ· για πιθανές Ī»ĻĻƒĪµĪ¹Ļ‚." } } \ No newline at end of file diff --git a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/en-GB.json b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/en-GB.json index f4208335b5..09a93dca6f 100644 --- a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/en-GB.json +++ b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/en-GB.json @@ -63,6 +63,8 @@ "PasswordResetInfoInEmail": "We received an account recovery request! If you initiated this request, click the following link to reset your password.", "ResetMyPassword": "Reset my password", "OrRegisterWith": "Or register with", - "RegisterUsingYourProviderAccount": "Register using your {0} account" + "RegisterUsingYourProviderAccount": "Register using your {0} account", + "RequireMigrateSeedTitle": "Could not find the admin user", + "RequireMigrateSeedMessage": "Please ensure that the database seed is executed. See documentation for possible solutions." } } \ No newline at end of file diff --git a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/en.json b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/en.json index 39ca254f67..a230495c87 100644 --- a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/en.json +++ b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/en.json @@ -68,6 +68,8 @@ "AccessDenied": "Access denied!", "AccessDeniedMessage": "You do not have access to this resource.", "OrRegisterWith": "Or register with", - "RegisterUsingYourProviderAccount": "Register using your {0} account" + "RegisterUsingYourProviderAccount": "Register using your {0} account", + "RequireMigrateSeedTitle": "Could not find the admin user", + "RequireMigrateSeedMessage": "Please ensure that the database seed is executed. See documentation for possible solutions." } } diff --git a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/es-mx.json b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/es-mx.json index 6793e58986..f25046575a 100644 --- a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/es-mx.json +++ b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/es-mx.json @@ -36,6 +36,8 @@ "Manage": "Administrar", "MyAccount": "Mi cuenta", "OrRegisterWith": "O registrarse con", - "RegisterUsingYourProviderAccount": "Registrarse con su cuenta de {0} " + "RegisterUsingYourProviderAccount": "Registrarse con su cuenta de {0} ", + "RequireMigrateSeedTitle": "No se pudo encontrar el usuario administrador", + "RequireMigrateSeedMessage": "AsegĆŗrese de que se ejecute la semilla de la base de datos. Consulte la documentación para posibles soluciones." } } diff --git a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/es.json b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/es.json index 4f7fbf94d8..814c41d218 100644 --- a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/es.json +++ b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/es.json @@ -68,6 +68,8 @@ "AccessDenied": "Ā”Acceso denegado!", "AccessDeniedMessage": "No tienes acceso a este recurso.", "OrRegisterWith": "O registrarse con:", - "RegisterUsingYourProviderAccount": "Registrarse con su cuenta de {0} " + "RegisterUsingYourProviderAccount": "Registrarse con su cuenta de {0} ", + "RequireMigrateSeedTitle": "No se pudo encontrar el usuario administrador", + "RequireMigrateSeedMessage": "AsegĆŗrese de que se ejecute la semilla de la base de datos. Consulte la documentación para posibles soluciones." } } \ No newline at end of file diff --git a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/fa.json b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/fa.json index 4fc0685b79..e431b84548 100644 --- a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/fa.json +++ b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/fa.json @@ -66,6 +66,8 @@ "AccessDenied": "دسترسی Ł…Ł…Ł†ŁˆŲ¹!", "AccessDeniedMessage": "Ų“Ł…Ų§ به Ų§ŪŒŁ† منبع دسترسی Ł†ŲÆŲ§Ų±ŪŒŲÆ.", "OrRegisterWith": "یا Ų«ŲØŲŖ نام Ś©Ł†ŪŒŲÆ ŲØŲ§:", - "RegisterUsingYourProviderAccount": "ŲØŲ§ استفاده Ų§Ų² Ų­Ų³Ų§ŲØ {0} خود Ų«ŲØŲŖ نام Ś©Ł†ŪŒŲÆ" + "RegisterUsingYourProviderAccount": "ŲØŲ§ استفاده Ų§Ų² Ų­Ų³Ų§ŲØ {0} خود Ų«ŲØŲŖ نام Ś©Ł†ŪŒŲÆ", + "RequireMigrateSeedTitle": "کاربر Ł…ŲÆŪŒŲ± پیدا نؓد", + "RequireMigrateSeedMessage": "لطفاً Ų§Ų·Ł…ŪŒŁ†Ų§Ł† حاصل Ś©Ł†ŪŒŲÆ که seed Ł¾Ų§ŪŒŚÆŲ§Ł‡ داده Ų§Ų¬Ų±Ų§ ؓده Ų§Ų³ŲŖ. برای Ų±Ų§Ł‡ā€ŒŲ­Ł„ā€ŒŁ‡Ų§ŪŒ ممکن مستندات Ų±Ų§ ŲØŲØŪŒŁ†ŪŒŲÆ." } } \ No newline at end of file diff --git a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/fi.json b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/fi.json index 2f0ae2c574..72acd91647 100644 --- a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/fi.json +++ b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/fi.json @@ -68,6 +68,8 @@ "AccessDenied": "PƤƤsy evƤtty!", "AccessDeniedMessage": "Sinulla ei ole pƤƤsyƤ tƤhƤn resurssiin.", "OrRegisterWith": "Tai rekisterƶidy:", - "RegisterUsingYourProviderAccount": "Rekisterƶidy {0} -tilillƤsi" + "RegisterUsingYourProviderAccount": "Rekisterƶidy {0} -tilillƤsi", + "RequireMigrateSeedTitle": "JƤrjestelmƤnvalvojaa ei lƶydy", + "RequireMigrateSeedMessage": "Varmista, ettƤ tietokannan siemennys on suoritettu. Katso dokumentaatio mahdollisia ratkaisuja varten." } } \ No newline at end of file diff --git a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/fr.json b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/fr.json index fbeec12787..73a53b4bee 100644 --- a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/fr.json +++ b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/fr.json @@ -68,6 +68,8 @@ "AccessDenied": "AccĆØs refusĆ©!", "AccessDeniedMessage": "Vous n'avez pas accĆØs Ć  cette ressource.", "OrRegisterWith": "Or register with", - "RegisterUsingYourProviderAccount": "Register using your {0} account" + "RegisterUsingYourProviderAccount": "Register using your {0} account", + "RequireMigrateSeedTitle": "Impossible de trouver l'utilisateur administrateur", + "RequireMigrateSeedMessage": "Veuillez vous assurer que l'initialisation de la base de donnĆ©es est exĆ©cutĆ©e. Consultez la documentation pour les solutions possibles." } } \ No newline at end of file diff --git a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/hi.json b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/hi.json index 9300e913f6..4264f6ebcf 100644 --- a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/hi.json +++ b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/hi.json @@ -68,6 +68,8 @@ "AccessDenied": "ą¤Ŗą¤¹ą„ą¤‚ą¤š ą¤…ą¤øą„ą¤µą„€ą¤•ą„ƒą¤¤!", "AccessDeniedMessage": "ą¤†ą¤Ŗą¤•ą„‡ पास इस संसाधन तक ą¤Ŗą¤¹ą„ą¤ą¤š ą¤Øą¤¹ą„€ą¤‚ ą¤¹ą„ˆą„¤", "OrRegisterWith": "या ą¤‡ą¤øą¤•ą„‡ साऄ ą¤Ŗą¤‚ą¤œą„€ą¤•ą¤°ą¤£ ą¤•ą¤°ą„‡ą¤‚:", - "RegisterUsingYourProviderAccount": "ą¤…ą¤Ŗą¤Øą„‡ {0} ą¤–ą¤¾ą¤¤ą„‡ का ą¤‰ą¤Ŗą¤Æą„‹ą¤— ą¤•ą¤°ą¤•ą„‡ ą¤Ŗą¤‚ą¤œą„€ą¤•ą¤°ą¤£ ą¤•ą¤°ą„‡ą¤‚" + "RegisterUsingYourProviderAccount": "ą¤…ą¤Ŗą¤Øą„‡ {0} ą¤–ą¤¾ą¤¤ą„‡ का ą¤‰ą¤Ŗą¤Æą„‹ą¤— ą¤•ą¤°ą¤•ą„‡ ą¤Ŗą¤‚ą¤œą„€ą¤•ą¤°ą¤£ ą¤•ą¤°ą„‡ą¤‚", + "RequireMigrateSeedTitle": "ą¤µą„ą¤Æą¤µą¤øą„ą¤„ą¤¾ą¤Ŗą¤• ą¤‰ą¤Ŗą¤Æą„‹ą¤—ą¤•ą¤°ą„ą¤¤ą¤¾ ą¤Øą¤¹ą„€ą¤‚ मिला", + "RequireMigrateSeedMessage": "ą¤•ą„ƒą¤Ŗą¤Æą¤¾ ą¤øą„ą¤Øą¤æą¤¶ą„ą¤šą¤æą¤¤ ą¤•ą¤°ą„‡ą¤‚ कि ą¤”ą„‡ą¤Ÿą¤¾ą¤¬ą„‡ą¤ø ą¤øą„€ą¤” ą¤Øą¤æą¤·ą„ą¤Ŗą¤¾ą¤¦ą¤æą¤¤ किया गया ą¤¹ą„ˆą„¤ संभावित ą¤øą¤®ą¤¾ą¤§ą¤¾ą¤Øą„‹ą¤‚ ą¤•ą„‡ ą¤²ą¤æą¤ ą¤¦ą¤øą„ą¤¤ą¤¾ą¤µą„‡ą¤œą¤¼ą„€ą¤•ą¤°ą¤£ ą¤¦ą„‡ą¤–ą„‡ą¤‚ą„¤" } } \ No newline at end of file diff --git a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/hr.json b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/hr.json index 8ec48e7a09..2262779dba 100644 --- a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/hr.json +++ b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/hr.json @@ -68,6 +68,8 @@ "AccessDenied": "Pristup odbijen!", "AccessDeniedMessage": "Nemate pristup ovom resursu.", "OrRegisterWith": "Ili se registrirajte sa:", - "RegisterUsingYourProviderAccount": "Registrirajte se koristeći svoj {0} račun" + "RegisterUsingYourProviderAccount": "Registrirajte se koristeći svoj {0} račun", + "RequireMigrateSeedTitle": "Nije moguće pronaći administratorskog korisnika", + "RequireMigrateSeedMessage": "Molimo provjerite je li izvrÅ”eno početno punjenje baze podataka. Pogledajte dokumentaciju za moguća rjeÅ”enja." } } diff --git a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/hu.json b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/hu.json index 44e3794e24..c2a8d3d354 100644 --- a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/hu.json +++ b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/hu.json @@ -68,6 +68,8 @@ "AccessDenied": "HozzĆ”fĆ©rĆ©s megtagadva!", "AccessDeniedMessage": "Nincs hozzĆ”fĆ©rĆ©se ehhez az erőforrĆ”shoz.", "OrRegisterWith": "Vagy regisztrĆ”ljon:", - "RegisterUsingYourProviderAccount": "RegisztrĆ”ljon a(z) {0} fiókjĆ”val" + "RegisterUsingYourProviderAccount": "RegisztrĆ”ljon a(z) {0} fiókjĆ”val", + "RequireMigrateSeedTitle": "Nem talĆ”lható az adminisztrĆ”tor felhasznĆ”ló", + "RequireMigrateSeedMessage": "KĆ©rjük, győződjƶn meg arról, hogy az adatbĆ”zis seed vĆ©grehajtĆ”sra került. Tekintse meg a dokumentĆ”ciót a lehetsĆ©ges megoldĆ”sokĆ©rt." } } \ No newline at end of file diff --git a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/is.json b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/is.json index 693e200e9f..cb38ff2b6a 100644 --- a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/is.json +++ b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/is.json @@ -68,6 +68,8 @@ "AccessDenied": "Aưgangi hafnaư!", "AccessDeniedMessage": "ĆžĆŗ hefur ekki aưgang aư þessari auưlind.", "OrRegisterWith": "Eưa skrƔưu þig meư:", - "RegisterUsingYourProviderAccount": "SkrƔưu þig meư {0} aưganginum þínum" + "RegisterUsingYourProviderAccount": "SkrƔưu þig meư {0} aưganginum þínum", + "RequireMigrateSeedTitle": "Ekki tókst aư finna stjórnandann", + "RequireMigrateSeedMessage": "Vinsamlegast gakktu Ćŗr skugga um aư gagnagrunnsfrƦiư sĆ© keyrt. SjĆ” fylgiskjƶl fyrir mƶgulegar lausnir." } } \ No newline at end of file diff --git a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/it.json b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/it.json index 60157a574b..a2a2a6db50 100644 --- a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/it.json +++ b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/it.json @@ -68,6 +68,8 @@ "AccessDenied": "Accesso negato!", "AccessDeniedMessage": "Non hai accesso a questa risorsa.", "OrRegisterWith": "Oppure registrati con:", - "RegisterUsingYourProviderAccount": "Registrati utilizzando il tuo account {0}" + "RegisterUsingYourProviderAccount": "Registrati utilizzando il tuo account {0}", + "RequireMigrateSeedTitle": "Impossibile trovare l'utente amministratore", + "RequireMigrateSeedMessage": "Assicurati che il seed del database sia eseguito. Consulta la documentazione per possibili soluzioni." } } \ No newline at end of file diff --git a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/nl.json b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/nl.json index 200d35210d..a1c389d8a2 100644 --- a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/nl.json +++ b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/nl.json @@ -68,6 +68,8 @@ "AccessDenied": "Toegang geweigerd!", "AccessDeniedMessage": "U heeft geen toegang tot deze bron.", "OrRegisterWith": "Of registreer met:", - "RegisterUsingYourProviderAccount": "Registreer met uw {0} -account" + "RegisterUsingYourProviderAccount": "Registreer met uw {0} -account", + "RequireMigrateSeedTitle": "Kan de beheerder niet vinden", + "RequireMigrateSeedMessage": "Zorg ervoor dat het database seed wordt uitgevoerd. Zie documentatie voor mogelijke oplossingen." } } \ No newline at end of file diff --git a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/pl-PL.json b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/pl-PL.json index dc5c7952c3..028fc3100b 100644 --- a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/pl-PL.json +++ b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/pl-PL.json @@ -68,6 +68,8 @@ "AccessDenied": "Brak dostępu!", "AccessDeniedMessage": "Nie masz dostępu do tego zasobu.", "OrRegisterWith": "Lub zarejestruj się za pomocą:", - "RegisterUsingYourProviderAccount": "Zarejestruj się za pomocą konta {0}" + "RegisterUsingYourProviderAccount": "Zarejestruj się za pomocą konta {0}", + "RequireMigrateSeedTitle": "Nie można znaleźć użytkownika administratora", + "RequireMigrateSeedMessage": "Upewnij się, że wykonano seed bazy danych. Zobacz dokumentację, aby poznać możliwe rozwiązania." } } \ No newline at end of file diff --git a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/pt-BR.json b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/pt-BR.json index 3ea880a474..e92a6f1d5b 100644 --- a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/pt-BR.json +++ b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/pt-BR.json @@ -68,6 +68,8 @@ "AccessDenied": "Acesso negado!", "AccessDeniedMessage": "VocĆŖ nĆ£o tem acesso a este recurso.", "OrRegisterWith": "Ou registre-se com:", - "RegisterUsingYourProviderAccount": "Registre-se utilizando sua conta {0}" + "RegisterUsingYourProviderAccount": "Registre-se utilizando sua conta {0}", + "RequireMigrateSeedTitle": "NĆ£o foi possĆ­vel encontrar o usuĆ”rio administrador", + "RequireMigrateSeedMessage": "Certifique-se de que a semeadura do banco de dados seja executada. Consulte a documentação para possĆ­veis soluƧƵes." } } \ No newline at end of file diff --git a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/ro-RO.json b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/ro-RO.json index b7dbc5c244..63fea101b1 100644 --- a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/ro-RO.json +++ b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/ro-RO.json @@ -68,6 +68,8 @@ "AccessDenied": "Acces interzis!", "AccessDeniedMessage": "Nu aveÅ£i acces la această resursă.", "OrRegisterWith": "Sau Ć®nregistraÅ£i-vă cu:", - "RegisterUsingYourProviderAccount": "ƎnregistraÅ£i-vă folosindu-vă contul {0}" + "RegisterUsingYourProviderAccount": "ƎnregistraÅ£i-vă folosindu-vă contul {0}", + "RequireMigrateSeedTitle": "Nu s-a putut găsi utilizatorul admin", + "RequireMigrateSeedMessage": "Vă rugăm să vă asiguraÅ£i că seed-ul bazei de date este executat. ConsultaÅ£i documentaÅ£ia pentru soluÅ£ii posibile." } } \ No newline at end of file diff --git a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/ru.json b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/ru.json index d57b3c4e09..834fd7707b 100644 --- a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/ru.json +++ b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/ru.json @@ -68,6 +68,8 @@ "AccessDenied": "Š’ Š“Š¾ŃŃ‚ŃƒŠæŠµ отказано!", "AccessDeniedMessage": "Š£ вас нет Š“Š¾ŃŃ‚ŃƒŠæŠ° Šŗ ŃŃ‚Š¾Š¼Ńƒ Ń€ŠµŃŃƒŃ€ŃŃƒ.", "OrRegisterWith": "Или Š·Š°Ń€ŠµŠ³ŠøŃŃ‚Ń€ŠøŃ€ŃƒŠ¹Ń‚ŠµŃŃŒ с ŠæŠ¾Š¼Š¾Ń‰ŃŒŃŽ:", - "RegisterUsingYourProviderAccount": "Š—Š°Ń€ŠµŠ³ŠøŃŃ‚Ń€ŠøŃ€ŃƒŠ¹Ń‚ŠµŃŃŒ, ŠøŃŠæŠ¾Š»ŃŒŠ·ŃƒŃ свой {0} Š°ŠŗŠŗŠ°ŃƒŠ½Ń‚" + "RegisterUsingYourProviderAccount": "Š—Š°Ń€ŠµŠ³ŠøŃŃ‚Ń€ŠøŃ€ŃƒŠ¹Ń‚ŠµŃŃŒ, ŠøŃŠæŠ¾Š»ŃŒŠ·ŃƒŃ свой {0} Š°ŠŗŠŗŠ°ŃƒŠ½Ń‚", + "RequireMigrateSeedTitle": "ŠŠµ уГалось найти ŠæŠ¾Š»ŃŒŠ·Š¾Š²Š°Ń‚ŠµŠ»Ń-аГминистратора", + "RequireMigrateSeedMessage": "ŠŸŠ¾Š¶Š°Š»ŃƒŠ¹ŃŃ‚Š°, ŃƒŠ±ŠµŠ“ŠøŃ‚ŠµŃŃŒ, что выполнено Š½Š°Ń‡Š°Š»ŃŒŠ½Š¾Šµ заполнение базы Ганных. Дмотрите Š“Š¾ŠŗŃƒŠ¼ŠµŠ½Ń‚Š°Ń†ŠøŃŽ Š“Š»Ń возможных Ń€ŠµŃˆŠµŠ½ŠøŠ¹." } } \ No newline at end of file diff --git a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/sk.json b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/sk.json index cbaf2b4ee7..0965e8aaa3 100644 --- a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/sk.json +++ b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/sk.json @@ -68,6 +68,8 @@ "AccessDenied": "PrĆ­stup zamietnutý!", "AccessDeniedMessage": "K tomuto zdroju nemĆ”te prĆ­stup.", "OrRegisterWith": "Alebo sa zaregistrujte pomocou:", - "RegisterUsingYourProviderAccount": "Zaregistrujte sa pomocou svojho {0} ĆŗÄtu" + "RegisterUsingYourProviderAccount": "Zaregistrujte sa pomocou svojho {0} ĆŗÄtu", + "RequireMigrateSeedTitle": "Nepodarilo sa nĆ”jsÅ„ používateľa sprĆ”vcu", + "RequireMigrateSeedMessage": "Uistite sa, že je spustenĆ© seed databĆ”zy. Pozrite si dokumentĆ”ciu pre možnĆ© rieÅ”enia." } } \ No newline at end of file diff --git a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/sl.json b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/sl.json index fae736de5f..63820bc60f 100644 --- a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/sl.json +++ b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/sl.json @@ -68,6 +68,8 @@ "AccessDenied": "Dostop zavrnjen!", "AccessDeniedMessage": "Nimate dostopa do tega vira.", "OrRegisterWith": "Ali pa se registrirajte z:", - "RegisterUsingYourProviderAccount": "Registrirajte se z uporabo vaÅ”ega {0} računa" + "RegisterUsingYourProviderAccount": "Registrirajte se z uporabo vaÅ”ega {0} računa", + "RequireMigrateSeedTitle": "SkrbniÅ”kega uporabnika ni mogoče najti", + "RequireMigrateSeedMessage": "Prepričajte se, da je seed baze podatkov izveden. Za možne reÅ”itve glejte dokumentacijo." } } \ No newline at end of file diff --git a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/sv.json b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/sv.json index d06472ed7b..a03bf20e97 100644 --- a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/sv.json +++ b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/sv.json @@ -68,6 +68,8 @@ "AccessDenied": "ƅtkomst nekad!", "AccessDeniedMessage": "Du har inte tillgĆ„ng till denna resurs.", "OrRegisterWith": "Eller registrera dig med", - "RegisterUsingYourProviderAccount": "Registrera dig med ditt {0} konto" + "RegisterUsingYourProviderAccount": "Registrera dig med ditt {0} konto", + "RequireMigrateSeedTitle": "Kunde inte hitta administratƶrsanvƤndaren", + "RequireMigrateSeedMessage": "Se till att databasens seed kƶrs. Se dokumentationen fƶr mƶjliga lƶsningar." } } \ No newline at end of file diff --git a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/tr.json b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/tr.json index 0e53963f9a..841cd18775 100644 --- a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/tr.json +++ b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/tr.json @@ -68,6 +68,8 @@ "AccessDenied": "Erişim reddedildi!", "AccessDeniedMessage": "Bu kaynağa erişiminiz yok.", "OrRegisterWith": "Veya bunlarla kayıt ol:", - "RegisterUsingYourProviderAccount": "{0} hesabınızla kayıt olun." + "RegisterUsingYourProviderAccount": "{0} hesabınızla kayıt olun.", + "RequireMigrateSeedTitle": "Yƶnetici kullanıcısı bulunamadı", + "RequireMigrateSeedMessage": "Lütfen veritabanı tohumunun yürütüldüğünden emin olun. Olası Ƨƶzümler iƧin belgelere bakın." } } diff --git a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/vi.json b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/vi.json index 600ce9fa4f..e29ba0d7b9 100644 --- a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/vi.json +++ b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/vi.json @@ -68,6 +68,8 @@ "AccessDenied": "Quyền truy cįŗ­p bị từ chối!", "AccessDeniedMessage": "Bįŗ”n khĆ“ng có quyền truy cįŗ­p vĆ o tĆ i nguyĆŖn nĆ y.", "OrRegisterWith": "Hoįŗ·c đăng ký bįŗ±ng:", - "RegisterUsingYourProviderAccount": "Đăng ký bįŗ±ng tĆ i khoįŗ£n {0} cį»§a bįŗ”n" + "RegisterUsingYourProviderAccount": "Đăng ký bįŗ±ng tĆ i khoįŗ£n {0} cį»§a bįŗ”n", + "RequireMigrateSeedTitle": "KhĆ“ng thể tƬm thįŗ„y ngĘ°į»i dùng quįŗ£n trị", + "RequireMigrateSeedMessage": "Vui lòng đảm bįŗ£o rįŗ±ng seed cĘ” sở dữ liệu được thį»±c thi. Xem tĆ i liệu Ä‘į»ƒ biįŗæt cĆ”c giįŗ£i phĆ”p có thể." } } \ No newline at end of file diff --git a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/zh-Hans.json b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/zh-Hans.json index e6af1b3b7e..094798b95c 100644 --- a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/zh-Hans.json +++ b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/zh-Hans.json @@ -68,6 +68,8 @@ "AccessDenied": "ę‹’ē»č®æé—®ļ¼", "AccessDeniedMessage": "您无法访问此资源。", "OrRegisterWith": "ęˆ–ę³Øå†Œ", - "RegisterUsingYourProviderAccount": "ä½æē”Øę‚Øēš„ {0} č“¦ęˆ·ę³Øå†Œ" + "RegisterUsingYourProviderAccount": "ä½æē”Øę‚Øēš„ {0} č“¦ęˆ·ę³Øå†Œ", + "RequireMigrateSeedTitle": "ę‰¾äøåˆ°ē®”ē†å‘˜ē”Øęˆ·", + "RequireMigrateSeedMessage": "čÆ·ē”®äæå·²ę‰§č”Œę•°ę®åŗ“ē§å­ę•°ę®ć€‚ęŸ„ēœ‹ę–‡ę”£äŗ†č§£åÆčƒ½ēš„č§£å†³ę–¹ę”ˆć€‚" } } \ No newline at end of file diff --git a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/zh-Hant.json b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/zh-Hant.json index 14cf84fc24..1657ce4a49 100644 --- a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/zh-Hant.json +++ b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/zh-Hant.json @@ -68,6 +68,8 @@ "AccessDenied": "ę‹’ēµ•čØŖå•!", "AccessDeniedMessage": "ę‚Øē„”ę¬ŠčØŖå•ę­¤č³‡ęŗ.", "OrRegisterWith": "ęˆ–ę˜ÆčØ»å†Šē”Ø:", - "RegisterUsingYourProviderAccount": "ä½æē”Øä½ ēš„{0}åø³č™ŸčØ»å†Š" + "RegisterUsingYourProviderAccount": "ä½æē”Øä½ ēš„{0}åø³č™ŸčØ»å†Š", + "RequireMigrateSeedTitle": "ę‰¾äøåˆ°ē®”ē†å“”ē”Øęˆ¶", + "RequireMigrateSeedMessage": "č«‹ē¢ŗäæå·²åŸ·č”Œč³‡ę–™åŗ«ēØ®å­č³‡ę–™ć€‚ęŸ„ēœ‹ę–‡ęŖ”äŗ†č§£åÆčƒ½ēš„č§£ę±ŗę–¹ę”ˆć€‚" } } \ No newline at end of file diff --git a/modules/account/src/Volo.Abp.Account.Installer/InstallationNotes.md b/modules/account/src/Volo.Abp.Account.Installer/InstallationNotes.md new file mode 100644 index 0000000000..2289069146 --- /dev/null +++ b/modules/account/src/Volo.Abp.Account.Installer/InstallationNotes.md @@ -0,0 +1,9 @@ +# Installation Notes for Account Module + +Account module implements the basic authentication features like login, register, forgot password and account management. + +This module is based on [Microsoft's Identity library](https://docs.microsoft.com/en-us/aspnet/core/security/authentication/identity?view=aspnetcore-6.0&tabs=visual-studio) and the [Identity Module](https://docs.abp.io/en/abp/latest/modules/identity). It has [IdentityServer](https://docs.abp.io/en/abp/latest/modules/identity-server) integration (based on the [IdentityServer Module](https://docs.abp.io/en/abp/latest/modules/identity-server)) and [OpenIddict](https://github.com/openiddict) integration (based on the [Openiddict Module](https://docs.abp.io/en/abp/latest/modules/openiddict)) to provide single sign-on, access control and other advanced authentication features. + +## Documentation + +For detailed information and usage instructions, please visit the [Account Module documentation](https://abp.io/docs/latest/Modules/Account). \ No newline at end of file diff --git a/modules/account/src/Volo.Abp.Account.Web.IdentityServer/Pages/Account/IdentityServerSupportedLoginModel.cs b/modules/account/src/Volo.Abp.Account.Web.IdentityServer/Pages/Account/IdentityServerSupportedLoginModel.cs index 0a2aadd64a..b8ca910eba 100644 --- a/modules/account/src/Volo.Abp.Account.Web.IdentityServer/Pages/Account/IdentityServerSupportedLoginModel.cs +++ b/modules/account/src/Volo.Abp.Account.Web.IdentityServer/Pages/Account/IdentityServerSupportedLoginModel.cs @@ -11,6 +11,7 @@ using System.Diagnostics; using System.Linq; using System.Security.Claims; using System.Threading.Tasks; +using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Identity; using Volo.Abp.Account.Settings; using Volo.Abp.DependencyInjection; @@ -35,8 +36,9 @@ public class IdentityServerSupportedLoginModel : LoginModel IdentityDynamicClaimsPrincipalContributorCache identityDynamicClaimsPrincipalContributorCache, IIdentityServerInteractionService interaction, IClientStore clientStore, - IEventService identityServerEvents) - : base(schemeProvider, accountOptions, identityOptions, identityDynamicClaimsPrincipalContributorCache) + IEventService identityServerEvents, + IWebHostEnvironment webHostEnvironment) + : base(schemeProvider, accountOptions, identityOptions, identityDynamicClaimsPrincipalContributorCache, webHostEnvironment) { Interaction = interaction; ClientStore = clientStore; diff --git a/modules/account/src/Volo.Abp.Account.Web.OpenIddict/Pages/Account/OpenIddictSupportedLoginModel.cs b/modules/account/src/Volo.Abp.Account.Web.OpenIddict/Pages/Account/OpenIddictSupportedLoginModel.cs index d7998eb826..0390bf0f52 100644 --- a/modules/account/src/Volo.Abp.Account.Web.OpenIddict/Pages/Account/OpenIddictSupportedLoginModel.cs +++ b/modules/account/src/Volo.Abp.Account.Web.OpenIddict/Pages/Account/OpenIddictSupportedLoginModel.cs @@ -2,6 +2,7 @@ using System; using System.Security.Claims; using System.Threading.Tasks; using Microsoft.AspNetCore.Authentication; +using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Options; using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Mvc; @@ -24,8 +25,9 @@ public class OpenIddictSupportedLoginModel : LoginModel IOptions accountOptions, IOptions identityOptions, IdentityDynamicClaimsPrincipalContributorCache identityDynamicClaimsPrincipalContributorCache, - AbpOpenIddictRequestHelper openIddictRequestHelper) - : base(schemeProvider, accountOptions, identityOptions, identityDynamicClaimsPrincipalContributorCache) + AbpOpenIddictRequestHelper openIddictRequestHelper, + IWebHostEnvironment webHostEnvironment) + : base(schemeProvider, accountOptions, identityOptions, identityDynamicClaimsPrincipalContributorCache, webHostEnvironment) { OpenIddictRequestHelper = openIddictRequestHelper; } diff --git a/modules/account/src/Volo.Abp.Account.Web/Pages/Account/Login.cshtml b/modules/account/src/Volo.Abp.Account.Web/Pages/Account/Login.cshtml index 2b0fcb9c2c..1c883936b4 100644 --- a/modules/account/src/Volo.Abp.Account.Web/Pages/Account/Login.cshtml +++ b/modules/account/src/Volo.Abp.Account.Web/Pages/Account/Login.cshtml @@ -22,6 +22,14 @@ } +@if (Model.ShowRequireMigrateSeedMessage) +{ +
    +

    @L["RequireMigrateSeedTitle"]

    +

    @L["RequireMigrateSeedMessage"]

    +
    +} +

    @L["Login"]

    diff --git a/modules/account/src/Volo.Abp.Account.Web/Pages/Account/Login.cshtml.cs b/modules/account/src/Volo.Abp.Account.Web/Pages/Account/Login.cshtml.cs index 6ab8350b60..c17eb1e28f 100644 --- a/modules/account/src/Volo.Abp.Account.Web/Pages/Account/Login.cshtml.cs +++ b/modules/account/src/Volo.Abp.Account.Web/Pages/Account/Login.cshtml.cs @@ -10,6 +10,8 @@ using System.Diagnostics; using System.Linq; using System.Security.Claims; using System.Threading.Tasks; +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.Hosting; using Volo.Abp.Account.Settings; using Volo.Abp.Auditing; using Volo.Abp.Identity; @@ -53,18 +55,22 @@ public class LoginModel : AccountPageModel protected AbpAccountOptions AccountOptions { get; } protected IOptions IdentityOptions { get; } protected IdentityDynamicClaimsPrincipalContributorCache IdentityDynamicClaimsPrincipalContributorCache { get; } + protected IWebHostEnvironment WebHostEnvironment { get; } public bool ShowCancelButton { get; set; } + public bool ShowRequireMigrateSeedMessage { get; set; } public LoginModel( IAuthenticationSchemeProvider schemeProvider, IOptions accountOptions, IOptions identityOptions, - IdentityDynamicClaimsPrincipalContributorCache identityDynamicClaimsPrincipalContributorCache) + IdentityDynamicClaimsPrincipalContributorCache identityDynamicClaimsPrincipalContributorCache, + IWebHostEnvironment webHostEnvironment) { SchemeProvider = schemeProvider; IdentityOptions = identityOptions; AccountOptions = accountOptions.Value; IdentityDynamicClaimsPrincipalContributorCache = identityDynamicClaimsPrincipalContributorCache; + WebHostEnvironment = webHostEnvironment; } public virtual async Task OnGetAsync() @@ -130,6 +136,17 @@ public class LoginModel : AccountPageModel if (!result.Succeeded) { + if (LoginInput.UserNameOrEmailAddress == IdentityDataSeedContributor.AdminUserNameDefaultValue && + WebHostEnvironment.IsDevelopment()) + { + var adminUser = await UserManager.FindByNameAsync(IdentityDataSeedContributor.AdminUserNameDefaultValue); + if (adminUser == null) + { + ShowRequireMigrateSeedMessage = true; + return Page(); + } + } + Alerts.Danger(L["InvalidUserNameOrPassword"]); return Page(); } diff --git a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/ar.json b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/ar.json index 3b94f7f834..58f1b5bf7a 100644 --- a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/ar.json +++ b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/ar.json @@ -67,6 +67,9 @@ "EntityHistory": "تاريخ Ų§Ł„ŁƒŁŠŲ§Ł†", "DaysAgoTitle": "{0} {1}.", "DaysAgoWithUserTitle": "{0} {1} بواسطة {2}.", + "MinutesAgo": "منذ {0} ŲÆŁ‚ŁŠŁ‚Ų©", + "HoursAgo": "منذ {0} Ų³Ų§Ų¹Ų©", + "DaysAgo": "منذ {0} ŁŠŁˆŁ…", "Created": "خلقت", "Updated": "Ł…Ų­ŲÆŲ«", "Deleted": "ŲŖŁ… الحذف", diff --git a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/cs.json b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/cs.json index ceeb244fc8..b415c41556 100644 --- a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/cs.json +++ b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/cs.json @@ -67,6 +67,9 @@ "EntityHistory": "Historie entity", "DaysAgoTitle": "{0} {1}.", "DaysAgoWithUserTitle": "{0} {1} od {2}.", + "MinutesAgo": "před {0} minutami", + "HoursAgo": "před {0} hodinami", + "DaysAgo": "před {0} dny", "Created": "Vytvořeno", "Updated": "AktualizovĆ”no", "Deleted": "SmazĆ”no", diff --git a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/de-DE.json b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/de-DE.json index 75e5c251c3..512556988f 100644 --- a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/de-DE.json +++ b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/de-DE.json @@ -66,6 +66,9 @@ "EntityHistory": "EntitƤtsverlauf", "DaysAgoTitle": "{0} {1}.", "DaysAgoWithUserTitle": "{0} {1} durch {2}.", + "MinutesAgo": "Vor {0} Minuten", + "HoursAgo": "Vor {0} Stunden", + "DaysAgo": "Vor {0} Tagen", "Created": "Erstellt", "Updated": "Aktualisiert", "Deleted": "Gelƶscht", diff --git a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/de.json b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/de.json index 2f3152fca5..06d2a825f4 100644 --- a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/de.json +++ b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/de.json @@ -67,6 +67,9 @@ "EntityHistory": "EntitƤtsgeschichte", "DaysAgoTitle": "{0} {1}.", "DaysAgoWithUserTitle": "{0} {1} von {2}.", + "MinutesAgo": "Vor {0} Minuten", + "HoursAgo": "Vor {0} Stunden", + "DaysAgo": "Vor {0} Tagen", "Created": "Erstellt", "Updated": "Aktualisiert", "Deleted": "Gelƶscht", diff --git a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/en.json b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/en.json index 4071fac620..ac03e75db7 100644 --- a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/en.json +++ b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/en.json @@ -67,6 +67,9 @@ "EntityHistory": "Entity history", "DaysAgoTitle": "{0} {1}.", "DaysAgoWithUserTitle": "{0} {1} by {2}.", + "MinutesAgo": "{0} minutes ago", + "HoursAgo": "{0} hours ago", + "DaysAgo": "{0} days ago", "Created": "Created", "Updated": "Updated", "Deleted": "Deleted", diff --git a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/es.json b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/es.json index 1227e0bc08..310b5de91b 100644 --- a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/es.json +++ b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/es.json @@ -67,6 +67,9 @@ "EntityHistory": "Historial de entidad", "DaysAgoTitle": "{0} {1}.", "DaysAgoWithUserTitle": "{0} {1} por {2}.", + "MinutesAgo": "Hace {0} minutos", + "HoursAgo": "Hace {0} horas", + "DaysAgo": "Hace {0} dĆ­as", "Created": "Creado", "Updated": "Actualizado", "Deleted": "Eliminado", diff --git a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/fi.json b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/fi.json index 9870d85155..76b374f51a 100644 --- a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/fi.json +++ b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/fi.json @@ -67,6 +67,9 @@ "EntityHistory": "Entiteettihistoria", "DaysAgoTitle": "{0} {1}.", "DaysAgoWithUserTitle": "{0} {1} kirjoittanut {2}.", + "MinutesAgo": "{0} minuuttia sitten", + "HoursAgo": "{0} tuntia sitten", + "DaysAgo": "{0} pƤivƤƤ sitten", "Created": "Luotu", "Updated": "PƤivitetty", "Deleted": "Poistettu", diff --git a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/fr.json b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/fr.json index ced0d637c9..5ea79065aa 100644 --- a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/fr.json +++ b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/fr.json @@ -67,6 +67,9 @@ "EntityHistory": "Historique de l'entitĆ©", "DaysAgoTitle": "{0} {1}.", "DaysAgoWithUserTitle": "{0} {1} par {2}.", + "MinutesAgo": "Il y a {0} minutes", + "HoursAgo": "Il y a {0} heures", + "DaysAgo": "Il y a {0} jours", "Created": "CrƩƩ", "Updated": "Mise Ć  jour", "Deleted": "SupprimĆ©", diff --git a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/hi.json b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/hi.json index 7c6a4b5587..7e1e84de7e 100644 --- a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/hi.json +++ b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/hi.json @@ -67,6 +67,9 @@ "EntityHistory": "ą¤‡ą¤•ą¤¾ą¤ˆ इतिहास", "DaysAgoTitle": "{0} {1}.", "DaysAgoWithUserTitle": "{0} {1} ą¤øą„‡ {2}ą„¤", + "MinutesAgo": "{0} मिनट ą¤Ŗą¤¹ą¤²ą„‡", + "HoursAgo": "{0} ą¤˜ą¤‚ą¤Ÿą„‡ ą¤Ŗą¤¹ą¤²ą„‡", + "DaysAgo": "{0} दिन ą¤Ŗą¤¹ą¤²ą„‡", "Created": "बनाया ऄा", "Updated": "ą¤…ą¤¦ą„ą¤Æą¤¤ą¤Ø", "Deleted": "ą¤¹ą¤Ÿą¤¾ą¤ ą¤—ą¤", diff --git a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/hr.json b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/hr.json index ec6028c6a8..ed6c345578 100644 --- a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/hr.json +++ b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/hr.json @@ -67,6 +67,9 @@ "EntityHistory": "Povijest entiteta", "DaysAgoTitle": "{0} {1}.", "DaysAgoWithUserTitle": "{0} {1} od {2}.", + "MinutesAgo": "prije {0} minuta", + "HoursAgo": "prije {0} sati", + "DaysAgo": "prije {0} dana", "Created": "Stvoreno", "Updated": "Ažurirano", "Deleted": "Izbrisano", diff --git a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/hu.json b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/hu.json index 1122431190..816aa4c0d5 100644 --- a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/hu.json +++ b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/hu.json @@ -67,6 +67,9 @@ "EntityHistory": "EntitĆ”stƶrtĆ©net", "DaysAgoTitle": "{0} {1}.", "DaysAgoWithUserTitle": "{0} {1}, szerző: {2}.", + "MinutesAgo": "{0} perce", + "HoursAgo": "{0} órĆ”ja", + "DaysAgo": "{0} napja", "Created": "LĆ©trehozva", "Updated": "FrissĆ­tve", "Deleted": "Tƶrƶlve", diff --git a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/is.json b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/is.json index cdf1217b36..fc556570ff 100644 --- a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/is.json +++ b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/is.json @@ -67,6 +67,9 @@ "EntityHistory": "Saga eininga", "DaysAgoTitle": "{0} {1}.", "DaysAgoWithUserTitle": "{0} {1} eftir {2}.", + "MinutesAgo": "fyrir {0} mĆ­nĆŗtum", + "HoursAgo": "fyrir {0} klukkustundum", + "DaysAgo": "fyrir {0} dƶgum", "Created": "BĆŗiư til", "Updated": "UppfƦrt", "Deleted": "Eytt", diff --git a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/it.json b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/it.json index 1a7823908a..6e3ef94959 100644 --- a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/it.json +++ b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/it.json @@ -67,6 +67,9 @@ "EntityHistory": "Storia dell'entitĆ ", "DaysAgoTitle": "{0} {1}.", "DaysAgoWithUserTitle": "{0} {1} di {2}.", + "MinutesAgo": "{0} minuti fa", + "HoursAgo": "{0} ore fa", + "DaysAgo": "{0} giorni fa", "Created": "Creato", "Updated": "Aggiornato", "Deleted": "Eliminato", diff --git a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/nl.json b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/nl.json index 6500e216b6..289b2318e3 100644 --- a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/nl.json +++ b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/nl.json @@ -67,6 +67,9 @@ "EntityHistory": "Entiteitsgeschiedenis", "DaysAgoTitle": "{0} {1}.", "DaysAgoWithUserTitle": "{0} {1} door {2}.", + "MinutesAgo": "{0} minuten geleden", + "HoursAgo": "{0} uur geleden", + "DaysAgo": "{0} dagen geleden", "Created": "Gemaakt", "Updated": "Bijgewerkt", "Deleted": "Verwijderd", diff --git a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/pl-PL.json b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/pl-PL.json index bbbc627b98..9f4f6db58f 100644 --- a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/pl-PL.json +++ b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/pl-PL.json @@ -67,6 +67,9 @@ "EntityHistory": "Historia jednostki", "DaysAgoTitle": "{0} {1}.", "DaysAgoWithUserTitle": "{0} {1} autorstwa {2}.", + "MinutesAgo": "{0} minut temu", + "HoursAgo": "{0} godzin temu", + "DaysAgo": "{0} dni temu", "Created": "Utworzony", "Updated": "Zaktualizowano", "Deleted": "Usunięto", diff --git a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/pt-BR.json b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/pt-BR.json index 8e5557e442..d88aba16a6 100644 --- a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/pt-BR.json +++ b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/pt-BR.json @@ -67,6 +67,9 @@ "EntityHistory": "História da Entidade", "DaysAgoTitle": "{0} {1}.", "DaysAgoWithUserTitle": "{0} {1} por {2}.", + "MinutesAgo": "{0} minutos atrĆ”s", + "HoursAgo": "{0} horas atrĆ”s", + "DaysAgo": "{0} dias atrĆ”s", "Created": "Criado", "Updated": "Atualizado", "Deleted": "ExcluĆ­do", diff --git a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/ro-RO.json b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/ro-RO.json index 73da32a928..0b546c4866 100644 --- a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/ro-RO.json +++ b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/ro-RO.json @@ -67,6 +67,9 @@ "EntityHistory": "Istoricul entității", "DaysAgoTitle": "{0} {1}.", "DaysAgoWithUserTitle": "{0} {1} de la {2}.", + "MinutesAgo": "acum {0} minute", + "HoursAgo": "acum {0} ore", + "DaysAgo": "acum {0} zile", "Created": "Creată", "Updated": "Actualizat", "Deleted": "Șters", diff --git a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/ru.json b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/ru.json index 9dba5121ce..9d12238ac2 100644 --- a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/ru.json +++ b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/ru.json @@ -67,6 +67,9 @@ "EntityHistory": "Š˜ŃŃ‚Š¾Ń€ŠøŃ Š¾Š±ŃŠŠµŠŗŃ‚Š°", "DaysAgoTitle": "{0} {1}.", "DaysAgoWithUserTitle": "{0} {1} от {2}.", + "MinutesAgo": "{0} Š¼ŠøŠ½ŃƒŃ‚ назаГ", + "HoursAgo": "{0} часов назаГ", + "DaysAgo": "{0} Гней назаГ", "Created": "ДозГанный", "Updated": "ŠžŠ±Š½Š¾Š²Š»ŠµŠ½Š¾", "Deleted": "УГалено", diff --git a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/sk.json b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/sk.json index 672f32dd44..ae3925ea79 100644 --- a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/sk.json +++ b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/sk.json @@ -67,6 +67,9 @@ "EntityHistory": "História entity", "DaysAgoTitle": "{0} {1}.", "DaysAgoWithUserTitle": "{0} {1} vykonal {2}.", + "MinutesAgo": "pred {0} minĆŗtami", + "HoursAgo": "pred {0} hodinami", + "DaysAgo": "pred {0} dňami", "Created": "VytvorenĆ”", "Updated": "AktualizovanĆ”", "Deleted": "ZmazanĆ”", diff --git a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/sl.json b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/sl.json index 324a03b6db..460e43458e 100644 --- a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/sl.json +++ b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/sl.json @@ -67,6 +67,9 @@ "EntityHistory": "Zgodovina entitete", "DaysAgoTitle": "{0} {1}.", "DaysAgoWithUserTitle": "{0} {1} avtorja {2}.", + "MinutesAgo": "pred {0} minutami", + "HoursAgo": "pred {0} urami", + "DaysAgo": "pred {0} dnevi", "Created": "Ustvarjeno", "Updated": "Posodobljeno", "Deleted": "Izbrisano", diff --git a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/sv.json b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/sv.json index 2432e63d33..3c57005a3d 100644 --- a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/sv.json +++ b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/sv.json @@ -67,6 +67,9 @@ "EntityHistory": "Enhetens historia", "DaysAgoTitle": "{0} {1}.", "DaysAgoWithUserTitle": "{0} {1} av {2}.", + "MinutesAgo": "{0} minuter sedan", + "HoursAgo": "{0} timmar sedan", + "DaysAgo": "{0} dagar sedan", "Created": "Skapad", "Updated": "Uppdaterad", "Deleted": "Borttagen", diff --git a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/tr.json b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/tr.json index 6fb89d3b2b..b3e09335fc 100644 --- a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/tr.json +++ b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/tr.json @@ -66,6 +66,9 @@ "EntityHistory": "Entity GeƧmişi", "DaysAgoTitle": "{1} {0}.", "DaysAgoWithUserTitle": "{1} {2} tarafından {0}.", + "MinutesAgo": "{0} dakika ƶnce", + "HoursAgo": "{0} saat ƶnce", + "DaysAgo": "{0} gün ƶnce", "Created": "Oluşturuldu", "Updated": "Güncellendi", "Deleted": "Silindi", diff --git a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/vi.json b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/vi.json index 0ea4845071..933593c168 100644 --- a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/vi.json +++ b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/vi.json @@ -67,6 +67,9 @@ "EntityHistory": "Lịch sį»­ thį»±c thể", "DaysAgoTitle": "{0} {1}.", "DaysAgoWithUserTitle": "{0} {1} cį»§a {2}.", + "MinutesAgo": "{0} phĆŗt trước", + "HoursAgo": "{0} giį» trước", + "DaysAgo": "{0} ngĆ y trước", "Created": "Tįŗ”o", "Updated": "Đã cįŗ­p nhįŗ­t", "Deleted": "Đã xóa", diff --git a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/zh-Hans.json b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/zh-Hans.json index 3f6099f04f..dc9cc4d667 100644 --- a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/zh-Hans.json +++ b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/zh-Hans.json @@ -67,6 +67,9 @@ "EntityHistory": "实体历史", "DaysAgoTitle": "{0} {1}.", "DaysAgoWithUserTitle": "{0} {1} by {2}怂", + "MinutesAgo": "{0}分钟前", + "HoursAgo": "{0}å°ę—¶å‰", + "DaysAgo": "{0}天前", "Created": "åˆ›å»ŗ", "Updated": "已曓新", "Deleted": "已删除", diff --git a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/zh-Hant.json b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/zh-Hant.json index 5b663c9568..dc0275186d 100644 --- a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/zh-Hant.json +++ b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/zh-Hant.json @@ -67,6 +67,9 @@ "EntityHistory": "åÆ¦é«”ę­·å²", "DaysAgoTitle": "{0} {1}.", "DaysAgoWithUserTitle": "{0} {1} 通過 {2}.", + "MinutesAgo": "{0}分鐘前", + "HoursAgo": "{0}å°ę™‚å‰", + "DaysAgo": "{0}天前", "Created": "建立", "Updated": "ꛓꖰ", "Deleted": "å·²åˆŖé™¤", diff --git a/modules/audit-logging/src/Volo.Abp.AuditLogging.Installer/InstallationNotes.md b/modules/audit-logging/src/Volo.Abp.AuditLogging.Installer/InstallationNotes.md new file mode 100644 index 0000000000..35bd77d32d --- /dev/null +++ b/modules/audit-logging/src/Volo.Abp.AuditLogging.Installer/InstallationNotes.md @@ -0,0 +1,9 @@ +# Installation Notes for Audit Logging Module + +The ABP Audit Logging module provides automatic audit logging for web requests, service methods, and entity changes. It helps you track user activities and changes in your application. + +This module is part of the ABP Framework and provides comprehensive audit logging capabilities including entity history tracking, exception logging, and user activity monitoring. + +## Documentation + +For detailed information and usage instructions, please visit the [Audit Logging documentation](https://abp.io/docs/latest/framework/infrastructure/audit-logging). \ No newline at end of file diff --git a/modules/background-jobs/src/Volo.Abp.BackgroundJobs.Domain.Shared/Volo/Abp/BackgroundJobs/BackgroundJobRecordConsts.cs b/modules/background-jobs/src/Volo.Abp.BackgroundJobs.Domain.Shared/Volo/Abp/BackgroundJobs/BackgroundJobRecordConsts.cs index 4369bfcece..7cf4e651fe 100644 --- a/modules/background-jobs/src/Volo.Abp.BackgroundJobs.Domain.Shared/Volo/Abp/BackgroundJobs/BackgroundJobRecordConsts.cs +++ b/modules/background-jobs/src/Volo.Abp.BackgroundJobs.Domain.Shared/Volo/Abp/BackgroundJobs/BackgroundJobRecordConsts.cs @@ -2,6 +2,11 @@ public static class BackgroundJobRecordConsts { + /// + /// Default value: 96 + /// + public static int MaxApplicationNameLength { get; set; } = 96; + /// /// Default value: 128 /// diff --git a/modules/background-jobs/src/Volo.Abp.BackgroundJobs.Domain/Volo/Abp/BackgroundJobs/BackgroundJobRecord.cs b/modules/background-jobs/src/Volo.Abp.BackgroundJobs.Domain/Volo/Abp/BackgroundJobs/BackgroundJobRecord.cs index 66714af6d6..c01f933781 100644 --- a/modules/background-jobs/src/Volo.Abp.BackgroundJobs.Domain/Volo/Abp/BackgroundJobs/BackgroundJobRecord.cs +++ b/modules/background-jobs/src/Volo.Abp.BackgroundJobs.Domain/Volo/Abp/BackgroundJobs/BackgroundJobRecord.cs @@ -6,6 +6,11 @@ namespace Volo.Abp.BackgroundJobs; public class BackgroundJobRecord : AggregateRoot, IHasCreationTime { + /// + /// Application name that scheduled this job. + /// + public virtual string ApplicationName { get; set; } + /// /// Type of the job. /// It's AssemblyQualifiedName of job type. diff --git a/modules/background-jobs/src/Volo.Abp.BackgroundJobs.Domain/Volo/Abp/BackgroundJobs/BackgroundJobStore.cs b/modules/background-jobs/src/Volo.Abp.BackgroundJobs.Domain/Volo/Abp/BackgroundJobs/BackgroundJobStore.cs index e29948cc95..c7dbd6fbef 100644 --- a/modules/background-jobs/src/Volo.Abp.BackgroundJobs.Domain/Volo/Abp/BackgroundJobs/BackgroundJobStore.cs +++ b/modules/background-jobs/src/Volo.Abp.BackgroundJobs.Domain/Volo/Abp/BackgroundJobs/BackgroundJobStore.cs @@ -34,10 +34,10 @@ public class BackgroundJobStore : IBackgroundJobStore, ITransientDependency ); } - public virtual async Task> GetWaitingJobsAsync(int maxResultCount) + public virtual async Task> GetWaitingJobsAsync(string applicationName, int maxResultCount) { return ObjectMapper.Map, List>( - await BackgroundJobRepository.GetWaitingListAsync(maxResultCount) + await BackgroundJobRepository.GetWaitingListAsync(applicationName, maxResultCount) ); } diff --git a/modules/background-jobs/src/Volo.Abp.BackgroundJobs.Domain/Volo/Abp/BackgroundJobs/IBackgroundJobRepository.cs b/modules/background-jobs/src/Volo.Abp.BackgroundJobs.Domain/Volo/Abp/BackgroundJobs/IBackgroundJobRepository.cs index b3c552c974..7e189df5c8 100644 --- a/modules/background-jobs/src/Volo.Abp.BackgroundJobs.Domain/Volo/Abp/BackgroundJobs/IBackgroundJobRepository.cs +++ b/modules/background-jobs/src/Volo.Abp.BackgroundJobs.Domain/Volo/Abp/BackgroundJobs/IBackgroundJobRepository.cs @@ -2,11 +2,12 @@ using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; +using JetBrains.Annotations; using Volo.Abp.Domain.Repositories; namespace Volo.Abp.BackgroundJobs; public interface IBackgroundJobRepository : IBasicRepository { - Task> GetWaitingListAsync(int maxResultCount, CancellationToken cancellationToken = default); + Task> GetWaitingListAsync([CanBeNull] string applicationName, int maxResultCount, CancellationToken cancellationToken = default); } diff --git a/modules/background-jobs/src/Volo.Abp.BackgroundJobs.EntityFrameworkCore/Volo/Abp/BackgroundJobs/EntityFrameworkCore/BackgroundJobsDbContextModelCreatingExtensions.cs b/modules/background-jobs/src/Volo.Abp.BackgroundJobs.EntityFrameworkCore/Volo/Abp/BackgroundJobs/EntityFrameworkCore/BackgroundJobsDbContextModelCreatingExtensions.cs index 5b51c8809d..53a2c53843 100644 --- a/modules/background-jobs/src/Volo.Abp.BackgroundJobs.EntityFrameworkCore/Volo/Abp/BackgroundJobs/EntityFrameworkCore/BackgroundJobsDbContextModelCreatingExtensions.cs +++ b/modules/background-jobs/src/Volo.Abp.BackgroundJobs.EntityFrameworkCore/Volo/Abp/BackgroundJobs/EntityFrameworkCore/BackgroundJobsDbContextModelCreatingExtensions.cs @@ -22,6 +22,7 @@ public static class BackgroundJobsDbContextModelCreatingExtensions b.ConfigureByConvention(); + b.Property(x => x.ApplicationName).IsRequired(false).HasMaxLength(BackgroundJobRecordConsts.MaxApplicationNameLength); b.Property(x => x.JobName).IsRequired().HasMaxLength(BackgroundJobRecordConsts.MaxJobNameLength); b.Property(x => x.JobArgs).IsRequired().HasMaxLength(BackgroundJobRecordConsts.MaxJobArgsLength); b.Property(x => x.TryCount).HasDefaultValue(0); diff --git a/modules/background-jobs/src/Volo.Abp.BackgroundJobs.EntityFrameworkCore/Volo/Abp/BackgroundJobs/EntityFrameworkCore/EfCoreBackgroundJobRepository.cs b/modules/background-jobs/src/Volo.Abp.BackgroundJobs.EntityFrameworkCore/Volo/Abp/BackgroundJobs/EntityFrameworkCore/EfCoreBackgroundJobRepository.cs index a2be3c6e1e..a81de3cdfb 100644 --- a/modules/background-jobs/src/Volo.Abp.BackgroundJobs.EntityFrameworkCore/Volo/Abp/BackgroundJobs/EntityFrameworkCore/EfCoreBackgroundJobRepository.cs +++ b/modules/background-jobs/src/Volo.Abp.BackgroundJobs.EntityFrameworkCore/Volo/Abp/BackgroundJobs/EntityFrameworkCore/EfCoreBackgroundJobRepository.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; +using JetBrains.Annotations; using Microsoft.EntityFrameworkCore; using Volo.Abp.Domain.Repositories.EntityFrameworkCore; using Volo.Abp.EntityFrameworkCore; @@ -22,17 +23,16 @@ public class EfCoreBackgroundJobRepository : EfCoreRepository> GetWaitingListAsync( - int maxResultCount, - CancellationToken cancellationToken = default) + public virtual async Task> GetWaitingListAsync([CanBeNull] string applicationName, int maxResultCount, CancellationToken cancellationToken = default) { - return await (await GetWaitingListQueryAsync(maxResultCount)).ToListAsync(GetCancellationToken(cancellationToken)); + return await (await GetWaitingListQueryAsync(applicationName, maxResultCount)).ToListAsync(GetCancellationToken(cancellationToken)); } - protected virtual async Task> GetWaitingListQueryAsync(int maxResultCount) + protected virtual async Task> GetWaitingListQueryAsync([CanBeNull] string applicationName, int maxResultCount) { var now = Clock.Now; return (await GetDbSetAsync()) + .Where(t => t.ApplicationName == applicationName) .Where(t => !t.IsAbandoned && t.NextTryTime <= now) .OrderByDescending(t => t.Priority) .ThenBy(t => t.TryCount) diff --git a/modules/background-jobs/src/Volo.Abp.BackgroundJobs.Installer/InstallationNotes.md b/modules/background-jobs/src/Volo.Abp.BackgroundJobs.Installer/InstallationNotes.md new file mode 100644 index 0000000000..953695c647 --- /dev/null +++ b/modules/background-jobs/src/Volo.Abp.BackgroundJobs.Installer/InstallationNotes.md @@ -0,0 +1,12 @@ +# Installation Notes for Background Jobs Module + +Background jobs are used to queue some tasks to be executed in the background. You may need background jobs for several reasons. Here are some examples: + +- To perform **long-running tasks** without having the users wait. For example, a user presses a 'report' button to start a long-running reporting job. You add this job to the **queue** and send the report's result to your user via email when it's completed. +- To create **re-trying** and **persistent tasks** to **guarantee** that a code will be **successfully executed**. For example, you can send emails in a background job to overcome **temporary failures** and **guarantee** that it eventually will be sent. That way users do not wait while sending emails. + +Background jobs are **persistent** that means they will be **re-tried** and **executed** later even if your application crashes. + +## Documentation + +For detailed information and usage instructions, please visit the [Background Jobs documentation](https://abp.io/docs/latest/framework/infrastructure/background-jobs). \ No newline at end of file diff --git a/modules/background-jobs/src/Volo.Abp.BackgroundJobs.MongoDB/Volo/Abp/BackgroundJobs/MongoDB/MongoBackgroundJobRepository.cs b/modules/background-jobs/src/Volo.Abp.BackgroundJobs.MongoDB/Volo/Abp/BackgroundJobs/MongoDB/MongoBackgroundJobRepository.cs index a3f46643fe..71a5680524 100644 --- a/modules/background-jobs/src/Volo.Abp.BackgroundJobs.MongoDB/Volo/Abp/BackgroundJobs/MongoDB/MongoBackgroundJobRepository.cs +++ b/modules/background-jobs/src/Volo.Abp.BackgroundJobs.MongoDB/Volo/Abp/BackgroundJobs/MongoDB/MongoBackgroundJobRepository.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; using System.Linq; +using JetBrains.Annotations; using MongoDB.Driver; using MongoDB.Driver.Linq; using Volo.Abp.Domain.Repositories.MongoDB; @@ -23,17 +24,16 @@ public class MongoBackgroundJobRepository : MongoDbRepository> GetWaitingListAsync( - int maxResultCount, - CancellationToken cancellationToken = default) + public virtual async Task> GetWaitingListAsync([CanBeNull] string applicationName, int maxResultCount, CancellationToken cancellationToken = default) { - return await (await GetWaitingListQuery(maxResultCount)).ToListAsync(GetCancellationToken(cancellationToken)); + return await (await GetWaitingListQuery(applicationName, maxResultCount, cancellationToken)).ToListAsync(GetCancellationToken(cancellationToken)); } - protected virtual async Task> GetWaitingListQuery(int maxResultCount, CancellationToken cancellationToken = default) + protected virtual async Task> GetWaitingListQuery([CanBeNull] string applicationName, int maxResultCount, CancellationToken cancellationToken = default) { var now = Clock.Now; return (await GetQueryableAsync(cancellationToken)) + .Where(t => t.ApplicationName == applicationName) .Where(t => !t.IsAbandoned && t.NextTryTime <= now) .OrderByDescending(t => t.Priority) .ThenBy(t => t.TryCount) diff --git a/modules/background-jobs/test/Volo.Abp.BackgroundJobs.TestBase/Volo/Abp/BackgroundJobs/BackgroundJobRepository_Tests.cs b/modules/background-jobs/test/Volo.Abp.BackgroundJobs.TestBase/Volo/Abp/BackgroundJobs/BackgroundJobRepository_Tests.cs index 02e4fa9d60..c62cb43309 100644 --- a/modules/background-jobs/test/Volo.Abp.BackgroundJobs.TestBase/Volo/Abp/BackgroundJobs/BackgroundJobRepository_Tests.cs +++ b/modules/background-jobs/test/Volo.Abp.BackgroundJobs.TestBase/Volo/Abp/BackgroundJobs/BackgroundJobRepository_Tests.cs @@ -1,4 +1,5 @@ -using System.Threading.Tasks; +using System.Linq; +using System.Threading.Tasks; using Shouldly; using Volo.Abp.Modularity; using Volo.Abp.Timing; @@ -23,12 +24,16 @@ public abstract class BackgroundJobRepository_Tests : Background [InlineData(5)] public async Task GetWaitingListAsync(int maxResultCount) { - var backgroundJobs = await _backgroundJobRepository.GetWaitingListAsync(maxResultCount); + var backgroundJobs = await _backgroundJobRepository.GetWaitingListAsync("App1", maxResultCount); backgroundJobs.Count.ShouldBeGreaterThan(0); backgroundJobs.Count.ShouldBeLessThanOrEqualTo(maxResultCount); backgroundJobs.ForEach(j => j.IsAbandoned.ShouldBeFalse()); backgroundJobs.ForEach(j => j.NextTryTime.ShouldBeLessThanOrEqualTo(_clock.Now.AddSeconds(1))); //1 second tolerance + + backgroundJobs.All(j => j.ApplicationName == "App1").ShouldBeTrue(); + backgroundJobs.Any(j => j.ApplicationName == "App2").ShouldBeFalse(); + backgroundJobs.Any(j => j.ApplicationName == null).ShouldBeFalse(); } } diff --git a/modules/background-jobs/test/Volo.Abp.BackgroundJobs.TestBase/Volo/Abp/BackgroundJobs/BackgroundJobsTestDataBuilder.cs b/modules/background-jobs/test/Volo.Abp.BackgroundJobs.TestBase/Volo/Abp/BackgroundJobs/BackgroundJobsTestDataBuilder.cs index 079a0ab3ea..f6f4c37e12 100644 --- a/modules/background-jobs/test/Volo.Abp.BackgroundJobs.TestBase/Volo/Abp/BackgroundJobs/BackgroundJobsTestDataBuilder.cs +++ b/modules/background-jobs/test/Volo.Abp.BackgroundJobs.TestBase/Volo/Abp/BackgroundJobs/BackgroundJobsTestDataBuilder.cs @@ -26,6 +26,7 @@ public class BackgroundJobsTestDataBuilder : ITransientDependency await _backgroundJobRepository.InsertAsync( new BackgroundJobRecord(_testData.JobId1) { + ApplicationName = "App1", JobName = "TestJobName", JobArgs = "{ value: 1 }", NextTryTime = _clock.Now.Subtract(TimeSpan.FromMinutes(1)), @@ -40,6 +41,7 @@ public class BackgroundJobsTestDataBuilder : ITransientDependency await _backgroundJobRepository.InsertAsync( new BackgroundJobRecord(_testData.JobId2) { + ApplicationName = "App2", JobName = "TestJobName", JobArgs = "{ value: 2 }", NextTryTime = _clock.Now.AddMinutes(42), @@ -54,6 +56,7 @@ public class BackgroundJobsTestDataBuilder : ITransientDependency await _backgroundJobRepository.InsertAsync( new BackgroundJobRecord(_testData.JobId3) { + ApplicationName = "App1", JobName = "TestJobName", JobArgs = "{ value: 3 }", NextTryTime = _clock.Now, diff --git a/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.WebAssembly.BasicTheme/Themes/Basic/WebAssemblyRedirectToLogin.razor b/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.WebAssembly.BasicTheme/Themes/Basic/WebAssemblyRedirectToLogin.razor index 97e0eb2995..f4f3e152ce 100644 --- a/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.WebAssembly.BasicTheme/Themes/Basic/WebAssemblyRedirectToLogin.razor +++ b/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.WebAssembly.BasicTheme/Themes/Basic/WebAssemblyRedirectToLogin.razor @@ -15,7 +15,7 @@ { if (AbpAspNetCoreComponentsWebOptions.Value.IsBlazorWebApp) { - Navigation.NavigateTo(AuthenticationOptions.Value.LogoutUrl, forceLoad: true); + Navigation.NavigateTo(AuthenticationOptions.Value.LoginUrl, forceLoad: true); } else { diff --git a/modules/basic-theme/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Installer/InstallationNotes.md b/modules/basic-theme/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Installer/InstallationNotes.md new file mode 100644 index 0000000000..dc655f430f --- /dev/null +++ b/modules/basic-theme/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Installer/InstallationNotes.md @@ -0,0 +1,13 @@ +# Installation Notes for Basic Theme Module (MVC) + +The Basic Theme is a theme implementation for the ASP.NET Core MVC / Razor Pages UI. It is a minimalist theme that doesn't add any styling on top of the plain [Bootstrap](https://getbootstrap.com/). You can take the Basic Theme as the base theme and build your own theme or styling on top of it. See the Customization section. + +The Basic Theme has RTL (Right-to-Left language) support. + +If you are looking for a professional, enterprise ready theme, you can check the [Lepton Theme](https://abp.io/themes), which is a part of the ABP. + +See the [Theming document](https://github.com/abpframework/abp/blob/rel-9.1/docs/en/framework/ui/mvc-razor-pages/theming.md) to learn about themes. + +## Documentation + +For detailed information and usage instructions, please visit the [Basic Theme documentation](https://abp.io/docs/latest/framework/ui/mvc-razor-pages/basic-theme). \ No newline at end of file diff --git a/modules/basic-theme/src/Volo.Abp.BasicTheme.Installer/InstallationNotes.md b/modules/basic-theme/src/Volo.Abp.BasicTheme.Installer/InstallationNotes.md new file mode 100644 index 0000000000..088628d830 --- /dev/null +++ b/modules/basic-theme/src/Volo.Abp.BasicTheme.Installer/InstallationNotes.md @@ -0,0 +1,7 @@ +# Installation Notes for Basic Theme Module (Blazor) + +The Basic Theme is a theme implementation for the Blazor UI. It is a minimalist theme that doesn't add any styling on top of the plain [Bootstrap](https://getbootstrap.com/). You can take the Basic Theme as the base theme and build your own theme or styling on top of it. See the Customization section. + +## Documentation + +For detailed information and usage instructions, please visit the [Blazor UI Basic Theme documentation](https://abp.io/docs/latest/framework/ui/blazor/basic-theme?UI=BlazorServer). \ No newline at end of file diff --git a/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/package.json b/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/package.json index a57f59df9b..ec32f363dc 100644 --- a/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/package.json +++ b/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/package.json @@ -3,8 +3,8 @@ "name": "asp.net", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.shared": "~9.1.0-rc.3", - "@abp/prismjs": "~9.1.0-rc.3", - "@abp/highlight.js": "~9.1.0-rc.3" + "@abp/aspnetcore.mvc.ui.theme.shared": "~9.1.0", + "@abp/prismjs": "~9.1.0", + "@abp/highlight.js": "~9.1.0" } } diff --git a/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/yarn.lock b/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/yarn.lock index da3f1fe0f2..52db1821a9 100644 --- a/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/yarn.lock +++ b/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/yarn.lock @@ -2,212 +2,212 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.shared@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-9.1.0-rc.3.tgz#c05d8b39fc1ef2a9c890c480cb1ec8f47ee10669" - integrity sha512-BTLoVlaYjKrW0Rhrqw4tNiHf5LV8/zBxh90OM7smKYPGOftHhSWSNUUSO5upOdOsVhNSPIxY83PF/LHp29kH8g== - dependencies: - "@abp/aspnetcore.mvc.ui" "~9.1.0-rc.3" - "@abp/bootstrap" "~9.1.0-rc.3" - "@abp/bootstrap-datepicker" "~9.1.0-rc.3" - "@abp/bootstrap-daterangepicker" "~9.1.0-rc.3" - "@abp/datatables.net-bs5" "~9.1.0-rc.3" - "@abp/font-awesome" "~9.1.0-rc.3" - "@abp/jquery-form" "~9.1.0-rc.3" - "@abp/jquery-validation-unobtrusive" "~9.1.0-rc.3" - "@abp/lodash" "~9.1.0-rc.3" - "@abp/luxon" "~9.1.0-rc.3" - "@abp/malihu-custom-scrollbar-plugin" "~9.1.0-rc.3" - "@abp/moment" "~9.1.0-rc.3" - "@abp/select2" "~9.1.0-rc.3" - "@abp/sweetalert2" "~9.1.0-rc.3" - "@abp/timeago" "~9.1.0-rc.3" - "@abp/toastr" "~9.1.0-rc.3" - -"@abp/aspnetcore.mvc.ui@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-9.1.0-rc.3.tgz#88252e0fb822fe9560ed89d2118c7b32a32ba496" - integrity sha512-WGjWNoN97uxjMc173w36UV8UVGxLbDrOcglnqK+RY+E9vIxFGDmWBvwzmJ1KfZRvlwahXtMjTCiYFKO411lh1w== +"@abp/aspnetcore.mvc.ui.theme.shared@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-9.1.0.tgz#35a73580b9b67a33708f2cf897243b50c9ad7100" + integrity sha512-rggTYL9poOFICsOseDX22JNhD0KWH8Oxs0YH91TZjvm/F67cPemW99eBlJc/YdJ7bN6icRiebN8m81y9MSanyg== + dependencies: + "@abp/aspnetcore.mvc.ui" "~9.1.0" + "@abp/bootstrap" "~9.1.0" + "@abp/bootstrap-datepicker" "~9.1.0" + "@abp/bootstrap-daterangepicker" "~9.1.0" + "@abp/datatables.net-bs5" "~9.1.0" + "@abp/font-awesome" "~9.1.0" + "@abp/jquery-form" "~9.1.0" + "@abp/jquery-validation-unobtrusive" "~9.1.0" + "@abp/lodash" "~9.1.0" + "@abp/luxon" "~9.1.0" + "@abp/malihu-custom-scrollbar-plugin" "~9.1.0" + "@abp/moment" "~9.1.0" + "@abp/select2" "~9.1.0" + "@abp/sweetalert2" "~9.1.0" + "@abp/timeago" "~9.1.0" + "@abp/toastr" "~9.1.0" + +"@abp/aspnetcore.mvc.ui@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-9.1.0.tgz#38d058ab148a36ad4d63870e8a501ca339e4a70e" + integrity sha512-lUw1ij87KJp+Rj4cz8oSQkdRuoMq76l/wIAGwtXH+EOKusVpSJTOTioAV/tPKeKZ15ubE4bO5jWcQGxZkXgH3w== dependencies: ansi-colors "^4.1.3" -"@abp/bootstrap-datepicker@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-9.1.0-rc.3.tgz#8376fb204851b8e7be6fb5afe6e023f706426bc2" - integrity sha512-bKPeRpqzHlSCnItxesp+QnAewFcwuB1hmncRydhOg9ImvzRN0M9fAfSXeP7VTYH+2ygDKVEtK+8aAh1RjAryuA== +"@abp/bootstrap-datepicker@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-9.1.0.tgz#96a1875a2b92f03b8f90f7842ebf8849cf8a4d04" + integrity sha512-3FQm1SK8qmzoP7LOvXkZpq1AzrdPHKRdQJjoqK9N+lQxQjNfOxEFMxeDSg6WJKO619Cnve++jAyMidojXlCiwQ== dependencies: bootstrap-datepicker "^1.10.0" -"@abp/bootstrap-daterangepicker@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-9.1.0-rc.3.tgz#f14dd37eb7a4fe4d6cb823da1ee80dc28154d0df" - integrity sha512-C7KXx1630JK4mOrMZEQoiH4vzQZn6JfrS6k8nAX0p48zRNcx8oxwviaojRcu+MjDl/rDHc5U9Xy9lBIurqLEKg== +"@abp/bootstrap-daterangepicker@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-9.1.0.tgz#1993c539837eb31de174cba9f0bccd441a98f209" + integrity sha512-jS1jTqP6KCXQYX9xZpDAI07C94nwzXrNJD3H0pJXsXoOva3TTBQDD8khf6RDb7tiZrkrNJqmMyUiCfVTDbO7zg== dependencies: bootstrap-daterangepicker "^3.1.0" -"@abp/bootstrap@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-9.1.0-rc.3.tgz#01be98456635982e5b43a49318d0bcc55163fad7" - integrity sha512-Xi2TPaReFl3vnnFW974Cc4Sb25Iq+RwzkoGXiJFUiwGgYHbHHCd5Jd9Af6KYNchjP9SJKFYELwKZcQdxEIHauQ== +"@abp/bootstrap@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-9.1.0.tgz#a06c1cd4c11554c29973db70c6a383efebb10b4e" + integrity sha512-r6onkBnpqoWrdYLDVZTiqgQBvH5UZerYRrPB3Ky+RkXJhgwn7AM3LAVrB42sIvFZRNbwOlvuAL+a0+5yDOH67Q== dependencies: - "@abp/core" "~9.1.0-rc.3" + "@abp/core" "~9.1.0" bootstrap "^5.3.3" -"@abp/clipboard@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-9.1.0-rc.3.tgz#85b38876ba259a235acfcea8bb85c0bf9309fa5c" - integrity sha512-3FSLFOpySYQfmlMlrhSEdC8mnLDUtXRBXwWNIBJMTNEKAt0E2Z/2TIefaPzPYzYkqNrXlq8qdOOkvxFm39y8WQ== +"@abp/clipboard@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-9.1.0.tgz#5d5678ef7e8c355715c5a74e4aabd0a21d5e6cbe" + integrity sha512-1TxZbB/q5DPeLhYzrc6y0OVekxnjM+CRH/Gu8nAXQMX46XjdTboXvBtvgKHV1aCznGNsWyjd5A2O5G/XGg9NNw== dependencies: - "@abp/core" "~9.1.0-rc.3" + "@abp/core" "~9.1.0" clipboard "^2.0.11" -"@abp/core@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-9.1.0-rc.3.tgz#4749bd60813ddceb156dec045e7f9eb0b3e19446" - integrity sha512-xYr9zbHCz+v672AuFWSmvqeo0CgAwZTr9laAp58QOCzO2QsVHuDUy60epGhIxCTRc3iCBkcelIFDFlGrN30WSw== +"@abp/core@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-9.1.0.tgz#af78fc096932d4ec45216b5e910c87a72e479b1f" + integrity sha512-6P0KGh5+IqlhQnUOyzaGaKrKzOAm1G0gg8Ay3DXyW2ksY6Zr+lyi5cxNsSi4ix1dicqfydIKvLfV+DF3mQf/dw== dependencies: - "@abp/utils" "~9.1.0-rc.3" + "@abp/utils" "~9.1.0" -"@abp/datatables.net-bs5@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-9.1.0-rc.3.tgz#984d6550124cf0221f8233306483aff72a38249e" - integrity sha512-qJ777clztaau92sLvDgsxIQdKnFpZqQqn3/N2y81eixELm/t/qRiE0ySNduNDnvzik6/uWmfnG82ToCmmTFP2g== +"@abp/datatables.net-bs5@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-9.1.0.tgz#3b2e7d68e947db3d3432ab5e8bff4da89a85d05d" + integrity sha512-zBrzOrfvTPJcc6mvHZDPVdXbWesKU0lKlrb7vuBZxWjrFNwVC0d/KNJPcYVvyQ3zf9rrQB5Xg0MDgu0k5Tt7tQ== dependencies: - "@abp/datatables.net" "~9.1.0-rc.3" + "@abp/datatables.net" "~9.1.0" datatables.net-bs5 "^2.1.8" -"@abp/datatables.net@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-9.1.0-rc.3.tgz#5495345014b6dc3faa67415b2c37ee84b1e4dbbc" - integrity sha512-jKn9DIQrlxMU/dedYaFjfHADPuMfs+6nUojYDGUPd76Ov1TKFNA0N/6ipB7UMYd3xVPEEmgkBH8pqf0qR8D64w== +"@abp/datatables.net@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-9.1.0.tgz#12d6e1412aac4a2e0a61437dcdfbfbe1add7fed7" + integrity sha512-lYRvEZUkntaI+dS9Xkz23Z54eDeZ1R4Wzhqcg6VIsz3iO5kYAa5GiQjcOiBssNGJSLuaet6R5Pqh1ThEUjfvvA== dependencies: - "@abp/jquery" "~9.1.0-rc.3" + "@abp/jquery" "~9.1.0" datatables.net "^2.1.8" -"@abp/font-awesome@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-9.1.0-rc.3.tgz#259dcac2f20da57a72b9c41129c465935abc125f" - integrity sha512-fAExSAn0VaPWfx9kPwIKB0xbSSMHZst/NiNXRPhIrCGty/PXp5OV8ao+mqKcsLQJTPFz1RaSxpdq/1s3tAiGWQ== +"@abp/font-awesome@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-9.1.0.tgz#af21ff2d7c332deb1df626404b53a78d790ba842" + integrity sha512-HcJzDCACGejOIvhxsorCdaesyDHnupR/sl5YFCsGikSqATyOSKQy4pw8wKsb1z+FCT5JYCTR7ROJ3lB1lTEgZw== dependencies: - "@abp/core" "~9.1.0-rc.3" + "@abp/core" "~9.1.0" "@fortawesome/fontawesome-free" "^6.6.0" -"@abp/highlight.js@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/highlight.js/-/highlight.js-9.1.0-rc.3.tgz#2d62125646651add2d2ba6ecc36d72904da160d4" - integrity sha512-gK7Nksk0Zf8x2CL4D5plptLNYCYrZo4cMFiQmarN9TTY41jQqoItrdAInPoWB3b+0AgMlo/pYjzxXHIZLItLBA== +"@abp/highlight.js@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/highlight.js/-/highlight.js-9.1.0.tgz#baed72c6ca38fd888b49174e632788c681306dce" + integrity sha512-kV6BFYESIIOJOJ1I9I3xUdLftrIkK8vZlIaBupJobxzNeOXh4/VRIVJE75xRXyMSmJRSMOZm8pjNoQsuKDgT3w== dependencies: - "@abp/core" "~9.1.0-rc.3" + "@abp/core" "~9.1.0" "@highlightjs/cdn-assets" "~11.10.0" -"@abp/jquery-form@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-9.1.0-rc.3.tgz#c1ee21a5f38dcf0fdbb0c3e2db3f66bc81ae66b1" - integrity sha512-YJ2CDjJVbNpqs88CGgsHnPtJG4BjYLQ0XFVT+Ph9ar5YnuQrYfB60HMdtnQlqn337hkbzVx2XHLJ6h0tT8To9Q== +"@abp/jquery-form@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-9.1.0.tgz#bdb96436c54b2a09ac4259db97e1e577410e1fc3" + integrity sha512-xjHXWstVY6B3MPB4/8g0EJeHlVvlV010OMZKFmfCGLFi6aHAEKqqWh1rMItAiVuSmCCzL0m/208ZkpoCI++jGQ== dependencies: - "@abp/jquery" "~9.1.0-rc.3" + "@abp/jquery" "~9.1.0" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-9.1.0-rc.3.tgz#88976407a14276244a01a24daeda6b236298e917" - integrity sha512-Yac7l/rjHxdogPyMO8LlJklndDBCwZ+qLeTbCcYt7NQnnsnn+xXomSwjFWv8sguTVKG1eL68LquGUCbNwNfrUA== +"@abp/jquery-validation-unobtrusive@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-9.1.0.tgz#798551e7c14ba286a819a48804107a53e974c1ee" + integrity sha512-TggKckfbLtB7Ig2kNt2kH//GaJUns8OZbpdKdh7vCWIAGedw2FLNCABCpoGnyNp0s/dVOtdyxRl9eFRN3+a4tw== dependencies: - "@abp/jquery-validation" "~9.1.0-rc.3" + "@abp/jquery-validation" "~9.1.0" jquery-validation-unobtrusive "^4.0.0" -"@abp/jquery-validation@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-9.1.0-rc.3.tgz#1ff99dea2f2c52e58a50d06b51e0cbca15ff690c" - integrity sha512-YB1t1m+s+vHGuxSt0h4cgIMIpwRy129pjV08Jja1QtCFhE+VgA9hjvx0OVaVcm31aLLt/KU/+NrO36AbebL+zA== +"@abp/jquery-validation@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-9.1.0.tgz#b771652377fbfb3c92ce03b7b7c069a3bb2ae70b" + integrity sha512-bmPSOHcxjitB8NkiLv0SxxuSS3FlCq9SiTUGvsT8nOStDsm+KpyYSzZQq8LSCyqWWj54tlOARTfcD4tMK7/K3Q== dependencies: - "@abp/jquery" "~9.1.0-rc.3" + "@abp/jquery" "~9.1.0" jquery-validation "^1.21.0" -"@abp/jquery@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-9.1.0-rc.3.tgz#0386a2857271dc4c1e04da9e4b304637bbc2d696" - integrity sha512-1UqztwQ92m6kvYE+Tb0rj7iITHngKdGI5kEpZKOHrEWqnMKeEoPbO1cL+ZOWN0m162WJiliod1HEOxW8b9Ha2Q== +"@abp/jquery@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-9.1.0.tgz#952b61ea3e4a99e6551f667297dbb637d83f3c50" + integrity sha512-Ulw8ClAbqmxceNYCb76bR6dq7e9b7Hs6mjlEy05zdbsSNuZW3UoycsJ+BquXi+dUNBo6OppqEmhVeiIjAKTaFg== dependencies: - "@abp/core" "~9.1.0-rc.3" + "@abp/core" "~9.1.0" jquery "~3.7.1" -"@abp/lodash@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-9.1.0-rc.3.tgz#26f53847ed05a171d71c6c6f1ba33d8c4e2a624a" - integrity sha512-eUuNYTk6hla5kOdc5lOBVoKhMBfnkfXdawb+/LtwBwjCQym+XRTCenJhqzxii293xwd+0G1l5M+8VaPWFq6WWg== +"@abp/lodash@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-9.1.0.tgz#62c784bd99c9e1ccfa82905e843375c594ef8584" + integrity sha512-cCE3ZwwWcPrh+ccKx4AS1USL1ttbrXBqci/l+ROjXhFzrs6GYnhI0+30xRZgPdPRm3U3nGPrSaDAU7UuHkRScg== dependencies: - "@abp/core" "~9.1.0-rc.3" + "@abp/core" "~9.1.0" lodash "^4.17.21" -"@abp/luxon@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-9.1.0-rc.3.tgz#0cfae9b2188c9827963e693dbfaaefcce714bdd9" - integrity sha512-UxtDDyLvHr3sPhrWX+uj9JrsN6idYKH+srOmAKC8+FOfWW/YdFAJmsYPLMCov7FoSWXHG+BQhkuXeCCBppyiVA== +"@abp/luxon@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-9.1.0.tgz#b246f3627bbc7ce41b7878fce1679da473b0e0ae" + integrity sha512-AouS/qEK+i69hwr4XtUOCepONLuR+1gdHFb50RpOEbUoDfTYmYpxPBdiICmZPeJ3CExErITPZxzzngCnKPPOUw== dependencies: - "@abp/core" "~9.1.0-rc.3" + "@abp/core" "~9.1.0" luxon "^3.5.0" -"@abp/malihu-custom-scrollbar-plugin@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-9.1.0-rc.3.tgz#08071e21260f867fc2a7d7594dcdf30da921bb47" - integrity sha512-WDWcm4JsTzq4Se8Sg+v6U5ymjbfVOXsU2WR66RSUL8TSq3WM1MLuRaStDGxtt8nOLvPfqiPWIzb2BvsfyePNRw== +"@abp/malihu-custom-scrollbar-plugin@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-9.1.0.tgz#288ae1916a78100f2c728dfd05a560ee99fafae4" + integrity sha512-McdMRDtbTZBjp//3GMVjRjkc16HNYDEdPc2ar1xrY817e0tEln6/TBkItAcfOvjso0TsLcvlNL1+1bjbMjj8OA== dependencies: - "@abp/core" "~9.1.0-rc.3" + "@abp/core" "~9.1.0" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/moment@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-9.1.0-rc.3.tgz#3cb5b000be73e4d681d3d115be98a8422a66e307" - integrity sha512-K30pG1xRGOJ5m7rJI6u5hKv5Lcjmqxqx7cekDf9HURzgpBGLCvMnnXFSx97w0LcPOYzCVxorfTdw6S3sC12idw== +"@abp/moment@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-9.1.0.tgz#f3c0ae02209e496913cda53df752dabc5be648bd" + integrity sha512-WxR1l09vwxRhqyvAVP4m4IBOFjIC4pzLOmelloqES+gL/klw+T/AmY21Z/z+OV0p7aJ3V3Q1aQStuMCDCyGFnQ== dependencies: moment "^2.30.1" -"@abp/prismjs@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-9.1.0-rc.3.tgz#f77e1d264ef5b6c1ceb7bd1b4aee19bfce6e723b" - integrity sha512-/vtoR5oyEiVVvLPPsAS5qSI4THle/WqETTTTInpeVx6u/NEbeY9sBAUz+udS/fWJlyxIUN6He56ghoJNaWXYJw== +"@abp/prismjs@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-9.1.0.tgz#40b688c82ae808ef92516ea5731ccb38c19d2384" + integrity sha512-trSW1K6VtIEaAyxe7umQGimCTLrgdT6DwSiQ8PONvKa8WR5ZmzSDU7lK8SliorufkbWtdkjCvuXB81NGt3tAhQ== dependencies: - "@abp/clipboard" "~9.1.0-rc.3" - "@abp/core" "~9.1.0-rc.3" + "@abp/clipboard" "~9.1.0" + "@abp/core" "~9.1.0" prismjs "^1.29.0" -"@abp/select2@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-9.1.0-rc.3.tgz#7bd050e4847c0b8366fd582200f27065ecc4ff57" - integrity sha512-0k5P+amCqNE2cPAGQpEwFl+vMssuKSbpZ0XgHfF0z3EcE1bAuYDo41nAfk/amsJn5Dt55xJcC+yesADkAXEeIA== +"@abp/select2@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-9.1.0.tgz#9c2c6751f8506fb375c9b7c42a008c168a8f4c75" + integrity sha512-n6HqsH8aFLMrqL6LJ0gsHFlaq6T1QSt/x7HkkZyhDC7CwhXajxtsJEstDnDF9naHSXX/lerPbrHEgzn2QRMBqg== dependencies: - "@abp/core" "~9.1.0-rc.3" + "@abp/core" "~9.1.0" select2 "^4.0.13" -"@abp/sweetalert2@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-9.1.0-rc.3.tgz#69751518ea84b8a306478f48b516946363a7fa7f" - integrity sha512-iHk6JzD9qzmdvr/LjAwSVFfX1WmipzQNcCYwUB+kKe2uSfwufYz+9+iYjYcm7uVvZSd9LniIvzvQXyZlfMSy5w== +"@abp/sweetalert2@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-9.1.0.tgz#660f9b1db60cc04bde6cadbcf3c55320d20c2f3e" + integrity sha512-z3JMeAwva2vR8qZSRJ/BisQDdAEqjDJ/6oIGu/JYXQEchO1Lnd9UMV376nc3crLJdnyRRO7Qs6zx4FfVOCH0kw== dependencies: - "@abp/core" "~9.1.0-rc.3" + "@abp/core" "~9.1.0" sweetalert2 "^11.14.1" -"@abp/timeago@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-9.1.0-rc.3.tgz#b1eb20d6c9fe47a6d0ace8565ea8289f1af9c0a1" - integrity sha512-7hq2+HHQ91/xXFGK417dkgFNKU7z49bVN7tkHLMJyKkJb1iP3N0gCz3HdkCRjnM6yrRXQDYUmO/zCv6yBwakjA== +"@abp/timeago@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-9.1.0.tgz#496e40153241bae5d418d79cc6c65c9db6306447" + integrity sha512-a/UAYQ2GrhYFGx4p0hqr3x+teBqnjnOiWJEPq9//RTlz+EZ+OUyHbJrcUtqZRvaGJtOAsfmljD3jYnOXUlU7DA== dependencies: - "@abp/jquery" "~9.1.0-rc.3" + "@abp/jquery" "~9.1.0" timeago "^1.6.7" -"@abp/toastr@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-9.1.0-rc.3.tgz#de490bfd6b41919d96be0544aaaee3d457cf9f32" - integrity sha512-hLe3FXyplQmhRbvBZdLVt+6yRAfptAJzwU2S5iHbs5r4ncO1ampCClZNNLNmrCglDQ30ZkgrPg4SjHn9V6HyIQ== +"@abp/toastr@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-9.1.0.tgz#501cbe211164b2e7416a2d4878cb34aed3550b7c" + integrity sha512-BkTDuU0p9Qa4+HT9CYwiPQjVTrbTSNBgQ18h69S3lIadLJwdC6pXeLbL9bhe+5fiuhq2f+0Oqo3X75LNEgzHkw== dependencies: - "@abp/jquery" "~9.1.0-rc.3" + "@abp/jquery" "~9.1.0" toastr "^2.1.4" -"@abp/utils@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-9.1.0-rc.3.tgz#84de6ab4497c74b2c0c04f604dc6d542a50a1534" - integrity sha512-Tw9gNUAFjmieVrnril7YxwqthpSkZiY01uW60/+Dkd3jh9qZntqgzIcKG6/TXjimWK6iN8YZFOJ0cShCnHW0Jg== +"@abp/utils@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-9.1.0.tgz#a4fd37d943df18b5c11f5d4869efd5d8882b7959" + integrity sha512-+UZo0ocTEZlRO41SzzHNdinjdFUDVq8wYZSj5BA1bqCVeWYhfjI2+rl9DuogCN8UEuCACA4K/qb4XcE/untQ3g== dependencies: just-compare "^2.3.0" diff --git a/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo/package.json b/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo/package.json index 630d24cc5e..ba5af1ba94 100644 --- a/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo/package.json +++ b/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo/package.json @@ -3,8 +3,8 @@ "name": "asp.net", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "~9.1.0-rc.3", - "@abp/prismjs": "~9.1.0-rc.3" + "@abp/aspnetcore.mvc.ui.theme.basic": "~9.1.0", + "@abp/prismjs": "~9.1.0" }, "devDependencies": {} } diff --git a/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo/yarn.lock b/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo/yarn.lock index c10db32b25..7f5281eb00 100644 --- a/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo/yarn.lock +++ b/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo/yarn.lock @@ -2,211 +2,211 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.basic@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-9.1.0-rc.3.tgz#c291f2760d32a9745c4b15a62c13abec9b7e247f" - integrity sha512-f14SIEfZkvSgYBfM/rcDmn0mgkIHGqi6lRP7GeBRUPEhB944osyCFmJH3CWDjJcjTFbqWTvKVlDRsV0Roz5eqg== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~9.1.0-rc.3" - -"@abp/aspnetcore.mvc.ui.theme.shared@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-9.1.0-rc.3.tgz#c05d8b39fc1ef2a9c890c480cb1ec8f47ee10669" - integrity sha512-BTLoVlaYjKrW0Rhrqw4tNiHf5LV8/zBxh90OM7smKYPGOftHhSWSNUUSO5upOdOsVhNSPIxY83PF/LHp29kH8g== - dependencies: - "@abp/aspnetcore.mvc.ui" "~9.1.0-rc.3" - "@abp/bootstrap" "~9.1.0-rc.3" - "@abp/bootstrap-datepicker" "~9.1.0-rc.3" - "@abp/bootstrap-daterangepicker" "~9.1.0-rc.3" - "@abp/datatables.net-bs5" "~9.1.0-rc.3" - "@abp/font-awesome" "~9.1.0-rc.3" - "@abp/jquery-form" "~9.1.0-rc.3" - "@abp/jquery-validation-unobtrusive" "~9.1.0-rc.3" - "@abp/lodash" "~9.1.0-rc.3" - "@abp/luxon" "~9.1.0-rc.3" - "@abp/malihu-custom-scrollbar-plugin" "~9.1.0-rc.3" - "@abp/moment" "~9.1.0-rc.3" - "@abp/select2" "~9.1.0-rc.3" - "@abp/sweetalert2" "~9.1.0-rc.3" - "@abp/timeago" "~9.1.0-rc.3" - "@abp/toastr" "~9.1.0-rc.3" - -"@abp/aspnetcore.mvc.ui@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-9.1.0-rc.3.tgz#88252e0fb822fe9560ed89d2118c7b32a32ba496" - integrity sha512-WGjWNoN97uxjMc173w36UV8UVGxLbDrOcglnqK+RY+E9vIxFGDmWBvwzmJ1KfZRvlwahXtMjTCiYFKO411lh1w== +"@abp/aspnetcore.mvc.ui.theme.basic@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-9.1.0.tgz#e9e0321037c34b43145dfc7827c422fbf79f59ab" + integrity sha512-vLkyrdFXw0/MPyU2hzqGJJk7trmIlVMdflNIe/rF77UIRmJYHWaTmPt9i5PLN/O4s0jnE9kWlaaJ/VnnFWeGsQ== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~9.1.0" + +"@abp/aspnetcore.mvc.ui.theme.shared@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-9.1.0.tgz#35a73580b9b67a33708f2cf897243b50c9ad7100" + integrity sha512-rggTYL9poOFICsOseDX22JNhD0KWH8Oxs0YH91TZjvm/F67cPemW99eBlJc/YdJ7bN6icRiebN8m81y9MSanyg== + dependencies: + "@abp/aspnetcore.mvc.ui" "~9.1.0" + "@abp/bootstrap" "~9.1.0" + "@abp/bootstrap-datepicker" "~9.1.0" + "@abp/bootstrap-daterangepicker" "~9.1.0" + "@abp/datatables.net-bs5" "~9.1.0" + "@abp/font-awesome" "~9.1.0" + "@abp/jquery-form" "~9.1.0" + "@abp/jquery-validation-unobtrusive" "~9.1.0" + "@abp/lodash" "~9.1.0" + "@abp/luxon" "~9.1.0" + "@abp/malihu-custom-scrollbar-plugin" "~9.1.0" + "@abp/moment" "~9.1.0" + "@abp/select2" "~9.1.0" + "@abp/sweetalert2" "~9.1.0" + "@abp/timeago" "~9.1.0" + "@abp/toastr" "~9.1.0" + +"@abp/aspnetcore.mvc.ui@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-9.1.0.tgz#38d058ab148a36ad4d63870e8a501ca339e4a70e" + integrity sha512-lUw1ij87KJp+Rj4cz8oSQkdRuoMq76l/wIAGwtXH+EOKusVpSJTOTioAV/tPKeKZ15ubE4bO5jWcQGxZkXgH3w== dependencies: ansi-colors "^4.1.3" -"@abp/bootstrap-datepicker@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-9.1.0-rc.3.tgz#8376fb204851b8e7be6fb5afe6e023f706426bc2" - integrity sha512-bKPeRpqzHlSCnItxesp+QnAewFcwuB1hmncRydhOg9ImvzRN0M9fAfSXeP7VTYH+2ygDKVEtK+8aAh1RjAryuA== +"@abp/bootstrap-datepicker@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-9.1.0.tgz#96a1875a2b92f03b8f90f7842ebf8849cf8a4d04" + integrity sha512-3FQm1SK8qmzoP7LOvXkZpq1AzrdPHKRdQJjoqK9N+lQxQjNfOxEFMxeDSg6WJKO619Cnve++jAyMidojXlCiwQ== dependencies: bootstrap-datepicker "^1.10.0" -"@abp/bootstrap-daterangepicker@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-9.1.0-rc.3.tgz#f14dd37eb7a4fe4d6cb823da1ee80dc28154d0df" - integrity sha512-C7KXx1630JK4mOrMZEQoiH4vzQZn6JfrS6k8nAX0p48zRNcx8oxwviaojRcu+MjDl/rDHc5U9Xy9lBIurqLEKg== +"@abp/bootstrap-daterangepicker@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-9.1.0.tgz#1993c539837eb31de174cba9f0bccd441a98f209" + integrity sha512-jS1jTqP6KCXQYX9xZpDAI07C94nwzXrNJD3H0pJXsXoOva3TTBQDD8khf6RDb7tiZrkrNJqmMyUiCfVTDbO7zg== dependencies: bootstrap-daterangepicker "^3.1.0" -"@abp/bootstrap@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-9.1.0-rc.3.tgz#01be98456635982e5b43a49318d0bcc55163fad7" - integrity sha512-Xi2TPaReFl3vnnFW974Cc4Sb25Iq+RwzkoGXiJFUiwGgYHbHHCd5Jd9Af6KYNchjP9SJKFYELwKZcQdxEIHauQ== +"@abp/bootstrap@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-9.1.0.tgz#a06c1cd4c11554c29973db70c6a383efebb10b4e" + integrity sha512-r6onkBnpqoWrdYLDVZTiqgQBvH5UZerYRrPB3Ky+RkXJhgwn7AM3LAVrB42sIvFZRNbwOlvuAL+a0+5yDOH67Q== dependencies: - "@abp/core" "~9.1.0-rc.3" + "@abp/core" "~9.1.0" bootstrap "^5.3.3" -"@abp/clipboard@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-9.1.0-rc.3.tgz#85b38876ba259a235acfcea8bb85c0bf9309fa5c" - integrity sha512-3FSLFOpySYQfmlMlrhSEdC8mnLDUtXRBXwWNIBJMTNEKAt0E2Z/2TIefaPzPYzYkqNrXlq8qdOOkvxFm39y8WQ== +"@abp/clipboard@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-9.1.0.tgz#5d5678ef7e8c355715c5a74e4aabd0a21d5e6cbe" + integrity sha512-1TxZbB/q5DPeLhYzrc6y0OVekxnjM+CRH/Gu8nAXQMX46XjdTboXvBtvgKHV1aCznGNsWyjd5A2O5G/XGg9NNw== dependencies: - "@abp/core" "~9.1.0-rc.3" + "@abp/core" "~9.1.0" clipboard "^2.0.11" -"@abp/core@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-9.1.0-rc.3.tgz#4749bd60813ddceb156dec045e7f9eb0b3e19446" - integrity sha512-xYr9zbHCz+v672AuFWSmvqeo0CgAwZTr9laAp58QOCzO2QsVHuDUy60epGhIxCTRc3iCBkcelIFDFlGrN30WSw== +"@abp/core@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-9.1.0.tgz#af78fc096932d4ec45216b5e910c87a72e479b1f" + integrity sha512-6P0KGh5+IqlhQnUOyzaGaKrKzOAm1G0gg8Ay3DXyW2ksY6Zr+lyi5cxNsSi4ix1dicqfydIKvLfV+DF3mQf/dw== dependencies: - "@abp/utils" "~9.1.0-rc.3" + "@abp/utils" "~9.1.0" -"@abp/datatables.net-bs5@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-9.1.0-rc.3.tgz#984d6550124cf0221f8233306483aff72a38249e" - integrity sha512-qJ777clztaau92sLvDgsxIQdKnFpZqQqn3/N2y81eixELm/t/qRiE0ySNduNDnvzik6/uWmfnG82ToCmmTFP2g== +"@abp/datatables.net-bs5@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-9.1.0.tgz#3b2e7d68e947db3d3432ab5e8bff4da89a85d05d" + integrity sha512-zBrzOrfvTPJcc6mvHZDPVdXbWesKU0lKlrb7vuBZxWjrFNwVC0d/KNJPcYVvyQ3zf9rrQB5Xg0MDgu0k5Tt7tQ== dependencies: - "@abp/datatables.net" "~9.1.0-rc.3" + "@abp/datatables.net" "~9.1.0" datatables.net-bs5 "^2.1.8" -"@abp/datatables.net@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-9.1.0-rc.3.tgz#5495345014b6dc3faa67415b2c37ee84b1e4dbbc" - integrity sha512-jKn9DIQrlxMU/dedYaFjfHADPuMfs+6nUojYDGUPd76Ov1TKFNA0N/6ipB7UMYd3xVPEEmgkBH8pqf0qR8D64w== +"@abp/datatables.net@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-9.1.0.tgz#12d6e1412aac4a2e0a61437dcdfbfbe1add7fed7" + integrity sha512-lYRvEZUkntaI+dS9Xkz23Z54eDeZ1R4Wzhqcg6VIsz3iO5kYAa5GiQjcOiBssNGJSLuaet6R5Pqh1ThEUjfvvA== dependencies: - "@abp/jquery" "~9.1.0-rc.3" + "@abp/jquery" "~9.1.0" datatables.net "^2.1.8" -"@abp/font-awesome@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-9.1.0-rc.3.tgz#259dcac2f20da57a72b9c41129c465935abc125f" - integrity sha512-fAExSAn0VaPWfx9kPwIKB0xbSSMHZst/NiNXRPhIrCGty/PXp5OV8ao+mqKcsLQJTPFz1RaSxpdq/1s3tAiGWQ== +"@abp/font-awesome@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-9.1.0.tgz#af21ff2d7c332deb1df626404b53a78d790ba842" + integrity sha512-HcJzDCACGejOIvhxsorCdaesyDHnupR/sl5YFCsGikSqATyOSKQy4pw8wKsb1z+FCT5JYCTR7ROJ3lB1lTEgZw== dependencies: - "@abp/core" "~9.1.0-rc.3" + "@abp/core" "~9.1.0" "@fortawesome/fontawesome-free" "^6.6.0" -"@abp/jquery-form@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-9.1.0-rc.3.tgz#c1ee21a5f38dcf0fdbb0c3e2db3f66bc81ae66b1" - integrity sha512-YJ2CDjJVbNpqs88CGgsHnPtJG4BjYLQ0XFVT+Ph9ar5YnuQrYfB60HMdtnQlqn337hkbzVx2XHLJ6h0tT8To9Q== +"@abp/jquery-form@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-9.1.0.tgz#bdb96436c54b2a09ac4259db97e1e577410e1fc3" + integrity sha512-xjHXWstVY6B3MPB4/8g0EJeHlVvlV010OMZKFmfCGLFi6aHAEKqqWh1rMItAiVuSmCCzL0m/208ZkpoCI++jGQ== dependencies: - "@abp/jquery" "~9.1.0-rc.3" + "@abp/jquery" "~9.1.0" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-9.1.0-rc.3.tgz#88976407a14276244a01a24daeda6b236298e917" - integrity sha512-Yac7l/rjHxdogPyMO8LlJklndDBCwZ+qLeTbCcYt7NQnnsnn+xXomSwjFWv8sguTVKG1eL68LquGUCbNwNfrUA== +"@abp/jquery-validation-unobtrusive@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-9.1.0.tgz#798551e7c14ba286a819a48804107a53e974c1ee" + integrity sha512-TggKckfbLtB7Ig2kNt2kH//GaJUns8OZbpdKdh7vCWIAGedw2FLNCABCpoGnyNp0s/dVOtdyxRl9eFRN3+a4tw== dependencies: - "@abp/jquery-validation" "~9.1.0-rc.3" + "@abp/jquery-validation" "~9.1.0" jquery-validation-unobtrusive "^4.0.0" -"@abp/jquery-validation@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-9.1.0-rc.3.tgz#1ff99dea2f2c52e58a50d06b51e0cbca15ff690c" - integrity sha512-YB1t1m+s+vHGuxSt0h4cgIMIpwRy129pjV08Jja1QtCFhE+VgA9hjvx0OVaVcm31aLLt/KU/+NrO36AbebL+zA== +"@abp/jquery-validation@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-9.1.0.tgz#b771652377fbfb3c92ce03b7b7c069a3bb2ae70b" + integrity sha512-bmPSOHcxjitB8NkiLv0SxxuSS3FlCq9SiTUGvsT8nOStDsm+KpyYSzZQq8LSCyqWWj54tlOARTfcD4tMK7/K3Q== dependencies: - "@abp/jquery" "~9.1.0-rc.3" + "@abp/jquery" "~9.1.0" jquery-validation "^1.21.0" -"@abp/jquery@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-9.1.0-rc.3.tgz#0386a2857271dc4c1e04da9e4b304637bbc2d696" - integrity sha512-1UqztwQ92m6kvYE+Tb0rj7iITHngKdGI5kEpZKOHrEWqnMKeEoPbO1cL+ZOWN0m162WJiliod1HEOxW8b9Ha2Q== +"@abp/jquery@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-9.1.0.tgz#952b61ea3e4a99e6551f667297dbb637d83f3c50" + integrity sha512-Ulw8ClAbqmxceNYCb76bR6dq7e9b7Hs6mjlEy05zdbsSNuZW3UoycsJ+BquXi+dUNBo6OppqEmhVeiIjAKTaFg== dependencies: - "@abp/core" "~9.1.0-rc.3" + "@abp/core" "~9.1.0" jquery "~3.7.1" -"@abp/lodash@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-9.1.0-rc.3.tgz#26f53847ed05a171d71c6c6f1ba33d8c4e2a624a" - integrity sha512-eUuNYTk6hla5kOdc5lOBVoKhMBfnkfXdawb+/LtwBwjCQym+XRTCenJhqzxii293xwd+0G1l5M+8VaPWFq6WWg== +"@abp/lodash@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-9.1.0.tgz#62c784bd99c9e1ccfa82905e843375c594ef8584" + integrity sha512-cCE3ZwwWcPrh+ccKx4AS1USL1ttbrXBqci/l+ROjXhFzrs6GYnhI0+30xRZgPdPRm3U3nGPrSaDAU7UuHkRScg== dependencies: - "@abp/core" "~9.1.0-rc.3" + "@abp/core" "~9.1.0" lodash "^4.17.21" -"@abp/luxon@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-9.1.0-rc.3.tgz#0cfae9b2188c9827963e693dbfaaefcce714bdd9" - integrity sha512-UxtDDyLvHr3sPhrWX+uj9JrsN6idYKH+srOmAKC8+FOfWW/YdFAJmsYPLMCov7FoSWXHG+BQhkuXeCCBppyiVA== +"@abp/luxon@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-9.1.0.tgz#b246f3627bbc7ce41b7878fce1679da473b0e0ae" + integrity sha512-AouS/qEK+i69hwr4XtUOCepONLuR+1gdHFb50RpOEbUoDfTYmYpxPBdiICmZPeJ3CExErITPZxzzngCnKPPOUw== dependencies: - "@abp/core" "~9.1.0-rc.3" + "@abp/core" "~9.1.0" luxon "^3.5.0" -"@abp/malihu-custom-scrollbar-plugin@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-9.1.0-rc.3.tgz#08071e21260f867fc2a7d7594dcdf30da921bb47" - integrity sha512-WDWcm4JsTzq4Se8Sg+v6U5ymjbfVOXsU2WR66RSUL8TSq3WM1MLuRaStDGxtt8nOLvPfqiPWIzb2BvsfyePNRw== +"@abp/malihu-custom-scrollbar-plugin@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-9.1.0.tgz#288ae1916a78100f2c728dfd05a560ee99fafae4" + integrity sha512-McdMRDtbTZBjp//3GMVjRjkc16HNYDEdPc2ar1xrY817e0tEln6/TBkItAcfOvjso0TsLcvlNL1+1bjbMjj8OA== dependencies: - "@abp/core" "~9.1.0-rc.3" + "@abp/core" "~9.1.0" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/moment@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-9.1.0-rc.3.tgz#3cb5b000be73e4d681d3d115be98a8422a66e307" - integrity sha512-K30pG1xRGOJ5m7rJI6u5hKv5Lcjmqxqx7cekDf9HURzgpBGLCvMnnXFSx97w0LcPOYzCVxorfTdw6S3sC12idw== +"@abp/moment@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-9.1.0.tgz#f3c0ae02209e496913cda53df752dabc5be648bd" + integrity sha512-WxR1l09vwxRhqyvAVP4m4IBOFjIC4pzLOmelloqES+gL/klw+T/AmY21Z/z+OV0p7aJ3V3Q1aQStuMCDCyGFnQ== dependencies: moment "^2.30.1" -"@abp/prismjs@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-9.1.0-rc.3.tgz#f77e1d264ef5b6c1ceb7bd1b4aee19bfce6e723b" - integrity sha512-/vtoR5oyEiVVvLPPsAS5qSI4THle/WqETTTTInpeVx6u/NEbeY9sBAUz+udS/fWJlyxIUN6He56ghoJNaWXYJw== +"@abp/prismjs@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-9.1.0.tgz#40b688c82ae808ef92516ea5731ccb38c19d2384" + integrity sha512-trSW1K6VtIEaAyxe7umQGimCTLrgdT6DwSiQ8PONvKa8WR5ZmzSDU7lK8SliorufkbWtdkjCvuXB81NGt3tAhQ== dependencies: - "@abp/clipboard" "~9.1.0-rc.3" - "@abp/core" "~9.1.0-rc.3" + "@abp/clipboard" "~9.1.0" + "@abp/core" "~9.1.0" prismjs "^1.29.0" -"@abp/select2@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-9.1.0-rc.3.tgz#7bd050e4847c0b8366fd582200f27065ecc4ff57" - integrity sha512-0k5P+amCqNE2cPAGQpEwFl+vMssuKSbpZ0XgHfF0z3EcE1bAuYDo41nAfk/amsJn5Dt55xJcC+yesADkAXEeIA== +"@abp/select2@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-9.1.0.tgz#9c2c6751f8506fb375c9b7c42a008c168a8f4c75" + integrity sha512-n6HqsH8aFLMrqL6LJ0gsHFlaq6T1QSt/x7HkkZyhDC7CwhXajxtsJEstDnDF9naHSXX/lerPbrHEgzn2QRMBqg== dependencies: - "@abp/core" "~9.1.0-rc.3" + "@abp/core" "~9.1.0" select2 "^4.0.13" -"@abp/sweetalert2@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-9.1.0-rc.3.tgz#69751518ea84b8a306478f48b516946363a7fa7f" - integrity sha512-iHk6JzD9qzmdvr/LjAwSVFfX1WmipzQNcCYwUB+kKe2uSfwufYz+9+iYjYcm7uVvZSd9LniIvzvQXyZlfMSy5w== +"@abp/sweetalert2@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-9.1.0.tgz#660f9b1db60cc04bde6cadbcf3c55320d20c2f3e" + integrity sha512-z3JMeAwva2vR8qZSRJ/BisQDdAEqjDJ/6oIGu/JYXQEchO1Lnd9UMV376nc3crLJdnyRRO7Qs6zx4FfVOCH0kw== dependencies: - "@abp/core" "~9.1.0-rc.3" + "@abp/core" "~9.1.0" sweetalert2 "^11.14.1" -"@abp/timeago@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-9.1.0-rc.3.tgz#b1eb20d6c9fe47a6d0ace8565ea8289f1af9c0a1" - integrity sha512-7hq2+HHQ91/xXFGK417dkgFNKU7z49bVN7tkHLMJyKkJb1iP3N0gCz3HdkCRjnM6yrRXQDYUmO/zCv6yBwakjA== +"@abp/timeago@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-9.1.0.tgz#496e40153241bae5d418d79cc6c65c9db6306447" + integrity sha512-a/UAYQ2GrhYFGx4p0hqr3x+teBqnjnOiWJEPq9//RTlz+EZ+OUyHbJrcUtqZRvaGJtOAsfmljD3jYnOXUlU7DA== dependencies: - "@abp/jquery" "~9.1.0-rc.3" + "@abp/jquery" "~9.1.0" timeago "^1.6.7" -"@abp/toastr@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-9.1.0-rc.3.tgz#de490bfd6b41919d96be0544aaaee3d457cf9f32" - integrity sha512-hLe3FXyplQmhRbvBZdLVt+6yRAfptAJzwU2S5iHbs5r4ncO1ampCClZNNLNmrCglDQ30ZkgrPg4SjHn9V6HyIQ== +"@abp/toastr@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-9.1.0.tgz#501cbe211164b2e7416a2d4878cb34aed3550b7c" + integrity sha512-BkTDuU0p9Qa4+HT9CYwiPQjVTrbTSNBgQ18h69S3lIadLJwdC6pXeLbL9bhe+5fiuhq2f+0Oqo3X75LNEgzHkw== dependencies: - "@abp/jquery" "~9.1.0-rc.3" + "@abp/jquery" "~9.1.0" toastr "^2.1.4" -"@abp/utils@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-9.1.0-rc.3.tgz#84de6ab4497c74b2c0c04f604dc6d542a50a1534" - integrity sha512-Tw9gNUAFjmieVrnril7YxwqthpSkZiY01uW60/+Dkd3jh9qZntqgzIcKG6/TXjimWK6iN8YZFOJ0cShCnHW0Jg== +"@abp/utils@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-9.1.0.tgz#a4fd37d943df18b5c11f5d4869efd5d8882b7959" + integrity sha512-+UZo0ocTEZlRO41SzzHNdinjdFUDVq8wYZSj5BA1bqCVeWYhfjI2+rl9DuogCN8UEuCACA4K/qb4XcE/untQ3g== dependencies: just-compare "^2.3.0" diff --git a/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Installer/InstallationNotes.md b/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Installer/InstallationNotes.md new file mode 100644 index 0000000000..dcd9293ef3 --- /dev/null +++ b/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Installer/InstallationNotes.md @@ -0,0 +1,16 @@ +# Installation Notes for Blob Storing Database Module + +It is typical to store file contents in an application and read these file contents on need. Not only files, but you may also need to save various types of large binary objects, a.k.a. [BLOBs](https://en.wikipedia.org/wiki/Binary_large_object), into a storage. For example, you may want to save user profile pictures. + +A BLOB is a typically byte array. There are various places to store a BLOB item; storing in the local file system, in a shared database or on the [Azure BLOB storage](https://azure.microsoft.com/en-us/products/storage/blobs/) can be options. + +The ABP provides an abstraction to work with BLOBs and provides some pre-built storage providers that you can easily integrate to. Having such an abstraction has some benefits; + +You can easily integrate to your favorite BLOB storage provides with a few lines of configuration. +You can then easily change your BLOB storage without changing your application code. +If you want to create reusable application modules, you don't need to make assumption about how the BLOBs are stored. +ABP BLOB Storage system is also compatible to other ABP features like multi-tenancy. + +## Documentation + +For detailed information and usage instructions, please visit the [BLOB Storing documentation](https://abp.io/docs/latest/framework/infrastructure/blob-storing). \ No newline at end of file diff --git a/modules/blogging/app/Volo.BloggingTestApp/package.json b/modules/blogging/app/Volo.BloggingTestApp/package.json index c24d05da50..2c0e71ec56 100644 --- a/modules/blogging/app/Volo.BloggingTestApp/package.json +++ b/modules/blogging/app/Volo.BloggingTestApp/package.json @@ -3,7 +3,7 @@ "name": "volo.blogtestapp", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "~9.1.0-rc.3", - "@abp/blogging": "~9.1.0-rc.3" + "@abp/aspnetcore.mvc.ui.theme.basic": "~9.1.0", + "@abp/blogging": "~9.1.0" } } diff --git a/modules/blogging/app/Volo.BloggingTestApp/yarn.lock b/modules/blogging/app/Volo.BloggingTestApp/yarn.lock index 6953fc7552..783bf4eae3 100644 --- a/modules/blogging/app/Volo.BloggingTestApp/yarn.lock +++ b/modules/blogging/app/Volo.BloggingTestApp/yarn.lock @@ -2,237 +2,237 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.basic@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-9.1.0-rc.3.tgz#c291f2760d32a9745c4b15a62c13abec9b7e247f" - integrity sha512-f14SIEfZkvSgYBfM/rcDmn0mgkIHGqi6lRP7GeBRUPEhB944osyCFmJH3CWDjJcjTFbqWTvKVlDRsV0Roz5eqg== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~9.1.0-rc.3" - -"@abp/aspnetcore.mvc.ui.theme.shared@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-9.1.0-rc.3.tgz#c05d8b39fc1ef2a9c890c480cb1ec8f47ee10669" - integrity sha512-BTLoVlaYjKrW0Rhrqw4tNiHf5LV8/zBxh90OM7smKYPGOftHhSWSNUUSO5upOdOsVhNSPIxY83PF/LHp29kH8g== - dependencies: - "@abp/aspnetcore.mvc.ui" "~9.1.0-rc.3" - "@abp/bootstrap" "~9.1.0-rc.3" - "@abp/bootstrap-datepicker" "~9.1.0-rc.3" - "@abp/bootstrap-daterangepicker" "~9.1.0-rc.3" - "@abp/datatables.net-bs5" "~9.1.0-rc.3" - "@abp/font-awesome" "~9.1.0-rc.3" - "@abp/jquery-form" "~9.1.0-rc.3" - "@abp/jquery-validation-unobtrusive" "~9.1.0-rc.3" - "@abp/lodash" "~9.1.0-rc.3" - "@abp/luxon" "~9.1.0-rc.3" - "@abp/malihu-custom-scrollbar-plugin" "~9.1.0-rc.3" - "@abp/moment" "~9.1.0-rc.3" - "@abp/select2" "~9.1.0-rc.3" - "@abp/sweetalert2" "~9.1.0-rc.3" - "@abp/timeago" "~9.1.0-rc.3" - "@abp/toastr" "~9.1.0-rc.3" - -"@abp/aspnetcore.mvc.ui@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-9.1.0-rc.3.tgz#88252e0fb822fe9560ed89d2118c7b32a32ba496" - integrity sha512-WGjWNoN97uxjMc173w36UV8UVGxLbDrOcglnqK+RY+E9vIxFGDmWBvwzmJ1KfZRvlwahXtMjTCiYFKO411lh1w== +"@abp/aspnetcore.mvc.ui.theme.basic@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-9.1.0.tgz#e9e0321037c34b43145dfc7827c422fbf79f59ab" + integrity sha512-vLkyrdFXw0/MPyU2hzqGJJk7trmIlVMdflNIe/rF77UIRmJYHWaTmPt9i5PLN/O4s0jnE9kWlaaJ/VnnFWeGsQ== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~9.1.0" + +"@abp/aspnetcore.mvc.ui.theme.shared@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-9.1.0.tgz#35a73580b9b67a33708f2cf897243b50c9ad7100" + integrity sha512-rggTYL9poOFICsOseDX22JNhD0KWH8Oxs0YH91TZjvm/F67cPemW99eBlJc/YdJ7bN6icRiebN8m81y9MSanyg== + dependencies: + "@abp/aspnetcore.mvc.ui" "~9.1.0" + "@abp/bootstrap" "~9.1.0" + "@abp/bootstrap-datepicker" "~9.1.0" + "@abp/bootstrap-daterangepicker" "~9.1.0" + "@abp/datatables.net-bs5" "~9.1.0" + "@abp/font-awesome" "~9.1.0" + "@abp/jquery-form" "~9.1.0" + "@abp/jquery-validation-unobtrusive" "~9.1.0" + "@abp/lodash" "~9.1.0" + "@abp/luxon" "~9.1.0" + "@abp/malihu-custom-scrollbar-plugin" "~9.1.0" + "@abp/moment" "~9.1.0" + "@abp/select2" "~9.1.0" + "@abp/sweetalert2" "~9.1.0" + "@abp/timeago" "~9.1.0" + "@abp/toastr" "~9.1.0" + +"@abp/aspnetcore.mvc.ui@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-9.1.0.tgz#38d058ab148a36ad4d63870e8a501ca339e4a70e" + integrity sha512-lUw1ij87KJp+Rj4cz8oSQkdRuoMq76l/wIAGwtXH+EOKusVpSJTOTioAV/tPKeKZ15ubE4bO5jWcQGxZkXgH3w== dependencies: ansi-colors "^4.1.3" -"@abp/blogging@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/blogging/-/blogging-9.1.0-rc.3.tgz#5515c18498c50c506664a8454ae8158b16e33da6" - integrity sha512-QAQU6bewC24T++7q0VjmRhBJrWEZuJmLiCqOEHrVBhBQhnVsmXeOSKT8xDc/RY47y0KQyOC0gJscnJN8DozMzw== +"@abp/blogging@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/blogging/-/blogging-9.1.0.tgz#17f9ad066361e385136fb0a59315952e263ef68e" + integrity sha512-KQVZMd0bBPn4HMYD4ZyIKMQpoUQGMCGVhfaOfSsnJMd9iHYXKcBEPLqAcO97ZtaSrnhTpgeb14Ai/9lmvVN5nw== dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~9.1.0-rc.3" - "@abp/owl.carousel" "~9.1.0-rc.3" - "@abp/prismjs" "~9.1.0-rc.3" - "@abp/tui-editor" "~9.1.0-rc.3" + "@abp/aspnetcore.mvc.ui.theme.shared" "~9.1.0" + "@abp/owl.carousel" "~9.1.0" + "@abp/prismjs" "~9.1.0" + "@abp/tui-editor" "~9.1.0" -"@abp/bootstrap-datepicker@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-9.1.0-rc.3.tgz#8376fb204851b8e7be6fb5afe6e023f706426bc2" - integrity sha512-bKPeRpqzHlSCnItxesp+QnAewFcwuB1hmncRydhOg9ImvzRN0M9fAfSXeP7VTYH+2ygDKVEtK+8aAh1RjAryuA== +"@abp/bootstrap-datepicker@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-9.1.0.tgz#96a1875a2b92f03b8f90f7842ebf8849cf8a4d04" + integrity sha512-3FQm1SK8qmzoP7LOvXkZpq1AzrdPHKRdQJjoqK9N+lQxQjNfOxEFMxeDSg6WJKO619Cnve++jAyMidojXlCiwQ== dependencies: bootstrap-datepicker "^1.10.0" -"@abp/bootstrap-daterangepicker@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-9.1.0-rc.3.tgz#f14dd37eb7a4fe4d6cb823da1ee80dc28154d0df" - integrity sha512-C7KXx1630JK4mOrMZEQoiH4vzQZn6JfrS6k8nAX0p48zRNcx8oxwviaojRcu+MjDl/rDHc5U9Xy9lBIurqLEKg== +"@abp/bootstrap-daterangepicker@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-9.1.0.tgz#1993c539837eb31de174cba9f0bccd441a98f209" + integrity sha512-jS1jTqP6KCXQYX9xZpDAI07C94nwzXrNJD3H0pJXsXoOva3TTBQDD8khf6RDb7tiZrkrNJqmMyUiCfVTDbO7zg== dependencies: bootstrap-daterangepicker "^3.1.0" -"@abp/bootstrap@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-9.1.0-rc.3.tgz#01be98456635982e5b43a49318d0bcc55163fad7" - integrity sha512-Xi2TPaReFl3vnnFW974Cc4Sb25Iq+RwzkoGXiJFUiwGgYHbHHCd5Jd9Af6KYNchjP9SJKFYELwKZcQdxEIHauQ== +"@abp/bootstrap@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-9.1.0.tgz#a06c1cd4c11554c29973db70c6a383efebb10b4e" + integrity sha512-r6onkBnpqoWrdYLDVZTiqgQBvH5UZerYRrPB3Ky+RkXJhgwn7AM3LAVrB42sIvFZRNbwOlvuAL+a0+5yDOH67Q== dependencies: - "@abp/core" "~9.1.0-rc.3" + "@abp/core" "~9.1.0" bootstrap "^5.3.3" -"@abp/clipboard@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-9.1.0-rc.3.tgz#85b38876ba259a235acfcea8bb85c0bf9309fa5c" - integrity sha512-3FSLFOpySYQfmlMlrhSEdC8mnLDUtXRBXwWNIBJMTNEKAt0E2Z/2TIefaPzPYzYkqNrXlq8qdOOkvxFm39y8WQ== +"@abp/clipboard@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-9.1.0.tgz#5d5678ef7e8c355715c5a74e4aabd0a21d5e6cbe" + integrity sha512-1TxZbB/q5DPeLhYzrc6y0OVekxnjM+CRH/Gu8nAXQMX46XjdTboXvBtvgKHV1aCznGNsWyjd5A2O5G/XGg9NNw== dependencies: - "@abp/core" "~9.1.0-rc.3" + "@abp/core" "~9.1.0" clipboard "^2.0.11" -"@abp/core@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-9.1.0-rc.3.tgz#4749bd60813ddceb156dec045e7f9eb0b3e19446" - integrity sha512-xYr9zbHCz+v672AuFWSmvqeo0CgAwZTr9laAp58QOCzO2QsVHuDUy60epGhIxCTRc3iCBkcelIFDFlGrN30WSw== +"@abp/core@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-9.1.0.tgz#af78fc096932d4ec45216b5e910c87a72e479b1f" + integrity sha512-6P0KGh5+IqlhQnUOyzaGaKrKzOAm1G0gg8Ay3DXyW2ksY6Zr+lyi5cxNsSi4ix1dicqfydIKvLfV+DF3mQf/dw== dependencies: - "@abp/utils" "~9.1.0-rc.3" + "@abp/utils" "~9.1.0" -"@abp/datatables.net-bs5@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-9.1.0-rc.3.tgz#984d6550124cf0221f8233306483aff72a38249e" - integrity sha512-qJ777clztaau92sLvDgsxIQdKnFpZqQqn3/N2y81eixELm/t/qRiE0ySNduNDnvzik6/uWmfnG82ToCmmTFP2g== +"@abp/datatables.net-bs5@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-9.1.0.tgz#3b2e7d68e947db3d3432ab5e8bff4da89a85d05d" + integrity sha512-zBrzOrfvTPJcc6mvHZDPVdXbWesKU0lKlrb7vuBZxWjrFNwVC0d/KNJPcYVvyQ3zf9rrQB5Xg0MDgu0k5Tt7tQ== dependencies: - "@abp/datatables.net" "~9.1.0-rc.3" + "@abp/datatables.net" "~9.1.0" datatables.net-bs5 "^2.1.8" -"@abp/datatables.net@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-9.1.0-rc.3.tgz#5495345014b6dc3faa67415b2c37ee84b1e4dbbc" - integrity sha512-jKn9DIQrlxMU/dedYaFjfHADPuMfs+6nUojYDGUPd76Ov1TKFNA0N/6ipB7UMYd3xVPEEmgkBH8pqf0qR8D64w== +"@abp/datatables.net@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-9.1.0.tgz#12d6e1412aac4a2e0a61437dcdfbfbe1add7fed7" + integrity sha512-lYRvEZUkntaI+dS9Xkz23Z54eDeZ1R4Wzhqcg6VIsz3iO5kYAa5GiQjcOiBssNGJSLuaet6R5Pqh1ThEUjfvvA== dependencies: - "@abp/jquery" "~9.1.0-rc.3" + "@abp/jquery" "~9.1.0" datatables.net "^2.1.8" -"@abp/font-awesome@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-9.1.0-rc.3.tgz#259dcac2f20da57a72b9c41129c465935abc125f" - integrity sha512-fAExSAn0VaPWfx9kPwIKB0xbSSMHZst/NiNXRPhIrCGty/PXp5OV8ao+mqKcsLQJTPFz1RaSxpdq/1s3tAiGWQ== +"@abp/font-awesome@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-9.1.0.tgz#af21ff2d7c332deb1df626404b53a78d790ba842" + integrity sha512-HcJzDCACGejOIvhxsorCdaesyDHnupR/sl5YFCsGikSqATyOSKQy4pw8wKsb1z+FCT5JYCTR7ROJ3lB1lTEgZw== dependencies: - "@abp/core" "~9.1.0-rc.3" + "@abp/core" "~9.1.0" "@fortawesome/fontawesome-free" "^6.6.0" -"@abp/jquery-form@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-9.1.0-rc.3.tgz#c1ee21a5f38dcf0fdbb0c3e2db3f66bc81ae66b1" - integrity sha512-YJ2CDjJVbNpqs88CGgsHnPtJG4BjYLQ0XFVT+Ph9ar5YnuQrYfB60HMdtnQlqn337hkbzVx2XHLJ6h0tT8To9Q== +"@abp/jquery-form@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-9.1.0.tgz#bdb96436c54b2a09ac4259db97e1e577410e1fc3" + integrity sha512-xjHXWstVY6B3MPB4/8g0EJeHlVvlV010OMZKFmfCGLFi6aHAEKqqWh1rMItAiVuSmCCzL0m/208ZkpoCI++jGQ== dependencies: - "@abp/jquery" "~9.1.0-rc.3" + "@abp/jquery" "~9.1.0" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-9.1.0-rc.3.tgz#88976407a14276244a01a24daeda6b236298e917" - integrity sha512-Yac7l/rjHxdogPyMO8LlJklndDBCwZ+qLeTbCcYt7NQnnsnn+xXomSwjFWv8sguTVKG1eL68LquGUCbNwNfrUA== +"@abp/jquery-validation-unobtrusive@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-9.1.0.tgz#798551e7c14ba286a819a48804107a53e974c1ee" + integrity sha512-TggKckfbLtB7Ig2kNt2kH//GaJUns8OZbpdKdh7vCWIAGedw2FLNCABCpoGnyNp0s/dVOtdyxRl9eFRN3+a4tw== dependencies: - "@abp/jquery-validation" "~9.1.0-rc.3" + "@abp/jquery-validation" "~9.1.0" jquery-validation-unobtrusive "^4.0.0" -"@abp/jquery-validation@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-9.1.0-rc.3.tgz#1ff99dea2f2c52e58a50d06b51e0cbca15ff690c" - integrity sha512-YB1t1m+s+vHGuxSt0h4cgIMIpwRy129pjV08Jja1QtCFhE+VgA9hjvx0OVaVcm31aLLt/KU/+NrO36AbebL+zA== +"@abp/jquery-validation@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-9.1.0.tgz#b771652377fbfb3c92ce03b7b7c069a3bb2ae70b" + integrity sha512-bmPSOHcxjitB8NkiLv0SxxuSS3FlCq9SiTUGvsT8nOStDsm+KpyYSzZQq8LSCyqWWj54tlOARTfcD4tMK7/K3Q== dependencies: - "@abp/jquery" "~9.1.0-rc.3" + "@abp/jquery" "~9.1.0" jquery-validation "^1.21.0" -"@abp/jquery@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-9.1.0-rc.3.tgz#0386a2857271dc4c1e04da9e4b304637bbc2d696" - integrity sha512-1UqztwQ92m6kvYE+Tb0rj7iITHngKdGI5kEpZKOHrEWqnMKeEoPbO1cL+ZOWN0m162WJiliod1HEOxW8b9Ha2Q== +"@abp/jquery@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-9.1.0.tgz#952b61ea3e4a99e6551f667297dbb637d83f3c50" + integrity sha512-Ulw8ClAbqmxceNYCb76bR6dq7e9b7Hs6mjlEy05zdbsSNuZW3UoycsJ+BquXi+dUNBo6OppqEmhVeiIjAKTaFg== dependencies: - "@abp/core" "~9.1.0-rc.3" + "@abp/core" "~9.1.0" jquery "~3.7.1" -"@abp/lodash@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-9.1.0-rc.3.tgz#26f53847ed05a171d71c6c6f1ba33d8c4e2a624a" - integrity sha512-eUuNYTk6hla5kOdc5lOBVoKhMBfnkfXdawb+/LtwBwjCQym+XRTCenJhqzxii293xwd+0G1l5M+8VaPWFq6WWg== +"@abp/lodash@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-9.1.0.tgz#62c784bd99c9e1ccfa82905e843375c594ef8584" + integrity sha512-cCE3ZwwWcPrh+ccKx4AS1USL1ttbrXBqci/l+ROjXhFzrs6GYnhI0+30xRZgPdPRm3U3nGPrSaDAU7UuHkRScg== dependencies: - "@abp/core" "~9.1.0-rc.3" + "@abp/core" "~9.1.0" lodash "^4.17.21" -"@abp/luxon@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-9.1.0-rc.3.tgz#0cfae9b2188c9827963e693dbfaaefcce714bdd9" - integrity sha512-UxtDDyLvHr3sPhrWX+uj9JrsN6idYKH+srOmAKC8+FOfWW/YdFAJmsYPLMCov7FoSWXHG+BQhkuXeCCBppyiVA== +"@abp/luxon@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-9.1.0.tgz#b246f3627bbc7ce41b7878fce1679da473b0e0ae" + integrity sha512-AouS/qEK+i69hwr4XtUOCepONLuR+1gdHFb50RpOEbUoDfTYmYpxPBdiICmZPeJ3CExErITPZxzzngCnKPPOUw== dependencies: - "@abp/core" "~9.1.0-rc.3" + "@abp/core" "~9.1.0" luxon "^3.5.0" -"@abp/malihu-custom-scrollbar-plugin@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-9.1.0-rc.3.tgz#08071e21260f867fc2a7d7594dcdf30da921bb47" - integrity sha512-WDWcm4JsTzq4Se8Sg+v6U5ymjbfVOXsU2WR66RSUL8TSq3WM1MLuRaStDGxtt8nOLvPfqiPWIzb2BvsfyePNRw== +"@abp/malihu-custom-scrollbar-plugin@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-9.1.0.tgz#288ae1916a78100f2c728dfd05a560ee99fafae4" + integrity sha512-McdMRDtbTZBjp//3GMVjRjkc16HNYDEdPc2ar1xrY817e0tEln6/TBkItAcfOvjso0TsLcvlNL1+1bjbMjj8OA== dependencies: - "@abp/core" "~9.1.0-rc.3" + "@abp/core" "~9.1.0" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/moment@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-9.1.0-rc.3.tgz#3cb5b000be73e4d681d3d115be98a8422a66e307" - integrity sha512-K30pG1xRGOJ5m7rJI6u5hKv5Lcjmqxqx7cekDf9HURzgpBGLCvMnnXFSx97w0LcPOYzCVxorfTdw6S3sC12idw== +"@abp/moment@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-9.1.0.tgz#f3c0ae02209e496913cda53df752dabc5be648bd" + integrity sha512-WxR1l09vwxRhqyvAVP4m4IBOFjIC4pzLOmelloqES+gL/klw+T/AmY21Z/z+OV0p7aJ3V3Q1aQStuMCDCyGFnQ== dependencies: moment "^2.30.1" -"@abp/owl.carousel@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/owl.carousel/-/owl.carousel-9.1.0-rc.3.tgz#d83c0a4c86f9011780ad4d8e76bfc5bf9a76179f" - integrity sha512-v/Ib/4NsHnrr/Wxp/4ZqQ+q7NPxmI8IikIjbcMhOgoTOR6/9ZgmjngV2gPQTXvPeeACtsmREHrHDf93LUrRyjw== +"@abp/owl.carousel@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/owl.carousel/-/owl.carousel-9.1.0.tgz#fbb77abb9645239329d4aab50d7582095a5338e3" + integrity sha512-taX/vBaaJx4gxjbFCyYtscgd24ATqOhLAK/RmMM9wb2aBUFeJWsJJaJ2Ruc/s7UvTYn+fHSZP2+EHfZLUZdTfA== dependencies: - "@abp/core" "~9.1.0-rc.3" + "@abp/core" "~9.1.0" owl.carousel "^2.3.4" -"@abp/prismjs@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-9.1.0-rc.3.tgz#f77e1d264ef5b6c1ceb7bd1b4aee19bfce6e723b" - integrity sha512-/vtoR5oyEiVVvLPPsAS5qSI4THle/WqETTTTInpeVx6u/NEbeY9sBAUz+udS/fWJlyxIUN6He56ghoJNaWXYJw== +"@abp/prismjs@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-9.1.0.tgz#40b688c82ae808ef92516ea5731ccb38c19d2384" + integrity sha512-trSW1K6VtIEaAyxe7umQGimCTLrgdT6DwSiQ8PONvKa8WR5ZmzSDU7lK8SliorufkbWtdkjCvuXB81NGt3tAhQ== dependencies: - "@abp/clipboard" "~9.1.0-rc.3" - "@abp/core" "~9.1.0-rc.3" + "@abp/clipboard" "~9.1.0" + "@abp/core" "~9.1.0" prismjs "^1.29.0" -"@abp/select2@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-9.1.0-rc.3.tgz#7bd050e4847c0b8366fd582200f27065ecc4ff57" - integrity sha512-0k5P+amCqNE2cPAGQpEwFl+vMssuKSbpZ0XgHfF0z3EcE1bAuYDo41nAfk/amsJn5Dt55xJcC+yesADkAXEeIA== +"@abp/select2@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-9.1.0.tgz#9c2c6751f8506fb375c9b7c42a008c168a8f4c75" + integrity sha512-n6HqsH8aFLMrqL6LJ0gsHFlaq6T1QSt/x7HkkZyhDC7CwhXajxtsJEstDnDF9naHSXX/lerPbrHEgzn2QRMBqg== dependencies: - "@abp/core" "~9.1.0-rc.3" + "@abp/core" "~9.1.0" select2 "^4.0.13" -"@abp/sweetalert2@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-9.1.0-rc.3.tgz#69751518ea84b8a306478f48b516946363a7fa7f" - integrity sha512-iHk6JzD9qzmdvr/LjAwSVFfX1WmipzQNcCYwUB+kKe2uSfwufYz+9+iYjYcm7uVvZSd9LniIvzvQXyZlfMSy5w== +"@abp/sweetalert2@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-9.1.0.tgz#660f9b1db60cc04bde6cadbcf3c55320d20c2f3e" + integrity sha512-z3JMeAwva2vR8qZSRJ/BisQDdAEqjDJ/6oIGu/JYXQEchO1Lnd9UMV376nc3crLJdnyRRO7Qs6zx4FfVOCH0kw== dependencies: - "@abp/core" "~9.1.0-rc.3" + "@abp/core" "~9.1.0" sweetalert2 "^11.14.1" -"@abp/timeago@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-9.1.0-rc.3.tgz#b1eb20d6c9fe47a6d0ace8565ea8289f1af9c0a1" - integrity sha512-7hq2+HHQ91/xXFGK417dkgFNKU7z49bVN7tkHLMJyKkJb1iP3N0gCz3HdkCRjnM6yrRXQDYUmO/zCv6yBwakjA== +"@abp/timeago@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-9.1.0.tgz#496e40153241bae5d418d79cc6c65c9db6306447" + integrity sha512-a/UAYQ2GrhYFGx4p0hqr3x+teBqnjnOiWJEPq9//RTlz+EZ+OUyHbJrcUtqZRvaGJtOAsfmljD3jYnOXUlU7DA== dependencies: - "@abp/jquery" "~9.1.0-rc.3" + "@abp/jquery" "~9.1.0" timeago "^1.6.7" -"@abp/toastr@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-9.1.0-rc.3.tgz#de490bfd6b41919d96be0544aaaee3d457cf9f32" - integrity sha512-hLe3FXyplQmhRbvBZdLVt+6yRAfptAJzwU2S5iHbs5r4ncO1ampCClZNNLNmrCglDQ30ZkgrPg4SjHn9V6HyIQ== +"@abp/toastr@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-9.1.0.tgz#501cbe211164b2e7416a2d4878cb34aed3550b7c" + integrity sha512-BkTDuU0p9Qa4+HT9CYwiPQjVTrbTSNBgQ18h69S3lIadLJwdC6pXeLbL9bhe+5fiuhq2f+0Oqo3X75LNEgzHkw== dependencies: - "@abp/jquery" "~9.1.0-rc.3" + "@abp/jquery" "~9.1.0" toastr "^2.1.4" -"@abp/tui-editor@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/tui-editor/-/tui-editor-9.1.0-rc.3.tgz#8162df2aa1e5e0a3875968a9ede6e86bcd33ce47" - integrity sha512-V5+BiAUCYVtekIbPl23BefibxgBPe2oPXUbd5JYM4/qRuWEBsinR//XJOhDjQx3onVwg7CF/W2gjhQFUw69xSA== +"@abp/tui-editor@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/tui-editor/-/tui-editor-9.1.0.tgz#cc4106f0ea61ad1ee2497ecfec1eefb62189f57f" + integrity sha512-Ttmzn881+knyFst/5BZP+4vb4R+gx5loqWtbuQXthO2saisr/+QJX4EzqwYqPTVl81Y1HZwhcdTr/hMHOCMFpg== dependencies: - "@abp/jquery" "~9.1.0-rc.3" - "@abp/prismjs" "~9.1.0-rc.3" + "@abp/jquery" "~9.1.0" + "@abp/prismjs" "~9.1.0" -"@abp/utils@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-9.1.0-rc.3.tgz#84de6ab4497c74b2c0c04f604dc6d542a50a1534" - integrity sha512-Tw9gNUAFjmieVrnril7YxwqthpSkZiY01uW60/+Dkd3jh9qZntqgzIcKG6/TXjimWK6iN8YZFOJ0cShCnHW0Jg== +"@abp/utils@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-9.1.0.tgz#a4fd37d943df18b5c11f5d4869efd5d8882b7959" + integrity sha512-+UZo0ocTEZlRO41SzzHNdinjdFUDVq8wYZSj5BA1bqCVeWYhfjI2+rl9DuogCN8UEuCACA4K/qb4XcE/untQ3g== dependencies: just-compare "^2.3.0" diff --git a/modules/blogging/src/Volo.Blogging.Installer/InstallationNotes.md b/modules/blogging/src/Volo.Blogging.Installer/InstallationNotes.md new file mode 100644 index 0000000000..9ef0de0d04 --- /dev/null +++ b/modules/blogging/src/Volo.Blogging.Installer/InstallationNotes.md @@ -0,0 +1,28 @@ +# Installation Notes for Blogging Module + +The ABP Blogging module provides a simple blogging system for ABP applications. It allows you to create and manage blogs, posts, tags, and comments. The module includes both a public interface for readers and an admin interface for content management. + +Key features of the Blogging module: +- Multiple blog support +- Post management with rich text editing +- Commenting functionality +- Social media sharing +- Admin interface for content management + +## Required Configurations + +The Blogging module requires **permission** settings to be configured after installation. Ensure that the necessary roles have the appropriate access rights for managing blogs, posts, comments and others. + +### Update Database + +The Blogging module requires database migrations to be applied. Following installation, you must update the database to create the necessary tables. + +### Permissions + +Enable the following permissions for the roles that require access to the Blogging module: + +![Blogging Permissions](blogging-permissions.png) + +## Documentation + +For detailed information and usage instructions, please visit the [Blogging Module documentation](https://abp.io/docs/latest/Modules/Cms-Kit/Blogging). \ No newline at end of file diff --git a/modules/blogging/src/Volo.Blogging.Installer/blogging-permissions.png b/modules/blogging/src/Volo.Blogging.Installer/blogging-permissions.png new file mode 100644 index 0000000000..733f3c668f Binary files /dev/null and b/modules/blogging/src/Volo.Blogging.Installer/blogging-permissions.png differ diff --git a/modules/client-simulation/demo/Volo.ClientSimulation.Demo/package.json b/modules/client-simulation/demo/Volo.ClientSimulation.Demo/package.json index 2f213fe0e8..b762a1f3f7 100644 --- a/modules/client-simulation/demo/Volo.ClientSimulation.Demo/package.json +++ b/modules/client-simulation/demo/Volo.ClientSimulation.Demo/package.json @@ -3,6 +3,6 @@ "name": "client-simulation-web", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "~9.1.0-rc.3" + "@abp/aspnetcore.mvc.ui.theme.basic": "~9.1.0" } } diff --git a/modules/client-simulation/demo/Volo.ClientSimulation.Demo/yarn.lock b/modules/client-simulation/demo/Volo.ClientSimulation.Demo/yarn.lock index aa487218c9..38a43d8ed5 100644 --- a/modules/client-simulation/demo/Volo.ClientSimulation.Demo/yarn.lock +++ b/modules/client-simulation/demo/Volo.ClientSimulation.Demo/yarn.lock @@ -2,194 +2,194 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.basic@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-9.1.0-rc.3.tgz#c291f2760d32a9745c4b15a62c13abec9b7e247f" - integrity sha512-f14SIEfZkvSgYBfM/rcDmn0mgkIHGqi6lRP7GeBRUPEhB944osyCFmJH3CWDjJcjTFbqWTvKVlDRsV0Roz5eqg== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~9.1.0-rc.3" - -"@abp/aspnetcore.mvc.ui.theme.shared@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-9.1.0-rc.3.tgz#c05d8b39fc1ef2a9c890c480cb1ec8f47ee10669" - integrity sha512-BTLoVlaYjKrW0Rhrqw4tNiHf5LV8/zBxh90OM7smKYPGOftHhSWSNUUSO5upOdOsVhNSPIxY83PF/LHp29kH8g== - dependencies: - "@abp/aspnetcore.mvc.ui" "~9.1.0-rc.3" - "@abp/bootstrap" "~9.1.0-rc.3" - "@abp/bootstrap-datepicker" "~9.1.0-rc.3" - "@abp/bootstrap-daterangepicker" "~9.1.0-rc.3" - "@abp/datatables.net-bs5" "~9.1.0-rc.3" - "@abp/font-awesome" "~9.1.0-rc.3" - "@abp/jquery-form" "~9.1.0-rc.3" - "@abp/jquery-validation-unobtrusive" "~9.1.0-rc.3" - "@abp/lodash" "~9.1.0-rc.3" - "@abp/luxon" "~9.1.0-rc.3" - "@abp/malihu-custom-scrollbar-plugin" "~9.1.0-rc.3" - "@abp/moment" "~9.1.0-rc.3" - "@abp/select2" "~9.1.0-rc.3" - "@abp/sweetalert2" "~9.1.0-rc.3" - "@abp/timeago" "~9.1.0-rc.3" - "@abp/toastr" "~9.1.0-rc.3" - -"@abp/aspnetcore.mvc.ui@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-9.1.0-rc.3.tgz#88252e0fb822fe9560ed89d2118c7b32a32ba496" - integrity sha512-WGjWNoN97uxjMc173w36UV8UVGxLbDrOcglnqK+RY+E9vIxFGDmWBvwzmJ1KfZRvlwahXtMjTCiYFKO411lh1w== +"@abp/aspnetcore.mvc.ui.theme.basic@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-9.1.0.tgz#e9e0321037c34b43145dfc7827c422fbf79f59ab" + integrity sha512-vLkyrdFXw0/MPyU2hzqGJJk7trmIlVMdflNIe/rF77UIRmJYHWaTmPt9i5PLN/O4s0jnE9kWlaaJ/VnnFWeGsQ== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~9.1.0" + +"@abp/aspnetcore.mvc.ui.theme.shared@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-9.1.0.tgz#35a73580b9b67a33708f2cf897243b50c9ad7100" + integrity sha512-rggTYL9poOFICsOseDX22JNhD0KWH8Oxs0YH91TZjvm/F67cPemW99eBlJc/YdJ7bN6icRiebN8m81y9MSanyg== + dependencies: + "@abp/aspnetcore.mvc.ui" "~9.1.0" + "@abp/bootstrap" "~9.1.0" + "@abp/bootstrap-datepicker" "~9.1.0" + "@abp/bootstrap-daterangepicker" "~9.1.0" + "@abp/datatables.net-bs5" "~9.1.0" + "@abp/font-awesome" "~9.1.0" + "@abp/jquery-form" "~9.1.0" + "@abp/jquery-validation-unobtrusive" "~9.1.0" + "@abp/lodash" "~9.1.0" + "@abp/luxon" "~9.1.0" + "@abp/malihu-custom-scrollbar-plugin" "~9.1.0" + "@abp/moment" "~9.1.0" + "@abp/select2" "~9.1.0" + "@abp/sweetalert2" "~9.1.0" + "@abp/timeago" "~9.1.0" + "@abp/toastr" "~9.1.0" + +"@abp/aspnetcore.mvc.ui@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-9.1.0.tgz#38d058ab148a36ad4d63870e8a501ca339e4a70e" + integrity sha512-lUw1ij87KJp+Rj4cz8oSQkdRuoMq76l/wIAGwtXH+EOKusVpSJTOTioAV/tPKeKZ15ubE4bO5jWcQGxZkXgH3w== dependencies: ansi-colors "^4.1.3" -"@abp/bootstrap-datepicker@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-9.1.0-rc.3.tgz#8376fb204851b8e7be6fb5afe6e023f706426bc2" - integrity sha512-bKPeRpqzHlSCnItxesp+QnAewFcwuB1hmncRydhOg9ImvzRN0M9fAfSXeP7VTYH+2ygDKVEtK+8aAh1RjAryuA== +"@abp/bootstrap-datepicker@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-9.1.0.tgz#96a1875a2b92f03b8f90f7842ebf8849cf8a4d04" + integrity sha512-3FQm1SK8qmzoP7LOvXkZpq1AzrdPHKRdQJjoqK9N+lQxQjNfOxEFMxeDSg6WJKO619Cnve++jAyMidojXlCiwQ== dependencies: bootstrap-datepicker "^1.10.0" -"@abp/bootstrap-daterangepicker@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-9.1.0-rc.3.tgz#f14dd37eb7a4fe4d6cb823da1ee80dc28154d0df" - integrity sha512-C7KXx1630JK4mOrMZEQoiH4vzQZn6JfrS6k8nAX0p48zRNcx8oxwviaojRcu+MjDl/rDHc5U9Xy9lBIurqLEKg== +"@abp/bootstrap-daterangepicker@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-9.1.0.tgz#1993c539837eb31de174cba9f0bccd441a98f209" + integrity sha512-jS1jTqP6KCXQYX9xZpDAI07C94nwzXrNJD3H0pJXsXoOva3TTBQDD8khf6RDb7tiZrkrNJqmMyUiCfVTDbO7zg== dependencies: bootstrap-daterangepicker "^3.1.0" -"@abp/bootstrap@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-9.1.0-rc.3.tgz#01be98456635982e5b43a49318d0bcc55163fad7" - integrity sha512-Xi2TPaReFl3vnnFW974Cc4Sb25Iq+RwzkoGXiJFUiwGgYHbHHCd5Jd9Af6KYNchjP9SJKFYELwKZcQdxEIHauQ== +"@abp/bootstrap@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-9.1.0.tgz#a06c1cd4c11554c29973db70c6a383efebb10b4e" + integrity sha512-r6onkBnpqoWrdYLDVZTiqgQBvH5UZerYRrPB3Ky+RkXJhgwn7AM3LAVrB42sIvFZRNbwOlvuAL+a0+5yDOH67Q== dependencies: - "@abp/core" "~9.1.0-rc.3" + "@abp/core" "~9.1.0" bootstrap "^5.3.3" -"@abp/core@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-9.1.0-rc.3.tgz#4749bd60813ddceb156dec045e7f9eb0b3e19446" - integrity sha512-xYr9zbHCz+v672AuFWSmvqeo0CgAwZTr9laAp58QOCzO2QsVHuDUy60epGhIxCTRc3iCBkcelIFDFlGrN30WSw== +"@abp/core@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-9.1.0.tgz#af78fc096932d4ec45216b5e910c87a72e479b1f" + integrity sha512-6P0KGh5+IqlhQnUOyzaGaKrKzOAm1G0gg8Ay3DXyW2ksY6Zr+lyi5cxNsSi4ix1dicqfydIKvLfV+DF3mQf/dw== dependencies: - "@abp/utils" "~9.1.0-rc.3" + "@abp/utils" "~9.1.0" -"@abp/datatables.net-bs5@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-9.1.0-rc.3.tgz#984d6550124cf0221f8233306483aff72a38249e" - integrity sha512-qJ777clztaau92sLvDgsxIQdKnFpZqQqn3/N2y81eixELm/t/qRiE0ySNduNDnvzik6/uWmfnG82ToCmmTFP2g== +"@abp/datatables.net-bs5@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-9.1.0.tgz#3b2e7d68e947db3d3432ab5e8bff4da89a85d05d" + integrity sha512-zBrzOrfvTPJcc6mvHZDPVdXbWesKU0lKlrb7vuBZxWjrFNwVC0d/KNJPcYVvyQ3zf9rrQB5Xg0MDgu0k5Tt7tQ== dependencies: - "@abp/datatables.net" "~9.1.0-rc.3" + "@abp/datatables.net" "~9.1.0" datatables.net-bs5 "^2.1.8" -"@abp/datatables.net@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-9.1.0-rc.3.tgz#5495345014b6dc3faa67415b2c37ee84b1e4dbbc" - integrity sha512-jKn9DIQrlxMU/dedYaFjfHADPuMfs+6nUojYDGUPd76Ov1TKFNA0N/6ipB7UMYd3xVPEEmgkBH8pqf0qR8D64w== +"@abp/datatables.net@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-9.1.0.tgz#12d6e1412aac4a2e0a61437dcdfbfbe1add7fed7" + integrity sha512-lYRvEZUkntaI+dS9Xkz23Z54eDeZ1R4Wzhqcg6VIsz3iO5kYAa5GiQjcOiBssNGJSLuaet6R5Pqh1ThEUjfvvA== dependencies: - "@abp/jquery" "~9.1.0-rc.3" + "@abp/jquery" "~9.1.0" datatables.net "^2.1.8" -"@abp/font-awesome@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-9.1.0-rc.3.tgz#259dcac2f20da57a72b9c41129c465935abc125f" - integrity sha512-fAExSAn0VaPWfx9kPwIKB0xbSSMHZst/NiNXRPhIrCGty/PXp5OV8ao+mqKcsLQJTPFz1RaSxpdq/1s3tAiGWQ== +"@abp/font-awesome@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-9.1.0.tgz#af21ff2d7c332deb1df626404b53a78d790ba842" + integrity sha512-HcJzDCACGejOIvhxsorCdaesyDHnupR/sl5YFCsGikSqATyOSKQy4pw8wKsb1z+FCT5JYCTR7ROJ3lB1lTEgZw== dependencies: - "@abp/core" "~9.1.0-rc.3" + "@abp/core" "~9.1.0" "@fortawesome/fontawesome-free" "^6.6.0" -"@abp/jquery-form@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-9.1.0-rc.3.tgz#c1ee21a5f38dcf0fdbb0c3e2db3f66bc81ae66b1" - integrity sha512-YJ2CDjJVbNpqs88CGgsHnPtJG4BjYLQ0XFVT+Ph9ar5YnuQrYfB60HMdtnQlqn337hkbzVx2XHLJ6h0tT8To9Q== +"@abp/jquery-form@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-9.1.0.tgz#bdb96436c54b2a09ac4259db97e1e577410e1fc3" + integrity sha512-xjHXWstVY6B3MPB4/8g0EJeHlVvlV010OMZKFmfCGLFi6aHAEKqqWh1rMItAiVuSmCCzL0m/208ZkpoCI++jGQ== dependencies: - "@abp/jquery" "~9.1.0-rc.3" + "@abp/jquery" "~9.1.0" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-9.1.0-rc.3.tgz#88976407a14276244a01a24daeda6b236298e917" - integrity sha512-Yac7l/rjHxdogPyMO8LlJklndDBCwZ+qLeTbCcYt7NQnnsnn+xXomSwjFWv8sguTVKG1eL68LquGUCbNwNfrUA== +"@abp/jquery-validation-unobtrusive@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-9.1.0.tgz#798551e7c14ba286a819a48804107a53e974c1ee" + integrity sha512-TggKckfbLtB7Ig2kNt2kH//GaJUns8OZbpdKdh7vCWIAGedw2FLNCABCpoGnyNp0s/dVOtdyxRl9eFRN3+a4tw== dependencies: - "@abp/jquery-validation" "~9.1.0-rc.3" + "@abp/jquery-validation" "~9.1.0" jquery-validation-unobtrusive "^4.0.0" -"@abp/jquery-validation@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-9.1.0-rc.3.tgz#1ff99dea2f2c52e58a50d06b51e0cbca15ff690c" - integrity sha512-YB1t1m+s+vHGuxSt0h4cgIMIpwRy129pjV08Jja1QtCFhE+VgA9hjvx0OVaVcm31aLLt/KU/+NrO36AbebL+zA== +"@abp/jquery-validation@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-9.1.0.tgz#b771652377fbfb3c92ce03b7b7c069a3bb2ae70b" + integrity sha512-bmPSOHcxjitB8NkiLv0SxxuSS3FlCq9SiTUGvsT8nOStDsm+KpyYSzZQq8LSCyqWWj54tlOARTfcD4tMK7/K3Q== dependencies: - "@abp/jquery" "~9.1.0-rc.3" + "@abp/jquery" "~9.1.0" jquery-validation "^1.21.0" -"@abp/jquery@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-9.1.0-rc.3.tgz#0386a2857271dc4c1e04da9e4b304637bbc2d696" - integrity sha512-1UqztwQ92m6kvYE+Tb0rj7iITHngKdGI5kEpZKOHrEWqnMKeEoPbO1cL+ZOWN0m162WJiliod1HEOxW8b9Ha2Q== +"@abp/jquery@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-9.1.0.tgz#952b61ea3e4a99e6551f667297dbb637d83f3c50" + integrity sha512-Ulw8ClAbqmxceNYCb76bR6dq7e9b7Hs6mjlEy05zdbsSNuZW3UoycsJ+BquXi+dUNBo6OppqEmhVeiIjAKTaFg== dependencies: - "@abp/core" "~9.1.0-rc.3" + "@abp/core" "~9.1.0" jquery "~3.7.1" -"@abp/lodash@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-9.1.0-rc.3.tgz#26f53847ed05a171d71c6c6f1ba33d8c4e2a624a" - integrity sha512-eUuNYTk6hla5kOdc5lOBVoKhMBfnkfXdawb+/LtwBwjCQym+XRTCenJhqzxii293xwd+0G1l5M+8VaPWFq6WWg== +"@abp/lodash@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-9.1.0.tgz#62c784bd99c9e1ccfa82905e843375c594ef8584" + integrity sha512-cCE3ZwwWcPrh+ccKx4AS1USL1ttbrXBqci/l+ROjXhFzrs6GYnhI0+30xRZgPdPRm3U3nGPrSaDAU7UuHkRScg== dependencies: - "@abp/core" "~9.1.0-rc.3" + "@abp/core" "~9.1.0" lodash "^4.17.21" -"@abp/luxon@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-9.1.0-rc.3.tgz#0cfae9b2188c9827963e693dbfaaefcce714bdd9" - integrity sha512-UxtDDyLvHr3sPhrWX+uj9JrsN6idYKH+srOmAKC8+FOfWW/YdFAJmsYPLMCov7FoSWXHG+BQhkuXeCCBppyiVA== +"@abp/luxon@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-9.1.0.tgz#b246f3627bbc7ce41b7878fce1679da473b0e0ae" + integrity sha512-AouS/qEK+i69hwr4XtUOCepONLuR+1gdHFb50RpOEbUoDfTYmYpxPBdiICmZPeJ3CExErITPZxzzngCnKPPOUw== dependencies: - "@abp/core" "~9.1.0-rc.3" + "@abp/core" "~9.1.0" luxon "^3.5.0" -"@abp/malihu-custom-scrollbar-plugin@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-9.1.0-rc.3.tgz#08071e21260f867fc2a7d7594dcdf30da921bb47" - integrity sha512-WDWcm4JsTzq4Se8Sg+v6U5ymjbfVOXsU2WR66RSUL8TSq3WM1MLuRaStDGxtt8nOLvPfqiPWIzb2BvsfyePNRw== +"@abp/malihu-custom-scrollbar-plugin@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-9.1.0.tgz#288ae1916a78100f2c728dfd05a560ee99fafae4" + integrity sha512-McdMRDtbTZBjp//3GMVjRjkc16HNYDEdPc2ar1xrY817e0tEln6/TBkItAcfOvjso0TsLcvlNL1+1bjbMjj8OA== dependencies: - "@abp/core" "~9.1.0-rc.3" + "@abp/core" "~9.1.0" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/moment@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-9.1.0-rc.3.tgz#3cb5b000be73e4d681d3d115be98a8422a66e307" - integrity sha512-K30pG1xRGOJ5m7rJI6u5hKv5Lcjmqxqx7cekDf9HURzgpBGLCvMnnXFSx97w0LcPOYzCVxorfTdw6S3sC12idw== +"@abp/moment@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-9.1.0.tgz#f3c0ae02209e496913cda53df752dabc5be648bd" + integrity sha512-WxR1l09vwxRhqyvAVP4m4IBOFjIC4pzLOmelloqES+gL/klw+T/AmY21Z/z+OV0p7aJ3V3Q1aQStuMCDCyGFnQ== dependencies: moment "^2.30.1" -"@abp/select2@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-9.1.0-rc.3.tgz#7bd050e4847c0b8366fd582200f27065ecc4ff57" - integrity sha512-0k5P+amCqNE2cPAGQpEwFl+vMssuKSbpZ0XgHfF0z3EcE1bAuYDo41nAfk/amsJn5Dt55xJcC+yesADkAXEeIA== +"@abp/select2@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-9.1.0.tgz#9c2c6751f8506fb375c9b7c42a008c168a8f4c75" + integrity sha512-n6HqsH8aFLMrqL6LJ0gsHFlaq6T1QSt/x7HkkZyhDC7CwhXajxtsJEstDnDF9naHSXX/lerPbrHEgzn2QRMBqg== dependencies: - "@abp/core" "~9.1.0-rc.3" + "@abp/core" "~9.1.0" select2 "^4.0.13" -"@abp/sweetalert2@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-9.1.0-rc.3.tgz#69751518ea84b8a306478f48b516946363a7fa7f" - integrity sha512-iHk6JzD9qzmdvr/LjAwSVFfX1WmipzQNcCYwUB+kKe2uSfwufYz+9+iYjYcm7uVvZSd9LniIvzvQXyZlfMSy5w== +"@abp/sweetalert2@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-9.1.0.tgz#660f9b1db60cc04bde6cadbcf3c55320d20c2f3e" + integrity sha512-z3JMeAwva2vR8qZSRJ/BisQDdAEqjDJ/6oIGu/JYXQEchO1Lnd9UMV376nc3crLJdnyRRO7Qs6zx4FfVOCH0kw== dependencies: - "@abp/core" "~9.1.0-rc.3" + "@abp/core" "~9.1.0" sweetalert2 "^11.14.1" -"@abp/timeago@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-9.1.0-rc.3.tgz#b1eb20d6c9fe47a6d0ace8565ea8289f1af9c0a1" - integrity sha512-7hq2+HHQ91/xXFGK417dkgFNKU7z49bVN7tkHLMJyKkJb1iP3N0gCz3HdkCRjnM6yrRXQDYUmO/zCv6yBwakjA== +"@abp/timeago@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-9.1.0.tgz#496e40153241bae5d418d79cc6c65c9db6306447" + integrity sha512-a/UAYQ2GrhYFGx4p0hqr3x+teBqnjnOiWJEPq9//RTlz+EZ+OUyHbJrcUtqZRvaGJtOAsfmljD3jYnOXUlU7DA== dependencies: - "@abp/jquery" "~9.1.0-rc.3" + "@abp/jquery" "~9.1.0" timeago "^1.6.7" -"@abp/toastr@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-9.1.0-rc.3.tgz#de490bfd6b41919d96be0544aaaee3d457cf9f32" - integrity sha512-hLe3FXyplQmhRbvBZdLVt+6yRAfptAJzwU2S5iHbs5r4ncO1ampCClZNNLNmrCglDQ30ZkgrPg4SjHn9V6HyIQ== +"@abp/toastr@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-9.1.0.tgz#501cbe211164b2e7416a2d4878cb34aed3550b7c" + integrity sha512-BkTDuU0p9Qa4+HT9CYwiPQjVTrbTSNBgQ18h69S3lIadLJwdC6pXeLbL9bhe+5fiuhq2f+0Oqo3X75LNEgzHkw== dependencies: - "@abp/jquery" "~9.1.0-rc.3" + "@abp/jquery" "~9.1.0" toastr "^2.1.4" -"@abp/utils@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-9.1.0-rc.3.tgz#84de6ab4497c74b2c0c04f604dc6d542a50a1534" - integrity sha512-Tw9gNUAFjmieVrnril7YxwqthpSkZiY01uW60/+Dkd3jh9qZntqgzIcKG6/TXjimWK6iN8YZFOJ0cShCnHW0Jg== +"@abp/utils@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-9.1.0.tgz#a4fd37d943df18b5c11f5d4869efd5d8882b7959" + integrity sha512-+UZo0ocTEZlRO41SzzHNdinjdFUDVq8wYZSj5BA1bqCVeWYhfjI2+rl9DuogCN8UEuCACA4K/qb4XcE/untQ3g== dependencies: just-compare "^2.3.0" diff --git a/modules/cms-kit/angular/package.json b/modules/cms-kit/angular/package.json index 1a8aabd715..22be2478a6 100644 --- a/modules/cms-kit/angular/package.json +++ b/modules/cms-kit/angular/package.json @@ -15,11 +15,11 @@ }, "private": true, "dependencies": { - "@abp/ng.account": "~9.1.0-rc.3", - "@abp/ng.identity": "~9.1.0-rc.3", - "@abp/ng.setting-management": "~9.1.0-rc.3", - "@abp/ng.tenant-management": "~9.1.0-rc.3", - "@abp/ng.theme.basic": "~9.1.0-rc.3", + "@abp/ng.account": "~9.1.0", + "@abp/ng.identity": "~9.1.0", + "@abp/ng.setting-management": "~9.1.0", + "@abp/ng.tenant-management": "~9.1.0", + "@abp/ng.theme.basic": "~9.1.0", "@angular/animations": "~10.0.0", "@angular/common": "~10.0.0", "@angular/compiler": "~10.0.0", diff --git a/modules/cms-kit/angular/projects/cms-kit/package.json b/modules/cms-kit/angular/projects/cms-kit/package.json index f67a3a2862..809fdf22e7 100644 --- a/modules/cms-kit/angular/projects/cms-kit/package.json +++ b/modules/cms-kit/angular/projects/cms-kit/package.json @@ -4,8 +4,8 @@ "peerDependencies": { "@angular/common": "^9.1.11", "@angular/core": "^9.1.11", - "@abp/ng.core": ">=9.1.0-rc.3", - "@abp/ng.theme.shared": ">=9.1.0-rc.3" + "@abp/ng.core": ">=9.1.0", + "@abp/ng.theme.shared": ">=9.1.0" }, "dependencies": { "tslib": "^2.0.0" diff --git a/modules/cms-kit/host/Volo.CmsKit.IdentityServer/package.json b/modules/cms-kit/host/Volo.CmsKit.IdentityServer/package.json index cba804d49d..f87ddf48c9 100644 --- a/modules/cms-kit/host/Volo.CmsKit.IdentityServer/package.json +++ b/modules/cms-kit/host/Volo.CmsKit.IdentityServer/package.json @@ -3,6 +3,6 @@ "name": "my-app-identityserver", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "~9.1.0-rc.3" + "@abp/aspnetcore.mvc.ui.theme.basic": "~9.1.0" } } diff --git a/modules/cms-kit/host/Volo.CmsKit.IdentityServer/yarn.lock b/modules/cms-kit/host/Volo.CmsKit.IdentityServer/yarn.lock index aa487218c9..38a43d8ed5 100644 --- a/modules/cms-kit/host/Volo.CmsKit.IdentityServer/yarn.lock +++ b/modules/cms-kit/host/Volo.CmsKit.IdentityServer/yarn.lock @@ -2,194 +2,194 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.basic@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-9.1.0-rc.3.tgz#c291f2760d32a9745c4b15a62c13abec9b7e247f" - integrity sha512-f14SIEfZkvSgYBfM/rcDmn0mgkIHGqi6lRP7GeBRUPEhB944osyCFmJH3CWDjJcjTFbqWTvKVlDRsV0Roz5eqg== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~9.1.0-rc.3" - -"@abp/aspnetcore.mvc.ui.theme.shared@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-9.1.0-rc.3.tgz#c05d8b39fc1ef2a9c890c480cb1ec8f47ee10669" - integrity sha512-BTLoVlaYjKrW0Rhrqw4tNiHf5LV8/zBxh90OM7smKYPGOftHhSWSNUUSO5upOdOsVhNSPIxY83PF/LHp29kH8g== - dependencies: - "@abp/aspnetcore.mvc.ui" "~9.1.0-rc.3" - "@abp/bootstrap" "~9.1.0-rc.3" - "@abp/bootstrap-datepicker" "~9.1.0-rc.3" - "@abp/bootstrap-daterangepicker" "~9.1.0-rc.3" - "@abp/datatables.net-bs5" "~9.1.0-rc.3" - "@abp/font-awesome" "~9.1.0-rc.3" - "@abp/jquery-form" "~9.1.0-rc.3" - "@abp/jquery-validation-unobtrusive" "~9.1.0-rc.3" - "@abp/lodash" "~9.1.0-rc.3" - "@abp/luxon" "~9.1.0-rc.3" - "@abp/malihu-custom-scrollbar-plugin" "~9.1.0-rc.3" - "@abp/moment" "~9.1.0-rc.3" - "@abp/select2" "~9.1.0-rc.3" - "@abp/sweetalert2" "~9.1.0-rc.3" - "@abp/timeago" "~9.1.0-rc.3" - "@abp/toastr" "~9.1.0-rc.3" - -"@abp/aspnetcore.mvc.ui@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-9.1.0-rc.3.tgz#88252e0fb822fe9560ed89d2118c7b32a32ba496" - integrity sha512-WGjWNoN97uxjMc173w36UV8UVGxLbDrOcglnqK+RY+E9vIxFGDmWBvwzmJ1KfZRvlwahXtMjTCiYFKO411lh1w== +"@abp/aspnetcore.mvc.ui.theme.basic@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-9.1.0.tgz#e9e0321037c34b43145dfc7827c422fbf79f59ab" + integrity sha512-vLkyrdFXw0/MPyU2hzqGJJk7trmIlVMdflNIe/rF77UIRmJYHWaTmPt9i5PLN/O4s0jnE9kWlaaJ/VnnFWeGsQ== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~9.1.0" + +"@abp/aspnetcore.mvc.ui.theme.shared@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-9.1.0.tgz#35a73580b9b67a33708f2cf897243b50c9ad7100" + integrity sha512-rggTYL9poOFICsOseDX22JNhD0KWH8Oxs0YH91TZjvm/F67cPemW99eBlJc/YdJ7bN6icRiebN8m81y9MSanyg== + dependencies: + "@abp/aspnetcore.mvc.ui" "~9.1.0" + "@abp/bootstrap" "~9.1.0" + "@abp/bootstrap-datepicker" "~9.1.0" + "@abp/bootstrap-daterangepicker" "~9.1.0" + "@abp/datatables.net-bs5" "~9.1.0" + "@abp/font-awesome" "~9.1.0" + "@abp/jquery-form" "~9.1.0" + "@abp/jquery-validation-unobtrusive" "~9.1.0" + "@abp/lodash" "~9.1.0" + "@abp/luxon" "~9.1.0" + "@abp/malihu-custom-scrollbar-plugin" "~9.1.0" + "@abp/moment" "~9.1.0" + "@abp/select2" "~9.1.0" + "@abp/sweetalert2" "~9.1.0" + "@abp/timeago" "~9.1.0" + "@abp/toastr" "~9.1.0" + +"@abp/aspnetcore.mvc.ui@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-9.1.0.tgz#38d058ab148a36ad4d63870e8a501ca339e4a70e" + integrity sha512-lUw1ij87KJp+Rj4cz8oSQkdRuoMq76l/wIAGwtXH+EOKusVpSJTOTioAV/tPKeKZ15ubE4bO5jWcQGxZkXgH3w== dependencies: ansi-colors "^4.1.3" -"@abp/bootstrap-datepicker@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-9.1.0-rc.3.tgz#8376fb204851b8e7be6fb5afe6e023f706426bc2" - integrity sha512-bKPeRpqzHlSCnItxesp+QnAewFcwuB1hmncRydhOg9ImvzRN0M9fAfSXeP7VTYH+2ygDKVEtK+8aAh1RjAryuA== +"@abp/bootstrap-datepicker@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-9.1.0.tgz#96a1875a2b92f03b8f90f7842ebf8849cf8a4d04" + integrity sha512-3FQm1SK8qmzoP7LOvXkZpq1AzrdPHKRdQJjoqK9N+lQxQjNfOxEFMxeDSg6WJKO619Cnve++jAyMidojXlCiwQ== dependencies: bootstrap-datepicker "^1.10.0" -"@abp/bootstrap-daterangepicker@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-9.1.0-rc.3.tgz#f14dd37eb7a4fe4d6cb823da1ee80dc28154d0df" - integrity sha512-C7KXx1630JK4mOrMZEQoiH4vzQZn6JfrS6k8nAX0p48zRNcx8oxwviaojRcu+MjDl/rDHc5U9Xy9lBIurqLEKg== +"@abp/bootstrap-daterangepicker@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-9.1.0.tgz#1993c539837eb31de174cba9f0bccd441a98f209" + integrity sha512-jS1jTqP6KCXQYX9xZpDAI07C94nwzXrNJD3H0pJXsXoOva3TTBQDD8khf6RDb7tiZrkrNJqmMyUiCfVTDbO7zg== dependencies: bootstrap-daterangepicker "^3.1.0" -"@abp/bootstrap@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-9.1.0-rc.3.tgz#01be98456635982e5b43a49318d0bcc55163fad7" - integrity sha512-Xi2TPaReFl3vnnFW974Cc4Sb25Iq+RwzkoGXiJFUiwGgYHbHHCd5Jd9Af6KYNchjP9SJKFYELwKZcQdxEIHauQ== +"@abp/bootstrap@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-9.1.0.tgz#a06c1cd4c11554c29973db70c6a383efebb10b4e" + integrity sha512-r6onkBnpqoWrdYLDVZTiqgQBvH5UZerYRrPB3Ky+RkXJhgwn7AM3LAVrB42sIvFZRNbwOlvuAL+a0+5yDOH67Q== dependencies: - "@abp/core" "~9.1.0-rc.3" + "@abp/core" "~9.1.0" bootstrap "^5.3.3" -"@abp/core@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-9.1.0-rc.3.tgz#4749bd60813ddceb156dec045e7f9eb0b3e19446" - integrity sha512-xYr9zbHCz+v672AuFWSmvqeo0CgAwZTr9laAp58QOCzO2QsVHuDUy60epGhIxCTRc3iCBkcelIFDFlGrN30WSw== +"@abp/core@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-9.1.0.tgz#af78fc096932d4ec45216b5e910c87a72e479b1f" + integrity sha512-6P0KGh5+IqlhQnUOyzaGaKrKzOAm1G0gg8Ay3DXyW2ksY6Zr+lyi5cxNsSi4ix1dicqfydIKvLfV+DF3mQf/dw== dependencies: - "@abp/utils" "~9.1.0-rc.3" + "@abp/utils" "~9.1.0" -"@abp/datatables.net-bs5@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-9.1.0-rc.3.tgz#984d6550124cf0221f8233306483aff72a38249e" - integrity sha512-qJ777clztaau92sLvDgsxIQdKnFpZqQqn3/N2y81eixELm/t/qRiE0ySNduNDnvzik6/uWmfnG82ToCmmTFP2g== +"@abp/datatables.net-bs5@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-9.1.0.tgz#3b2e7d68e947db3d3432ab5e8bff4da89a85d05d" + integrity sha512-zBrzOrfvTPJcc6mvHZDPVdXbWesKU0lKlrb7vuBZxWjrFNwVC0d/KNJPcYVvyQ3zf9rrQB5Xg0MDgu0k5Tt7tQ== dependencies: - "@abp/datatables.net" "~9.1.0-rc.3" + "@abp/datatables.net" "~9.1.0" datatables.net-bs5 "^2.1.8" -"@abp/datatables.net@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-9.1.0-rc.3.tgz#5495345014b6dc3faa67415b2c37ee84b1e4dbbc" - integrity sha512-jKn9DIQrlxMU/dedYaFjfHADPuMfs+6nUojYDGUPd76Ov1TKFNA0N/6ipB7UMYd3xVPEEmgkBH8pqf0qR8D64w== +"@abp/datatables.net@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-9.1.0.tgz#12d6e1412aac4a2e0a61437dcdfbfbe1add7fed7" + integrity sha512-lYRvEZUkntaI+dS9Xkz23Z54eDeZ1R4Wzhqcg6VIsz3iO5kYAa5GiQjcOiBssNGJSLuaet6R5Pqh1ThEUjfvvA== dependencies: - "@abp/jquery" "~9.1.0-rc.3" + "@abp/jquery" "~9.1.0" datatables.net "^2.1.8" -"@abp/font-awesome@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-9.1.0-rc.3.tgz#259dcac2f20da57a72b9c41129c465935abc125f" - integrity sha512-fAExSAn0VaPWfx9kPwIKB0xbSSMHZst/NiNXRPhIrCGty/PXp5OV8ao+mqKcsLQJTPFz1RaSxpdq/1s3tAiGWQ== +"@abp/font-awesome@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-9.1.0.tgz#af21ff2d7c332deb1df626404b53a78d790ba842" + integrity sha512-HcJzDCACGejOIvhxsorCdaesyDHnupR/sl5YFCsGikSqATyOSKQy4pw8wKsb1z+FCT5JYCTR7ROJ3lB1lTEgZw== dependencies: - "@abp/core" "~9.1.0-rc.3" + "@abp/core" "~9.1.0" "@fortawesome/fontawesome-free" "^6.6.0" -"@abp/jquery-form@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-9.1.0-rc.3.tgz#c1ee21a5f38dcf0fdbb0c3e2db3f66bc81ae66b1" - integrity sha512-YJ2CDjJVbNpqs88CGgsHnPtJG4BjYLQ0XFVT+Ph9ar5YnuQrYfB60HMdtnQlqn337hkbzVx2XHLJ6h0tT8To9Q== +"@abp/jquery-form@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-9.1.0.tgz#bdb96436c54b2a09ac4259db97e1e577410e1fc3" + integrity sha512-xjHXWstVY6B3MPB4/8g0EJeHlVvlV010OMZKFmfCGLFi6aHAEKqqWh1rMItAiVuSmCCzL0m/208ZkpoCI++jGQ== dependencies: - "@abp/jquery" "~9.1.0-rc.3" + "@abp/jquery" "~9.1.0" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-9.1.0-rc.3.tgz#88976407a14276244a01a24daeda6b236298e917" - integrity sha512-Yac7l/rjHxdogPyMO8LlJklndDBCwZ+qLeTbCcYt7NQnnsnn+xXomSwjFWv8sguTVKG1eL68LquGUCbNwNfrUA== +"@abp/jquery-validation-unobtrusive@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-9.1.0.tgz#798551e7c14ba286a819a48804107a53e974c1ee" + integrity sha512-TggKckfbLtB7Ig2kNt2kH//GaJUns8OZbpdKdh7vCWIAGedw2FLNCABCpoGnyNp0s/dVOtdyxRl9eFRN3+a4tw== dependencies: - "@abp/jquery-validation" "~9.1.0-rc.3" + "@abp/jquery-validation" "~9.1.0" jquery-validation-unobtrusive "^4.0.0" -"@abp/jquery-validation@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-9.1.0-rc.3.tgz#1ff99dea2f2c52e58a50d06b51e0cbca15ff690c" - integrity sha512-YB1t1m+s+vHGuxSt0h4cgIMIpwRy129pjV08Jja1QtCFhE+VgA9hjvx0OVaVcm31aLLt/KU/+NrO36AbebL+zA== +"@abp/jquery-validation@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-9.1.0.tgz#b771652377fbfb3c92ce03b7b7c069a3bb2ae70b" + integrity sha512-bmPSOHcxjitB8NkiLv0SxxuSS3FlCq9SiTUGvsT8nOStDsm+KpyYSzZQq8LSCyqWWj54tlOARTfcD4tMK7/K3Q== dependencies: - "@abp/jquery" "~9.1.0-rc.3" + "@abp/jquery" "~9.1.0" jquery-validation "^1.21.0" -"@abp/jquery@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-9.1.0-rc.3.tgz#0386a2857271dc4c1e04da9e4b304637bbc2d696" - integrity sha512-1UqztwQ92m6kvYE+Tb0rj7iITHngKdGI5kEpZKOHrEWqnMKeEoPbO1cL+ZOWN0m162WJiliod1HEOxW8b9Ha2Q== +"@abp/jquery@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-9.1.0.tgz#952b61ea3e4a99e6551f667297dbb637d83f3c50" + integrity sha512-Ulw8ClAbqmxceNYCb76bR6dq7e9b7Hs6mjlEy05zdbsSNuZW3UoycsJ+BquXi+dUNBo6OppqEmhVeiIjAKTaFg== dependencies: - "@abp/core" "~9.1.0-rc.3" + "@abp/core" "~9.1.0" jquery "~3.7.1" -"@abp/lodash@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-9.1.0-rc.3.tgz#26f53847ed05a171d71c6c6f1ba33d8c4e2a624a" - integrity sha512-eUuNYTk6hla5kOdc5lOBVoKhMBfnkfXdawb+/LtwBwjCQym+XRTCenJhqzxii293xwd+0G1l5M+8VaPWFq6WWg== +"@abp/lodash@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-9.1.0.tgz#62c784bd99c9e1ccfa82905e843375c594ef8584" + integrity sha512-cCE3ZwwWcPrh+ccKx4AS1USL1ttbrXBqci/l+ROjXhFzrs6GYnhI0+30xRZgPdPRm3U3nGPrSaDAU7UuHkRScg== dependencies: - "@abp/core" "~9.1.0-rc.3" + "@abp/core" "~9.1.0" lodash "^4.17.21" -"@abp/luxon@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-9.1.0-rc.3.tgz#0cfae9b2188c9827963e693dbfaaefcce714bdd9" - integrity sha512-UxtDDyLvHr3sPhrWX+uj9JrsN6idYKH+srOmAKC8+FOfWW/YdFAJmsYPLMCov7FoSWXHG+BQhkuXeCCBppyiVA== +"@abp/luxon@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-9.1.0.tgz#b246f3627bbc7ce41b7878fce1679da473b0e0ae" + integrity sha512-AouS/qEK+i69hwr4XtUOCepONLuR+1gdHFb50RpOEbUoDfTYmYpxPBdiICmZPeJ3CExErITPZxzzngCnKPPOUw== dependencies: - "@abp/core" "~9.1.0-rc.3" + "@abp/core" "~9.1.0" luxon "^3.5.0" -"@abp/malihu-custom-scrollbar-plugin@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-9.1.0-rc.3.tgz#08071e21260f867fc2a7d7594dcdf30da921bb47" - integrity sha512-WDWcm4JsTzq4Se8Sg+v6U5ymjbfVOXsU2WR66RSUL8TSq3WM1MLuRaStDGxtt8nOLvPfqiPWIzb2BvsfyePNRw== +"@abp/malihu-custom-scrollbar-plugin@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-9.1.0.tgz#288ae1916a78100f2c728dfd05a560ee99fafae4" + integrity sha512-McdMRDtbTZBjp//3GMVjRjkc16HNYDEdPc2ar1xrY817e0tEln6/TBkItAcfOvjso0TsLcvlNL1+1bjbMjj8OA== dependencies: - "@abp/core" "~9.1.0-rc.3" + "@abp/core" "~9.1.0" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/moment@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-9.1.0-rc.3.tgz#3cb5b000be73e4d681d3d115be98a8422a66e307" - integrity sha512-K30pG1xRGOJ5m7rJI6u5hKv5Lcjmqxqx7cekDf9HURzgpBGLCvMnnXFSx97w0LcPOYzCVxorfTdw6S3sC12idw== +"@abp/moment@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-9.1.0.tgz#f3c0ae02209e496913cda53df752dabc5be648bd" + integrity sha512-WxR1l09vwxRhqyvAVP4m4IBOFjIC4pzLOmelloqES+gL/klw+T/AmY21Z/z+OV0p7aJ3V3Q1aQStuMCDCyGFnQ== dependencies: moment "^2.30.1" -"@abp/select2@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-9.1.0-rc.3.tgz#7bd050e4847c0b8366fd582200f27065ecc4ff57" - integrity sha512-0k5P+amCqNE2cPAGQpEwFl+vMssuKSbpZ0XgHfF0z3EcE1bAuYDo41nAfk/amsJn5Dt55xJcC+yesADkAXEeIA== +"@abp/select2@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-9.1.0.tgz#9c2c6751f8506fb375c9b7c42a008c168a8f4c75" + integrity sha512-n6HqsH8aFLMrqL6LJ0gsHFlaq6T1QSt/x7HkkZyhDC7CwhXajxtsJEstDnDF9naHSXX/lerPbrHEgzn2QRMBqg== dependencies: - "@abp/core" "~9.1.0-rc.3" + "@abp/core" "~9.1.0" select2 "^4.0.13" -"@abp/sweetalert2@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-9.1.0-rc.3.tgz#69751518ea84b8a306478f48b516946363a7fa7f" - integrity sha512-iHk6JzD9qzmdvr/LjAwSVFfX1WmipzQNcCYwUB+kKe2uSfwufYz+9+iYjYcm7uVvZSd9LniIvzvQXyZlfMSy5w== +"@abp/sweetalert2@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-9.1.0.tgz#660f9b1db60cc04bde6cadbcf3c55320d20c2f3e" + integrity sha512-z3JMeAwva2vR8qZSRJ/BisQDdAEqjDJ/6oIGu/JYXQEchO1Lnd9UMV376nc3crLJdnyRRO7Qs6zx4FfVOCH0kw== dependencies: - "@abp/core" "~9.1.0-rc.3" + "@abp/core" "~9.1.0" sweetalert2 "^11.14.1" -"@abp/timeago@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-9.1.0-rc.3.tgz#b1eb20d6c9fe47a6d0ace8565ea8289f1af9c0a1" - integrity sha512-7hq2+HHQ91/xXFGK417dkgFNKU7z49bVN7tkHLMJyKkJb1iP3N0gCz3HdkCRjnM6yrRXQDYUmO/zCv6yBwakjA== +"@abp/timeago@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-9.1.0.tgz#496e40153241bae5d418d79cc6c65c9db6306447" + integrity sha512-a/UAYQ2GrhYFGx4p0hqr3x+teBqnjnOiWJEPq9//RTlz+EZ+OUyHbJrcUtqZRvaGJtOAsfmljD3jYnOXUlU7DA== dependencies: - "@abp/jquery" "~9.1.0-rc.3" + "@abp/jquery" "~9.1.0" timeago "^1.6.7" -"@abp/toastr@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-9.1.0-rc.3.tgz#de490bfd6b41919d96be0544aaaee3d457cf9f32" - integrity sha512-hLe3FXyplQmhRbvBZdLVt+6yRAfptAJzwU2S5iHbs5r4ncO1ampCClZNNLNmrCglDQ30ZkgrPg4SjHn9V6HyIQ== +"@abp/toastr@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-9.1.0.tgz#501cbe211164b2e7416a2d4878cb34aed3550b7c" + integrity sha512-BkTDuU0p9Qa4+HT9CYwiPQjVTrbTSNBgQ18h69S3lIadLJwdC6pXeLbL9bhe+5fiuhq2f+0Oqo3X75LNEgzHkw== dependencies: - "@abp/jquery" "~9.1.0-rc.3" + "@abp/jquery" "~9.1.0" toastr "^2.1.4" -"@abp/utils@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-9.1.0-rc.3.tgz#84de6ab4497c74b2c0c04f604dc6d542a50a1534" - integrity sha512-Tw9gNUAFjmieVrnril7YxwqthpSkZiY01uW60/+Dkd3jh9qZntqgzIcKG6/TXjimWK6iN8YZFOJ0cShCnHW0Jg== +"@abp/utils@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-9.1.0.tgz#a4fd37d943df18b5c11f5d4869efd5d8882b7959" + integrity sha512-+UZo0ocTEZlRO41SzzHNdinjdFUDVq8wYZSj5BA1bqCVeWYhfjI2+rl9DuogCN8UEuCACA4K/qb4XcE/untQ3g== dependencies: just-compare "^2.3.0" diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Host/package.json b/modules/cms-kit/host/Volo.CmsKit.Web.Host/package.json index c1fce23f85..ef17244517 100644 --- a/modules/cms-kit/host/Volo.CmsKit.Web.Host/package.json +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Host/package.json @@ -3,6 +3,6 @@ "name": "my-app", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "~9.1.0-rc.3" + "@abp/aspnetcore.mvc.ui.theme.basic": "~9.1.0" } } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Host/yarn.lock b/modules/cms-kit/host/Volo.CmsKit.Web.Host/yarn.lock index aa487218c9..38a43d8ed5 100644 --- a/modules/cms-kit/host/Volo.CmsKit.Web.Host/yarn.lock +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Host/yarn.lock @@ -2,194 +2,194 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.basic@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-9.1.0-rc.3.tgz#c291f2760d32a9745c4b15a62c13abec9b7e247f" - integrity sha512-f14SIEfZkvSgYBfM/rcDmn0mgkIHGqi6lRP7GeBRUPEhB944osyCFmJH3CWDjJcjTFbqWTvKVlDRsV0Roz5eqg== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~9.1.0-rc.3" - -"@abp/aspnetcore.mvc.ui.theme.shared@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-9.1.0-rc.3.tgz#c05d8b39fc1ef2a9c890c480cb1ec8f47ee10669" - integrity sha512-BTLoVlaYjKrW0Rhrqw4tNiHf5LV8/zBxh90OM7smKYPGOftHhSWSNUUSO5upOdOsVhNSPIxY83PF/LHp29kH8g== - dependencies: - "@abp/aspnetcore.mvc.ui" "~9.1.0-rc.3" - "@abp/bootstrap" "~9.1.0-rc.3" - "@abp/bootstrap-datepicker" "~9.1.0-rc.3" - "@abp/bootstrap-daterangepicker" "~9.1.0-rc.3" - "@abp/datatables.net-bs5" "~9.1.0-rc.3" - "@abp/font-awesome" "~9.1.0-rc.3" - "@abp/jquery-form" "~9.1.0-rc.3" - "@abp/jquery-validation-unobtrusive" "~9.1.0-rc.3" - "@abp/lodash" "~9.1.0-rc.3" - "@abp/luxon" "~9.1.0-rc.3" - "@abp/malihu-custom-scrollbar-plugin" "~9.1.0-rc.3" - "@abp/moment" "~9.1.0-rc.3" - "@abp/select2" "~9.1.0-rc.3" - "@abp/sweetalert2" "~9.1.0-rc.3" - "@abp/timeago" "~9.1.0-rc.3" - "@abp/toastr" "~9.1.0-rc.3" - -"@abp/aspnetcore.mvc.ui@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-9.1.0-rc.3.tgz#88252e0fb822fe9560ed89d2118c7b32a32ba496" - integrity sha512-WGjWNoN97uxjMc173w36UV8UVGxLbDrOcglnqK+RY+E9vIxFGDmWBvwzmJ1KfZRvlwahXtMjTCiYFKO411lh1w== +"@abp/aspnetcore.mvc.ui.theme.basic@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-9.1.0.tgz#e9e0321037c34b43145dfc7827c422fbf79f59ab" + integrity sha512-vLkyrdFXw0/MPyU2hzqGJJk7trmIlVMdflNIe/rF77UIRmJYHWaTmPt9i5PLN/O4s0jnE9kWlaaJ/VnnFWeGsQ== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~9.1.0" + +"@abp/aspnetcore.mvc.ui.theme.shared@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-9.1.0.tgz#35a73580b9b67a33708f2cf897243b50c9ad7100" + integrity sha512-rggTYL9poOFICsOseDX22JNhD0KWH8Oxs0YH91TZjvm/F67cPemW99eBlJc/YdJ7bN6icRiebN8m81y9MSanyg== + dependencies: + "@abp/aspnetcore.mvc.ui" "~9.1.0" + "@abp/bootstrap" "~9.1.0" + "@abp/bootstrap-datepicker" "~9.1.0" + "@abp/bootstrap-daterangepicker" "~9.1.0" + "@abp/datatables.net-bs5" "~9.1.0" + "@abp/font-awesome" "~9.1.0" + "@abp/jquery-form" "~9.1.0" + "@abp/jquery-validation-unobtrusive" "~9.1.0" + "@abp/lodash" "~9.1.0" + "@abp/luxon" "~9.1.0" + "@abp/malihu-custom-scrollbar-plugin" "~9.1.0" + "@abp/moment" "~9.1.0" + "@abp/select2" "~9.1.0" + "@abp/sweetalert2" "~9.1.0" + "@abp/timeago" "~9.1.0" + "@abp/toastr" "~9.1.0" + +"@abp/aspnetcore.mvc.ui@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-9.1.0.tgz#38d058ab148a36ad4d63870e8a501ca339e4a70e" + integrity sha512-lUw1ij87KJp+Rj4cz8oSQkdRuoMq76l/wIAGwtXH+EOKusVpSJTOTioAV/tPKeKZ15ubE4bO5jWcQGxZkXgH3w== dependencies: ansi-colors "^4.1.3" -"@abp/bootstrap-datepicker@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-9.1.0-rc.3.tgz#8376fb204851b8e7be6fb5afe6e023f706426bc2" - integrity sha512-bKPeRpqzHlSCnItxesp+QnAewFcwuB1hmncRydhOg9ImvzRN0M9fAfSXeP7VTYH+2ygDKVEtK+8aAh1RjAryuA== +"@abp/bootstrap-datepicker@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-9.1.0.tgz#96a1875a2b92f03b8f90f7842ebf8849cf8a4d04" + integrity sha512-3FQm1SK8qmzoP7LOvXkZpq1AzrdPHKRdQJjoqK9N+lQxQjNfOxEFMxeDSg6WJKO619Cnve++jAyMidojXlCiwQ== dependencies: bootstrap-datepicker "^1.10.0" -"@abp/bootstrap-daterangepicker@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-9.1.0-rc.3.tgz#f14dd37eb7a4fe4d6cb823da1ee80dc28154d0df" - integrity sha512-C7KXx1630JK4mOrMZEQoiH4vzQZn6JfrS6k8nAX0p48zRNcx8oxwviaojRcu+MjDl/rDHc5U9Xy9lBIurqLEKg== +"@abp/bootstrap-daterangepicker@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-9.1.0.tgz#1993c539837eb31de174cba9f0bccd441a98f209" + integrity sha512-jS1jTqP6KCXQYX9xZpDAI07C94nwzXrNJD3H0pJXsXoOva3TTBQDD8khf6RDb7tiZrkrNJqmMyUiCfVTDbO7zg== dependencies: bootstrap-daterangepicker "^3.1.0" -"@abp/bootstrap@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-9.1.0-rc.3.tgz#01be98456635982e5b43a49318d0bcc55163fad7" - integrity sha512-Xi2TPaReFl3vnnFW974Cc4Sb25Iq+RwzkoGXiJFUiwGgYHbHHCd5Jd9Af6KYNchjP9SJKFYELwKZcQdxEIHauQ== +"@abp/bootstrap@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-9.1.0.tgz#a06c1cd4c11554c29973db70c6a383efebb10b4e" + integrity sha512-r6onkBnpqoWrdYLDVZTiqgQBvH5UZerYRrPB3Ky+RkXJhgwn7AM3LAVrB42sIvFZRNbwOlvuAL+a0+5yDOH67Q== dependencies: - "@abp/core" "~9.1.0-rc.3" + "@abp/core" "~9.1.0" bootstrap "^5.3.3" -"@abp/core@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-9.1.0-rc.3.tgz#4749bd60813ddceb156dec045e7f9eb0b3e19446" - integrity sha512-xYr9zbHCz+v672AuFWSmvqeo0CgAwZTr9laAp58QOCzO2QsVHuDUy60epGhIxCTRc3iCBkcelIFDFlGrN30WSw== +"@abp/core@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-9.1.0.tgz#af78fc096932d4ec45216b5e910c87a72e479b1f" + integrity sha512-6P0KGh5+IqlhQnUOyzaGaKrKzOAm1G0gg8Ay3DXyW2ksY6Zr+lyi5cxNsSi4ix1dicqfydIKvLfV+DF3mQf/dw== dependencies: - "@abp/utils" "~9.1.0-rc.3" + "@abp/utils" "~9.1.0" -"@abp/datatables.net-bs5@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-9.1.0-rc.3.tgz#984d6550124cf0221f8233306483aff72a38249e" - integrity sha512-qJ777clztaau92sLvDgsxIQdKnFpZqQqn3/N2y81eixELm/t/qRiE0ySNduNDnvzik6/uWmfnG82ToCmmTFP2g== +"@abp/datatables.net-bs5@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-9.1.0.tgz#3b2e7d68e947db3d3432ab5e8bff4da89a85d05d" + integrity sha512-zBrzOrfvTPJcc6mvHZDPVdXbWesKU0lKlrb7vuBZxWjrFNwVC0d/KNJPcYVvyQ3zf9rrQB5Xg0MDgu0k5Tt7tQ== dependencies: - "@abp/datatables.net" "~9.1.0-rc.3" + "@abp/datatables.net" "~9.1.0" datatables.net-bs5 "^2.1.8" -"@abp/datatables.net@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-9.1.0-rc.3.tgz#5495345014b6dc3faa67415b2c37ee84b1e4dbbc" - integrity sha512-jKn9DIQrlxMU/dedYaFjfHADPuMfs+6nUojYDGUPd76Ov1TKFNA0N/6ipB7UMYd3xVPEEmgkBH8pqf0qR8D64w== +"@abp/datatables.net@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-9.1.0.tgz#12d6e1412aac4a2e0a61437dcdfbfbe1add7fed7" + integrity sha512-lYRvEZUkntaI+dS9Xkz23Z54eDeZ1R4Wzhqcg6VIsz3iO5kYAa5GiQjcOiBssNGJSLuaet6R5Pqh1ThEUjfvvA== dependencies: - "@abp/jquery" "~9.1.0-rc.3" + "@abp/jquery" "~9.1.0" datatables.net "^2.1.8" -"@abp/font-awesome@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-9.1.0-rc.3.tgz#259dcac2f20da57a72b9c41129c465935abc125f" - integrity sha512-fAExSAn0VaPWfx9kPwIKB0xbSSMHZst/NiNXRPhIrCGty/PXp5OV8ao+mqKcsLQJTPFz1RaSxpdq/1s3tAiGWQ== +"@abp/font-awesome@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-9.1.0.tgz#af21ff2d7c332deb1df626404b53a78d790ba842" + integrity sha512-HcJzDCACGejOIvhxsorCdaesyDHnupR/sl5YFCsGikSqATyOSKQy4pw8wKsb1z+FCT5JYCTR7ROJ3lB1lTEgZw== dependencies: - "@abp/core" "~9.1.0-rc.3" + "@abp/core" "~9.1.0" "@fortawesome/fontawesome-free" "^6.6.0" -"@abp/jquery-form@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-9.1.0-rc.3.tgz#c1ee21a5f38dcf0fdbb0c3e2db3f66bc81ae66b1" - integrity sha512-YJ2CDjJVbNpqs88CGgsHnPtJG4BjYLQ0XFVT+Ph9ar5YnuQrYfB60HMdtnQlqn337hkbzVx2XHLJ6h0tT8To9Q== +"@abp/jquery-form@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-9.1.0.tgz#bdb96436c54b2a09ac4259db97e1e577410e1fc3" + integrity sha512-xjHXWstVY6B3MPB4/8g0EJeHlVvlV010OMZKFmfCGLFi6aHAEKqqWh1rMItAiVuSmCCzL0m/208ZkpoCI++jGQ== dependencies: - "@abp/jquery" "~9.1.0-rc.3" + "@abp/jquery" "~9.1.0" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-9.1.0-rc.3.tgz#88976407a14276244a01a24daeda6b236298e917" - integrity sha512-Yac7l/rjHxdogPyMO8LlJklndDBCwZ+qLeTbCcYt7NQnnsnn+xXomSwjFWv8sguTVKG1eL68LquGUCbNwNfrUA== +"@abp/jquery-validation-unobtrusive@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-9.1.0.tgz#798551e7c14ba286a819a48804107a53e974c1ee" + integrity sha512-TggKckfbLtB7Ig2kNt2kH//GaJUns8OZbpdKdh7vCWIAGedw2FLNCABCpoGnyNp0s/dVOtdyxRl9eFRN3+a4tw== dependencies: - "@abp/jquery-validation" "~9.1.0-rc.3" + "@abp/jquery-validation" "~9.1.0" jquery-validation-unobtrusive "^4.0.0" -"@abp/jquery-validation@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-9.1.0-rc.3.tgz#1ff99dea2f2c52e58a50d06b51e0cbca15ff690c" - integrity sha512-YB1t1m+s+vHGuxSt0h4cgIMIpwRy129pjV08Jja1QtCFhE+VgA9hjvx0OVaVcm31aLLt/KU/+NrO36AbebL+zA== +"@abp/jquery-validation@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-9.1.0.tgz#b771652377fbfb3c92ce03b7b7c069a3bb2ae70b" + integrity sha512-bmPSOHcxjitB8NkiLv0SxxuSS3FlCq9SiTUGvsT8nOStDsm+KpyYSzZQq8LSCyqWWj54tlOARTfcD4tMK7/K3Q== dependencies: - "@abp/jquery" "~9.1.0-rc.3" + "@abp/jquery" "~9.1.0" jquery-validation "^1.21.0" -"@abp/jquery@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-9.1.0-rc.3.tgz#0386a2857271dc4c1e04da9e4b304637bbc2d696" - integrity sha512-1UqztwQ92m6kvYE+Tb0rj7iITHngKdGI5kEpZKOHrEWqnMKeEoPbO1cL+ZOWN0m162WJiliod1HEOxW8b9Ha2Q== +"@abp/jquery@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-9.1.0.tgz#952b61ea3e4a99e6551f667297dbb637d83f3c50" + integrity sha512-Ulw8ClAbqmxceNYCb76bR6dq7e9b7Hs6mjlEy05zdbsSNuZW3UoycsJ+BquXi+dUNBo6OppqEmhVeiIjAKTaFg== dependencies: - "@abp/core" "~9.1.0-rc.3" + "@abp/core" "~9.1.0" jquery "~3.7.1" -"@abp/lodash@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-9.1.0-rc.3.tgz#26f53847ed05a171d71c6c6f1ba33d8c4e2a624a" - integrity sha512-eUuNYTk6hla5kOdc5lOBVoKhMBfnkfXdawb+/LtwBwjCQym+XRTCenJhqzxii293xwd+0G1l5M+8VaPWFq6WWg== +"@abp/lodash@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-9.1.0.tgz#62c784bd99c9e1ccfa82905e843375c594ef8584" + integrity sha512-cCE3ZwwWcPrh+ccKx4AS1USL1ttbrXBqci/l+ROjXhFzrs6GYnhI0+30xRZgPdPRm3U3nGPrSaDAU7UuHkRScg== dependencies: - "@abp/core" "~9.1.0-rc.3" + "@abp/core" "~9.1.0" lodash "^4.17.21" -"@abp/luxon@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-9.1.0-rc.3.tgz#0cfae9b2188c9827963e693dbfaaefcce714bdd9" - integrity sha512-UxtDDyLvHr3sPhrWX+uj9JrsN6idYKH+srOmAKC8+FOfWW/YdFAJmsYPLMCov7FoSWXHG+BQhkuXeCCBppyiVA== +"@abp/luxon@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-9.1.0.tgz#b246f3627bbc7ce41b7878fce1679da473b0e0ae" + integrity sha512-AouS/qEK+i69hwr4XtUOCepONLuR+1gdHFb50RpOEbUoDfTYmYpxPBdiICmZPeJ3CExErITPZxzzngCnKPPOUw== dependencies: - "@abp/core" "~9.1.0-rc.3" + "@abp/core" "~9.1.0" luxon "^3.5.0" -"@abp/malihu-custom-scrollbar-plugin@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-9.1.0-rc.3.tgz#08071e21260f867fc2a7d7594dcdf30da921bb47" - integrity sha512-WDWcm4JsTzq4Se8Sg+v6U5ymjbfVOXsU2WR66RSUL8TSq3WM1MLuRaStDGxtt8nOLvPfqiPWIzb2BvsfyePNRw== +"@abp/malihu-custom-scrollbar-plugin@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-9.1.0.tgz#288ae1916a78100f2c728dfd05a560ee99fafae4" + integrity sha512-McdMRDtbTZBjp//3GMVjRjkc16HNYDEdPc2ar1xrY817e0tEln6/TBkItAcfOvjso0TsLcvlNL1+1bjbMjj8OA== dependencies: - "@abp/core" "~9.1.0-rc.3" + "@abp/core" "~9.1.0" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/moment@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-9.1.0-rc.3.tgz#3cb5b000be73e4d681d3d115be98a8422a66e307" - integrity sha512-K30pG1xRGOJ5m7rJI6u5hKv5Lcjmqxqx7cekDf9HURzgpBGLCvMnnXFSx97w0LcPOYzCVxorfTdw6S3sC12idw== +"@abp/moment@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-9.1.0.tgz#f3c0ae02209e496913cda53df752dabc5be648bd" + integrity sha512-WxR1l09vwxRhqyvAVP4m4IBOFjIC4pzLOmelloqES+gL/klw+T/AmY21Z/z+OV0p7aJ3V3Q1aQStuMCDCyGFnQ== dependencies: moment "^2.30.1" -"@abp/select2@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-9.1.0-rc.3.tgz#7bd050e4847c0b8366fd582200f27065ecc4ff57" - integrity sha512-0k5P+amCqNE2cPAGQpEwFl+vMssuKSbpZ0XgHfF0z3EcE1bAuYDo41nAfk/amsJn5Dt55xJcC+yesADkAXEeIA== +"@abp/select2@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-9.1.0.tgz#9c2c6751f8506fb375c9b7c42a008c168a8f4c75" + integrity sha512-n6HqsH8aFLMrqL6LJ0gsHFlaq6T1QSt/x7HkkZyhDC7CwhXajxtsJEstDnDF9naHSXX/lerPbrHEgzn2QRMBqg== dependencies: - "@abp/core" "~9.1.0-rc.3" + "@abp/core" "~9.1.0" select2 "^4.0.13" -"@abp/sweetalert2@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-9.1.0-rc.3.tgz#69751518ea84b8a306478f48b516946363a7fa7f" - integrity sha512-iHk6JzD9qzmdvr/LjAwSVFfX1WmipzQNcCYwUB+kKe2uSfwufYz+9+iYjYcm7uVvZSd9LniIvzvQXyZlfMSy5w== +"@abp/sweetalert2@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-9.1.0.tgz#660f9b1db60cc04bde6cadbcf3c55320d20c2f3e" + integrity sha512-z3JMeAwva2vR8qZSRJ/BisQDdAEqjDJ/6oIGu/JYXQEchO1Lnd9UMV376nc3crLJdnyRRO7Qs6zx4FfVOCH0kw== dependencies: - "@abp/core" "~9.1.0-rc.3" + "@abp/core" "~9.1.0" sweetalert2 "^11.14.1" -"@abp/timeago@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-9.1.0-rc.3.tgz#b1eb20d6c9fe47a6d0ace8565ea8289f1af9c0a1" - integrity sha512-7hq2+HHQ91/xXFGK417dkgFNKU7z49bVN7tkHLMJyKkJb1iP3N0gCz3HdkCRjnM6yrRXQDYUmO/zCv6yBwakjA== +"@abp/timeago@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-9.1.0.tgz#496e40153241bae5d418d79cc6c65c9db6306447" + integrity sha512-a/UAYQ2GrhYFGx4p0hqr3x+teBqnjnOiWJEPq9//RTlz+EZ+OUyHbJrcUtqZRvaGJtOAsfmljD3jYnOXUlU7DA== dependencies: - "@abp/jquery" "~9.1.0-rc.3" + "@abp/jquery" "~9.1.0" timeago "^1.6.7" -"@abp/toastr@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-9.1.0-rc.3.tgz#de490bfd6b41919d96be0544aaaee3d457cf9f32" - integrity sha512-hLe3FXyplQmhRbvBZdLVt+6yRAfptAJzwU2S5iHbs5r4ncO1ampCClZNNLNmrCglDQ30ZkgrPg4SjHn9V6HyIQ== +"@abp/toastr@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-9.1.0.tgz#501cbe211164b2e7416a2d4878cb34aed3550b7c" + integrity sha512-BkTDuU0p9Qa4+HT9CYwiPQjVTrbTSNBgQ18h69S3lIadLJwdC6pXeLbL9bhe+5fiuhq2f+0Oqo3X75LNEgzHkw== dependencies: - "@abp/jquery" "~9.1.0-rc.3" + "@abp/jquery" "~9.1.0" toastr "^2.1.4" -"@abp/utils@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-9.1.0-rc.3.tgz#84de6ab4497c74b2c0c04f604dc6d542a50a1534" - integrity sha512-Tw9gNUAFjmieVrnril7YxwqthpSkZiY01uW60/+Dkd3jh9qZntqgzIcKG6/TXjimWK6iN8YZFOJ0cShCnHW0Jg== +"@abp/utils@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-9.1.0.tgz#a4fd37d943df18b5c11f5d4869efd5d8882b7959" + integrity sha512-+UZo0ocTEZlRO41SzzHNdinjdFUDVq8wYZSj5BA1bqCVeWYhfjI2+rl9DuogCN8UEuCACA4K/qb4XcE/untQ3g== dependencies: just-compare "^2.3.0" diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/package.json b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/package.json index e95a6de17c..8efc393397 100644 --- a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/package.json +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/package.json @@ -3,7 +3,7 @@ "name": "my-app", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "~9.1.0-rc.3", - "@abp/cms-kit": "9.1.0-rc.3" + "@abp/aspnetcore.mvc.ui.theme.basic": "~9.1.0", + "@abp/cms-kit": "9.1.0" } } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/yarn.lock b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/yarn.lock index 612c4f63ab..b2df3e3058 100644 --- a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/yarn.lock +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/yarn.lock @@ -2,302 +2,302 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.basic@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-9.1.0-rc.3.tgz#c291f2760d32a9745c4b15a62c13abec9b7e247f" - integrity sha512-f14SIEfZkvSgYBfM/rcDmn0mgkIHGqi6lRP7GeBRUPEhB944osyCFmJH3CWDjJcjTFbqWTvKVlDRsV0Roz5eqg== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~9.1.0-rc.3" - -"@abp/aspnetcore.mvc.ui.theme.shared@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-9.1.0-rc.3.tgz#c05d8b39fc1ef2a9c890c480cb1ec8f47ee10669" - integrity sha512-BTLoVlaYjKrW0Rhrqw4tNiHf5LV8/zBxh90OM7smKYPGOftHhSWSNUUSO5upOdOsVhNSPIxY83PF/LHp29kH8g== - dependencies: - "@abp/aspnetcore.mvc.ui" "~9.1.0-rc.3" - "@abp/bootstrap" "~9.1.0-rc.3" - "@abp/bootstrap-datepicker" "~9.1.0-rc.3" - "@abp/bootstrap-daterangepicker" "~9.1.0-rc.3" - "@abp/datatables.net-bs5" "~9.1.0-rc.3" - "@abp/font-awesome" "~9.1.0-rc.3" - "@abp/jquery-form" "~9.1.0-rc.3" - "@abp/jquery-validation-unobtrusive" "~9.1.0-rc.3" - "@abp/lodash" "~9.1.0-rc.3" - "@abp/luxon" "~9.1.0-rc.3" - "@abp/malihu-custom-scrollbar-plugin" "~9.1.0-rc.3" - "@abp/moment" "~9.1.0-rc.3" - "@abp/select2" "~9.1.0-rc.3" - "@abp/sweetalert2" "~9.1.0-rc.3" - "@abp/timeago" "~9.1.0-rc.3" - "@abp/toastr" "~9.1.0-rc.3" - -"@abp/aspnetcore.mvc.ui@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-9.1.0-rc.3.tgz#88252e0fb822fe9560ed89d2118c7b32a32ba496" - integrity sha512-WGjWNoN97uxjMc173w36UV8UVGxLbDrOcglnqK+RY+E9vIxFGDmWBvwzmJ1KfZRvlwahXtMjTCiYFKO411lh1w== +"@abp/aspnetcore.mvc.ui.theme.basic@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-9.1.0.tgz#e9e0321037c34b43145dfc7827c422fbf79f59ab" + integrity sha512-vLkyrdFXw0/MPyU2hzqGJJk7trmIlVMdflNIe/rF77UIRmJYHWaTmPt9i5PLN/O4s0jnE9kWlaaJ/VnnFWeGsQ== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~9.1.0" + +"@abp/aspnetcore.mvc.ui.theme.shared@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-9.1.0.tgz#35a73580b9b67a33708f2cf897243b50c9ad7100" + integrity sha512-rggTYL9poOFICsOseDX22JNhD0KWH8Oxs0YH91TZjvm/F67cPemW99eBlJc/YdJ7bN6icRiebN8m81y9MSanyg== + dependencies: + "@abp/aspnetcore.mvc.ui" "~9.1.0" + "@abp/bootstrap" "~9.1.0" + "@abp/bootstrap-datepicker" "~9.1.0" + "@abp/bootstrap-daterangepicker" "~9.1.0" + "@abp/datatables.net-bs5" "~9.1.0" + "@abp/font-awesome" "~9.1.0" + "@abp/jquery-form" "~9.1.0" + "@abp/jquery-validation-unobtrusive" "~9.1.0" + "@abp/lodash" "~9.1.0" + "@abp/luxon" "~9.1.0" + "@abp/malihu-custom-scrollbar-plugin" "~9.1.0" + "@abp/moment" "~9.1.0" + "@abp/select2" "~9.1.0" + "@abp/sweetalert2" "~9.1.0" + "@abp/timeago" "~9.1.0" + "@abp/toastr" "~9.1.0" + +"@abp/aspnetcore.mvc.ui@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-9.1.0.tgz#38d058ab148a36ad4d63870e8a501ca339e4a70e" + integrity sha512-lUw1ij87KJp+Rj4cz8oSQkdRuoMq76l/wIAGwtXH+EOKusVpSJTOTioAV/tPKeKZ15ubE4bO5jWcQGxZkXgH3w== dependencies: ansi-colors "^4.1.3" -"@abp/bootstrap-datepicker@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-9.1.0-rc.3.tgz#8376fb204851b8e7be6fb5afe6e023f706426bc2" - integrity sha512-bKPeRpqzHlSCnItxesp+QnAewFcwuB1hmncRydhOg9ImvzRN0M9fAfSXeP7VTYH+2ygDKVEtK+8aAh1RjAryuA== +"@abp/bootstrap-datepicker@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-9.1.0.tgz#96a1875a2b92f03b8f90f7842ebf8849cf8a4d04" + integrity sha512-3FQm1SK8qmzoP7LOvXkZpq1AzrdPHKRdQJjoqK9N+lQxQjNfOxEFMxeDSg6WJKO619Cnve++jAyMidojXlCiwQ== dependencies: bootstrap-datepicker "^1.10.0" -"@abp/bootstrap-daterangepicker@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-9.1.0-rc.3.tgz#f14dd37eb7a4fe4d6cb823da1ee80dc28154d0df" - integrity sha512-C7KXx1630JK4mOrMZEQoiH4vzQZn6JfrS6k8nAX0p48zRNcx8oxwviaojRcu+MjDl/rDHc5U9Xy9lBIurqLEKg== +"@abp/bootstrap-daterangepicker@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-9.1.0.tgz#1993c539837eb31de174cba9f0bccd441a98f209" + integrity sha512-jS1jTqP6KCXQYX9xZpDAI07C94nwzXrNJD3H0pJXsXoOva3TTBQDD8khf6RDb7tiZrkrNJqmMyUiCfVTDbO7zg== dependencies: bootstrap-daterangepicker "^3.1.0" -"@abp/bootstrap@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-9.1.0-rc.3.tgz#01be98456635982e5b43a49318d0bcc55163fad7" - integrity sha512-Xi2TPaReFl3vnnFW974Cc4Sb25Iq+RwzkoGXiJFUiwGgYHbHHCd5Jd9Af6KYNchjP9SJKFYELwKZcQdxEIHauQ== +"@abp/bootstrap@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-9.1.0.tgz#a06c1cd4c11554c29973db70c6a383efebb10b4e" + integrity sha512-r6onkBnpqoWrdYLDVZTiqgQBvH5UZerYRrPB3Ky+RkXJhgwn7AM3LAVrB42sIvFZRNbwOlvuAL+a0+5yDOH67Q== dependencies: - "@abp/core" "~9.1.0-rc.3" + "@abp/core" "~9.1.0" bootstrap "^5.3.3" -"@abp/clipboard@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-9.1.0-rc.3.tgz#85b38876ba259a235acfcea8bb85c0bf9309fa5c" - integrity sha512-3FSLFOpySYQfmlMlrhSEdC8mnLDUtXRBXwWNIBJMTNEKAt0E2Z/2TIefaPzPYzYkqNrXlq8qdOOkvxFm39y8WQ== +"@abp/clipboard@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-9.1.0.tgz#5d5678ef7e8c355715c5a74e4aabd0a21d5e6cbe" + integrity sha512-1TxZbB/q5DPeLhYzrc6y0OVekxnjM+CRH/Gu8nAXQMX46XjdTboXvBtvgKHV1aCznGNsWyjd5A2O5G/XGg9NNw== dependencies: - "@abp/core" "~9.1.0-rc.3" + "@abp/core" "~9.1.0" clipboard "^2.0.11" -"@abp/cms-kit.admin@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/cms-kit.admin/-/cms-kit.admin-9.1.0-rc.3.tgz#2f4a40db93d5ff6d1e140a44df1440280dcf6697" - integrity sha512-yMF3VQ2pw8T/YDnmAvoeHl8G++IFEAS/1m9L5pTFYg5oF3aS1oSg1KhXtUdw/iYKhmcdefAqC3UmBRUYIPJ7NQ== +"@abp/cms-kit.admin@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/cms-kit.admin/-/cms-kit.admin-9.1.0.tgz#1563e47e83f816cded5af2f608a8958f68ac7fff" + integrity sha512-utsJXJ0GmR5SKQTSBSfcs/Uqvo6nleLa1LF6uOaiJa2nsck9gD1XcVX3GMi54ZoQpjAXFvXtwh5P6gzPfBNroQ== dependencies: - "@abp/codemirror" "~9.1.0-rc.3" - "@abp/jstree" "~9.1.0-rc.3" - "@abp/markdown-it" "~9.1.0-rc.3" - "@abp/slugify" "~9.1.0-rc.3" - "@abp/tui-editor" "~9.1.0-rc.3" - "@abp/uppy" "~9.1.0-rc.3" + "@abp/codemirror" "~9.1.0" + "@abp/jstree" "~9.1.0" + "@abp/markdown-it" "~9.1.0" + "@abp/slugify" "~9.1.0" + "@abp/tui-editor" "~9.1.0" + "@abp/uppy" "~9.1.0" -"@abp/cms-kit.public@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/cms-kit.public/-/cms-kit.public-9.1.0-rc.3.tgz#41af8c6d841be8473cdf90cefabadf0551b6683c" - integrity sha512-iHidVYa4JXq1RYUxOsjzVbuyw8rh9+8lh2kKG6uCoBc5wQQxBXK/RHU4WC15rbWKkhLhSPOee0v/lN6sifgk4w== +"@abp/cms-kit.public@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/cms-kit.public/-/cms-kit.public-9.1.0.tgz#1d7dc0527e84e4da7afee217d33a69b1ca6fc76e" + integrity sha512-sVB4X73zyjM8TeJj4XdV0XQtxodEUvmXz3I+PoPXKIj0pzOHZ1XhyQjl3yrxkDnk4fcx2jfRoBEvPYAK796nXg== dependencies: - "@abp/highlight.js" "~9.1.0-rc.3" - "@abp/star-rating-svg" "~9.1.0-rc.3" + "@abp/highlight.js" "~9.1.0" + "@abp/star-rating-svg" "~9.1.0" -"@abp/cms-kit@9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/cms-kit/-/cms-kit-9.1.0-rc.3.tgz#28cec8569f7a5f1f1d09a2c29461e852c5a31f8a" - integrity sha512-EOyuJvrznnuwpVGdFeqiEHgRzibyssMf/IjvYfcALPnmnhNENah4Exd8ySVB6EC/i3rPEb671PwTdwEIRxVGrg== +"@abp/cms-kit@9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/cms-kit/-/cms-kit-9.1.0.tgz#f3498a2e0213163abd65d62c1404a1c76ad9db04" + integrity sha512-aUTNq5qAlP7zUHmhv8uYb1S6bzgqRUvcgoNpArhojG5URvBjrKE4a65YFZgoC7Bb7q+Ljx6c5nZ7ehylZpiz2g== dependencies: - "@abp/cms-kit.admin" "~9.1.0-rc.3" - "@abp/cms-kit.public" "~9.1.0-rc.3" + "@abp/cms-kit.admin" "~9.1.0" + "@abp/cms-kit.public" "~9.1.0" -"@abp/codemirror@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/codemirror/-/codemirror-9.1.0-rc.3.tgz#240eb51926b256a320a452cbd638e7bc6e63b0dc" - integrity sha512-CSWXfC9nUK6o+gGtSdkjPzQ8EHV5ctnVpDojEzsmTLLyzElAQkJGLJ2Bvz9Xdn5/d/Sk3tjc9WMuxZhdMCm4IQ== +"@abp/codemirror@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/codemirror/-/codemirror-9.1.0.tgz#66cb3bde616e580fba06dbfdb0f84b48eb5e9ce3" + integrity sha512-tfUnfqYDUlNfs96wVvilF1K+GmvDUsXIK465qHUux9fHcA1muN0IRnfTZKtmeAkiAKgvxl/WkbfpnvjBKQZfbw== dependencies: - "@abp/core" "~9.1.0-rc.3" + "@abp/core" "~9.1.0" codemirror "^5.65.1" -"@abp/core@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-9.1.0-rc.3.tgz#4749bd60813ddceb156dec045e7f9eb0b3e19446" - integrity sha512-xYr9zbHCz+v672AuFWSmvqeo0CgAwZTr9laAp58QOCzO2QsVHuDUy60epGhIxCTRc3iCBkcelIFDFlGrN30WSw== +"@abp/core@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-9.1.0.tgz#af78fc096932d4ec45216b5e910c87a72e479b1f" + integrity sha512-6P0KGh5+IqlhQnUOyzaGaKrKzOAm1G0gg8Ay3DXyW2ksY6Zr+lyi5cxNsSi4ix1dicqfydIKvLfV+DF3mQf/dw== dependencies: - "@abp/utils" "~9.1.0-rc.3" + "@abp/utils" "~9.1.0" -"@abp/datatables.net-bs5@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-9.1.0-rc.3.tgz#984d6550124cf0221f8233306483aff72a38249e" - integrity sha512-qJ777clztaau92sLvDgsxIQdKnFpZqQqn3/N2y81eixELm/t/qRiE0ySNduNDnvzik6/uWmfnG82ToCmmTFP2g== +"@abp/datatables.net-bs5@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-9.1.0.tgz#3b2e7d68e947db3d3432ab5e8bff4da89a85d05d" + integrity sha512-zBrzOrfvTPJcc6mvHZDPVdXbWesKU0lKlrb7vuBZxWjrFNwVC0d/KNJPcYVvyQ3zf9rrQB5Xg0MDgu0k5Tt7tQ== dependencies: - "@abp/datatables.net" "~9.1.0-rc.3" + "@abp/datatables.net" "~9.1.0" datatables.net-bs5 "^2.1.8" -"@abp/datatables.net@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-9.1.0-rc.3.tgz#5495345014b6dc3faa67415b2c37ee84b1e4dbbc" - integrity sha512-jKn9DIQrlxMU/dedYaFjfHADPuMfs+6nUojYDGUPd76Ov1TKFNA0N/6ipB7UMYd3xVPEEmgkBH8pqf0qR8D64w== +"@abp/datatables.net@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-9.1.0.tgz#12d6e1412aac4a2e0a61437dcdfbfbe1add7fed7" + integrity sha512-lYRvEZUkntaI+dS9Xkz23Z54eDeZ1R4Wzhqcg6VIsz3iO5kYAa5GiQjcOiBssNGJSLuaet6R5Pqh1ThEUjfvvA== dependencies: - "@abp/jquery" "~9.1.0-rc.3" + "@abp/jquery" "~9.1.0" datatables.net "^2.1.8" -"@abp/font-awesome@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-9.1.0-rc.3.tgz#259dcac2f20da57a72b9c41129c465935abc125f" - integrity sha512-fAExSAn0VaPWfx9kPwIKB0xbSSMHZst/NiNXRPhIrCGty/PXp5OV8ao+mqKcsLQJTPFz1RaSxpdq/1s3tAiGWQ== +"@abp/font-awesome@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-9.1.0.tgz#af21ff2d7c332deb1df626404b53a78d790ba842" + integrity sha512-HcJzDCACGejOIvhxsorCdaesyDHnupR/sl5YFCsGikSqATyOSKQy4pw8wKsb1z+FCT5JYCTR7ROJ3lB1lTEgZw== dependencies: - "@abp/core" "~9.1.0-rc.3" + "@abp/core" "~9.1.0" "@fortawesome/fontawesome-free" "^6.6.0" -"@abp/highlight.js@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/highlight.js/-/highlight.js-9.1.0-rc.3.tgz#2d62125646651add2d2ba6ecc36d72904da160d4" - integrity sha512-gK7Nksk0Zf8x2CL4D5plptLNYCYrZo4cMFiQmarN9TTY41jQqoItrdAInPoWB3b+0AgMlo/pYjzxXHIZLItLBA== +"@abp/highlight.js@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/highlight.js/-/highlight.js-9.1.0.tgz#baed72c6ca38fd888b49174e632788c681306dce" + integrity sha512-kV6BFYESIIOJOJ1I9I3xUdLftrIkK8vZlIaBupJobxzNeOXh4/VRIVJE75xRXyMSmJRSMOZm8pjNoQsuKDgT3w== dependencies: - "@abp/core" "~9.1.0-rc.3" + "@abp/core" "~9.1.0" "@highlightjs/cdn-assets" "~11.10.0" -"@abp/jquery-form@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-9.1.0-rc.3.tgz#c1ee21a5f38dcf0fdbb0c3e2db3f66bc81ae66b1" - integrity sha512-YJ2CDjJVbNpqs88CGgsHnPtJG4BjYLQ0XFVT+Ph9ar5YnuQrYfB60HMdtnQlqn337hkbzVx2XHLJ6h0tT8To9Q== +"@abp/jquery-form@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-9.1.0.tgz#bdb96436c54b2a09ac4259db97e1e577410e1fc3" + integrity sha512-xjHXWstVY6B3MPB4/8g0EJeHlVvlV010OMZKFmfCGLFi6aHAEKqqWh1rMItAiVuSmCCzL0m/208ZkpoCI++jGQ== dependencies: - "@abp/jquery" "~9.1.0-rc.3" + "@abp/jquery" "~9.1.0" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-9.1.0-rc.3.tgz#88976407a14276244a01a24daeda6b236298e917" - integrity sha512-Yac7l/rjHxdogPyMO8LlJklndDBCwZ+qLeTbCcYt7NQnnsnn+xXomSwjFWv8sguTVKG1eL68LquGUCbNwNfrUA== +"@abp/jquery-validation-unobtrusive@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-9.1.0.tgz#798551e7c14ba286a819a48804107a53e974c1ee" + integrity sha512-TggKckfbLtB7Ig2kNt2kH//GaJUns8OZbpdKdh7vCWIAGedw2FLNCABCpoGnyNp0s/dVOtdyxRl9eFRN3+a4tw== dependencies: - "@abp/jquery-validation" "~9.1.0-rc.3" + "@abp/jquery-validation" "~9.1.0" jquery-validation-unobtrusive "^4.0.0" -"@abp/jquery-validation@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-9.1.0-rc.3.tgz#1ff99dea2f2c52e58a50d06b51e0cbca15ff690c" - integrity sha512-YB1t1m+s+vHGuxSt0h4cgIMIpwRy129pjV08Jja1QtCFhE+VgA9hjvx0OVaVcm31aLLt/KU/+NrO36AbebL+zA== +"@abp/jquery-validation@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-9.1.0.tgz#b771652377fbfb3c92ce03b7b7c069a3bb2ae70b" + integrity sha512-bmPSOHcxjitB8NkiLv0SxxuSS3FlCq9SiTUGvsT8nOStDsm+KpyYSzZQq8LSCyqWWj54tlOARTfcD4tMK7/K3Q== dependencies: - "@abp/jquery" "~9.1.0-rc.3" + "@abp/jquery" "~9.1.0" jquery-validation "^1.21.0" -"@abp/jquery@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-9.1.0-rc.3.tgz#0386a2857271dc4c1e04da9e4b304637bbc2d696" - integrity sha512-1UqztwQ92m6kvYE+Tb0rj7iITHngKdGI5kEpZKOHrEWqnMKeEoPbO1cL+ZOWN0m162WJiliod1HEOxW8b9Ha2Q== +"@abp/jquery@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-9.1.0.tgz#952b61ea3e4a99e6551f667297dbb637d83f3c50" + integrity sha512-Ulw8ClAbqmxceNYCb76bR6dq7e9b7Hs6mjlEy05zdbsSNuZW3UoycsJ+BquXi+dUNBo6OppqEmhVeiIjAKTaFg== dependencies: - "@abp/core" "~9.1.0-rc.3" + "@abp/core" "~9.1.0" jquery "~3.7.1" -"@abp/jstree@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/jstree/-/jstree-9.1.0-rc.3.tgz#7179df5b74817886d17a95f044af06140f907c19" - integrity sha512-ramEuCBU8st8crX6d/28S/gNLgTz6fLIxOkOof3kN7JpcF4zkk46Z9hKZTTDFrkZOfQ+WoxWIdzYh85FOuGWLQ== +"@abp/jstree@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/jstree/-/jstree-9.1.0.tgz#1761e31b37cce010401f8812c7e1a3a56dbd3e8e" + integrity sha512-d3gX+7SuRcP9RR4R09gjGrk5ghmC6mQeuvEMVvQjMCruH92PRo/GZ7pqubanAyN45D8ct8BXAw1DKV9Yu7P67Q== dependencies: - "@abp/jquery" "~9.1.0-rc.3" + "@abp/jquery" "~9.1.0" jstree "^3.3.17" -"@abp/lodash@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-9.1.0-rc.3.tgz#26f53847ed05a171d71c6c6f1ba33d8c4e2a624a" - integrity sha512-eUuNYTk6hla5kOdc5lOBVoKhMBfnkfXdawb+/LtwBwjCQym+XRTCenJhqzxii293xwd+0G1l5M+8VaPWFq6WWg== +"@abp/lodash@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-9.1.0.tgz#62c784bd99c9e1ccfa82905e843375c594ef8584" + integrity sha512-cCE3ZwwWcPrh+ccKx4AS1USL1ttbrXBqci/l+ROjXhFzrs6GYnhI0+30xRZgPdPRm3U3nGPrSaDAU7UuHkRScg== dependencies: - "@abp/core" "~9.1.0-rc.3" + "@abp/core" "~9.1.0" lodash "^4.17.21" -"@abp/luxon@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-9.1.0-rc.3.tgz#0cfae9b2188c9827963e693dbfaaefcce714bdd9" - integrity sha512-UxtDDyLvHr3sPhrWX+uj9JrsN6idYKH+srOmAKC8+FOfWW/YdFAJmsYPLMCov7FoSWXHG+BQhkuXeCCBppyiVA== +"@abp/luxon@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-9.1.0.tgz#b246f3627bbc7ce41b7878fce1679da473b0e0ae" + integrity sha512-AouS/qEK+i69hwr4XtUOCepONLuR+1gdHFb50RpOEbUoDfTYmYpxPBdiICmZPeJ3CExErITPZxzzngCnKPPOUw== dependencies: - "@abp/core" "~9.1.0-rc.3" + "@abp/core" "~9.1.0" luxon "^3.5.0" -"@abp/malihu-custom-scrollbar-plugin@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-9.1.0-rc.3.tgz#08071e21260f867fc2a7d7594dcdf30da921bb47" - integrity sha512-WDWcm4JsTzq4Se8Sg+v6U5ymjbfVOXsU2WR66RSUL8TSq3WM1MLuRaStDGxtt8nOLvPfqiPWIzb2BvsfyePNRw== +"@abp/malihu-custom-scrollbar-plugin@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-9.1.0.tgz#288ae1916a78100f2c728dfd05a560ee99fafae4" + integrity sha512-McdMRDtbTZBjp//3GMVjRjkc16HNYDEdPc2ar1xrY817e0tEln6/TBkItAcfOvjso0TsLcvlNL1+1bjbMjj8OA== dependencies: - "@abp/core" "~9.1.0-rc.3" + "@abp/core" "~9.1.0" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/markdown-it@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/markdown-it/-/markdown-it-9.1.0-rc.3.tgz#e07b469da728b8fb523bbb968b59b29dd4501955" - integrity sha512-8CWitrd1e4LMWA7XO765Ut8tXQNK4XtN5H5eV2hPWS6dCRACK0H96k5fpwXeAynnV4ZzNLz2G/GjT6w947R/mw== +"@abp/markdown-it@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/markdown-it/-/markdown-it-9.1.0.tgz#9d40057871ee15657d5e6e65b12a958cce6ed2c8" + integrity sha512-Vv25TO4b8q3+jaiZ1XC134kNUWoPl1aedh3NeIQU11NfrHM5tFO7gDLBXXPwM+Ahoptg25/WYGDcUnnx2WLpFg== dependencies: - "@abp/core" "~9.1.0-rc.3" + "@abp/core" "~9.1.0" markdown-it "^14.1.0" -"@abp/moment@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-9.1.0-rc.3.tgz#3cb5b000be73e4d681d3d115be98a8422a66e307" - integrity sha512-K30pG1xRGOJ5m7rJI6u5hKv5Lcjmqxqx7cekDf9HURzgpBGLCvMnnXFSx97w0LcPOYzCVxorfTdw6S3sC12idw== +"@abp/moment@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-9.1.0.tgz#f3c0ae02209e496913cda53df752dabc5be648bd" + integrity sha512-WxR1l09vwxRhqyvAVP4m4IBOFjIC4pzLOmelloqES+gL/klw+T/AmY21Z/z+OV0p7aJ3V3Q1aQStuMCDCyGFnQ== dependencies: moment "^2.30.1" -"@abp/prismjs@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-9.1.0-rc.3.tgz#f77e1d264ef5b6c1ceb7bd1b4aee19bfce6e723b" - integrity sha512-/vtoR5oyEiVVvLPPsAS5qSI4THle/WqETTTTInpeVx6u/NEbeY9sBAUz+udS/fWJlyxIUN6He56ghoJNaWXYJw== +"@abp/prismjs@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-9.1.0.tgz#40b688c82ae808ef92516ea5731ccb38c19d2384" + integrity sha512-trSW1K6VtIEaAyxe7umQGimCTLrgdT6DwSiQ8PONvKa8WR5ZmzSDU7lK8SliorufkbWtdkjCvuXB81NGt3tAhQ== dependencies: - "@abp/clipboard" "~9.1.0-rc.3" - "@abp/core" "~9.1.0-rc.3" + "@abp/clipboard" "~9.1.0" + "@abp/core" "~9.1.0" prismjs "^1.29.0" -"@abp/select2@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-9.1.0-rc.3.tgz#7bd050e4847c0b8366fd582200f27065ecc4ff57" - integrity sha512-0k5P+amCqNE2cPAGQpEwFl+vMssuKSbpZ0XgHfF0z3EcE1bAuYDo41nAfk/amsJn5Dt55xJcC+yesADkAXEeIA== +"@abp/select2@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-9.1.0.tgz#9c2c6751f8506fb375c9b7c42a008c168a8f4c75" + integrity sha512-n6HqsH8aFLMrqL6LJ0gsHFlaq6T1QSt/x7HkkZyhDC7CwhXajxtsJEstDnDF9naHSXX/lerPbrHEgzn2QRMBqg== dependencies: - "@abp/core" "~9.1.0-rc.3" + "@abp/core" "~9.1.0" select2 "^4.0.13" -"@abp/slugify@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/slugify/-/slugify-9.1.0-rc.3.tgz#7c23402f5b78b2dff1ba384fcd596cdc1d355984" - integrity sha512-uxMIC1nM5E/SwxUqOQHEsf/b48iQ+9ZOvRdAgrqedQBBgFYzL1rdCT7HhaJXWxUXMrIQgyODfTBn5k90hzdgEQ== +"@abp/slugify@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/slugify/-/slugify-9.1.0.tgz#e7a7b1d6f8a4a84f6cd70c72cc9da1c12a19257f" + integrity sha512-fve6FIbOkjKpQXg/i/Kel6B6rVo2/nYdzWDWwUzGj92ZcIhh3B1inLHXL54336+vjjXbb17SNrsNKRf8qKs9ow== dependencies: slugify "^1.6.6" -"@abp/star-rating-svg@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/star-rating-svg/-/star-rating-svg-9.1.0-rc.3.tgz#41e3639c85a748b3ae6f7110c4f850c029d86b8c" - integrity sha512-gIU3xFemzKAwiVVo7reNH8trJ84WLCk5LMluQ3uUEDg/HabOhHZiCBX9PmSkp2HHft3WaLcHELOueQ8RTDNr4w== +"@abp/star-rating-svg@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/star-rating-svg/-/star-rating-svg-9.1.0.tgz#5abeb17f487e737caf92cd1ef76930d376dcc60f" + integrity sha512-Ob0PrXtkrYgjCfB6pxvpCQ/ID3x4j5TxJbEa9wh14KqakmKsO/2hp17CZ1XjMgZsLJGL4p3qNZZ3WZIqbwZDJQ== dependencies: - "@abp/jquery" "~9.1.0-rc.3" + "@abp/jquery" "~9.1.0" star-rating-svg "^3.5.0" -"@abp/sweetalert2@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-9.1.0-rc.3.tgz#69751518ea84b8a306478f48b516946363a7fa7f" - integrity sha512-iHk6JzD9qzmdvr/LjAwSVFfX1WmipzQNcCYwUB+kKe2uSfwufYz+9+iYjYcm7uVvZSd9LniIvzvQXyZlfMSy5w== +"@abp/sweetalert2@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-9.1.0.tgz#660f9b1db60cc04bde6cadbcf3c55320d20c2f3e" + integrity sha512-z3JMeAwva2vR8qZSRJ/BisQDdAEqjDJ/6oIGu/JYXQEchO1Lnd9UMV376nc3crLJdnyRRO7Qs6zx4FfVOCH0kw== dependencies: - "@abp/core" "~9.1.0-rc.3" + "@abp/core" "~9.1.0" sweetalert2 "^11.14.1" -"@abp/timeago@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-9.1.0-rc.3.tgz#b1eb20d6c9fe47a6d0ace8565ea8289f1af9c0a1" - integrity sha512-7hq2+HHQ91/xXFGK417dkgFNKU7z49bVN7tkHLMJyKkJb1iP3N0gCz3HdkCRjnM6yrRXQDYUmO/zCv6yBwakjA== +"@abp/timeago@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-9.1.0.tgz#496e40153241bae5d418d79cc6c65c9db6306447" + integrity sha512-a/UAYQ2GrhYFGx4p0hqr3x+teBqnjnOiWJEPq9//RTlz+EZ+OUyHbJrcUtqZRvaGJtOAsfmljD3jYnOXUlU7DA== dependencies: - "@abp/jquery" "~9.1.0-rc.3" + "@abp/jquery" "~9.1.0" timeago "^1.6.7" -"@abp/toastr@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-9.1.0-rc.3.tgz#de490bfd6b41919d96be0544aaaee3d457cf9f32" - integrity sha512-hLe3FXyplQmhRbvBZdLVt+6yRAfptAJzwU2S5iHbs5r4ncO1ampCClZNNLNmrCglDQ30ZkgrPg4SjHn9V6HyIQ== +"@abp/toastr@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-9.1.0.tgz#501cbe211164b2e7416a2d4878cb34aed3550b7c" + integrity sha512-BkTDuU0p9Qa4+HT9CYwiPQjVTrbTSNBgQ18h69S3lIadLJwdC6pXeLbL9bhe+5fiuhq2f+0Oqo3X75LNEgzHkw== dependencies: - "@abp/jquery" "~9.1.0-rc.3" + "@abp/jquery" "~9.1.0" toastr "^2.1.4" -"@abp/tui-editor@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/tui-editor/-/tui-editor-9.1.0-rc.3.tgz#8162df2aa1e5e0a3875968a9ede6e86bcd33ce47" - integrity sha512-V5+BiAUCYVtekIbPl23BefibxgBPe2oPXUbd5JYM4/qRuWEBsinR//XJOhDjQx3onVwg7CF/W2gjhQFUw69xSA== +"@abp/tui-editor@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/tui-editor/-/tui-editor-9.1.0.tgz#cc4106f0ea61ad1ee2497ecfec1eefb62189f57f" + integrity sha512-Ttmzn881+knyFst/5BZP+4vb4R+gx5loqWtbuQXthO2saisr/+QJX4EzqwYqPTVl81Y1HZwhcdTr/hMHOCMFpg== dependencies: - "@abp/jquery" "~9.1.0-rc.3" - "@abp/prismjs" "~9.1.0-rc.3" + "@abp/jquery" "~9.1.0" + "@abp/prismjs" "~9.1.0" -"@abp/uppy@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/uppy/-/uppy-9.1.0-rc.3.tgz#22e5ef2126ddaa89b96957fefde143d906df4a40" - integrity sha512-gNEflk6lN0Q0u/j/YpHoyAcAssLYJU+QthBk9LrsZRLzGfwGyVDyijwKyXBIN9sLY1Fmr3/QCL4wQRqMQSncsA== +"@abp/uppy@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/uppy/-/uppy-9.1.0.tgz#fdd758f33437754b7a8e73f5a7bf8023dfbdfc5d" + integrity sha512-JlgibBIvNF3KjqjnjNaluQx2sZKAop/i6uxJ8XHW45fFth/vNYTStfsFRy0WkgcFQXOum95P3+RIlRaBU55DyA== dependencies: - "@abp/core" "~9.1.0-rc.3" + "@abp/core" "~9.1.0" uppy "^4.4.1" -"@abp/utils@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-9.1.0-rc.3.tgz#84de6ab4497c74b2c0c04f604dc6d542a50a1534" - integrity sha512-Tw9gNUAFjmieVrnril7YxwqthpSkZiY01uW60/+Dkd3jh9qZntqgzIcKG6/TXjimWK6iN8YZFOJ0cShCnHW0Jg== +"@abp/utils@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-9.1.0.tgz#a4fd37d943df18b5c11f5d4869efd5d8882b7959" + integrity sha512-+UZo0ocTEZlRO41SzzHNdinjdFUDVq8wYZSj5BA1bqCVeWYhfjI2+rl9DuogCN8UEuCACA4K/qb4XcE/untQ3g== dependencies: just-compare "^2.3.0" diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogAdminAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogAdminAppService.cs index e3ef03e2de..894060c966 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogAdminAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogAdminAppService.cs @@ -27,8 +27,8 @@ public class BlogAdminAppService : CmsKitAdminAppServiceBase, IBlogAdminAppServi public BlogAdminAppService( IBlogRepository blogRepository, - BlogManager blogManager, - IBlogPostRepository blogPostRepository, + BlogManager blogManager, + IBlogPostRepository blogPostRepository, BlogFeatureManager blogFeatureManager = null) { BlogRepository = blogRepository; @@ -56,7 +56,7 @@ public class BlogAdminAppService : CmsKitAdminAppServiceBase, IBlogAdminAppServi input.Sorting, input.MaxResultCount, input.SkipCount); - + var blogDtos = new PagedResultDto(totalCount, ObjectMapper.Map, List>(blogs.Select(x => x.Blog).ToList())); foreach (var blogDto in blogDtos.Items) @@ -66,11 +66,11 @@ public class BlogAdminAppService : CmsKitAdminAppServiceBase, IBlogAdminAppServi return blogDtos; } - + public virtual async Task> GetAllListAsync() { var blogs = await BlogRepository.GetListWithBlogPostCountAsync(maxResultCount: int.MaxValue); - + var blogDtos = new ListResultDto(ObjectMapper.Map, List>(blogs.Select(x => x.Blog).ToList())); foreach (var blogDto in blogDtos.Items) @@ -86,7 +86,7 @@ public class BlogAdminAppService : CmsKitAdminAppServiceBase, IBlogAdminAppServi { var blog = await BlogManager.CreateAsync(input.Name, input.Slug); input.MapExtraPropertiesTo(blog); - + await BlogRepository.InsertAsync(blog, autoSave: true); await BlogFeatureManager.SetDefaultsAsync(blog.Id); @@ -107,7 +107,7 @@ public class BlogAdminAppService : CmsKitAdminAppServiceBase, IBlogAdminAppServi return ObjectMapper.Map(blog); } - + [Authorize(CmsKitAdminPermissions.Blogs.Delete)] public virtual async Task MoveAllBlogPostsAsync(Guid blogId, Guid? assignToBlogId) { @@ -116,9 +116,9 @@ public class BlogAdminAppService : CmsKitAdminAppServiceBase, IBlogAdminAppServi } [Authorize(CmsKitAdminPermissions.Blogs.Delete)] - public virtual Task DeleteAsync(Guid id) + public virtual async Task DeleteAsync(Guid id) { - - return BlogRepository.DeleteAsync(id); + await BlogPostRepository.DeleteByBlogIdAsync(id); + await BlogRepository.DeleteAsync(id); } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/IBlogPostRepository.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/IBlogPostRepository.cs index e4d8980196..9612c0e5e5 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/IBlogPostRepository.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/IBlogPostRepository.cs @@ -48,4 +48,6 @@ public interface IBlogPostRepository : IBasicRepository Task HasBlogPostWaitingForReviewAsync(CancellationToken cancellationToken = default); Task UpdateBlogAsync(Guid sourceBlogId, Guid? targetBlogId = null, CancellationToken cancellationToken = default); -} \ No newline at end of file + + Task DeleteByBlogIdAsync(Guid blogId, CancellationToken cancellationToken = default); +} diff --git a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Blogs/EfCoreBlogPostRepository.cs b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Blogs/EfCoreBlogPostRepository.cs index 02085f5dc5..d54256bd8d 100644 --- a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Blogs/EfCoreBlogPostRepository.cs +++ b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Blogs/EfCoreBlogPostRepository.cs @@ -176,27 +176,32 @@ public class EfCoreBlogPostRepository : EfCoreRepository> CreateAuthorsQueryableAsync() + protected virtual async Task> CreateAuthorsQueryableAsync() { return (await GetDbContextAsync()).BlogPosts.Select(x => x.Author).Distinct(); } - + public virtual async Task HasBlogPostWaitingForReviewAsync(CancellationToken cancellationToken = default) { return await (await GetDbSetAsync()) .AnyAsync(x => x.Status == BlogPostStatus.WaitingForReview, GetCancellationToken(cancellationToken)); } - - public async Task UpdateBlogAsync(Guid sourceBlogId, Guid? targetBlogId = null, CancellationToken cancellationToken = default) + + public virtual async Task UpdateBlogAsync(Guid sourceBlogId, Guid? targetBlogId = null, CancellationToken cancellationToken = default) { if (targetBlogId != null) { await (await GetDbSetAsync()).Where(x => x.BlogId == sourceBlogId).ExecuteUpdateAsync(x => x.SetProperty(b => b.BlogId, targetBlogId.Value), GetCancellationToken(cancellationToken)); - + } else { await (await GetDbSetAsync()).Where(x => x.BlogId == sourceBlogId).ExecuteDeleteAsync(GetCancellationToken(cancellationToken)); } } -} \ No newline at end of file + + public virtual async Task DeleteByBlogIdAsync(Guid blogId, CancellationToken cancellationToken = default) + { + await DeleteAsync(x => x.BlogId == blogId, cancellationToken: cancellationToken); + } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Installer/InstallationNotes.md b/modules/cms-kit/src/Volo.CmsKit.Installer/InstallationNotes.md new file mode 100644 index 0000000000..1a037cf1e3 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Installer/InstallationNotes.md @@ -0,0 +1,48 @@ +# Installation Notes for CMS Kit Module + +The ABP CMS Kit module provides a set of reusable Content Management System (CMS) features for your ABP-based applications. It offers ready-to-use UI components and APIs for common content management requirements. + +This module is part of the ABP Framework and provides features like comments, ratings, tags, blogs, and more to help you build content-rich applications. + +## Required Configurations + +The CmsKit module requires **permission** settings to be configured after installation. Ensure that the necessary roles have the appropriate access rights for managing blogs, posts, comments and others. + +### Enable CmsKit + +To enable the CmsKit module, add the following line to the `GlobalFeatureConfigurator` class of your module: + +```csharp +public static void Configure() +{ + OneTimeRunner.Run(() => + { + /* You can configure (enable/disable) global features of the used modules here. + * Please refer to the documentation to learn more about the Global Features System: + * https://docs.abp.io/en/abp/latest/Global-Features + */ + + GlobalFeatureManager.Instance.Modules.CmsKit(cmsKit => + { + cmsKit.EnableAll(); + // or + // cmsKit.Tags.Enable(); + // cmsKit.Comments.Enable(); + }); + }); +} +``` + +### Database Migrations + +The CmsKit module requires database migrations to be applied. After enable **CmsKit**, Add a new migration and update the database to create the necessary tables. + +### Permissions + +Enable the following permissions for the roles that require access to the CmsKit module: + +![CmsKit Permissions](cmskit-permissions.png) + +## Documentation + +For detailed information and usage instructions, please visit the [CMS Kit documentation](https://abp.io/docs/latest/modules/cms-kit). \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Installer/cmskit-permissions.png b/modules/cms-kit/src/Volo.CmsKit.Installer/cmskit-permissions.png new file mode 100644 index 0000000000..a095dc8140 Binary files /dev/null and b/modules/cms-kit/src/Volo.CmsKit.Installer/cmskit-permissions.png differ diff --git a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Blogs/MongoBlogPostRepository.cs b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Blogs/MongoBlogPostRepository.cs index b47abe1115..78afc5a871 100644 --- a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Blogs/MongoBlogPostRepository.cs +++ b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Blogs/MongoBlogPostRepository.cs @@ -23,7 +23,7 @@ public class MongoBlogPostRepository : MongoDbRepository dbContextProvider, + IMongoDbContextProvider dbContextProvider, MarkedItemManager markedItemManager, EntityTagManager entityTagManager) : base( dbContextProvider) @@ -63,7 +63,6 @@ public class MongoBlogPostRepository : MongoDbRepository tagFilteredEntityIds.Contains(x.Id)) .WhereIf(favoriteUserFilteredEntityIds.Any(), x => favoriteUserFilteredEntityIds.Contains(x.Id)) @@ -89,7 +88,7 @@ public class MongoBlogPostRepository : MongoDbRepository> CreateAuthorsQueryableAsync(CancellationToken cancellationToken = default) + protected virtual async Task> CreateAuthorsQueryableAsync(CancellationToken cancellationToken = default) { cancellationToken = GetCancellationToken(cancellationToken); - + var blogPostQueryable = (await GetQueryableAsync()) .Where(x => x.Status == BlogPostStatus.Published); @@ -229,7 +228,7 @@ public class MongoBlogPostRepository : MongoDbRepository x.Status == BlogPostStatus.WaitingForReview, cancellationToken); } - public async Task UpdateBlogAsync(Guid sourceBlogId, Guid? targetBlogId, CancellationToken cancellationToken = default) + public virtual async Task UpdateBlogAsync(Guid sourceBlogId, Guid? targetBlogId, CancellationToken cancellationToken = default) { cancellationToken = GetCancellationToken(cancellationToken); var blogPosts = await (await GetQueryableAsync(cancellationToken)).Where(x => x.BlogId == sourceBlogId).ToListAsync(cancellationToken); @@ -239,13 +238,18 @@ public class MongoBlogPostRepository : MongoDbRepository x.BlogId == blogId, cancellationToken: cancellationToken); + } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/CmsKitPublicWebModule.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Web/CmsKitPublicWebModule.cs index fd2984a3b4..8132202717 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/CmsKitPublicWebModule.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/CmsKitPublicWebModule.cs @@ -79,11 +79,6 @@ public class CmsKitPublicWebModule : AbpModule options.DisableModule(CmsKitPublicRemoteServiceConsts.ModuleName); }); - Configure(options => - { - options.KeyPrefix = "CmsKit:"; - }); - if (GlobalFeatureManager.Instance.IsEnabled()) { Configure(options => diff --git a/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Blogs/BlogAdminAppService_Tests.cs b/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Blogs/BlogAdminAppService_Tests.cs index 5be7d312b5..731191a251 100644 --- a/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Blogs/BlogAdminAppService_Tests.cs +++ b/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Blogs/BlogAdminAppService_Tests.cs @@ -12,12 +12,14 @@ public class BlogAdminAppService_Tests : CmsKitApplicationTestBase protected IBlogAdminAppService BlogAdminAppService { get; } protected CmsKitTestData CmsKitTestData { get; } protected IBlogRepository BlogRepository { get; } + protected IBlogPostRepository BlogPostRepository { get; } public BlogAdminAppService_Tests() { BlogAdminAppService = GetRequiredService(); CmsKitTestData = GetRequiredService(); BlogRepository = GetRequiredService(); + BlogPostRepository = GetRequiredService(); } [Fact] @@ -81,11 +83,17 @@ public class BlogAdminAppService_Tests : CmsKitApplicationTestBase [Fact] public async Task DeleteAsync_ShouldWork() { + var posts = await BlogPostRepository.GetListAsync(); + posts.ShouldContain(x => x.BlogId == CmsKitTestData.Blog_Id); + await BlogAdminAppService.DeleteAsync(CmsKitTestData.Blog_Id); await Should.ThrowAsync( async () => await BlogAdminAppService.GetAsync(CmsKitTestData.Blog_Id) ); + + posts = await BlogPostRepository.GetListAsync(); + posts.ShouldNotContain(x => x.BlogId == CmsKitTestData.Blog_Id); } } diff --git a/modules/docs/Volo.Docs.abpmdl b/modules/docs/Volo.Docs.abpmdl index 17b5d6fab9..77c70bddf8 100644 --- a/modules/docs/Volo.Docs.abpmdl +++ b/modules/docs/Volo.Docs.abpmdl @@ -7,18 +7,6 @@ } }, "packages": { - "VoloDocs.Web": { - "path": "app/VoloDocs.Web/VoloDocs.Web.abppkg", - "folder": "app" - }, - "VoloDocs.EntityFrameworkCore": { - "path": "app/VoloDocs.EntityFrameworkCore/VoloDocs.EntityFrameworkCore.abppkg", - "folder": "app" - }, - "VoloDocs.Migrator": { - "path": "app/VoloDocs.Migrator/VoloDocs.Migrator.abppkg", - "folder": "app" - }, "Volo.Docs.Web": { "path": "src/Volo.Docs.Web/Volo.Docs.Web.abppkg", "folder": "src" diff --git a/modules/docs/app/VoloDocs.Web/package.json b/modules/docs/app/VoloDocs.Web/package.json index 99b8b09433..a92078e700 100644 --- a/modules/docs/app/VoloDocs.Web/package.json +++ b/modules/docs/app/VoloDocs.Web/package.json @@ -3,7 +3,7 @@ "name": "volo.docstestapp", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "~9.1.0-rc.3", - "@abp/docs": "~9.1.0-rc.3" + "@abp/aspnetcore.mvc.ui.theme.basic": "~9.1.0", + "@abp/docs": "~9.1.0" } } diff --git a/modules/docs/app/VoloDocs.Web/yarn.lock b/modules/docs/app/VoloDocs.Web/yarn.lock index 2c85b340f6..87929e3738 100644 --- a/modules/docs/app/VoloDocs.Web/yarn.lock +++ b/modules/docs/app/VoloDocs.Web/yarn.lock @@ -2,238 +2,238 @@ # yarn lockfile v1 -"@abp/anchor-js@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/anchor-js/-/anchor-js-9.1.0-rc.3.tgz#e9197e56912eba1ce243e6925805c6c389161768" - integrity sha512-DMnXrxkiATelrltFVeCCczW49dfBdcUwOV3PStUVmwgPLXO2LuxCBDenNICqzkPmLv4WAUF4MXbhOhw8l8SlBw== +"@abp/anchor-js@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/anchor-js/-/anchor-js-9.1.0.tgz#432ab4106a4e0ae8f5f39462b4ddafdbc5d39fab" + integrity sha512-0XmODAzc9ZaAJXnKdPBpuofsa2W4yp2JKvdd0HFuJZTU36q0k7uA+j+JGHsT95Cd/DyHVuxSV00Ys/Cz4sqcqQ== dependencies: - "@abp/core" "~9.1.0-rc.3" + "@abp/core" "~9.1.0" anchor-js "^5.0.0" -"@abp/aspnetcore.mvc.ui.theme.basic@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-9.1.0-rc.3.tgz#c291f2760d32a9745c4b15a62c13abec9b7e247f" - integrity sha512-f14SIEfZkvSgYBfM/rcDmn0mgkIHGqi6lRP7GeBRUPEhB944osyCFmJH3CWDjJcjTFbqWTvKVlDRsV0Roz5eqg== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~9.1.0-rc.3" - -"@abp/aspnetcore.mvc.ui.theme.shared@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-9.1.0-rc.3.tgz#c05d8b39fc1ef2a9c890c480cb1ec8f47ee10669" - integrity sha512-BTLoVlaYjKrW0Rhrqw4tNiHf5LV8/zBxh90OM7smKYPGOftHhSWSNUUSO5upOdOsVhNSPIxY83PF/LHp29kH8g== - dependencies: - "@abp/aspnetcore.mvc.ui" "~9.1.0-rc.3" - "@abp/bootstrap" "~9.1.0-rc.3" - "@abp/bootstrap-datepicker" "~9.1.0-rc.3" - "@abp/bootstrap-daterangepicker" "~9.1.0-rc.3" - "@abp/datatables.net-bs5" "~9.1.0-rc.3" - "@abp/font-awesome" "~9.1.0-rc.3" - "@abp/jquery-form" "~9.1.0-rc.3" - "@abp/jquery-validation-unobtrusive" "~9.1.0-rc.3" - "@abp/lodash" "~9.1.0-rc.3" - "@abp/luxon" "~9.1.0-rc.3" - "@abp/malihu-custom-scrollbar-plugin" "~9.1.0-rc.3" - "@abp/moment" "~9.1.0-rc.3" - "@abp/select2" "~9.1.0-rc.3" - "@abp/sweetalert2" "~9.1.0-rc.3" - "@abp/timeago" "~9.1.0-rc.3" - "@abp/toastr" "~9.1.0-rc.3" - -"@abp/aspnetcore.mvc.ui@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-9.1.0-rc.3.tgz#88252e0fb822fe9560ed89d2118c7b32a32ba496" - integrity sha512-WGjWNoN97uxjMc173w36UV8UVGxLbDrOcglnqK+RY+E9vIxFGDmWBvwzmJ1KfZRvlwahXtMjTCiYFKO411lh1w== +"@abp/aspnetcore.mvc.ui.theme.basic@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-9.1.0.tgz#e9e0321037c34b43145dfc7827c422fbf79f59ab" + integrity sha512-vLkyrdFXw0/MPyU2hzqGJJk7trmIlVMdflNIe/rF77UIRmJYHWaTmPt9i5PLN/O4s0jnE9kWlaaJ/VnnFWeGsQ== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~9.1.0" + +"@abp/aspnetcore.mvc.ui.theme.shared@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-9.1.0.tgz#35a73580b9b67a33708f2cf897243b50c9ad7100" + integrity sha512-rggTYL9poOFICsOseDX22JNhD0KWH8Oxs0YH91TZjvm/F67cPemW99eBlJc/YdJ7bN6icRiebN8m81y9MSanyg== + dependencies: + "@abp/aspnetcore.mvc.ui" "~9.1.0" + "@abp/bootstrap" "~9.1.0" + "@abp/bootstrap-datepicker" "~9.1.0" + "@abp/bootstrap-daterangepicker" "~9.1.0" + "@abp/datatables.net-bs5" "~9.1.0" + "@abp/font-awesome" "~9.1.0" + "@abp/jquery-form" "~9.1.0" + "@abp/jquery-validation-unobtrusive" "~9.1.0" + "@abp/lodash" "~9.1.0" + "@abp/luxon" "~9.1.0" + "@abp/malihu-custom-scrollbar-plugin" "~9.1.0" + "@abp/moment" "~9.1.0" + "@abp/select2" "~9.1.0" + "@abp/sweetalert2" "~9.1.0" + "@abp/timeago" "~9.1.0" + "@abp/toastr" "~9.1.0" + +"@abp/aspnetcore.mvc.ui@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-9.1.0.tgz#38d058ab148a36ad4d63870e8a501ca339e4a70e" + integrity sha512-lUw1ij87KJp+Rj4cz8oSQkdRuoMq76l/wIAGwtXH+EOKusVpSJTOTioAV/tPKeKZ15ubE4bO5jWcQGxZkXgH3w== dependencies: ansi-colors "^4.1.3" -"@abp/bootstrap-datepicker@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-9.1.0-rc.3.tgz#8376fb204851b8e7be6fb5afe6e023f706426bc2" - integrity sha512-bKPeRpqzHlSCnItxesp+QnAewFcwuB1hmncRydhOg9ImvzRN0M9fAfSXeP7VTYH+2ygDKVEtK+8aAh1RjAryuA== +"@abp/bootstrap-datepicker@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-9.1.0.tgz#96a1875a2b92f03b8f90f7842ebf8849cf8a4d04" + integrity sha512-3FQm1SK8qmzoP7LOvXkZpq1AzrdPHKRdQJjoqK9N+lQxQjNfOxEFMxeDSg6WJKO619Cnve++jAyMidojXlCiwQ== dependencies: bootstrap-datepicker "^1.10.0" -"@abp/bootstrap-daterangepicker@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-9.1.0-rc.3.tgz#f14dd37eb7a4fe4d6cb823da1ee80dc28154d0df" - integrity sha512-C7KXx1630JK4mOrMZEQoiH4vzQZn6JfrS6k8nAX0p48zRNcx8oxwviaojRcu+MjDl/rDHc5U9Xy9lBIurqLEKg== +"@abp/bootstrap-daterangepicker@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-9.1.0.tgz#1993c539837eb31de174cba9f0bccd441a98f209" + integrity sha512-jS1jTqP6KCXQYX9xZpDAI07C94nwzXrNJD3H0pJXsXoOva3TTBQDD8khf6RDb7tiZrkrNJqmMyUiCfVTDbO7zg== dependencies: bootstrap-daterangepicker "^3.1.0" -"@abp/bootstrap@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-9.1.0-rc.3.tgz#01be98456635982e5b43a49318d0bcc55163fad7" - integrity sha512-Xi2TPaReFl3vnnFW974Cc4Sb25Iq+RwzkoGXiJFUiwGgYHbHHCd5Jd9Af6KYNchjP9SJKFYELwKZcQdxEIHauQ== +"@abp/bootstrap@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-9.1.0.tgz#a06c1cd4c11554c29973db70c6a383efebb10b4e" + integrity sha512-r6onkBnpqoWrdYLDVZTiqgQBvH5UZerYRrPB3Ky+RkXJhgwn7AM3LAVrB42sIvFZRNbwOlvuAL+a0+5yDOH67Q== dependencies: - "@abp/core" "~9.1.0-rc.3" + "@abp/core" "~9.1.0" bootstrap "^5.3.3" -"@abp/clipboard@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-9.1.0-rc.3.tgz#85b38876ba259a235acfcea8bb85c0bf9309fa5c" - integrity sha512-3FSLFOpySYQfmlMlrhSEdC8mnLDUtXRBXwWNIBJMTNEKAt0E2Z/2TIefaPzPYzYkqNrXlq8qdOOkvxFm39y8WQ== +"@abp/clipboard@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-9.1.0.tgz#5d5678ef7e8c355715c5a74e4aabd0a21d5e6cbe" + integrity sha512-1TxZbB/q5DPeLhYzrc6y0OVekxnjM+CRH/Gu8nAXQMX46XjdTboXvBtvgKHV1aCznGNsWyjd5A2O5G/XGg9NNw== dependencies: - "@abp/core" "~9.1.0-rc.3" + "@abp/core" "~9.1.0" clipboard "^2.0.11" -"@abp/core@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-9.1.0-rc.3.tgz#4749bd60813ddceb156dec045e7f9eb0b3e19446" - integrity sha512-xYr9zbHCz+v672AuFWSmvqeo0CgAwZTr9laAp58QOCzO2QsVHuDUy60epGhIxCTRc3iCBkcelIFDFlGrN30WSw== +"@abp/core@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-9.1.0.tgz#af78fc096932d4ec45216b5e910c87a72e479b1f" + integrity sha512-6P0KGh5+IqlhQnUOyzaGaKrKzOAm1G0gg8Ay3DXyW2ksY6Zr+lyi5cxNsSi4ix1dicqfydIKvLfV+DF3mQf/dw== dependencies: - "@abp/utils" "~9.1.0-rc.3" + "@abp/utils" "~9.1.0" -"@abp/datatables.net-bs5@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-9.1.0-rc.3.tgz#984d6550124cf0221f8233306483aff72a38249e" - integrity sha512-qJ777clztaau92sLvDgsxIQdKnFpZqQqn3/N2y81eixELm/t/qRiE0ySNduNDnvzik6/uWmfnG82ToCmmTFP2g== +"@abp/datatables.net-bs5@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-9.1.0.tgz#3b2e7d68e947db3d3432ab5e8bff4da89a85d05d" + integrity sha512-zBrzOrfvTPJcc6mvHZDPVdXbWesKU0lKlrb7vuBZxWjrFNwVC0d/KNJPcYVvyQ3zf9rrQB5Xg0MDgu0k5Tt7tQ== dependencies: - "@abp/datatables.net" "~9.1.0-rc.3" + "@abp/datatables.net" "~9.1.0" datatables.net-bs5 "^2.1.8" -"@abp/datatables.net@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-9.1.0-rc.3.tgz#5495345014b6dc3faa67415b2c37ee84b1e4dbbc" - integrity sha512-jKn9DIQrlxMU/dedYaFjfHADPuMfs+6nUojYDGUPd76Ov1TKFNA0N/6ipB7UMYd3xVPEEmgkBH8pqf0qR8D64w== +"@abp/datatables.net@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-9.1.0.tgz#12d6e1412aac4a2e0a61437dcdfbfbe1add7fed7" + integrity sha512-lYRvEZUkntaI+dS9Xkz23Z54eDeZ1R4Wzhqcg6VIsz3iO5kYAa5GiQjcOiBssNGJSLuaet6R5Pqh1ThEUjfvvA== dependencies: - "@abp/jquery" "~9.1.0-rc.3" + "@abp/jquery" "~9.1.0" datatables.net "^2.1.8" -"@abp/docs@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/docs/-/docs-9.1.0-rc.3.tgz#55f2035cfb50c1da1d6a0175ba3f2a74446b4d8b" - integrity sha512-KAZBAmdTxdTsLRqXPi6Tg5RGcStUekYSNl3j5gE/TvXFIqcQa1h0B4wCltAmOHYs5Wss60BkgAtzZJj0ycLdmA== +"@abp/docs@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/docs/-/docs-9.1.0.tgz#0344afd56cbbd4f5b104a578c2e39831f8f30efa" + integrity sha512-jg9CQYC9e8vjRAcTsbbEmJyQ243FC18jkmcKcBHwJgRP54hf3AhPobiFzO7qx9mB0MZWdPReRSAoJ6/BSZx+9g== dependencies: - "@abp/anchor-js" "~9.1.0-rc.3" - "@abp/clipboard" "~9.1.0-rc.3" - "@abp/malihu-custom-scrollbar-plugin" "~9.1.0-rc.3" - "@abp/popper.js" "~9.1.0-rc.3" - "@abp/prismjs" "~9.1.0-rc.3" + "@abp/anchor-js" "~9.1.0" + "@abp/clipboard" "~9.1.0" + "@abp/malihu-custom-scrollbar-plugin" "~9.1.0" + "@abp/popper.js" "~9.1.0" + "@abp/prismjs" "~9.1.0" -"@abp/font-awesome@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-9.1.0-rc.3.tgz#259dcac2f20da57a72b9c41129c465935abc125f" - integrity sha512-fAExSAn0VaPWfx9kPwIKB0xbSSMHZst/NiNXRPhIrCGty/PXp5OV8ao+mqKcsLQJTPFz1RaSxpdq/1s3tAiGWQ== +"@abp/font-awesome@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-9.1.0.tgz#af21ff2d7c332deb1df626404b53a78d790ba842" + integrity sha512-HcJzDCACGejOIvhxsorCdaesyDHnupR/sl5YFCsGikSqATyOSKQy4pw8wKsb1z+FCT5JYCTR7ROJ3lB1lTEgZw== dependencies: - "@abp/core" "~9.1.0-rc.3" + "@abp/core" "~9.1.0" "@fortawesome/fontawesome-free" "^6.6.0" -"@abp/jquery-form@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-9.1.0-rc.3.tgz#c1ee21a5f38dcf0fdbb0c3e2db3f66bc81ae66b1" - integrity sha512-YJ2CDjJVbNpqs88CGgsHnPtJG4BjYLQ0XFVT+Ph9ar5YnuQrYfB60HMdtnQlqn337hkbzVx2XHLJ6h0tT8To9Q== +"@abp/jquery-form@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-9.1.0.tgz#bdb96436c54b2a09ac4259db97e1e577410e1fc3" + integrity sha512-xjHXWstVY6B3MPB4/8g0EJeHlVvlV010OMZKFmfCGLFi6aHAEKqqWh1rMItAiVuSmCCzL0m/208ZkpoCI++jGQ== dependencies: - "@abp/jquery" "~9.1.0-rc.3" + "@abp/jquery" "~9.1.0" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-9.1.0-rc.3.tgz#88976407a14276244a01a24daeda6b236298e917" - integrity sha512-Yac7l/rjHxdogPyMO8LlJklndDBCwZ+qLeTbCcYt7NQnnsnn+xXomSwjFWv8sguTVKG1eL68LquGUCbNwNfrUA== +"@abp/jquery-validation-unobtrusive@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-9.1.0.tgz#798551e7c14ba286a819a48804107a53e974c1ee" + integrity sha512-TggKckfbLtB7Ig2kNt2kH//GaJUns8OZbpdKdh7vCWIAGedw2FLNCABCpoGnyNp0s/dVOtdyxRl9eFRN3+a4tw== dependencies: - "@abp/jquery-validation" "~9.1.0-rc.3" + "@abp/jquery-validation" "~9.1.0" jquery-validation-unobtrusive "^4.0.0" -"@abp/jquery-validation@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-9.1.0-rc.3.tgz#1ff99dea2f2c52e58a50d06b51e0cbca15ff690c" - integrity sha512-YB1t1m+s+vHGuxSt0h4cgIMIpwRy129pjV08Jja1QtCFhE+VgA9hjvx0OVaVcm31aLLt/KU/+NrO36AbebL+zA== +"@abp/jquery-validation@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-9.1.0.tgz#b771652377fbfb3c92ce03b7b7c069a3bb2ae70b" + integrity sha512-bmPSOHcxjitB8NkiLv0SxxuSS3FlCq9SiTUGvsT8nOStDsm+KpyYSzZQq8LSCyqWWj54tlOARTfcD4tMK7/K3Q== dependencies: - "@abp/jquery" "~9.1.0-rc.3" + "@abp/jquery" "~9.1.0" jquery-validation "^1.21.0" -"@abp/jquery@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-9.1.0-rc.3.tgz#0386a2857271dc4c1e04da9e4b304637bbc2d696" - integrity sha512-1UqztwQ92m6kvYE+Tb0rj7iITHngKdGI5kEpZKOHrEWqnMKeEoPbO1cL+ZOWN0m162WJiliod1HEOxW8b9Ha2Q== +"@abp/jquery@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-9.1.0.tgz#952b61ea3e4a99e6551f667297dbb637d83f3c50" + integrity sha512-Ulw8ClAbqmxceNYCb76bR6dq7e9b7Hs6mjlEy05zdbsSNuZW3UoycsJ+BquXi+dUNBo6OppqEmhVeiIjAKTaFg== dependencies: - "@abp/core" "~9.1.0-rc.3" + "@abp/core" "~9.1.0" jquery "~3.7.1" -"@abp/lodash@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-9.1.0-rc.3.tgz#26f53847ed05a171d71c6c6f1ba33d8c4e2a624a" - integrity sha512-eUuNYTk6hla5kOdc5lOBVoKhMBfnkfXdawb+/LtwBwjCQym+XRTCenJhqzxii293xwd+0G1l5M+8VaPWFq6WWg== +"@abp/lodash@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-9.1.0.tgz#62c784bd99c9e1ccfa82905e843375c594ef8584" + integrity sha512-cCE3ZwwWcPrh+ccKx4AS1USL1ttbrXBqci/l+ROjXhFzrs6GYnhI0+30xRZgPdPRm3U3nGPrSaDAU7UuHkRScg== dependencies: - "@abp/core" "~9.1.0-rc.3" + "@abp/core" "~9.1.0" lodash "^4.17.21" -"@abp/luxon@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-9.1.0-rc.3.tgz#0cfae9b2188c9827963e693dbfaaefcce714bdd9" - integrity sha512-UxtDDyLvHr3sPhrWX+uj9JrsN6idYKH+srOmAKC8+FOfWW/YdFAJmsYPLMCov7FoSWXHG+BQhkuXeCCBppyiVA== +"@abp/luxon@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-9.1.0.tgz#b246f3627bbc7ce41b7878fce1679da473b0e0ae" + integrity sha512-AouS/qEK+i69hwr4XtUOCepONLuR+1gdHFb50RpOEbUoDfTYmYpxPBdiICmZPeJ3CExErITPZxzzngCnKPPOUw== dependencies: - "@abp/core" "~9.1.0-rc.3" + "@abp/core" "~9.1.0" luxon "^3.5.0" -"@abp/malihu-custom-scrollbar-plugin@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-9.1.0-rc.3.tgz#08071e21260f867fc2a7d7594dcdf30da921bb47" - integrity sha512-WDWcm4JsTzq4Se8Sg+v6U5ymjbfVOXsU2WR66RSUL8TSq3WM1MLuRaStDGxtt8nOLvPfqiPWIzb2BvsfyePNRw== +"@abp/malihu-custom-scrollbar-plugin@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-9.1.0.tgz#288ae1916a78100f2c728dfd05a560ee99fafae4" + integrity sha512-McdMRDtbTZBjp//3GMVjRjkc16HNYDEdPc2ar1xrY817e0tEln6/TBkItAcfOvjso0TsLcvlNL1+1bjbMjj8OA== dependencies: - "@abp/core" "~9.1.0-rc.3" + "@abp/core" "~9.1.0" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/moment@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-9.1.0-rc.3.tgz#3cb5b000be73e4d681d3d115be98a8422a66e307" - integrity sha512-K30pG1xRGOJ5m7rJI6u5hKv5Lcjmqxqx7cekDf9HURzgpBGLCvMnnXFSx97w0LcPOYzCVxorfTdw6S3sC12idw== +"@abp/moment@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-9.1.0.tgz#f3c0ae02209e496913cda53df752dabc5be648bd" + integrity sha512-WxR1l09vwxRhqyvAVP4m4IBOFjIC4pzLOmelloqES+gL/klw+T/AmY21Z/z+OV0p7aJ3V3Q1aQStuMCDCyGFnQ== dependencies: moment "^2.30.1" -"@abp/popper.js@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/popper.js/-/popper.js-9.1.0-rc.3.tgz#dcac39f9ec328f3d215ec4c7ebd78e522813b0ea" - integrity sha512-9tNDyrF497Ol7hpxCRSz4csGmfmvtdfubM1X6Ot+djMezr4vos995NekdR5oE4uudCZSqmHoFEJJBLfg42I65A== +"@abp/popper.js@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/popper.js/-/popper.js-9.1.0.tgz#94d58274f9e759d4157b717410166bb58307e35a" + integrity sha512-4jvOmlhbXQZGnskqZMVzbCmqTBn19Z/WS0THc1Qed0tu4VkZSgT1FC1wOWruQ7q8s8UJ0v4DQVsjeZl6VUTXjA== dependencies: - "@abp/core" "~9.1.0-rc.3" + "@abp/core" "~9.1.0" "@popperjs/core" "^2.11.8" -"@abp/prismjs@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-9.1.0-rc.3.tgz#f77e1d264ef5b6c1ceb7bd1b4aee19bfce6e723b" - integrity sha512-/vtoR5oyEiVVvLPPsAS5qSI4THle/WqETTTTInpeVx6u/NEbeY9sBAUz+udS/fWJlyxIUN6He56ghoJNaWXYJw== +"@abp/prismjs@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-9.1.0.tgz#40b688c82ae808ef92516ea5731ccb38c19d2384" + integrity sha512-trSW1K6VtIEaAyxe7umQGimCTLrgdT6DwSiQ8PONvKa8WR5ZmzSDU7lK8SliorufkbWtdkjCvuXB81NGt3tAhQ== dependencies: - "@abp/clipboard" "~9.1.0-rc.3" - "@abp/core" "~9.1.0-rc.3" + "@abp/clipboard" "~9.1.0" + "@abp/core" "~9.1.0" prismjs "^1.29.0" -"@abp/select2@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-9.1.0-rc.3.tgz#7bd050e4847c0b8366fd582200f27065ecc4ff57" - integrity sha512-0k5P+amCqNE2cPAGQpEwFl+vMssuKSbpZ0XgHfF0z3EcE1bAuYDo41nAfk/amsJn5Dt55xJcC+yesADkAXEeIA== +"@abp/select2@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-9.1.0.tgz#9c2c6751f8506fb375c9b7c42a008c168a8f4c75" + integrity sha512-n6HqsH8aFLMrqL6LJ0gsHFlaq6T1QSt/x7HkkZyhDC7CwhXajxtsJEstDnDF9naHSXX/lerPbrHEgzn2QRMBqg== dependencies: - "@abp/core" "~9.1.0-rc.3" + "@abp/core" "~9.1.0" select2 "^4.0.13" -"@abp/sweetalert2@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-9.1.0-rc.3.tgz#69751518ea84b8a306478f48b516946363a7fa7f" - integrity sha512-iHk6JzD9qzmdvr/LjAwSVFfX1WmipzQNcCYwUB+kKe2uSfwufYz+9+iYjYcm7uVvZSd9LniIvzvQXyZlfMSy5w== +"@abp/sweetalert2@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-9.1.0.tgz#660f9b1db60cc04bde6cadbcf3c55320d20c2f3e" + integrity sha512-z3JMeAwva2vR8qZSRJ/BisQDdAEqjDJ/6oIGu/JYXQEchO1Lnd9UMV376nc3crLJdnyRRO7Qs6zx4FfVOCH0kw== dependencies: - "@abp/core" "~9.1.0-rc.3" + "@abp/core" "~9.1.0" sweetalert2 "^11.14.1" -"@abp/timeago@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-9.1.0-rc.3.tgz#b1eb20d6c9fe47a6d0ace8565ea8289f1af9c0a1" - integrity sha512-7hq2+HHQ91/xXFGK417dkgFNKU7z49bVN7tkHLMJyKkJb1iP3N0gCz3HdkCRjnM6yrRXQDYUmO/zCv6yBwakjA== +"@abp/timeago@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-9.1.0.tgz#496e40153241bae5d418d79cc6c65c9db6306447" + integrity sha512-a/UAYQ2GrhYFGx4p0hqr3x+teBqnjnOiWJEPq9//RTlz+EZ+OUyHbJrcUtqZRvaGJtOAsfmljD3jYnOXUlU7DA== dependencies: - "@abp/jquery" "~9.1.0-rc.3" + "@abp/jquery" "~9.1.0" timeago "^1.6.7" -"@abp/toastr@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-9.1.0-rc.3.tgz#de490bfd6b41919d96be0544aaaee3d457cf9f32" - integrity sha512-hLe3FXyplQmhRbvBZdLVt+6yRAfptAJzwU2S5iHbs5r4ncO1ampCClZNNLNmrCglDQ30ZkgrPg4SjHn9V6HyIQ== +"@abp/toastr@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-9.1.0.tgz#501cbe211164b2e7416a2d4878cb34aed3550b7c" + integrity sha512-BkTDuU0p9Qa4+HT9CYwiPQjVTrbTSNBgQ18h69S3lIadLJwdC6pXeLbL9bhe+5fiuhq2f+0Oqo3X75LNEgzHkw== dependencies: - "@abp/jquery" "~9.1.0-rc.3" + "@abp/jquery" "~9.1.0" toastr "^2.1.4" -"@abp/utils@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-9.1.0-rc.3.tgz#84de6ab4497c74b2c0c04f604dc6d542a50a1534" - integrity sha512-Tw9gNUAFjmieVrnril7YxwqthpSkZiY01uW60/+Dkd3jh9qZntqgzIcKG6/TXjimWK6iN8YZFOJ0cShCnHW0Jg== +"@abp/utils@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-9.1.0.tgz#a4fd37d943df18b5c11f5d4869efd5d8882b7959" + integrity sha512-+UZo0ocTEZlRO41SzzHNdinjdFUDVq8wYZSj5BA1bqCVeWYhfjI2+rl9DuogCN8UEuCACA4K/qb4XcE/untQ3g== dependencies: just-compare "^2.3.0" diff --git a/modules/docs/src/Volo.Docs.Installer/InstallationNotes.md b/modules/docs/src/Volo.Docs.Installer/InstallationNotes.md new file mode 100644 index 0000000000..a0c172d27c --- /dev/null +++ b/modules/docs/src/Volo.Docs.Installer/InstallationNotes.md @@ -0,0 +1,31 @@ +# Installation Notes for Docs Module + +The ABP Docs module provides a complete documentation system for ABP applications. It allows you to create, manage, and publish documentation from various sources like GitHub, GitLab, or local file system. The module includes both a public interface for readers and an admin interface for documentation management. + +Key features of the Docs module: +- Multiple documentation projects support +- Version control integration +- Markdown support +- Navigation generation +- Full-text search +- Multi-language support +- Admin interface for documentation management + + +## Required Configurations + +The Docs module requires **permission** settings to be configured after installation and database update. + +### Update Database + +The Docs module requires database migrations to be applied. Following installation, you must update the database to create the necessary tables. + +### Permissions + +Enable the following permissions for the roles that require access to the Docs module: + +![Docs Permissions](docs-permissions.png) + +## Documentation + +For detailed information and usage instructions, please visit the [Docs Module documentation](https://abp.io/docs/latest/Modules/Docs). \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Installer/docs-permissions.png b/modules/docs/src/Volo.Docs.Installer/docs-permissions.png new file mode 100644 index 0000000000..b3e478ce0a Binary files /dev/null and b/modules/docs/src/Volo.Docs.Installer/docs-permissions.png differ diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Blazor/Components/FeatureManagementModal.razor b/modules/feature-management/src/Volo.Abp.FeatureManagement.Blazor/Components/FeatureManagementModal.razor index ad5435b3c2..77f5018e10 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Blazor/Components/FeatureManagementModal.razor +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Blazor/Components/FeatureManagementModal.razor @@ -3,7 +3,7 @@ @inherits AbpFeatureManagementComponentBase - + @L["Features"]@ProviderKeyDisplayName @@ -14,7 +14,7 @@ } else { - + @foreach (var group in Groups) diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Installer/InstallationNotes.md b/modules/feature-management/src/Volo.Abp.FeatureManagement.Installer/InstallationNotes.md new file mode 100644 index 0000000000..10e1b121f6 --- /dev/null +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Installer/InstallationNotes.md @@ -0,0 +1,24 @@ +# Installation Notes for Feature Management Module + +The Feature Management module provides a way to define and manage features in an ABP application. Features are used to enable or disable specific functionalities of an application based on different conditions, such as tenant subscription levels or user preferences. + +Key capabilities of the Feature Management module: +- Define features with different value types (boolean, numeric, etc.) +- Group features by providers (tenant, edition, etc.) +- Manage feature values through a user interface +- Check feature status in your application code + +## NuGet Packages + +The following NuGet packages are required for the Feature Management module: +- `Volo.Abp.FeatureManagement.Application` +- `Volo.Abp.FeatureManagement.HttpApi` +- `Volo.Abp.FeatureManagement.EntityFrameworkCore` (for EF Core) +- `Volo.Abp.FeatureManagement.MongoDB` (for MongoDB) +- `Volo.Abp.FeatureManagement.Web` (for MVC UI) +- `Volo.Abp.FeatureManagement.Blazor.Server` (for Blazor Server UI) +- `Volo.Abp.FeatureManagement.Blazor.WebAssembly` (for Blazor WebAssembly UI) + +## Documentation + +For detailed information and usage instructions, please visit the [Feature Management Module documentation](https://abp.io/docs/latest/Modules/Feature-Management). \ No newline at end of file diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/FeatureManagementModal.cshtml b/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/FeatureManagementModal.cshtml index c29e77fcfc..9c3ceca88f 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/FeatureManagementModal.cshtml +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/FeatureManagementModal.cshtml @@ -22,7 +22,7 @@ -
    + @if (Model.FeatureListResultDto != null && Model.FeatureListResultDto.Groups.Any()) diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/feature-management-modal.js b/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/feature-management-modal.js index 88e95b28f5..fd9c654ae6 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/feature-management-modal.js +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/feature-management-modal.js @@ -4,6 +4,7 @@ var abp = abp || {}; let l = abp.localization.getResource("AbpFeatureManagement"); abp.modals.FeatureManagement = function () { + abp.ResourceLoader.loadScript('/client-proxies/featureManagement-proxy.js'); $('#ResetToDefaults').click(function (e) { abp.message.confirm(l('AreYouSureToResetToDefault')) @@ -15,6 +16,7 @@ var abp = abp || {}; abp.notify.success(l('ResetedToDefault')); }); setTimeout(function () { + $("#FeatureManagementForm").trigger('abp-ajax-success'); $('#featureManagmentModal').modal('hide'); }, 500); } diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityErrorCodes.cs b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityErrorCodes.cs index aedec65862..4710c62f90 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityErrorCodes.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityErrorCodes.cs @@ -12,4 +12,6 @@ public static class IdentityErrorCodes public const string CanNotChangeTwoFactor = "Volo.Abp.Identity:010008"; public const string YouCannotDelegateYourself = "Volo.Abp.Identity:010009"; public const string ClaimNameExist = "Volo.Abp.Identity:010021"; + public const string CanNotUpdateStaticClaimType = "Volo.Abp.Identity:010022"; + public const string CanNotDeleteStaticClaimType = "Volo.Abp.Identity:010023"; } diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/ar.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/ar.json index e898146bda..bfbd43a9d7 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/ar.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/ar.json @@ -77,6 +77,8 @@ "Volo.Abp.Identity:010008": "لا يجوز تغيير Ų„Ų¹ŲÆŲ§ŲÆ Ų¹Ų§Ł…Ł„ŁŠŁ†.", "Volo.Abp.Identity:010009": "لا ŁŠŁ…ŁƒŁ†Łƒ تفويض Ł†ŁŲ³Łƒ.", "Volo.Abp.Identity:010021": "الاسم {0} Ł…ŁˆŲ¬ŁˆŲÆ بالفعل.", + "Volo.Abp.Identity:010022": "لا ŁŠŁ…ŁƒŁ† تحديث Ł†ŁˆŲ¹ المطابقة.", + "Volo.Abp.Identity:010023": "لا ŁŠŁ…ŁƒŁ† حذف Ł†ŁˆŲ¹ المطابقة.", "Identity.OrganizationUnit.MaxUserMembershipCount": "العدد الأقصى Ų§Ł„Ł…Ų³Ł…ŁˆŲ­ به Ł„Ų¹Ų¶ŁˆŁŠŲ© Ų§Ł„ŁˆŲ­ŲÆŲ© Ų§Ł„ŲŖŁ†ŲøŁŠŁ…ŁŠŲ© للمستخدم", "ThisUserIsNotActiveMessage": "هذا المستخدم غير نؓط.", "Permission:IdentityManagement": "Ų„ŲÆŲ§Ų±Ų© Ų§Ł„Ł‡ŁˆŁŠŲ©", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/cs.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/cs.json index e6e1fd4f40..deea27dd17 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/cs.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/cs.json @@ -77,6 +77,8 @@ "Volo.Abp.Identity:010008": "NenĆ­ povoleno měnit nastavenĆ­ dvou faktorÅÆ.", "Volo.Abp.Identity:010009": "Nemůžete delegovat svĆ© vlastnĆ­ oprĆ”vněnĆ­.", "Volo.Abp.Identity:010021": "NĆ”zev '{0}' již existuje.", + "Volo.Abp.Identity:010022": "Nelze aktualizovat statický typ deklarace.", + "Volo.Abp.Identity:010023": "Nelze smazat statický typ deklarace.", "Identity.OrganizationUnit.MaxUserMembershipCount": "MaximĆ”lnĆ­ povolený počet členÅÆ organizačnĆ­ jednotky pro uživatele", "ThisUserIsNotActiveMessage": "Tento uživatel nenĆ­ aktivnĆ­.", "Permission:IdentityManagement": "SprĆ”va identit", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/de.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/de.json index c633851683..5987f215d7 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/de.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/de.json @@ -77,6 +77,8 @@ "Volo.Abp.Identity:010008": "Die Zwei-Faktor-Einstellung dürfen nicht geƤndert werden.", "Volo.Abp.Identity:010009": "Sie kƶnnen sich nicht selbst delegieren.", "Volo.Abp.Identity:010021": "Der Name existiert bereits {0}", + "Volo.Abp.Identity:010022": "Der Name kann nicht aktualisiert werden.", + "Volo.Abp.Identity:010023": "Der Name kann nicht gelƶscht werden.", "Identity.OrganizationUnit.MaxUserMembershipCount": "Maximal zulƤssige Anzahl an Mitgliedschaften in Organisationseinheiten für einen Benutzer", "ThisUserIsNotActiveMessage": "Dieser Benutzer ist nicht aktiv.", "Permission:IdentityManagement": "IdentitƤtsverwaltung", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/el.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/el.json index fe9ac05d5a..b3b040cb91 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/el.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/el.json @@ -76,6 +76,8 @@ "Volo.Abp.Identity:010008": "Δεν επιτρέπεται Ī· αλλαγή της ĻĻĪøĪ¼Ī¹ĻƒĪ·Ļ‚ Ī“ĻĪæ Ļ€Ī±ĻĪ±Ī³ĻŒĪ½Ļ„Ļ‰Ī½.", "Volo.Abp.Identity:010009": "Δεν μπορείτε να Ī±Ī½Ī±ĪøĪ­ĻƒĪµĻ„Īµ την ĪµĪ¾ĪæĻ…ĻƒĪ¹ĪæĪ“ĻŒĻ„Ī·ĻƒĪ® ĻƒĪ±Ļ‚ σε ĪµĻƒĪ¬Ļ‚ ίΓιο.", "Volo.Abp.Identity:010021": "Το όνομα '{0}' υπάρχει ήΓη.", + "Volo.Abp.Identity:010022": "Δεν μπορείτε να ĪµĪ½Ī·Ī¼ĪµĻĻŽĻƒĪµĻ„Īµ ένα ĻƒĻ„Ī±Ļ„Ī¹ĪŗĻŒ Ļ„ĻĻ€Īæ Ī“Ī®Ī»Ļ‰ĻƒĪ·Ļ‚.", + "Volo.Abp.Identity:010023": "Δεν μπορείτε να Ī“Ī¹Ī±Ī³ĻĪ¬ĻˆĪµĻ„Īµ ένα ĻƒĻ„Ī±Ļ„Ī¹ĪŗĻŒ Ļ„ĻĻ€Īæ Ī“Ī®Ī»Ļ‰ĻƒĪ·Ļ‚.", "Identity.OrganizationUnit.MaxUserMembershipCount": "ĪœĪ­Ī³Ī¹ĻƒĻ„ĪæĻ‚ ĪµĻ€Ī¹Ļ„ĻĪµĻ€ĻŒĪ¼ĪµĪ½ĪæĻ‚ Ī±ĻĪ¹ĪøĪ¼ĻŒĻ‚ Ī¼ĪµĪ»ĻŽĪ½ μονάΓας ĪæĻĪ³Ī±Ī½Ī¹ĻƒĪ¼ĪæĻ για έναν Ļ‡ĻĪ®ĻƒĻ„Ī·", "ThisUserIsNotActiveMessage": "Ī‘Ļ…Ļ„ĻŒĻ‚ Īæ Ļ‡ĻĪ®ĻƒĻ„Ī·Ļ‚ Γεν είναι ĪµĪ½ĪµĻĪ³ĻŒĻ‚.", "Permission:IdentityManagement": "Ī”Ī¹Ī±Ļ‡ĪµĪÆĻĪ¹ĻƒĪ· Ļ„Ī±Ļ…Ļ„ĻŒĻ„Ī·Ļ„Ī±Ļ‚", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/en-GB.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/en-GB.json index 915f0dd461..b7d30bb30a 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/en-GB.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/en-GB.json @@ -76,6 +76,8 @@ "Volo.Abp.Identity:010008": "Changing the two factor setting is not allowed.", "Volo.Abp.Identity:010009": "You cannot delegate yourself!", "Volo.Abp.Identity:010021": "Name exist: '{0}'", + "Volo.Abp.Identity:010022": "Can not update a static ClaimType.", + "Volo.Abp.Identity:010023": "Can not delete a static ClaimType.", "Identity.OrganizationUnit.MaxUserMembershipCount": "Maximum allowed organisation unit membership count for a user", "Permission:IdentityManagement": "Identity management", "Permission:RoleManagement": "Role management", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/en.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/en.json index 97aafcdb8e..266ce50b5a 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/en.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/en.json @@ -77,6 +77,8 @@ "Volo.Abp.Identity:010008": "It's not allowed to change two factor setting.", "Volo.Abp.Identity:010009": "You can not delegate yourself.", "Volo.Abp.Identity:010021": "Name exist: '{0}'.", + "Volo.Abp.Identity:010022": "Can not update a static ClaimType.", + "Volo.Abp.Identity:010023": "Can not delete a static ClaimType.", "Identity.OrganizationUnit.MaxUserMembershipCount": "Maximum allowed organization unit membership count for a user", "ThisUserIsNotActiveMessage": "This user is not active.", "Permission:IdentityManagement": "Identity management", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/es.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/es.json index fb5edbc2ac..861ffe10b0 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/es.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/es.json @@ -77,6 +77,8 @@ "Volo.Abp.Identity:010008": "No estĆ” permitido cambiar la configuración de autenticación de dos pasos.", "Volo.Abp.Identity:010009": "No puedes delegar tu propia cuenta!", "Volo.Abp.Identity:010021": "Ya existe un con el nombre '{0}'", + "Volo.Abp.Identity:010022": "No se puede actualizar un tipo de reclamación estĆ”tica.", + "Volo.Abp.Identity:010023": "No se puede borrar un tipo de reclamación estĆ”tica.", "Identity.OrganizationUnit.MaxUserMembershipCount": "NĆŗmero mĆ”ximo de unidades organizativas por usuario", "ThisUserIsNotActiveMessage": "Este usuario no estĆ” activo.", "Permission:IdentityManagement": "Gestión de identidades", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/fa.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/fa.json index 3482c2120e..b733dbd4eb 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/fa.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/fa.json @@ -77,6 +77,8 @@ "Volo.Abp.Identity:010008": "تغییر دادن ŲŖŁ†ŲøŪŒŁ…Ų§ŲŖ دو مرحله ای Ł…Ų¬Ų§Ų² Ł†Ł…ŪŒ ŲØŲ§Ų“ŲÆ.", "Volo.Abp.Identity:010009": "Ų“Ł…Ų§ Ł†Ł…ŪŒ ŲŖŁˆŲ§Ł†ŪŒŲÆ Ų®ŁˆŲÆŲŖŲ§Ł† Ų±Ų§ Ł…Ų¹Ų±ŁŪŒ Ś©Ł†ŪŒŲÆ.", "Volo.Abp.Identity:010021": "نام {0} قبلاً استفاده ŚÆŲ±ŲÆŪŒŲÆŁ‡ Ų§Ų³ŲŖ.", + "Volo.Abp.Identity:010022": "Ł†Ł…ŪŒ ŲŖŁˆŲ§Ł† نام نقؓ/ŁˆŲøŪŒŁŁ‡ Ų±Ų§ تغییر ŲÆŲ§ŲÆ.", + "Volo.Abp.Identity:010023": "Ł†Ł…ŪŒ ŲŖŁˆŲ§Ł† نقؓ/ŁˆŲøŪŒŁŁ‡ Ų±Ų§ حذف کرد.", "Identity.OrganizationUnit.MaxUserMembershipCount": "حداکثر ŲŖŲ¹ŲÆŲ§ŲÆ Ł…Ų¬Ų§Ų² عضویت ŲÆŲ± یک واحد سازمان برای یک کاربر", "ThisUserIsNotActiveMessage": "Ų§ŪŒŁ† کاربر ŲŗŪŒŲ±ŁŲ¹Ų§Ł„ Ł…ŪŒŲØŲ§Ų“ŲÆ.", "Permission:IdentityManagement": "Ł…ŲÆŪŒŲ±ŪŒŲŖ Ł‡ŁˆŪŒŲŖ", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/fi.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/fi.json index cf3d33c34f..1ad2950b8e 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/fi.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/fi.json @@ -77,6 +77,8 @@ "Volo.Abp.Identity:010008": "Kahden tekijƤn asetusta ei saa muuttaa.", "Volo.Abp.Identity:010009": "Et voi delegoida itseƤsi.", "Volo.Abp.Identity:010021": "{0} on jo olemassa.", + "Volo.Abp.Identity:010022": "Staattista vƤittƤmƤtunnusta ei voi pƤivittƤƤ.", + "Volo.Abp.Identity:010023": "Staattista vƤittƤmƤtunnusta ei voi poistaa.", "Identity.OrganizationUnit.MaxUserMembershipCount": "Suurin sallittu organisaatioyksikƶn jƤsenmƤƤrƤ kƤyttƤjƤlle", "ThisUserIsNotActiveMessage": "TƤmƤ kƤyttƤjƤ ei ole aktiivinen.", "Permission:IdentityManagement": "Identiteetin hallinta", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/fr.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/fr.json index d7c8788585..39c5a3a71d 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/fr.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/fr.json @@ -77,6 +77,8 @@ "Volo.Abp.Identity:010008": "Il n’est pas permis de changer deux facteurs de rĆ©glage.", "Volo.Abp.Identity:010009": "Vous ne pouvez pas vous dĆ©lĆ©guer vous-mĆŖme.", "Volo.Abp.Identity:010021" : "Le nom '{0}' existe dĆ©jĆ .", + "Volo.Abp.Identity:010022": "Vous ne pouvez pas modifier un type de revendication statique.", + "Volo.Abp.Identity:010023": "Vous ne pouvez pas supprimer un type de revendication statique.", "Identity.OrganizationUnit.MaxUserMembershipCount": "Nombre maximal d’adhĆ©sions autorisĆ©es Ć  l’unitĆ© d’organisation pour un utilisateur", "ThisUserIsNotActiveMessage": "Cet utilisateur n'est pas actif.", "Permission:IdentityManagement": "Gestion de l’identitĆ©", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/hi.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/hi.json index 0c945fc6bd..760ae275de 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/hi.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/hi.json @@ -77,6 +77,8 @@ "Volo.Abp.Identity:010008": "ą¤‡ą¤øą„‡ ą¤¦ą„‹ कारक ą¤øą„‡ą¤Ÿą¤æą¤‚ą¤— ą¤¬ą¤¦ą¤²ą¤Øą„‡ ą¤•ą„€ ą¤…ą¤Øą„ą¤®ą¤¤ą¤æ ą¤Øą¤¹ą„€ą¤‚ ą¤¹ą„ˆą„¤", "Volo.Abp.Identity:010009": "आप ą¤…ą¤Ŗą¤Øą„‡ आप ą¤•ą„‹ ą¤…ą¤§ą¤æą¤•ą„ƒą¤¤ ą¤Øą¤¹ą„€ą¤‚ कर ą¤øą¤•ą¤¤ą„‡ ą¤¹ą„ˆą¤‚!", "Volo.Abp.Identity:010021" : "नाम '{0}' ą¤Ŗą¤¹ą¤²ą„‡ ą¤øą„‡ ą¤¹ą„€ लिया गया ą¤¹ą„ˆą„¤", + "Volo.Abp.Identity:010022": "ą¤øą„ą¤„ą„ˆą¤¤ą¤æą¤• ą¤­ą„‚ą¤®ą¤æą¤•ą¤¾ą¤“ą¤‚ का नाम ą¤Øą¤¹ą„€ą¤‚ बदला जा सकता ą¤¹ą„ˆą„¤", + "Volo.Abp.Identity:010023": "ą¤øą„ą¤„ą„ˆą¤¤ą¤æą¤• ą¤­ą„‚ą¤®ą¤æą¤•ą¤¾ą¤“ą¤‚ ą¤•ą„‹ हटाया ą¤Øą¤¹ą„€ą¤‚ जा ą¤øą¤•ą¤¤ą¤¾ą„¤", "Identity.OrganizationUnit.MaxUserMembershipCount": "ą¤‰ą¤Ŗą¤Æą„‹ą¤—ą¤•ą¤°ą„ą¤¤ą¤¾ ą¤•ą„‡ ą¤²ą¤æą¤ अधिकतम ą¤…ą¤Øą„ą¤®ą¤¤ संगठन ą¤‡ą¤•ą¤¾ą¤ˆ ą¤øą¤¦ą¤øą„ą¤Æą¤¤ą¤¾ गणना", "ThisUserIsNotActiveMessage": "यह ą¤‰ą¤Ŗą¤Æą„‹ą¤—ą¤•ą¤°ą„ą¤¤ą¤¾ ą¤øą¤•ą„ą¤°ą¤æą¤Æ ą¤Øą¤¹ą„€ą¤‚ ą¤¹ą„ˆą„¤", "Permission:IdentityManagement": "पहचान ą¤Ŗą„ą¤°ą¤¬ą¤‚ą¤§ą¤Ø", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/hr.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/hr.json index 92d4b74973..5af46488f3 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/hr.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/hr.json @@ -76,7 +76,9 @@ "Volo.Abp.Identity:010007": "Ne možete promijeniti postavku dva faktora.", "Volo.Abp.Identity:010008": "Nije dopuÅ”teno mijenjati postavke dvofaktorske autentifikacije.", "Volo.Abp.Identity:010009": "Ne možete delegirati sami sebi.", - "Volo.Abp.Identity:010021" : "Naziv '{0}' već postoji.", + "Volo.Abp.Identity:010021": "Naziv '{0}' već postoji.", + "Volo.Abp.Identity:010022": "Ne možete ažurirati statički tip deklaracije.", + "Volo.Abp.Identity:010023": "Ne možete izbrisati statički tip deklaracije.", "Identity.OrganizationUnit.MaxUserMembershipCount": "Maksimalni dopuÅ”teni broj članstva u organizacijskoj jedinici za korisnika", "ThisUserIsNotActiveMessage": "Ovaj korisnik nije aktivan.", "Permission:IdentityManagement": "Upravljanje identitetom", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/hu.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/hu.json index e65fdd805e..4c9ee448eb 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/hu.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/hu.json @@ -76,7 +76,9 @@ "Volo.Abp.Identity:010007": "Nem vĆ”ltoztathatja meg a kĆ©tlĆ©pcsős bejelentkezĆ©s beĆ”llĆ­tĆ”sĆ”t.", "Volo.Abp.Identity:010008": "KĆ©tlĆ©pcsős bejelentkezĆ©s beĆ”llĆ­tĆ”s megvĆ”ltoztatĆ”sa nem megengedett.", "Volo.Abp.Identity:010009": "Nem adhatja Ć”t a sajĆ”t jogosultsĆ”gait.", - "Volo.Abp.Identity:010021" : "'{0}' nevű mĆ”r lĆ©tezik.", + "Volo.Abp.Identity:010021": "'{0}' nevű mĆ”r lĆ©tezik.", + "Volo.Abp.Identity:010022": "Nem lehet frissĆ­teni a statikus jogosultsĆ”g tĆ­pusĆ”t.", + "Volo.Abp.Identity:010023": "Nem lehet tƶrƶlni a statikus jogosultsĆ”g tĆ­pusĆ”t.", "Identity.OrganizationUnit.MaxUserMembershipCount": "A maximĆ”lisan megengedett szervezeti egysĆ©g tagsĆ”gi szĆ”m egy felhasznĆ”ló szĆ”mĆ”ra", "ThisUserIsNotActiveMessage": "Ez a felhasznĆ”ló nem aktĆ­v.", "Permission:IdentityManagement": "IdentitĆ”skezelĆ©s", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/is.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/is.json index 38fa84db3d..013bce103e 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/is.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/is.json @@ -76,7 +76,9 @@ "Volo.Abp.Identity:010007": "ĆžĆŗ getur ekki breytt tveggja þÔtta stillingu þinni.", "Volo.Abp.Identity:010008": "ƞaư er ekki leyfilegt aư breyta tvíþÔtta stillingu.", "Volo.Abp.Identity:010009": "ĆžĆŗ getur ekki delegaư þér sjĆ”lfum.", - "Volo.Abp.Identity:010021" : "Nafniư '{0}' er þegar Ć­ notkun.", + "Volo.Abp.Identity:010021": "Nafniư '{0}' er þegar Ć­ notkun.", + "Volo.Abp.Identity:010022": "Ekki er hƦgt aư breyta static hlutverk.", + "Volo.Abp.Identity:010023": "Ekki er hƦgt aư eyưa static hlutverkum.", "Identity.OrganizationUnit.MaxUserMembershipCount": "HĆ”marks leyfileg fjƶldi aưildar aư skipulagseiningu fyrir notanda", "ThisUserIsNotActiveMessage": "ƞessi notandi er ekki virkur.", "Permission:IdentityManagement": "Auưkenninga umsjón", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/it.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/it.json index bf8eb97e59..00d5c139b9 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/it.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/it.json @@ -76,7 +76,9 @@ "Volo.Abp.Identity:010007": "Non puoi modificare l'impostazione dei due fattori.", "Volo.Abp.Identity:010008": "Non ĆØ consentito modificare l'impostazione a due fattori.", "Volo.Abp.Identity:010009": "Non puoi delegare te stesso.", - "Volo.Abp.Identity:010021" : "Il nome '{0}' ĆØ giĆ  in uso.", + "Volo.Abp.Identity:010021": "Il nome '{0}' ĆØ giĆ  in uso.", + "Volo.Abp.Identity:010022": "Non puoi modificare il tipo di richiesta statica.", + "Volo.Abp.Identity:010023": "Non puoi eliminare il tipo di richiesta statica.", "Identity.OrganizationUnit.MaxUserMembershipCount": "Numero massimo consentito di membri dell'unitĆ  organizzativa per un utente", "ThisUserIsNotActiveMessage": "Questo utente non ĆØ attivo.", "Permission:IdentityManagement": "Gestione identitĆ ", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/nl.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/nl.json index 9a4928c4c0..f7fab35933 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/nl.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/nl.json @@ -76,7 +76,9 @@ "Volo.Abp.Identity:010007": "U kunt uw instelling voor tweefactor authenticatie niet wijzigen.", "Volo.Abp.Identity:010008": "Het is niet toegestaan om de instelling van tweefactor authenticatie te wijzigen.", "Volo.Abp.Identity:010009": "U kunt uzelf niet delegeren.", - "Volo.Abp.Identity:010021" : "Er bestaat al een met de naam '{0}'.", + "Volo.Abp.Identity:010021": "Er bestaat al een met de naam '{0}'.", + "Volo.Abp.Identity:010022": "Kan de naam van een statische claim niet wijzigen.", + "Volo.Abp.Identity:010023": "Kan de naam van een statische claim niet verwijderen.", "Identity.OrganizationUnit.MaxUserMembershipCount": "Maximaal toegestande aantal lidmaatschappen van organisatie-eenheden voor een gebruiker", "ThisUserIsNotActiveMessage": "Deze gebruiker is niet actief.", "Permission:IdentityManagement": "Identiteitsbeheer", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/pl-PL.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/pl-PL.json index 6e2d4d1406..8d794777ee 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/pl-PL.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/pl-PL.json @@ -76,7 +76,9 @@ "Volo.Abp.Identity:010007": "Nie możesz zmienić ustawienia dwóch czynników.", "Volo.Abp.Identity:010008": "Nie wolno zmieniać ustawienia dwuczynnikowego.", "Volo.Abp.Identity:010009": "Nie możesz delegować swoich uprawnień.", - "Volo.Abp.Identity:010021" : "Nazwa '{0}' już istnieje.", + "Volo.Abp.Identity:010021": "Nazwa '{0}' już istnieje.", + "Volo.Abp.Identity:010022": "Nie można zmienić typu statycznej deklaracji.", + "Volo.Abp.Identity:010023": "Nie można usunąć typu statycznej deklaracji.", "Identity.OrganizationUnit.MaxUserMembershipCount": "Maksymalna dozwolona liczba członków jednostki organizacyjnej dla użytkownika", "ThisUserIsNotActiveMessage": "Ten użytkownik nie jest aktywny.", "Permission:IdentityManagement": "Zarządzanie tożsamością", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/pt-BR.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/pt-BR.json index 54c4ee1a20..b8c4a0fdb7 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/pt-BR.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/pt-BR.json @@ -76,7 +76,9 @@ "Volo.Abp.Identity:010007": "VocĆŖ nĆ£o pode alterar sua configuração de dois fatores.", "Volo.Abp.Identity:010008": "NĆ£o Ć© permitido alterar a configuração de dois fatores.", "Volo.Abp.Identity:010009": "VocĆŖ nĆ£o pode delegar a si mesmo.", - "Volo.Abp.Identity:010021" : "JĆ” existe um(a) {0} com o nome.", + "Volo.Abp.Identity:010021": "JĆ” existe um(a) {0} com o nome.", + "Volo.Abp.Identity:010022": "NĆ£o Ć© possĆ­vel alterar o tipo de declaração estĆ”tica.", + "Volo.Abp.Identity:010023": "NĆ£o Ć© possĆ­vel excluir o tipo de declaração estĆ”tica.", "Identity.OrganizationUnit.MaxUserMembershipCount": "Contagem mĆ”xima permitida de membros da unidade organizacional para um usuĆ”rio", "ThisUserIsNotActiveMessage": "Este usuĆ”rio nĆ£o estĆ” ativo.", "Permission:IdentityManagement": "Acessos", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/ro-RO.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/ro-RO.json index 59e5db1aa7..2cde7af570 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/ro-RO.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/ro-RO.json @@ -76,7 +76,9 @@ "Volo.Abp.Identity:010007": "Nu vă puteÅ£i schimba setările de autentificare Ć®n doi paşi.", "Volo.Abp.Identity:010008": "Nu este permisă modificarea setărilor autentificării Ć®n doi paşi.", "Volo.Abp.Identity:010009": "Nu vă puteÅ£i delega singur.", - "Volo.Abp.Identity:010021" : "Numele '{0}' este deja luat.", + "Volo.Abp.Identity:010021": "Numele '{0}' este deja luat.", + "Volo.Abp.Identity:010022": "Nu poate fi schimbată tipul de declaraÅ£ie statică.", + "Volo.Abp.Identity:010023": "Nu poate fi ştersă declaraÅ£ia statică.", "Identity.OrganizationUnit.MaxUserMembershipCount": "Numărul maxim de unităţi organizaÅ£ionale permise pentru un utilizator", "ThisUserIsNotActiveMessage": "Acest utilizator nu este activ.", "Permission:IdentityManagement": "Administrare identităţii", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/ru.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/ru.json index e9a89171d3..8345df27b8 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/ru.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/ru.json @@ -76,7 +76,9 @@ "Volo.Abp.Identity:010007": "Š’Ń‹ не можете ŠøŠ·Š¼ŠµŠ½ŠøŃ‚ŃŒ Š½Š°ŃŃ‚Ń€Š¾Š¹ŠŗŃƒ Š“Š²ŃƒŃ… факторов.", "Volo.Abp.Identity:010008": "Изменение Š“Š²ŃƒŃ…Ń„Š°ŠŗŃ‚Š¾Ń€Š½Š¾Š¹ настройки не Š“Š¾ŠæŃƒŃŠŗŠ°ŠµŃ‚ŃŃ.", "Volo.Abp.Identity:010009": "Š’Ń‹ не можете Š“ŠµŠ»ŠµŠ³ŠøŃ€Š¾Š²Š°Ń‚ŃŒ свои собственные права.", - "Volo.Abp.Identity:010021" : "Š˜Š¼Ń '{0}' уже ŃŃƒŃ‰ŠµŃŃ‚Š²ŃƒŠµŃ‚.", + "Volo.Abp.Identity:010021": "Š˜Š¼Ń '{0}' уже ŃŃƒŃ‰ŠµŃŃ‚Š²ŃƒŠµŃ‚.", + "Volo.Abp.Identity:010022": "ŠŠµŠ²Š¾Š·Š¼Š¾Š¶Š½Š¾ ŠøŠ·Š¼ŠµŠ½ŠøŃ‚ŃŒ тип статической Гекларации.", + "Volo.Abp.Identity:010023": "ŠŠµŠ²Š¾Š·Š¼Š¾Š¶Š½Š¾ ŃƒŠ“Š°Š»ŠøŃ‚ŃŒ тип статической Гекларации.", "Identity.OrganizationUnit.MaxUserMembershipCount": "Максимально Š“Š¾ŠæŃƒŃŃ‚ŠøŠ¼Š¾Šµ количество членов организационного ŠæŠ¾Š“Ń€Š°Š·Š“ŠµŠ»ŠµŠ½ŠøŃ Š“Š»Ń ŠæŠ¾Š»ŃŒŠ·Š¾Š²Š°Ń‚ŠµŠ»Ń", "ThisUserIsNotActiveMessage": "Этот ŠæŠ¾Š»ŃŒŠ·Š¾Š²Š°Ń‚ŠµŠ»ŃŒ не активен.", "Permission:IdentityManagement": "Управление иГентификацией", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/sk.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/sk.json index 5ab18796c5..d9fa8dbf61 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/sk.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/sk.json @@ -76,7 +76,9 @@ "Volo.Abp.Identity:010007": "DvojfaktorovĆ© nastavenie nie je možnĆ© zmeniÅ„.", "Volo.Abp.Identity:010008": "DvojfaktorovĆ© nastavenie nie je povolenĆ© zmeniÅ„.", "Volo.Abp.Identity:010009": "NemÓžete delegovaÅ„ svoje vlastnĆ© oprĆ”vnenia.", - "Volo.Abp.Identity:010021" : "NĆ”zov '{0}' sa už používa.", + "Volo.Abp.Identity:010021": "NĆ”zov '{0}' sa už používa.", + "Volo.Abp.Identity:010022": "Nie je možnĆ© zmeniÅ„ typ statickĆ©ho oprĆ”vnenia.", + "Volo.Abp.Identity:010023": "Nie je možnĆ© odstrĆ”niÅ„ typ statickĆ©ho oprĆ”vnenia.", "Identity.OrganizationUnit.MaxUserMembershipCount": "MaximĆ”lny povolený počet členov organizačnej jednotky pre používateľa", "ThisUserIsNotActiveMessage": "Tento používateľ nie je aktĆ­vny.", "Permission:IdentityManagement": "SprĆ”va identĆ­t", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/sl.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/sl.json index be509eccf1..b6d505c1c3 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/sl.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/sl.json @@ -77,6 +77,8 @@ "Volo.Abp.Identity:010008": "Ni dovoljeno spreminjati nastavitve dveh faktorjev.", "Volo.Abp.Identity:010009": "Ne morete delegirati svojih pravic.", "Volo.Abp.Identity:010021" : "Naziv '{0}' že obstaja.", + "Volo.Abp.Identity:010022": "Ne morete spremeniti tipa statične deklaracije.", + "Volo.Abp.Identity:010023": "Ne morete izbrisati tipa statične deklaracije.", "Identity.OrganizationUnit.MaxUserMembershipCount": "Največje dovoljeno Å”tevilo članov v organizacijski enoti za uporabnika", "ThisUserIsNotActiveMessage": "Ta uporabnik ni aktiven.", "Permission:IdentityManagement": "Upravljanje identitet", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/sv.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/sv.json index e8ebd083bf..e664adbbfe 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/sv.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/sv.json @@ -77,6 +77,8 @@ "Volo.Abp.Identity:010008": "Det Ƥr inte tillĆ„tet att Ƥndra instƤllningen fƶr tvĆ„ faktorer.", "Volo.Abp.Identity:010009": "Du kan inte delegera dig sjƤlv.", "Volo.Abp.Identity:010021": "Namn finns: '{0}'.", + "Volo.Abp.Identity:010022": "Kan inte Ƥndra statiskt omrĆ„de.", + "Volo.Abp.Identity:010023": "Kan inte ta bort statiskt omrĆ„de.", "Identity.OrganizationUnit.MaxUserMembershipCount": "Hƶgsta tillĆ„tna antal medlemskap i organisationsenheter fƶr en anvƤndare", "ThisUserIsNotActiveMessage": "Den hƤr anvƤndaren Ƥr inte aktiv.", "Permission:IdentityManagement": "Identitetshantering", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/tr.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/tr.json index 813f62fabe..72b232de4e 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/tr.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/tr.json @@ -76,7 +76,9 @@ "Volo.Abp.Identity:010007": "İki faktƶrlü ayarınızı değiştiremezsiniz.", "Volo.Abp.Identity:010008": "İki faktƶrlü ayarın değiştirilmesine izin verilmez.", "Volo.Abp.Identity:010009": "Kendinizi yetkilendiremezsiniz.", - "Volo.Abp.Identity:010021" : "{0} isminde bir birim zaten var.", + "Volo.Abp.Identity:010021": "{0} isminde bir birim zaten var.", + "Volo.Abp.Identity:010022": "Bir statik izin tipi değiştirilemez.", + "Volo.Abp.Identity:010023": "Bir statik izin tipi silinemez.", "Identity.OrganizationUnit.MaxUserMembershipCount": "Bir kullanıcı iƧin izin verilen en fazla organizasyon birimi sayısı", "ThisUserIsNotActiveMessage": "Bu kullanıcı aktif değil.", "Permission:IdentityManagement": "Kimlik yƶnetimi", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/vi.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/vi.json index 231b00db46..39f9940090 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/vi.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/vi.json @@ -77,6 +77,8 @@ "Volo.Abp.Identity:010008": "KhĆ“ng được phĆ©p thay đổi cĆ i đặt hai yįŗæu tố.", "Volo.Abp.Identity:010009": "Bįŗ”n khĆ“ng thể į»§y quyền cho chĆ­nh mƬnh.", "Volo.Abp.Identity:010021": "TĆŖn '{0}' đã tồn tįŗ”i.", + "Volo.Abp.Identity:010022": "KhĆ“ng thể thay đổi kiểu cį»§a phĆ”t biểu tÄ©nh.", + "Volo.Abp.Identity:010023": "KhĆ“ng thể xóa phĆ”t biểu tÄ©nh.", "Identity.OrganizationUnit.MaxUserMembershipCount": "Số lượng thĆ nh viĆŖn đʔn vị tổ chức tối đa được phĆ©p cho mį»™t ngĘ°į»i dùng", "ThisUserIsNotActiveMessage": "NgĘ°į»i dùng nĆ y khĆ“ng hoįŗ”t động.", "Permission:IdentityManagement": "Quįŗ£n lý danh tĆ­nh", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/zh-Hans.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/zh-Hans.json index 4ae5130994..cfbe6bd279 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/zh-Hans.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/zh-Hans.json @@ -77,6 +77,8 @@ "Volo.Abp.Identity:010008": "äøå…č®øäæ®ę”¹åŒå› ē“ čŗ«ä»½éŖŒčÆč®¾ē½®ć€‚", "Volo.Abp.Identity:010009": "ä½ äøčƒ½å§”ę‰˜ē»™č‡Ŗå·±ć€‚", "Volo.Abp.Identity:010021": "åē§°ļ¼š'{0}' 已存在", + "Volo.Abp.Identity:010022": "äøčƒ½ę›“ę”¹é™ę€å£°ę˜Žēš„ē±»åž‹ć€‚", + "Volo.Abp.Identity:010023": "äøčƒ½åˆ é™¤é™ę€å£°ę˜Žēš„ē±»åž‹ć€‚", "Identity.OrganizationUnit.MaxUserMembershipCount": "ē»„ē»‡å•ä½ęœ€å¤§å…č®øēš„ęˆå‘˜čµ„ę ¼č®”ę•°", "ThisUserIsNotActiveMessage": "čÆ„ē”Øęˆ·äøåÆē”Øć€‚", "Permission:IdentityManagement": "身份标识箔理", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/zh-Hant.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/zh-Hant.json index 0666df264d..b3899de248 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/zh-Hant.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/zh-Hant.json @@ -76,7 +76,9 @@ "Volo.Abp.Identity:010007": "ä½ äøčƒ½äæ®ę”¹ä½ ēš„é›™å› ē“ čŗ«ä»½é©—č­‰čØ­ē½®", "Volo.Abp.Identity:010008": "äøå…čØ±äæ®ę”¹é›™å› ē“ čŗ«ä»½é©—č­‰čØ­ē½®.", "Volo.Abp.Identity:010009": "ä½ äøčƒ½å§”ę“¾ēµ¦č‡Ŗå·±", - "Volo.Abp.Identity:010021" : "åēØ± '{0}' 已存在.", + "Volo.Abp.Identity:010021": "åēØ± '{0}' 已存在.", + "Volo.Abp.Identity:010022": "ē„”ę³•ę›“ę”¹éœę…‹å®£å‘Šēš„é”žåž‹.", + "Volo.Abp.Identity:010023": "ē„”ę³•åˆŖé™¤éœę…‹å®£å‘Šēš„é”žåž‹.", "Identity.OrganizationUnit.MaxUserMembershipCount": "å…čØ±äø€å€‹ä½æē”Øč€…č‡³å¤šåÆéšøå±¬åœØå¹¾å€‹ēµ„ē¹”å–®ä½", "ThisUserIsNotActiveMessage": "č©²ē”Øęˆ¶äøåÆē”Ø.", "Permission:IdentityManagement": "čŗ«ä»½č­˜åˆ„ē®”ē†", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityClaimTypeManager.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityClaimTypeManager.cs index bc8ab16d9f..f821f81d35 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityClaimTypeManager.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityClaimTypeManager.cs @@ -35,12 +35,12 @@ public class IdentityClaimTypeManager : DomainService { if (await IdentityClaimTypeRepository.AnyAsync(claimType.Name, claimType.Id)) { - throw new AbpException($"Name Exist: {claimType.Name}"); + throw new BusinessException(IdentityErrorCodes.ClaimNameExist).WithData("0", claimType.Name); } if (claimType.IsStatic) { - throw new AbpException($"Can not update a static ClaimType."); + throw new BusinessException(IdentityErrorCodes.CanNotUpdateStaticClaimType); } return await IdentityClaimTypeRepository.UpdateAsync(claimType); @@ -51,7 +51,7 @@ public class IdentityClaimTypeManager : DomainService var claimType = await IdentityClaimTypeRepository.GetAsync(id); if (claimType.IsStatic) { - throw new AbpException($"Can not delete a static ClaimType."); + throw new BusinessException(IdentityErrorCodes.CanNotDeleteStaticClaimType); } //Remove claim of this type from all users and roles diff --git a/modules/identity/src/Volo.Abp.Identity.Installer/InstallationNotes.md b/modules/identity/src/Volo.Abp.Identity.Installer/InstallationNotes.md new file mode 100644 index 0000000000..09950e5bdb --- /dev/null +++ b/modules/identity/src/Volo.Abp.Identity.Installer/InstallationNotes.md @@ -0,0 +1,9 @@ +# Installation Notes for Identity Module + +The ABP Identity module provides user and role management functionality for your ABP-based applications. It is built on Microsoft's Identity library and extends it with additional features like organization units and claims management. + +This module is part of the ABP Framework and provides the core identity management capabilities needed by most business applications. + +## Documentation + +For detailed information and usage instructions, please visit the [Identity module documentation](https://abp.io/docs/latest/modules/identity). diff --git a/modules/identity/src/Volo.Abp.PermissionManagement.Domain.Identity/Volo/Abp/PermissionManagement/Identity/RolePermissionManagementProvider.cs b/modules/identity/src/Volo.Abp.PermissionManagement.Domain.Identity/Volo/Abp/PermissionManagement/Identity/RolePermissionManagementProvider.cs index b51110204a..e97d524cd7 100644 --- a/modules/identity/src/Volo.Abp.PermissionManagement.Domain.Identity/Volo/Abp/PermissionManagement/Identity/RolePermissionManagementProvider.cs +++ b/modules/identity/src/Volo.Abp.PermissionManagement.Domain.Identity/Volo/Abp/PermissionManagement/Identity/RolePermissionManagementProvider.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Volo.Abp.Authorization.Permissions; +using Volo.Abp.Domain.Repositories; using Volo.Abp.Guids; using Volo.Abp.Identity; using Volo.Abp.MultiTenancy; @@ -37,41 +38,44 @@ public class RolePermissionManagementProvider : PermissionManagementProvider public async override Task CheckAsync(string[] names, string providerName, string providerKey) { - var multiplePermissionValueProviderGrantInfo = new MultiplePermissionValueProviderGrantInfo(names); - var permissionGrants = new List(); - - if (providerName == Name) + using (PermissionGrantRepository.DisableTracking()) { - permissionGrants.AddRange(await PermissionGrantRepository.GetListAsync(names, providerName, providerKey)); + var multiplePermissionValueProviderGrantInfo = new MultiplePermissionValueProviderGrantInfo(names); + var permissionGrants = new List(); - } + if (providerName == Name) + { + permissionGrants.AddRange(await PermissionGrantRepository.GetListAsync(names, providerName, providerKey)); - if (providerName == UserPermissionValueProvider.ProviderName) - { - var userId = Guid.Parse(providerKey); - var roleNames = await UserRoleFinder.GetRoleNamesAsync(userId); + } - foreach (var roleName in roleNames) + if (providerName == UserPermissionValueProvider.ProviderName) { - permissionGrants.AddRange(await PermissionGrantRepository.GetListAsync(names, Name, roleName)); + var userId = Guid.Parse(providerKey); + var roleNames = await UserRoleFinder.GetRoleNamesAsync(userId); + + foreach (var roleName in roleNames) + { + permissionGrants.AddRange(await PermissionGrantRepository.GetListAsync(names, Name, roleName)); + } } - } - permissionGrants = permissionGrants.Distinct().ToList(); - if (!permissionGrants.Any()) - { - return multiplePermissionValueProviderGrantInfo; - } + permissionGrants = permissionGrants.Distinct().ToList(); + if (!permissionGrants.Any()) + { + return multiplePermissionValueProviderGrantInfo; + } - foreach (var permissionName in names) - { - var permissionGrant = permissionGrants.FirstOrDefault(x => x.Name == permissionName); - if (permissionGrant != null) + foreach (var permissionName in names) { - multiplePermissionValueProviderGrantInfo.Result[permissionName] = new PermissionValueProviderGrantInfo(true, permissionGrant.ProviderKey); + var permissionGrant = permissionGrants.FirstOrDefault(x => x.Name == permissionName); + if (permissionGrant != null) + { + multiplePermissionValueProviderGrantInfo.Result[permissionName] = new PermissionValueProviderGrantInfo(true, permissionGrant.ProviderKey); + } } - } - return multiplePermissionValueProviderGrantInfo; + return multiplePermissionValueProviderGrantInfo; + } } } diff --git a/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/IdentityClaimTypeManager_Tests.cs b/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/IdentityClaimTypeManager_Tests.cs index 9078040910..04f4cc6eaa 100644 --- a/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/IdentityClaimTypeManager_Tests.cs +++ b/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/IdentityClaimTypeManager_Tests.cs @@ -53,7 +53,7 @@ public class IdentityClaimTypeManager_Tests : AbpIdentityDomainTestBase [Fact] public async Task Update_Name_Exist_Should_Exception() { - await Assert.ThrowsAnyAsync(async () => await _claimTypeManager.UpdateAsync( + await Assert.ThrowsAnyAsync(async () => await _claimTypeManager.UpdateAsync( new IdentityClaimType( Guid.NewGuid(), "Age"))); } @@ -65,6 +65,6 @@ public class IdentityClaimTypeManager_Tests : AbpIdentityDomainTestBase var phoneClaim = new IdentityClaimType(Guid.NewGuid(), "Phone", true, true); await _identityClaimTypeRepository.InsertAsync(phoneClaim); - await Assert.ThrowsAnyAsync(async () => await _claimTypeManager.UpdateAsync(phoneClaim)); + await Assert.ThrowsAnyAsync(async () => await _claimTypeManager.UpdateAsync(phoneClaim)); } } diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Installer/InstallationNotes.md b/modules/identityserver/src/Volo.Abp.IdentityServer.Installer/InstallationNotes.md new file mode 100644 index 0000000000..291c4f84b1 --- /dev/null +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Installer/InstallationNotes.md @@ -0,0 +1,9 @@ +# Installation Notes for Identity Server Module + +IdentityServer module provides a full integration with the [IdentityServer4](https://github.com/DuendeArchive/IdentityServer4) (IDS) framework, which provides advanced authentication features like single sign-on and API access control. This module persists clients, resources and other IDS-related objects to database. This module is replaced by [OpenIddict](https://abp.io/docs/latest/modules/openiddict) module after ABP v6.0 in the startup templates. + +> Note: You can not use IdentityServer and OpenIddict modules together. They are separate OpenID provider libraries for the same job. + +## Documentation + +For detailed information and usage instructions, please visit the [Identity Server Module documentation](https://abp.io/docs/latest/modules/identity-server). \ No newline at end of file diff --git a/modules/openiddict/app/OpenIddict.Demo.Server/ExtensionGrants/MyTokenExtensionGrant.cs b/modules/openiddict/app/OpenIddict.Demo.Server/ExtensionGrants/MyTokenExtensionGrant.cs index b5167621ef..12e587b65b 100644 --- a/modules/openiddict/app/OpenIddict.Demo.Server/ExtensionGrants/MyTokenExtensionGrant.cs +++ b/modules/openiddict/app/OpenIddict.Demo.Server/ExtensionGrants/MyTokenExtensionGrant.cs @@ -19,7 +19,17 @@ public class MyTokenExtensionGrant : ITokenExtensionGrant public const string ExtensionGrantName = "MyTokenExtensionGrant"; public string Name => ExtensionGrantName; + public async Task HandleAsync(ExtensionGrantContext context) + { + // You can get a new token using any of the following methods based on your business. + // They are just examples. You can implement your own logic here. + + return await HandleUserAccessTokenAsync(context); + return await HandleUserApiKeyAsync(context); + } + + public async Task HandleUserAccessTokenAsync(ExtensionGrantContext context) { var userToken = context.Request.GetParameter("token").ToString(); @@ -33,6 +43,9 @@ public class MyTokenExtensionGrant : ITokenExtensionGrant }!)); } + // We will validate the user token + // The Token is issued by the OpenIddict server, So we can validate it using the introspection endpoint + var transaction = await context.HttpContext.RequestServices.GetRequiredService().CreateTransactionAsync(); transaction.EndpointType = OpenIddictServerEndpointType.Introspection; transaction.Request = new OpenIddictRequest @@ -71,17 +84,92 @@ public class MyTokenExtensionGrant : ITokenExtensionGrant })); } + // We have validated the user token and got the user id + var userId = principal.FindUserId(); var userManager = context.HttpContext.RequestServices.GetRequiredService(); var user = await userManager.GetByIdAsync(userId.Value); var userClaimsPrincipalFactory = context.HttpContext.RequestServices.GetRequiredService>(); var claimsPrincipal = await userClaimsPrincipalFactory.CreateAsync(user); - claimsPrincipal.SetScopes(principal.GetScopes()); - claimsPrincipal.SetResources(await GetResourcesAsync(context, principal.GetScopes())); + + // Prepare the scopes + var scopes = GetScopes(context); + + claimsPrincipal.SetScopes(scopes); + claimsPrincipal.SetResources(await GetResourcesAsync(context, scopes)); await context.HttpContext.RequestServices.GetRequiredService().HandleAsync(context.Request, principal); return new SignInResult(OpenIddictServerAspNetCoreDefaults.AuthenticationScheme, claimsPrincipal); } + + protected async Task HandleUserApiKeyAsync(ExtensionGrantContext context) + { + var userApiKey = context.Request.GetParameter("user_api_key").ToString(); + + if (string.IsNullOrEmpty(userApiKey)) + { + return new ForbidResult( + new[] {OpenIddictServerAspNetCoreDefaults.AuthenticationScheme}, + properties: new AuthenticationProperties(new Dictionary + { + [OpenIddictServerAspNetCoreConstants.Properties.Error] = OpenIddictConstants.Errors.InvalidRequest + }!)); + } + + // Here we can validate the user API key and get the user id + if (false) // Add your own logic here + { + // If the user API key is invalid + return new ForbidResult( + new[] {OpenIddictServerAspNetCoreDefaults.AuthenticationScheme}, + properties: new AuthenticationProperties(new Dictionary + { + [OpenIddictServerAspNetCoreConstants.Properties.Error] = OpenIddictConstants.Errors.InvalidRequest + }!)); + } + + // Add your own logic to get the user by API key + var userManager = context.HttpContext.RequestServices.GetRequiredService(); + var user = await userManager.FindByNameAsync("admin"); + if (user == null) + { + return new ForbidResult( + new[] {OpenIddictServerAspNetCoreDefaults.AuthenticationScheme}, + properties: new AuthenticationProperties(new Dictionary + { + [OpenIddictServerAspNetCoreConstants.Properties.Error] = OpenIddictConstants.Errors.InvalidRequest + }!)); + } + + // Create a principal for the user + var userClaimsPrincipalFactory = context.HttpContext.RequestServices.GetRequiredService>(); + var claimsPrincipal = await userClaimsPrincipalFactory.CreateAsync(user); + + // Prepare the scopes + var scopes = GetScopes(context); + + claimsPrincipal.SetScopes(scopes); + claimsPrincipal.SetResources(await GetResourcesAsync(context, scopes)); + await context.HttpContext.RequestServices.GetRequiredService().HandleAsync(context.Request, claimsPrincipal); + return new SignInResult(OpenIddictServerAspNetCoreDefaults.AuthenticationScheme, claimsPrincipal); + } + + protected ImmutableArray GetScopes(ExtensionGrantContext context) + { + // Prepare the scopes + // The scopes must be defined in the OpenIddict server + + // If you want to get the scopes from the request, you have to add `scope` parameter in the request + // scope: AbpAPI profile roles email phone offline_access + + //var scopes = context.Request.GetScopes(); + + // If you want to set the scopes here, you can use the following code + var scopes = new[] { "AbpAPI", "profile", "roles", "email", "phone", "offline_access" }.ToImmutableArray(); + + return scopes; + } + private async Task> GetResourcesAsync(ExtensionGrantContext context, ImmutableArray scopes) { var resources = new List(); diff --git a/modules/openiddict/app/OpenIddict.Demo.Server/package.json b/modules/openiddict/app/OpenIddict.Demo.Server/package.json index c1fce23f85..ef17244517 100644 --- a/modules/openiddict/app/OpenIddict.Demo.Server/package.json +++ b/modules/openiddict/app/OpenIddict.Demo.Server/package.json @@ -3,6 +3,6 @@ "name": "my-app", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "~9.1.0-rc.3" + "@abp/aspnetcore.mvc.ui.theme.basic": "~9.1.0" } } diff --git a/modules/openiddict/app/angular/package.json b/modules/openiddict/app/angular/package.json index 6adab71d23..d855362e83 100644 --- a/modules/openiddict/app/angular/package.json +++ b/modules/openiddict/app/angular/package.json @@ -12,15 +12,15 @@ }, "private": true, "dependencies": { - "@abp/ng.account": "~9.1.0-rc.3", - "@abp/ng.components": "~9.1.0-rc.3", - "@abp/ng.core": "~9.1.0-rc.3", - "@abp/ng.oauth": "~9.1.0-rc.3", - "@abp/ng.identity": "~9.1.0-rc.3", - "@abp/ng.setting-management": "~9.1.0-rc.3", - "@abp/ng.tenant-management": "~9.1.0-rc.3", - "@abp/ng.theme.shared": "~9.1.0-rc.3", - "@abp/ng.theme.lepton-x": "~4.1.0-rc.3", + "@abp/ng.account": "~9.1.0", + "@abp/ng.components": "~9.1.0", + "@abp/ng.core": "~9.1.0", + "@abp/ng.oauth": "~9.1.0", + "@abp/ng.identity": "~9.1.0", + "@abp/ng.setting-management": "~9.1.0", + "@abp/ng.tenant-management": "~9.1.0", + "@abp/ng.theme.shared": "~9.1.0", + "@abp/ng.theme.lepton-x": "~4.1.0", "@angular/animations": "^15.0.1", "@angular/common": "^15.0.1", "@angular/compiler": "^15.0.1", @@ -36,7 +36,7 @@ "zone.js": "~0.11.4" }, "devDependencies": { - "@abp/ng.schematics": "~9.1.0-rc.3", + "@abp/ng.schematics": "~9.1.0", "@angular-devkit/build-angular": "^15.0.1", "@angular-eslint/builder": "~15.1.0", "@angular-eslint/eslint-plugin": "~15.1.0", diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/AbpOpenIddictOptions.cs b/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/AbpOpenIddictOptions.cs index 84149e9b0b..3339b6d376 100644 --- a/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/AbpOpenIddictOptions.cs +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/AbpOpenIddictOptions.cs @@ -20,4 +20,9 @@ public class AbpOpenIddictAspNetCoreOptions /// Attach auth server current culture info to response. ///
    public bool AttachCultureInfo { get; set; } = true; + + /// + /// Set the url of the select account page. + /// + public string SelectAccountPage { get; set; } = "~/Account/SelectAccount"; } diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/Controllers/AuthorizeController.cs b/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/Controllers/AuthorizeController.cs index f61d6fde45..b575a03c0e 100644 --- a/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/Controllers/AuthorizeController.cs +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/Controllers/AuthorizeController.cs @@ -2,12 +2,15 @@ using System.Collections.Generic; using System.Linq; using System.Security.Claims; +using System.Text.Encodings.Web; using System.Threading.Tasks; using Microsoft.AspNetCore.Authentication; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Options; using Microsoft.Extensions.Primitives; using OpenIddict.Abstractions; using OpenIddict.Server.AspNetCore; @@ -50,6 +53,24 @@ public class AuthorizeController : AbpOpenIdDictControllerBase }); } + // If prompt=select_account was specified by the client application, + // We will redirect the user to the select_account page. + if (request.HasPromptValue(OpenIddictConstants.PromptValues.SelectAccount)) + { + // To avoid endless login -> authorization redirects, the prompt=login flag + // is removed from the authorization request payload before redirecting the user. + var prompt = string.Join(" ", request.GetPromptValues().Remove(OpenIddictConstants.PromptValues.SelectAccount)); + + var parameters = Request.HasFormContentType ? + Request.Form.Where(parameter => parameter.Key != OpenIddictConstants.Parameters.Prompt).ToList() : + Request.Query.Where(parameter => parameter.Key != OpenIddictConstants.Parameters.Prompt).ToList(); + + parameters.Add(KeyValuePair.Create(OpenIddictConstants.Parameters.Prompt, new StringValues(prompt))); + + var selectAccountPath = HttpContext.RequestServices.GetRequiredService>().Value.SelectAccountPage; + return Redirect(Url.Content($"{selectAccountPath}?RedirectUri={UrlEncoder.Default.Encode(Request.PathBase + Request.Path + QueryString.Create(parameters))}")); + } + // Retrieve the user principal stored in the authentication cookie. // If a max_age parameter was provided, ensure that the cookie is not too old. // If the user principal can't be extracted or the cookie is too old, redirect the user to the login page. diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/Applications/AbpOpenIddictApplicationStore.cs b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/Applications/AbpOpenIddictApplicationStore.cs index 31c49807e2..416d90b3b7 100644 --- a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/Applications/AbpOpenIddictApplicationStore.cs +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/Applications/AbpOpenIddictApplicationStore.cs @@ -51,8 +51,6 @@ public class AbpOpenIddictApplicationStore : AbpOpenIddictStoreBase GetClientUriAsync(OpenIddictApplicationModel application, CancellationToken cancellationToken = default) diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/Authorizations/AbpOpenIddictAuthorizationStore.cs b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/Authorizations/AbpOpenIddictAuthorizationStore.cs index 61944f7338..eb9172667d 100644 --- a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/Authorizations/AbpOpenIddictAuthorizationStore.cs +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/Authorizations/AbpOpenIddictAuthorizationStore.cs @@ -53,8 +53,6 @@ public class AbpOpenIddictAuthorizationStore : AbpOpenIddictStoreBase(); options.AddRepository(); }); + + Configure(options => + { + options.IgnoredNavigationEntitySelectors.Add("DisableOpenIddictApplication", type => type == typeof(OpenIddictApplication)); + }); } } diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.Installer/InstallationNotes.md b/modules/openiddict/src/Volo.Abp.OpenIddict.Installer/InstallationNotes.md new file mode 100644 index 0000000000..a694798f5d --- /dev/null +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.Installer/InstallationNotes.md @@ -0,0 +1,16 @@ +# Installation Notes for OpenIddict Module + +The OpenIddict module is an authentication module for the ABP Framework that provides OAuth 2.0 and OpenID Connect server capabilities. It is built on the OpenIddict library and provides a complete solution for implementing authentication and authorization in your ABP applications. + +Key features of the OpenIddict module: +- OAuth 2.0 and OpenID Connect server implementation +- Token generation and validation +- Authorization code, implicit, client credentials, and resource owner password flows +- JWT and reference token support +- Client application management +- Scope management +- Integration with ABP's permission system + +## Documentation + +For detailed information and usage instructions, please visit the [OpenIddict Module documentation](https://abp.io/docs/latest/Modules/OpenIddict). \ No newline at end of file diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Application/Volo/Abp/PermissionManagement/PermissionAppService.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.Application/Volo/Abp/PermissionManagement/PermissionAppService.cs index ef056918c8..aa9bfe0029 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Application/Volo/Abp/PermissionManagement/PermissionAppService.cs +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Application/Volo/Abp/PermissionManagement/PermissionAppService.cs @@ -43,25 +43,24 @@ public class PermissionAppService : ApplicationService, IPermissionAppService }; var multiTenancySide = CurrentTenant.GetMultiTenancySide(); + var permissionGroups = new List(); foreach (var group in await PermissionDefinitionManager.GetGroupsAsync()) { var groupDto = CreatePermissionGroupDto(group); - - var neededCheckPermissions = new List(); - var permissions = group.GetPermissionsWithChildren() .Where(x => x.IsEnabled) .Where(x => !x.Providers.Any() || x.Providers.Contains(providerName)) .Where(x => x.MultiTenancySide.HasFlag(multiTenancySide)); - + + var neededCheckPermissions = new List(); foreach (var permission in permissions) { - if(permission.Parent != null && !neededCheckPermissions.Contains(permission.Parent)) + if (permission.Parent != null && !neededCheckPermissions.Contains(permission.Parent)) { continue; } - + if (await SimpleStateCheckerManager.IsEnabledAsync(permission)) { neededCheckPermissions.Add(permission); @@ -73,42 +72,46 @@ public class PermissionAppService : ApplicationService, IPermissionAppService continue; } - var grantInfoDtos = neededCheckPermissions - .Select(CreatePermissionGrantInfoDto) - .ToList(); + groupDto.Permissions.AddRange(neededCheckPermissions.Select(CreatePermissionGrantInfoDto)); + permissionGroups.Add(groupDto); + } - var multipleGrantInfo = await PermissionManager.GetAsync(neededCheckPermissions.Select(x => x.Name).ToArray(), providerName, providerKey); + var multipleGrantInfo = await PermissionManager.GetAsync( + permissionGroups.SelectMany(group => group.Permissions).Select(permission => permission.Name).ToArray(), + providerName, + providerKey); - foreach (var grantInfo in multipleGrantInfo.Result) + foreach (var permissionGroup in permissionGroups) + { + foreach (var permission in permissionGroup.Permissions) { - var grantInfoDto = grantInfoDtos.First(x => x.Name == grantInfo.Name); - - grantInfoDto.IsGranted = grantInfo.IsGranted; - - foreach (var provider in grantInfo.Providers) + var grantInfo = multipleGrantInfo.Result.FirstOrDefault(x => x.Name == permission.Name); + if (grantInfo == null) { - grantInfoDto.GrantedProviders.Add(new ProviderInfoDto - { - ProviderName = provider.Name, - ProviderKey = provider.Key, - }); + continue; } - groupDto.Permissions.Add(grantInfoDto); + permission.IsGranted = grantInfo.IsGranted; + permission.GrantedProviders = grantInfo.Providers.Select(x => new ProviderInfoDto + { + ProviderName = x.Name, + ProviderKey = x.Key, + }).ToList(); } - if (groupDto.Permissions.Any()) + if (permissionGroup.Permissions.Any()) { - result.Groups.Add(groupDto); + result.Groups.Add(permissionGroup); } } return result; } - private PermissionGrantInfoDto CreatePermissionGrantInfoDto(PermissionDefinition permission) + protected virtual PermissionGrantInfoDto CreatePermissionGrantInfoDto(PermissionDefinition permission) { - return new PermissionGrantInfoDto { + return new PermissionGrantInfoDto + { Name = permission.Name, DisplayName = permission.DisplayName?.Localize(StringLocalizerFactory), ParentName = permission.Parent?.Name, @@ -117,10 +120,10 @@ public class PermissionAppService : ApplicationService, IPermissionAppService }; } - private PermissionGroupDto CreatePermissionGroupDto(PermissionGroupDefinition group) + protected virtual PermissionGroupDto CreatePermissionGroupDto(PermissionGroupDefinition group) { var localizableDisplayName = group.DisplayName as LocalizableString; - + return new PermissionGroupDto { Name = group.Name, diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Blazor/Components/PermissionManagementModal.razor b/modules/permission-management/src/Volo.Abp.PermissionManagement.Blazor/Components/PermissionManagementModal.razor index fc9884bf4e..87c2c0db91 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Blazor/Components/PermissionManagementModal.razor +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Blazor/Components/PermissionManagementModal.razor @@ -5,7 +5,7 @@ @L["Permissions"] - @_entityDisplayName - + @@ -36,62 +36,65 @@ @if (_groups != null && _groups.Any()) { - - - @foreach (var group in _groups) - { - - @if (group.Permissions.Any(x => x.IsGranted)) - { - +
    + + + @foreach (var group in _groups) + { + + @if (group.Permissions.Any(x => x.IsGranted)) + { + @group.DisplayName ( @(group.Permissions.Count(x => x.IsGranted)) ) - } - else - { - + } + else + { + @group.DisplayName ( @(group.Permissions.Count(x => x.IsGranted)) ) - } - - } - - - @foreach (var group in _groups) - { - - - - - @L["SelectAllInThisTab"] - - + } + + } + + + @foreach (var group in _groups) + { + +
    + + + @L["SelectAllInThisTab"] + + - - - @foreach (var permission in group.Permissions) - { - - - @GetShownName(permission) - - - } - - - } - - + + + @foreach (var permission in group.Permissions) + { + + + @GetShownName(permission) + + + } +
    +
    + } +
    +
    +
    + } diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Blazor/Components/PermissionManagementModal.razor.css b/modules/permission-management/src/Volo.Abp.PermissionManagement.Blazor/Components/PermissionManagementModal.razor.css index 6c827bec4a..f6870a7a16 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Blazor/Components/PermissionManagementModal.razor.css +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Blazor/Components/PermissionManagementModal.razor.css @@ -3,29 +3,29 @@ fieldset legend { width: auto; } -.lpx-scroll-pills-container ul { +::deep .lpx-scroll-pills-container ul { display: block; max-height: 500px; overflow-y: auto; } -.lpx-scroll-pills-container .tab-content { +::deep .lpx-scroll-pills-container .tab-content { padding-top: 0 !important; padding-bottom: 0 !important; } -.lpx-scroll-pills-container ul li { +::deep .lpx-scroll-pills-container ul li { border: 1px solid #e8eef3; margin-bottom: 10px; border-radius: 10px; } -.lpx-scroll-pills-container ul li a.active { +::deep .lpx-scroll-pills-container ul li a.active { color: #fff !important; border-color: #6c5dd3 !important; background-color: #6c5dd3 !important; } -.lpx-theme-dark .lpx-scroll-pills-container ul li { +::deep .lpx-theme-dark .lpx-scroll-pills-container ul li { border: 1px solid #23262a; } \ No newline at end of file diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionDataSeeder.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionDataSeeder.cs index 1e8a4aab7b..de2b824412 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionDataSeeder.cs +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionDataSeeder.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Volo.Abp.DependencyInjection; +using Volo.Abp.Domain.Repositories; using Volo.Abp.Guids; using Volo.Abp.MultiTenancy; @@ -33,14 +34,17 @@ public class PermissionDataSeeder : IPermissionDataSeeder, ITransientDependency { using (CurrentTenant.Change(tenantId)) { - var names = grantedPermissions.ToArray(); - var existsPermissionGrants = (await PermissionGrantRepository.GetListAsync(names, providerName, providerKey)).Select(x => x.Name).ToList(); - var permissions = names.Except(existsPermissionGrants).Select(permissionName => new PermissionGrant(GuidGenerator.Create(), permissionName, providerName, providerKey, tenantId)).ToList(); - if (!permissions.Any()) + using (PermissionGrantRepository.DisableTracking()) { - return; + var names = grantedPermissions.ToArray(); + var existsPermissionGrants = (await PermissionGrantRepository.GetListAsync(names, providerName, providerKey)).Select(x => x.Name).ToList(); + var permissions = names.Except(existsPermissionGrants).Select(permissionName => new PermissionGrant(GuidGenerator.Create(), permissionName, providerName, providerKey, tenantId)).ToList(); + if (!permissions.Any()) + { + return; + } + await PermissionGrantRepository.InsertManyAsync(permissions); } - await PermissionGrantRepository.InsertManyAsync(permissions); } } } diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionManagementProvider.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionManagementProvider.cs index 0a80ed53e5..b6dfc2e518 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionManagementProvider.cs +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionManagementProvider.cs @@ -1,5 +1,6 @@ using System.Linq; using System.Threading.Tasks; +using Volo.Abp.Domain.Repositories; using Volo.Abp.Guids; using Volo.Abp.MultiTenancy; @@ -34,21 +35,24 @@ public abstract class PermissionManagementProvider : IPermissionManagementProvid public virtual async Task CheckAsync(string[] names, string providerName, string providerKey) { - var multiplePermissionValueProviderGrantInfo = new MultiplePermissionValueProviderGrantInfo(names); - if (providerName != Name) + using (PermissionGrantRepository.DisableTracking()) { - return multiplePermissionValueProviderGrantInfo; - } + var multiplePermissionValueProviderGrantInfo = new MultiplePermissionValueProviderGrantInfo(names); + if (providerName != Name) + { + return multiplePermissionValueProviderGrantInfo; + } - var permissionGrants = await PermissionGrantRepository.GetListAsync(names, providerName, providerKey); + var permissionGrants = await PermissionGrantRepository.GetListAsync(names, providerName, providerKey); - foreach (var permissionName in names) - { - var isGrant = permissionGrants.Any(x => x.Name == permissionName); - multiplePermissionValueProviderGrantInfo.Result[permissionName] = new PermissionValueProviderGrantInfo(isGrant, providerKey); - } + foreach (var permissionName in names) + { + var isGrant = permissionGrants.Any(x => x.Name == permissionName); + multiplePermissionValueProviderGrantInfo.Result[permissionName] = new PermissionValueProviderGrantInfo(isGrant, providerKey); + } - return multiplePermissionValueProviderGrantInfo; + return multiplePermissionValueProviderGrantInfo; + } } public virtual Task SetAsync(string name, string providerKey, bool isGranted) diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionStore.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionStore.cs index 6eed394a31..85ffd77924 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionStore.cs +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionStore.cs @@ -6,6 +6,7 @@ using Microsoft.Extensions.Logging.Abstractions; using Volo.Abp.Authorization.Permissions; using Volo.Abp.Caching; using Volo.Abp.DependencyInjection; +using Volo.Abp.Domain.Repositories; namespace Volo.Abp.PermissionManagement; @@ -67,36 +68,39 @@ public class PermissionStore : IPermissionStore, ITransientDependency string currentName, PermissionGrantCacheItem currentCacheItem) { - var permissions = await PermissionDefinitionManager.GetPermissionsAsync(); + using (PermissionGrantRepository.DisableTracking()) + { + var permissions = await PermissionDefinitionManager.GetPermissionsAsync(); - Logger.LogDebug($"Getting all granted permissions from the repository for this provider name,key: {providerName},{providerKey}"); + Logger.LogDebug($"Getting all granted permissions from the repository for this provider name,key: {providerName},{providerKey}"); - var grantedPermissionsHashSet = new HashSet( - (await PermissionGrantRepository.GetListAsync(providerName, providerKey)).Select(p => p.Name) - ); + var grantedPermissionsHashSet = new HashSet( + (await PermissionGrantRepository.GetListAsync(providerName, providerKey)).Select(p => p.Name) + ); - Logger.LogDebug($"Setting the cache items. Count: {permissions.Count}"); + Logger.LogDebug($"Setting the cache items. Count: {permissions.Count}"); - var cacheItems = new List>(); + var cacheItems = new List>(); - foreach (var permission in permissions) - { - var isGranted = grantedPermissionsHashSet.Contains(permission.Name); + foreach (var permission in permissions) + { + var isGranted = grantedPermissionsHashSet.Contains(permission.Name); - cacheItems.Add(new KeyValuePair( - CalculateCacheKey(permission.Name, providerName, providerKey), - new PermissionGrantCacheItem(isGranted)) - ); + cacheItems.Add(new KeyValuePair( + CalculateCacheKey(permission.Name, providerName, providerKey), + new PermissionGrantCacheItem(isGranted)) + ); - if (permission.Name == currentName) - { - currentCacheItem.IsGranted = isGranted; + if (permission.Name == currentName) + { + currentCacheItem.IsGranted = isGranted; + } } - } - await Cache.SetManyAsync(cacheItems); + await Cache.SetManyAsync(cacheItems); - Logger.LogDebug($"Finished setting the cache items. Count: {permissions.Count}"); + Logger.LogDebug($"Finished setting the cache items. Count: {permissions.Count}"); + } } public virtual async Task IsGrantedAsync(string[] names, string providerName, string providerKey) @@ -169,34 +173,37 @@ public class PermissionStore : IPermissionStore, ITransientDependency string providerKey, List notCacheKeys) { - var permissions = (await PermissionDefinitionManager.GetPermissionsAsync()) - .Where(x => notCacheKeys.Any(k => GetPermissionNameFormCacheKeyOrNull(k) == x.Name)).ToList(); + using (PermissionGrantRepository.DisableTracking()) + { + var permissions = (await PermissionDefinitionManager.GetPermissionsAsync()) + .Where(x => notCacheKeys.Any(k => GetPermissionNameFormCacheKeyOrNull(k) == x.Name)).ToList(); - Logger.LogDebug($"Getting not cache granted permissions from the repository for this provider name,key: {providerName},{providerKey}"); + Logger.LogDebug($"Getting not cache granted permissions from the repository for this provider name,key: {providerName},{providerKey}"); - var grantedPermissionsHashSet = new HashSet( - (await PermissionGrantRepository.GetListAsync(notCacheKeys.Select(GetPermissionNameFormCacheKeyOrNull).ToArray(), providerName, providerKey)).Select(p => p.Name) - ); + var grantedPermissionsHashSet = new HashSet( + (await PermissionGrantRepository.GetListAsync(notCacheKeys.Select(GetPermissionNameFormCacheKeyOrNull).ToArray(), providerName, providerKey)).Select(p => p.Name) + ); - Logger.LogDebug($"Setting the cache items. Count: {permissions.Count}"); + Logger.LogDebug($"Setting the cache items. Count: {permissions.Count}"); - var cacheItems = new List>(); + var cacheItems = new List>(); - foreach (var permission in permissions) - { - var isGranted = grantedPermissionsHashSet.Contains(permission.Name); + foreach (var permission in permissions) + { + var isGranted = grantedPermissionsHashSet.Contains(permission.Name); - cacheItems.Add(new KeyValuePair( - CalculateCacheKey(permission.Name, providerName, providerKey), - new PermissionGrantCacheItem(isGranted)) - ); - } + cacheItems.Add(new KeyValuePair( + CalculateCacheKey(permission.Name, providerName, providerKey), + new PermissionGrantCacheItem(isGranted)) + ); + } - await Cache.SetManyAsync(cacheItems); + await Cache.SetManyAsync(cacheItems); - Logger.LogDebug($"Finished setting the cache items. Count: {permissions.Count}"); + Logger.LogDebug($"Finished setting the cache items. Count: {permissions.Count}"); - return cacheItems; + return cacheItems; + } } protected virtual string CalculateCacheKey(string name, string providerName, string providerKey) diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Installer/InstallationNotes.md b/modules/permission-management/src/Volo.Abp.PermissionManagement.Installer/InstallationNotes.md new file mode 100644 index 0000000000..452dfc1a4c --- /dev/null +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Installer/InstallationNotes.md @@ -0,0 +1,9 @@ +# Installation Notes for Permission Management Module + +The ABP Permission Management module provides infrastructure to persist and manage permissions in your ABP-based applications. It allows you to grant permissions to users, roles, or other entities. + +This module is part of the ABP Framework and provides the core permission management functionality needed by most business applications. + +## Documentation + +For detailed information and usage instructions, please visit the [Permission Management module documentation](https://abp.io/docs/latest/modules/permission-management). \ No newline at end of file diff --git a/modules/setting-management/app/Volo.Abp.SettingManagement.DemoApp/package.json b/modules/setting-management/app/Volo.Abp.SettingManagement.DemoApp/package.json index 5736465af0..e60c436043 100644 --- a/modules/setting-management/app/Volo.Abp.SettingManagement.DemoApp/package.json +++ b/modules/setting-management/app/Volo.Abp.SettingManagement.DemoApp/package.json @@ -3,6 +3,6 @@ "name": "demo-app", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "~9.1.0-rc.3" + "@abp/aspnetcore.mvc.ui.theme.basic": "~9.1.0" } } diff --git a/modules/setting-management/app/Volo.Abp.SettingManagement.DemoApp/yarn.lock b/modules/setting-management/app/Volo.Abp.SettingManagement.DemoApp/yarn.lock index aa487218c9..38a43d8ed5 100644 --- a/modules/setting-management/app/Volo.Abp.SettingManagement.DemoApp/yarn.lock +++ b/modules/setting-management/app/Volo.Abp.SettingManagement.DemoApp/yarn.lock @@ -2,194 +2,194 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.basic@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-9.1.0-rc.3.tgz#c291f2760d32a9745c4b15a62c13abec9b7e247f" - integrity sha512-f14SIEfZkvSgYBfM/rcDmn0mgkIHGqi6lRP7GeBRUPEhB944osyCFmJH3CWDjJcjTFbqWTvKVlDRsV0Roz5eqg== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~9.1.0-rc.3" - -"@abp/aspnetcore.mvc.ui.theme.shared@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-9.1.0-rc.3.tgz#c05d8b39fc1ef2a9c890c480cb1ec8f47ee10669" - integrity sha512-BTLoVlaYjKrW0Rhrqw4tNiHf5LV8/zBxh90OM7smKYPGOftHhSWSNUUSO5upOdOsVhNSPIxY83PF/LHp29kH8g== - dependencies: - "@abp/aspnetcore.mvc.ui" "~9.1.0-rc.3" - "@abp/bootstrap" "~9.1.0-rc.3" - "@abp/bootstrap-datepicker" "~9.1.0-rc.3" - "@abp/bootstrap-daterangepicker" "~9.1.0-rc.3" - "@abp/datatables.net-bs5" "~9.1.0-rc.3" - "@abp/font-awesome" "~9.1.0-rc.3" - "@abp/jquery-form" "~9.1.0-rc.3" - "@abp/jquery-validation-unobtrusive" "~9.1.0-rc.3" - "@abp/lodash" "~9.1.0-rc.3" - "@abp/luxon" "~9.1.0-rc.3" - "@abp/malihu-custom-scrollbar-plugin" "~9.1.0-rc.3" - "@abp/moment" "~9.1.0-rc.3" - "@abp/select2" "~9.1.0-rc.3" - "@abp/sweetalert2" "~9.1.0-rc.3" - "@abp/timeago" "~9.1.0-rc.3" - "@abp/toastr" "~9.1.0-rc.3" - -"@abp/aspnetcore.mvc.ui@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-9.1.0-rc.3.tgz#88252e0fb822fe9560ed89d2118c7b32a32ba496" - integrity sha512-WGjWNoN97uxjMc173w36UV8UVGxLbDrOcglnqK+RY+E9vIxFGDmWBvwzmJ1KfZRvlwahXtMjTCiYFKO411lh1w== +"@abp/aspnetcore.mvc.ui.theme.basic@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-9.1.0.tgz#e9e0321037c34b43145dfc7827c422fbf79f59ab" + integrity sha512-vLkyrdFXw0/MPyU2hzqGJJk7trmIlVMdflNIe/rF77UIRmJYHWaTmPt9i5PLN/O4s0jnE9kWlaaJ/VnnFWeGsQ== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~9.1.0" + +"@abp/aspnetcore.mvc.ui.theme.shared@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-9.1.0.tgz#35a73580b9b67a33708f2cf897243b50c9ad7100" + integrity sha512-rggTYL9poOFICsOseDX22JNhD0KWH8Oxs0YH91TZjvm/F67cPemW99eBlJc/YdJ7bN6icRiebN8m81y9MSanyg== + dependencies: + "@abp/aspnetcore.mvc.ui" "~9.1.0" + "@abp/bootstrap" "~9.1.0" + "@abp/bootstrap-datepicker" "~9.1.0" + "@abp/bootstrap-daterangepicker" "~9.1.0" + "@abp/datatables.net-bs5" "~9.1.0" + "@abp/font-awesome" "~9.1.0" + "@abp/jquery-form" "~9.1.0" + "@abp/jquery-validation-unobtrusive" "~9.1.0" + "@abp/lodash" "~9.1.0" + "@abp/luxon" "~9.1.0" + "@abp/malihu-custom-scrollbar-plugin" "~9.1.0" + "@abp/moment" "~9.1.0" + "@abp/select2" "~9.1.0" + "@abp/sweetalert2" "~9.1.0" + "@abp/timeago" "~9.1.0" + "@abp/toastr" "~9.1.0" + +"@abp/aspnetcore.mvc.ui@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-9.1.0.tgz#38d058ab148a36ad4d63870e8a501ca339e4a70e" + integrity sha512-lUw1ij87KJp+Rj4cz8oSQkdRuoMq76l/wIAGwtXH+EOKusVpSJTOTioAV/tPKeKZ15ubE4bO5jWcQGxZkXgH3w== dependencies: ansi-colors "^4.1.3" -"@abp/bootstrap-datepicker@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-9.1.0-rc.3.tgz#8376fb204851b8e7be6fb5afe6e023f706426bc2" - integrity sha512-bKPeRpqzHlSCnItxesp+QnAewFcwuB1hmncRydhOg9ImvzRN0M9fAfSXeP7VTYH+2ygDKVEtK+8aAh1RjAryuA== +"@abp/bootstrap-datepicker@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-9.1.0.tgz#96a1875a2b92f03b8f90f7842ebf8849cf8a4d04" + integrity sha512-3FQm1SK8qmzoP7LOvXkZpq1AzrdPHKRdQJjoqK9N+lQxQjNfOxEFMxeDSg6WJKO619Cnve++jAyMidojXlCiwQ== dependencies: bootstrap-datepicker "^1.10.0" -"@abp/bootstrap-daterangepicker@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-9.1.0-rc.3.tgz#f14dd37eb7a4fe4d6cb823da1ee80dc28154d0df" - integrity sha512-C7KXx1630JK4mOrMZEQoiH4vzQZn6JfrS6k8nAX0p48zRNcx8oxwviaojRcu+MjDl/rDHc5U9Xy9lBIurqLEKg== +"@abp/bootstrap-daterangepicker@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-9.1.0.tgz#1993c539837eb31de174cba9f0bccd441a98f209" + integrity sha512-jS1jTqP6KCXQYX9xZpDAI07C94nwzXrNJD3H0pJXsXoOva3TTBQDD8khf6RDb7tiZrkrNJqmMyUiCfVTDbO7zg== dependencies: bootstrap-daterangepicker "^3.1.0" -"@abp/bootstrap@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-9.1.0-rc.3.tgz#01be98456635982e5b43a49318d0bcc55163fad7" - integrity sha512-Xi2TPaReFl3vnnFW974Cc4Sb25Iq+RwzkoGXiJFUiwGgYHbHHCd5Jd9Af6KYNchjP9SJKFYELwKZcQdxEIHauQ== +"@abp/bootstrap@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-9.1.0.tgz#a06c1cd4c11554c29973db70c6a383efebb10b4e" + integrity sha512-r6onkBnpqoWrdYLDVZTiqgQBvH5UZerYRrPB3Ky+RkXJhgwn7AM3LAVrB42sIvFZRNbwOlvuAL+a0+5yDOH67Q== dependencies: - "@abp/core" "~9.1.0-rc.3" + "@abp/core" "~9.1.0" bootstrap "^5.3.3" -"@abp/core@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-9.1.0-rc.3.tgz#4749bd60813ddceb156dec045e7f9eb0b3e19446" - integrity sha512-xYr9zbHCz+v672AuFWSmvqeo0CgAwZTr9laAp58QOCzO2QsVHuDUy60epGhIxCTRc3iCBkcelIFDFlGrN30WSw== +"@abp/core@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-9.1.0.tgz#af78fc096932d4ec45216b5e910c87a72e479b1f" + integrity sha512-6P0KGh5+IqlhQnUOyzaGaKrKzOAm1G0gg8Ay3DXyW2ksY6Zr+lyi5cxNsSi4ix1dicqfydIKvLfV+DF3mQf/dw== dependencies: - "@abp/utils" "~9.1.0-rc.3" + "@abp/utils" "~9.1.0" -"@abp/datatables.net-bs5@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-9.1.0-rc.3.tgz#984d6550124cf0221f8233306483aff72a38249e" - integrity sha512-qJ777clztaau92sLvDgsxIQdKnFpZqQqn3/N2y81eixELm/t/qRiE0ySNduNDnvzik6/uWmfnG82ToCmmTFP2g== +"@abp/datatables.net-bs5@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-9.1.0.tgz#3b2e7d68e947db3d3432ab5e8bff4da89a85d05d" + integrity sha512-zBrzOrfvTPJcc6mvHZDPVdXbWesKU0lKlrb7vuBZxWjrFNwVC0d/KNJPcYVvyQ3zf9rrQB5Xg0MDgu0k5Tt7tQ== dependencies: - "@abp/datatables.net" "~9.1.0-rc.3" + "@abp/datatables.net" "~9.1.0" datatables.net-bs5 "^2.1.8" -"@abp/datatables.net@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-9.1.0-rc.3.tgz#5495345014b6dc3faa67415b2c37ee84b1e4dbbc" - integrity sha512-jKn9DIQrlxMU/dedYaFjfHADPuMfs+6nUojYDGUPd76Ov1TKFNA0N/6ipB7UMYd3xVPEEmgkBH8pqf0qR8D64w== +"@abp/datatables.net@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-9.1.0.tgz#12d6e1412aac4a2e0a61437dcdfbfbe1add7fed7" + integrity sha512-lYRvEZUkntaI+dS9Xkz23Z54eDeZ1R4Wzhqcg6VIsz3iO5kYAa5GiQjcOiBssNGJSLuaet6R5Pqh1ThEUjfvvA== dependencies: - "@abp/jquery" "~9.1.0-rc.3" + "@abp/jquery" "~9.1.0" datatables.net "^2.1.8" -"@abp/font-awesome@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-9.1.0-rc.3.tgz#259dcac2f20da57a72b9c41129c465935abc125f" - integrity sha512-fAExSAn0VaPWfx9kPwIKB0xbSSMHZst/NiNXRPhIrCGty/PXp5OV8ao+mqKcsLQJTPFz1RaSxpdq/1s3tAiGWQ== +"@abp/font-awesome@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-9.1.0.tgz#af21ff2d7c332deb1df626404b53a78d790ba842" + integrity sha512-HcJzDCACGejOIvhxsorCdaesyDHnupR/sl5YFCsGikSqATyOSKQy4pw8wKsb1z+FCT5JYCTR7ROJ3lB1lTEgZw== dependencies: - "@abp/core" "~9.1.0-rc.3" + "@abp/core" "~9.1.0" "@fortawesome/fontawesome-free" "^6.6.0" -"@abp/jquery-form@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-9.1.0-rc.3.tgz#c1ee21a5f38dcf0fdbb0c3e2db3f66bc81ae66b1" - integrity sha512-YJ2CDjJVbNpqs88CGgsHnPtJG4BjYLQ0XFVT+Ph9ar5YnuQrYfB60HMdtnQlqn337hkbzVx2XHLJ6h0tT8To9Q== +"@abp/jquery-form@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-9.1.0.tgz#bdb96436c54b2a09ac4259db97e1e577410e1fc3" + integrity sha512-xjHXWstVY6B3MPB4/8g0EJeHlVvlV010OMZKFmfCGLFi6aHAEKqqWh1rMItAiVuSmCCzL0m/208ZkpoCI++jGQ== dependencies: - "@abp/jquery" "~9.1.0-rc.3" + "@abp/jquery" "~9.1.0" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-9.1.0-rc.3.tgz#88976407a14276244a01a24daeda6b236298e917" - integrity sha512-Yac7l/rjHxdogPyMO8LlJklndDBCwZ+qLeTbCcYt7NQnnsnn+xXomSwjFWv8sguTVKG1eL68LquGUCbNwNfrUA== +"@abp/jquery-validation-unobtrusive@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-9.1.0.tgz#798551e7c14ba286a819a48804107a53e974c1ee" + integrity sha512-TggKckfbLtB7Ig2kNt2kH//GaJUns8OZbpdKdh7vCWIAGedw2FLNCABCpoGnyNp0s/dVOtdyxRl9eFRN3+a4tw== dependencies: - "@abp/jquery-validation" "~9.1.0-rc.3" + "@abp/jquery-validation" "~9.1.0" jquery-validation-unobtrusive "^4.0.0" -"@abp/jquery-validation@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-9.1.0-rc.3.tgz#1ff99dea2f2c52e58a50d06b51e0cbca15ff690c" - integrity sha512-YB1t1m+s+vHGuxSt0h4cgIMIpwRy129pjV08Jja1QtCFhE+VgA9hjvx0OVaVcm31aLLt/KU/+NrO36AbebL+zA== +"@abp/jquery-validation@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-9.1.0.tgz#b771652377fbfb3c92ce03b7b7c069a3bb2ae70b" + integrity sha512-bmPSOHcxjitB8NkiLv0SxxuSS3FlCq9SiTUGvsT8nOStDsm+KpyYSzZQq8LSCyqWWj54tlOARTfcD4tMK7/K3Q== dependencies: - "@abp/jquery" "~9.1.0-rc.3" + "@abp/jquery" "~9.1.0" jquery-validation "^1.21.0" -"@abp/jquery@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-9.1.0-rc.3.tgz#0386a2857271dc4c1e04da9e4b304637bbc2d696" - integrity sha512-1UqztwQ92m6kvYE+Tb0rj7iITHngKdGI5kEpZKOHrEWqnMKeEoPbO1cL+ZOWN0m162WJiliod1HEOxW8b9Ha2Q== +"@abp/jquery@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-9.1.0.tgz#952b61ea3e4a99e6551f667297dbb637d83f3c50" + integrity sha512-Ulw8ClAbqmxceNYCb76bR6dq7e9b7Hs6mjlEy05zdbsSNuZW3UoycsJ+BquXi+dUNBo6OppqEmhVeiIjAKTaFg== dependencies: - "@abp/core" "~9.1.0-rc.3" + "@abp/core" "~9.1.0" jquery "~3.7.1" -"@abp/lodash@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-9.1.0-rc.3.tgz#26f53847ed05a171d71c6c6f1ba33d8c4e2a624a" - integrity sha512-eUuNYTk6hla5kOdc5lOBVoKhMBfnkfXdawb+/LtwBwjCQym+XRTCenJhqzxii293xwd+0G1l5M+8VaPWFq6WWg== +"@abp/lodash@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-9.1.0.tgz#62c784bd99c9e1ccfa82905e843375c594ef8584" + integrity sha512-cCE3ZwwWcPrh+ccKx4AS1USL1ttbrXBqci/l+ROjXhFzrs6GYnhI0+30xRZgPdPRm3U3nGPrSaDAU7UuHkRScg== dependencies: - "@abp/core" "~9.1.0-rc.3" + "@abp/core" "~9.1.0" lodash "^4.17.21" -"@abp/luxon@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-9.1.0-rc.3.tgz#0cfae9b2188c9827963e693dbfaaefcce714bdd9" - integrity sha512-UxtDDyLvHr3sPhrWX+uj9JrsN6idYKH+srOmAKC8+FOfWW/YdFAJmsYPLMCov7FoSWXHG+BQhkuXeCCBppyiVA== +"@abp/luxon@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-9.1.0.tgz#b246f3627bbc7ce41b7878fce1679da473b0e0ae" + integrity sha512-AouS/qEK+i69hwr4XtUOCepONLuR+1gdHFb50RpOEbUoDfTYmYpxPBdiICmZPeJ3CExErITPZxzzngCnKPPOUw== dependencies: - "@abp/core" "~9.1.0-rc.3" + "@abp/core" "~9.1.0" luxon "^3.5.0" -"@abp/malihu-custom-scrollbar-plugin@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-9.1.0-rc.3.tgz#08071e21260f867fc2a7d7594dcdf30da921bb47" - integrity sha512-WDWcm4JsTzq4Se8Sg+v6U5ymjbfVOXsU2WR66RSUL8TSq3WM1MLuRaStDGxtt8nOLvPfqiPWIzb2BvsfyePNRw== +"@abp/malihu-custom-scrollbar-plugin@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-9.1.0.tgz#288ae1916a78100f2c728dfd05a560ee99fafae4" + integrity sha512-McdMRDtbTZBjp//3GMVjRjkc16HNYDEdPc2ar1xrY817e0tEln6/TBkItAcfOvjso0TsLcvlNL1+1bjbMjj8OA== dependencies: - "@abp/core" "~9.1.0-rc.3" + "@abp/core" "~9.1.0" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/moment@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-9.1.0-rc.3.tgz#3cb5b000be73e4d681d3d115be98a8422a66e307" - integrity sha512-K30pG1xRGOJ5m7rJI6u5hKv5Lcjmqxqx7cekDf9HURzgpBGLCvMnnXFSx97w0LcPOYzCVxorfTdw6S3sC12idw== +"@abp/moment@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-9.1.0.tgz#f3c0ae02209e496913cda53df752dabc5be648bd" + integrity sha512-WxR1l09vwxRhqyvAVP4m4IBOFjIC4pzLOmelloqES+gL/klw+T/AmY21Z/z+OV0p7aJ3V3Q1aQStuMCDCyGFnQ== dependencies: moment "^2.30.1" -"@abp/select2@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-9.1.0-rc.3.tgz#7bd050e4847c0b8366fd582200f27065ecc4ff57" - integrity sha512-0k5P+amCqNE2cPAGQpEwFl+vMssuKSbpZ0XgHfF0z3EcE1bAuYDo41nAfk/amsJn5Dt55xJcC+yesADkAXEeIA== +"@abp/select2@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-9.1.0.tgz#9c2c6751f8506fb375c9b7c42a008c168a8f4c75" + integrity sha512-n6HqsH8aFLMrqL6LJ0gsHFlaq6T1QSt/x7HkkZyhDC7CwhXajxtsJEstDnDF9naHSXX/lerPbrHEgzn2QRMBqg== dependencies: - "@abp/core" "~9.1.0-rc.3" + "@abp/core" "~9.1.0" select2 "^4.0.13" -"@abp/sweetalert2@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-9.1.0-rc.3.tgz#69751518ea84b8a306478f48b516946363a7fa7f" - integrity sha512-iHk6JzD9qzmdvr/LjAwSVFfX1WmipzQNcCYwUB+kKe2uSfwufYz+9+iYjYcm7uVvZSd9LniIvzvQXyZlfMSy5w== +"@abp/sweetalert2@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-9.1.0.tgz#660f9b1db60cc04bde6cadbcf3c55320d20c2f3e" + integrity sha512-z3JMeAwva2vR8qZSRJ/BisQDdAEqjDJ/6oIGu/JYXQEchO1Lnd9UMV376nc3crLJdnyRRO7Qs6zx4FfVOCH0kw== dependencies: - "@abp/core" "~9.1.0-rc.3" + "@abp/core" "~9.1.0" sweetalert2 "^11.14.1" -"@abp/timeago@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-9.1.0-rc.3.tgz#b1eb20d6c9fe47a6d0ace8565ea8289f1af9c0a1" - integrity sha512-7hq2+HHQ91/xXFGK417dkgFNKU7z49bVN7tkHLMJyKkJb1iP3N0gCz3HdkCRjnM6yrRXQDYUmO/zCv6yBwakjA== +"@abp/timeago@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-9.1.0.tgz#496e40153241bae5d418d79cc6c65c9db6306447" + integrity sha512-a/UAYQ2GrhYFGx4p0hqr3x+teBqnjnOiWJEPq9//RTlz+EZ+OUyHbJrcUtqZRvaGJtOAsfmljD3jYnOXUlU7DA== dependencies: - "@abp/jquery" "~9.1.0-rc.3" + "@abp/jquery" "~9.1.0" timeago "^1.6.7" -"@abp/toastr@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-9.1.0-rc.3.tgz#de490bfd6b41919d96be0544aaaee3d457cf9f32" - integrity sha512-hLe3FXyplQmhRbvBZdLVt+6yRAfptAJzwU2S5iHbs5r4ncO1ampCClZNNLNmrCglDQ30ZkgrPg4SjHn9V6HyIQ== +"@abp/toastr@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-9.1.0.tgz#501cbe211164b2e7416a2d4878cb34aed3550b7c" + integrity sha512-BkTDuU0p9Qa4+HT9CYwiPQjVTrbTSNBgQ18h69S3lIadLJwdC6pXeLbL9bhe+5fiuhq2f+0Oqo3X75LNEgzHkw== dependencies: - "@abp/jquery" "~9.1.0-rc.3" + "@abp/jquery" "~9.1.0" toastr "^2.1.4" -"@abp/utils@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-9.1.0-rc.3.tgz#84de6ab4497c74b2c0c04f604dc6d542a50a1534" - integrity sha512-Tw9gNUAFjmieVrnril7YxwqthpSkZiY01uW60/+Dkd3jh9qZntqgzIcKG6/TXjimWK6iN8YZFOJ0cShCnHW0Jg== +"@abp/utils@~9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-9.1.0.tgz#a4fd37d943df18b5c11f5d4869efd5d8882b7959" + integrity sha512-+UZo0ocTEZlRO41SzzHNdinjdFUDVq8wYZSj5BA1bqCVeWYhfjI2+rl9DuogCN8UEuCACA4K/qb4XcE/untQ3g== dependencies: just-compare "^2.3.0" diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/Pages/SettingManagement/EmailSettingGroup/EmailSettingGroupViewComponent.razor.cs b/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/Pages/SettingManagement/EmailSettingGroup/EmailSettingGroupViewComponent.razor.cs index 9a1d36be44..885a556991 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/Pages/SettingManagement/EmailSettingGroup/EmailSettingGroupViewComponent.razor.cs +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/Pages/SettingManagement/EmailSettingGroup/EmailSettingGroupViewComponent.razor.cs @@ -118,7 +118,7 @@ public partial class EmailSettingGroupViewComponent await EmailSettingsAppService.SendTestEmailAsync(ObjectMapper.Map(SendTestEmailInput)); - await Notify.Success(L["SuccessfullySent"]); + await Notify.Success(L["SentSuccessfully"]); } catch (Exception ex) { diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/ar.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/ar.json index d25470b917..1a0a2e218a 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/ar.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/ar.json @@ -14,7 +14,7 @@ "Body": "جسم", "TestEmailSubject": "Ų§Ų®ŲŖŲØŲ§Ų± Ų§Ł„ŲØŲ±ŁŠŲÆ Ų§Ł„Ų„Ł„ŁƒŲŖŲ±ŁˆŁ†ŁŠ {0}", "TestEmailBody": "Ų§Ų®ŲŖŲØŲ§Ų± نص رسالة Ų§Ł„ŲØŲ±ŁŠŲÆ Ų§Ł„Ų„Ł„ŁƒŲŖŲ±ŁˆŁ†ŁŠ هنا", - "SuccessfullySent": "أرسلت بنجاح", + "SentSuccessfully": "أرسلت بنجاح", "MailSendingFailed": "فؓل Ų„Ų±Ų³Ų§Ł„ Ų§Ł„ŲØŲ±ŁŠŲÆ ، ŁŠŲ±Ų¬Ł‰ التحقق من ŲŖŁƒŁˆŁŠŁ† Ų§Ł„ŲØŲ±ŁŠŲÆ Ų§Ł„Ų„Ł„ŁƒŲŖŲ±ŁˆŁ†ŁŠ الخاص بك ŁˆŲ§Ł„Ł…Ų­Ų§ŁˆŁ„Ų© Ł…Ų±Ų© أخرى.", "Send": "ŁŠŲ±Ų³Ł„", "Menu:Emailing": "Ų„Ų±Ų³Ų§Ł„ ŲØŲ§Ł„ŲØŲ±ŁŠŲÆ Ų§Ł„Ų„Ł„ŁƒŲŖŲ±ŁˆŁ†ŁŠ", diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/cs.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/cs.json index 2f6711296b..983c6718b9 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/cs.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/cs.json @@ -14,7 +14,7 @@ "Body": "Tělo", "TestEmailSubject": "TestovacĆ­ e-mail {0}", "TestEmailBody": "Test těla e-mailovĆ© zprĆ”vy zde", - "SuccessfullySent": "ÚspěŔně odeslĆ”no", + "SentSuccessfully": "ÚspěŔně odeslĆ”no", "MailSendingFailed": "OdesĆ­lĆ”nĆ­ e-mailu se nezdařilo. Zkontrolujte konfiguraci e-mailu a zkuste to znovu.", "Send": "Poslat", "Menu:Emailing": "ZasĆ­lĆ”nĆ­ e-mailem", diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/de-DE.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/de-DE.json index a0127f127e..3f44913224 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/de-DE.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/de-DE.json @@ -14,7 +14,7 @@ "Body": "Nachricht", "TestEmailSubject": "Test E-Mail {0}", "TestEmailBody": "Test E-Mail Nachricht hier eingeben", - "SuccessfullySent": "Erfolgreich gesendet", + "SentSuccessfully": "Erfolgreich gesendet", "MailSendingFailed": "E-Mail-Versand fehlgeschlagen. Bitte überprüfen Sie Ihre E-Mail-Konfiguration und versuchen Sie es erneut.", "Send": "Senden", "Menu:Emailing": "E-Mail", diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/de.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/de.json index c9fea92a36..c5efcb1718 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/de.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/de.json @@ -14,7 +14,7 @@ "Body": "Kƶrper", "TestEmailSubject": "Test-E-Mail {0}", "TestEmailBody": "Testen Sie hier die E-Mail-Textnachricht", - "SuccessfullySent": "Erfolgreich gesendet", + "SentSuccessfully": "Erfolgreich gesendet", "MailSendingFailed": "E-Mail-Versand fehlgeschlagen. Bitte überprüfen Sie Ihre E-Mail-Konfiguration und versuchen Sie es erneut.", "Send": "Schicken", "Menu:Emailing": "E-Mail senden", diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/el.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/el.json index 95132d1f67..611cfb407d 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/el.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/el.json @@ -14,7 +14,7 @@ "Body": "Κείμενο", "TestEmailSubject": "Ī”ĪæĪŗĪ¹Ī¼Ī±ĻƒĻ„Ī¹ĪŗĻŒ email {0}", "TestEmailBody": "Ī”ĪæĪŗĪ¹Ī¼Ī±ĻƒĻ„Ī¹ĪŗĻŒ κείμενο email ĪµĪ“ĻŽ", - "SuccessfullySent": "Στάλθηκε με επιτυχία", + "SentSuccessfully": "Στάλθηκε με επιτυχία", "MailSendingFailed": "Αποτυχία Ī±Ļ€ĪæĻƒĻ„ĪæĪ»Ī®Ļ‚ email. Ελέγξτε τη Ī“Ī¹Ī±Ī¼ĻŒĻĻ†Ļ‰ĻƒĪ· του email ĻƒĪ±Ļ‚ και Ī“ĪæĪŗĪ¹Ī¼Ī¬ĻƒĻ„Īµ ξανά.", "Send": "Ī‘Ļ€ĪæĻƒĻ„ĪæĪ»Ī®", "Menu:Emailing": "Ī‘Ļ€ĪæĻƒĻ„ĪæĪ»Ī® email", diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/en.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/en.json index e81ce7718b..e7d221b4ef 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/en.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/en.json @@ -14,7 +14,7 @@ "Body": "Body", "TestEmailSubject": "Test email {0}", "TestEmailBody": "Test email body message here", - "SuccessfullySent": "Successfully sent", + "SentSuccessfully": "Sent successfully", "MailSendingFailed": "Mail sending failed, please check your email configuration and try again.", "Send": "Send", "Menu:Emailing": "Emailing", diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/es.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/es.json index 660a7998ac..7d6bcd8236 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/es.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/es.json @@ -14,7 +14,7 @@ "Body": "Cuerpo", "TestEmailSubject": "Correo electrónico de prueba {0}", "TestEmailBody": "Pruebe el cuerpo del mensaje de correo electrónico aquĆ­", - "SuccessfullySent": "Enviado exitosamente", + "SentSuccessfully": "Enviado exitosamente", "MailSendingFailed": "Error al enviar el correo, por favor revise su configuración de correo y vuelva a intentarlo.", "Send": "Enviar", "Menu:Emailing": "Configuración", diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/fi.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/fi.json index d9f853dd76..312ecf608c 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/fi.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/fi.json @@ -14,7 +14,7 @@ "Body": "Runko", "TestEmailSubject": "TestisƤhkƶposti {0}", "TestEmailBody": "Testaa sƤhkƶpostiviestiƤ tƤƤllƤ", - "SuccessfullySent": "LƤhetetty onnistuneesti", + "SentSuccessfully": "LƤhetetty onnistuneesti", "MailSendingFailed": "SƤhkƶpostin lƤhetys epƤonnistui. Tarkista sƤhkƶpostiasetuksesi ja yritƤ uudelleen.", "Send": "LƤhetƤ", "Menu:Emailing": "SƤhkƶpostiviestit", diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/fr.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/fr.json index 85a8d04f18..3ec1a598c2 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/fr.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/fr.json @@ -14,7 +14,7 @@ "Body": "Corps", "TestEmailSubject": "E-mail test {0}", "TestEmailBody": "Testez le corps du message ici", - "SuccessfullySent": "EnvoyĆ© avec succĆØs", + "SentSuccessfully": "EnvoyĆ© avec succĆØs", "MailSendingFailed": "L'envoi de courrier a Ć©chouĆ©, veuillez vĆ©rifier votre configuration de courrier Ć©lectronique et rĆ©essayer.", "Send": "Envoyer", "Menu:Emailing": "Envoi par e-mail", diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/hi.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/hi.json index 73e0340584..786616f901 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/hi.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/hi.json @@ -14,7 +14,7 @@ "Body": "ą¤¶ą¤°ą„€ą¤°", "TestEmailSubject": "ą¤Ŗą¤°ą„€ą¤•ą„ą¤·ą¤£ ą¤ˆą¤®ą„‡ą¤² {0}", "TestEmailBody": "यहां ą¤ˆą¤®ą„‡ą¤² ą¤¬ą„‰ą¤”ą„€ ą¤øą¤‚ą¤¦ą„‡ą¤¶ का ą¤Ŗą¤°ą„€ą¤•ą„ą¤·ą¤£ ą¤•ą¤°ą„‡ą¤‚", - "SuccessfullySent": "ą¤øą¤«ą¤²ą¤¤ą¤¾ą¤Ŗą„‚ą¤°ą„ą¤µą¤• ą¤­ą„‡ą¤œą¤¾", + "SentSuccessfully": "ą¤øą¤«ą¤²ą¤¤ą¤¾ą¤Ŗą„‚ą¤°ą„ą¤µą¤• ą¤­ą„‡ą¤œ दिया गया", "MailSendingFailed": "ą¤®ą„‡ą¤² ą¤­ą„‡ą¤œą¤Øą„‡ ą¤®ą„‡ą¤‚ विफल, ą¤•ą„ƒą¤Ŗą¤Æą¤¾ ą¤…ą¤Ŗą¤Øą„€ ą¤ˆą¤®ą„‡ą¤² ą¤µą¤æą¤Øą„ą¤Æą¤¾ą¤ø ą¤•ą„€ जाँच ą¤•ą¤°ą„‡ą¤‚ और ą¤Ŗą„ą¤Øą¤ƒ ą¤Ŗą„ą¤°ą¤Æą¤¾ą¤ø ą¤•ą¤°ą„‡ą¤‚ą„¤", "Send": "ą¤­ą„‡ą¤œą¤Øą¤¾", "Menu:Emailing": "ą¤ˆą¤®ą„‡ą¤² ą¤øą„‡ ą¤­ą„‡ą¤œą¤Øą¤¾", diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/hr.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/hr.json index db40dafe47..acd0c132fa 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/hr.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/hr.json @@ -14,7 +14,7 @@ "Body": "Tijelo", "TestEmailSubject": "Probna e-poÅ”ta {0}", "TestEmailBody": "Testirajte tijelo poruke e-poÅ”te ovdje", - "SuccessfullySent": "UspjeÅ”no poslano", + "SentSuccessfully": "Poslan uspjeÅ”no", "MailSendingFailed": "Slanje e-poÅ”te nije uspjelo, provjerite konfiguraciju e-poÅ”te i pokuÅ”ajte ponovo.", "Send": "Poslati", "Menu:Emailing": "Slanje e-poÅ”tom", diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/hu.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/hu.json index c2cc70cb5b..c47a813371 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/hu.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/hu.json @@ -14,7 +14,7 @@ "Body": "Test", "TestEmailSubject": "Teszt e-mail {0}", "TestEmailBody": "Itt tesztelheti az e-mail tƶrzsüzenetĆ©t", - "SuccessfullySent": "Sikeresen elküldve", + "SentSuccessfully": "Sikeresen elküldve", "MailSendingFailed": "Az e-mail küldĆ©se sikertelen, ellenőrizze az e-mail konfigurĆ”ciójĆ”t, Ć©s próbĆ”lja Ćŗjra.", "Send": "Küld", "Menu:Emailing": "E-mailezĆ©s", diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/is.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/is.json index cd80ba6fc3..f39b10f795 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/is.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/is.json @@ -14,7 +14,7 @@ "Body": "LĆ­kami", "TestEmailSubject": "Prófunartƶlvupóstur {0}", "TestEmailBody": "Prófaưu meginmĆ”l tƶlvupósts hĆ©r", - "SuccessfullySent": "Tókst sent", + "SentSuccessfully": "Tókst aư senda", "MailSendingFailed": "Tƶlvupóstur sendist ekki. Athugaưu tƶlvupóst stillingar þínar og reyndu aftur.", "Send": "Senda", "Menu:Emailing": "Senda tƶlvupóst", diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/it.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/it.json index c03c678318..3de6657509 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/it.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/it.json @@ -14,7 +14,7 @@ "Body": "Corpo", "TestEmailSubject": "Prova l'e-mail {0}", "TestEmailBody": "Prova il corpo del messaggio email qui", - "SuccessfullySent": "Inviato con successo", + "SentSuccessfully": "Inviato con successo", "MailSendingFailed": "Invio della posta fallito, controlla la tua configurazione email e riprova.", "Send": "Inviare", "Menu:Emailing": "Invio di e-mail", diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/nl.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/nl.json index e68f8a0b2c..a188146d0e 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/nl.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/nl.json @@ -14,7 +14,7 @@ "Body": "Lichaam", "TestEmailSubject": "Test-e-mail {0}", "TestEmailBody": "Test hier het hoofdbericht van de e-mail", - "SuccessfullySent": "Succesvol verzonden", + "SentSuccessfully": "Succesvol verzonden", "MailSendingFailed": "E-mail verzenden mislukt. Controleer uw e-mailconfiguratie en probeer het opnieuw.", "Send": "Versturen", "Menu:Emailing": "E-mail", diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/pl-PL.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/pl-PL.json index 0e900acb36..a4bbd7238e 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/pl-PL.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/pl-PL.json @@ -14,7 +14,7 @@ "Body": "Ciało", "TestEmailSubject": "Testowy e-mail {0}", "TestEmailBody": "Tutaj przetestuj treść wiadomości e-mail", - "SuccessfullySent": "Pomyślnie wysłane", + "SentSuccessfully": "Wysłano pomyślnie", "MailSendingFailed": "Wysyłanie e-maila nie powiodło się. SprawdÅŗ konfigurację e-maila i spróbuj ponownie.", "Send": "Wysłać", "Menu:Emailing": "Wysyłanie e-maili", diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/pt-BR.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/pt-BR.json index 4d3719e229..c6c951c025 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/pt-BR.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/pt-BR.json @@ -14,7 +14,7 @@ "Body": "Corpo", "TestEmailSubject": "E-mail teste {0}", "TestEmailBody": "Corpo de e-mail de teste aqui", - "SuccessfullySent": "Enviado com sucesso", + "SentSuccessfully": "Enviado com sucesso", "MailSendingFailed": "Falha no envio de e-mail, verifique sua configuração de e-mail e tente novamente.", "Send": "Enviar", "Menu:Emailing": "Enviando por e-mail", diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/ro-RO.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/ro-RO.json index dccb428a93..7e1eac80be 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/ro-RO.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/ro-RO.json @@ -14,7 +14,7 @@ "Body": "Corp", "TestEmailSubject": "E-mail de testare {0}", "TestEmailBody": "Testați corpul mesajului de e-mail aici", - "SuccessfullySent": "Trimis cu succes", + "SentSuccessfully": "Trimis cu succes", "MailSendingFailed": "Trimiterea e-mailului a eșuat. Verificați configurația e-mailului și Ć®ncercați din nou.", "Send": "Trimite", "Menu:Emailing": "Emailing", diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/ru.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/ru.json index c7a48b8c2e..9fde67ff61 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/ru.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/ru.json @@ -14,7 +14,7 @@ "Body": "Тело", "TestEmailSubject": "Тестовое письмо {0}", "TestEmailBody": "ŠŸŃ€Š¾Š²ŠµŃ€ŃŒŃ‚Šµ текст ŃŠ¾Š¾Š±Ń‰ŠµŠ½ŠøŃ ŃŠ»ŠµŠŗŃ‚Ń€Š¾Š½Š½Š¾Š¹ почты зГесь", - "SuccessfullySent": "Успешно отправлено", + "SentSuccessfully": "отправлено успешно", "MailSendingFailed": "ŠŠµ уГалось Š¾Ń‚ŠæŃ€Š°Š²ŠøŃ‚ŃŒ письмо. ŠŸŠ¾Š¶Š°Š»ŃƒŠ¹ŃŃ‚Š°, ŠæŃ€Š¾Š²ŠµŃ€ŃŒŃ‚Šµ настройки ŃŠ»ŠµŠŗŃ‚Ń€Š¾Š½Š½Š¾Š¹ почты Šø повторите ŠæŠ¾ŠæŃ‹Ń‚ŠŗŃƒ.", "Send": "ŠžŃ‚ŠæŃ€Š°Š²Š»ŃŃ‚ŃŒ", "Menu:Emailing": "ŠžŃ‚ŠæŃ€Š°Š²ŠŗŠ° по ŃŠ»ŠµŠŗŃ‚Ń€Š¾Š½Š½Š¾Š¹ почте", diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/sk.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/sk.json index dfee758b09..e06c4d9d0a 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/sk.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/sk.json @@ -14,7 +14,7 @@ "Body": "Telo", "TestEmailSubject": "TestovacĆ­ e-mail {0}", "TestEmailBody": "Tu otestujte telo e-mailu", - "SuccessfullySent": "ÚspeÅ”ne odoslanĆ©", + "SentSuccessfully": "ÚspeÅ”ne odoslanĆ©", "MailSendingFailed": "Odoslanie emailu zlyhalo. Skontrolujte konfigurĆ”ciu emailu a skĆŗste to znova.", "Send": "OdoslaÅ„", "Menu:Emailing": "Posielanie emailov", diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/sl.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/sl.json index 81af7b908c..509ce74e08 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/sl.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/sl.json @@ -14,7 +14,7 @@ "Body": "Telo", "TestEmailSubject": "Preskusno e-poÅ”tno sporočilo {0}", "TestEmailBody": "Tukaj preizkusite telo e-poÅ”tnega sporočila", - "SuccessfullySent": "UspeÅ”no poslano", + "SentSuccessfully": "Poslano uspeÅ”no", "MailSendingFailed": "PoÅ”iljanje e-poÅ”te ni uspelo, preverite konfiguracijo e-poÅ”te in poskusite znova.", "Send": "PoÅ”lji", "Menu:Emailing": "PoÅ”iljanje po e-poÅ”ti", diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/sv.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/sv.json index 3e66d68871..ad74a9c147 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/sv.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/sv.json @@ -14,7 +14,7 @@ "Body": "Kropp", "TestEmailSubject": "Testa e-post {0}", "TestEmailBody": "Testa e-postmeddelandets brƶdtext hƤr", - "SuccessfullySent": "FramgĆ„ngsrikt skickat", + "SentSuccessfully": "Skickat framgĆ„ngsrikt", "Send": "Skicka", "Menu:Emailing": "E-post", "Menu:TimeZone": "Tidszon", diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/tr.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/tr.json index c91e50d716..aab8928026 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/tr.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/tr.json @@ -14,7 +14,7 @@ "Body": "Gƶvde", "TestEmailSubject": "Test email {0}", "TestEmailBody": "E-posta gƶvdesi mesajını burada test edin", - "SuccessfullySent": "Başarıyla gƶnderildi", + "SentSuccessfully": "Gƶnderildi", "MailSendingFailed": "E-posta gƶnderme başarısız, lütfen e-posta yapılandırmanızı kontrol edin ve tekrar deneyin.", "Send": "Gƶnder", "Menu:Emailing": "Email", diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/vi.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/vi.json index 42d9af1b32..94acb63a71 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/vi.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/vi.json @@ -14,7 +14,7 @@ "Body": "ThĆ¢n hƬnh", "TestEmailSubject": "Kiểm tra email {0}", "TestEmailBody": "Kiểm tra nį»™i dung email tįŗ”i đây", - "SuccessfullySent": "Đã gį»­i thĆ nh cĆ“ng", + "SentSuccessfully": "Gį»­i thĆ nh cĆ“ng", "MailSendingFailed": "Gį»­i email thįŗ„t bįŗ”i. Vui lòng kiểm tra cįŗ„u hƬnh email cį»§a bįŗ”n vĆ  thį»­ lįŗ”i.", "Send": "Gį»­i", "Menu:Emailing": "Gį»­i email", diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/zh-Hans.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/zh-Hans.json index 3ad7f5efa4..339f14e292 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/zh-Hans.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/zh-Hans.json @@ -14,7 +14,7 @@ "Body": "正文", "TestEmailSubject": "测试邮件 {0}", "TestEmailBody": "测试邮件内容", - "SuccessfullySent": "å‘é€ęˆåŠŸ", + "SentSuccessfully": "å‘é€ęˆåŠŸ", "MailSendingFailed": "é‚®ä»¶å‘é€å¤±č“„ļ¼ŒčÆ·ę£€ęŸ„ę‚Øēš„ē”µå­é‚®ä»¶é…ē½®å¹¶é‡čÆ•ć€‚", "Send": "发送", "Menu:Emailing": "邮件", diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/zh-Hant.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/zh-Hant.json index add9d88e5c..e3a06511c2 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/zh-Hant.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/zh-Hant.json @@ -14,7 +14,7 @@ "Body": "å…§ę–‡", "TestEmailSubject": "測試郵件 {0}", "TestEmailBody": "ęø¬č©¦éƒµä»¶å…§å®¹", - "SuccessfullySent": "ęˆåŠŸē™¼é€", + "SentSuccessfully": "ē™¼é€ęˆåŠŸ", "MailSendingFailed": "éƒµä»¶ē™¼é€å¤±ę•—,č«‹ęŖ¢ęŸ„ä½ ēš„éƒµä»¶é…ē½®äø¦é‡č©¦.", "Send": "發送", "Menu:Emailing": "俔箱", diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Installer/InstallationNotes.md b/modules/setting-management/src/Volo.Abp.SettingManagement.Installer/InstallationNotes.md new file mode 100644 index 0000000000..dd675ae5ec --- /dev/null +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Installer/InstallationNotes.md @@ -0,0 +1,15 @@ +# Installation Notes for Setting Management Module + +The Setting Management module provides a way to store and manage settings in an ABP application. Settings are used to store application, tenant, or user-specific configuration values that can be changed at runtime. The module includes both a UI for setting management and an API for programmatic setting management. + +Key features of the Setting Management module: +- Store and retrieve settings +- Multi-level setting management (global, tenant, user) +- Setting management UI +- Extensible setting provider system +- Multi-tenancy support +- Integration with other ABP modules + +## Documentation + +For detailed information and usage instructions, please visit the [Setting Management Module documentation](https://abp.io/docs/latest/Modules/Setting-Management). \ No newline at end of file diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/Components/EmailSettingGroup/Default.js b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/Components/EmailSettingGroup/Default.js index ae8e694de3..6dd040ad5c 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/Components/EmailSettingGroup/Default.js +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/Components/EmailSettingGroup/Default.js @@ -40,7 +40,7 @@ }) _sendTestEmailModal.onResult(function () { - abp.notify.success(l('SuccessfullySent')); + abp.notify.success(l('SentSuccessfully')); }); $("#SendTestEmailButton").click(function (e) { diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Installer/InstallationNotes.md b/modules/tenant-management/src/Volo.Abp.TenantManagement.Installer/InstallationNotes.md new file mode 100644 index 0000000000..3a4dcd4fc6 --- /dev/null +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Installer/InstallationNotes.md @@ -0,0 +1,9 @@ +# Installation Notes for Tenant Management Module + +The ABP Tenant Management module provides multi-tenancy features for your ABP-based applications. It implements the `ITenantStore` interface and provides UI to manage tenants and their features. + +This module is part of the ABP Framework and provides the core functionality needed to build multi-tenant (SaaS) applications. + +## Documentation + +For detailed information and usage instructions, please visit the [Tenant Management module documentation](https://abp.io/docs/latest/modules/tenant-management). \ No newline at end of file diff --git a/modules/virtual-file-explorer/.abpstudio/state.json b/modules/virtual-file-explorer/.abpstudio/state.json new file mode 100644 index 0000000000..b0ef88d2f2 --- /dev/null +++ b/modules/virtual-file-explorer/.abpstudio/state.json @@ -0,0 +1,11 @@ +{ + "selectedKubernetesProfile": null, + "solutionRunner": { + "selectedProfile": null, + "targetFrameworks": [], + "applicationsStartingWithoutBuild": [], + "applicationsWithoutAutoRefreshBrowserOnRestart": [], + "applicationBatchStartStates": [], + "folderBatchStartStates": [] + } +} \ No newline at end of file diff --git a/modules/virtual-file-explorer/Volo.Abp.VirtualFileExplorer.abpmdl b/modules/virtual-file-explorer/Volo.Abp.VirtualFileExplorer.abpmdl index 3c025e6ade..d5210d1e6b 100644 --- a/modules/virtual-file-explorer/Volo.Abp.VirtualFileExplorer.abpmdl +++ b/modules/virtual-file-explorer/Volo.Abp.VirtualFileExplorer.abpmdl @@ -7,9 +7,13 @@ }, "packages": { "Volo.Abp.VirtualFileExplorer.DemoApp": { - "path": "app/Volo.Abp.VirtualFileExplorer.DemoApp/Volo.Abp.VirtualFileExplorer.DemoApp.abppkg", + "path": "app/DemoApp.abppkg", "folder": "app" }, + "Volo.Abp.VirtualFileExplorer.Contracts": { + "path": "src/Volo.Abp.VirtualFileExplorer.Contracts/Volo.Abp.VirtualFileExplorer.Contracts.abppkg", + "folder": "src" + }, "Volo.Abp.VirtualFileExplorer.Web": { "path": "src/Volo.Abp.VirtualFileExplorer.Web/Volo.Abp.VirtualFileExplorer.Web.abppkg", "folder": "src" diff --git a/modules/virtual-file-explorer/Volo.Abp.VirtualFileExplorer.abpsln b/modules/virtual-file-explorer/Volo.Abp.VirtualFileExplorer.abpsln index 264a302af3..73a99eb6c5 100644 --- a/modules/virtual-file-explorer/Volo.Abp.VirtualFileExplorer.abpsln +++ b/modules/virtual-file-explorer/Volo.Abp.VirtualFileExplorer.abpsln @@ -3,5 +3,6 @@ "Volo.Abp.VirtualFileExplorer": { "path": "Volo.Abp.VirtualFileExplorer.abpmdl" } - } + }, + "id": "d900c5b2-d907-4abb-bc38-b72f80006fe0" } \ No newline at end of file diff --git a/modules/virtual-file-explorer/Volo.Abp.VirtualFileExplorer.sln b/modules/virtual-file-explorer/Volo.Abp.VirtualFileExplorer.sln index 67b9741932..da8e8f67d4 100644 --- a/modules/virtual-file-explorer/Volo.Abp.VirtualFileExplorer.sln +++ b/modules/virtual-file-explorer/Volo.Abp.VirtualFileExplorer.sln @@ -9,10 +9,12 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.VirtualFileExplore EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "app", "app", "{0489DA85-A27F-4D98-9DBD-950F5F2ECD11}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.VirtualFileExplorer.DemoApp", "app\Volo.Abp.VirtualFileExplorer.DemoApp\Volo.Abp.VirtualFileExplorer.DemoApp.csproj", "{6DAA2A8D-5422-4C3B-BA70-B54D949B1678}" -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.VirtualFileExplorer.Installer", "src\Volo.Abp.VirtualFileExplorer.Installer\Volo.Abp.VirtualFileExplorer.Installer.csproj", "{638DDC11-0B86-4B5D-A518-4A8158665074}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.VirtualFileExplorer.Contracts", "src\Volo.Abp.VirtualFileExplorer.Contracts\Volo.Abp.VirtualFileExplorer.Contracts.csproj", "{21FC5247-29FF-4D02-BB6A-8A739AC5640D}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DemoApp", "app\DemoApp.csproj", "{C447E4F2-7FCA-49B6-8249-7E04C9E26BAD}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -23,22 +25,27 @@ Global {3B7B6317-1B85-4164-8E11-75574F80AE17}.Debug|Any CPU.Build.0 = Debug|Any CPU {3B7B6317-1B85-4164-8E11-75574F80AE17}.Release|Any CPU.ActiveCfg = Release|Any CPU {3B7B6317-1B85-4164-8E11-75574F80AE17}.Release|Any CPU.Build.0 = Release|Any CPU - {6DAA2A8D-5422-4C3B-BA70-B54D949B1678}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6DAA2A8D-5422-4C3B-BA70-B54D949B1678}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6DAA2A8D-5422-4C3B-BA70-B54D949B1678}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6DAA2A8D-5422-4C3B-BA70-B54D949B1678}.Release|Any CPU.Build.0 = Release|Any CPU {638DDC11-0B86-4B5D-A518-4A8158665074}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {638DDC11-0B86-4B5D-A518-4A8158665074}.Debug|Any CPU.Build.0 = Debug|Any CPU {638DDC11-0B86-4B5D-A518-4A8158665074}.Release|Any CPU.ActiveCfg = Release|Any CPU {638DDC11-0B86-4B5D-A518-4A8158665074}.Release|Any CPU.Build.0 = Release|Any CPU + {21FC5247-29FF-4D02-BB6A-8A739AC5640D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {21FC5247-29FF-4D02-BB6A-8A739AC5640D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {21FC5247-29FF-4D02-BB6A-8A739AC5640D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {21FC5247-29FF-4D02-BB6A-8A739AC5640D}.Release|Any CPU.Build.0 = Release|Any CPU + {C447E4F2-7FCA-49B6-8249-7E04C9E26BAD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C447E4F2-7FCA-49B6-8249-7E04C9E26BAD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C447E4F2-7FCA-49B6-8249-7E04C9E26BAD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C447E4F2-7FCA-49B6-8249-7E04C9E26BAD}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution {3B7B6317-1B85-4164-8E11-75574F80AE17} = {649A3FFA-182F-4E56-9717-E6A9A2BEC545} - {6DAA2A8D-5422-4C3B-BA70-B54D949B1678} = {0489DA85-A27F-4D98-9DBD-950F5F2ECD11} {638DDC11-0B86-4B5D-A518-4A8158665074} = {649A3FFA-182F-4E56-9717-E6A9A2BEC545} + {21FC5247-29FF-4D02-BB6A-8A739AC5640D} = {649A3FFA-182F-4E56-9717-E6A9A2BEC545} + {C447E4F2-7FCA-49B6-8249-7E04C9E26BAD} = {0489DA85-A27F-4D98-9DBD-950F5F2ECD11} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {4324B3B4-B60B-4E3C-91D8-59576B4E26DD} diff --git a/modules/virtual-file-explorer/app/Data/DemoAppDbContext.cs b/modules/virtual-file-explorer/app/Data/DemoAppDbContext.cs new file mode 100644 index 0000000000..ee3ec23421 --- /dev/null +++ b/modules/virtual-file-explorer/app/Data/DemoAppDbContext.cs @@ -0,0 +1,22 @@ +using Microsoft.EntityFrameworkCore; +using Volo.Abp.EntityFrameworkCore; +using Volo.Abp.Identity.EntityFrameworkCore; +using Volo.Abp.PermissionManagement.EntityFrameworkCore; + +namespace DemoApp.Data; + +public class DemoAppDbContext : AbpDbContext +{ + public DemoAppDbContext(DbContextOptions options) + : base(options) + { + } + + protected override void OnModelCreating(ModelBuilder builder) + { + base.OnModelCreating(builder); + + builder.ConfigurePermissionManagement(); + builder.ConfigureIdentity(); + } +} diff --git a/modules/virtual-file-explorer/app/Data/DemoAppDbContextFactory.cs b/modules/virtual-file-explorer/app/Data/DemoAppDbContextFactory.cs new file mode 100644 index 0000000000..1f0d7e56c4 --- /dev/null +++ b/modules/virtual-file-explorer/app/Data/DemoAppDbContextFactory.cs @@ -0,0 +1,26 @@ +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Design; + +namespace DemoApp.Data; + +public class DemoAppDbContextFactory : IDesignTimeDbContextFactory +{ + public DemoAppDbContext CreateDbContext(string[] args) + { + var configuration = BuildConfiguration(); + + var builder = new DbContextOptionsBuilder() + .UseSqlServer(configuration.GetConnectionString("Default")); + + return new DemoAppDbContext(builder.Options); + } + + private static IConfigurationRoot BuildConfiguration() + { + var builder = new ConfigurationBuilder() + .SetBasePath(Directory.GetCurrentDirectory()) + .AddJsonFile("appsettings.json", optional: false); + + return builder.Build(); + } +} diff --git a/modules/virtual-file-explorer/app/DemoApp.abppkg b/modules/virtual-file-explorer/app/DemoApp.abppkg new file mode 100644 index 0000000000..48875c29cf --- /dev/null +++ b/modules/virtual-file-explorer/app/DemoApp.abppkg @@ -0,0 +1,3 @@ +{ + "role": "host.mvc" +} \ No newline at end of file diff --git a/modules/virtual-file-explorer/app/DemoApp.csproj b/modules/virtual-file-explorer/app/DemoApp.csproj new file mode 100644 index 0000000000..938e3f03b1 --- /dev/null +++ b/modules/virtual-file-explorer/app/DemoApp.csproj @@ -0,0 +1,64 @@ + + + net9.0 + enable + enable + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + runtime; build; native; contentfiles; analyzers + compile; contentFiles; build; buildMultitargeting; buildTransitive; analyzers; native + + + + + + Always + + + Always + + + + diff --git a/modules/virtual-file-explorer/app/DemoAppModule.cs b/modules/virtual-file-explorer/app/DemoAppModule.cs new file mode 100644 index 0000000000..ae03d3f2ed --- /dev/null +++ b/modules/virtual-file-explorer/app/DemoAppModule.cs @@ -0,0 +1,134 @@ +using DemoApp.Data; +using Microsoft.EntityFrameworkCore; +using Volo.Abp; +using Volo.Abp.Account; +using Volo.Abp.Account.Web; +using Volo.Abp.AspNetCore.Mvc; +using Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic; +using Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared; +using Volo.Abp.AspNetCore.Serilog; +using Volo.Abp.Autofac; +using Volo.Abp.AutoMapper; +using Volo.Abp.Data; +using Volo.Abp.EntityFrameworkCore; +using Volo.Abp.EntityFrameworkCore.SqlServer; +using Volo.Abp.Identity; +using Volo.Abp.Identity.EntityFrameworkCore; +using Volo.Abp.Identity.Web; +using Volo.Abp.Localization; +using Volo.Abp.Modularity; +using Volo.Abp.MultiTenancy; +using Volo.Abp.PermissionManagement; +using Volo.Abp.PermissionManagement.EntityFrameworkCore; +using Volo.Abp.PermissionManagement.HttpApi; +using Volo.Abp.PermissionManagement.Identity; +using Volo.Abp.PermissionManagement.Web; +using Volo.Abp.Swashbuckle; +using Volo.Abp.VirtualFileExplorer.Web; + +namespace DemoApp; + +[DependsOn( + // ABP Framework packages + typeof(AbpAspNetCoreMvcModule), + typeof(AbpAutofacModule), + typeof(AbpAutoMapperModule), + typeof(AbpSwashbuckleModule), + typeof(AbpAspNetCoreSerilogModule), + + // basic-theme + typeof(AbpAspNetCoreMvcUiBasicThemeModule), + + // VirtualFileExplorer module packages + typeof(AbpVirtualFileExplorerWebModule), + + // Account module packages + typeof(AbpAccountWebModule), + typeof(AbpAccountHttpApiModule), + typeof(AbpAccountApplicationModule), + + // Identity module packages + typeof(AbpPermissionManagementDomainIdentityModule), + typeof(AbpIdentityWebModule), + typeof(AbpIdentityHttpApiModule), + typeof(AbpIdentityApplicationModule), + typeof(AbpIdentityEntityFrameworkCoreModule), + + // Permission Management module packages + typeof(AbpPermissionManagementWebModule), + typeof(AbpPermissionManagementApplicationModule), + typeof(AbpPermissionManagementHttpApiModule), + typeof(AbpPermissionManagementEntityFrameworkCoreModule), + typeof(AbpEntityFrameworkCoreSqlServerModule) +)] +public class DemoAppModule : AbpModule +{ + public override void ConfigureServices(ServiceConfigurationContext context) + { + Configure(options => + { + options.SaveStaticPermissionsToDatabase = false; + }); + + Configure(options => + { + options.IsEnabled = true; + }); + + Configure(options => + { + options.Languages.Add(new LanguageInfo("en", "en", "English")); + options.Languages.Add(new LanguageInfo("tr", "tr", "TürkƧe")); + options.Languages.Add(new LanguageInfo("zh-Hans", "zh-Hans", "简体中文")); + }); + + context.Services.AddAbpDbContext(options => + { + options.AddDefaultRepositories(includeAllEntities: true); + }); + + Configure(options => + { + options.Configure(configurationContext => + { + configurationContext.UseSqlServer(); + }); + }); + } + + public async override Task OnApplicationInitializationAsync(ApplicationInitializationContext context) + { + await context.ServiceProvider + .GetRequiredService() + .Database + .MigrateAsync(); + + await context.ServiceProvider + .GetRequiredService() + .SeedAsync(); + + var app = context.GetApplicationBuilder(); + var env = context.GetEnvironment(); + + if (env.IsDevelopment()) + { + app.UseDeveloperExceptionPage(); + } + + app.UseAbpRequestLocalization(); + + if (!env.IsDevelopment()) + { + app.UseErrorPage(); + } + + app.MapAbpStaticAssets(); + + app.UseRouting(); + app.UseUnitOfWork(); + app.UseAuthentication(); + app.UseMultiTenancy(); + app.UseAuthorization(); + app.UseConfiguredEndpoints(); + } +} diff --git a/modules/virtual-file-explorer/app/Directory.Packages.props b/modules/virtual-file-explorer/app/Directory.Packages.props new file mode 100644 index 0000000000..c416fb784b --- /dev/null +++ b/modules/virtual-file-explorer/app/Directory.Packages.props @@ -0,0 +1,5 @@ + + + false + + \ No newline at end of file diff --git a/modules/virtual-file-explorer/app/Migrations/20250315060727_Initial.Designer.cs b/modules/virtual-file-explorer/app/Migrations/20250315060727_Initial.Designer.cs new file mode 100644 index 0000000000..016aade1a7 --- /dev/null +++ b/modules/virtual-file-explorer/app/Migrations/20250315060727_Initial.Designer.cs @@ -0,0 +1,985 @@ +// +using System; +using DemoApp.Data; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Volo.Abp.EntityFrameworkCore; + +#nullable disable + +namespace DemoApp.Migrations +{ + [DbContext(typeof(DemoAppDbContext))] + [Migration("20250315060727_Initial")] + partial class Initial + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) + .HasAnnotation("ProductVersion", "9.0.2") + .HasAnnotation("Relational:MaxIdentifierLength", 128); + + SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityClaimType", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("Description") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsStatic") + .HasColumnType("bit"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("Regex") + .HasMaxLength(512) + .HasColumnType("nvarchar(512)"); + + b.Property("RegexDescription") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("Required") + .HasColumnType("bit"); + + b.Property("ValueType") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.ToTable("AbpClaimTypes", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityLinkUser", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("SourceTenantId") + .HasColumnType("uniqueidentifier"); + + b.Property("SourceUserId") + .HasColumnType("uniqueidentifier"); + + b.Property("TargetTenantId") + .HasColumnType("uniqueidentifier"); + + b.Property("TargetUserId") + .HasColumnType("uniqueidentifier"); + + b.HasKey("Id"); + + b.HasIndex("SourceUserId", "SourceTenantId", "TargetUserId", "TargetTenantId") + .IsUnique() + .HasFilter("[SourceTenantId] IS NOT NULL AND [TargetTenantId] IS NOT NULL"); + + b.ToTable("AbpLinkUsers", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityRole", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("EntityVersion") + .HasColumnType("int"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsDefault") + .HasColumnType("bit") + .HasColumnName("IsDefault"); + + b.Property("IsPublic") + .HasColumnType("bit") + .HasColumnName("IsPublic"); + + b.Property("IsStatic") + .HasColumnType("bit") + .HasColumnName("IsStatic"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("NormalizedName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedName"); + + b.ToTable("AbpRoles", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityRoleClaim", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("ClaimType") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ClaimValue") + .HasMaxLength(1024) + .HasColumnType("nvarchar(1024)"); + + b.Property("RoleId") + .HasColumnType("uniqueidentifier"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("AbpRoleClaims", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentitySecurityLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("Action") + .HasMaxLength(96) + .HasColumnType("nvarchar(96)"); + + b.Property("ApplicationName") + .HasMaxLength(96) + .HasColumnType("nvarchar(96)"); + + b.Property("BrowserInfo") + .HasMaxLength(512) + .HasColumnType("nvarchar(512)"); + + b.Property("ClientId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ClientIpAddress") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CorrelationId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("CreationTime") + .HasColumnType("datetime2"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("Identity") + .HasMaxLength(96) + .HasColumnType("nvarchar(96)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("TenantName") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "Action"); + + b.HasIndex("TenantId", "ApplicationName"); + + b.HasIndex("TenantId", "Identity"); + + b.HasIndex("TenantId", "UserId"); + + b.ToTable("AbpSecurityLogs", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentitySession", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ClientId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("Device") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("DeviceInfo") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IpAddresses") + .HasMaxLength(2048) + .HasColumnType("nvarchar(2048)"); + + b.Property("LastAccessed") + .HasColumnType("datetime2"); + + b.Property("SessionId") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("SignedIn") + .HasColumnType("datetime2"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.HasKey("Id"); + + b.HasIndex("Device"); + + b.HasIndex("SessionId"); + + b.HasIndex("TenantId", "UserId"); + + b.ToTable("AbpSessions", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUser", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("AccessFailedCount") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasDefaultValue(0) + .HasColumnName("AccessFailedCount"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("Email") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("Email"); + + b.Property("EmailConfirmed") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("EmailConfirmed"); + + b.Property("EntityVersion") + .HasColumnType("int"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsActive") + .HasColumnType("bit") + .HasColumnName("IsActive"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("IsExternal") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsExternal"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("LastPasswordChangeTime") + .HasColumnType("datetimeoffset"); + + b.Property("LockoutEnabled") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("LockoutEnabled"); + + b.Property("LockoutEnd") + .HasColumnType("datetimeoffset"); + + b.Property("Name") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)") + .HasColumnName("Name"); + + b.Property("NormalizedEmail") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("NormalizedEmail"); + + b.Property("NormalizedUserName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("NormalizedUserName"); + + b.Property("PasswordHash") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("PasswordHash"); + + b.Property("PhoneNumber") + .HasMaxLength(16) + .HasColumnType("nvarchar(16)") + .HasColumnName("PhoneNumber"); + + b.Property("PhoneNumberConfirmed") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("PhoneNumberConfirmed"); + + b.Property("SecurityStamp") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("SecurityStamp"); + + b.Property("ShouldChangePasswordOnNextLogin") + .HasColumnType("bit"); + + b.Property("Surname") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)") + .HasColumnName("Surname"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("TwoFactorEnabled") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("TwoFactorEnabled"); + + b.Property("UserName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("UserName"); + + b.HasKey("Id"); + + b.HasIndex("Email"); + + b.HasIndex("NormalizedEmail"); + + b.HasIndex("NormalizedUserName"); + + b.HasIndex("UserName"); + + b.ToTable("AbpUsers", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserClaim", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("ClaimType") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ClaimValue") + .HasMaxLength(1024) + .HasColumnType("nvarchar(1024)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("AbpUserClaims", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserDelegation", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("EndTime") + .HasColumnType("datetime2"); + + b.Property("SourceUserId") + .HasColumnType("uniqueidentifier"); + + b.Property("StartTime") + .HasColumnType("datetime2"); + + b.Property("TargetUserId") + .HasColumnType("uniqueidentifier"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.ToTable("AbpUserDelegations", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserLogin", b => + { + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("LoginProvider") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ProviderDisplayName") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ProviderKey") + .IsRequired() + .HasMaxLength(196) + .HasColumnType("nvarchar(196)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("UserId", "LoginProvider"); + + b.HasIndex("LoginProvider", "ProviderKey"); + + b.ToTable("AbpUserLogins", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserOrganizationUnit", b => + { + b.Property("OrganizationUnitId") + .HasColumnType("uniqueidentifier"); + + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("OrganizationUnitId", "UserId"); + + b.HasIndex("UserId", "OrganizationUnitId"); + + b.ToTable("AbpUserOrganizationUnits", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserRole", b => + { + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("RoleId") + .HasColumnType("uniqueidentifier"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId", "UserId"); + + b.ToTable("AbpUserRoles", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserToken", b => + { + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("LoginProvider") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("Name") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("Value") + .HasColumnType("nvarchar(max)"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("AbpUserTokens", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnit", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("Code") + .IsRequired() + .HasMaxLength(95) + .HasColumnType("nvarchar(95)") + .HasColumnName("Code"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)") + .HasColumnName("DisplayName"); + + b.Property("EntityVersion") + .HasColumnType("int"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("ParentId") + .HasColumnType("uniqueidentifier"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("Code"); + + b.HasIndex("ParentId"); + + b.ToTable("AbpOrganizationUnits", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnitRole", b => + { + b.Property("OrganizationUnitId") + .HasColumnType("uniqueidentifier"); + + b.Property("RoleId") + .HasColumnType("uniqueidentifier"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("OrganizationUnitId", "RoleId"); + + b.HasIndex("RoleId", "OrganizationUnitId"); + + b.ToTable("AbpOrganizationUnitRoles", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.PermissionManagement.PermissionDefinitionRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("GroupName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("IsEnabled") + .HasColumnType("bit"); + + b.Property("MultiTenancySide") + .HasColumnType("tinyint"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ParentName") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("Providers") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("StateCheckers") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.HasKey("Id"); + + b.HasIndex("GroupName"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("AbpPermissions", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.PermissionManagement.PermissionGrant", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ProviderKey") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ProviderName") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "Name", "ProviderName", "ProviderKey") + .IsUnique() + .HasFilter("[TenantId] IS NOT NULL"); + + b.ToTable("AbpPermissionGrants", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.PermissionManagement.PermissionGroupDefinitionRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.HasKey("Id"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("AbpPermissionGroups", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityRoleClaim", b => + { + b.HasOne("Volo.Abp.Identity.IdentityRole", null) + .WithMany("Claims") + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserClaim", b => + { + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("Claims") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserLogin", b => + { + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("Logins") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserOrganizationUnit", b => + { + b.HasOne("Volo.Abp.Identity.OrganizationUnit", null) + .WithMany() + .HasForeignKey("OrganizationUnitId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("OrganizationUnits") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserRole", b => + { + b.HasOne("Volo.Abp.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("Roles") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserToken", b => + { + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("Tokens") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnit", b => + { + b.HasOne("Volo.Abp.Identity.OrganizationUnit", null) + .WithMany() + .HasForeignKey("ParentId"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnitRole", b => + { + b.HasOne("Volo.Abp.Identity.OrganizationUnit", null) + .WithMany("Roles") + .HasForeignKey("OrganizationUnitId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Volo.Abp.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityRole", b => + { + b.Navigation("Claims"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUser", b => + { + b.Navigation("Claims"); + + b.Navigation("Logins"); + + b.Navigation("OrganizationUnits"); + + b.Navigation("Roles"); + + b.Navigation("Tokens"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnit", b => + { + b.Navigation("Roles"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/modules/virtual-file-explorer/app/Migrations/20250315060727_Initial.cs b/modules/virtual-file-explorer/app/Migrations/20250315060727_Initial.cs new file mode 100644 index 0000000000..1fc66a9503 --- /dev/null +++ b/modules/virtual-file-explorer/app/Migrations/20250315060727_Initial.cs @@ -0,0 +1,606 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace DemoApp.Migrations +{ + /// + public partial class Initial : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "AbpClaimTypes", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + Name = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + Required = table.Column(type: "bit", nullable: false), + IsStatic = table.Column(type: "bit", nullable: false), + Regex = table.Column(type: "nvarchar(512)", maxLength: 512, nullable: true), + RegexDescription = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true), + Description = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + ValueType = table.Column(type: "int", nullable: false), + CreationTime = table.Column(type: "datetime2", nullable: false), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: false), + ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpClaimTypes", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpLinkUsers", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + SourceUserId = table.Column(type: "uniqueidentifier", nullable: false), + SourceTenantId = table.Column(type: "uniqueidentifier", nullable: true), + TargetUserId = table.Column(type: "uniqueidentifier", nullable: false), + TargetTenantId = table.Column(type: "uniqueidentifier", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpLinkUsers", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpOrganizationUnits", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + ParentId = table.Column(type: "uniqueidentifier", nullable: true), + Code = table.Column(type: "nvarchar(95)", maxLength: 95, nullable: false), + DisplayName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + EntityVersion = table.Column(type: "int", nullable: false), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: false), + ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: false), + CreationTime = table.Column(type: "datetime2", nullable: false), + CreatorId = table.Column(type: "uniqueidentifier", nullable: true), + LastModificationTime = table.Column(type: "datetime2", nullable: true), + LastModifierId = table.Column(type: "uniqueidentifier", nullable: true), + IsDeleted = table.Column(type: "bit", nullable: false, defaultValue: false), + DeleterId = table.Column(type: "uniqueidentifier", nullable: true), + DeletionTime = table.Column(type: "datetime2", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpOrganizationUnits", x => x.Id); + table.ForeignKey( + name: "FK_AbpOrganizationUnits_AbpOrganizationUnits_ParentId", + column: x => x.ParentId, + principalTable: "AbpOrganizationUnits", + principalColumn: "Id"); + }); + + migrationBuilder.CreateTable( + name: "AbpPermissionGrants", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + Name = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + ProviderName = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), + ProviderKey = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpPermissionGrants", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpPermissionGroups", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + Name = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + DisplayName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpPermissionGroups", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpPermissions", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + GroupName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + Name = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + ParentName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true), + DisplayName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + IsEnabled = table.Column(type: "bit", nullable: false), + MultiTenancySide = table.Column(type: "tinyint", nullable: false), + Providers = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true), + StateCheckers = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpPermissions", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpRoles", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + Name = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + NormalizedName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + IsDefault = table.Column(type: "bit", nullable: false), + IsStatic = table.Column(type: "bit", nullable: false), + IsPublic = table.Column(type: "bit", nullable: false), + EntityVersion = table.Column(type: "int", nullable: false), + CreationTime = table.Column(type: "datetime2", nullable: false), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: false), + ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpRoles", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpSecurityLogs", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + ApplicationName = table.Column(type: "nvarchar(96)", maxLength: 96, nullable: true), + Identity = table.Column(type: "nvarchar(96)", maxLength: 96, nullable: true), + Action = table.Column(type: "nvarchar(96)", maxLength: 96, nullable: true), + UserId = table.Column(type: "uniqueidentifier", nullable: true), + UserName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + TenantName = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + ClientId = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + CorrelationId = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + ClientIpAddress = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + BrowserInfo = table.Column(type: "nvarchar(512)", maxLength: 512, nullable: true), + CreationTime = table.Column(type: "datetime2", nullable: false), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: false), + ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpSecurityLogs", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpSessions", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + SessionId = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + Device = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), + DeviceInfo = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + UserId = table.Column(type: "uniqueidentifier", nullable: false), + ClientId = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + IpAddresses = table.Column(type: "nvarchar(2048)", maxLength: 2048, nullable: true), + SignedIn = table.Column(type: "datetime2", nullable: false), + LastAccessed = table.Column(type: "datetime2", nullable: true), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpSessions", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpUserDelegations", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + SourceUserId = table.Column(type: "uniqueidentifier", nullable: false), + TargetUserId = table.Column(type: "uniqueidentifier", nullable: false), + StartTime = table.Column(type: "datetime2", nullable: false), + EndTime = table.Column(type: "datetime2", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpUserDelegations", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpUsers", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + UserName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + NormalizedUserName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + Name = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + Surname = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + Email = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + NormalizedEmail = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + EmailConfirmed = table.Column(type: "bit", nullable: false, defaultValue: false), + PasswordHash = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + SecurityStamp = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + IsExternal = table.Column(type: "bit", nullable: false, defaultValue: false), + PhoneNumber = table.Column(type: "nvarchar(16)", maxLength: 16, nullable: true), + PhoneNumberConfirmed = table.Column(type: "bit", nullable: false, defaultValue: false), + IsActive = table.Column(type: "bit", nullable: false), + TwoFactorEnabled = table.Column(type: "bit", nullable: false, defaultValue: false), + LockoutEnd = table.Column(type: "datetimeoffset", nullable: true), + LockoutEnabled = table.Column(type: "bit", nullable: false, defaultValue: false), + AccessFailedCount = table.Column(type: "int", nullable: false, defaultValue: 0), + ShouldChangePasswordOnNextLogin = table.Column(type: "bit", nullable: false), + EntityVersion = table.Column(type: "int", nullable: false), + LastPasswordChangeTime = table.Column(type: "datetimeoffset", nullable: true), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: false), + ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: false), + CreationTime = table.Column(type: "datetime2", nullable: false), + CreatorId = table.Column(type: "uniqueidentifier", nullable: true), + LastModificationTime = table.Column(type: "datetime2", nullable: true), + LastModifierId = table.Column(type: "uniqueidentifier", nullable: true), + IsDeleted = table.Column(type: "bit", nullable: false, defaultValue: false), + DeleterId = table.Column(type: "uniqueidentifier", nullable: true), + DeletionTime = table.Column(type: "datetime2", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpUsers", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpOrganizationUnitRoles", + columns: table => new + { + RoleId = table.Column(type: "uniqueidentifier", nullable: false), + OrganizationUnitId = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + CreationTime = table.Column(type: "datetime2", nullable: false), + CreatorId = table.Column(type: "uniqueidentifier", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpOrganizationUnitRoles", x => new { x.OrganizationUnitId, x.RoleId }); + table.ForeignKey( + name: "FK_AbpOrganizationUnitRoles_AbpOrganizationUnits_OrganizationUnitId", + column: x => x.OrganizationUnitId, + principalTable: "AbpOrganizationUnits", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_AbpOrganizationUnitRoles_AbpRoles_RoleId", + column: x => x.RoleId, + principalTable: "AbpRoles", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AbpRoleClaims", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + RoleId = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + ClaimType = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + ClaimValue = table.Column(type: "nvarchar(1024)", maxLength: 1024, nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpRoleClaims", x => x.Id); + table.ForeignKey( + name: "FK_AbpRoleClaims_AbpRoles_RoleId", + column: x => x.RoleId, + principalTable: "AbpRoles", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AbpUserClaims", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + UserId = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + ClaimType = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + ClaimValue = table.Column(type: "nvarchar(1024)", maxLength: 1024, nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpUserClaims", x => x.Id); + table.ForeignKey( + name: "FK_AbpUserClaims_AbpUsers_UserId", + column: x => x.UserId, + principalTable: "AbpUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AbpUserLogins", + columns: table => new + { + UserId = table.Column(type: "uniqueidentifier", nullable: false), + LoginProvider = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + ProviderKey = table.Column(type: "nvarchar(196)", maxLength: 196, nullable: false), + ProviderDisplayName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpUserLogins", x => new { x.UserId, x.LoginProvider }); + table.ForeignKey( + name: "FK_AbpUserLogins_AbpUsers_UserId", + column: x => x.UserId, + principalTable: "AbpUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AbpUserOrganizationUnits", + columns: table => new + { + UserId = table.Column(type: "uniqueidentifier", nullable: false), + OrganizationUnitId = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + CreationTime = table.Column(type: "datetime2", nullable: false), + CreatorId = table.Column(type: "uniqueidentifier", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpUserOrganizationUnits", x => new { x.OrganizationUnitId, x.UserId }); + table.ForeignKey( + name: "FK_AbpUserOrganizationUnits_AbpOrganizationUnits_OrganizationUnitId", + column: x => x.OrganizationUnitId, + principalTable: "AbpOrganizationUnits", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_AbpUserOrganizationUnits_AbpUsers_UserId", + column: x => x.UserId, + principalTable: "AbpUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AbpUserRoles", + columns: table => new + { + UserId = table.Column(type: "uniqueidentifier", nullable: false), + RoleId = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpUserRoles", x => new { x.UserId, x.RoleId }); + table.ForeignKey( + name: "FK_AbpUserRoles_AbpRoles_RoleId", + column: x => x.RoleId, + principalTable: "AbpRoles", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_AbpUserRoles_AbpUsers_UserId", + column: x => x.UserId, + principalTable: "AbpUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AbpUserTokens", + columns: table => new + { + UserId = table.Column(type: "uniqueidentifier", nullable: false), + LoginProvider = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), + Name = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + Value = table.Column(type: "nvarchar(max)", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpUserTokens", x => new { x.UserId, x.LoginProvider, x.Name }); + table.ForeignKey( + name: "FK_AbpUserTokens_AbpUsers_UserId", + column: x => x.UserId, + principalTable: "AbpUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateIndex( + name: "IX_AbpLinkUsers_SourceUserId_SourceTenantId_TargetUserId_TargetTenantId", + table: "AbpLinkUsers", + columns: new[] { "SourceUserId", "SourceTenantId", "TargetUserId", "TargetTenantId" }, + unique: true, + filter: "[SourceTenantId] IS NOT NULL AND [TargetTenantId] IS NOT NULL"); + + migrationBuilder.CreateIndex( + name: "IX_AbpOrganizationUnitRoles_RoleId_OrganizationUnitId", + table: "AbpOrganizationUnitRoles", + columns: new[] { "RoleId", "OrganizationUnitId" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpOrganizationUnits_Code", + table: "AbpOrganizationUnits", + column: "Code"); + + migrationBuilder.CreateIndex( + name: "IX_AbpOrganizationUnits_ParentId", + table: "AbpOrganizationUnits", + column: "ParentId"); + + migrationBuilder.CreateIndex( + name: "IX_AbpPermissionGrants_TenantId_Name_ProviderName_ProviderKey", + table: "AbpPermissionGrants", + columns: new[] { "TenantId", "Name", "ProviderName", "ProviderKey" }, + unique: true, + filter: "[TenantId] IS NOT NULL"); + + migrationBuilder.CreateIndex( + name: "IX_AbpPermissionGroups_Name", + table: "AbpPermissionGroups", + column: "Name", + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_AbpPermissions_GroupName", + table: "AbpPermissions", + column: "GroupName"); + + migrationBuilder.CreateIndex( + name: "IX_AbpPermissions_Name", + table: "AbpPermissions", + column: "Name", + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_AbpRoleClaims_RoleId", + table: "AbpRoleClaims", + column: "RoleId"); + + migrationBuilder.CreateIndex( + name: "IX_AbpRoles_NormalizedName", + table: "AbpRoles", + column: "NormalizedName"); + + migrationBuilder.CreateIndex( + name: "IX_AbpSecurityLogs_TenantId_Action", + table: "AbpSecurityLogs", + columns: new[] { "TenantId", "Action" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpSecurityLogs_TenantId_ApplicationName", + table: "AbpSecurityLogs", + columns: new[] { "TenantId", "ApplicationName" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpSecurityLogs_TenantId_Identity", + table: "AbpSecurityLogs", + columns: new[] { "TenantId", "Identity" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpSecurityLogs_TenantId_UserId", + table: "AbpSecurityLogs", + columns: new[] { "TenantId", "UserId" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpSessions_Device", + table: "AbpSessions", + column: "Device"); + + migrationBuilder.CreateIndex( + name: "IX_AbpSessions_SessionId", + table: "AbpSessions", + column: "SessionId"); + + migrationBuilder.CreateIndex( + name: "IX_AbpSessions_TenantId_UserId", + table: "AbpSessions", + columns: new[] { "TenantId", "UserId" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpUserClaims_UserId", + table: "AbpUserClaims", + column: "UserId"); + + migrationBuilder.CreateIndex( + name: "IX_AbpUserLogins_LoginProvider_ProviderKey", + table: "AbpUserLogins", + columns: new[] { "LoginProvider", "ProviderKey" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpUserOrganizationUnits_UserId_OrganizationUnitId", + table: "AbpUserOrganizationUnits", + columns: new[] { "UserId", "OrganizationUnitId" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpUserRoles_RoleId_UserId", + table: "AbpUserRoles", + columns: new[] { "RoleId", "UserId" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpUsers_Email", + table: "AbpUsers", + column: "Email"); + + migrationBuilder.CreateIndex( + name: "IX_AbpUsers_NormalizedEmail", + table: "AbpUsers", + column: "NormalizedEmail"); + + migrationBuilder.CreateIndex( + name: "IX_AbpUsers_NormalizedUserName", + table: "AbpUsers", + column: "NormalizedUserName"); + + migrationBuilder.CreateIndex( + name: "IX_AbpUsers_UserName", + table: "AbpUsers", + column: "UserName"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "AbpClaimTypes"); + + migrationBuilder.DropTable( + name: "AbpLinkUsers"); + + migrationBuilder.DropTable( + name: "AbpOrganizationUnitRoles"); + + migrationBuilder.DropTable( + name: "AbpPermissionGrants"); + + migrationBuilder.DropTable( + name: "AbpPermissionGroups"); + + migrationBuilder.DropTable( + name: "AbpPermissions"); + + migrationBuilder.DropTable( + name: "AbpRoleClaims"); + + migrationBuilder.DropTable( + name: "AbpSecurityLogs"); + + migrationBuilder.DropTable( + name: "AbpSessions"); + + migrationBuilder.DropTable( + name: "AbpUserClaims"); + + migrationBuilder.DropTable( + name: "AbpUserDelegations"); + + migrationBuilder.DropTable( + name: "AbpUserLogins"); + + migrationBuilder.DropTable( + name: "AbpUserOrganizationUnits"); + + migrationBuilder.DropTable( + name: "AbpUserRoles"); + + migrationBuilder.DropTable( + name: "AbpUserTokens"); + + migrationBuilder.DropTable( + name: "AbpOrganizationUnits"); + + migrationBuilder.DropTable( + name: "AbpRoles"); + + migrationBuilder.DropTable( + name: "AbpUsers"); + } + } +} diff --git a/modules/virtual-file-explorer/app/Migrations/DemoAppDbContextModelSnapshot.cs b/modules/virtual-file-explorer/app/Migrations/DemoAppDbContextModelSnapshot.cs new file mode 100644 index 0000000000..2dc39f2526 --- /dev/null +++ b/modules/virtual-file-explorer/app/Migrations/DemoAppDbContextModelSnapshot.cs @@ -0,0 +1,982 @@ +// +using System; +using DemoApp.Data; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Volo.Abp.EntityFrameworkCore; + +#nullable disable + +namespace DemoApp.Migrations +{ + [DbContext(typeof(DemoAppDbContext))] + partial class DemoAppDbContextModelSnapshot : ModelSnapshot + { + protected override void BuildModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) + .HasAnnotation("ProductVersion", "9.0.2") + .HasAnnotation("Relational:MaxIdentifierLength", 128); + + SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityClaimType", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("Description") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsStatic") + .HasColumnType("bit"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("Regex") + .HasMaxLength(512) + .HasColumnType("nvarchar(512)"); + + b.Property("RegexDescription") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("Required") + .HasColumnType("bit"); + + b.Property("ValueType") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.ToTable("AbpClaimTypes", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityLinkUser", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("SourceTenantId") + .HasColumnType("uniqueidentifier"); + + b.Property("SourceUserId") + .HasColumnType("uniqueidentifier"); + + b.Property("TargetTenantId") + .HasColumnType("uniqueidentifier"); + + b.Property("TargetUserId") + .HasColumnType("uniqueidentifier"); + + b.HasKey("Id"); + + b.HasIndex("SourceUserId", "SourceTenantId", "TargetUserId", "TargetTenantId") + .IsUnique() + .HasFilter("[SourceTenantId] IS NOT NULL AND [TargetTenantId] IS NOT NULL"); + + b.ToTable("AbpLinkUsers", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityRole", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("EntityVersion") + .HasColumnType("int"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsDefault") + .HasColumnType("bit") + .HasColumnName("IsDefault"); + + b.Property("IsPublic") + .HasColumnType("bit") + .HasColumnName("IsPublic"); + + b.Property("IsStatic") + .HasColumnType("bit") + .HasColumnName("IsStatic"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("NormalizedName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedName"); + + b.ToTable("AbpRoles", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityRoleClaim", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("ClaimType") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ClaimValue") + .HasMaxLength(1024) + .HasColumnType("nvarchar(1024)"); + + b.Property("RoleId") + .HasColumnType("uniqueidentifier"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("AbpRoleClaims", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentitySecurityLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("Action") + .HasMaxLength(96) + .HasColumnType("nvarchar(96)"); + + b.Property("ApplicationName") + .HasMaxLength(96) + .HasColumnType("nvarchar(96)"); + + b.Property("BrowserInfo") + .HasMaxLength(512) + .HasColumnType("nvarchar(512)"); + + b.Property("ClientId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ClientIpAddress") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CorrelationId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("CreationTime") + .HasColumnType("datetime2"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("Identity") + .HasMaxLength(96) + .HasColumnType("nvarchar(96)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("TenantName") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "Action"); + + b.HasIndex("TenantId", "ApplicationName"); + + b.HasIndex("TenantId", "Identity"); + + b.HasIndex("TenantId", "UserId"); + + b.ToTable("AbpSecurityLogs", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentitySession", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ClientId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("Device") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("DeviceInfo") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IpAddresses") + .HasMaxLength(2048) + .HasColumnType("nvarchar(2048)"); + + b.Property("LastAccessed") + .HasColumnType("datetime2"); + + b.Property("SessionId") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("SignedIn") + .HasColumnType("datetime2"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.HasKey("Id"); + + b.HasIndex("Device"); + + b.HasIndex("SessionId"); + + b.HasIndex("TenantId", "UserId"); + + b.ToTable("AbpSessions", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUser", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("AccessFailedCount") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasDefaultValue(0) + .HasColumnName("AccessFailedCount"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("Email") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("Email"); + + b.Property("EmailConfirmed") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("EmailConfirmed"); + + b.Property("EntityVersion") + .HasColumnType("int"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsActive") + .HasColumnType("bit") + .HasColumnName("IsActive"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("IsExternal") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsExternal"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("LastPasswordChangeTime") + .HasColumnType("datetimeoffset"); + + b.Property("LockoutEnabled") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("LockoutEnabled"); + + b.Property("LockoutEnd") + .HasColumnType("datetimeoffset"); + + b.Property("Name") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)") + .HasColumnName("Name"); + + b.Property("NormalizedEmail") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("NormalizedEmail"); + + b.Property("NormalizedUserName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("NormalizedUserName"); + + b.Property("PasswordHash") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("PasswordHash"); + + b.Property("PhoneNumber") + .HasMaxLength(16) + .HasColumnType("nvarchar(16)") + .HasColumnName("PhoneNumber"); + + b.Property("PhoneNumberConfirmed") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("PhoneNumberConfirmed"); + + b.Property("SecurityStamp") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("SecurityStamp"); + + b.Property("ShouldChangePasswordOnNextLogin") + .HasColumnType("bit"); + + b.Property("Surname") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)") + .HasColumnName("Surname"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("TwoFactorEnabled") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("TwoFactorEnabled"); + + b.Property("UserName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("UserName"); + + b.HasKey("Id"); + + b.HasIndex("Email"); + + b.HasIndex("NormalizedEmail"); + + b.HasIndex("NormalizedUserName"); + + b.HasIndex("UserName"); + + b.ToTable("AbpUsers", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserClaim", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("ClaimType") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ClaimValue") + .HasMaxLength(1024) + .HasColumnType("nvarchar(1024)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("AbpUserClaims", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserDelegation", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("EndTime") + .HasColumnType("datetime2"); + + b.Property("SourceUserId") + .HasColumnType("uniqueidentifier"); + + b.Property("StartTime") + .HasColumnType("datetime2"); + + b.Property("TargetUserId") + .HasColumnType("uniqueidentifier"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.ToTable("AbpUserDelegations", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserLogin", b => + { + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("LoginProvider") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ProviderDisplayName") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ProviderKey") + .IsRequired() + .HasMaxLength(196) + .HasColumnType("nvarchar(196)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("UserId", "LoginProvider"); + + b.HasIndex("LoginProvider", "ProviderKey"); + + b.ToTable("AbpUserLogins", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserOrganizationUnit", b => + { + b.Property("OrganizationUnitId") + .HasColumnType("uniqueidentifier"); + + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("OrganizationUnitId", "UserId"); + + b.HasIndex("UserId", "OrganizationUnitId"); + + b.ToTable("AbpUserOrganizationUnits", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserRole", b => + { + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("RoleId") + .HasColumnType("uniqueidentifier"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId", "UserId"); + + b.ToTable("AbpUserRoles", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserToken", b => + { + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("LoginProvider") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("Name") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("Value") + .HasColumnType("nvarchar(max)"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("AbpUserTokens", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnit", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("Code") + .IsRequired() + .HasMaxLength(95) + .HasColumnType("nvarchar(95)") + .HasColumnName("Code"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)") + .HasColumnName("DisplayName"); + + b.Property("EntityVersion") + .HasColumnType("int"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("ParentId") + .HasColumnType("uniqueidentifier"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("Code"); + + b.HasIndex("ParentId"); + + b.ToTable("AbpOrganizationUnits", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnitRole", b => + { + b.Property("OrganizationUnitId") + .HasColumnType("uniqueidentifier"); + + b.Property("RoleId") + .HasColumnType("uniqueidentifier"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("OrganizationUnitId", "RoleId"); + + b.HasIndex("RoleId", "OrganizationUnitId"); + + b.ToTable("AbpOrganizationUnitRoles", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.PermissionManagement.PermissionDefinitionRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("GroupName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("IsEnabled") + .HasColumnType("bit"); + + b.Property("MultiTenancySide") + .HasColumnType("tinyint"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ParentName") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("Providers") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("StateCheckers") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.HasKey("Id"); + + b.HasIndex("GroupName"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("AbpPermissions", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.PermissionManagement.PermissionGrant", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ProviderKey") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ProviderName") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "Name", "ProviderName", "ProviderKey") + .IsUnique() + .HasFilter("[TenantId] IS NOT NULL"); + + b.ToTable("AbpPermissionGrants", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.PermissionManagement.PermissionGroupDefinitionRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.HasKey("Id"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("AbpPermissionGroups", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityRoleClaim", b => + { + b.HasOne("Volo.Abp.Identity.IdentityRole", null) + .WithMany("Claims") + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserClaim", b => + { + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("Claims") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserLogin", b => + { + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("Logins") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserOrganizationUnit", b => + { + b.HasOne("Volo.Abp.Identity.OrganizationUnit", null) + .WithMany() + .HasForeignKey("OrganizationUnitId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("OrganizationUnits") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserRole", b => + { + b.HasOne("Volo.Abp.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("Roles") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserToken", b => + { + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("Tokens") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnit", b => + { + b.HasOne("Volo.Abp.Identity.OrganizationUnit", null) + .WithMany() + .HasForeignKey("ParentId"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnitRole", b => + { + b.HasOne("Volo.Abp.Identity.OrganizationUnit", null) + .WithMany("Roles") + .HasForeignKey("OrganizationUnitId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Volo.Abp.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityRole", b => + { + b.Navigation("Claims"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUser", b => + { + b.Navigation("Claims"); + + b.Navigation("Logins"); + + b.Navigation("OrganizationUnits"); + + b.Navigation("Roles"); + + b.Navigation("Tokens"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnit", b => + { + b.Navigation("Roles"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/modules/virtual-file-explorer/app/Pages/Index.cshtml b/modules/virtual-file-explorer/app/Pages/Index.cshtml new file mode 100644 index 0000000000..2b4fd37270 --- /dev/null +++ b/modules/virtual-file-explorer/app/Pages/Index.cshtml @@ -0,0 +1,4 @@ +@page +@using Volo.Abp.Users +@model DemoApp.Pages.IndexModel +@inject ICurrentUser CurrentUser diff --git a/modules/virtual-file-explorer/app/Pages/Index.cshtml.cs b/modules/virtual-file-explorer/app/Pages/Index.cshtml.cs new file mode 100644 index 0000000000..5f8da0f725 --- /dev/null +++ b/modules/virtual-file-explorer/app/Pages/Index.cshtml.cs @@ -0,0 +1,8 @@ +using Volo.Abp.AspNetCore.Mvc.UI.RazorPages; + +namespace DemoApp.Pages; + +public class IndexModel : AbpPageModel +{ + +} \ No newline at end of file diff --git a/modules/virtual-file-explorer/app/Pages/_ViewImports.cshtml b/modules/virtual-file-explorer/app/Pages/_ViewImports.cshtml new file mode 100644 index 0000000000..6d6bdbde94 --- /dev/null +++ b/modules/virtual-file-explorer/app/Pages/_ViewImports.cshtml @@ -0,0 +1,4 @@ +@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers +@addTagHelper *, Volo.Abp.AspNetCore.Mvc.UI +@addTagHelper *, Volo.Abp.AspNetCore.Mvc.UI.Bootstrap +@addTagHelper *, Volo.Abp.AspNetCore.Mvc.UI.Bundling \ No newline at end of file diff --git a/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/Program.cs b/modules/virtual-file-explorer/app/Program.cs similarity index 50% rename from modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/Program.cs rename to modules/virtual-file-explorer/app/Program.cs index 4b2c43079c..3471652b7c 100644 --- a/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/Program.cs +++ b/modules/virtual-file-explorer/app/Program.cs @@ -1,47 +1,46 @@ -using System; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Builder; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Hosting; -using Serilog; -using Serilog.Events; - -namespace Volo.Abp.VirtualFileExplorer.DemoApp; - -public class Program -{ - public static async Task Main(string[] args) - { - Log.Logger = new LoggerConfiguration() - .MinimumLevel.Debug() - .MinimumLevel.Override("Microsoft", LogEventLevel.Information) - .Enrich.FromLogContext() - .WriteTo.File("Logs/logs.txt") - .CreateLogger(); - - try - { - Log.Information("Starting web host."); +using Serilog; +using Serilog.Events; + +namespace DemoApp; + +public class Program +{ + public async static Task Main(string[] args) + { + Log.Logger = new LoggerConfiguration() + .MinimumLevel.Debug() + .MinimumLevel.Override("Microsoft", LogEventLevel.Information) + .MinimumLevel.Override("Microsoft.EntityFrameworkCore", LogEventLevel.Warning) + .WriteTo.Async(c => c.Console()) + .CreateLogger(); + + try + { var builder = WebApplication.CreateBuilder(args); - builder.Host - .AddAppSettingsSecretsJson() - .UseSerilog() + builder.Host.AddAppSettingsSecretsJson() .UseAutofac() - ; - await builder.AddApplicationAsync(); + .UseSerilog(); + + await builder.AddApplicationAsync(); var app = builder.Build(); await app.InitializeApplicationAsync(); - await app.RunAsync(); - return 0; - } - catch (Exception ex) - { - Log.Fatal(ex, "Host terminated unexpectedly!"); - return 1; - } - finally - { - Log.CloseAndFlush(); - } - } -} + Log.Information("Starting DemoApp."); + await app.RunAsync(); + return 0; + } + catch (Exception ex) + { + if (ex is HostAbortedException) + { + throw; + } + + Log.Fatal(ex, "DemoApp terminated unexpectedly!"); + return 1; + } + finally + { + Log.CloseAndFlush(); + } + } +} diff --git a/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/Properties/launchSettings.json b/modules/virtual-file-explorer/app/Properties/launchSettings.json similarity index 70% rename from modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/Properties/launchSettings.json rename to modules/virtual-file-explorer/app/Properties/launchSettings.json index 83b0d02709..c0680d491c 100644 --- a/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/Properties/launchSettings.json +++ b/modules/virtual-file-explorer/app/Properties/launchSettings.json @@ -3,8 +3,8 @@ "windowsAuthentication": false, "anonymousAuthentication": true, "iisExpress": { - "applicationUrl": "http://localhost:51233", - "sslPort": 44377 + "applicationUrl": "https://localhost:44391/", + "sslPort": 44391 } }, "profiles": { @@ -15,13 +15,13 @@ "ASPNETCORE_ENVIRONMENT": "Development" } }, - "Volo.Abp.VirtualFileExplorer.DemoApp": { + "DemoApp": { "commandName": "Project", "launchBrowser": true, - "applicationUrl": "https://localhost:5001;http://localhost:5000", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" - } + }, + "applicationUrl": "https://localhost:44391/" } } -} +} \ No newline at end of file diff --git a/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/AbpVirtualFileExplorerDemoAppModule.cs b/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/AbpVirtualFileExplorerDemoAppModule.cs deleted file mode 100644 index c7cc5f4484..0000000000 --- a/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/AbpVirtualFileExplorerDemoAppModule.cs +++ /dev/null @@ -1,46 +0,0 @@ -using Microsoft.AspNetCore.Builder; -using Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic; -using Volo.Abp.Autofac; -using Volo.Abp.Localization; -using Volo.Abp.Modularity; -using Volo.Abp.VirtualFileExplorer.Web; - -namespace Volo.Abp.VirtualFileExplorer.DemoApp; - -[DependsOn( - typeof(AbpAutofacModule), - typeof(AbpAspNetCoreMvcUiBasicThemeModule), - typeof(AbpVirtualFileExplorerWebModule) -)] -public class AbpVirtualFileExplorerDemoAppModule : AbpModule -{ - public override void ConfigureServices(ServiceConfigurationContext context) - { - Configure(options => - { - options.Languages.Add(new LanguageInfo("cs", "cs", "ČeÅ”tina")); - options.Languages.Add(new LanguageInfo("en", "en", "English")); - options.Languages.Add(new LanguageInfo("fi", "fi", "Finnish")); - options.Languages.Add(new LanguageInfo("fr", "fr", "FranƧais")); - options.Languages.Add(new LanguageInfo("hi", "hi", "Hindi")); - options.Languages.Add(new LanguageInfo("is", "is", "Icelandic")); - options.Languages.Add(new LanguageInfo("it", "it", "Italiano")); - options.Languages.Add(new LanguageInfo("hu", "hu", "Magyar")); - options.Languages.Add(new LanguageInfo("ro-RO", "ro-RO", "RomĆ¢nă")); - options.Languages.Add(new LanguageInfo("sk", "sk", "Slovak")); - options.Languages.Add(new LanguageInfo("tr", "tr", "TürkƧe")); - options.Languages.Add(new LanguageInfo("zh-Hans", "zh-Hans", "简体中文")); - options.Languages.Add(new LanguageInfo("el", "el", "Ελληνικά")); - }); - } - - public override void OnApplicationInitialization(ApplicationInitializationContext context) - { - var app = context.GetApplicationBuilder(); - - app.MapAbpStaticAssets(); - app.UseRouting(); - app.UseAbpRequestLocalization(); - app.UseConfiguredEndpoints(); - } -} diff --git a/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/Branding/AbpVirtualFileExplorerDemoAppBrandingProvider.cs b/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/Branding/AbpVirtualFileExplorerDemoAppBrandingProvider.cs deleted file mode 100644 index 89659be15c..0000000000 --- a/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/Branding/AbpVirtualFileExplorerDemoAppBrandingProvider.cs +++ /dev/null @@ -1,19 +0,0 @@ -using Volo.Abp.Ui.Branding; -using Volo.Abp.DependencyInjection; - -namespace Volo.Abp.VirtualFileExplorer.DemoApp.Branding; - -[Dependency(ReplaceServices = true)] -public class AbpVirtualFileExplorerDemoAppBrandingProvider : DefaultBrandingProvider -{ - public AbpVirtualFileExplorerDemoAppBrandingProvider() - { - AppName = "Virtual file explorer demo app"; - - - } - - public override string AppName { get; } - - public override string LogoUrl { get; } -} diff --git a/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/Pages/Index.cshtml b/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/Pages/Index.cshtml deleted file mode 100644 index fb6ccb3305..0000000000 --- a/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/Pages/Index.cshtml +++ /dev/null @@ -1,14 +0,0 @@ -@page - -@model Volo.Abp.VirtualFileExplorer.DemoApp.Pages.IndexModel - -
    -
    -
    -

    Virtual file explprer demo application

    -
    -
    -
    - abp.io - -
    diff --git a/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/Pages/Index.cshtml.cs b/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/Pages/Index.cshtml.cs deleted file mode 100644 index 779bdd97e8..0000000000 --- a/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/Pages/Index.cshtml.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Mvc; -using Microsoft.AspNetCore.Mvc.RazorPages; -using Microsoft.Extensions.Logging; - -namespace Volo.Abp.VirtualFileExplorer.DemoApp.Pages; - -public class IndexModel : PageModel -{ - private readonly ILogger _logger; - - public IndexModel(ILogger logger) - { - _logger = logger; - } - - public void OnGet() - { - } -} diff --git a/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/Pages/_ViewImports.cshtml b/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/Pages/_ViewImports.cshtml deleted file mode 100644 index 231948b339..0000000000 --- a/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/Pages/_ViewImports.cshtml +++ /dev/null @@ -1,4 +0,0 @@ -@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers -@addTagHelper *, Volo.Abp.AspNetCore.Mvc.UI -@addTagHelper *, Volo.Abp.AspNetCore.Mvc.UI.Bootstrap -@addTagHelper *, Volo.Abp.AspNetCore.Mvc.UI.Bundling diff --git a/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/Volo.Abp.VirtualFileExplorer.DemoApp.abppkg b/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/Volo.Abp.VirtualFileExplorer.DemoApp.abppkg deleted file mode 100644 index 9e26dfeeb6..0000000000 --- a/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/Volo.Abp.VirtualFileExplorer.DemoApp.abppkg +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/Volo.Abp.VirtualFileExplorer.DemoApp.abppkg.analyze.json b/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/Volo.Abp.VirtualFileExplorer.DemoApp.abppkg.analyze.json deleted file mode 100644 index ad8a90c8bd..0000000000 --- a/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/Volo.Abp.VirtualFileExplorer.DemoApp.abppkg.analyze.json +++ /dev/null @@ -1,73 +0,0 @@ -{ - "name": "Volo.Abp.VirtualFileExplorer.DemoApp", - "hash": "a8ae8e893f31975f0699e38091b149aa", - "contents": [ - { - "namespace": "Volo.Abp.VirtualFileExplorer.DemoApp", - "dependsOnModules": [ - { - "declaringAssemblyName": "Volo.Abp.Autofac", - "namespace": "Volo.Abp.Autofac", - "name": "AbpAutofacModule" - }, - { - "declaringAssemblyName": "Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic", - "namespace": "Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic", - "name": "AbpAspNetCoreMvcUiBasicThemeModule" - }, - { - "declaringAssemblyName": "Volo.Abp.VirtualFileExplorer.Web", - "namespace": "Volo.Abp.VirtualFileExplorer.Web", - "name": "AbpVirtualFileExplorerWebModule" - } - ], - "implementingInterfaces": [ - { - "name": "IAbpModule", - "namespace": "Volo.Abp.Modularity", - "declaringAssemblyName": "Volo.Abp.Core", - "fullName": "Volo.Abp.Modularity.IAbpModule" - }, - { - "name": "IOnPreApplicationInitialization", - "namespace": "Volo.Abp.Modularity", - "declaringAssemblyName": "Volo.Abp.Core", - "fullName": "Volo.Abp.Modularity.IOnPreApplicationInitialization" - }, - { - "name": "IOnApplicationInitialization", - "namespace": "Volo.Abp", - "declaringAssemblyName": "Volo.Abp.Core", - "fullName": "Volo.Abp.IOnApplicationInitialization" - }, - { - "name": "IOnPostApplicationInitialization", - "namespace": "Volo.Abp.Modularity", - "declaringAssemblyName": "Volo.Abp.Core", - "fullName": "Volo.Abp.Modularity.IOnPostApplicationInitialization" - }, - { - "name": "IOnApplicationShutdown", - "namespace": "Volo.Abp", - "declaringAssemblyName": "Volo.Abp.Core", - "fullName": "Volo.Abp.IOnApplicationShutdown" - }, - { - "name": "IPreConfigureServices", - "namespace": "Volo.Abp.Modularity", - "declaringAssemblyName": "Volo.Abp.Core", - "fullName": "Volo.Abp.Modularity.IPreConfigureServices" - }, - { - "name": "IPostConfigureServices", - "namespace": "Volo.Abp.Modularity", - "declaringAssemblyName": "Volo.Abp.Core", - "fullName": "Volo.Abp.Modularity.IPostConfigureServices" - } - ], - "contentType": "abpModule", - "name": "AbpVirtualFileExplorerDemoAppModule", - "summary": null - } - ] -} \ No newline at end of file diff --git a/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/Volo.Abp.VirtualFileExplorer.DemoApp.csproj b/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/Volo.Abp.VirtualFileExplorer.DemoApp.csproj deleted file mode 100644 index 683766e077..0000000000 --- a/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/Volo.Abp.VirtualFileExplorer.DemoApp.csproj +++ /dev/null @@ -1,33 +0,0 @@ - - - - net9.0 - aspnet-Volo.Abp.VirtualFileExplorer.DemoApp-234AF9E1-C3E0-4F8F-BD7D-840627CC8E46 - - - - - - - - - - - - - - - - - true - PreserveNewest - PreserveNewest - - - - - - - - - diff --git a/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/abp.resourcemapping.js b/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/abp.resourcemapping.js deleted file mode 100644 index 8c0bb53dad..0000000000 --- a/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/abp.resourcemapping.js +++ /dev/null @@ -1,12 +0,0 @@ -module.exports = { - aliases: { - "@node_modules": "./node_modules", - "@libs": "./wwwroot/libs" - }, - clean: [ - "@libs" - ], - mappings: { - - } -}; diff --git a/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/gulpfile.js b/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/gulpfile.js deleted file mode 100644 index f7ebc78f23..0000000000 --- a/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/gulpfile.js +++ /dev/null @@ -1,9 +0,0 @@ -"use strict"; - -var gulp = require("gulp"), - path = require('path'), - copyResources = require('./node_modules/@abp/aspnetcore.mvc.ui/gulp/copy-resources.js'); - -exports.default = function(){ - return copyResources(path.resolve('./')); -}; \ No newline at end of file diff --git a/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/package.json b/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/package.json deleted file mode 100644 index 9d8b6d6508..0000000000 --- a/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/package.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "name": "volo.virtualfileexplorer.dempapp", - "version": "1.0.0", - "private": true, - "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "~9.1.0-rc.3", - "@abp/virtual-file-explorer": "~9.1.0-rc.3" - } -} diff --git a/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/yarn.lock b/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/yarn.lock deleted file mode 100644 index f55a9133d7..0000000000 --- a/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/yarn.lock +++ /dev/null @@ -1,391 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@abp/aspnetcore.mvc.ui.theme.basic@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-9.1.0-rc.3.tgz#c291f2760d32a9745c4b15a62c13abec9b7e247f" - integrity sha512-f14SIEfZkvSgYBfM/rcDmn0mgkIHGqi6lRP7GeBRUPEhB944osyCFmJH3CWDjJcjTFbqWTvKVlDRsV0Roz5eqg== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~9.1.0-rc.3" - -"@abp/aspnetcore.mvc.ui.theme.shared@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-9.1.0-rc.3.tgz#c05d8b39fc1ef2a9c890c480cb1ec8f47ee10669" - integrity sha512-BTLoVlaYjKrW0Rhrqw4tNiHf5LV8/zBxh90OM7smKYPGOftHhSWSNUUSO5upOdOsVhNSPIxY83PF/LHp29kH8g== - dependencies: - "@abp/aspnetcore.mvc.ui" "~9.1.0-rc.3" - "@abp/bootstrap" "~9.1.0-rc.3" - "@abp/bootstrap-datepicker" "~9.1.0-rc.3" - "@abp/bootstrap-daterangepicker" "~9.1.0-rc.3" - "@abp/datatables.net-bs5" "~9.1.0-rc.3" - "@abp/font-awesome" "~9.1.0-rc.3" - "@abp/jquery-form" "~9.1.0-rc.3" - "@abp/jquery-validation-unobtrusive" "~9.1.0-rc.3" - "@abp/lodash" "~9.1.0-rc.3" - "@abp/luxon" "~9.1.0-rc.3" - "@abp/malihu-custom-scrollbar-plugin" "~9.1.0-rc.3" - "@abp/moment" "~9.1.0-rc.3" - "@abp/select2" "~9.1.0-rc.3" - "@abp/sweetalert2" "~9.1.0-rc.3" - "@abp/timeago" "~9.1.0-rc.3" - "@abp/toastr" "~9.1.0-rc.3" - -"@abp/aspnetcore.mvc.ui@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-9.1.0-rc.3.tgz#88252e0fb822fe9560ed89d2118c7b32a32ba496" - integrity sha512-WGjWNoN97uxjMc173w36UV8UVGxLbDrOcglnqK+RY+E9vIxFGDmWBvwzmJ1KfZRvlwahXtMjTCiYFKO411lh1w== - dependencies: - ansi-colors "^4.1.3" - -"@abp/bootstrap-datepicker@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-9.1.0-rc.3.tgz#8376fb204851b8e7be6fb5afe6e023f706426bc2" - integrity sha512-bKPeRpqzHlSCnItxesp+QnAewFcwuB1hmncRydhOg9ImvzRN0M9fAfSXeP7VTYH+2ygDKVEtK+8aAh1RjAryuA== - dependencies: - bootstrap-datepicker "^1.10.0" - -"@abp/bootstrap-daterangepicker@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-9.1.0-rc.3.tgz#f14dd37eb7a4fe4d6cb823da1ee80dc28154d0df" - integrity sha512-C7KXx1630JK4mOrMZEQoiH4vzQZn6JfrS6k8nAX0p48zRNcx8oxwviaojRcu+MjDl/rDHc5U9Xy9lBIurqLEKg== - dependencies: - bootstrap-daterangepicker "^3.1.0" - -"@abp/bootstrap@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-9.1.0-rc.3.tgz#01be98456635982e5b43a49318d0bcc55163fad7" - integrity sha512-Xi2TPaReFl3vnnFW974Cc4Sb25Iq+RwzkoGXiJFUiwGgYHbHHCd5Jd9Af6KYNchjP9SJKFYELwKZcQdxEIHauQ== - dependencies: - "@abp/core" "~9.1.0-rc.3" - bootstrap "^5.3.3" - -"@abp/clipboard@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-9.1.0-rc.3.tgz#85b38876ba259a235acfcea8bb85c0bf9309fa5c" - integrity sha512-3FSLFOpySYQfmlMlrhSEdC8mnLDUtXRBXwWNIBJMTNEKAt0E2Z/2TIefaPzPYzYkqNrXlq8qdOOkvxFm39y8WQ== - dependencies: - "@abp/core" "~9.1.0-rc.3" - clipboard "^2.0.11" - -"@abp/core@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-9.1.0-rc.3.tgz#4749bd60813ddceb156dec045e7f9eb0b3e19446" - integrity sha512-xYr9zbHCz+v672AuFWSmvqeo0CgAwZTr9laAp58QOCzO2QsVHuDUy60epGhIxCTRc3iCBkcelIFDFlGrN30WSw== - dependencies: - "@abp/utils" "~9.1.0-rc.3" - -"@abp/datatables.net-bs5@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-9.1.0-rc.3.tgz#984d6550124cf0221f8233306483aff72a38249e" - integrity sha512-qJ777clztaau92sLvDgsxIQdKnFpZqQqn3/N2y81eixELm/t/qRiE0ySNduNDnvzik6/uWmfnG82ToCmmTFP2g== - dependencies: - "@abp/datatables.net" "~9.1.0-rc.3" - datatables.net-bs5 "^2.1.8" - -"@abp/datatables.net@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-9.1.0-rc.3.tgz#5495345014b6dc3faa67415b2c37ee84b1e4dbbc" - integrity sha512-jKn9DIQrlxMU/dedYaFjfHADPuMfs+6nUojYDGUPd76Ov1TKFNA0N/6ipB7UMYd3xVPEEmgkBH8pqf0qR8D64w== - dependencies: - "@abp/jquery" "~9.1.0-rc.3" - datatables.net "^2.1.8" - -"@abp/font-awesome@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-9.1.0-rc.3.tgz#259dcac2f20da57a72b9c41129c465935abc125f" - integrity sha512-fAExSAn0VaPWfx9kPwIKB0xbSSMHZst/NiNXRPhIrCGty/PXp5OV8ao+mqKcsLQJTPFz1RaSxpdq/1s3tAiGWQ== - dependencies: - "@abp/core" "~9.1.0-rc.3" - "@fortawesome/fontawesome-free" "^6.6.0" - -"@abp/jquery-form@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-9.1.0-rc.3.tgz#c1ee21a5f38dcf0fdbb0c3e2db3f66bc81ae66b1" - integrity sha512-YJ2CDjJVbNpqs88CGgsHnPtJG4BjYLQ0XFVT+Ph9ar5YnuQrYfB60HMdtnQlqn337hkbzVx2XHLJ6h0tT8To9Q== - dependencies: - "@abp/jquery" "~9.1.0-rc.3" - jquery-form "^4.3.0" - -"@abp/jquery-validation-unobtrusive@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-9.1.0-rc.3.tgz#88976407a14276244a01a24daeda6b236298e917" - integrity sha512-Yac7l/rjHxdogPyMO8LlJklndDBCwZ+qLeTbCcYt7NQnnsnn+xXomSwjFWv8sguTVKG1eL68LquGUCbNwNfrUA== - dependencies: - "@abp/jquery-validation" "~9.1.0-rc.3" - jquery-validation-unobtrusive "^4.0.0" - -"@abp/jquery-validation@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-9.1.0-rc.3.tgz#1ff99dea2f2c52e58a50d06b51e0cbca15ff690c" - integrity sha512-YB1t1m+s+vHGuxSt0h4cgIMIpwRy129pjV08Jja1QtCFhE+VgA9hjvx0OVaVcm31aLLt/KU/+NrO36AbebL+zA== - dependencies: - "@abp/jquery" "~9.1.0-rc.3" - jquery-validation "^1.21.0" - -"@abp/jquery@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-9.1.0-rc.3.tgz#0386a2857271dc4c1e04da9e4b304637bbc2d696" - integrity sha512-1UqztwQ92m6kvYE+Tb0rj7iITHngKdGI5kEpZKOHrEWqnMKeEoPbO1cL+ZOWN0m162WJiliod1HEOxW8b9Ha2Q== - dependencies: - "@abp/core" "~9.1.0-rc.3" - jquery "~3.7.1" - -"@abp/lodash@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-9.1.0-rc.3.tgz#26f53847ed05a171d71c6c6f1ba33d8c4e2a624a" - integrity sha512-eUuNYTk6hla5kOdc5lOBVoKhMBfnkfXdawb+/LtwBwjCQym+XRTCenJhqzxii293xwd+0G1l5M+8VaPWFq6WWg== - dependencies: - "@abp/core" "~9.1.0-rc.3" - lodash "^4.17.21" - -"@abp/luxon@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-9.1.0-rc.3.tgz#0cfae9b2188c9827963e693dbfaaefcce714bdd9" - integrity sha512-UxtDDyLvHr3sPhrWX+uj9JrsN6idYKH+srOmAKC8+FOfWW/YdFAJmsYPLMCov7FoSWXHG+BQhkuXeCCBppyiVA== - dependencies: - "@abp/core" "~9.1.0-rc.3" - luxon "^3.5.0" - -"@abp/malihu-custom-scrollbar-plugin@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-9.1.0-rc.3.tgz#08071e21260f867fc2a7d7594dcdf30da921bb47" - integrity sha512-WDWcm4JsTzq4Se8Sg+v6U5ymjbfVOXsU2WR66RSUL8TSq3WM1MLuRaStDGxtt8nOLvPfqiPWIzb2BvsfyePNRw== - dependencies: - "@abp/core" "~9.1.0-rc.3" - malihu-custom-scrollbar-plugin "^3.1.5" - -"@abp/moment@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-9.1.0-rc.3.tgz#3cb5b000be73e4d681d3d115be98a8422a66e307" - integrity sha512-K30pG1xRGOJ5m7rJI6u5hKv5Lcjmqxqx7cekDf9HURzgpBGLCvMnnXFSx97w0LcPOYzCVxorfTdw6S3sC12idw== - dependencies: - moment "^2.30.1" - -"@abp/prismjs@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-9.1.0-rc.3.tgz#f77e1d264ef5b6c1ceb7bd1b4aee19bfce6e723b" - integrity sha512-/vtoR5oyEiVVvLPPsAS5qSI4THle/WqETTTTInpeVx6u/NEbeY9sBAUz+udS/fWJlyxIUN6He56ghoJNaWXYJw== - dependencies: - "@abp/clipboard" "~9.1.0-rc.3" - "@abp/core" "~9.1.0-rc.3" - prismjs "^1.29.0" - -"@abp/select2@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-9.1.0-rc.3.tgz#7bd050e4847c0b8366fd582200f27065ecc4ff57" - integrity sha512-0k5P+amCqNE2cPAGQpEwFl+vMssuKSbpZ0XgHfF0z3EcE1bAuYDo41nAfk/amsJn5Dt55xJcC+yesADkAXEeIA== - dependencies: - "@abp/core" "~9.1.0-rc.3" - select2 "^4.0.13" - -"@abp/sweetalert2@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-9.1.0-rc.3.tgz#69751518ea84b8a306478f48b516946363a7fa7f" - integrity sha512-iHk6JzD9qzmdvr/LjAwSVFfX1WmipzQNcCYwUB+kKe2uSfwufYz+9+iYjYcm7uVvZSd9LniIvzvQXyZlfMSy5w== - dependencies: - "@abp/core" "~9.1.0-rc.3" - sweetalert2 "^11.14.1" - -"@abp/timeago@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-9.1.0-rc.3.tgz#b1eb20d6c9fe47a6d0ace8565ea8289f1af9c0a1" - integrity sha512-7hq2+HHQ91/xXFGK417dkgFNKU7z49bVN7tkHLMJyKkJb1iP3N0gCz3HdkCRjnM6yrRXQDYUmO/zCv6yBwakjA== - dependencies: - "@abp/jquery" "~9.1.0-rc.3" - timeago "^1.6.7" - -"@abp/toastr@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-9.1.0-rc.3.tgz#de490bfd6b41919d96be0544aaaee3d457cf9f32" - integrity sha512-hLe3FXyplQmhRbvBZdLVt+6yRAfptAJzwU2S5iHbs5r4ncO1ampCClZNNLNmrCglDQ30ZkgrPg4SjHn9V6HyIQ== - dependencies: - "@abp/jquery" "~9.1.0-rc.3" - toastr "^2.1.4" - -"@abp/utils@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-9.1.0-rc.3.tgz#84de6ab4497c74b2c0c04f604dc6d542a50a1534" - integrity sha512-Tw9gNUAFjmieVrnril7YxwqthpSkZiY01uW60/+Dkd3jh9qZntqgzIcKG6/TXjimWK6iN8YZFOJ0cShCnHW0Jg== - dependencies: - just-compare "^2.3.0" - -"@abp/virtual-file-explorer@~9.1.0-rc.3": - version "9.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/virtual-file-explorer/-/virtual-file-explorer-9.1.0-rc.3.tgz#cdd1683a5a1648cface2fc4024f05f65715673a6" - integrity sha512-e0k9bEXNUxhRtgID+G8Fp212EzRNqs6UZhP3gEF2vKjP30PaOQvGAegm38kuHhA5xYAcWcSCVuvS3yjphLGJLA== - dependencies: - "@abp/clipboard" "~9.1.0-rc.3" - "@abp/prismjs" "~9.1.0-rc.3" - -"@fortawesome/fontawesome-free@^6.6.0": - version "6.6.0" - resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free/-/fontawesome-free-6.6.0.tgz#0e984f0f2344ee513c185d87d77defac4c0c8224" - integrity sha512-60G28ke/sXdtS9KZCpZSHHkCbdsOGEhIUGlwq6yhY74UpTiToIh8np7A8yphhM4BWsvNFtIvLpi4co+h9Mr9Ow== - -ansi-colors@^4.1.3: - version "4.1.3" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" - integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== - -bootstrap-datepicker@^1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/bootstrap-datepicker/-/bootstrap-datepicker-1.10.0.tgz#61612bbe8bf0a69a5bce32bbcdda93ebb6ccf24a" - integrity sha512-lWxtSYddAQOpbAO8UhYhHLcK6425eWoSjb5JDvZU3ePHEPF6A3eUr51WKaFy4PccU19JRxUG6wEU3KdhtKfvpg== - dependencies: - jquery ">=3.4.0 <4.0.0" - -bootstrap-daterangepicker@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/bootstrap-daterangepicker/-/bootstrap-daterangepicker-3.1.0.tgz#632e6fb2de4b6360c5c0a9d5f6adb9aace051fe8" - integrity sha512-oaQZx6ZBDo/dZNyXGVi2rx5GmFXThyQLAxdtIqjtLlYVaQUfQALl5JZMJJZzyDIX7blfy4ppZPAJ10g8Ma4d/g== - dependencies: - jquery ">=1.10" - moment "^2.9.0" - -bootstrap@^5.3.3: - version "5.3.3" - resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-5.3.3.tgz#de35e1a765c897ac940021900fcbb831602bac38" - integrity sha512-8HLCdWgyoMguSO9o+aH+iuZ+aht+mzW0u3HIMzVu7Srrpv7EBBxTnrFlSCskwdY1+EOFQSm7uMJhNQHkdPcmjg== - -clipboard@^2.0.11: - version "2.0.11" - resolved "https://registry.yarnpkg.com/clipboard/-/clipboard-2.0.11.tgz#62180360b97dd668b6b3a84ec226975762a70be5" - integrity sha512-C+0bbOqkezLIsmWSvlsXS0Q0bmkugu7jcfMIACB+RDEntIzQIkdr148we28AfSloQLRdZlYL/QYyrq05j/3Faw== - dependencies: - good-listener "^1.2.2" - select "^1.1.2" - tiny-emitter "^2.0.0" - -datatables.net-bs5@^2.1.8: - version "2.1.8" - resolved "https://registry.yarnpkg.com/datatables.net-bs5/-/datatables.net-bs5-2.1.8.tgz#860717c4ee85ecb84812ba9a73fb1204aa2a68b6" - integrity sha512-YlGws8eI3iw/1AmKJH18+YMzm/UgGb6o9s14KAC24QT1/8anolm8GnVAgGcwUcvHm3hn1i8A5QXqgbqeMRINeg== - dependencies: - datatables.net "2.1.8" - jquery ">=1.7" - -datatables.net@2.1.8, datatables.net@^2.1.8: - version "2.1.8" - resolved "https://registry.yarnpkg.com/datatables.net/-/datatables.net-2.1.8.tgz#9b020f18e927cc924d72411f62dc595cc688669b" - integrity sha512-47ULt+U4bcjbuGTpTlT6SnCuSFVRBxxdWa6X3NfvTObBJ2BZU0o+JUIl05wQ6cABNIavjbAV51gpgvFsMHL9zA== - dependencies: - jquery ">=1.7" - -delegate@^3.1.2: - version "3.2.0" - resolved "https://registry.yarnpkg.com/delegate/-/delegate-3.2.0.tgz#b66b71c3158522e8ab5744f720d8ca0c2af59166" - integrity sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw== - -good-listener@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/good-listener/-/good-listener-1.2.2.tgz#d53b30cdf9313dffb7dc9a0d477096aa6d145c50" - integrity sha512-goW1b+d9q/HIwbVYZzZ6SsTr4IgE+WA44A0GmPIQstuOrgsFcT7VEJ48nmr9GaRtNu0XTKacFLGnBPAM6Afouw== - dependencies: - delegate "^3.1.2" - -jquery-form@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/jquery-form/-/jquery-form-4.3.0.tgz#7d3961c314a1f2d15298f4af1d3943f54f4149c6" - integrity sha512-q3uaVCEWdLOYUCI6dpNdwf/7cJFOsUgdpq6r0taxtGQ5NJSkOzofyWm4jpOuJ5YxdmL1FI5QR+q+HB63HHLGnQ== - dependencies: - jquery ">=1.7.2" - -jquery-mousewheel@>=3.0.6: - version "3.1.13" - resolved "https://registry.yarnpkg.com/jquery-mousewheel/-/jquery-mousewheel-3.1.13.tgz#06f0335f16e353a695e7206bf50503cb523a6ee5" - integrity sha512-GXhSjfOPyDemM005YCEHvzrEALhKDIswtxSHSR2e4K/suHVJKJxxRCGz3skPjNxjJjQa9AVSGGlYjv1M3VLIPg== - -jquery-validation-unobtrusive@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-4.0.0.tgz#dfcf25a558496a2c883db6021d10f5398d15f99d" - integrity sha512-1ervYFFv6LX/rp7ktuLnMakHNG0piNRDyROI8Ir3hL1vPIwylAehB1AY3BPrYJnzW3WmwWryZq+Bz4sazZK9iQ== - dependencies: - jquery "^3.6.0" - jquery-validation ">=1.19" - -jquery-validation@>=1.19, jquery-validation@^1.21.0: - version "1.21.0" - resolved "https://registry.yarnpkg.com/jquery-validation/-/jquery-validation-1.21.0.tgz#78fc05ab76020912a246af3661b3f54a438bca93" - integrity sha512-xNot0rlUIgu7duMcQ5qb6MGkGL/Z1PQaRJQoZAURW9+a/2PGOUxY36o/WyNeP2T9R6jvWB8Z9lUVvvQWI/Zs5w== - -jquery@>=1.10, jquery@>=1.12.0, "jquery@>=1.5.0 <4.0", jquery@>=1.7, jquery@>=1.7.2: - version "3.6.4" - resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.6.4.tgz#ba065c188142100be4833699852bf7c24dc0252f" - integrity sha512-v28EW9DWDFpzcD9O5iyJXg3R3+q+mET5JhnjJzQUZMHOv67bpSIHq81GEYpPNZHG+XXHsfSme3nxp/hndKEcsQ== - -"jquery@>=3.4.0 <4.0.0", jquery@^3.6.0, jquery@~3.7.1: - version "3.7.1" - resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.7.1.tgz#083ef98927c9a6a74d05a6af02806566d16274de" - integrity sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg== - -just-compare@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/just-compare/-/just-compare-2.3.0.tgz#a2adcc1d1940536263275f5a1ef1298bcacfeda7" - integrity sha512-6shoR7HDT+fzfL3gBahx1jZG3hWLrhPAf+l7nCwahDdT9XDtosB9kIF0ZrzUp5QY8dJWfQVr5rnsPqsbvflDzg== - -lodash@^4.17.21: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -luxon@^3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/luxon/-/luxon-3.5.0.tgz#6b6f65c5cd1d61d1fd19dbf07ee87a50bf4b8e20" - integrity sha512-rh+Zjr6DNfUYR3bPwJEnuwDdqMbxZW7LOQfUN4B54+Cl+0o5zaU9RJ6bcidfDtC1cWCZXQ+nvX8bf6bAji37QQ== - -malihu-custom-scrollbar-plugin@^3.1.5: - version "3.1.5" - resolved "https://registry.yarnpkg.com/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-3.1.5.tgz#310cecc5e59415a1c29e9dfb5d2b6e01d66a29ef" - integrity sha512-lwW3LgI+CNDMPnP4ED2la6oYxWMkCXlnhex+s2wuOLhFDFGnGmQuTQVdRK9bvDLpxs10sGlfErVufJy9ztfgJQ== - dependencies: - jquery-mousewheel ">=3.0.6" - -moment@^2.30.1: - version "2.30.1" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.30.1.tgz#f8c91c07b7a786e30c59926df530b4eac96974ae" - integrity sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how== - -moment@^2.9.0: - version "2.29.4" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.4.tgz#3dbe052889fe7c1b2ed966fcb3a77328964ef108" - integrity sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w== - -prismjs@^1.29.0: - version "1.29.0" - resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.29.0.tgz#f113555a8fa9b57c35e637bba27509dcf802dd12" - integrity sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q== - -select2@^4.0.13: - version "4.0.13" - resolved "https://registry.yarnpkg.com/select2/-/select2-4.0.13.tgz#0dbe377df3f96167c4c1626033e924372d8ef44d" - integrity sha512-1JeB87s6oN/TDxQQYCvS5EFoQyvV6eYMZZ0AeA4tdFDYWN3BAGZ8npr17UBFddU0lgAt3H0yjX3X6/ekOj1yjw== - -select@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/select/-/select-1.1.2.tgz#0e7350acdec80b1108528786ec1d4418d11b396d" - integrity sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA== - -sweetalert2@^11.14.1: - version "11.14.4" - resolved "https://registry.yarnpkg.com/sweetalert2/-/sweetalert2-11.14.4.tgz#0186439674ea4f15991e41cea3af203ee497853c" - integrity sha512-8QMzjxCuinwm18EK5AtYvuhP+lRMRxTWVXy8om9wGlULsXSI4TD29kyih3VYrSXMMBlD4EShFvNC7slhTC7j0w== - -timeago@^1.6.7: - version "1.6.7" - resolved "https://registry.yarnpkg.com/timeago/-/timeago-1.6.7.tgz#afd467c29a911e697fc22a81888c7c3022783cb5" - integrity sha512-FikcjN98+ij0siKH4VO4dZ358PR3oDDq4Vdl1+sN9gWz1/+JXGr3uZbUShYH/hL7bMhcTpPbplJU5Tej4b4jbQ== - dependencies: - jquery ">=1.5.0 <4.0" - -tiny-emitter@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/tiny-emitter/-/tiny-emitter-2.1.0.tgz#1d1a56edfc51c43e863cbb5382a72330e3555423" - integrity sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q== - -toastr@^2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/toastr/-/toastr-2.1.4.tgz#8b43be64fb9d0c414871446f2db8e8ca4e95f181" - integrity sha512-LIy77F5n+sz4tefMmFOntcJ6HL0Fv3k1TDnNmFZ0bU/GcvIIfy6eG2v7zQmMiYgaalAiUv75ttFrPn5s0gyqlA== - dependencies: - jquery ">=1.12.0" diff --git a/modules/virtual-file-explorer/app/abp.resourcemapping.js b/modules/virtual-file-explorer/app/abp.resourcemapping.js new file mode 100644 index 0000000000..3129042151 --- /dev/null +++ b/modules/virtual-file-explorer/app/abp.resourcemapping.js @@ -0,0 +1,7 @@ +module.exports = { + aliases: { + + }, + mappings: { + } +}; diff --git a/modules/virtual-file-explorer/app/appsettings.json b/modules/virtual-file-explorer/app/appsettings.json new file mode 100644 index 0000000000..4d1712a519 --- /dev/null +++ b/modules/virtual-file-explorer/app/appsettings.json @@ -0,0 +1,14 @@ +{ + "ConnectionStrings": { + "Default": "Server=(LocalDb)\\MSSQLLocalDB;Database=VirtualFileExplorerDemoApp;Trusted_Connection=True;TrustServerCertificate=True" + }, + "Settings": { + "Abp.Identity.Password.RequireNonAlphanumeric": "false", + "Abp.Identity.Password.RequireLowercase": "false", + "Abp.Identity.Password.RequireUppercase": "false", + "Abp.Identity.Password.RequireDigit": "false" + }, + "StringEncryption": { + "DefaultPassPhrase": "Qn7xFuzxdr4NIxvE" + } +} diff --git a/modules/virtual-file-explorer/app/package.json b/modules/virtual-file-explorer/app/package.json new file mode 100644 index 0000000000..999c375067 --- /dev/null +++ b/modules/virtual-file-explorer/app/package.json @@ -0,0 +1,9 @@ +{ + "version": "1.0.0", + "name": "my-app", + "private": true, + "dependencies": { + "@abp/aspnetcore.mvc.ui.theme.basic": "~9.1.0", + "@abp/virtual-file-explorer": "~9.1.0" + } +} diff --git a/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/FodyWeavers.xml b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/FodyWeavers.xml similarity index 63% rename from modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/FodyWeavers.xml rename to modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/FodyWeavers.xml index 4367b6b2c9..1715698ccd 100644 --- a/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/FodyWeavers.xml +++ b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/FodyWeavers.xml @@ -1,3 +1,3 @@ - - + + \ No newline at end of file diff --git a/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/FodyWeavers.xsd b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/FodyWeavers.xsd similarity index 100% rename from modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/FodyWeavers.xsd rename to modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/FodyWeavers.xsd diff --git a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo.Abp.VirtualFileExplorer.Contracts.abppkg b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo.Abp.VirtualFileExplorer.Contracts.abppkg new file mode 100644 index 0000000000..49032794e2 --- /dev/null +++ b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo.Abp.VirtualFileExplorer.Contracts.abppkg @@ -0,0 +1,3 @@ +{ + "role": "lib.application-contracts" +} \ No newline at end of file diff --git a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo.Abp.VirtualFileExplorer.Contracts.abppkg.analyze.json b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo.Abp.VirtualFileExplorer.Contracts.abppkg.analyze.json new file mode 100644 index 0000000000..0f37f00591 --- /dev/null +++ b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo.Abp.VirtualFileExplorer.Contracts.abppkg.analyze.json @@ -0,0 +1,7 @@ +{ + "name": "Volo.Abp.VirtualFileExplorer.Contracts", + "hash": "", + "contents": [ + + ] + } \ No newline at end of file diff --git a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo.Abp.VirtualFileExplorer.Contracts.csproj b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo.Abp.VirtualFileExplorer.Contracts.csproj new file mode 100644 index 0000000000..2d4c3bcb28 --- /dev/null +++ b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo.Abp.VirtualFileExplorer.Contracts.csproj @@ -0,0 +1,30 @@ + + + + + + + netstandard2.0;netstandard2.1;net8.0;net9.0 + Volo.Abp.VirtualFileExplorer.Contracts + Volo.Abp.VirtualFileExplorer.Contracts + $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; + false + false + false + + + + + + + + + + + + + + + + + diff --git a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo/Abp/VirtualFileExplorer/AbpVirtualFileExplorerContractsModule.cs b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo/Abp/VirtualFileExplorer/AbpVirtualFileExplorerContractsModule.cs new file mode 100644 index 0000000000..4a7821f379 --- /dev/null +++ b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo/Abp/VirtualFileExplorer/AbpVirtualFileExplorerContractsModule.cs @@ -0,0 +1,24 @@ +using Volo.Abp.Localization; +using Volo.Abp.Modularity; +using Volo.Abp.VirtualFileExplorer.Localization; +using Volo.Abp.VirtualFileSystem; + +namespace Volo.Abp.VirtualFileExplorer; + +public class AbpVirtualFileExplorerContractsModule : AbpModule +{ + public override void ConfigureServices(ServiceConfigurationContext context) + { + Configure(options => + { + options.FileSets.AddEmbedded(); + }); + + Configure(options => + { + options.Resources + .Add("en") + .AddVirtualJson("/Volo/Abp/VirtualFileExplorer/Localization/Resources"); + }); + } +} diff --git a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo/Abp/VirtualFileExplorer/AbpVirtualFileExplorerPermissionDefinitionProvider.cs b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo/Abp/VirtualFileExplorer/AbpVirtualFileExplorerPermissionDefinitionProvider.cs new file mode 100644 index 0000000000..fac144d244 --- /dev/null +++ b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo/Abp/VirtualFileExplorer/AbpVirtualFileExplorerPermissionDefinitionProvider.cs @@ -0,0 +1,19 @@ +using Volo.Abp.Authorization.Permissions; +using Volo.Abp.Localization; +using Volo.Abp.VirtualFileExplorer.Localization; + +namespace Volo.Abp.VirtualFileExplorer; + +public class AbpVirtualFileExplorerPermissionDefinitionProvider : PermissionDefinitionProvider +{ + public override void Define(IPermissionDefinitionContext context) + { + var virtualFileExplorer = context.AddGroup(VirtualFileExplorerPermissions.GroupName, L("Permission:AbpVirtualFileExplorer")); + virtualFileExplorer.AddPermission(VirtualFileExplorerPermissions.View, L("Permission:AbpVirtualFileExplorer:View")); + } + + private static LocalizableString L(string name) + { + return LocalizableString.Create(name); + } +} diff --git a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Localization/Resources/ar.json b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo/Abp/VirtualFileExplorer/Localization/Resources/ar.json similarity index 77% rename from modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Localization/Resources/ar.json rename to modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo/Abp/VirtualFileExplorer/Localization/Resources/ar.json index 643e5ff7be..7375ccafa0 100644 --- a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Localization/Resources/ar.json +++ b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo/Abp/VirtualFileExplorer/Localization/Resources/ar.json @@ -9,6 +9,8 @@ "FileContent": "Ł…Ų­ŲŖŁˆŁ‰ الملف", "Size": "المقاس", "BackToRoot": "Ų§Ł„Ų¹ŁˆŲÆŲ© ؄لى الجذر", - "EmptyFileInfoList": "لا توجد أى ملفات افتراضية" + "EmptyFileInfoList": "لا توجد أى ملفات افتراضية", + "Permission:AbpVirtualFileExplorer": "Ł…Ų³ŲŖŁƒŲ“Ł الملفات Ų§Ł„Ų§ŁŲŖŲ±Ų§Ų¶ŁŠ", + "Permission:AbpVirtualFileExplorer:View": "Ų¹Ų±Ų¶" } -} \ No newline at end of file +} diff --git a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Localization/Resources/cs.json b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo/Abp/VirtualFileExplorer/Localization/Resources/cs.json similarity index 68% rename from modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Localization/Resources/cs.json rename to modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo/Abp/VirtualFileExplorer/Localization/Resources/cs.json index 44f8d06288..4cbdafcadd 100644 --- a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Localization/Resources/cs.json +++ b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo/Abp/VirtualFileExplorer/Localization/Resources/cs.json @@ -9,6 +9,8 @@ "FileContent": "Obsah souboru", "Size": "Velikost", "BackToRoot": "Zpět na kořen", - "EmptyFileInfoList": "Nejsou žÔdnĆ© virtuĆ”lnĆ­ soubory" + "EmptyFileInfoList": "Nejsou žÔdnĆ© virtuĆ”lnĆ­ soubory", + "Permission:AbpVirtualFileExplorer": "Prohlížeč virtuĆ”lnĆ­ch souborÅÆ", + "Permission:AbpVirtualFileExplorer:View": "Zobrazit" } } diff --git a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Localization/Resources/de-DE.json b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo/Abp/VirtualFileExplorer/Localization/Resources/de-DE.json similarity index 68% rename from modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Localization/Resources/de-DE.json rename to modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo/Abp/VirtualFileExplorer/Localization/Resources/de-DE.json index 78e2d41ed4..a4cd4d11b6 100644 --- a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Localization/Resources/de-DE.json +++ b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo/Abp/VirtualFileExplorer/Localization/Resources/de-DE.json @@ -9,6 +9,8 @@ "FileContent": "Dateiinhalt", "Size": "Größe", "BackToRoot": "Zurück zum Stammverzeichnis", - "EmptyFileInfoList": "Es gibt keine virtuellen Dateien" + "EmptyFileInfoList": "Es gibt keine virtuellen Dateien", + "Permission:AbpVirtualFileExplorer": "Virtueller Dateiexplorer", + "Permission:AbpVirtualFileExplorer:View": "Ansicht" } -} \ No newline at end of file +} diff --git a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Localization/Resources/de.json b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo/Abp/VirtualFileExplorer/Localization/Resources/de.json similarity index 68% rename from modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Localization/Resources/de.json rename to modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo/Abp/VirtualFileExplorer/Localization/Resources/de.json index 6fdd864602..1b0a058adf 100644 --- a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Localization/Resources/de.json +++ b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo/Abp/VirtualFileExplorer/Localization/Resources/de.json @@ -9,6 +9,8 @@ "FileContent": "Dateiinhalt", "Size": "Größe", "BackToRoot": "Zurück zur Wurzel", - "EmptyFileInfoList": "Es gibt keine virtuellen Dateien" + "EmptyFileInfoList": "Es gibt keine virtuellen Dateien", + "Permission:AbpVirtualFileExplorer": "Virtueller Datei-Explorer", + "Permission:AbpVirtualFileExplorer:View": "Ansicht" } -} \ No newline at end of file +} diff --git a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Localization/Resources/el.json b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo/Abp/VirtualFileExplorer/Localization/Resources/el.json similarity index 77% rename from modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Localization/Resources/el.json rename to modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo/Abp/VirtualFileExplorer/Localization/Resources/el.json index cdfd2bb331..818af6c91f 100644 --- a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Localization/Resources/el.json +++ b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo/Abp/VirtualFileExplorer/Localization/Resources/el.json @@ -9,6 +9,8 @@ "FileContent": "Ī ĪµĻĪ¹ĪµĻ‡ĻŒĪ¼ĪµĪ½Īæ αρχείου", "Size": "ĪœĪ­Ī³ĪµĪøĪæĻ‚", "BackToRoot": "Ī•Ļ€Ī¹ĻƒĻ„ĻĪæĻ†Ī® ĻƒĻ„Ī· ρίζα", - "EmptyFileInfoList": "Δεν υπάρχουν εικονικά αρχεία" + "EmptyFileInfoList": "Δεν υπάρχουν εικονικά αρχεία", + "Permission:AbpVirtualFileExplorer": "Ī•Ī¹ĪŗĪæĪ½Ī¹ĪŗĻŒĻ‚ Εξερευνητής Αρχείων", + "Permission:AbpVirtualFileExplorer:View": "Προβολή" } -} \ No newline at end of file +} diff --git a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Localization/Resources/en-GB.json b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo/Abp/VirtualFileExplorer/Localization/Resources/en-GB.json similarity index 67% rename from modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Localization/Resources/en-GB.json rename to modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo/Abp/VirtualFileExplorer/Localization/Resources/en-GB.json index cd7cbf3c1a..8da17d88ba 100644 --- a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Localization/Resources/en-GB.json +++ b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo/Abp/VirtualFileExplorer/Localization/Resources/en-GB.json @@ -9,6 +9,8 @@ "FileContent": "File content", "Size": "Size", "BackToRoot": "Back to root", - "EmptyFileInfoList": "There are no virtual files" + "EmptyFileInfoList": "There are no virtual files", + "Permission:AbpVirtualFileExplorer": "Virtual file explorer", + "Permission:AbpVirtualFileExplorer:View": "View" } -} \ No newline at end of file +} diff --git a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Localization/Resources/en.json b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo/Abp/VirtualFileExplorer/Localization/Resources/en.json similarity index 67% rename from modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Localization/Resources/en.json rename to modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo/Abp/VirtualFileExplorer/Localization/Resources/en.json index 6b794bf791..f3563aafcf 100644 --- a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Localization/Resources/en.json +++ b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo/Abp/VirtualFileExplorer/Localization/Resources/en.json @@ -9,6 +9,8 @@ "FileContent": "File content", "Size": "Size", "BackToRoot": "Back to root", - "EmptyFileInfoList": "There are no virtual files" + "EmptyFileInfoList": "There are no virtual files", + "Permission:AbpVirtualFileExplorer": "Virtual file explorer", + "Permission:AbpVirtualFileExplorer:View": "View" } } diff --git a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Localization/Resources/es.json b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo/Abp/VirtualFileExplorer/Localization/Resources/es.json similarity index 70% rename from modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Localization/Resources/es.json rename to modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo/Abp/VirtualFileExplorer/Localization/Resources/es.json index e45f76aab0..b4bcd16809 100644 --- a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Localization/Resources/es.json +++ b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo/Abp/VirtualFileExplorer/Localization/Resources/es.json @@ -9,6 +9,8 @@ "FileContent": "Contenido del fichero", "Size": "TamaƱo", "BackToRoot": "Volver al raĆ­z", - "EmptyFileInfoList": "No hay ficheros virtuales" + "EmptyFileInfoList": "No hay ficheros virtuales", + "Permission:AbpVirtualFileExplorer": "Explorador de ficheros virtual", + "Permission:AbpVirtualFileExplorer:View": "Ver" } -} \ No newline at end of file +} diff --git a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Localization/Resources/fa.json b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo/Abp/VirtualFileExplorer/Localization/Resources/fa.json similarity index 77% rename from modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Localization/Resources/fa.json rename to modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo/Abp/VirtualFileExplorer/Localization/Resources/fa.json index 3787092446..839640d6fc 100644 --- a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Localization/Resources/fa.json +++ b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo/Abp/VirtualFileExplorer/Localization/Resources/fa.json @@ -9,6 +9,8 @@ "FileContent": "Ł…Ų­ŲŖŁˆŲ§ŪŒ ŁŲ§ŪŒŁ„", "Size": "اندازه", "BackToRoot": "بازگؓت به Ų±ŪŒŲ“Ł‡", - "EmptyFileInfoList": "Ł‡ŪŒŚ† ŁŲ§ŪŒŁ„ Ł…Ų¬Ų§Ų²ŪŒ وجود ندارد" + "EmptyFileInfoList": "Ł‡ŪŒŚ† ŁŲ§ŪŒŁ„ Ł…Ų¬Ų§Ų²ŪŒ وجود ندارد", + "Permission:AbpVirtualFileExplorer": "کاوؓگر ŁŲ§ŪŒŁ„ Ł…Ų¬Ų§Ų²ŪŒ", + "Permission:AbpVirtualFileExplorer:View": "مؓاهده" } -} \ No newline at end of file +} diff --git a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Localization/Resources/fi.json b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo/Abp/VirtualFileExplorer/Localization/Resources/fi.json similarity index 68% rename from modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Localization/Resources/fi.json rename to modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo/Abp/VirtualFileExplorer/Localization/Resources/fi.json index 3ec395cfa0..8ed05499b9 100644 --- a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Localization/Resources/fi.json +++ b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo/Abp/VirtualFileExplorer/Localization/Resources/fi.json @@ -9,6 +9,8 @@ "FileContent": "Tiedoston sisƤltƶ", "Size": "Koko", "BackToRoot": "Takaisin juuriin", - "EmptyFileInfoList": "Virtuaalitiedostoja ei ole" + "EmptyFileInfoList": "Virtuaalitiedostoja ei ole", + "Permission:AbpVirtualFileExplorer": "Virtuaalinen tiedostojen selain", + "Permission:AbpVirtualFileExplorer:View": "NƤytƤ" } -} \ No newline at end of file +} diff --git a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Localization/Resources/fr.json b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo/Abp/VirtualFileExplorer/Localization/Resources/fr.json similarity index 68% rename from modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Localization/Resources/fr.json rename to modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo/Abp/VirtualFileExplorer/Localization/Resources/fr.json index 0471341bb9..b3e76b99e6 100644 --- a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Localization/Resources/fr.json +++ b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo/Abp/VirtualFileExplorer/Localization/Resources/fr.json @@ -9,6 +9,8 @@ "FileContent": "Contenu du fichier", "Size": "Taille", "BackToRoot": "Retour Ć  la racine", - "EmptyFileInfoList": "Il n’y a pas de fichiers virtuels" + "EmptyFileInfoList": "Il n'y a pas de fichiers virtuels", + "Permission:AbpVirtualFileExplorer": "Explorateur de fichiers virtuels", + "Permission:AbpVirtualFileExplorer:View": "Voir" } -} \ No newline at end of file +} diff --git a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Localization/Resources/hi.json b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo/Abp/VirtualFileExplorer/Localization/Resources/hi.json similarity index 76% rename from modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Localization/Resources/hi.json rename to modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo/Abp/VirtualFileExplorer/Localization/Resources/hi.json index 09056ed265..dec2b54e62 100644 --- a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Localization/Resources/hi.json +++ b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo/Abp/VirtualFileExplorer/Localization/Resources/hi.json @@ -9,6 +9,8 @@ "FileContent": "फ़ाइल ą¤øą¤¾ą¤®ą¤—ą„ą¤°ą„€", "Size": "आकार", "BackToRoot": "वापस ą¤°ą„‚ą¤Ÿ ą¤•ą¤°ą¤Øą„‡ ą¤•ą„‡ ą¤²ą¤æą¤", - "EmptyFileInfoList": "ą¤•ą„‹ą¤ˆ ą¤µą¤°ą„ą¤šą„ą¤…ą¤² फ़ाइल ą¤Øą¤¹ą„€ą¤‚ ą¤¹ą„ˆą¤‚" + "EmptyFileInfoList": "ą¤•ą„‹ą¤ˆ ą¤µą¤°ą„ą¤šą„ą¤…ą¤² फ़ाइल ą¤Øą¤¹ą„€ą¤‚ ą¤¹ą„ˆą¤‚", + "Permission:AbpVirtualFileExplorer": "ą¤†ą¤­ą¤¾ą¤øą„€ फ़ाइल ą¤ą¤•ą„ą¤øą¤Ŗą„ą¤²ą„‹ą¤°ą¤°", + "Permission:AbpVirtualFileExplorer:View": "ą¤¦ą„‡ą¤–ą„‡ą¤‚" } -} \ No newline at end of file +} diff --git a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Localization/Resources/hr.json b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo/Abp/VirtualFileExplorer/Localization/Resources/hr.json similarity index 69% rename from modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Localization/Resources/hr.json rename to modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo/Abp/VirtualFileExplorer/Localization/Resources/hr.json index 81a7052642..86ca73b02b 100644 --- a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Localization/Resources/hr.json +++ b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo/Abp/VirtualFileExplorer/Localization/Resources/hr.json @@ -9,6 +9,8 @@ "FileContent": "Sadržaj datoteke", "Size": "Veličina", "BackToRoot": "Natrag na korijen", - "EmptyFileInfoList": "Nema virtualnih datoteka" + "EmptyFileInfoList": "Nema virtualnih datoteka", + "Permission:AbpVirtualFileExplorer": "Virtualni preglednik datoteka", + "Permission:AbpVirtualFileExplorer:View": "Pregled" } -} \ No newline at end of file +} diff --git a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Localization/Resources/hu.json b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo/Abp/VirtualFileExplorer/Localization/Resources/hu.json similarity index 67% rename from modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Localization/Resources/hu.json rename to modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo/Abp/VirtualFileExplorer/Localization/Resources/hu.json index 9a6dddb460..9f963bc9b1 100644 --- a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Localization/Resources/hu.json +++ b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo/Abp/VirtualFileExplorer/Localization/Resources/hu.json @@ -9,6 +9,8 @@ "FileContent": "File tartalma", "Size": "MĆ©ret", "BackToRoot": "Vissza a fő mappĆ”ba", - "EmptyFileInfoList": "Nem talĆ”lhatóak virtuĆ”lis fileok" + "EmptyFileInfoList": "Nem talĆ”lhatóak virtuĆ”lis fileok", + "Permission:AbpVirtualFileExplorer": "VirtuĆ”lis file bƶngĆ©sző", + "Permission:AbpVirtualFileExplorer:View": "MegtekintĆ©s" } -} \ No newline at end of file +} diff --git a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Localization/Resources/is.json b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo/Abp/VirtualFileExplorer/Localization/Resources/is.json similarity index 67% rename from modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Localization/Resources/is.json rename to modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo/Abp/VirtualFileExplorer/Localization/Resources/is.json index 550c678913..1382d594c1 100644 --- a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Localization/Resources/is.json +++ b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo/Abp/VirtualFileExplorer/Localization/Resources/is.json @@ -9,6 +9,8 @@ "FileContent": "Innihald skrĆ”ar", "Size": "StƦrư", "BackToRoot": "Aftur Ć­ rót", - "EmptyFileInfoList": "ƞaư eru engar sýndar skrĆ”r" + "EmptyFileInfoList": "ƞaư eru engar sýndar skrĆ”r", + "Permission:AbpVirtualFileExplorer": "Sýndar skrĆ”arkƶnnuưur", + "Permission:AbpVirtualFileExplorer:View": "Skoưa" } -} \ No newline at end of file +} diff --git a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Localization/Resources/it.json b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo/Abp/VirtualFileExplorer/Localization/Resources/it.json similarity index 69% rename from modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Localization/Resources/it.json rename to modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo/Abp/VirtualFileExplorer/Localization/Resources/it.json index 7f51b3ad72..555f7ea620 100644 --- a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Localization/Resources/it.json +++ b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo/Abp/VirtualFileExplorer/Localization/Resources/it.json @@ -9,6 +9,8 @@ "FileContent": "Contenuto del file", "Size": "Dimensione", "BackToRoot": "Torna al principale", - "EmptyFileInfoList": "Non ci sono file virtuali" + "EmptyFileInfoList": "Non ci sono file virtuali", + "Permission:AbpVirtualFileExplorer": "Esplora file virtuale", + "Permission:AbpVirtualFileExplorer:View": "Visualizza" } -} \ No newline at end of file +} diff --git a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Localization/Resources/nl.json b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo/Abp/VirtualFileExplorer/Localization/Resources/nl.json similarity index 67% rename from modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Localization/Resources/nl.json rename to modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo/Abp/VirtualFileExplorer/Localization/Resources/nl.json index 4f00849893..8999b87ed3 100644 --- a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Localization/Resources/nl.json +++ b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo/Abp/VirtualFileExplorer/Localization/Resources/nl.json @@ -9,6 +9,8 @@ "FileContent": "Bestandsinhoud", "Size": "Grootte", "BackToRoot": "Terug naar hoofdmap", - "EmptyFileInfoList": "Er zijn geen virtuele bestanden" + "EmptyFileInfoList": "Er zijn geen virtuele bestanden", + "Permission:AbpVirtualFileExplorer": "Virtuele bestandsverkenner", + "Permission:AbpVirtualFileExplorer:View": "Bekijken" } -} \ No newline at end of file +} diff --git a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Localization/Resources/pl-PL.json b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo/Abp/VirtualFileExplorer/Localization/Resources/pl-PL.json similarity index 69% rename from modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Localization/Resources/pl-PL.json rename to modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo/Abp/VirtualFileExplorer/Localization/Resources/pl-PL.json index 3527bfbe02..09e6adad4e 100644 --- a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Localization/Resources/pl-PL.json +++ b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo/Abp/VirtualFileExplorer/Localization/Resources/pl-PL.json @@ -9,6 +9,8 @@ "FileContent": "Zawartość pliku", "Size": "Rozmiar", "BackToRoot": "Powrót do korzenia", - "EmptyFileInfoList": "Nie ma wirtualnych plików" + "EmptyFileInfoList": "Nie ma wirtualnych plików", + "Permission:AbpVirtualFileExplorer": "Wirtualny eksplorator plików", + "Permission:AbpVirtualFileExplorer:View": "Podgląd" } -} \ No newline at end of file +} diff --git a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Localization/Resources/pt-BR.json b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo/Abp/VirtualFileExplorer/Localization/Resources/pt-BR.json similarity index 69% rename from modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Localization/Resources/pt-BR.json rename to modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo/Abp/VirtualFileExplorer/Localization/Resources/pt-BR.json index f4b0675210..b59d281a1e 100644 --- a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Localization/Resources/pt-BR.json +++ b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo/Abp/VirtualFileExplorer/Localization/Resources/pt-BR.json @@ -9,6 +9,8 @@ "FileContent": "ConteĆŗdo do arquivo", "Size": "Tamanho", "BackToRoot": "Voltar Ć  raiz", - "EmptyFileInfoList": "NĆ£o hĆ” arquivos virtuais" + "EmptyFileInfoList": "NĆ£o hĆ” arquivos virtuais", + "Permission:AbpVirtualFileExplorer": "Explorador de arquivo virtual", + "Permission:AbpVirtualFileExplorer:View": "Visualizar" } -} \ No newline at end of file +} diff --git a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Localization/Resources/ro-RO.json b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo/Abp/VirtualFileExplorer/Localization/Resources/ro-RO.json similarity index 68% rename from modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Localization/Resources/ro-RO.json rename to modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo/Abp/VirtualFileExplorer/Localization/Resources/ro-RO.json index 67abc693a4..4acbd39fd9 100644 --- a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Localization/Resources/ro-RO.json +++ b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo/Abp/VirtualFileExplorer/Localization/Resources/ro-RO.json @@ -9,6 +9,8 @@ "FileContent" : "ConÅ£inut fişier", "Size" : "Mărimea", "BackToRoot" : "Ǝnapoi la rădăcină", - "EmptyFileInfoList" : "Nu există fişiere virtuale" + "EmptyFileInfoList" : "Nu există fişiere virtuale", + "Permission:AbpVirtualFileExplorer": "Explorator de fişiere virtuale", + "Permission:AbpVirtualFileExplorer:View": "Vizualizare" } -} \ No newline at end of file +} diff --git a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Localization/Resources/ru.json b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo/Abp/VirtualFileExplorer/Localization/Resources/ru.json similarity index 78% rename from modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Localization/Resources/ru.json rename to modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo/Abp/VirtualFileExplorer/Localization/Resources/ru.json index f616e7679b..a9ceb1e819 100644 --- a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Localization/Resources/ru.json +++ b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo/Abp/VirtualFileExplorer/Localization/Resources/ru.json @@ -9,6 +9,8 @@ "FileContent": "ДоГержание файла", "Size": "Размер", "BackToRoot": "Š’ŠµŃ€Š½ŃƒŃ‚ŃŒŃŃ Šŗ ŠŗŠ¾Ń€Š½ŃŽ", - "EmptyFileInfoList": "ŠŠµŃ‚ Š²ŠøŃ€Ń‚ŃƒŠ°Š»ŃŒŠ½Ń‹Ń… файлов" + "EmptyFileInfoList": "ŠŠµŃ‚ Š²ŠøŃ€Ń‚ŃƒŠ°Š»ŃŒŠ½Ń‹Ń… файлов", + "Permission:AbpVirtualFileExplorer": "Š’ŠøŃ€Ń‚ŃƒŠ°Š»ŃŒŠ½Ń‹Š¹ файловый менеГжер", + "Permission:AbpVirtualFileExplorer:View": "ŠŸŃ€Š¾ŃŠ¼Š¾Ń‚Ń€" } -} \ No newline at end of file +} diff --git a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Localization/Resources/sk.json b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo/Abp/VirtualFileExplorer/Localization/Resources/sk.json similarity index 78% rename from modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Localization/Resources/sk.json rename to modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo/Abp/VirtualFileExplorer/Localization/Resources/sk.json index eaeb989d34..56815767d2 100644 --- a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Localization/Resources/sk.json +++ b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo/Abp/VirtualFileExplorer/Localization/Resources/sk.json @@ -9,6 +9,8 @@ "FileContent": "Obsah sĆŗboru", "Size": "VeľkosÅ„", "BackToRoot": "Späń na koreňový priečinok", - "EmptyFileInfoList": "NeexistujĆŗ žiadne virtuĆ”lne sĆŗbory" + "EmptyFileInfoList": "NeexistujĆŗ žiadne virtuĆ”lne sĆŗbory", + "Permission:AbpVirtualFileExplorer": "VirtuĆ”lny prieskumnĆ­k sĆŗborov", + "Permission:AbpVirtualFileExplorer:View": "ZobraziÅ„" } -} \ No newline at end of file +} diff --git a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Localization/Resources/sl.json b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo/Abp/VirtualFileExplorer/Localization/Resources/sl.json similarity index 100% rename from modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Localization/Resources/sl.json rename to modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo/Abp/VirtualFileExplorer/Localization/Resources/sl.json diff --git a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Localization/Resources/sv.json b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo/Abp/VirtualFileExplorer/Localization/Resources/sv.json similarity index 100% rename from modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Localization/Resources/sv.json rename to modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo/Abp/VirtualFileExplorer/Localization/Resources/sv.json diff --git a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Localization/Resources/tr.json b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo/Abp/VirtualFileExplorer/Localization/Resources/tr.json similarity index 68% rename from modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Localization/Resources/tr.json rename to modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo/Abp/VirtualFileExplorer/Localization/Resources/tr.json index 30f659ff45..cb7c655a8a 100644 --- a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Localization/Resources/tr.json +++ b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo/Abp/VirtualFileExplorer/Localization/Resources/tr.json @@ -9,6 +9,8 @@ "FileContent": "Dosyaa iƧeriği", "Size": "Boyut", "BackToRoot": "Kƶk'e dƶn", - "EmptyFileInfoList": "Sanal dosyalar yok" + "EmptyFileInfoList": "Sanal dosyalar yok", + "Permission:AbpVirtualFileExplorer": "Sanal dosya gezgini", + "Permission:AbpVirtualFileExplorer:View": "Gƶrüntüle" } -} \ No newline at end of file +} diff --git a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Localization/Resources/vi.json b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo/Abp/VirtualFileExplorer/Localization/Resources/vi.json similarity index 69% rename from modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Localization/Resources/vi.json rename to modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo/Abp/VirtualFileExplorer/Localization/Resources/vi.json index 71ff7b26ab..19b7e32e25 100644 --- a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Localization/Resources/vi.json +++ b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo/Abp/VirtualFileExplorer/Localization/Resources/vi.json @@ -9,6 +9,8 @@ "FileContent": "Nį»™i dung tệp", "Size": "KĆ­ch thước", "BackToRoot": "Quay lįŗ”i thʰ mỄc gốc", - "EmptyFileInfoList": "KhĆ“ng có tệp įŗ£o nĆ o" + "EmptyFileInfoList": "KhĆ“ng có tệp įŗ£o nĆ o", + "Permission:AbpVirtualFileExplorer": "TrƬnh khĆ”m phĆ” tệp įŗ£o", + "Permission:AbpVirtualFileExplorer:View": "Xem" } -} \ No newline at end of file +} diff --git a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Localization/Resources/zh-Hans.json b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo/Abp/VirtualFileExplorer/Localization/Resources/zh-Hans.json similarity index 69% rename from modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Localization/Resources/zh-Hans.json rename to modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo/Abp/VirtualFileExplorer/Localization/Resources/zh-Hans.json index 46e5e4b811..824a8813f8 100644 --- a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Localization/Resources/zh-Hans.json +++ b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo/Abp/VirtualFileExplorer/Localization/Resources/zh-Hans.json @@ -9,6 +9,8 @@ "FileContent": "文件内容", "Size": "ę–‡ä»¶å¤§å°", "BackToRoot": "čæ”å›žę ¹ē›®å½•", - "EmptyFileInfoList": "ę²”ęœ‰č™šę‹Ÿę–‡ä»¶" + "EmptyFileInfoList": "ę²”ęœ‰č™šę‹Ÿę–‡ä»¶", + "Permission:AbpVirtualFileExplorer": "č™šę‹Ÿę–‡ä»¶čµ„ęŗē®”ē†å™Ø", + "Permission:AbpVirtualFileExplorer:View": "ęŸ„ēœ‹" } -} \ No newline at end of file +} diff --git a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Localization/Resources/zh-Hant.json b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo/Abp/VirtualFileExplorer/Localization/Resources/zh-Hant.json similarity index 69% rename from modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Localization/Resources/zh-Hant.json rename to modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo/Abp/VirtualFileExplorer/Localization/Resources/zh-Hant.json index 1fb05fc6bf..4e293a3f25 100644 --- a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Localization/Resources/zh-Hant.json +++ b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo/Abp/VirtualFileExplorer/Localization/Resources/zh-Hant.json @@ -9,6 +9,8 @@ "FileContent" : "ęŖ”ę”ˆå…§å®¹", "Size" : "ęŖ”ę”ˆå¤§å°", "BackToRoot" : "čæ”å›žę ¹ē›®éŒ„", - "EmptyFileInfoList" : "ē„”ä»»ä½•č™›ę“¬ęŖ”ę”ˆ" + "EmptyFileInfoList" : "ē„”ä»»ä½•č™›ę“¬ęŖ”ę”ˆ", + "Permission:AbpVirtualFileExplorer": "č™›ę“¬ęŖ”ę”ˆēø½ē®”", + "Permission:AbpVirtualFileExplorer:View": "檢視" } } diff --git a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Localization/VirtualFileExplorerResource.cs b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo/Abp/VirtualFileExplorer/Localization/VirtualFileExplorerResource.cs similarity index 70% rename from modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Localization/VirtualFileExplorerResource.cs rename to modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo/Abp/VirtualFileExplorer/Localization/VirtualFileExplorerResource.cs index 78f1e6eb4b..95fe949bd0 100644 --- a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Localization/VirtualFileExplorerResource.cs +++ b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo/Abp/VirtualFileExplorer/Localization/VirtualFileExplorerResource.cs @@ -1,6 +1,6 @@ using Volo.Abp.Localization; -namespace Volo.Abp.VirtualFileExplorer.Web.Localization; +namespace Volo.Abp.VirtualFileExplorer.Localization; [LocalizationResourceName("AbpVirtualFileExplorer")] public class VirtualFileExplorerResource diff --git a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo/Abp/VirtualFileExplorer/VirtualFileExplorerPermissions.cs b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo/Abp/VirtualFileExplorer/VirtualFileExplorerPermissions.cs new file mode 100644 index 0000000000..214a2e5663 --- /dev/null +++ b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts/Volo/Abp/VirtualFileExplorer/VirtualFileExplorerPermissions.cs @@ -0,0 +1,15 @@ +using Volo.Abp.Reflection; + +namespace Volo.Abp.VirtualFileExplorer; + +public static class VirtualFileExplorerPermissions +{ + public const string GroupName = "AbpVirtualFileExplorer"; + + public const string View = GroupName + ".View"; + + public static string[] GetAll() + { + return ReflectionHelper.GetPublicConstantsRecursively(typeof(VirtualFileExplorerPermissions)); + } +} diff --git a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Installer/InstallationNotes.md b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Installer/InstallationNotes.md new file mode 100644 index 0000000000..9cc08c2ae7 --- /dev/null +++ b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Installer/InstallationNotes.md @@ -0,0 +1,7 @@ +# Installation Notes for Virtual File Explorer Module + +The Virtual File System makes it possible to manage files that do not physically exist on the file system (disk). It's mainly used to embed (js, css, image..) files into assemblies and use them like physical files at runtime. + +## Documentation + +For detailed information and usage instructions, please visit the [Virtual File System Module documentation](https://abp.io/docs/latest/framework/infrastructure/virtual-file-system). \ No newline at end of file diff --git a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/AbpVirtualFileExplorerWebModule.cs b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/AbpVirtualFileExplorerWebModule.cs index 9bf9c7aa5d..6d2133844c 100644 --- a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/AbpVirtualFileExplorerWebModule.cs +++ b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/AbpVirtualFileExplorerWebModule.cs @@ -1,4 +1,5 @@ -using Microsoft.Extensions.DependencyInjection; +using Localization; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.FileProviders.Physical; using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap; using Volo.Abp.AspNetCore.Mvc.UI.Bundling; @@ -8,8 +9,8 @@ using Volo.Abp.Localization; using Volo.Abp.Modularity; using Volo.Abp.UI.Navigation; using Volo.Abp.Validation.Localization; +using Volo.Abp.VirtualFileExplorer.Localization; using Volo.Abp.VirtualFileExplorer.Web.Bundling; -using Volo.Abp.VirtualFileExplorer.Web.Localization; using Volo.Abp.VirtualFileExplorer.Web.Navigation; using Volo.Abp.VirtualFileSystem; @@ -17,6 +18,7 @@ namespace Volo.Abp.VirtualFileExplorer.Web; [DependsOn(typeof(AbpAspNetCoreMvcUiBootstrapModule))] [DependsOn(typeof(AbpAspNetCoreMvcUiThemeSharedModule))] +[DependsOn(typeof(AbpVirtualFileExplorerContractsModule))] public class AbpVirtualFileExplorerWebModule : AbpModule { public override void PreConfigureServices(ServiceConfigurationContext context) @@ -43,14 +45,6 @@ public class AbpVirtualFileExplorerWebModule : AbpModule options.FileSets.AddEmbedded("Volo.Abp.VirtualFileExplorer.Web"); }); - Configure(options => - { - options.Resources - .Add("en") - .AddBaseTypes(typeof(AbpValidationResource)) - .AddVirtualJson("/Localization/Resources"); - }); - Configure(options => { options diff --git a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Navigation/VirtualFileExplorerMenuContributor.cs b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Navigation/VirtualFileExplorerMenuContributor.cs index a47f7585ad..45b8e2089e 100644 --- a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Navigation/VirtualFileExplorerMenuContributor.cs +++ b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Navigation/VirtualFileExplorerMenuContributor.cs @@ -1,8 +1,10 @@ using System.Threading.Tasks; +using Localization; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Localization; +using Volo.Abp.Authorization.Permissions; using Volo.Abp.UI.Navigation; -using Volo.Abp.VirtualFileExplorer.Web.Localization; +using Volo.Abp.VirtualFileExplorer.Localization; namespace Volo.Abp.VirtualFileExplorer.Web.Navigation; @@ -17,7 +19,12 @@ public class VirtualFileExplorerMenuContributor : IMenuContributor var l = context.GetLocalizer(); - context.Menu.Items.Add(new ApplicationMenuItem(VirtualFileExplorerMenuNames.Index, l["Menu:VirtualFileExplorer"], icon: "fa fa-file", url: "~/VirtualFileExplorer")); + context.Menu.Items.Add(new ApplicationMenuItem( + VirtualFileExplorerMenuNames.Index, + l["Menu:VirtualFileExplorer"], + icon: "fa fa-file", url: "~/VirtualFileExplorer") + .RequirePermissions(VirtualFileExplorerPermissions.View) + ); return Task.CompletedTask; } diff --git a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Pages/VirtualFileExplorer/FileContentModal.cshtml b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Pages/VirtualFileExplorer/FileContentModal.cshtml index 7db9c4ca43..f25578f06e 100644 --- a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Pages/VirtualFileExplorer/FileContentModal.cshtml +++ b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Pages/VirtualFileExplorer/FileContentModal.cshtml @@ -1,8 +1,9 @@ @page +@using Localization @using Microsoft.AspNetCore.Mvc.Localization @using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Modal @using Volo.Abp.AspNetCore.Mvc.UI.Packages.Prismjs -@using Volo.Abp.VirtualFileExplorer.Web.Localization +@using Volo.Abp.VirtualFileExplorer.Localization @model Volo.Abp.VirtualFileExplorer.Web.Pages.VirtualFileExplorer.FileContentModal @inject IHtmlLocalizer L @{ diff --git a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Pages/VirtualFileExplorer/FileContentModal.cshtml.cs b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Pages/VirtualFileExplorer/FileContentModal.cshtml.cs index 181028eabd..742038b31a 100644 --- a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Pages/VirtualFileExplorer/FileContentModal.cshtml.cs +++ b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Pages/VirtualFileExplorer/FileContentModal.cshtml.cs @@ -1,6 +1,7 @@ using System; using System.ComponentModel.DataAnnotations; using System.Threading.Tasks; +using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; using Microsoft.Extensions.FileProviders; @@ -8,6 +9,7 @@ using Volo.Abp.VirtualFileSystem; namespace Volo.Abp.VirtualFileExplorer.Web.Pages.VirtualFileExplorer; +[Authorize(VirtualFileExplorerPermissions.View)] public class FileContentModal : PageModel { [Required] diff --git a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Pages/VirtualFileExplorer/Index.cshtml b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Pages/VirtualFileExplorer/Index.cshtml index 83d6688252..bf5d86fa1a 100644 --- a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Pages/VirtualFileExplorer/Index.cshtml +++ b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Pages/VirtualFileExplorer/Index.cshtml @@ -1,8 +1,9 @@ @page +@using Localization @using Localization.Resources.AbpUi @using Microsoft.AspNetCore.Mvc.Localization @using Volo.Abp.AspNetCore.Mvc.UI.Layout -@using Volo.Abp.VirtualFileExplorer.Web.Localization +@using Volo.Abp.VirtualFileExplorer.Localization @using Volo.Abp.VirtualFileExplorer.Web.Navigation @using Volo.Abp.VirtualFileExplorer.Web.Pages.VirtualFileExplorer @model IndexModel diff --git a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Pages/VirtualFileExplorer/Index.cshtml.cs b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Pages/VirtualFileExplorer/Index.cshtml.cs index fb8fab07c0..894332be84 100644 --- a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Pages/VirtualFileExplorer/Index.cshtml.cs +++ b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Pages/VirtualFileExplorer/Index.cshtml.cs @@ -2,6 +2,7 @@ using System; using System.Collections.Generic; using System.Linq; using System.Text; +using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.FileProviders; using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Pagination; @@ -11,6 +12,7 @@ using Volo.Abp.VirtualFileSystem.Embedded; namespace Volo.Abp.VirtualFileExplorer.Web.Pages.VirtualFileExplorer; +[Authorize(VirtualFileExplorerPermissions.View)] public class IndexModel : VirtualFileExplorerPageModel { [BindProperty(SupportsGet = true)] diff --git a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Pages/VirtualFileExplorer/VirtualFileExplorerPageModel.cs b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Pages/VirtualFileExplorer/VirtualFileExplorerPageModel.cs index d9423788b3..c9fd10a9a5 100644 --- a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Pages/VirtualFileExplorer/VirtualFileExplorerPageModel.cs +++ b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Pages/VirtualFileExplorer/VirtualFileExplorerPageModel.cs @@ -1,5 +1,6 @@ -using Volo.Abp.AspNetCore.Mvc.UI.RazorPages; -using Volo.Abp.VirtualFileExplorer.Web.Localization; +using Localization; +using Volo.Abp.AspNetCore.Mvc.UI.RazorPages; +using Volo.Abp.VirtualFileExplorer.Localization; namespace Volo.Abp.VirtualFileExplorer.Web.Pages.VirtualFileExplorer; diff --git a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Volo.Abp.VirtualFileExplorer.Web.csproj b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Volo.Abp.VirtualFileExplorer.Web.csproj index 362207b447..47454333bf 100644 --- a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Volo.Abp.VirtualFileExplorer.Web.csproj +++ b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Volo.Abp.VirtualFileExplorer.Web.csproj @@ -16,6 +16,7 @@ + @@ -24,17 +25,11 @@ - - - - - - diff --git a/npm/lerna.json b/npm/lerna.json index 9ef1494883..db2bd7024a 100644 --- a/npm/lerna.json +++ b/npm/lerna.json @@ -1,5 +1,5 @@ { - "version": "9.1.0-rc.3", + "version": "9.1.0", "packages": [ "packs/*" ], diff --git a/npm/ng-packs/package.json b/npm/ng-packs/package.json index 592debe8d5..5fba83180d 100644 --- a/npm/ng-packs/package.json +++ b/npm/ng-packs/package.json @@ -44,8 +44,8 @@ }, "private": true, "devDependencies": { - "@abp/ng.theme.lepton-x": "~4.1.0-rc.3", - "@abp/utils": "~9.1.0-rc.3", + "@abp/ng.theme.lepton-x": "~4.1.0", + "@abp/utils": "~9.1.0", "@angular-devkit/build-angular": "~19.1.0", "@angular-devkit/core": "~19.1.0", "@angular-devkit/schematics": "~19.1.0", diff --git a/npm/ng-packs/packages/account-core/package.json b/npm/ng-packs/packages/account-core/package.json index e805489acd..ba4538c0fe 100644 --- a/npm/ng-packs/packages/account-core/package.json +++ b/npm/ng-packs/packages/account-core/package.json @@ -1,14 +1,14 @@ { "name": "@abp/ng.account.core", - "version": "9.1.0-rc.3", + "version": "9.1.0", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.core": "~9.1.0-rc.3", - "@abp/ng.theme.shared": "~9.1.0-rc.3", + "@abp/ng.core": "~9.1.0", + "@abp/ng.theme.shared": "~9.1.0", "tslib": "^2.0.0" }, "publishConfig": { diff --git a/npm/ng-packs/packages/account/package.json b/npm/ng-packs/packages/account/package.json index 645cdf3ed4..99a5dccfd5 100644 --- a/npm/ng-packs/packages/account/package.json +++ b/npm/ng-packs/packages/account/package.json @@ -1,14 +1,14 @@ { "name": "@abp/ng.account", - "version": "9.1.0-rc.3", + "version": "9.1.0", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.account.core": "~9.1.0-rc.3", - "@abp/ng.theme.shared": "~9.1.0-rc.3", + "@abp/ng.account.core": "~9.1.0", + "@abp/ng.theme.shared": "~9.1.0", "tslib": "^2.0.0" }, "publishConfig": { diff --git a/npm/ng-packs/packages/components/extensible/src/lib/components/extensible-form/extensible-form-prop.component.html b/npm/ng-packs/packages/components/extensible/src/lib/components/extensible-form/extensible-form-prop.component.html index b5da3a266f..b0d8f42bc7 100644 --- a/npm/ng-packs/packages/components/extensible/src/lib/components/extensible-form/extensible-form-prop.component.html +++ b/npm/ng-packs/packages/components/extensible/src/lib/components/extensible-form/extensible-form-prop.component.html @@ -22,7 +22,7 @@ /> } @case ('hidden') { - + } @case ('checkbox') {
    @@ -62,24 +62,11 @@ } @case ('multiselect') { - + [abpDisabled]="disabled"/> } @case ('typeahead') { @@ -100,7 +87,7 @@ [class.is-invalid]="typeahead.classList.contains('is-invalid')" class="form-control" /> - +
    } @case ('date') { @@ -122,7 +109,7 @@ } @case ('dateTime') { - + } @case ('textarea') { diff --git a/npm/ng-packs/packages/components/extensible/src/lib/components/extensible-form/extensible-form-prop.component.ts b/npm/ng-packs/packages/components/extensible/src/lib/components/extensible-form/extensible-form-prop.component.ts index d6e9dba268..401bd15c3d 100644 --- a/npm/ng-packs/packages/components/extensible/src/lib/components/extensible-form/extensible-form-prop.component.ts +++ b/npm/ng-packs/packages/components/extensible/src/lib/components/extensible-form/extensible-form-prop.component.ts @@ -49,12 +49,14 @@ import { NgxValidateCoreModule } from '@ngx-validate/core'; import { ExtensibleFormPropService } from '../../services/extensible-form-prop.service'; import { CommonModule } from '@angular/common'; import { NgbTooltip } from '@ng-bootstrap/ng-bootstrap'; +import { ExtensibleFormMultiselectComponent } from '../multi-select/extensible-form-multiselect.component'; @Component({ selector: 'abp-extensible-form-prop', templateUrl: './extensible-form-prop.component.html', imports: [ ExtensibleDateTimePickerComponent, + ExtensibleFormMultiselectComponent, NgbDatepickerModule, NgbTimepickerModule, ReactiveFormsModule, diff --git a/npm/ng-packs/packages/components/extensible/src/lib/components/index.ts b/npm/ng-packs/packages/components/extensible/src/lib/components/index.ts index 17f1c380d1..149043089b 100644 --- a/npm/ng-packs/packages/components/extensible/src/lib/components/index.ts +++ b/npm/ng-packs/packages/components/extensible/src/lib/components/index.ts @@ -5,3 +5,4 @@ export * from './extensible-table/extensible-table.component'; export * from './date-time-picker/extensible-date-time-picker.component'; export * from './grid-actions/grid-actions.component'; export * from './page-toolbar/page-toolbar.component'; +export * from './multi-select/extensible-form-multiselect.component'; diff --git a/npm/ng-packs/packages/components/extensible/src/lib/components/multi-select/extensible-form-multiselect.component.ts b/npm/ng-packs/packages/components/extensible/src/lib/components/multi-select/extensible-form-multiselect.component.ts new file mode 100644 index 0000000000..d55d55614d --- /dev/null +++ b/npm/ng-packs/packages/components/extensible/src/lib/components/multi-select/extensible-form-multiselect.component.ts @@ -0,0 +1,77 @@ +import { Component, ChangeDetectionStrategy, forwardRef, input } from '@angular/core'; +import { NG_VALUE_ACCESSOR, ControlValueAccessor, ReactiveFormsModule } from '@angular/forms'; +import { CommonModule } from '@angular/common'; +import { ABP, LocalizationModule } from '@abp/ng.core'; +import { FormProp } from '../../models/form-props'; + +const EXTENSIBLE_FORM_MULTI_SELECT_CONTROL_VALUE_ACCESSOR = { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => ExtensibleFormMultiselectComponent), + multi: true, +}; + +@Component({ + selector: 'abp-extensible-form-multi-select', + template: ` +
    + @for (option of options(); track option.value) { +
    + + @if (prop().isExtra) { + {{ '::' + option.key | abpLocalization }} + } @else { + {{ option.key }} + } +
    + } +
    + `, + providers: [EXTENSIBLE_FORM_MULTI_SELECT_CONTROL_VALUE_ACCESSOR], + imports: [LocalizationModule, CommonModule, ReactiveFormsModule], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class ExtensibleFormMultiselectComponent implements ControlValueAccessor { + prop = input.required(); + options = input.required[]>(); + + selectedValues: any[] = []; + disabled = false; + + private onChange: (value: any) => void = () => {}; + private onTouched: () => void = () => {}; + + setDisabledState(isDisabled: boolean): void { + this.disabled = isDisabled; + } + + isChecked(value: any): boolean { + return this.selectedValues.includes(value); + } + + onCheckboxChange(value: any, checked: boolean): void { + this.selectedValues = checked + ? [...this.selectedValues, value] + : this.selectedValues.filter(item => item !== value); + + this.onChange(this.selectedValues); + this.onTouched(); + } + + writeValue(value: any[]): void { + this.selectedValues = Array.isArray(value) ? [...value] : []; + } + + registerOnChange(fn: any): void { + this.onChange = fn; + } + + registerOnTouched(fn: any): void { + this.onTouched = fn; + } +} diff --git a/npm/ng-packs/packages/components/extensible/src/lib/components/multi-select/index.ts b/npm/ng-packs/packages/components/extensible/src/lib/components/multi-select/index.ts new file mode 100644 index 0000000000..3a85d672ab --- /dev/null +++ b/npm/ng-packs/packages/components/extensible/src/lib/components/multi-select/index.ts @@ -0,0 +1 @@ +export * from './extensible-form-multiselect.component'; diff --git a/npm/ng-packs/packages/components/extensible/src/lib/extensible.module.ts b/npm/ng-packs/packages/components/extensible/src/lib/extensible.module.ts index 99bc25b6f4..26741c2832 100644 --- a/npm/ng-packs/packages/components/extensible/src/lib/extensible.module.ts +++ b/npm/ng-packs/packages/components/extensible/src/lib/extensible.module.ts @@ -16,6 +16,7 @@ import { GridActionsComponent, PageToolbarComponent, ExtensibleDateTimePickerComponent, + ExtensibleFormMultiselectComponent, } from './components'; import { PropDataDirective } from './directives/prop-data.directive'; import { CreateInjectorPipe } from './pipes/create-injector.pipe'; @@ -31,7 +32,9 @@ const importWithExport = [ CreateInjectorPipe, ExtensibleFormComponent, ExtensibleTableComponent, + ExtensibleFormMultiselectComponent, ]; + @NgModule({ declarations: [], imports: [ diff --git a/npm/ng-packs/packages/components/extensible/src/public-api.ts b/npm/ng-packs/packages/components/extensible/src/public-api.ts index 35e4696d49..e5c7883738 100644 --- a/npm/ng-packs/packages/components/extensible/src/public-api.ts +++ b/npm/ng-packs/packages/components/extensible/src/public-api.ts @@ -4,6 +4,7 @@ export * from './lib/components/extensible-form/extensible-form.component'; export * from './lib/components/extensible-table/extensible-table.component'; export * from './lib/components/grid-actions/grid-actions.component'; export * from './lib/components/page-toolbar/page-toolbar.component'; +export * from './lib/components/multi-select'; export * from './lib/constants/extra-properties'; export * from './lib/directives/prop-data.directive'; export * from './lib/enums/props.enum'; diff --git a/npm/ng-packs/packages/components/package.json b/npm/ng-packs/packages/components/package.json index 1d50a61afc..bbf92e8243 100644 --- a/npm/ng-packs/packages/components/package.json +++ b/npm/ng-packs/packages/components/package.json @@ -1,14 +1,14 @@ { "name": "@abp/ng.components", - "version": "9.1.0-rc.3", + "version": "9.1.0", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "peerDependencies": { - "@abp/ng.core": ">=9.1.0-rc.3", - "@abp/ng.theme.shared": ">=9.1.0-rc.3" + "@abp/ng.core": ">=9.1.0", + "@abp/ng.theme.shared": ">=9.1.0" }, "dependencies": { "chart.js": "^3.5.1", diff --git a/npm/ng-packs/packages/core/package.json b/npm/ng-packs/packages/core/package.json index 35138c5bfb..10a52ad895 100644 --- a/npm/ng-packs/packages/core/package.json +++ b/npm/ng-packs/packages/core/package.json @@ -1,13 +1,13 @@ { "name": "@abp/ng.core", - "version": "9.1.0-rc.3", + "version": "9.1.0", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/utils": "~9.1.0-rc.3", + "@abp/utils": "~9.1.0", "just-clone": "^6.0.0", "just-compare": "^2.0.0", "ts-toolbelt": "^9.0.0", diff --git a/npm/ng-packs/packages/feature-management/package.json b/npm/ng-packs/packages/feature-management/package.json index c3f3138fbd..d89cb20de0 100644 --- a/npm/ng-packs/packages/feature-management/package.json +++ b/npm/ng-packs/packages/feature-management/package.json @@ -1,13 +1,13 @@ { "name": "@abp/ng.feature-management", - "version": "9.1.0-rc.3", + "version": "9.1.0", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.theme.shared": "~9.1.0-rc.3", + "@abp/ng.theme.shared": "~9.1.0", "tslib": "^2.0.0" }, "publishConfig": { diff --git a/npm/ng-packs/packages/feature-management/src/lib/components/feature-management/feature-management.component.ts b/npm/ng-packs/packages/feature-management/src/lib/components/feature-management/feature-management.component.ts index e26609bb25..fc71ad4a12 100644 --- a/npm/ng-packs/packages/feature-management/src/lib/components/feature-management/feature-management.component.ts +++ b/npm/ng-packs/packages/feature-management/src/lib/components/feature-management/feature-management.component.ts @@ -13,7 +13,7 @@ import { ToasterService, } from '@abp/ng.theme.shared'; import { Component, EventEmitter, Input, Output, inject } from '@angular/core'; -import { NgTemplateOutlet } from '@angular/common'; +import { CommonModule, NgTemplateOutlet } from '@angular/common'; import { FormsModule } from '@angular/forms'; import { NgbNavModule } from '@ng-bootstrap/ng-bootstrap'; import { finalize } from 'rxjs/operators'; @@ -31,6 +31,7 @@ enum ValueTypes { templateUrl: './feature-management.component.html', exportAs: 'abpFeatureManagement', imports: [ + CommonModule, ThemeSharedModule, LocalizationModule, FormsModule, diff --git a/npm/ng-packs/packages/generators/package.json b/npm/ng-packs/packages/generators/package.json index 5ad4455709..d6a9ac9b57 100644 --- a/npm/ng-packs/packages/generators/package.json +++ b/npm/ng-packs/packages/generators/package.json @@ -1,6 +1,6 @@ { "name": "@abp/nx.generators", - "version": "9.1.0-rc.3", + "version": "9.1.0", "homepage": "https://abp.io", "generators": "./generators.json", "type": "commonjs", diff --git a/npm/ng-packs/packages/identity/package.json b/npm/ng-packs/packages/identity/package.json index 86d21fa15e..2c1b4942fb 100644 --- a/npm/ng-packs/packages/identity/package.json +++ b/npm/ng-packs/packages/identity/package.json @@ -1,15 +1,15 @@ { "name": "@abp/ng.identity", - "version": "9.1.0-rc.3", + "version": "9.1.0", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.components": "~9.1.0-rc.3", - "@abp/ng.permission-management": "~9.1.0-rc.3", - "@abp/ng.theme.shared": "~9.1.0-rc.3", + "@abp/ng.components": "~9.1.0", + "@abp/ng.permission-management": "~9.1.0", + "@abp/ng.theme.shared": "~9.1.0", "tslib": "^2.0.0" }, "publishConfig": { diff --git a/npm/ng-packs/packages/oauth/package.json b/npm/ng-packs/packages/oauth/package.json index b76ce26132..12713c2357 100644 --- a/npm/ng-packs/packages/oauth/package.json +++ b/npm/ng-packs/packages/oauth/package.json @@ -1,14 +1,14 @@ { "name": "@abp/ng.oauth", - "version": "9.1.0-rc.3", + "version": "9.1.0", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.core": "~9.1.0-rc.3", - "@abp/utils": "~9.1.0-rc.3", + "@abp/ng.core": "~9.1.0", + "@abp/utils": "~9.1.0", "angular-oauth2-oidc": "^17.0.0", "just-clone": "^6.0.0", "just-compare": "^2.0.0", diff --git a/npm/ng-packs/packages/permission-management/package.json b/npm/ng-packs/packages/permission-management/package.json index 8c0ad3c496..7164d201b0 100644 --- a/npm/ng-packs/packages/permission-management/package.json +++ b/npm/ng-packs/packages/permission-management/package.json @@ -1,13 +1,13 @@ { "name": "@abp/ng.permission-management", - "version": "9.1.0-rc.3", + "version": "9.1.0", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.theme.shared": "~9.1.0-rc.3", + "@abp/ng.theme.shared": "~9.1.0", "tslib": "^2.0.0" }, "publishConfig": { diff --git a/npm/ng-packs/packages/permission-management/src/lib/components/permission-management.component.ts b/npm/ng-packs/packages/permission-management/src/lib/components/permission-management.component.ts index 2742cedcee..c68c9afc85 100644 --- a/npm/ng-packs/packages/permission-management/src/lib/components/permission-management.component.ts +++ b/npm/ng-packs/packages/permission-management/src/lib/components/permission-management.component.ts @@ -40,27 +40,34 @@ type PermissionWithGroupName = PermissionGrantInfoDto & { exportAs: 'abpPermissionManagement', styles: [ ` - .overflow-scroll { - max-height: 70vh; - overflow-y: scroll; - } - .scroll-in-modal { overflow: auto; - max-height: calc(100vh - 15rem); - } - - fieldset legend { - float: none; - width: auto; + /* + To maintain a 28px top margin and 28px bottom margin when the modal reaches full height, the scrollable area needs to be 100vh - 23.1rem + */ + max-height: calc(100vh - 23.1rem); } .lpx-scroll-pills-container ul { display: block; - max-height: 500px; overflow-y: auto; } + /* Target mobile screens */ + @media (max-width: 768px) { + .scroll-in-modal { + max-height: calc(100vh - 15rem); + } + .lpx-scroll-pills-container ul { + max-height: 500px; + } + } + + fieldset legend { + float: none; + width: auto; + } + .lpx-scroll-pills-container .tab-content { padding-top: 0 !important; padding-bottom: 0 !important; diff --git a/npm/ng-packs/packages/schematics/package.json b/npm/ng-packs/packages/schematics/package.json index 8faad21ce1..e24ccf8d65 100644 --- a/npm/ng-packs/packages/schematics/package.json +++ b/npm/ng-packs/packages/schematics/package.json @@ -1,6 +1,6 @@ { "name": "@abp/ng.schematics", - "version": "9.1.0-rc.3", + "version": "9.1.0", "author": "", "schematics": "./collection.json", "dependencies": { diff --git a/npm/ng-packs/packages/setting-management/config/src/lib/components/email-setting-group/email-setting-group.component.ts b/npm/ng-packs/packages/setting-management/config/src/lib/components/email-setting-group/email-setting-group.component.ts index 282072e170..f1c8557ed1 100644 --- a/npm/ng-packs/packages/setting-management/config/src/lib/components/email-setting-group/email-setting-group.component.ts +++ b/npm/ng-packs/packages/setting-management/config/src/lib/components/email-setting-group/email-setting-group.component.ts @@ -101,7 +101,7 @@ export class EmailSettingGroupComponent implements OnInit { } this.emailSettingsService.sendTestEmail(this.emailTestForm.value).subscribe(res => { - this.toasterService.success('AbpSettingManagement::SuccessfullySent'); + this.toasterService.success('AbpSettingManagement::SentSuccessfully'); this.isEmailTestModalOpen = false; }); } diff --git a/npm/ng-packs/packages/setting-management/package.json b/npm/ng-packs/packages/setting-management/package.json index db40a80e15..776184b0a9 100644 --- a/npm/ng-packs/packages/setting-management/package.json +++ b/npm/ng-packs/packages/setting-management/package.json @@ -1,14 +1,14 @@ { "name": "@abp/ng.setting-management", - "version": "9.1.0-rc.3", + "version": "9.1.0", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.components": "~9.1.0-rc.3", - "@abp/ng.theme.shared": "~9.1.0-rc.3", + "@abp/ng.components": "~9.1.0", + "@abp/ng.theme.shared": "~9.1.0", "tslib": "^2.0.0" }, "publishConfig": { diff --git a/npm/ng-packs/packages/tenant-management/package.json b/npm/ng-packs/packages/tenant-management/package.json index fb069ab824..f114aa0b34 100644 --- a/npm/ng-packs/packages/tenant-management/package.json +++ b/npm/ng-packs/packages/tenant-management/package.json @@ -1,14 +1,14 @@ { "name": "@abp/ng.tenant-management", - "version": "9.1.0-rc.3", + "version": "9.1.0", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.feature-management": "~9.1.0-rc.3", - "@abp/ng.theme.shared": "~9.1.0-rc.3", + "@abp/ng.feature-management": "~9.1.0", + "@abp/ng.theme.shared": "~9.1.0", "tslib": "^2.0.0" }, "publishConfig": { diff --git a/npm/ng-packs/packages/theme-basic/package.json b/npm/ng-packs/packages/theme-basic/package.json index 64b0f2e716..b7d4615dbc 100644 --- a/npm/ng-packs/packages/theme-basic/package.json +++ b/npm/ng-packs/packages/theme-basic/package.json @@ -1,14 +1,14 @@ { "name": "@abp/ng.theme.basic", - "version": "9.1.0-rc.3", + "version": "9.1.0", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.account.core": "~9.1.0-rc.3", - "@abp/ng.theme.shared": "~9.1.0-rc.3", + "@abp/ng.account.core": "~9.1.0", + "@abp/ng.theme.shared": "~9.1.0", "tslib": "^2.0.0" }, "publishConfig": { diff --git a/npm/ng-packs/packages/theme-shared/package.json b/npm/ng-packs/packages/theme-shared/package.json index f96f840d60..66186e8145 100644 --- a/npm/ng-packs/packages/theme-shared/package.json +++ b/npm/ng-packs/packages/theme-shared/package.json @@ -1,13 +1,13 @@ { "name": "@abp/ng.theme.shared", - "version": "9.1.0-rc.3", + "version": "9.1.0", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.core": "~9.1.0-rc.3", + "@abp/ng.core": "~9.1.0", "@fortawesome/fontawesome-free": "^5.0.0", "@ng-bootstrap/ng-bootstrap": "~18.0.0", "@ngx-validate/core": "^0.2.0", diff --git a/npm/packs/anchor-js/package.json b/npm/packs/anchor-js/package.json index b439805dc2..9d969caf2b 100644 --- a/npm/packs/anchor-js/package.json +++ b/npm/packs/anchor-js/package.json @@ -1,11 +1,11 @@ { - "version": "9.1.0-rc.3", + "version": "9.1.0", "name": "@abp/anchor-js", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~9.1.0-rc.3", + "@abp/core": "~9.1.0", "anchor-js": "^5.0.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/aspnetcore.components.server.basictheme/package.json b/npm/packs/aspnetcore.components.server.basictheme/package.json index a970622aa0..12c71f64a7 100644 --- a/npm/packs/aspnetcore.components.server.basictheme/package.json +++ b/npm/packs/aspnetcore.components.server.basictheme/package.json @@ -1,11 +1,11 @@ { - "version": "9.1.0-rc.3", + "version": "9.1.0", "name": "@abp/aspnetcore.components.server.basictheme", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/aspnetcore.components.server.theming": "~9.1.0-rc.3" + "@abp/aspnetcore.components.server.theming": "~9.1.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", "homepage": "https://abp.io", diff --git a/npm/packs/aspnetcore.components.server.theming/package.json b/npm/packs/aspnetcore.components.server.theming/package.json index 2634f15ba0..21ade699fd 100644 --- a/npm/packs/aspnetcore.components.server.theming/package.json +++ b/npm/packs/aspnetcore.components.server.theming/package.json @@ -1,12 +1,12 @@ { - "version": "9.1.0-rc.3", + "version": "9.1.0", "name": "@abp/aspnetcore.components.server.theming", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/bootstrap": "~9.1.0-rc.3", - "@abp/font-awesome": "~9.1.0-rc.3" + "@abp/bootstrap": "~9.1.0", + "@abp/font-awesome": "~9.1.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", "homepage": "https://abp.io", diff --git a/npm/packs/aspnetcore.mvc.ui.theme.basic/package.json b/npm/packs/aspnetcore.mvc.ui.theme.basic/package.json index 98abd1d94d..1698a9c7bb 100644 --- a/npm/packs/aspnetcore.mvc.ui.theme.basic/package.json +++ b/npm/packs/aspnetcore.mvc.ui.theme.basic/package.json @@ -1,5 +1,5 @@ { - "version": "9.1.0-rc.3", + "version": "9.1.0", "name": "@abp/aspnetcore.mvc.ui.theme.basic", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.shared": "~9.1.0-rc.3" + "@abp/aspnetcore.mvc.ui.theme.shared": "~9.1.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", "homepage": "https://abp.io", diff --git a/npm/packs/aspnetcore.mvc.ui.theme.shared/package.json b/npm/packs/aspnetcore.mvc.ui.theme.shared/package.json index cfa4b24f91..c2eb417d62 100644 --- a/npm/packs/aspnetcore.mvc.ui.theme.shared/package.json +++ b/npm/packs/aspnetcore.mvc.ui.theme.shared/package.json @@ -1,5 +1,5 @@ { - "version": "9.1.0-rc.3", + "version": "9.1.0", "name": "@abp/aspnetcore.mvc.ui.theme.shared", "repository": { "type": "git", diff --git a/npm/packs/aspnetcore.mvc.ui/package-lock.json b/npm/packs/aspnetcore.mvc.ui/package-lock.json index b86a1c0216..9c165b8f9f 100644 --- a/npm/packs/aspnetcore.mvc.ui/package-lock.json +++ b/npm/packs/aspnetcore.mvc.ui/package-lock.json @@ -1,6 +1,6 @@ { "name": "@abp/aspnetcore.mvc.ui", - "version": "9.1.0-rc.3", + "version": "9.1.0", "lockfileVersion": 1, "requires": true, "packages": { diff --git a/npm/packs/aspnetcore.mvc.ui/package.json b/npm/packs/aspnetcore.mvc.ui/package.json index d5781c64c6..da4cacc02f 100644 --- a/npm/packs/aspnetcore.mvc.ui/package.json +++ b/npm/packs/aspnetcore.mvc.ui/package.json @@ -1,5 +1,5 @@ { - "version": "9.1.0-rc.3", + "version": "9.1.0", "name": "@abp/aspnetcore.mvc.ui", "repository": { "type": "git", diff --git a/npm/packs/blogging/package.json b/npm/packs/blogging/package.json index 322f9cddd3..92711041fa 100644 --- a/npm/packs/blogging/package.json +++ b/npm/packs/blogging/package.json @@ -1,14 +1,14 @@ { - "version": "9.1.0-rc.3", + "version": "9.1.0", "name": "@abp/blogging", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.shared": "~9.1.0-rc.3", - "@abp/owl.carousel": "~9.1.0-rc.3", - "@abp/prismjs": "~9.1.0-rc.3", - "@abp/tui-editor": "~9.1.0-rc.3" + "@abp/aspnetcore.mvc.ui.theme.shared": "~9.1.0", + "@abp/owl.carousel": "~9.1.0", + "@abp/prismjs": "~9.1.0", + "@abp/tui-editor": "~9.1.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", "homepage": "https://abp.io", diff --git a/npm/packs/bootstrap-datepicker/package.json b/npm/packs/bootstrap-datepicker/package.json index 47bb0a4e08..dd0ff42756 100644 --- a/npm/packs/bootstrap-datepicker/package.json +++ b/npm/packs/bootstrap-datepicker/package.json @@ -1,5 +1,5 @@ { - "version": "9.1.0-rc.3", + "version": "9.1.0", "name": "@abp/bootstrap-datepicker", "repository": { "type": "git", diff --git a/npm/packs/bootstrap-daterangepicker/package.json b/npm/packs/bootstrap-daterangepicker/package.json index f1134de66b..d781d09684 100644 --- a/npm/packs/bootstrap-daterangepicker/package.json +++ b/npm/packs/bootstrap-daterangepicker/package.json @@ -1,5 +1,5 @@ { - "version": "9.1.0-rc.3", + "version": "9.1.0", "name": "@abp/bootstrap-daterangepicker", "repository": { "type": "git", diff --git a/npm/packs/bootstrap/package.json b/npm/packs/bootstrap/package.json index 6345a89871..9a5113ce39 100644 --- a/npm/packs/bootstrap/package.json +++ b/npm/packs/bootstrap/package.json @@ -1,5 +1,5 @@ { - "version": "9.1.0-rc.3", + "version": "9.1.0", "name": "@abp/bootstrap", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/core": "~9.1.0-rc.3", + "@abp/core": "~9.1.0", "bootstrap": "^5.3.3" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/chart.js/package.json b/npm/packs/chart.js/package.json index 7576e99c7b..f8583b45f8 100644 --- a/npm/packs/chart.js/package.json +++ b/npm/packs/chart.js/package.json @@ -1,5 +1,5 @@ { - "version": "9.1.0-rc.3", + "version": "9.1.0", "name": "@abp/chart.js", "publishConfig": { "access": "public" diff --git a/npm/packs/clipboard/package.json b/npm/packs/clipboard/package.json index 181b5cd7a6..a202577b70 100644 --- a/npm/packs/clipboard/package.json +++ b/npm/packs/clipboard/package.json @@ -1,11 +1,11 @@ { - "version": "9.1.0-rc.3", + "version": "9.1.0", "name": "@abp/clipboard", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~9.1.0-rc.3", + "@abp/core": "~9.1.0", "clipboard": "^2.0.11" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/cms-kit.admin/package.json b/npm/packs/cms-kit.admin/package.json index 9003a445d8..0598fb1846 100644 --- a/npm/packs/cms-kit.admin/package.json +++ b/npm/packs/cms-kit.admin/package.json @@ -1,16 +1,16 @@ { - "version": "9.1.0-rc.3", + "version": "9.1.0", "name": "@abp/cms-kit.admin", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/codemirror": "~9.1.0-rc.3", - "@abp/jstree": "~9.1.0-rc.3", - "@abp/markdown-it": "~9.1.0-rc.3", - "@abp/slugify": "~9.1.0-rc.3", - "@abp/tui-editor": "~9.1.0-rc.3", - "@abp/uppy": "~9.1.0-rc.3" + "@abp/codemirror": "~9.1.0", + "@abp/jstree": "~9.1.0", + "@abp/markdown-it": "~9.1.0", + "@abp/slugify": "~9.1.0", + "@abp/tui-editor": "~9.1.0", + "@abp/uppy": "~9.1.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", "homepage": "https://abp.io", diff --git a/npm/packs/cms-kit.public/package.json b/npm/packs/cms-kit.public/package.json index e74040429e..9b4cab1f3e 100644 --- a/npm/packs/cms-kit.public/package.json +++ b/npm/packs/cms-kit.public/package.json @@ -1,12 +1,12 @@ { - "version": "9.1.0-rc.3", + "version": "9.1.0", "name": "@abp/cms-kit.public", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/highlight.js": "~9.1.0-rc.3", - "@abp/star-rating-svg": "~9.1.0-rc.3" + "@abp/highlight.js": "~9.1.0", + "@abp/star-rating-svg": "~9.1.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", "homepage": "https://abp.io", diff --git a/npm/packs/cms-kit/package.json b/npm/packs/cms-kit/package.json index 57fe9ca369..cde6e5028c 100644 --- a/npm/packs/cms-kit/package.json +++ b/npm/packs/cms-kit/package.json @@ -1,12 +1,12 @@ { - "version": "9.1.0-rc.3", + "version": "9.1.0", "name": "@abp/cms-kit", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/cms-kit.admin": "~9.1.0-rc.3", - "@abp/cms-kit.public": "~9.1.0-rc.3" + "@abp/cms-kit.admin": "~9.1.0", + "@abp/cms-kit.public": "~9.1.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", "homepage": "https://abp.io", diff --git a/npm/packs/codemirror/package.json b/npm/packs/codemirror/package.json index 27febc799d..aee1494139 100644 --- a/npm/packs/codemirror/package.json +++ b/npm/packs/codemirror/package.json @@ -1,11 +1,11 @@ { - "version": "9.1.0-rc.3", + "version": "9.1.0", "name": "@abp/codemirror", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~9.1.0-rc.3", + "@abp/core": "~9.1.0", "codemirror": "^5.65.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/core/package.json b/npm/packs/core/package.json index 37265bbca8..d3b43f9759 100644 --- a/npm/packs/core/package.json +++ b/npm/packs/core/package.json @@ -1,5 +1,5 @@ { - "version": "9.1.0-rc.3", + "version": "9.1.0", "name": "@abp/core", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/utils": "~9.1.0-rc.3" + "@abp/utils": "~9.1.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", "homepage": "https://abp.io", diff --git a/npm/packs/cropperjs/package.json b/npm/packs/cropperjs/package.json index 75b4044898..ba141a7139 100644 --- a/npm/packs/cropperjs/package.json +++ b/npm/packs/cropperjs/package.json @@ -1,11 +1,11 @@ { - "version": "9.1.0-rc.3", + "version": "9.1.0", "name": "@abp/cropperjs", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~9.1.0-rc.3", + "@abp/core": "~9.1.0", "cropperjs": "^1.6.2" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/datatables.net-bs4/package.json b/npm/packs/datatables.net-bs4/package.json index 0e5fae8e94..40eea480dd 100644 --- a/npm/packs/datatables.net-bs4/package.json +++ b/npm/packs/datatables.net-bs4/package.json @@ -1,5 +1,5 @@ { - "version": "9.1.0-rc.3", + "version": "9.1.0", "name": "@abp/datatables.net-bs4", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/datatables.net": "~9.1.0-rc.3", + "@abp/datatables.net": "~9.1.0", "datatables.net-bs4": "^2.1.8" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/datatables.net-bs5/package.json b/npm/packs/datatables.net-bs5/package.json index bf56e88303..1959b96048 100644 --- a/npm/packs/datatables.net-bs5/package.json +++ b/npm/packs/datatables.net-bs5/package.json @@ -1,11 +1,11 @@ { - "version": "9.1.0-rc.3", + "version": "9.1.0", "name": "@abp/datatables.net-bs5", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/datatables.net": "~9.1.0-rc.3", + "@abp/datatables.net": "~9.1.0", "datatables.net-bs5": "^2.1.8" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/datatables.net/package.json b/npm/packs/datatables.net/package.json index c3451ce32a..5c996ac641 100644 --- a/npm/packs/datatables.net/package.json +++ b/npm/packs/datatables.net/package.json @@ -1,5 +1,5 @@ { - "version": "9.1.0-rc.3", + "version": "9.1.0", "name": "@abp/datatables.net", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/jquery": "~9.1.0-rc.3", + "@abp/jquery": "~9.1.0", "datatables.net": "^2.1.8" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/docs/package.json b/npm/packs/docs/package.json index 1cf121c390..406e6c55c3 100644 --- a/npm/packs/docs/package.json +++ b/npm/packs/docs/package.json @@ -1,15 +1,15 @@ { - "version": "9.1.0-rc.3", + "version": "9.1.0", "name": "@abp/docs", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/anchor-js": "~9.1.0-rc.3", - "@abp/clipboard": "~9.1.0-rc.3", - "@abp/malihu-custom-scrollbar-plugin": "~9.1.0-rc.3", - "@abp/popper.js": "~9.1.0-rc.3", - "@abp/prismjs": "~9.1.0-rc.3" + "@abp/anchor-js": "~9.1.0", + "@abp/clipboard": "~9.1.0", + "@abp/malihu-custom-scrollbar-plugin": "~9.1.0", + "@abp/popper.js": "~9.1.0", + "@abp/prismjs": "~9.1.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", "homepage": "https://abp.io", diff --git a/npm/packs/flag-icon-css/package.json b/npm/packs/flag-icon-css/package.json index e1cc95a4e2..56cf49fb2a 100644 --- a/npm/packs/flag-icon-css/package.json +++ b/npm/packs/flag-icon-css/package.json @@ -1,5 +1,5 @@ { - "version": "9.1.0-rc.3", + "version": "9.1.0", "name": "@abp/flag-icon-css", "publishConfig": { "access": "public" diff --git a/npm/packs/flag-icons/package.json b/npm/packs/flag-icons/package.json index 57455cec7a..aacd2e2b7f 100644 --- a/npm/packs/flag-icons/package.json +++ b/npm/packs/flag-icons/package.json @@ -1,5 +1,5 @@ { - "version": "9.1.0-rc.3", + "version": "9.1.0", "name": "@abp/flag-icons", "publishConfig": { "access": "public" diff --git a/npm/packs/font-awesome/package.json b/npm/packs/font-awesome/package.json index a474c16741..7d6960cb29 100644 --- a/npm/packs/font-awesome/package.json +++ b/npm/packs/font-awesome/package.json @@ -1,5 +1,5 @@ { - "version": "9.1.0-rc.3", + "version": "9.1.0", "name": "@abp/font-awesome", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/core": "~9.1.0-rc.3", + "@abp/core": "~9.1.0", "@fortawesome/fontawesome-free": "^6.6.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/highlight.js/package.json b/npm/packs/highlight.js/package.json index 879964e499..7ebd7ffb49 100644 --- a/npm/packs/highlight.js/package.json +++ b/npm/packs/highlight.js/package.json @@ -1,11 +1,11 @@ { - "version": "9.1.0-rc.3", + "version": "9.1.0", "name": "@abp/highlight.js", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~9.1.0-rc.3", + "@abp/core": "~9.1.0", "@highlightjs/cdn-assets": "~11.10.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/jquery-form/package.json b/npm/packs/jquery-form/package.json index 0f702272c8..2dd33578e5 100644 --- a/npm/packs/jquery-form/package.json +++ b/npm/packs/jquery-form/package.json @@ -1,5 +1,5 @@ { - "version": "9.1.0-rc.3", + "version": "9.1.0", "name": "@abp/jquery-form", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/jquery": "~9.1.0-rc.3", + "@abp/jquery": "~9.1.0", "jquery-form": "^4.3.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/jquery-validation-unobtrusive/package.json b/npm/packs/jquery-validation-unobtrusive/package.json index cd0365e29f..3f095cf7b2 100644 --- a/npm/packs/jquery-validation-unobtrusive/package.json +++ b/npm/packs/jquery-validation-unobtrusive/package.json @@ -1,5 +1,5 @@ { - "version": "9.1.0-rc.3", + "version": "9.1.0", "name": "@abp/jquery-validation-unobtrusive", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/jquery-validation": "~9.1.0-rc.3", + "@abp/jquery-validation": "~9.1.0", "jquery-validation-unobtrusive": "^4.0.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/jquery-validation/package.json b/npm/packs/jquery-validation/package.json index 9d41f5cc95..0d0556341d 100644 --- a/npm/packs/jquery-validation/package.json +++ b/npm/packs/jquery-validation/package.json @@ -1,5 +1,5 @@ { - "version": "9.1.0-rc.3", + "version": "9.1.0", "name": "@abp/jquery-validation", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/jquery": "~9.1.0-rc.3", + "@abp/jquery": "~9.1.0", "jquery-validation": "^1.21.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/jquery/package.json b/npm/packs/jquery/package.json index 57f6bf2895..0960625744 100644 --- a/npm/packs/jquery/package.json +++ b/npm/packs/jquery/package.json @@ -1,5 +1,5 @@ { - "version": "9.1.0-rc.3", + "version": "9.1.0", "name": "@abp/jquery", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/core": "~9.1.0-rc.3", + "@abp/core": "~9.1.0", "jquery": "~3.7.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/jstree/package.json b/npm/packs/jstree/package.json index 312a4e172a..71d103fd03 100644 --- a/npm/packs/jstree/package.json +++ b/npm/packs/jstree/package.json @@ -1,11 +1,11 @@ { - "version": "9.1.0-rc.3", + "version": "9.1.0", "name": "@abp/jstree", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/jquery": "~9.1.0-rc.3", + "@abp/jquery": "~9.1.0", "jstree": "^3.3.17" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/lodash/package.json b/npm/packs/lodash/package.json index bdab039b3e..b9c68b3460 100644 --- a/npm/packs/lodash/package.json +++ b/npm/packs/lodash/package.json @@ -1,5 +1,5 @@ { - "version": "9.1.0-rc.3", + "version": "9.1.0", "name": "@abp/lodash", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/core": "~9.1.0-rc.3", + "@abp/core": "~9.1.0", "lodash": "^4.17.21" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/luxon/package.json b/npm/packs/luxon/package.json index 428efa5a61..e67978142c 100644 --- a/npm/packs/luxon/package.json +++ b/npm/packs/luxon/package.json @@ -1,5 +1,5 @@ { - "version": "9.1.0-rc.3", + "version": "9.1.0", "name": "@abp/luxon", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/core": "~9.1.0-rc.3", + "@abp/core": "~9.1.0", "luxon": "^3.5.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/malihu-custom-scrollbar-plugin/package.json b/npm/packs/malihu-custom-scrollbar-plugin/package.json index 0e5ed43b40..0910318eee 100644 --- a/npm/packs/malihu-custom-scrollbar-plugin/package.json +++ b/npm/packs/malihu-custom-scrollbar-plugin/package.json @@ -1,5 +1,5 @@ { - "version": "9.1.0-rc.3", + "version": "9.1.0", "name": "@abp/malihu-custom-scrollbar-plugin", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/core": "~9.1.0-rc.3", + "@abp/core": "~9.1.0", "malihu-custom-scrollbar-plugin": "^3.1.5" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/markdown-it/package.json b/npm/packs/markdown-it/package.json index 0483dc34c0..a0d177f0dc 100644 --- a/npm/packs/markdown-it/package.json +++ b/npm/packs/markdown-it/package.json @@ -1,11 +1,11 @@ { - "version": "9.1.0-rc.3", + "version": "9.1.0", "name": "@abp/markdown-it", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~9.1.0-rc.3", + "@abp/core": "~9.1.0", "markdown-it": "^14.1.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/moment/package.json b/npm/packs/moment/package.json index 83865a4260..cc72bf86fe 100644 --- a/npm/packs/moment/package.json +++ b/npm/packs/moment/package.json @@ -1,5 +1,5 @@ { - "version": "9.1.0-rc.3", + "version": "9.1.0", "name": "@abp/moment", "repository": { "type": "git", diff --git a/npm/packs/owl.carousel/package.json b/npm/packs/owl.carousel/package.json index 8709d090a0..dd552235f1 100644 --- a/npm/packs/owl.carousel/package.json +++ b/npm/packs/owl.carousel/package.json @@ -1,11 +1,11 @@ { - "version": "9.1.0-rc.3", + "version": "9.1.0", "name": "@abp/owl.carousel", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~9.1.0-rc.3", + "@abp/core": "~9.1.0", "owl.carousel": "^2.3.4" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/popper.js/package.json b/npm/packs/popper.js/package.json index 7fa6fe33b9..4183859dc6 100644 --- a/npm/packs/popper.js/package.json +++ b/npm/packs/popper.js/package.json @@ -1,11 +1,11 @@ { - "version": "9.1.0-rc.3", + "version": "9.1.0", "name": "@abp/popper.js", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~9.1.0-rc.3", + "@abp/core": "~9.1.0", "@popperjs/core": "^2.11.8" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/prismjs/package.json b/npm/packs/prismjs/package.json index 14e7be031a..90472e3825 100644 --- a/npm/packs/prismjs/package.json +++ b/npm/packs/prismjs/package.json @@ -1,12 +1,12 @@ { - "version": "9.1.0-rc.3", + "version": "9.1.0", "name": "@abp/prismjs", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/clipboard": "~9.1.0-rc.3", - "@abp/core": "~9.1.0-rc.3", + "@abp/clipboard": "~9.1.0", + "@abp/core": "~9.1.0", "prismjs": "^1.29.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/qrcode/package.json b/npm/packs/qrcode/package.json index 9ba88fb1b8..3a7ebf11cb 100644 --- a/npm/packs/qrcode/package.json +++ b/npm/packs/qrcode/package.json @@ -1,5 +1,5 @@ { - "version": "9.1.0-rc.3", + "version": "9.1.0", "name": "@abp/qrcode", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/core": "~9.1.0-rc.3" + "@abp/core": "~9.1.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", "homepage": "https://abp.io", diff --git a/npm/packs/select2/package.json b/npm/packs/select2/package.json index 0462d0748c..d49623735f 100644 --- a/npm/packs/select2/package.json +++ b/npm/packs/select2/package.json @@ -1,5 +1,5 @@ { - "version": "9.1.0-rc.3", + "version": "9.1.0", "name": "@abp/select2", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/core": "~9.1.0-rc.3", + "@abp/core": "~9.1.0", "select2": "^4.0.13" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/signalr/package.json b/npm/packs/signalr/package.json index 354ab3df1b..3fdfc65ff5 100644 --- a/npm/packs/signalr/package.json +++ b/npm/packs/signalr/package.json @@ -1,11 +1,11 @@ { - "version": "9.1.0-rc.3", + "version": "9.1.0", "name": "@abp/signalr", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~9.1.0-rc.3", + "@abp/core": "~9.1.0", "@microsoft/signalr": "~8.0.7" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/slugify/package.json b/npm/packs/slugify/package.json index 164e41a8be..def5d8810a 100644 --- a/npm/packs/slugify/package.json +++ b/npm/packs/slugify/package.json @@ -1,5 +1,5 @@ { - "version": "9.1.0-rc.3", + "version": "9.1.0", "name": "@abp/slugify", "publishConfig": { "access": "public" diff --git a/npm/packs/star-rating-svg/package.json b/npm/packs/star-rating-svg/package.json index a5f4a605e0..f4dfd3f4a4 100644 --- a/npm/packs/star-rating-svg/package.json +++ b/npm/packs/star-rating-svg/package.json @@ -1,11 +1,11 @@ { - "version": "9.1.0-rc.3", + "version": "9.1.0", "name": "@abp/star-rating-svg", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/jquery": "~9.1.0-rc.3", + "@abp/jquery": "~9.1.0", "star-rating-svg": "^3.5.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/sweetalert2/package.json b/npm/packs/sweetalert2/package.json index 3a2d201000..0718375fd6 100644 --- a/npm/packs/sweetalert2/package.json +++ b/npm/packs/sweetalert2/package.json @@ -1,5 +1,5 @@ { - "version": "9.1.0-rc.3", + "version": "9.1.0", "name": "@abp/sweetalert2", "publishConfig": { "access": "public" @@ -10,7 +10,7 @@ "directory": "npm/packs/sweetalert2" }, "dependencies": { - "@abp/core": "~9.1.0-rc.3", + "@abp/core": "~9.1.0", "sweetalert2": "^11.14.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/timeago/package.json b/npm/packs/timeago/package.json index 26e4d61abc..f67212ca13 100644 --- a/npm/packs/timeago/package.json +++ b/npm/packs/timeago/package.json @@ -1,5 +1,5 @@ { - "version": "9.1.0-rc.3", + "version": "9.1.0", "name": "@abp/timeago", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/jquery": "~9.1.0-rc.3", + "@abp/jquery": "~9.1.0", "timeago": "^1.6.7" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/toastr/package.json b/npm/packs/toastr/package.json index 8983bbac7d..3d4a144b07 100644 --- a/npm/packs/toastr/package.json +++ b/npm/packs/toastr/package.json @@ -1,5 +1,5 @@ { - "version": "9.1.0-rc.3", + "version": "9.1.0", "name": "@abp/toastr", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/jquery": "~9.1.0-rc.3", + "@abp/jquery": "~9.1.0", "toastr": "^2.1.4" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/tui-editor/package.json b/npm/packs/tui-editor/package.json index ee75e156f0..10e0b3e86f 100644 --- a/npm/packs/tui-editor/package.json +++ b/npm/packs/tui-editor/package.json @@ -1,12 +1,12 @@ { - "version": "9.1.0-rc.3", + "version": "9.1.0", "name": "@abp/tui-editor", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/jquery": "~9.1.0-rc.3", - "@abp/prismjs": "~9.1.0-rc.3" + "@abp/jquery": "~9.1.0", + "@abp/prismjs": "~9.1.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", "homepage": "https://abp.io", diff --git a/npm/packs/uppy/package.json b/npm/packs/uppy/package.json index aa098049db..77192639e8 100644 --- a/npm/packs/uppy/package.json +++ b/npm/packs/uppy/package.json @@ -1,11 +1,11 @@ { - "version": "9.1.0-rc.3", + "version": "9.1.0", "name": "@abp/uppy", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~9.1.0-rc.3", + "@abp/core": "~9.1.0", "uppy": "^4.4.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/utils/package.json b/npm/packs/utils/package.json index c55e688db3..f332e16e93 100644 --- a/npm/packs/utils/package.json +++ b/npm/packs/utils/package.json @@ -1,6 +1,6 @@ { "name": "@abp/utils", - "version": "9.1.0-rc.3", + "version": "9.1.0", "scripts": { "prepublishOnly": "yarn install --ignore-scripts && node prepublish.js", "ng": "ng", diff --git a/npm/packs/vee-validate/package.json b/npm/packs/vee-validate/package.json index 175ab3c9a4..7f7d993c12 100644 --- a/npm/packs/vee-validate/package.json +++ b/npm/packs/vee-validate/package.json @@ -1,11 +1,11 @@ { - "version": "9.1.0-rc.3", + "version": "9.1.0", "name": "@abp/vee-validate", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/vue": "~9.1.0-rc.3", + "@abp/vue": "~9.1.0", "vee-validate": "~3.4.4" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/virtual-file-explorer/package.json b/npm/packs/virtual-file-explorer/package.json index bb4211ed5b..f1325521b4 100644 --- a/npm/packs/virtual-file-explorer/package.json +++ b/npm/packs/virtual-file-explorer/package.json @@ -1,12 +1,12 @@ { - "version": "9.1.0-rc.3", + "version": "9.1.0", "name": "@abp/virtual-file-explorer", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/clipboard": "~9.1.0-rc.3", - "@abp/prismjs": "~9.1.0-rc.3" + "@abp/clipboard": "~9.1.0", + "@abp/prismjs": "~9.1.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", "homepage": "https://abp.io", diff --git a/npm/packs/vue/package.json b/npm/packs/vue/package.json index 8a6f787684..6627466172 100644 --- a/npm/packs/vue/package.json +++ b/npm/packs/vue/package.json @@ -1,5 +1,5 @@ { - "version": "9.1.0-rc.3", + "version": "9.1.0", "name": "@abp/vue", "publishConfig": { "access": "public" diff --git a/npm/packs/zxcvbn/package.json b/npm/packs/zxcvbn/package.json index f15e03485c..713bd926bd 100644 --- a/npm/packs/zxcvbn/package.json +++ b/npm/packs/zxcvbn/package.json @@ -1,11 +1,11 @@ { - "version": "9.1.0-rc.3", + "version": "9.1.0", "name": "@abp/zxcvbn", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~9.1.0-rc.3", + "@abp/core": "~9.1.0", "zxcvbn": "^4.4.2" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/nupkg/common.ps1 b/nupkg/common.ps1 index e60f374566..e2d65a631c 100644 --- a/nupkg/common.ps1 +++ b/nupkg/common.ps1 @@ -99,6 +99,7 @@ $projects = ( "framework/src/Volo.Abp.AspNetCore.Authentication.OpenIdConnect", "framework/src/Volo.Abp.AspNetCore.Abstractions", "framework/src/Volo.Abp.AspNetCore", + "framework/src/Volo.Abp.AspNetCore.Bundling", "framework/src/Volo.Abp.AspNetCore.Mvc.Dapr", "framework/src/Volo.Abp.AspNetCore.Mvc.Dapr.EventBus", "framework/src/Volo.Abp.AspNetCore.Components", @@ -111,6 +112,7 @@ $projects = ( "framework/src/Volo.Abp.AspNetCore.Components.WebAssembly.Theming.Bundling", "framework/src/Volo.Abp.AspNetCore.Components.Server", "framework/src/Volo.Abp.AspNetCore.Components.Server.Theming", + "framework/src/Volo.Abp.AspNetCore.Components.MauiBlazor.Bundling", "framework/src/Volo.Abp.AspNetCore.Components.MauiBlazor.Theming", "framework/src/Volo.Abp.AspNetCore.Components.MauiBlazor.Theming.Bundling", "framework/src/Volo.Abp.AspNetCore.MultiTenancy", @@ -442,6 +444,7 @@ $projects = ( "source-code/Volo.Abp.Users.SourceCode", # modules/virtual-file-explorer + "modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Contracts", "modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web", "modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Installer", "source-code/Volo.Abp.VirtualFileExplorer.SourceCode", diff --git a/source-code/Volo.Abp.Account.SourceCode/Volo.Abp.Account.SourceCode.zip b/source-code/Volo.Abp.Account.SourceCode/Volo.Abp.Account.SourceCode.zip index 435a07a9eb..1e82cb36f3 100644 Binary files a/source-code/Volo.Abp.Account.SourceCode/Volo.Abp.Account.SourceCode.zip and b/source-code/Volo.Abp.Account.SourceCode/Volo.Abp.Account.SourceCode.zip differ diff --git a/source-code/Volo.Abp.AuditLogging.SourceCode/Volo.Abp.AuditLogging.SourceCode.zip b/source-code/Volo.Abp.AuditLogging.SourceCode/Volo.Abp.AuditLogging.SourceCode.zip index 75616eb895..2c440abed4 100644 Binary files a/source-code/Volo.Abp.AuditLogging.SourceCode/Volo.Abp.AuditLogging.SourceCode.zip and b/source-code/Volo.Abp.AuditLogging.SourceCode/Volo.Abp.AuditLogging.SourceCode.zip differ diff --git a/source-code/Volo.Abp.BackgroundJobs.SourceCode/Volo.Abp.BackgroundJobs.SourceCode.zip b/source-code/Volo.Abp.BackgroundJobs.SourceCode/Volo.Abp.BackgroundJobs.SourceCode.zip index aa5591af87..f8e59433ec 100644 Binary files a/source-code/Volo.Abp.BackgroundJobs.SourceCode/Volo.Abp.BackgroundJobs.SourceCode.zip and b/source-code/Volo.Abp.BackgroundJobs.SourceCode/Volo.Abp.BackgroundJobs.SourceCode.zip differ diff --git a/source-code/Volo.Abp.BasicTheme.SourceCode/Volo.Abp.BasicTheme.SourceCode.zip b/source-code/Volo.Abp.BasicTheme.SourceCode/Volo.Abp.BasicTheme.SourceCode.zip index 10b05ed86b..8bbf604b22 100644 Binary files a/source-code/Volo.Abp.BasicTheme.SourceCode/Volo.Abp.BasicTheme.SourceCode.zip and b/source-code/Volo.Abp.BasicTheme.SourceCode/Volo.Abp.BasicTheme.SourceCode.zip differ diff --git a/source-code/Volo.Abp.BlobStoring.Database.SourceCode/Volo.Abp.BlobStoring.Database.SourceCode.zip b/source-code/Volo.Abp.BlobStoring.Database.SourceCode/Volo.Abp.BlobStoring.Database.SourceCode.zip index 1ffb2eba32..fcc61e518b 100644 Binary files a/source-code/Volo.Abp.BlobStoring.Database.SourceCode/Volo.Abp.BlobStoring.Database.SourceCode.zip and b/source-code/Volo.Abp.BlobStoring.Database.SourceCode/Volo.Abp.BlobStoring.Database.SourceCode.zip differ diff --git a/source-code/Volo.Abp.FeatureManagement.SourceCode/Volo.Abp.FeatureManagement.SourceCode.zip b/source-code/Volo.Abp.FeatureManagement.SourceCode/Volo.Abp.FeatureManagement.SourceCode.zip index 24d6dbb323..1d866503e1 100644 Binary files a/source-code/Volo.Abp.FeatureManagement.SourceCode/Volo.Abp.FeatureManagement.SourceCode.zip and b/source-code/Volo.Abp.FeatureManagement.SourceCode/Volo.Abp.FeatureManagement.SourceCode.zip differ diff --git a/source-code/Volo.Abp.Identity.SourceCode/Volo.Abp.Identity.SourceCode.zip b/source-code/Volo.Abp.Identity.SourceCode/Volo.Abp.Identity.SourceCode.zip index 0ee2a2d138..8b7e25811b 100644 Binary files a/source-code/Volo.Abp.Identity.SourceCode/Volo.Abp.Identity.SourceCode.zip and b/source-code/Volo.Abp.Identity.SourceCode/Volo.Abp.Identity.SourceCode.zip differ diff --git a/source-code/Volo.Abp.IdentityServer.SourceCode/Volo.Abp.IdentityServer.SourceCode.zip b/source-code/Volo.Abp.IdentityServer.SourceCode/Volo.Abp.IdentityServer.SourceCode.zip index 2e182c9417..c3c1c83ab4 100644 Binary files a/source-code/Volo.Abp.IdentityServer.SourceCode/Volo.Abp.IdentityServer.SourceCode.zip and b/source-code/Volo.Abp.IdentityServer.SourceCode/Volo.Abp.IdentityServer.SourceCode.zip differ diff --git a/source-code/Volo.Abp.OpenIddict.SourceCode/Volo.Abp.OpenIddict.SourceCode.zip b/source-code/Volo.Abp.OpenIddict.SourceCode/Volo.Abp.OpenIddict.SourceCode.zip index 54f2fb0593..0b8fa88db7 100644 Binary files a/source-code/Volo.Abp.OpenIddict.SourceCode/Volo.Abp.OpenIddict.SourceCode.zip and b/source-code/Volo.Abp.OpenIddict.SourceCode/Volo.Abp.OpenIddict.SourceCode.zip differ diff --git a/source-code/Volo.Abp.PermissionManagement.SourceCode/Volo.Abp.PermissionManagement.SourceCode.zip b/source-code/Volo.Abp.PermissionManagement.SourceCode/Volo.Abp.PermissionManagement.SourceCode.zip index 3c2999ccf7..2a67710260 100644 Binary files a/source-code/Volo.Abp.PermissionManagement.SourceCode/Volo.Abp.PermissionManagement.SourceCode.zip and b/source-code/Volo.Abp.PermissionManagement.SourceCode/Volo.Abp.PermissionManagement.SourceCode.zip differ diff --git a/source-code/Volo.Abp.SettingManagement.SourceCode/Volo.Abp.SettingManagement.SourceCode.zip b/source-code/Volo.Abp.SettingManagement.SourceCode/Volo.Abp.SettingManagement.SourceCode.zip index 78adb44e74..787b29fcf5 100644 Binary files a/source-code/Volo.Abp.SettingManagement.SourceCode/Volo.Abp.SettingManagement.SourceCode.zip and b/source-code/Volo.Abp.SettingManagement.SourceCode/Volo.Abp.SettingManagement.SourceCode.zip differ diff --git a/source-code/Volo.Abp.TenantManagement.SourceCode/Volo.Abp.TenantManagement.SourceCode.zip b/source-code/Volo.Abp.TenantManagement.SourceCode/Volo.Abp.TenantManagement.SourceCode.zip index bcd660dabd..9020cc0a8f 100644 Binary files a/source-code/Volo.Abp.TenantManagement.SourceCode/Volo.Abp.TenantManagement.SourceCode.zip and b/source-code/Volo.Abp.TenantManagement.SourceCode/Volo.Abp.TenantManagement.SourceCode.zip differ diff --git a/source-code/Volo.Abp.Users.SourceCode/Volo.Abp.Users.SourceCode.zip b/source-code/Volo.Abp.Users.SourceCode/Volo.Abp.Users.SourceCode.zip index 62f5e44ce3..78d4df97a3 100644 Binary files a/source-code/Volo.Abp.Users.SourceCode/Volo.Abp.Users.SourceCode.zip and b/source-code/Volo.Abp.Users.SourceCode/Volo.Abp.Users.SourceCode.zip differ diff --git a/source-code/Volo.Abp.VirtualFileExplorer.SourceCode/Volo.Abp.VirtualFileExplorer.SourceCode.zip b/source-code/Volo.Abp.VirtualFileExplorer.SourceCode/Volo.Abp.VirtualFileExplorer.SourceCode.zip index 70fa716020..c293c30d76 100644 Binary files a/source-code/Volo.Abp.VirtualFileExplorer.SourceCode/Volo.Abp.VirtualFileExplorer.SourceCode.zip and b/source-code/Volo.Abp.VirtualFileExplorer.SourceCode/Volo.Abp.VirtualFileExplorer.SourceCode.zip differ diff --git a/source-code/Volo.Blogging.SourceCode/Volo.Blogging.SourceCode.zip b/source-code/Volo.Blogging.SourceCode/Volo.Blogging.SourceCode.zip index 96d056b432..3d24e20657 100644 Binary files a/source-code/Volo.Blogging.SourceCode/Volo.Blogging.SourceCode.zip and b/source-code/Volo.Blogging.SourceCode/Volo.Blogging.SourceCode.zip differ diff --git a/source-code/Volo.ClientSimulation.SourceCode/Volo.ClientSimulation.SourceCode.zip b/source-code/Volo.ClientSimulation.SourceCode/Volo.ClientSimulation.SourceCode.zip index b2250b8e6d..69dc9ef644 100644 Binary files a/source-code/Volo.ClientSimulation.SourceCode/Volo.ClientSimulation.SourceCode.zip and b/source-code/Volo.ClientSimulation.SourceCode/Volo.ClientSimulation.SourceCode.zip differ diff --git a/source-code/Volo.CmsKit.SourceCode/Volo.CmsKit.SourceCode.zip b/source-code/Volo.CmsKit.SourceCode/Volo.CmsKit.SourceCode.zip index 5692ce1577..fad3b15607 100644 Binary files a/source-code/Volo.CmsKit.SourceCode/Volo.CmsKit.SourceCode.zip and b/source-code/Volo.CmsKit.SourceCode/Volo.CmsKit.SourceCode.zip differ diff --git a/source-code/Volo.Docs.SourceCode/Volo.Docs.SourceCode.zip b/source-code/Volo.Docs.SourceCode/Volo.Docs.SourceCode.zip index 23b98eca89..33092e2f94 100644 Binary files a/source-code/Volo.Docs.SourceCode/Volo.Docs.SourceCode.zip and b/source-code/Volo.Docs.SourceCode/Volo.Docs.SourceCode.zip differ diff --git a/templates/app-nolayers/angular/package.json b/templates/app-nolayers/angular/package.json index f4ee2b81de..7151d2898b 100644 --- a/templates/app-nolayers/angular/package.json +++ b/templates/app-nolayers/angular/package.json @@ -12,15 +12,15 @@ }, "private": true, "dependencies": { - "@abp/ng.account": "~9.1.0-rc.3", - "@abp/ng.components": "~9.1.0-rc.3", - "@abp/ng.core": "~9.1.0-rc.3", - "@abp/ng.identity": "~9.1.0-rc.3", - "@abp/ng.oauth": "~9.1.0-rc.3", - "@abp/ng.setting-management": "~9.1.0-rc.3", - "@abp/ng.tenant-management": "~9.1.0-rc.3", - "@abp/ng.theme.lepton-x": "~4.1.0-rc.3", - "@abp/ng.theme.shared": "~9.1.0-rc.3", + "@abp/ng.account": "~9.1.0", + "@abp/ng.components": "~9.1.0", + "@abp/ng.core": "~9.1.0", + "@abp/ng.identity": "~9.1.0", + "@abp/ng.oauth": "~9.1.0", + "@abp/ng.setting-management": "~9.1.0", + "@abp/ng.tenant-management": "~9.1.0", + "@abp/ng.theme.lepton-x": "~4.1.0", + "@abp/ng.theme.shared": "~9.1.0", "@angular/animations": "~19.1.0", "@angular/common": "~19.1.0", "@angular/compiler": "~19.1.0", @@ -36,7 +36,7 @@ "zone.js": "~0.15.0" }, "devDependencies": { - "@abp/ng.schematics": "~9.1.0-rc.3", + "@abp/ng.schematics": "~9.1.0", "@angular-devkit/build-angular": "~19.1.0", "@angular-eslint/builder": "~19.0.0", "@angular-eslint/eslint-plugin": "~19.0.0", diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/MyCompanyName.MyProjectName.Blazor.Server.Mongo.csproj b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/MyCompanyName.MyProjectName.Blazor.Server.Mongo.csproj index ace9c878ea..32cd17a78e 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/MyCompanyName.MyProjectName.Blazor.Server.Mongo.csproj +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/MyCompanyName.MyProjectName.Blazor.Server.Mongo.csproj @@ -82,7 +82,7 @@ - + diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/package.json b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/package.json index a49f04e964..c8a062a98d 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/package.json +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/package.json @@ -3,7 +3,7 @@ "name": "my-app", "private": true, "dependencies": { - "@abp/aspnetcore.components.server.leptonxlitetheme": "~4.1.0-rc.3", - "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~4.1.0-rc.3" + "@abp/aspnetcore.components.server.leptonxlitetheme": "~4.1.0", + "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~4.1.0" } } diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20241226032336_Initial.Designer.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20250310031518_Initial.Designer.cs similarity index 99% rename from templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20241226032336_Initial.Designer.cs rename to templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20250310031518_Initial.Designer.cs index 041cf03236..3fd2b00a67 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20241226032336_Initial.Designer.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20250310031518_Initial.Designer.cs @@ -13,7 +13,7 @@ using Volo.Abp.EntityFrameworkCore; namespace MyCompanyName.MyProjectName.Blazor.Server.Migrations { [DbContext(typeof(MyProjectNameDbContext))] - [Migration("20241226032336_Initial")] + [Migration("20250310031518_Initial")] partial class Initial { /// @@ -22,7 +22,7 @@ namespace MyCompanyName.MyProjectName.Blazor.Server.Migrations #pragma warning disable 612, 618 modelBuilder .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) - .HasAnnotation("ProductVersion", "9.0.0") + .HasAnnotation("ProductVersion", "9.0.2") .HasAnnotation("Relational:MaxIdentifierLength", 128); SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20241226032336_Initial.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20250310031518_Initial.cs similarity index 100% rename from templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20241226032336_Initial.cs rename to templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20250310031518_Initial.cs diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/MyProjectNameDbContextModelSnapshot.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/MyProjectNameDbContextModelSnapshot.cs index c6f919612a..29da815662 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/MyProjectNameDbContextModelSnapshot.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/MyProjectNameDbContextModelSnapshot.cs @@ -19,7 +19,7 @@ namespace MyCompanyName.MyProjectName.Blazor.Server.Migrations #pragma warning disable 612, 618 modelBuilder .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) - .HasAnnotation("ProductVersion", "9.0.0") + .HasAnnotation("ProductVersion", "9.0.2") .HasAnnotation("Relational:MaxIdentifierLength", 128); SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/MyCompanyName.MyProjectName.Blazor.Server.csproj b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/MyCompanyName.MyProjectName.Blazor.Server.csproj index 2623cbc7cc..7761bbde29 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/MyCompanyName.MyProjectName.Blazor.Server.csproj +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/MyCompanyName.MyProjectName.Blazor.Server.csproj @@ -83,11 +83,11 @@ - + - + runtime; build; native; contentfiles; analyzers compile; contentFiles; build; buildMultitargeting; buildTransitive; analyzers; native diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/package.json b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/package.json index 26b095a42b..a9583936e1 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/package.json +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/package.json @@ -3,7 +3,7 @@ "name": "my-app", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~4.1.0-rc.3", - "@abp/aspnetcore.components.server.leptonxlitetheme": "~4.1.0-rc.3" + "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~4.1.0", + "@abp/aspnetcore.components.server.leptonxlitetheme": "~4.1.0" } } diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Client/MyCompanyName.MyProjectName.Blazor.WebAssembly.Client.csproj b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Client/MyCompanyName.MyProjectName.Blazor.WebAssembly.Client.csproj index eab75defd4..34eeb42de4 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Client/MyCompanyName.MyProjectName.Blazor.WebAssembly.Client.csproj +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Client/MyCompanyName.MyProjectName.Blazor.WebAssembly.Client.csproj @@ -11,8 +11,8 @@ - - + + diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server.Mongo/MyCompanyName.MyProjectName.Blazor.WebAssembly.Server.Mongo.csproj b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server.Mongo/MyCompanyName.MyProjectName.Blazor.WebAssembly.Server.Mongo.csproj index 305cf43780..c42c2e72f1 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server.Mongo/MyCompanyName.MyProjectName.Blazor.WebAssembly.Server.Mongo.csproj +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server.Mongo/MyCompanyName.MyProjectName.Blazor.WebAssembly.Server.Mongo.csproj @@ -8,7 +8,7 @@ - + @@ -79,7 +79,7 @@ - + diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server.Mongo/package.json b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server.Mongo/package.json index 7b33847069..b1143bb98a 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server.Mongo/package.json +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server.Mongo/package.json @@ -3,6 +3,6 @@ "name": "my-app", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~4.1.0-rc.3" + "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~4.1.0" } } diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/20241226032120_Initial.Designer.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/20250310031634_Initial.Designer.cs similarity index 99% rename from templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/20241226032120_Initial.Designer.cs rename to templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/20250310031634_Initial.Designer.cs index 8a28aa0c28..3d7c7ef6ac 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/20241226032120_Initial.Designer.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/20250310031634_Initial.Designer.cs @@ -13,7 +13,7 @@ using Volo.Abp.EntityFrameworkCore; namespace MyCompanyName.MyProjectName.Migrations { [DbContext(typeof(MyProjectNameDbContext))] - [Migration("20241226032120_Initial")] + [Migration("20250310031634_Initial")] partial class Initial { /// @@ -22,7 +22,7 @@ namespace MyCompanyName.MyProjectName.Migrations #pragma warning disable 612, 618 modelBuilder .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) - .HasAnnotation("ProductVersion", "9.0.0") + .HasAnnotation("ProductVersion", "9.0.2") .HasAnnotation("Relational:MaxIdentifierLength", 128); SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/20241226032120_Initial.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/20250310031634_Initial.cs similarity index 100% rename from templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/20241226032120_Initial.cs rename to templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/20250310031634_Initial.cs diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/MyProjectNameDbContextModelSnapshot.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/MyProjectNameDbContextModelSnapshot.cs index 032a7e08be..b81df45051 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/MyProjectNameDbContextModelSnapshot.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/MyProjectNameDbContextModelSnapshot.cs @@ -19,7 +19,7 @@ namespace MyCompanyName.MyProjectName.Migrations #pragma warning disable 612, 618 modelBuilder .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) - .HasAnnotation("ProductVersion", "9.0.0") + .HasAnnotation("ProductVersion", "9.0.2") .HasAnnotation("Relational:MaxIdentifierLength", 128); SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/MyCompanyName.MyProjectName.Blazor.WebAssembly.Server.csproj b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/MyCompanyName.MyProjectName.Blazor.WebAssembly.Server.csproj index 6e0de5f178..8d3698cb1b 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/MyCompanyName.MyProjectName.Blazor.WebAssembly.Server.csproj +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/MyCompanyName.MyProjectName.Blazor.WebAssembly.Server.csproj @@ -8,7 +8,7 @@ - + @@ -80,11 +80,11 @@ - + - + runtime; build; native; contentfiles; analyzers compile; contentFiles; build; buildMultitargeting; buildTransitive; analyzers; native diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/package.json b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/package.json index 7b33847069..b1143bb98a 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/package.json +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/package.json @@ -3,6 +3,6 @@ "name": "my-app", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~4.1.0-rc.3" + "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~4.1.0" } } diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Shared/MyCompanyName.MyProjectName.Blazor.WebAssembly.Shared.csproj b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Shared/MyCompanyName.MyProjectName.Blazor.WebAssembly.Shared.csproj index 00ba87e384..d086ca8003 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Shared/MyCompanyName.MyProjectName.Blazor.WebAssembly.Shared.csproj +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Shared/MyCompanyName.MyProjectName.Blazor.WebAssembly.Shared.csproj @@ -29,7 +29,7 @@ - + diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/MyCompanyName.MyProjectName.Host.Mongo.csproj b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/MyCompanyName.MyProjectName.Host.Mongo.csproj index 2c6330dd35..a1436f339f 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/MyCompanyName.MyProjectName.Host.Mongo.csproj +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/MyCompanyName.MyProjectName.Host.Mongo.csproj @@ -74,7 +74,7 @@ - + diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/package.json b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/package.json index 7b33847069..b1143bb98a 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/package.json +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/package.json @@ -3,6 +3,6 @@ "name": "my-app", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~4.1.0-rc.3" + "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~4.1.0" } } diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20241226032219_Initial.Designer.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20250310031445_Initial.Designer.cs similarity index 99% rename from templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20241226032219_Initial.Designer.cs rename to templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20250310031445_Initial.Designer.cs index bbc683e8c9..7773acc68f 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20241226032219_Initial.Designer.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20250310031445_Initial.Designer.cs @@ -13,7 +13,7 @@ using Volo.Abp.EntityFrameworkCore; namespace MyCompanyName.MyProjectName.Host.Migrations { [DbContext(typeof(MyProjectNameDbContext))] - [Migration("20241226032219_Initial")] + [Migration("20250310031445_Initial")] partial class Initial { /// @@ -22,7 +22,7 @@ namespace MyCompanyName.MyProjectName.Host.Migrations #pragma warning disable 612, 618 modelBuilder .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) - .HasAnnotation("ProductVersion", "9.0.0") + .HasAnnotation("ProductVersion", "9.0.2") .HasAnnotation("Relational:MaxIdentifierLength", 128); SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20241226032219_Initial.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20250310031445_Initial.cs similarity index 100% rename from templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20241226032219_Initial.cs rename to templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20250310031445_Initial.cs diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/MyProjectNameDbContextModelSnapshot.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/MyProjectNameDbContextModelSnapshot.cs index 54276957a3..8b3cae9651 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/MyProjectNameDbContextModelSnapshot.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/MyProjectNameDbContextModelSnapshot.cs @@ -19,7 +19,7 @@ namespace MyCompanyName.MyProjectName.Host.Migrations #pragma warning disable 612, 618 modelBuilder .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) - .HasAnnotation("ProductVersion", "9.0.0") + .HasAnnotation("ProductVersion", "9.0.2") .HasAnnotation("Relational:MaxIdentifierLength", 128); SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/MyCompanyName.MyProjectName.Host.csproj b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/MyCompanyName.MyProjectName.Host.csproj index 8bbeef97ef..d5843b5373 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/MyCompanyName.MyProjectName.Host.csproj +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/MyCompanyName.MyProjectName.Host.csproj @@ -75,11 +75,11 @@ - + - + runtime; build; native; contentfiles; analyzers compile; contentFiles; build; buildMultitargeting; buildTransitive; analyzers; native diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/package.json b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/package.json index 7b33847069..b1143bb98a 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/package.json +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/package.json @@ -3,6 +3,6 @@ "name": "my-app", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~4.1.0-rc.3" + "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~4.1.0" } } diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc.Mongo/MyCompanyName.MyProjectName.Mvc.Mongo.csproj b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc.Mongo/MyCompanyName.MyProjectName.Mvc.Mongo.csproj index 3ec0c7a745..f7de34413f 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc.Mongo/MyCompanyName.MyProjectName.Mvc.Mongo.csproj +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc.Mongo/MyCompanyName.MyProjectName.Mvc.Mongo.csproj @@ -77,7 +77,7 @@ - + diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc.Mongo/package.json b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc.Mongo/package.json index 7b33847069..b1143bb98a 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc.Mongo/package.json +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc.Mongo/package.json @@ -3,6 +3,6 @@ "name": "my-app", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~4.1.0-rc.3" + "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~4.1.0" } } diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20241226032333_Initial.Designer.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20250310031459_Initial.Designer.cs similarity index 99% rename from templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20241226032333_Initial.Designer.cs rename to templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20250310031459_Initial.Designer.cs index 0702c60f89..d8b4cb4a48 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20241226032333_Initial.Designer.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20250310031459_Initial.Designer.cs @@ -13,7 +13,7 @@ using Volo.Abp.EntityFrameworkCore; namespace MyCompanyName.MyProjectName.Mvc.Migrations { [DbContext(typeof(MyProjectNameDbContext))] - [Migration("20241226032333_Initial")] + [Migration("20250310031459_Initial")] partial class Initial { /// @@ -22,7 +22,7 @@ namespace MyCompanyName.MyProjectName.Mvc.Migrations #pragma warning disable 612, 618 modelBuilder .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) - .HasAnnotation("ProductVersion", "9.0.0") + .HasAnnotation("ProductVersion", "9.0.2") .HasAnnotation("Relational:MaxIdentifierLength", 128); SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20241226032333_Initial.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20250310031459_Initial.cs similarity index 100% rename from templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20241226032333_Initial.cs rename to templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20250310031459_Initial.cs diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/MyProjectNameDbContextModelSnapshot.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/MyProjectNameDbContextModelSnapshot.cs index a003e4b6cc..3699529124 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/MyProjectNameDbContextModelSnapshot.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/MyProjectNameDbContextModelSnapshot.cs @@ -19,7 +19,7 @@ namespace MyCompanyName.MyProjectName.Mvc.Migrations #pragma warning disable 612, 618 modelBuilder .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) - .HasAnnotation("ProductVersion", "9.0.0") + .HasAnnotation("ProductVersion", "9.0.2") .HasAnnotation("Relational:MaxIdentifierLength", 128); SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/MyCompanyName.MyProjectName.Mvc.csproj b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/MyCompanyName.MyProjectName.Mvc.csproj index c25426d19c..ccbc44f2b8 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/MyCompanyName.MyProjectName.Mvc.csproj +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/MyCompanyName.MyProjectName.Mvc.csproj @@ -78,11 +78,11 @@ - + - + runtime; build; native; contentfiles; analyzers compile; contentFiles; build; buildMultitargeting; buildTransitive; analyzers; native diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/package.json b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/package.json index 7b33847069..b1143bb98a 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/package.json +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/package.json @@ -3,6 +3,6 @@ "name": "my-app", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~4.1.0-rc.3" + "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~4.1.0" } } diff --git a/templates/app/angular/package.json b/templates/app/angular/package.json index f4ee2b81de..7151d2898b 100644 --- a/templates/app/angular/package.json +++ b/templates/app/angular/package.json @@ -12,15 +12,15 @@ }, "private": true, "dependencies": { - "@abp/ng.account": "~9.1.0-rc.3", - "@abp/ng.components": "~9.1.0-rc.3", - "@abp/ng.core": "~9.1.0-rc.3", - "@abp/ng.identity": "~9.1.0-rc.3", - "@abp/ng.oauth": "~9.1.0-rc.3", - "@abp/ng.setting-management": "~9.1.0-rc.3", - "@abp/ng.tenant-management": "~9.1.0-rc.3", - "@abp/ng.theme.lepton-x": "~4.1.0-rc.3", - "@abp/ng.theme.shared": "~9.1.0-rc.3", + "@abp/ng.account": "~9.1.0", + "@abp/ng.components": "~9.1.0", + "@abp/ng.core": "~9.1.0", + "@abp/ng.identity": "~9.1.0", + "@abp/ng.oauth": "~9.1.0", + "@abp/ng.setting-management": "~9.1.0", + "@abp/ng.tenant-management": "~9.1.0", + "@abp/ng.theme.lepton-x": "~4.1.0", + "@abp/ng.theme.shared": "~9.1.0", "@angular/animations": "~19.1.0", "@angular/common": "~19.1.0", "@angular/compiler": "~19.1.0", @@ -36,7 +36,7 @@ "zone.js": "~0.15.0" }, "devDependencies": { - "@abp/ng.schematics": "~9.1.0-rc.3", + "@abp/ng.schematics": "~9.1.0", "@angular-devkit/build-angular": "~19.1.0", "@angular-eslint/builder": "~19.0.0", "@angular-eslint/eslint-plugin": "~19.0.0", diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.AuthServer/MyCompanyName.MyProjectName.AuthServer.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.AuthServer/MyCompanyName.MyProjectName.AuthServer.csproj index db551782ff..b95c06305c 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.AuthServer/MyCompanyName.MyProjectName.AuthServer.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.AuthServer/MyCompanyName.MyProjectName.AuthServer.csproj @@ -41,7 +41,7 @@ - + diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.AuthServer/package.json b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.AuthServer/package.json index 3a3d0c4cbb..256485c68a 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.AuthServer/package.json +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.AuthServer/package.json @@ -3,6 +3,6 @@ "name": "my-app-authserver", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~4.1.0-rc.3" + "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~4.1.0" } } diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Client/MyCompanyName.MyProjectName.Blazor.Client.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Client/MyCompanyName.MyProjectName.Blazor.Client.csproj index 83c07df42a..72840b70b4 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Client/MyCompanyName.MyProjectName.Blazor.Client.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Client/MyCompanyName.MyProjectName.Blazor.Client.csproj @@ -14,8 +14,8 @@ - - + + diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/MyCompanyName.MyProjectName.Blazor.Server.Tiered.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/MyCompanyName.MyProjectName.Blazor.Server.Tiered.csproj index 78036c4c1f..a8ff20d2ec 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/MyCompanyName.MyProjectName.Blazor.Server.Tiered.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/MyCompanyName.MyProjectName.Blazor.Server.Tiered.csproj @@ -18,7 +18,7 @@ - + diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/package.json b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/package.json index 26b095a42b..a9583936e1 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/package.json +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/package.json @@ -3,7 +3,7 @@ "name": "my-app", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~4.1.0-rc.3", - "@abp/aspnetcore.components.server.leptonxlitetheme": "~4.1.0-rc.3" + "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~4.1.0", + "@abp/aspnetcore.components.server.leptonxlitetheme": "~4.1.0" } } diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/MyCompanyName.MyProjectName.Blazor.Server.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/MyCompanyName.MyProjectName.Blazor.Server.csproj index d8dc1a3133..20b58b045d 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/MyCompanyName.MyProjectName.Blazor.Server.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/MyCompanyName.MyProjectName.Blazor.Server.csproj @@ -14,7 +14,7 @@ - + diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/package.json b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/package.json index 26b095a42b..a9583936e1 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/package.json +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/package.json @@ -3,7 +3,7 @@ "name": "my-app", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~4.1.0-rc.3", - "@abp/aspnetcore.components.server.leptonxlitetheme": "~4.1.0-rc.3" + "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~4.1.0", + "@abp/aspnetcore.components.server.leptonxlitetheme": "~4.1.0" } } diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.WebApp.Client/MyCompanyName.MyProjectName.Blazor.WebApp.Client.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.WebApp.Client/MyCompanyName.MyProjectName.Blazor.WebApp.Client.csproj index d8e572ca4f..9347651ff4 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.WebApp.Client/MyCompanyName.MyProjectName.Blazor.WebApp.Client.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.WebApp.Client/MyCompanyName.MyProjectName.Blazor.WebApp.Client.csproj @@ -15,8 +15,8 @@ - - + + diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.WebApp.Tiered.Client/MyCompanyName.MyProjectName.Blazor.WebApp.Tiered.Client.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.WebApp.Tiered.Client/MyCompanyName.MyProjectName.Blazor.WebApp.Tiered.Client.csproj index 8a5d26d1cd..8861471b0f 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.WebApp.Tiered.Client/MyCompanyName.MyProjectName.Blazor.WebApp.Tiered.Client.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.WebApp.Tiered.Client/MyCompanyName.MyProjectName.Blazor.WebApp.Tiered.Client.csproj @@ -15,8 +15,8 @@ - - + + diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.WebApp.Tiered/MyCompanyName.MyProjectName.Blazor.WebApp.Tiered.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.WebApp.Tiered/MyCompanyName.MyProjectName.Blazor.WebApp.Tiered.csproj index 09cc96eb3d..f0da067b27 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.WebApp.Tiered/MyCompanyName.MyProjectName.Blazor.WebApp.Tiered.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.WebApp.Tiered/MyCompanyName.MyProjectName.Blazor.WebApp.Tiered.csproj @@ -15,12 +15,12 @@ - + - + diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.WebApp.Tiered/package.json b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.WebApp.Tiered/package.json index 26b095a42b..a9583936e1 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.WebApp.Tiered/package.json +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.WebApp.Tiered/package.json @@ -3,7 +3,7 @@ "name": "my-app", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~4.1.0-rc.3", - "@abp/aspnetcore.components.server.leptonxlitetheme": "~4.1.0-rc.3" + "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~4.1.0", + "@abp/aspnetcore.components.server.leptonxlitetheme": "~4.1.0" } } diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.WebApp/MyCompanyName.MyProjectName.Blazor.WebApp.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.WebApp/MyCompanyName.MyProjectName.Blazor.WebApp.csproj index b66a2a7fb9..65d54aeb32 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.WebApp/MyCompanyName.MyProjectName.Blazor.WebApp.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.WebApp/MyCompanyName.MyProjectName.Blazor.WebApp.csproj @@ -15,7 +15,7 @@ - + diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.WebApp/package.json b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.WebApp/package.json index 26b095a42b..a9583936e1 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.WebApp/package.json +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.WebApp/package.json @@ -3,7 +3,7 @@ "name": "my-app", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~4.1.0-rc.3", - "@abp/aspnetcore.components.server.leptonxlitetheme": "~4.1.0-rc.3" + "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~4.1.0", + "@abp/aspnetcore.components.server.leptonxlitetheme": "~4.1.0" } } diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyCompanyName.MyProjectName.Blazor.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyCompanyName.MyProjectName.Blazor.csproj index ce661e3e32..156e1147b7 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyCompanyName.MyProjectName.Blazor.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyCompanyName.MyProjectName.Blazor.csproj @@ -13,7 +13,7 @@ - + diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.DbMigrator/MyCompanyName.MyProjectName.DbMigrator.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.DbMigrator/MyCompanyName.MyProjectName.DbMigrator.csproj index 6f3cfaaec4..7fbbb92fa8 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.DbMigrator/MyCompanyName.MyProjectName.DbMigrator.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.DbMigrator/MyCompanyName.MyProjectName.DbMigrator.csproj @@ -22,7 +22,7 @@ - + diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyCompanyName.MyProjectName.Domain.Shared.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyCompanyName.MyProjectName.Domain.Shared.csproj index 36a39a26da..7f6b9936fa 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyCompanyName.MyProjectName.Domain.Shared.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyCompanyName.MyProjectName.Domain.Shared.csproj @@ -26,7 +26,7 @@ - + diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/20241226031540_Initial.Designer.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/20250310031524_Initial.Designer.cs similarity index 99% rename from templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/20241226031540_Initial.Designer.cs rename to templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/20250310031524_Initial.Designer.cs index 94f4c9722f..6f6d50b88e 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/20241226031540_Initial.Designer.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/20250310031524_Initial.Designer.cs @@ -13,7 +13,7 @@ using Volo.Abp.EntityFrameworkCore; namespace MyCompanyName.MyProjectName.Migrations { [DbContext(typeof(MyProjectNameDbContext))] - [Migration("20241226031540_Initial")] + [Migration("20250310031524_Initial")] partial class Initial { /// @@ -22,7 +22,7 @@ namespace MyCompanyName.MyProjectName.Migrations #pragma warning disable 612, 618 modelBuilder .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) - .HasAnnotation("ProductVersion", "9.0.0") + .HasAnnotation("ProductVersion", "9.0.2") .HasAnnotation("Relational:MaxIdentifierLength", 128); SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); @@ -296,6 +296,10 @@ namespace MyCompanyName.MyProjectName.Migrations .ValueGeneratedOnAdd() .HasColumnType("uniqueidentifier"); + b.Property("ApplicationName") + .HasMaxLength(96) + .HasColumnType("nvarchar(96)"); + b.Property("ConcurrencyStamp") .IsConcurrencyToken() .IsRequired() diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/20241226031540_Initial.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/20250310031524_Initial.cs similarity index 99% rename from templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/20241226031540_Initial.cs rename to templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/20250310031524_Initial.cs index 13dee16800..b22d01c83b 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/20241226031540_Initial.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/20250310031524_Initial.cs @@ -50,6 +50,7 @@ namespace MyCompanyName.MyProjectName.Migrations columns: table => new { Id = table.Column(type: "uniqueidentifier", nullable: false), + ApplicationName = table.Column(type: "nvarchar(96)", maxLength: 96, nullable: true), JobName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), JobArgs = table.Column(type: "nvarchar(max)", maxLength: 1048576, nullable: false), TryCount = table.Column(type: "smallint", nullable: false, defaultValue: (short)0), diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/MyProjectNameDbContextModelSnapshot.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/MyProjectNameDbContextModelSnapshot.cs index 860b1fc689..42f90bfc62 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/MyProjectNameDbContextModelSnapshot.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/MyProjectNameDbContextModelSnapshot.cs @@ -19,7 +19,7 @@ namespace MyCompanyName.MyProjectName.Migrations #pragma warning disable 612, 618 modelBuilder .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) - .HasAnnotation("ProductVersion", "9.0.0") + .HasAnnotation("ProductVersion", "9.0.2") .HasAnnotation("Relational:MaxIdentifierLength", 128); SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); @@ -293,6 +293,10 @@ namespace MyCompanyName.MyProjectName.Migrations .ValueGeneratedOnAdd() .HasColumnType("uniqueidentifier"); + b.Property("ApplicationName") + .HasMaxLength(96) + .HasColumnType("nvarchar(96)"); + b.Property("ConcurrencyStamp") .IsConcurrencyToken() .IsRequired() diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/MyCompanyName.MyProjectName.EntityFrameworkCore.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/MyCompanyName.MyProjectName.EntityFrameworkCore.csproj index 258844c045..3c77133bb4 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/MyCompanyName.MyProjectName.EntityFrameworkCore.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/MyCompanyName.MyProjectName.EntityFrameworkCore.csproj @@ -22,7 +22,7 @@ - + all runtime; build; native; contentfiles; analyzers diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/MyCompanyName.MyProjectName.HttpApi.Host.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/MyCompanyName.MyProjectName.HttpApi.Host.csproj index fe61f75815..6928fab989 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/MyCompanyName.MyProjectName.HttpApi.Host.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/MyCompanyName.MyProjectName.HttpApi.Host.csproj @@ -13,8 +13,8 @@ - - + + diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/package.json b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/package.json index 7b33847069..b1143bb98a 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/package.json +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/package.json @@ -3,6 +3,6 @@ "name": "my-app", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~4.1.0-rc.3" + "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~4.1.0" } } diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/MyCompanyName.MyProjectName.Web.Host.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/MyCompanyName.MyProjectName.Web.Host.csproj index 006c96bb42..ea2058353f 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/MyCompanyName.MyProjectName.Web.Host.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/MyCompanyName.MyProjectName.Web.Host.csproj @@ -19,7 +19,7 @@ - + diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/package.json b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/package.json index 7b33847069..b1143bb98a 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/package.json +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/package.json @@ -3,6 +3,6 @@ "name": "my-app", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~4.1.0-rc.3" + "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~4.1.0" } } diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/package.json b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/package.json index 7b33847069..b1143bb98a 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/package.json +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/package.json @@ -3,6 +3,6 @@ "name": "my-app", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~4.1.0-rc.3" + "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~4.1.0" } } diff --git a/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.Application.Tests/MyCompanyName.MyProjectName.Application.Tests.csproj b/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.Application.Tests/MyCompanyName.MyProjectName.Application.Tests.csproj index e22776c2d8..3884ee5abf 100644 --- a/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.Application.Tests/MyCompanyName.MyProjectName.Application.Tests.csproj +++ b/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.Application.Tests/MyCompanyName.MyProjectName.Application.Tests.csproj @@ -14,7 +14,7 @@ - + diff --git a/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.Domain.Tests/MyCompanyName.MyProjectName.Domain.Tests.csproj b/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.Domain.Tests/MyCompanyName.MyProjectName.Domain.Tests.csproj index dc4c43ac0c..b1061875f2 100644 --- a/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.Domain.Tests/MyCompanyName.MyProjectName.Domain.Tests.csproj +++ b/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.Domain.Tests/MyCompanyName.MyProjectName.Domain.Tests.csproj @@ -9,7 +9,7 @@ - + diff --git a/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests.csproj b/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests.csproj index 6aa0f455df..ae9b957906 100644 --- a/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests.csproj +++ b/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests.csproj @@ -15,7 +15,7 @@ - + diff --git a/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.HttpApi.Client.ConsoleTestApp/MyCompanyName.MyProjectName.HttpApi.Client.ConsoleTestApp.csproj b/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.HttpApi.Client.ConsoleTestApp/MyCompanyName.MyProjectName.HttpApi.Client.ConsoleTestApp.csproj index 006d938a8d..8cd45f7b82 100644 --- a/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.HttpApi.Client.ConsoleTestApp/MyCompanyName.MyProjectName.HttpApi.Client.ConsoleTestApp.csproj +++ b/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.HttpApi.Client.ConsoleTestApp/MyCompanyName.MyProjectName.HttpApi.Client.ConsoleTestApp.csproj @@ -22,8 +22,8 @@ - - + + diff --git a/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.MongoDB.Tests/MyCompanyName.MyProjectName.MongoDB.Tests.csproj b/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.MongoDB.Tests/MyCompanyName.MyProjectName.MongoDB.Tests.csproj index e18c27a2de..79c080216c 100644 --- a/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.MongoDB.Tests/MyCompanyName.MyProjectName.MongoDB.Tests.csproj +++ b/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.MongoDB.Tests/MyCompanyName.MyProjectName.MongoDB.Tests.csproj @@ -14,7 +14,7 @@ - + diff --git a/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.TestBase/MyCompanyName.MyProjectName.TestBase.csproj b/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.TestBase/MyCompanyName.MyProjectName.TestBase.csproj index d2190fa5ed..426dcaca1c 100644 --- a/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.TestBase/MyCompanyName.MyProjectName.TestBase.csproj +++ b/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.TestBase/MyCompanyName.MyProjectName.TestBase.csproj @@ -16,7 +16,7 @@ - + all diff --git a/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.Web.Tests/MyCompanyName.MyProjectName.Web.Tests.csproj b/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.Web.Tests/MyCompanyName.MyProjectName.Web.Tests.csproj index b11ac98272..3ca0425b28 100644 --- a/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.Web.Tests/MyCompanyName.MyProjectName.Web.Tests.csproj +++ b/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.Web.Tests/MyCompanyName.MyProjectName.Web.Tests.csproj @@ -8,7 +8,7 @@ - + diff --git a/templates/console/src/MyCompanyName.MyProjectName/MyCompanyName.MyProjectName.csproj b/templates/console/src/MyCompanyName.MyProjectName/MyCompanyName.MyProjectName.csproj index 6cf91f5a09..65fee12cfc 100644 --- a/templates/console/src/MyCompanyName.MyProjectName/MyCompanyName.MyProjectName.csproj +++ b/templates/console/src/MyCompanyName.MyProjectName/MyCompanyName.MyProjectName.csproj @@ -13,7 +13,7 @@ - + diff --git a/templates/maui/src/MyCompanyName.MyProjectName/MyCompanyName.MyProjectName.csproj b/templates/maui/src/MyCompanyName.MyProjectName/MyCompanyName.MyProjectName.csproj index c6a650859e..f33122e97a 100644 --- a/templates/maui/src/MyCompanyName.MyProjectName/MyCompanyName.MyProjectName.csproj +++ b/templates/maui/src/MyCompanyName.MyProjectName/MyCompanyName.MyProjectName.csproj @@ -35,7 +35,7 @@ - + diff --git a/templates/module/angular/package.json b/templates/module/angular/package.json index e6dc72fa51..08611fd06e 100644 --- a/templates/module/angular/package.json +++ b/templates/module/angular/package.json @@ -13,15 +13,15 @@ }, "private": true, "dependencies": { - "@abp/ng.account": "~9.1.0-rc.3", - "@abp/ng.components": "~9.1.0-rc.3", - "@abp/ng.core": "~9.1.0-rc.3", - "@abp/ng.identity": "~9.1.0-rc.3", - "@abp/ng.oauth": "~9.1.0-rc.3", - "@abp/ng.setting-management": "~9.1.0-rc.3", - "@abp/ng.tenant-management": "~9.1.0-rc.3", - "@abp/ng.theme.basic": "~9.1.0-rc.3", - "@abp/ng.theme.shared": "~9.1.0-rc.3", + "@abp/ng.account": "~9.1.0", + "@abp/ng.components": "~9.1.0", + "@abp/ng.core": "~9.1.0", + "@abp/ng.identity": "~9.1.0", + "@abp/ng.oauth": "~9.1.0", + "@abp/ng.setting-management": "~9.1.0", + "@abp/ng.tenant-management": "~9.1.0", + "@abp/ng.theme.basic": "~9.1.0", + "@abp/ng.theme.shared": "~9.1.0", "@angular/animations": "~19.1.0", "@angular/common": "~19.1.0", "@angular/compiler": "~19.1.0", @@ -36,7 +36,7 @@ "zone.js": "~0.15.0" }, "devDependencies": { - "@abp/ng.schematics": "~9.1.0-rc.3", + "@abp/ng.schematics": "~9.1.0", "@angular-devkit/build-angular": "~19.1.0", "@angular-eslint/builder": "~19.0.0", "@angular-eslint/eslint-plugin": "~19.0.0", diff --git a/templates/module/angular/projects/my-project-name/package.json b/templates/module/angular/projects/my-project-name/package.json index 5f0bf55f1a..d61229033b 100644 --- a/templates/module/angular/projects/my-project-name/package.json +++ b/templates/module/angular/projects/my-project-name/package.json @@ -4,8 +4,8 @@ "peerDependencies": { "@angular/common": "~19.1.0", "@angular/core": "~19.1.0", - "@abp/ng.core": "~9.1.0-rc.3", - "@abp/ng.theme.shared": "~9.1.0-rc.3" + "@abp/ng.core": "~9.1.0", + "@abp/ng.theme.shared": "~9.1.0" }, "dependencies": { "tslib": "^2.1.0" diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20241226032427_Initial.Designer.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20250310031550_Initial.Designer.cs similarity index 99% rename from templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20241226032427_Initial.Designer.cs rename to templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20250310031550_Initial.Designer.cs index 35b5661fc4..412ca9d60c 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20241226032427_Initial.Designer.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20250310031550_Initial.Designer.cs @@ -13,7 +13,7 @@ using Volo.Abp.EntityFrameworkCore; namespace MyCompanyName.MyProjectName.Migrations { [DbContext(typeof(AuthServerDbContext))] - [Migration("20241226032427_Initial")] + [Migration("20250310031550_Initial")] partial class Initial { /// @@ -22,7 +22,7 @@ namespace MyCompanyName.MyProjectName.Migrations #pragma warning disable 612, 618 modelBuilder .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) - .HasAnnotation("ProductVersion", "9.0.0") + .HasAnnotation("ProductVersion", "9.0.2") .HasAnnotation("Relational:MaxIdentifierLength", 128); SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20241226032427_Initial.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20250310031550_Initial.cs similarity index 100% rename from templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20241226032427_Initial.cs rename to templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20250310031550_Initial.cs diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/AuthServerDbContextModelSnapshot.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/AuthServerDbContextModelSnapshot.cs index 74d8f6d802..f47250a204 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/AuthServerDbContextModelSnapshot.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/AuthServerDbContextModelSnapshot.cs @@ -19,7 +19,7 @@ namespace MyCompanyName.MyProjectName.Migrations #pragma warning disable 612, 618 modelBuilder .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) - .HasAnnotation("ProductVersion", "9.0.0") + .HasAnnotation("ProductVersion", "9.0.2") .HasAnnotation("Relational:MaxIdentifierLength", 128); SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/MyCompanyName.MyProjectName.AuthServer.csproj b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/MyCompanyName.MyProjectName.AuthServer.csproj index 996b557a55..7efc0aae71 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/MyCompanyName.MyProjectName.AuthServer.csproj +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/MyCompanyName.MyProjectName.AuthServer.csproj @@ -13,8 +13,8 @@ - - + + all runtime; build; native; contentfiles; analyzers diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/package.json b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/package.json index 441c78a8b2..3057d1d821 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/package.json +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/package.json @@ -3,6 +3,6 @@ "name": "my-app-authserver", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "~9.1.0-rc.3" + "@abp/aspnetcore.mvc.ui.theme.basic": "~9.1.0" } } diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host.Client/MyCompanyName.MyProjectName.Blazor.Host.Client.csproj b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host.Client/MyCompanyName.MyProjectName.Blazor.Host.Client.csproj index 6e53e58d4e..3fe2b0415b 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host.Client/MyCompanyName.MyProjectName.Blazor.Host.Client.csproj +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host.Client/MyCompanyName.MyProjectName.Blazor.Host.Client.csproj @@ -12,8 +12,8 @@ - - + + diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/MyCompanyName.MyProjectName.Blazor.Host.csproj b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/MyCompanyName.MyProjectName.Blazor.Host.csproj index a567757f08..589c0fced6 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/MyCompanyName.MyProjectName.Blazor.Host.csproj +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/MyCompanyName.MyProjectName.Blazor.Host.csproj @@ -13,7 +13,7 @@ - + diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/20241226032535_Initial.Designer.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/20250310031538_Initial.Designer.cs similarity index 99% rename from templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/20241226032535_Initial.Designer.cs rename to templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/20250310031538_Initial.Designer.cs index b0eb5d07ff..1ac2d12df8 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/20241226032535_Initial.Designer.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/20250310031538_Initial.Designer.cs @@ -13,7 +13,7 @@ using Volo.Abp.EntityFrameworkCore; namespace MyCompanyName.MyProjectName.Blazor.Server.Host.Migrations { [DbContext(typeof(UnifiedDbContext))] - [Migration("20241226032535_Initial")] + [Migration("20250310031538_Initial")] partial class Initial { /// @@ -22,7 +22,7 @@ namespace MyCompanyName.MyProjectName.Blazor.Server.Host.Migrations #pragma warning disable 612, 618 modelBuilder .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) - .HasAnnotation("ProductVersion", "9.0.0") + .HasAnnotation("ProductVersion", "9.0.2") .HasAnnotation("Relational:MaxIdentifierLength", 128); SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/20241226032535_Initial.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/20250310031538_Initial.cs similarity index 100% rename from templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/20241226032535_Initial.cs rename to templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/20250310031538_Initial.cs diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/UnifiedDbContextModelSnapshot.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/UnifiedDbContextModelSnapshot.cs index 87d089ac54..4f14e8dec0 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/UnifiedDbContextModelSnapshot.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/UnifiedDbContextModelSnapshot.cs @@ -19,7 +19,7 @@ namespace MyCompanyName.MyProjectName.Blazor.Server.Host.Migrations #pragma warning disable 612, 618 modelBuilder .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) - .HasAnnotation("ProductVersion", "9.0.0") + .HasAnnotation("ProductVersion", "9.0.2") .HasAnnotation("Relational:MaxIdentifierLength", 128); SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/MyCompanyName.MyProjectName.Blazor.Server.Host.csproj b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/MyCompanyName.MyProjectName.Blazor.Server.Host.csproj index 717900b944..d05d66c666 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/MyCompanyName.MyProjectName.Blazor.Server.Host.csproj +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/MyCompanyName.MyProjectName.Blazor.Server.Host.csproj @@ -17,7 +17,7 @@ - + diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/package.json b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/package.json index 95de5a299a..f5b2e4cd4e 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/package.json +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/package.json @@ -3,7 +3,7 @@ "name": "my-app", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "~9.1.0-rc.3", - "@abp/aspnetcore.components.server.basictheme": "~9.1.0-rc.3" + "@abp/aspnetcore.mvc.ui.theme.basic": "~9.1.0", + "@abp/aspnetcore.components.server.basictheme": "~9.1.0" } } diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Migrations/20241010091847_Initial.Designer.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Migrations/20250310031557_Initial.Designer.cs similarity index 89% rename from templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Migrations/20241010091847_Initial.Designer.cs rename to templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Migrations/20250310031557_Initial.Designer.cs index 0cc3e26a91..53e5e56a03 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Migrations/20241010091847_Initial.Designer.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Migrations/20250310031557_Initial.Designer.cs @@ -12,7 +12,7 @@ using Volo.Abp.EntityFrameworkCore; namespace MyCompanyName.MyProjectName.Migrations { [DbContext(typeof(MyProjectNameHttpApiHostMigrationsDbContext))] - [Migration("20241010091847_Initial")] + [Migration("20250310031557_Initial")] partial class Initial { /// @@ -21,7 +21,7 @@ namespace MyCompanyName.MyProjectName.Migrations #pragma warning disable 612, 618 modelBuilder .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) - .HasAnnotation("ProductVersion", "9.0.0-rc.1.24451.1") + .HasAnnotation("ProductVersion", "9.0.2") .HasAnnotation("Relational:MaxIdentifierLength", 128); SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Migrations/20241010091847_Initial.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Migrations/20250310031557_Initial.cs similarity index 100% rename from templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Migrations/20241010091847_Initial.cs rename to templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Migrations/20250310031557_Initial.cs diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Migrations/MyProjectNameHttpApiHostMigrationsDbContextModelSnapshot.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Migrations/MyProjectNameHttpApiHostMigrationsDbContextModelSnapshot.cs index 8f18778ba3..73a8d2db0a 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Migrations/MyProjectNameHttpApiHostMigrationsDbContextModelSnapshot.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Migrations/MyProjectNameHttpApiHostMigrationsDbContextModelSnapshot.cs @@ -18,7 +18,7 @@ namespace MyCompanyName.MyProjectName.Migrations #pragma warning disable 612, 618 modelBuilder .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) - .HasAnnotation("ProductVersion", "9.0.0-rc.1.24451.1") + .HasAnnotation("ProductVersion", "9.0.2") .HasAnnotation("Relational:MaxIdentifierLength", 128); SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/MyCompanyName.MyProjectName.HttpApi.Host.csproj b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/MyCompanyName.MyProjectName.HttpApi.Host.csproj index 513e18897d..8db094e467 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/MyCompanyName.MyProjectName.HttpApi.Host.csproj +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/MyCompanyName.MyProjectName.HttpApi.Host.csproj @@ -14,9 +14,9 @@ - - - + + + diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/MyCompanyName.MyProjectName.Web.Host.csproj b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/MyCompanyName.MyProjectName.Web.Host.csproj index 73c365a744..666658da33 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/MyCompanyName.MyProjectName.Web.Host.csproj +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/MyCompanyName.MyProjectName.Web.Host.csproj @@ -13,7 +13,7 @@ - + diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/package.json b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/package.json index c1fce23f85..ef17244517 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/package.json +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/package.json @@ -3,6 +3,6 @@ "name": "my-app", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "~9.1.0-rc.3" + "@abp/aspnetcore.mvc.ui.theme.basic": "~9.1.0" } } diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20241226032624_Initial.Designer.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20250310031608_Initial.Designer.cs similarity index 99% rename from templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20241226032624_Initial.Designer.cs rename to templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20250310031608_Initial.Designer.cs index f278c04955..e3239cdd3a 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20241226032624_Initial.Designer.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20250310031608_Initial.Designer.cs @@ -13,7 +13,7 @@ using Volo.Abp.EntityFrameworkCore; namespace MyCompanyName.MyProjectName.Migrations { [DbContext(typeof(UnifiedDbContext))] - [Migration("20241226032624_Initial")] + [Migration("20250310031608_Initial")] partial class Initial { /// @@ -22,7 +22,7 @@ namespace MyCompanyName.MyProjectName.Migrations #pragma warning disable 612, 618 modelBuilder .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) - .HasAnnotation("ProductVersion", "9.0.0") + .HasAnnotation("ProductVersion", "9.0.2") .HasAnnotation("Relational:MaxIdentifierLength", 128); SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20241226032624_Initial.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20250310031608_Initial.cs similarity index 100% rename from templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20241226032624_Initial.cs rename to templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20250310031608_Initial.cs diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/UnifiedDbContextModelSnapshot.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/UnifiedDbContextModelSnapshot.cs index 393f21c825..802d950dec 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/UnifiedDbContextModelSnapshot.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/UnifiedDbContextModelSnapshot.cs @@ -19,7 +19,7 @@ namespace MyCompanyName.MyProjectName.Migrations #pragma warning disable 612, 618 modelBuilder .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) - .HasAnnotation("ProductVersion", "9.0.0") + .HasAnnotation("ProductVersion", "9.0.2") .HasAnnotation("Relational:MaxIdentifierLength", 128); SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/MyCompanyName.MyProjectName.Web.Unified.csproj b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/MyCompanyName.MyProjectName.Web.Unified.csproj index b67e95ebc6..bc22e1a5f6 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/MyCompanyName.MyProjectName.Web.Unified.csproj +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/MyCompanyName.MyProjectName.Web.Unified.csproj @@ -13,7 +13,7 @@ - + all runtime; build; native; contentfiles; analyzers diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/package.json b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/package.json index c1fce23f85..ef17244517 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/package.json +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/package.json @@ -3,6 +3,6 @@ "name": "my-app", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "~9.1.0-rc.3" + "@abp/aspnetcore.mvc.ui.theme.basic": "~9.1.0" } } diff --git a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyCompanyName.MyProjectName.Domain.Shared.csproj b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyCompanyName.MyProjectName.Domain.Shared.csproj index e60d536bde..20c07d94f8 100644 --- a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyCompanyName.MyProjectName.Domain.Shared.csproj +++ b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyCompanyName.MyProjectName.Domain.Shared.csproj @@ -15,7 +15,7 @@ - + diff --git a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyCompanyName.MyProjectName.Web.csproj b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyCompanyName.MyProjectName.Web.csproj index d26202b3e5..b8791a1f3f 100644 --- a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyCompanyName.MyProjectName.Web.csproj +++ b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyCompanyName.MyProjectName.Web.csproj @@ -22,7 +22,7 @@ - + diff --git a/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.Application.Tests/MyCompanyName.MyProjectName.Application.Tests.csproj b/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.Application.Tests/MyCompanyName.MyProjectName.Application.Tests.csproj index eb162439aa..c79b7cf9b5 100644 --- a/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.Application.Tests/MyCompanyName.MyProjectName.Application.Tests.csproj +++ b/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.Application.Tests/MyCompanyName.MyProjectName.Application.Tests.csproj @@ -11,7 +11,7 @@ - + diff --git a/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.Domain.Tests/MyCompanyName.MyProjectName.Domain.Tests.csproj b/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.Domain.Tests/MyCompanyName.MyProjectName.Domain.Tests.csproj index 8e0d9ac365..48a85a1afd 100644 --- a/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.Domain.Tests/MyCompanyName.MyProjectName.Domain.Tests.csproj +++ b/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.Domain.Tests/MyCompanyName.MyProjectName.Domain.Tests.csproj @@ -9,7 +9,7 @@ - + diff --git a/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests.csproj b/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests.csproj index 8ee4580845..7a93e9f941 100644 --- a/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests.csproj +++ b/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests.csproj @@ -9,8 +9,8 @@ - - + + diff --git a/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.HttpApi.Client.ConsoleTestApp/MyCompanyName.MyProjectName.HttpApi.Client.ConsoleTestApp.csproj b/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.HttpApi.Client.ConsoleTestApp/MyCompanyName.MyProjectName.HttpApi.Client.ConsoleTestApp.csproj index 0302fce20c..98abac34f3 100644 --- a/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.HttpApi.Client.ConsoleTestApp/MyCompanyName.MyProjectName.HttpApi.Client.ConsoleTestApp.csproj +++ b/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.HttpApi.Client.ConsoleTestApp/MyCompanyName.MyProjectName.HttpApi.Client.ConsoleTestApp.csproj @@ -23,7 +23,7 @@ - + diff --git a/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.MongoDB.Tests/MyCompanyName.MyProjectName.MongoDB.Tests.csproj b/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.MongoDB.Tests/MyCompanyName.MyProjectName.MongoDB.Tests.csproj index 5e43f82146..f63599ff8a 100644 --- a/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.MongoDB.Tests/MyCompanyName.MyProjectName.MongoDB.Tests.csproj +++ b/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.MongoDB.Tests/MyCompanyName.MyProjectName.MongoDB.Tests.csproj @@ -9,7 +9,7 @@ - + diff --git a/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.TestBase/MyCompanyName.MyProjectName.TestBase.csproj b/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.TestBase/MyCompanyName.MyProjectName.TestBase.csproj index 772c28108c..4c004ee12a 100644 --- a/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.TestBase/MyCompanyName.MyProjectName.TestBase.csproj +++ b/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.TestBase/MyCompanyName.MyProjectName.TestBase.csproj @@ -9,7 +9,7 @@ - + all diff --git a/templates/wpf/src/MyCompanyName.MyProjectName/MyCompanyName.MyProjectName.csproj b/templates/wpf/src/MyCompanyName.MyProjectName/MyCompanyName.MyProjectName.csproj index b36d28e406..3f3a1535bb 100644 --- a/templates/wpf/src/MyCompanyName.MyProjectName/MyCompanyName.MyProjectName.csproj +++ b/templates/wpf/src/MyCompanyName.MyProjectName/MyCompanyName.MyProjectName.csproj @@ -14,7 +14,7 @@ - +