diff --git a/.github/workflows/auto-pr.yml b/.github/workflows/auto-pr.yml index 4f28b14a9c..a572653e48 100644 --- a/.github/workflows/auto-pr.yml +++ b/.github/workflows/auto-pr.yml @@ -27,10 +27,12 @@ jobs: title: Merge branch dev with rel-9.0 body: This PR generated automatically to merge dev with rel-9.0. Please review the changed files before merging to prevent any errors that may occur. reviewers: maliming + draft: true token: ${{ github.token }} - name: Merge Pull Request env: GH_TOKEN: ${{ secrets.BOT_SECRET }} run: | + gh pr ready gh pr review auto-merge/rel-9-0/${{github.run_number}} --approve - gh pr merge auto-merge/rel-9-0/${{github.run_number}} --merge --auto --delete-branch \ No newline at end of file + gh pr merge auto-merge/rel-9-0/${{github.run_number}} --merge --auto --delete-branch diff --git a/Directory.Packages.props b/Directory.Packages.props index bf4eb56ff6..b4ae1fc2f8 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -39,8 +39,8 @@ - - + + @@ -114,7 +114,7 @@ - + diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json index 22cfb792b5..0e8546ae41 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json @@ -512,6 +512,7 @@ "QuotationTemplate.BankAccount": "Our bank account information can be found at {0}", "Permission:Raffles": "Raffle", "Permission:Draw": "Draw", + "Permission:ExportAttendeesAsExcel": "Export at attendees as Excel", "Menu:Raffles": "Raffles", "RaffleIsNotDrawable": "Raffle is not drawable", "WinnerCountMustBeGreaterThanZero": "Winner count must be greater than zero", @@ -658,6 +659,7 @@ "DrawModal": "Private draw on the modal", "SetAsDrawable": "Set as drawable", "SetAsNoDrawable": "Set as non-drawable", + "SetAsCompleted": "Set as completed", "RemoveAllWinners": "Remove all winners", "EditWinners": "Edit winners", "EditAttendees": "Edit attendees", diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json index 87635af9e2..08e1687357 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json @@ -459,7 +459,7 @@ "FullName": "Full name", "CompanySize": "Company size", "TestimonialTitle": "Let's hear your testimonial", - "TestimonialInfo": "What our customers say matters! Tell us about your experience with our product and service. It is recommended to write the testimonial in English to reach a wider audience.", + "TestimonialInfo": "What you say matters! Tell us about your experience with ABP in a few sentences. Please write it in English to reach a wider audience.", "Country": "Country", "TestimonialTextPlaceholder": "Write a brief story about how ABP helped you build and deliver your project.", "PositionPlaceholder": "Your position at your company", diff --git a/docs/en/Blog-Posts/2024-11-19 v9_0_Release_Stable/community-talks.png b/docs/en/Blog-Posts/2024-11-19 v9_0_Release_Stable/community-talks.png new file mode 100644 index 0000000000..7263b68e10 Binary files /dev/null and b/docs/en/Blog-Posts/2024-11-19 v9_0_Release_Stable/community-talks.png differ diff --git a/docs/en/Blog-Posts/2024-11-19 v9_0_Release_Stable/cover-image.png b/docs/en/Blog-Posts/2024-11-19 v9_0_Release_Stable/cover-image.png new file mode 100644 index 0000000000..f272a8d463 Binary files /dev/null and b/docs/en/Blog-Posts/2024-11-19 v9_0_Release_Stable/cover-image.png differ diff --git a/docs/en/Blog-Posts/2024-11-19 v9_0_Release_Stable/post.md b/docs/en/Blog-Posts/2024-11-19 v9_0_Release_Stable/post.md new file mode 100644 index 0000000000..26850bc57f --- /dev/null +++ b/docs/en/Blog-Posts/2024-11-19 v9_0_Release_Stable/post.md @@ -0,0 +1,93 @@ +# ABP.IO Platform 9.0 Has Been Released Based on .NET 9.0 + +![](cover-image.png) + +Today, [ABP](https://abp.io/) 9.0 stable version has been released based on [.NET 9.0](https://dotnet.microsoft.com/en-us/download/dotnet/9.0). You can create solutions with ABP 9.0 starting from ABP Studio v0.9.11 or by using the ABP CLI as explained in the following sections. + +## What's New With Version 9.0? + +All the new features were explained in detail in the [9.0 RC Announcement Post](https://abp.io/blog/announcing-abp-9-0-release-candidate), so there is no need to review them again. You can check it out for more details. + +## Getting Started with 9.0 + +### 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.0 for now, so you don't need to specify the version. **You can create solutions with ABP 9.0 starting from v0.9.11.** + +### 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.0. 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 **Switch to stable** action button to instantly upgrade your solution: + +![](switch-to-stable.png) + +> Please note that ABP CLI & ABP Studio only upgrade the related ABP packages, so you need to upgrade the other packages for .NET 9.0 manually. + +### 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. + +> Please note that ABP CLI & ABP Studio only upgrade the related ABP packages, so you need to upgrade the other packages for .NET 9.0 manually. + +## 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 v8.x: [ABP Version 9.0 Migration Guide](https://abp.io/docs/9.0/release-info/migration-guides/abp-9-0) + +## Community News + +### Highlights from .NET 9.0 + +Our team has closely followed the ASP.NET Core and Entity Framework Core 9.0 releases, read Microsoft's guides and documentation, and adapted the changes to our ABP.IO Platform. We are proud to say that we've shipped the ABP 9.0 based on .NET 9.0 just after Microsoft's .NET 9.0 release. + +In addition to the ABP's .NET 9.0 upgrade, our team has created many great articles to highlight the important features coming with ASP.NET Core 9.0 and Entity Framework Core 9.0. + +> You can read [this post](https://volosoft.com/blog/Highlights-for-ASP-NET-Entity-Framework-Core-NET-9-0) to see the list of all articles. + +### New ABP Community Articles + +In addition to [the articles to highlight .NET 9.0 features written by our team](https://volosoft.com/blog/Highlights-for-ASP-NET-Entity-Framework-Core-NET-9-0), here are some of the recent posts added to the [ABP Community](https://abp.io/community): + +* [Video: Building Modular Monolith Applications with ASP.NET Core & ABP Studio](https://abp.io/community/videos/building-modular-monolith-applications-with-asp.net-core-abp-studio-66znukvf) by [Halil İbrahim Kalkan](https://x.com/hibrahimkalkan) +* [How to create your Own AI Bot on WhatsApp Using an ABP.io Template](https://abp.io/community/articles/how-to-create-your-own-ai-bot-on-whatsapp-using-the-abp-framework-c6jgvt9c) by [Michael Kokula](https://abp.io/community/members/Michal_Kokula) +* [ABP Now Supports .NET 9](https://abp.io/community/articles/abp-now-supports-.net-9-zpkznc4f) by [Alper Ebiçoğlu](https://x.com/alperebicoglu) + +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 2024.7: What’s New with .NET 9 & ABP 9? + +![](community-talks.png) + +In this episode of ABP Community Talks, 2024.7; we will dive into the features that came with .NET 9.0 with [Alper Ebicoglu](https://github.com/ebicoglu), [Engincan Veske](https://github.com/EngincanV), [Berkan Sasmaz](https://github.com/berkansasmaz) and [Ahmet Faruk Ulu](https://github.com/ahmetfarukulu). + +## Conclusion + +This version comes with some new features and a lot of enhancements to the existing features. You can see the [Road Map](https://docs.abp.io/en/abp/9.0/Road-Map) documentation to learn about the release schedule and planned features for the next releases. Please try ABP v9.0 and provide feedback to help us release more stable versions. + +Thanks for being a part of this community! diff --git a/docs/en/Blog-Posts/2024-11-19 v9_0_Release_Stable/switch-to-stable.png b/docs/en/Blog-Posts/2024-11-19 v9_0_Release_Stable/switch-to-stable.png new file mode 100644 index 0000000000..30883ebf92 Binary files /dev/null and b/docs/en/Blog-Posts/2024-11-19 v9_0_Release_Stable/switch-to-stable.png differ diff --git a/docs/en/Community-Articles/2024-11-13-BuiltIn-OpenApi-Documentation/cover.png b/docs/en/Community-Articles/2024-11-13-BuiltIn-OpenApi-Documentation/cover.png index b7dbfab3a8..4ac79513c3 100644 Binary files a/docs/en/Community-Articles/2024-11-13-BuiltIn-OpenApi-Documentation/cover.png and b/docs/en/Community-Articles/2024-11-13-BuiltIn-OpenApi-Documentation/cover.png differ diff --git a/docs/en/Community-Articles/2024-11-13-BuiltIn-OpenApi-Documentation/img2.png b/docs/en/Community-Articles/2024-11-13-BuiltIn-OpenApi-Documentation/img2.png index 179250369e..a89415db1d 100644 Binary files a/docs/en/Community-Articles/2024-11-13-BuiltIn-OpenApi-Documentation/img2.png and b/docs/en/Community-Articles/2024-11-13-BuiltIn-OpenApi-Documentation/img2.png differ diff --git a/docs/en/Community-Articles/2024-11-13-BuiltIn-OpenApi-Documentation/img3.png b/docs/en/Community-Articles/2024-11-13-BuiltIn-OpenApi-Documentation/img3.png index a458547e8a..8698b153ab 100644 Binary files a/docs/en/Community-Articles/2024-11-13-BuiltIn-OpenApi-Documentation/img3.png and b/docs/en/Community-Articles/2024-11-13-BuiltIn-OpenApi-Documentation/img3.png differ diff --git a/docs/en/Community-Articles/2024-11-13-BuiltIn-OpenApi-Documentation/post.md b/docs/en/Community-Articles/2024-11-13-BuiltIn-OpenApi-Documentation/post.md index 82fb0a1286..3e950c38c0 100644 --- a/docs/en/Community-Articles/2024-11-13-BuiltIn-OpenApi-Documentation/post.md +++ b/docs/en/Community-Articles/2024-11-13-BuiltIn-OpenApi-Documentation/post.md @@ -6,92 +6,121 @@ Built-in OpenAPI Document Generation with .NET 9 — No more SwaggerUI! 👋 What’s Swagger UI? ------------------ -[Swagger UI](https://swagger.io/) is an open-source tool that automatically generates an interactive, web-based documentation interface for APIs defined using the OpenAPI Specification (OAS). It simplifies the process of exploring and testing APIs directly from the browser, making it a popular choice for developers and API consumers. It provides paid also free services. +[Swagger UI](https://swagger.io/) is an open-source tool that automatically generates an interactive, web-based documentation interface for WebAPIs. +It supports OpenAPI standards. It was very popular tool among the ASP.NET Core developers from 2020 to 2024. +Because it was a built-in tool comes with ASP.NET Core default templates. +We liked this tool because it was the first tool that allows us to make WebAPI calls for testing. +Now it provides paid services as well as free ones. + +> Previously, Swagger was included by default from **.NET 5** to **.NET 8** in .NET web templates. + +--- + -> Previously, Swagger was included by default from **.NET 5** to **.NET 8**, which provides OpenAPI support. What’s OpenAPI? --------------- -OpenAPI is a standard specification for defining RESTful APIs. Its website is [https://www.openapis.org/](https://www.openapis.org/). Their specifications let developers create, understand, document, and integrate APIs more efficiently. +OpenAPI is a standard specification for defining REST APIs. +The official website is [https://www.openapis.org/](https://www.openapis.org/). +Microsoft is now using OpenAPI and here is the official documentation 👉 [https://aka.ms/aspnet/openapi](https://aka.ms/aspnet/openapi) + +--- -OpenAPI Microsoft Documentation 👉 [https://aka.ms/aspnet/openapi](https://aka.ms/aspnet/openapi) -Replacement of Swagger UI with OpenAPI for API projects — Bye Swashbuckle 👋 + +Replacement of Swagger UI with OpenAPI ---------------------------------------------------------------------------- -![Docs](D:\Github\abp\docs\en\Community-Articles\2024-11-13-BuiltIn-OpenApi-Documentation\img2.png) +Swagger UI is no longer integrated into NET 9, as Microsoft wants a solution with first-class support, better control, and enhanced security. As you see in the below screenshot, Microsoft declares that it's already removed. + +![Docs](img2.png) + +--- + + + + + +## Why is Swagger Removed from .NET 9? + +In March 2024, the ASP.NET Core team announced that they are removing the `Swashbuckle.AspNetCore` dependency from web templates from .NET 9 release. -Swagger UI, a third-party tool used for documenting and testing APIs, is no longer integrated into NET 9, as Microsoft wants a solution with first-class support, better control, and enhanced security. -In March 2024, the ASP.NET Core team announced plans to remove the `Swashbuckle.AspNetCore` dependency from web API templates in the upcoming .NET 9 release. > This decision was influenced by the project's lack of active maintenance and the absence of an official release for .NET 8. -The team intends to enhance the `Microsoft.AspNetCore.OpenApi` package to provide built-in OpenAPI document generation capabilities, reducing reliance on external tools. Community members expressed concerns about the inactivity of Swashbuckle and discussed alternatives like contributing to or forking the project. The ASP.NET Core team has engaged with the maintainers of both Swashbuckle and NSwag to explore potential collaborations and ensure a smooth transition for developers. -In the below issue, you can see the details of this decision: -* https://github.com/dotnet/aspnetcore/issues/54599 +Microsoft team created a new package `Microsoft.AspNetCore.OpenApi`. It provides built-in OpenAPI document generation just like Swagger. So Microsoft doesn't depend on external tools. Because in every .NET release, they need to ask the owners of the external tool libraries to align with their new version. And sometimes these library owners cannot update their code-base according to the recent .NET changes. And it is becoming harder for Microsoft to support the 3rd party libraries under these circumstances. Basically reducing 3rd party dependencies will help Microsoft fast release cycles. +I read Reddit, GitHub discussions and YouTube reviews about this topic. As I see community members expressed concerns about the inactivity of Swashbuckle and they are discussing alternatives like contributing to or forking the project. The Microsoft team also contacted the owners of Swashbuckle and NSwag to explore potential collaborations and ensure a smooth transition for developers. +In the below GitHub issue, you can see the details of this decision: -**Jeremy** -Product Manager- at Microsoft answers why they took this decision in [this post](https://github.com/dotnet/aspnetcore/issues/54599#issuecomment-2004975574). +* [github.com/dotnet/aspnetcore/issues/54599](https://github.com/dotnet/aspnetcore/issues/54599) -![Jeremy Comments](D:\Github\abp\docs\en\Community-Articles\2024-11-13-BuiltIn-OpenApi-Documentation\img3.png) -Why is SwaggerUI Removed from .NET 9? -------------------------------------- -**The change is due to a lack of maintenance of the Swagger library**, although it has seen some recent updates. +**Jeremy** -Product Manager- at Microsoft, answers why they took this decision in [this post](https://github.com/dotnet/aspnetcore/issues/54599#issuecomment-2004975574). -This change aims to reduce dependency on external tools and provide a streamlined, out-of-the-box experience for generating OpenAPI documentation for ASP.NET Core Web APIs. +![Jeremy Comments](img3.png) +As a summary; +**The change is due to a lack of maintenance of the Swagger library**, although it has seen some recent updates. This aims to reduce dependency on external tools and provide a streamlined, out-of-the-box experience for generating OpenAPI documentation for ASP.NET Core Web APIs. -What are the Benefits of the New OpenAI Documentation? +--- + + + + + +What are the Benefits of the New OpenAI Package? --------------------------------------------------------------- -1. **Native Support and Reduced Dependency** +### Native Support and Reduced Dependency + +The new `Microsoft.AspNetCore.OpenApi` package provides first-class citizen support for OpenAPI. It reduces reliance on external tools like Swashbuckle or NSwag for basic documentation needs. The native implementation leverages source generators to reduce runtime overhead. -The new `Microsoft.AspNetCore.OpenApi` package provides first-class support for OpenAPI.Reduces reliance on external tools like Swashbuckle or NSwag for basic documentation needs. +### Simplified Configuration -2. **Simplified Configuration** +No need extra setup or 3rd party integrations. Just by defining controllers and endpoints, ASP.NET Core automatically generates OpenAPI specifications. -No need for extensive setup or third-party integrations. Just by defining controllers and endpoints, the framework can automatically generate OpenAPI specifications. +### Well Integration with Minimal APIs -3. **Better Integration with Minimal APIs** +[Minimal APIs](https://learn.microsoft.com/en-us/aspnet/core/fundamentals/minimal-apis) introduced in .NET 6. There's an optimized built-in support for Minimal APIs. It automatically adds metadata for routes, request parameters, and responses. -- The built-in support is optimized for **Minimal APIs**, a feature introduced in .NET 6. Automatically includes metadata for routes, request parameters, and responses. +### Compatibility with Existing Tools -4. **Performance Improvement** +You can still use the output of OpenAPI with Swagger or NSwag... So it doesn't mean that in this case you have only one option when you use OpenAPI. -- The native implementation leverages source generators to reduce runtime overhead. Faster and more efficient than traditional runtime-based solutions like Swashbuckle. +--- -5. **Compatibility with Existing Tools** -* The OpenAPI output can still be consumed by Swagger UI, NSwag, or other tools for visualization, testing, or client generation. How to Use the New OpenAPI in .NET9? ------------------------------------ -If you are creating a new ASP.NET Core project, you can see the below checkbox to add OpenAPI. +When you create a new ASP.NET Core project, you can see the below checkbox to add OpenAPI. + +![New .NET 9 Project Screen](img5.png) -![New .NET 9 Project Screen](D:\Github\abp\docs\en\Community-Articles\2024-11-13-BuiltIn-OpenApi-Documentation\img5.png) +I created a new .NET 9 web project, I saw that OpenAPI had already been added. -When I created a new .NET 9 web project, I saw that OpenAPI had already been added. +![Package Reference](img4.png) -![Package Reference](D:\Github\abp\docs\en\Community-Articles\2024-11-13-BuiltIn-OpenApi-Documentation\img4.png) +## Add OpenAPI Support For Your Existing Project -Add the required NuGet package [Microsoft.AspNetCore.OpenApi](https://www.nuget.org/packages/Microsoft.AspNetCore.OpenApi) +Upgrade your project to .NET 9 and add the required NuGet package [Microsoft.AspNetCore.OpenApi](https://www.nuget.org/packages/Microsoft.AspNetCore.OpenApi) ``` dotnet add package Microsoft.AspNetCore.OpenApi ``` -### Enable OpenAPI Support +### Add the following services and middleware in `Program.cs` @@ -108,7 +137,11 @@ Your OpenAPI document URL is [_https://localhost:7077/openapi/v1.json_](https:// Change the port to your active port. This is how it looks like: -![Web UI of the Documentation](D:\Github\abp\docs\en\Community-Articles\2024-11-13-BuiltIn-OpenApi-Documentation\img1.png) +![Web UI of the Documentation](img1.png) + +--- + + Alternative 3rd Party Tool: Scalar ================================== @@ -119,6 +152,11 @@ See the repo 👉 [https://github.com/scalar/scalar](https://github.com/scalar/s +That's all from the replacement of Swagger in .NET 9. +Happy coding 👨‍💻 + + + **References** * [https://learn.microsoft.com/en-us/aspnet/core/release-notes/aspnetcore-9.0?view=aspnetcore-8.0#openapi](https://learn.microsoft.com/en-us/aspnet/core/release-notes/aspnetcore-9.0?view=aspnetcore-8.0#openapi) diff --git a/docs/en/Community-Articles/2024-11-14-Csharp-13-Features/Post.md b/docs/en/Community-Articles/2024-11-14-Csharp-13-Features/Post.md new file mode 100644 index 0000000000..12a1dea431 --- /dev/null +++ b/docs/en/Community-Articles/2024-11-14-Csharp-13-Features/Post.md @@ -0,0 +1,202 @@ +# C# 13 Features + +C# 13 is the latest version of C# and it comes with a lot of new features. In this article, we will discuss some of the new features of C# 13. + +## `params` collections + +With the C# 13, method parameter with `params` keyword isn't limited to be an array. You can now use any collection type that implements `IEnumerable` interface. + +Let's see how it can help us in our code. + +```csharp +public IEnumerable GetOdds(params IEnumerable numbers) +{ + foreach (var number in numbers) + { + if (number % 2 != 0) + { + Console.WriteLine(number); + } + } +} +``` + +## New lock object + +I'm sure you have used `lock` statement in your code to synchronize access to a shared resource. With C# 13, you can now use a new lock object that is more efficient than the traditional lock object. +The new `Lock` type provides better thread synchronization through its API. When `Lock.EnterScope()` method is called, it returns a struct named `Scope` that contains a `Dispose` method. The `Dispose` method is called when the `Scope` object goes out of scope, which releases the lock. C# `using` statement recognizes the `Dispose` method and calls it automatically like it does with other `IDisposable` objects. + +It was something similar before: +```csharp +private object _lock = new(); + +public void DoSomething() +{ + lock (_lock) + { + // Do something + } +} +``` + +Now, you can use the new lock object like this: +```csharp +System.Threading.Lock x = new System.Threading.Lock(); +public void DoSomething() +{ + using (x.EnterScope()) + { + // Do something + } +} +``` + +## New escape sequence +In C# 13, a new escape sequence `\e` has been introduced to represent the `ESCAPE` character, Unicode `U+001B`. Previously, you had to use `\u001b` or `\x1b` to represent this character. The new `\e` escape sequence simplifies this process and avoids potential issues with hexadecimal digits following `\x1b`. + +> You can check [here](https://en.wikipedia.org/wiki/ANSI_escape_code#C0_control_codes) for ANSI escape codes. + +## Implicit index access + +The implicit "from the end" index operator, `^`, is now allowed in an object initializer expression. + +It was not possible before, but now you can do this: + +```csharp +var countdown = new TimerRemaining() +{ + buffer = + { + [^1] = 0, + [^2] = 1, + [^3] = 2, + [^4] = 3, + [^5] = 4, + [^6] = 5, + [^7] = 6, + [^8] = 7, + [^9] = 8, + [^10] = 9 + } +}; +``` + +It's a great feature that makes the code more readable and maintainable. Still not a big deal, but it's nice to have it. + +## `ref` and `unsafe` in iterators and async methods + +In C# 13, the restrictions on using `ref` and `unsafe` constructs in iterators and async methods have been relaxed. Previously, you couldn't declare local `ref` variables or use unsafe contexts in these methods. Now, you can declare ref local variables and use unsafe contexts in async methods and iterators, provided they are not accessed across `await` or `yield` boundaries + + +This change allows for more expressive and efficient code, especially when working with types like `System.Span` and `System.ReadOnlySpan`. The compiler ensures that these constructs are used safely, and it will notify you if any safety rules are violated. + +You can read more about this feature on the [Microsoft Learn page](https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/proposals/csharp-13.0/ref-unsafe-in-iterators-async). + + + +## More partial members + +In C# 13, the concept of partial members has been expanded to include partial properties and partial indexers. Previously, only methods could be defined as partial members. This means you can now split the definition of properties and indexers across multiple files, just like you could with methods. + +For example, you can declare a partial property in one part of your class and implement it in another part. Here's a simple illustration: + +```csharp +public partial class MyClass +{ + // Declaring declaration + public partial string MyProperty { get; set; } +} + +public partial class MyClass +{ + // Implementing declaration + private string _myProperty; + public partial string MyProperty + { + get => _myProperty; + set => _myProperty = value; + } +} +``` + +This feature allows for better organization and modularization of your code, especially in large projects where different parts of a class might be implemented by different team members. + +## Overload resolution priority + +What does "Overload resolution priority" section mean in this page? +In C# 13, the OverloadResolutionPriority attribute allows library authors to specify which method overload should be preferred by the compiler when multiple overloads are available. This attribute helps avoid ambiguity and ensures that the most appropriate overload is chosen, even if it might not be the most obvious choice based on traditional overload resolution rules. + +This may be useful in scenarios where you have multiple overloads that are equally valid, but you want to prioritize one over the others. The attribute can be applied to a method or constructor to indicate its priority in the overload resolution process. It can prevent unexpected behavior and make your code more predictable and maintainable. + + +Let me show with an example: +```csharp +public class Example +{ + // Existing method + public void Display(string message = "Hello!") + { + Console.WriteLine("Message: " + message); + } + + // New, more efficient method with higher priority + [OverloadResolutionPriority(1)] + public void Display(string message = "Hello!", int repeatCount = 3) + { + for (int i = 0; i < repeatCount; i++) + { + Console.WriteLine("Message: " + message); + } + } +} + +class Program +{ + static void Main() + { + Example example = new Example(); + + // Normally, you can't compile this code because of ambiguity: + example.Display(); + } +} +``` + +Output: +``` +Message: Hello! +Message: Hello! +Message: Hello! +``` + +## The `field` keyword + +n C# 13, the `field` keyword is introduced as a preview feature to simplify property accessors. This keyword allows you to reference the compiler-generated backing `field` directly within a property accessor, eliminating the need to declare an explicit backing `field` in your type declaration. + +For example, instead of writing: + +```csharp +private int _value; +public int Value +{ + get => _value; + set => _value = value; +} +``` + +You can now write: + +```csharp +public int Value +{ + get => field; + set => field = value; +} +``` + +This makes your code cleaner and more concise. However, be cautious if you have a `field` named `field` in your class, as it could cause confusion. You can disambiguate by using `@field` or `this.field`. + +Make sure you're using the latest `LangVersion` in your `.csproj` project file to enable this feature. +```xml +preview +``` \ No newline at end of file diff --git a/docs/en/Community-Articles/2024-11-14-EF-Core-9-Linq-SQL-Translation/POST.md b/docs/en/Community-Articles/2024-11-14-EF-Core-9-Linq-SQL-Translation/POST.md new file mode 100644 index 0000000000..2e91d30e7f --- /dev/null +++ b/docs/en/Community-Articles/2024-11-14-EF-Core-9-Linq-SQL-Translation/POST.md @@ -0,0 +1,165 @@ +# EF Core 9 LINQ & SQL translation + +EF Core improves the translation of LINQ queries to SQL with every release. EF Core 9 is no exception. This article will show you some of the improvements in EF Core 9. + +EF Core 9 includes a lot of improvements in LINQ to SQL translation. we don't cover all of them in this article. You can find more information in the [official release notes](https://learn.microsoft.com/en-us/ef/core/what-is-new/ef-core-9.0/whatsnew#linq-and-sql-translation). + +## Support for complex types + +### GroupBy + +EF Core now supports grouping by complex type instance. For example: + +```csharp +var groupedAddress = await context.Customers + .GroupBy(c => new { c.Address }) + .Select(g => new { g.Key, Count = g.Count() }) + .ToListAsync(); +``` + +Address is a complex type as a value object here. + +### ExecuteUpdate + +EF Core now supports updating a complex type. For example: + +```csharp +var newAddress = new Address("New Street", "New City", "New Country"); + +await context.Customers + .Where(e => e.Region == "Turkey") + .ExecuteUpdateAsync(s => s.SetProperty(b => b.Address, newAddress)); +``` + +EF Core updates each column of the complex type. + +## Prune unneeded elements from SQL + +Ef Core now translates LINQ queries to SQL more efficiently. It will remove unneeded elements from the SQL query and bring better performance. + +### Table pruning + +When you use table-per-hierarchy (TPH) inheritance, previously EF Core generated SQL queries that included JIONs to tables that were not needed. + +For example: + +```csharp +public class Order +{ + public int Id { get; set; } + ... + + public Customer Customer { get; set; } +} + +public class DiscountedOrder : Order +{ + public double Discount { get; set; } +} + +public class Customer +{ + public int Id { get; set; } + ... + + public List Orders { get; set; } +} + +public class AppContext : DbContext +{ + ... + + protected override void OnModelCreating(ModelBuilder modelBuilder) + { + modelBuilder.Entity().UseTptMappingStrategy(); + } +} +``` + +Consider the following query to get all customers with at least one order: + +```csharp +var customers = await context.Customers.Where(o => o.Orders.Any()).ToListAsync(); +``` + +Previously, EF Core generated the following SQL query: + +```sql +SELECT [c].[Id], [c].[Name] +FROM [Customers] AS [c] +WHERE EXISTS ( + SELECT 1 + FROM [Orders] AS [o] + LEFT JOIN [DiscountedOrders] AS [d] ON [o].[Id] = [d].[Id] + WHERE [c].[Id] = [o].[CustomerId]) +``` + +It included a JOIN to the `DiscountedOrders` table, which was not needed. In EF Core 9, the generated SQL query is: + +```sql +SELECT [c].[Id], [c].[Name] +FROM [Customers] AS [c] +WHERE EXISTS ( + SELECT 1 + FROM [Orders] AS [o] + WHERE [c].[Id] = [o].[CustomerId]) +``` + +## EF Core in ABP + +ABP Framework is built on top of the latest technologies. It will support EF Core 9 as soon as it is released. You can use the latest features of EF Core in your ABP applications. + +For example, you can use the `ExecuteUpdateAsync` method in your ABP application: + +```csharp +public class Book : FullAuditedAggregateRoot +{ + public string Name { get; set; } + + public float Price { get; set; } + + public string Author { get; set; } +} + +public class AppContext : AbpDbContext +{ + public DbSet Books { get; set; } + + protected override void OnModelCreating(ModelBuilder modelBuilder) + { + base.OnModelCreating(builder); + + builder.Entity(b => + { + b.ToTable("Books"); + b.ConfigureByConvention(); + b.Property(x => x.Name).IsRequired().HasMaxLength(128); + b.Property(x => x.Author).IsRequired().HasMaxLength(64); + }); + } +} + +public class BookRepository : EfCoreRepository, IBookRepository +{ + public BookRepository(IDbContextProvider dbContextProvider) + : base(dbContextProvider) + { + } + + public async Task UpdatePriceByAuthorAsync(string author, float price) + { + await (await GetDbSetAsync()) + .Where(b => b.Author == author) + .ExecuteUpdateAsync(b => b.SetProperty(x => x.Price, price)); + } +} +``` + +* `FullAuditedAggregateRoot` is an aggregate root base class with auditing properties provided by ABP Framework. +* `IRepository` is a generic repository interface provided by ABP Framework that provides CRUD operations and you can use EF Core's API in your entity repository implementation. + +## References + +* [LINQ and SQL translation](https://learn.microsoft.com/en-us/ef/core/what-is-new/ef-core-9.0/whatsnew#linq-and-sql-translation) +* [ABP Entity Framework Core Integration](https://abp.io/docs/latest/framework/data/entity-framework-core) +* [ABP Entities](https://abp.io/docs/latest/framework/architecture/domain-driven-design/entities) diff --git a/docs/en/Community-Articles/2024-12-01-OpenAI-Integration/POST.md b/docs/en/Community-Articles/2024-12-01-OpenAI-Integration/POST.md new file mode 100644 index 0000000000..c07509d2e3 --- /dev/null +++ b/docs/en/Community-Articles/2024-12-01-OpenAI-Integration/POST.md @@ -0,0 +1,385 @@ +# How to Use OpenAI API with ABP Framework + +In this article, I will show you how to integrate and use the [OpenAI API](https://github.com/openai/openai-dotnet?tab=readme-ov-file#getting-started) with the [ABP Framework](https://abp.io/). We will explore step-by-step how these technologies can work together to enhance your application with powerful AI capabilities, such as natural language processing, image generation, and more. + +![cover-image](cover-image.png) + +## Creating an ABP Project + +To begin integrating OpenAI API with ABP Framework, you first need to create an ABP project. Follow these steps to create and set up your ABP project: +### Step 1: Install ABP CLI + +The ABP CLI is a command-line interface tool that helps you create and manage ABP projects easily. To install the ABP CLI, run the following command in your terminal: + +```bash +dotnet tool install -g Volo.Abp.Studio.Cli +``` + +### Step 2: Create a New ABP Project + +Once you have installed the ABP CLI, you can create a new ABP project using the following command: + +```bash +abp new Acme.OpenAIIntegration -t app --ui-framework mvc --database-provider ef -dbms PostgreSQL --csf +``` + +> This command will generate a complete ABP project with an [MVC UI](https://abp.io/docs/latest/framework/ui/mvc-razor-pages/overall). The examples provided in this article make use of UI controllers for demonstration purposes. However, the same approach can easily be applied to other UI types supported by ABP, such as Blazor or Angular. You can find other options [here](https://abp.io/docs/latest/cli). +## OpenAI Integration Setup + +To begin integrating OpenAI API with ABP Framework, follow these steps: + +### Step 1: Create an API Key + +To use the OpenAI services, you first need an API key. To obtain one, first [create a new OpenAI account](https://platform.openai.com/signup) or [log in](https://platform.openai.com/login). Next, navigate to the [API key page](https://platform.openai.com/account/api-keys) and select "Create new secret key", optionally naming the key. Make sure to save your API key somewhere safe and do not share it with anyone. + +This key will be used to authenticate your application when making requests to the OpenAI endpoints. + +### Step 2: Adding *Microsoft.Extensions.AI* Package + +To integrate OpenAI API with ABP, we use [Microsoft.Extensions.AI](https://www.nuget.org/packages/Microsoft.Extensions.AI.OpenAI/). This package offers a unified API for integrating AI services, making it easy for developers to work with different AI providers. You can find more details in [this blog post](https://devblogs.microsoft.com/dotnet/introducing-microsoft-extensions-ai-preview/). + +To begin integrating OpenAI API with ABP Framework, follow these steps: + +1. Add the **Microsoft.Extensions.AI** and **Microsoft.Extensions.AI.OpenAI** (used to interact specifically with OpenAI services. Additionally, this package has alternatives like [Azure OpenAI](https://www.nuget.org/packages/Microsoft.Extensions.AI.OpenAI/), [Azure AI Inference](https://www.nuget.org/packages/Microsoft.Extensions.AI.AzureAIInference/), and [Ollama](https://www.nuget.org/packages/Microsoft.Extensions.AI.Ollama/), offering flexibility for developers to choose the AI provider that best fits their needs) packages: + +```bash +dotnet add package Microsoft.Extensions.AI --prerelease +dotnet add package Microsoft.Extensions.AI.OpenAI --prerelease +``` + +2. Add the required configuration to the `appsettings.json` file located inside the `Acme.OpenAIIntegration.Web` project and dependencies to your `ConfigureServices` method: + +```json +"AI": { + "OpenAI": { + "Key": "YOUR-API-KEY", + "Chat": { + "ModelId": "gpt-4o-mini" + } + } +} +``` + +> Replace the value of the `Key` with your OpenAI API key. + +Next, add the following code to the `ConfigureServices` method in `OpenAIIntegrationBlazorModule`: + +```csharp +context.Services.AddSingleton(new OpenAIClient(configuration["AI:OpenAI:Key"])); + +context.Services.AddChatClient(services => + services.GetRequiredService().AsChatClient(configuration["AI:OpenAI:Chat:ModelId"] ?? "gpt-4o-mini")); +``` + +## Creating a Sample Page + +To demonstrate the use of OpenAI API, let's create a page named `Sample` in the `Acme.OpenAIIntegration.Web` project: + +Create a `Sample` folder under the `Pages` folder of the `Acme.OpenAIIntegration.Web` project. Add a new Razor Page by right-clicking the `Sample` folder then selecting `Add > Razor Page`. Name it `Index`. + +Open the `Index.cshtml` and change the whole content as shown below: + +> Note: This example demonstrates a simple implementation of a sample page that interacts with the OpenAI API, covering chat, [retrieval-augmented generation (RAG)](https://github.com/openai/openai-dotnet?tab=readme-ov-file#how-to-use-assistants-with-retrieval-augmented-generation-rag), and image generation features. Each example is explained in detail in the next section, so feel free to continue for a better understanding of the steps and logic involved. + +```html +@page +@model Acme.OpenAIIntegration.Web.Pages.Sample +@{ + ViewData["Title"] = "OpenAI API Demonstration"; +} + +

@ViewData["Title"]

+ +

+ +
+
+

Chat Example

+
+
+ + +
+ +
+ @if (!string.IsNullOrEmpty(Model.ChatResponse)) + { +

Response:

+

@Model.ChatResponse

+ } +
+ +
+

RAG Example

+
+
+ + +
+ +
+ @if (!string.IsNullOrEmpty(Model.RAGResponse)) + { +

Result:

+

@Model.RAGResponse

+ } +
+ +
+

Image Generation Example

+
+
+ + +
+ +
+ @if (Model.GeneratedImageBytes != null) + { +

Generated Image:

+ Generated image + } +
+
+``` + +`Index.cshtml.cs` content should be like that: + +```csharp +using System; +using System.ClientModel; +using System.IO; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.RazorPages; +using Microsoft.Extensions.AI; +using OpenAI; +using OpenAI.Assistants; +using OpenAI.Files; +using OpenAI.Images; + +namespace Acme.OpenAIIntegration.Web.Pages; + +public class Sample : PageModel +{ + [BindProperty] + public string ChatInput { get; set; } + public string ChatResponse { get; set; } + + [BindProperty] + public string RAGQuery { get; set; } + public string RAGResponse { get; set; } + + [BindProperty] + public string ImagePrompt { get; set; } + public byte[] GeneratedImageBytes { get; set; } + + private readonly IChatClient _chatClient; + private readonly OpenAIClient _openAiClient; + + public Sample( + IChatClient chatClient, + OpenAIClient openAiClient) + { + _chatClient = chatClient; + _openAiClient = openAiClient; + } + + public async Task OnPostChatAsync() + { + ChatResponse = $"Chat response: {(await _chatClient.CompleteAsync(ChatInput)).Message}"; + return Page(); + } + + public async Task OnPostRAGAsync() + { +#pragma warning disable OPENAI001 + var fileClient = _openAiClient.GetOpenAIFileClient(); + var assistantClient = _openAiClient.GetAssistantClient(); + + using var document = BinaryData.FromBytes(GetExceptionHandlingDocumentContent().ToArray()).ToStream(); + var exceptionHandlingDoc = await fileClient.UploadFileAsync( + document, + "ExceptionHandling.md", + FileUploadPurpose.Assistants); + + AssistantCreationOptions assistantOptions = new() + { + Name = "Exception Handling Assistant", + Instructions = + """ + This assistant helps you with exception handling in ABP Framework. You can ask questions about exception handling and get answers. + + - Do not make any assumptions when asked for information that is not in the document + - Give the most accurate information possible + - Give short(max 1-2 sentence) and concise answers + - Do not provide file citations + """, + + Tools = + { + new FileSearchToolDefinition(), + }, + ToolResources = new() + { + FileSearch = new() + { + NewVectorStores = + { + new VectorStoreCreationHelper([exceptionHandlingDoc.Value.Id]), + } + } + }, + }; + + var assistant = await assistantClient.CreateAssistantAsync("gpt-4o", assistantOptions); + + ThreadCreationOptions threadOptions = new() + { + InitialMessages = { RAGQuery } + }; + + ThreadRun threadRun = assistantClient.CreateThreadAndRun(assistant.Value.Id, threadOptions); + + do + { + Thread.Sleep(TimeSpan.FromSeconds(1)); + threadRun = assistantClient.GetRun(threadRun.ThreadId, threadRun.Id); + } while (!threadRun.Status.IsTerminal); + + CollectionResult messages + = assistantClient.GetMessages(threadRun.ThreadId, + new MessageCollectionOptions() { Order = MessageCollectionOrder.Ascending }); + + var response = new StringBuilder(); + + foreach (var message in messages) + { + response.AppendLine($"[{message.Role.ToString().ToUpper()}]: "); + foreach (var contentItem in message.Content) + { + if (!string.IsNullOrEmpty(contentItem.Text)) + { + response.AppendLine(contentItem.Text); + + if (contentItem.TextAnnotations.Count > 0) + { + response.AppendLine(""); + } + } + } + + response.AppendLine(""); +#pragma warning restore OPENAI001 + } + + RAGResponse = response.ToString(); + + return Page(); + } + + public async Task OnPostImageGenerationAsync() + { + var client = _openAiClient.GetImageClient("dall-e-3"); + + var image = await client.GenerateImageAsync(ImagePrompt, new ImageGenerationOptions + { + ResponseFormat = GeneratedImageFormat.Bytes + }); + + var imageBytes = image.Value.ImageBytes; + + using var memoryStream = new MemoryStream(); + await imageBytes.ToStream().CopyToAsync(memoryStream); + GeneratedImageBytes = memoryStream.ToArray(); + + return Page(); + } + + public ReadOnlySpan GetExceptionHandlingDocumentContent() + { + return """ + # Exception Handling + + ABP provides a built-in infrastructure and offers a standard model for handling exceptions. + + * Automatically **handles all exceptions** and sends a standard **formatted error message** to the client for an API/AJAX request. + * Automatically hides **internal infrastructure errors** and returns a standard error message. + * Provides an easy and configurable way to **localize** exception messages. + * Automatically maps standard exceptions to **HTTP status codes** and provides a configurable option to map custom exceptions. + + ## Automatic Exception Handling + + `AbpExceptionFilter` handles an exception if **any of the following conditions** are met: + + * Exception is thrown by a **controller action** which returns an **object result** (not a view result). + * The request is an AJAX request (`X-Requested-With` HTTP header value is `XMLHttpRequest`). + * Client explicitly accepts the `application/json` content type (via `accept` HTTP header). + + If the exception is handled it's automatically **logged** and a formatted **JSON message** is returned to the client. + + ## Business Exceptions + + Most of your own exceptions will be business exceptions. The `IBusinessException` interface is used to mark an exception as a business exception. + + `BusinessException` implements the `IBusinessException` interface in addition to the `IHasErrorCode`, `IHasErrorDetails` and `IHasLogLevel` interfaces. The default log level is `Warning`. + + Usually you have an error code related to a particular business exception. For example: + + ````C# + throw new BusinessException(QaErrorCodes.CanNotVoteYourOwnAnswer); + ```` + + ### User Friendly Exception + + If an exception implements the `IUserFriendlyException` interface, then ABP does not change it's `Message` and `Details` properties and directly send it to the client. + + `UserFriendlyException` class is the built-in implementation of the `IUserFriendlyException` interface. Example usage: + + ````C# + throw new UserFriendlyException( + "Username should be unique!" + ); + ```` + * The `IUserFriendlyException` interface is derived from the `IBusinessException` and the `UserFriendlyException` class is derived from the `BusinessException` class. + + """u8; + } +} +``` + +## Running the Application + +After completing the setup, you can run the application using the following command: + +```bash + dotnet run --project ./src/Acme.OpenAIIntegration.Web +``` + +Once the application is running, open your browser and navigate to `/Sample`. You should see the `Sample` page we created, which contains sections for Chat, RAG (Retrieval-Augmented Generation), and Image Generation. You can find the screenshot of the page below: + +![sample page](sample-page.png) + +## Examples Overview + +To showcase the integration of the OpenAI API with the ABP Framework, we implemented three different examples: + +1. **Chat Example**: This example demonstrates how to use OpenAI's chat capabilities by allowing users to enter a message and receive an AI-generated response. The implementation involves setting up a simple form on the `Sample` page where users can input their message. The form submission triggers the `OnPostChatAsync` method, which uses the `IChatClient` to generate a response. + +![chat-example](chat-example.gif) + +2. **Retrieval-Augmented Generation (RAG) Example**: In this example, we use OpenAI to answer user queries by referencing custom documents uploaded to the OpenAI API. The implementation involves uploading a document using the `OpenAIFileClient` and creating an assistant with specific instructions to handle the uploaded content. In this case, the document is a section from ABP's Exception Handling documentation, which includes examples on how ABP handles exceptions, user-friendly error messages, and business exceptions. Users can input their query on the `Sample` page, and the `OnPostRAGAsync` method processes the query to generate precise answers based on the document content. If users ask questions that are not covered in the document, the assistant clearly indicates that the information is not available, as per the instructions provided. For example, when asked about `Object Extensions`, the response begins with: "The uploaded document does not contain information about `Object Extensions`...". This demonstrates how the assistant adheres to the provided instructions. You can also find this example illustrated in the GIF below. + +![rag-example-1](rag-example-1.gif) + +![rag-example-2](rag-example-2.gif) + +3. **Image Generation Example**: This example leverages the [DALL-E](https://openai.com/index/dall-e-3/) model to generate images based on user-provided prompts. On the `Sample` page, users can provide a description of the image they want to generate, and the `OnPostImageGenerationAsync` method uses the `OpenAIClient` to generate the image. + +![image-generation-example](image-generation-example.gif) + +## Conclusion + +In this article, we covered how to integrate the OpenAI API with the ABP Framework by creating a sample project, setting up the OpenAI services, and implementing examples for conversational AI, knowledge-based assistance, and image generation. By following these steps, you can add powerful AI-driven capabilities to your application, making it more interactive, intelligent, and capable of meeting user needs effectively. \ No newline at end of file diff --git a/docs/en/Community-Articles/2024-12-01-OpenAI-Integration/chat-example.gif b/docs/en/Community-Articles/2024-12-01-OpenAI-Integration/chat-example.gif new file mode 100644 index 0000000000..f67d54cecc Binary files /dev/null and b/docs/en/Community-Articles/2024-12-01-OpenAI-Integration/chat-example.gif differ diff --git a/docs/en/Community-Articles/2024-12-01-OpenAI-Integration/cover-image.png b/docs/en/Community-Articles/2024-12-01-OpenAI-Integration/cover-image.png new file mode 100644 index 0000000000..b1cc16f0b5 Binary files /dev/null and b/docs/en/Community-Articles/2024-12-01-OpenAI-Integration/cover-image.png differ diff --git a/docs/en/Community-Articles/2024-12-01-OpenAI-Integration/image-generation-example.gif b/docs/en/Community-Articles/2024-12-01-OpenAI-Integration/image-generation-example.gif new file mode 100644 index 0000000000..c415f95119 Binary files /dev/null and b/docs/en/Community-Articles/2024-12-01-OpenAI-Integration/image-generation-example.gif differ diff --git a/docs/en/Community-Articles/2024-12-01-OpenAI-Integration/rag-example-1.gif b/docs/en/Community-Articles/2024-12-01-OpenAI-Integration/rag-example-1.gif new file mode 100644 index 0000000000..ca42bf3f61 Binary files /dev/null and b/docs/en/Community-Articles/2024-12-01-OpenAI-Integration/rag-example-1.gif differ diff --git a/docs/en/Community-Articles/2024-12-01-OpenAI-Integration/rag-example-2.gif b/docs/en/Community-Articles/2024-12-01-OpenAI-Integration/rag-example-2.gif new file mode 100644 index 0000000000..5f03e453c6 Binary files /dev/null and b/docs/en/Community-Articles/2024-12-01-OpenAI-Integration/rag-example-2.gif differ diff --git a/docs/en/Community-Articles/2024-12-01-OpenAI-Integration/sample-page.png b/docs/en/Community-Articles/2024-12-01-OpenAI-Integration/sample-page.png new file mode 100644 index 0000000000..211f63215d Binary files /dev/null and b/docs/en/Community-Articles/2024-12-01-OpenAI-Integration/sample-page.png differ diff --git a/docs/en/cli/index.md b/docs/en/cli/index.md index 9297965bb4..75e6a17bb9 100644 --- a/docs/en/cli/index.md +++ b/docs/en/cli/index.md @@ -211,6 +211,7 @@ For more samples, go to [ABP CLI Create Solution Samples](new-command-samples.md * `leptonx`: LeptonX Theme. * `basic`: Basic Theme. * `--public-website`: Public Website is a front-facing website for describing your project, listing your products and doing SEO for marketing purposes. Users can login and register on your website with this website. This option is only included in PRO templates. + * `--no-grafana-dashboard` or `-ngd`: Does not add example Grafana Dashboard to the solution. * `--output-folder` or `-o`: Specifies the output folder. Default value is the current directory. * `--local-framework-ref` or `-lfr`: Uses local projects references to the ABP framework instead of using the NuGet packages. It tries to find the paths from `ide-state.json`. The file is located at `%UserProfile%\.abp\studio\ui\ide-state.json` (for Windows) and `~/.abp/studio/ui/ide-state.json` (for MAC). * `--create-solution-folder` or `-csf`: Specifies if the project will be in a new folder in the output folder or directly the output folder. @@ -225,6 +226,7 @@ For more samples, go to [ABP CLI Create Solution Samples](new-command-samples.md * `--dont-run-bundling`: Skip bundling for Blazor packages. * `--no-kubernetes-configuration` or `-nkc`: Skips the Kubernetes configuration files. * `--no-social-logins` or `-nsl`: Skipts the social login configuration. +* `--no-tests` or `-ntp`: Does not add test projects. * *Module Options*: You can skip some modules if you don't want to add them to your solution (*Available for* ***Team*** *or higher licenses*). Available commands: * `-no-saas`: Skips the Saas module. * `-no-gdpr`: Skips the GDPR module. diff --git a/docs/en/cli/new-command-samples.md b/docs/en/cli/new-command-samples.md index 6b168b538c..a8d469b10b 100644 --- a/docs/en/cli/new-command-samples.md +++ b/docs/en/cli/new-command-samples.md @@ -221,6 +221,79 @@ As seen below, ABP libraries are local project references. ``` +## Using Existing Configuration + +If you want to programmaticaly create solutions, you can use an existing configuration instead of passing parameters to CLI one by one. ABP Studio keeps the solution creation history locally in `(UserProfile)\.abp\studio\solution-creation-history.json` file, there you can find the configurations of the solutions created in your machine. + +### Using a Solution Id + +In `*.abpsln` file of the solutions, there is an ID field that you can use to recreate a solution. To do this, pass the id to cli using `-shi or --solution-history-id` parameters. + +```bash +abp new -shi dbb1afa9-190e-419a-842d-2780bb1bad1f +abp new -shi dbb1afa9-190e-419a-842d-2780bb1bad1f -o D:\test\Acme.BookStore +``` + +### Using a JSON Configuration File + +You can also use a configuration file to create solutions. You need to use `-rcp or ready-config-path` parameters to do that. + +```bash +abp new -rcp MyTests\config.json +abp new -rcp D:\MyTests\config.json +abp new -rcp D:\MyTests\config.json -o D:\test\Acme.BookStore +``` + +To prepare a config file, you can check the records in `solution-creation-history.json` file mentioned above. An example config file would look like that: + +```json +{ + "solutionName": { + "fullName": "Acme.BookStore", + "companyName": "Acme", + "projectName": "BookStore" + }, + "pro": true, + "useOpenSourceTemplate": false, + "booksSample": false, + "databaseProvider": "ef", + "createInitialMigration": true, + "runDbMigrator": true, + "uiFramework": "angular", + "theme": "leptonx", + "themeStyle": "system", + "mobileFramework": "none", + "databaseManagementSystem": "sqlserver", + "databaseManagementSystemBuilderExtensionMethod": "UseSqlServer", + "connectionString": "Server=(LocalDb)\\\\MSSQLLocalDB;Database=BookStore;Trusted_Connection=True;TrustServerCertificate=true", + "mauiBlazorApplicationIdGuid": "d3499a09-f3d4-4bb7-9d58-4c7b1caee331", + "tiered": false, + "publicWebsite": false, + "cmskit": false, + "openIddictAdmin": true, + "languageManagement": true, + "textTemplateManagement": true, + "multiTenancy": true, + "auditLogging": false, + "gdpr": true, + "chat": false, + "fileManagement": false, + "socialLogins": true, + "includeTests": true, + "distributedEventBus": "none", + "publicRedis": false, + "separateTenantSchema": false, + "progressiveWebApp": false, + "runProgressiveWebAppSupport": false, + "runInstallLibs": false, + "runBundling": false, + "kubernetesConfiguration": true, + "templateName": "app" + } +``` + + + ## See Also * [ABP CLI documentation](../cli/index.md) diff --git a/docs/en/deployment/forwarded-headers.md b/docs/en/deployment/forwarded-headers.md new file mode 100644 index 0000000000..b6b74205c3 --- /dev/null +++ b/docs/en/deployment/forwarded-headers.md @@ -0,0 +1,84 @@ +# Forwarded Headers + +Reverse proxies and load balancers play a crucial role in modern web application architectures. When an application is deployed behind these proxies and load balancers, several specific issues can arise. This document will discuss these issues in detail, explain how ASP.NET Core's forwarded headers middleware can address them, and provide a code example for configuring forwarded headers in an ABP application. + +## Possible problem in a Reverse Proxy Environment + +When requests pass through a reverse proxy or load balancer, the following common issues can occur: + +### 1. Loss of Original Request Information + +A reverse proxy or load balancer typically modifies the original HTTP request headers. For example, the proxy may replace the client's `X-Forwarded-For` header, or the `Host` header might be set to the proxy's address. This can result in the backend application being unable to directly access the client's IP address, the true hostname, and the protocol used. + +### 2. HTTPS vs HTTP Protocol Confusion + +When a request is forwarded by a proxy server, it is often upgraded to HTTPS to ensure secure transmission. The proxy server will send a header like `X-Forwarded-Proto` to indicate whether the original request was HTTP or HTTPS. If the backend application does not correctly handle this header, it may generate URLs with the wrong protocol. + +### 3. Path Handling Issues + +Since load balancers and proxies might modify or map the request URL paths differently, the backend application could encounter path inconsistencies. For example, a reverse proxy might forward a request from `/api` to `/myapp/api`. If the backend application is not correctly configured, path parsing errors may occur. + +### 4. IP Address and Security + +Reverse proxies might replace the original client IP address with their own, which can affect logging, authentication, and access control mechanisms. To retrieve the actual client IP address, the `X-Forwarded-For` header must be correctly parsed and trusted. + +### 5. Load Balancer Impact + +Load balancers might distribute requests to different backend servers using different algorithms. This can create session affinity problems. If session data is stored on a single server and the load balancer directs subsequent requests to different servers, session loss or inconsistency may occur. + +## Forwarded Headers Middleware in ABP web application + +To resolve the above issues, ASP.NET Core provides a built-in middleware, `ForwardedHeadersMiddleware`, which processes the headers forwarded by reverse proxies. This middleware helps the application recover the correct original request information, such as the client’s IP address, protocol, and host. + +### Configuring `ForwardedHeadersMiddleware` + +ASP.NET Core’s `ForwardedHeadersMiddleware` supports several HTTP headers: + +- **X-Forwarded-For**: Contains the original client’s IP address. +- **X-Forwarded-Proto**: Indicates whether the original request was HTTP or HTTPS. +- **X-Forwarded-Host**: Contains the original host requested by the client. +- **X-Forwarded-Port**: Indicates the original port of the request. + +To configure this middleware: + +1. In the `ConfigureServices` method of your module, configure the `ForwardedHeadersOptions`: + +```csharp +public override void ConfigureServices(ServiceConfigurationContext context) +{ + context.Services.Configure(options => + { + options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto; + }); +} +``` + +2. In the `OnApplicationInitialization` method of your module, add the middleware: + +> Forwarded Headers Middleware should run before other middleware. This ordering ensures that the middleware relying on forwarded headers information can consume the header values for processing. Forwarded Headers Middleware can run after diagnostics and error handling, but it must be run before calling UseHsts: + +```csharp +public override void OnApplicationInitialization(ApplicationInitializationContext context) +{ + var app = context.GetApplicationBuilder(); + var env = context.GetEnvironment(); + + if (env.IsDevelopment()) + { + app.UseDeveloperExceptionPage(); + app.UseForwardedHeaders(); + } + else + { + app.UseErrorPage(); + app.UseForwardedHeaders(); + app.UseHsts(); + } + + // Other middleware configurations... +} +``` + +## References + +- [ASP.NET Core Proxy and Load Balancer Configuration](https://learn.microsoft.com/en-us/aspnet/core/host-and-deploy/proxy-load-balancer?view=aspnetcore-9.0) diff --git a/docs/en/deployment/index.md b/docs/en/deployment/index.md index 3537e4593e..245c8bdaf0 100644 --- a/docs/en/deployment/index.md +++ b/docs/en/deployment/index.md @@ -12,3 +12,4 @@ However, there are some topics that you should care about when you are deploying * [Optimization for Production](./optimizing-production.md): Tips and suggestions for optimizing your application in production environments. * [Deploying to a Clustered Environment](./clustered-environment.md): Explains how to configure your application when you want to run multiple instances of your application concurrently. * [Deploying Distributed / Microservice Solutions](./distributed-microservice.md): Deployment notes for solutions consisting of multiple applications and/or services. +* [Forwarded Headers](./forwarded-headers): Explains how to configure the application to trust headers forwarded by reverse proxies and recover the original request information from the `X-Forwarded-For` and `X-Forwarded-Proto` headers. \ No newline at end of file diff --git a/docs/en/docs-nav.json b/docs/en/docs-nav.json index d30b25dfb6..b1a335746b 100644 --- a/docs/en/docs-nav.json +++ b/docs/en/docs-nav.json @@ -115,6 +115,35 @@ } ] }, + { + "text": "Book Store Application (with ABP Suite)", + "items": [ + { + "text": "Overview", + "path": "tutorials/book-store-with-abp-suite" + }, + { + "text": "1: Creating the Solution", + "path": "tutorials/book-store-with-abp-suite/part-01.md" + }, + { + "text": "2: Creating the Books", + "path": "tutorials/book-store-with-abp-suite/part-02.md" + }, + { + "text": "3: Creating the Authors", + "path": "tutorials/book-store-with-abp-suite/part-03.md" + }, + { + "text": "4: Book to Author Relation", + "path": "tutorials/book-store-with-abp-suite/part-04.md" + }, + { + "text": "5: Customizing the Generated Code", + "path": "tutorials/book-store-with-abp-suite/part-05.md" + } + ] + }, { "text": "Modular Monolith Application", "items": [ @@ -156,6 +185,43 @@ } ] }, + { + "text": "Microservice Solution", + "items": [ + { + "text": "Overview", + "path": "tutorials/microservice/index.md" + }, + { + "text": "1: Creating the initial solution", + "path": "tutorials/microservice/part-01.md" + }, + { + "text": "2: Creating the initial Catalog service", + "path": "tutorials/microservice/part-02.md" + }, + { + "text": "3: Building the Catalog service", + "path": "tutorials/microservice/part-03.md" + }, + { + "text": "4: Creating the initial Ordering service", + "path": "tutorials/microservice/part-04.md" + }, + { + "text": "5: Building the Ordering service", + "path": "tutorials/microservice/part-05.md" + }, + { + "text": "6: Integrating the services: HTTP API Calls", + "path": "tutorials/microservice/part-06.md" + }, + { + "text": "7: Integrating the services: Using Distributed Events", + "path": "tutorials/microservice/part-07.md" + } + ] + }, { "text": "Community Articles", "path": "https://abp.io/community" diff --git a/docs/en/docs-params.json b/docs/en/docs-params.json index 46e496f248..e108f1b554 100644 --- a/docs/en/docs-params.json +++ b/docs/en/docs-params.json @@ -7,6 +7,7 @@ "MVC": "MVC / Razor Pages", "Blazor": "Blazor WebAssembly", "BlazorServer": "Blazor Server", + "BlazorWebApp": "Blazor WebApp", "NG": "Angular" } }, diff --git a/docs/en/framework/fundamentals/dependency-injection.md b/docs/en/framework/fundamentals/dependency-injection.md index dc0b847cbf..9dda3aef45 100644 --- a/docs/en/framework/fundamentals/dependency-injection.md +++ b/docs/en/framework/fundamentals/dependency-injection.md @@ -498,6 +498,8 @@ Use `ICachedServiceProvider` (instead of `ITransientCachedServiceProvider`) unle > ABP also provides the `IAbpLazyServiceProvider` service. It does exists for backward compatibility and works exactly same with the `ITransientCachedServiceProvider` service. So, use the `ITransientCachedServiceProvider` since the `IAbpLazyServiceProvider` might be removed in future ABP versions. +> Another advantage of using `ICachedServiceProvider` is that, during an HTTP request, if a service's constructor requires injecting many dependencies, it can negatively impact performance, as the injected services may not all be used by the current request. By resolving services on-demand, performance degradation can be effectively avoided. + ## Advanced Features ### IServiceCollection.OnRegistered Event diff --git a/docs/en/framework/infrastructure/event-bus/index.md b/docs/en/framework/infrastructure/event-bus/index.md index 982268780a..1c3f59bc4e 100644 --- a/docs/en/framework/infrastructure/event-bus/index.md +++ b/docs/en/framework/infrastructure/event-bus/index.md @@ -6,5 +6,26 @@ An event bus is a mediator that transfers a message from a sender to a receiver. ABP provides two type of event buses; -* **[Local Event Bus](local)** is suitable for in-process messaging. -* **[Distributed Event Bus](distributed)** is suitable for inter-process messaging, like microservices publishing and subscribing to distributed events. \ No newline at end of file +* **[Local Event Bus](local/index.md)** is suitable for in-process messaging. +* **[Distributed Event Bus](distributed/index.md)** is suitable for inter-process messaging, like publishing and subscribing to distributed events in a distributed/microservice system. + +## Event Bus Guiding + +You may confuse which event bus to use in your application. Here, a few example scenarios: + +* If you are building a microservice system, use the distributed event bus for **inter-microservice communication**. If you are publishing an event and always handling it in the same microservice, you can use the local event bus for that event. +* If you are building a modular monolith application, use the distributed event bus for **inter-module communication**. Since the distributed event bus works in-process by default (unless you configure a real distributed event bus provider). In that way, if you migrate to a microservice system later, these inter-module communication can become a inter-microservice communication without any code change (with just installing a distributed event bus provide package). If you are publishing an event and always handling it in the same module, you can use the local event bus for that event. +* If you are building a monolith (non-modular) application, you can always use the local event bus. + +The distributed event bus works in-process by default. Unless you don't configure a real distributed event bus provider, it works just like the local event bus. Once you configure a real distributed event bus provider, all your events become distributed. + +So, you use the local event bus only if you an event should always remain in-process in any scenario. For other type of events, use the distributed event bus. + +### Technical Differences + +There are some technical differences between the local and distributed event bus: + +* You can send entities or other non-serializable objects using the local event bus since these objects are not serialized/deserialized on event publishing. On the other hand, distributed event bus serializes/deserializes objects once you use a real distributed event bus provider. +* The local event bus is always transactional in the database level. For distributed event bus, you should enable inbox/outbox pattern to ensure data consistency once you use a real distributed event bus provider. + +These differences are because of the distributed event bus supports distributed scenarios while the local event bus is only used for in-process messaging. When you don't set up a real distributed event bus provider, these differences are not valid. \ No newline at end of file diff --git a/docs/en/framework/ui/angular/quick-start.md b/docs/en/framework/ui/angular/quick-start.md index 32e4522937..dec3a23262 100644 --- a/docs/en/framework/ui/angular/quick-start.md +++ b/docs/en/framework/ui/angular/quick-start.md @@ -6,7 +6,7 @@ Please follow the steps below to prepare your development environment for Angular. -1. **Install Node.js:** Please visit [Node.js downloads page](https://nodejs.org/en/download/) and download proper Node.js `v18.19+` installer for your OS. An alternative is to install [NVM](https://github.com/nvm-sh/nvm) and use it to have multiple versions of Node.js in your operating system. +1. **Install Node.js:** Please visit [Node.js downloads page](https://nodejs.org/en/download/) and download proper Node.js `v20.11+` installer for your OS. An alternative is to install [NVM](https://github.com/nvm-sh/nvm) and use it to have multiple versions of Node.js in your operating system. 2. **[Optional] Install Yarn:** You may install Yarn v1.22+ (not v2) following the instructions on [the installation page](https://classic.yarnpkg.com/en/docs/install). Yarn v1 delivers an arguably better developer experience compared to npm v10 and below. You may skip this step and work with npm, which is built-in in Node.js, instead. 3. **[Optional] Install VS Code:** [VS Code](https://code.visualstudio.com/) is a free, open-source IDE which works seamlessly with TypeScript. Although you can use any IDE including Visual Studio or Rider, VS Code will most likely deliver the best developer experience when it comes to Angular projects. ABP project templates even contain plugin recommendations for VS Code users, which VS Code will ask you to install when you open the Angular project folder. Here is a list of recommended extensions: - [Angular Language Service](https://marketplace.visualstudio.com/items?itemName=angular.ng-template) diff --git a/docs/en/framework/ui/mvc-razor-pages/client-side-package-management.md b/docs/en/framework/ui/mvc-razor-pages/client-side-package-management.md index bb984a001f..31e54079ba 100644 --- a/docs/en/framework/ui/mvc-razor-pages/client-side-package-management.md +++ b/docs/en/framework/ui/mvc-razor-pages/client-side-package-management.md @@ -41,7 +41,7 @@ After depending on a NPM package, all you should do is to run the **yarn** comma yarn ``` -Alternatively, you can use `npm install` but [Yarn](https://classic.yarnpkg.com/) is suggested as mentioned before. +Alternatively, you can use `npm install` but [Yarn v1.22+ (not v2)](https://classic.yarnpkg.com/en/docs/install) is suggested as mentioned before. #### Package Contribution diff --git a/docs/en/framework/ui/react-native/index.md b/docs/en/framework/ui/react-native/index.md index 3dd60b6348..4b6a0b5ec7 100644 --- a/docs/en/framework/ui/react-native/index.md +++ b/docs/en/framework/ui/react-native/index.md @@ -17,7 +17,7 @@ ABP platform provide basic [React Native](https://reactnative.dev/) startup temp Please follow the steps below to prepare your development environment for React Native. -1. **Install Node.js:** Please visit [Node.js downloads page](https://nodejs.org/en/download/) and download proper Node.js v16 or v18 installer for your OS. An alternative is to install [NVM](https://github.com/nvm-sh/nvm) and use it to have multiple versions of Node.js in your operating system. +1. **Install Node.js:** Please visit [Node.js downloads page](https://nodejs.org/en/download/) and download proper Node.js v20.11+ installer for your OS. An alternative is to install [NVM](https://github.com/nvm-sh/nvm) and use it to have multiple versions of Node.js in your operating system. 2. **[Optional] Install Yarn:** You may install Yarn v1 (not v2) following the instructions on [the installation page](https://classic.yarnpkg.com/en/docs/install). Yarn v1 delivers an arguably better developer experience compared to npm v6 and below. You may skip this step and work with npm, which is built-in in Node.js, instead. 3. **[Optional] Install VS Code:** [VS Code](https://code.visualstudio.com/) is a free, open-source IDE which works seamlessly with TypeScript. Although you can use any IDE including Visual Studio or Rider, VS Code will most likely deliver the best developer experience when it comes to React Native projects. 4. **Install an Emulator:** React Native applications need an Android emulator or an iOS simulator to run on your OS. See the [Android Studio Emulator](https://docs.expo.io/workflow/android-simulator/) or [iOS Simulator](https://docs.expo.io/workflow/ios-simulator/) on expo.io documentation to learn how to set up an emulator. diff --git a/docs/en/get-started/images/abp-studio-microservice-solution-runner-docker-dependencies.png b/docs/en/get-started/images/abp-studio-microservice-solution-runner-docker-dependencies.png deleted file mode 100644 index 99c09045f8..0000000000 Binary files a/docs/en/get-started/images/abp-studio-microservice-solution-runner-docker-dependencies.png and /dev/null differ diff --git a/docs/en/get-started/images/abp-studio-microservice-solution-runner-enable-watch-1.png b/docs/en/get-started/images/abp-studio-microservice-solution-runner-enable-watch-1.png new file mode 100644 index 0000000000..1d953a9552 Binary files /dev/null and b/docs/en/get-started/images/abp-studio-microservice-solution-runner-enable-watch-1.png differ diff --git a/docs/en/get-started/images/abp-studio-microservice-solution-runner-enable-watch-2.png b/docs/en/get-started/images/abp-studio-microservice-solution-runner-enable-watch-2.png new file mode 100644 index 0000000000..53152f1243 Binary files /dev/null and b/docs/en/get-started/images/abp-studio-microservice-solution-runner-enable-watch-2.png differ diff --git a/docs/en/get-started/images/abp-studio-microservice-solution-runner-enable-watch.png b/docs/en/get-started/images/abp-studio-microservice-solution-runner-enable-watch.png deleted file mode 100644 index 2efe8e5380..0000000000 Binary files a/docs/en/get-started/images/abp-studio-microservice-solution-runner-enable-watch.png and /dev/null differ diff --git a/docs/en/get-started/images/abp-studio-no-layers-new-solution-additional-options-0.9.13.png b/docs/en/get-started/images/abp-studio-no-layers-new-solution-additional-options-0.9.13.png new file mode 100644 index 0000000000..208e047662 Binary files /dev/null and b/docs/en/get-started/images/abp-studio-no-layers-new-solution-additional-options-0.9.13.png differ diff --git a/docs/en/get-started/images/abp-studio-no-layers-new-solution-dialog-0.9.13.png b/docs/en/get-started/images/abp-studio-no-layers-new-solution-dialog-0.9.13.png new file mode 100644 index 0000000000..c0b9f85ea6 Binary files /dev/null and b/docs/en/get-started/images/abp-studio-no-layers-new-solution-dialog-0.9.13.png differ diff --git a/docs/en/get-started/images/abp-studio-no-layers-new-solution-dialog-database-configurations-efcore-0.9.13.png b/docs/en/get-started/images/abp-studio-no-layers-new-solution-dialog-database-configurations-efcore-0.9.13.png new file mode 100644 index 0000000000..bb85423493 Binary files /dev/null and b/docs/en/get-started/images/abp-studio-no-layers-new-solution-dialog-database-configurations-efcore-0.9.13.png differ diff --git a/docs/en/get-started/images/abp-studio-no-layers-new-solution-dialog-database-configurations-mongo-0.9.13.png b/docs/en/get-started/images/abp-studio-no-layers-new-solution-dialog-database-configurations-mongo-0.9.13.png new file mode 100644 index 0000000000..3d4f435955 Binary files /dev/null and b/docs/en/get-started/images/abp-studio-no-layers-new-solution-dialog-database-configurations-mongo-0.9.13.png differ diff --git a/docs/en/get-started/images/abp-studio-no-layers-new-solution-dialog-database-provider-efcore-0.9.13.png b/docs/en/get-started/images/abp-studio-no-layers-new-solution-dialog-database-provider-efcore-0.9.13.png new file mode 100644 index 0000000000..7fc1b37953 Binary files /dev/null and b/docs/en/get-started/images/abp-studio-no-layers-new-solution-dialog-database-provider-efcore-0.9.13.png differ diff --git a/docs/en/get-started/images/abp-studio-no-layers-new-solution-dialog-database-provider-mongo-0.9.13.png b/docs/en/get-started/images/abp-studio-no-layers-new-solution-dialog-database-provider-mongo-0.9.13.png new file mode 100644 index 0000000000..cfe31c98d9 Binary files /dev/null and b/docs/en/get-started/images/abp-studio-no-layers-new-solution-dialog-database-provider-mongo-0.9.13.png differ diff --git a/docs/en/get-started/images/abp-studio-no-layers-new-solution-dialog-solution-properties-0.9.13.png b/docs/en/get-started/images/abp-studio-no-layers-new-solution-dialog-solution-properties-0.9.13.png new file mode 100644 index 0000000000..4a217fd933 Binary files /dev/null and b/docs/en/get-started/images/abp-studio-no-layers-new-solution-dialog-solution-properties-0.9.13.png differ diff --git a/docs/en/get-started/images/abp-studio-no-layers-new-solution-dialog-ui-framework-0.9.13.png b/docs/en/get-started/images/abp-studio-no-layers-new-solution-dialog-ui-framework-0.9.13.png new file mode 100644 index 0000000000..eb6c95e5bb Binary files /dev/null and b/docs/en/get-started/images/abp-studio-no-layers-new-solution-dialog-ui-framework-0.9.13.png differ diff --git a/docs/en/get-started/images/abp-studio-nolayers-new-solution-dialog-ui-theme-0.9.13.png b/docs/en/get-started/images/abp-studio-nolayers-new-solution-dialog-ui-theme-0.9.13.png new file mode 100644 index 0000000000..ba5d165e26 Binary files /dev/null and b/docs/en/get-started/images/abp-studio-nolayers-new-solution-dialog-ui-theme-0.9.13.png differ diff --git a/docs/en/get-started/index.md b/docs/en/get-started/index.md index 6ffbfe548f..59f9812563 100644 --- a/docs/en/get-started/index.md +++ b/docs/en/get-started/index.md @@ -5,7 +5,7 @@ Great that you've decided to create a new application with ABP. ABP provides mul Please select one of the following documents best fits for your application: - **[Single-Layer Solution](single-layer-web-application.md)**: Creates a single-project solution. Recommended for building an application with a **simpler and easy to understand** architecture. -- **[Layered Solution](layered-web-application.md)**: A fully layered (multiple projects) solution based on [Domain Driven Design](../framework/architecture/domain-driven-design) practices. Recommended for long-term projects that need a **maintainable and extensible** codebase. +- **[Application (Layered)](layered-web-application.md)**: A fully layered (multiple projects) solution based on [Domain Driven Design](../framework/architecture/domain-driven-design) practices. Recommended for long-term projects that need a **maintainable and extensible** codebase. - **[Microservice Solution](microservice.md)**: A **distributed solution** to build **microservice systems**. It includes pre-built services, API gateways, web and mobile applications, Kubernetes and Helm configuration, and everything you need to start your large-scale microservice solution. - **Others** - [Empty ASP.NET Core Application](empty-aspnet-core-application.md) diff --git a/docs/en/get-started/layered-web-application.md b/docs/en/get-started/layered-web-application.md index 188e0cfd15..f35b1c39db 100644 --- a/docs/en/get-started/layered-web-application.md +++ b/docs/en/get-started/layered-web-application.md @@ -3,7 +3,7 @@ ````json //[doc-params] { - "UI": ["MVC", "Blazor", "BlazorServer", "NG"], + "UI": ["MVC", "Blazor", "BlazorServer", "BlazorWebApp", "NG"], "DB": ["EF", "Mongo"], "Tiered": ["Yes", "No"] } @@ -19,10 +19,10 @@ First things first! Let's setup your development environment before creating the The following tools should be installed on your development machine: -* [Visual Studio 2022](https://visualstudio.microsoft.com/vs/) (v17.3+) for Windows / [Visual Studio for Mac](https://visualstudio.microsoft.com/vs/mac/). [1](#f-editor) -* [.NET 8.0+](https://dotnet.microsoft.com/en-us/download/dotnet) +* [Visual Studio 2022](https://visualstudio.microsoft.com/) or another IDE that supports [.NET 9.0+](https://dotnet.microsoft.com/download/dotnet) development. [1](#f-editor) +* [.NET 9.0+](https://dotnet.microsoft.com/en-us/download/dotnet) {{ if UI != "Blazor" }} -* [Node v18.19+](https://nodejs.org/) +* [Node v20.11+](https://nodejs.org/) * [Yarn v1.22+ (not v2)](https://classic.yarnpkg.com/en/docs/install) [2](#f-yarn) or npm v10+ (already installed with Node) {{ end }} {{ if Tiered == "Yes" }} @@ -162,7 +162,7 @@ You can start the following application(s): {{ else if UI == "Blazor" }} {{ if Tiered == "No" }}- `Acme.BookStore.HttpApi.Host`{{ end }} - `Acme.BookStore.Blazor` -{{ else if UI == "BlazorServer" }} +{{ else if UI == "BlazorServer" || UI == "BlazorWebApp" }} - `Acme.BookStore.Blazor` {{ else }} - `Acme.BookStore.Web` @@ -174,7 +174,7 @@ You can start the following application(s): > Notice that the services running in docker-compose are exposed to your localhost. If any service in your localhost is already using the same port(s), you will get an error. In that case, stop your local services first. {{ end }} -Once the `Acme.BookStore.{{ if UI == "NG" }}Angular{{ else if UI == "BlazorServer" || UI == "Blazor" }}Blazor{{ else }}Web{{ end }}` application started, you can right-click it and select the *Browse* command: +Once the `Acme.BookStore.{{ if UI == "NG" }}Angular{{ else if UI == "BlazorServer" || UI == "Blazor" || UI == "BlazorWebApp" }}Blazor{{ else }}Web{{ end }}` application started, you can right-click it and select the *Browse* command: ![abp-studio-quick-start-browse-command](images/abp-studio-quick-start-browse-command.png) @@ -206,7 +206,7 @@ Once the solution is opened in Visual Studio, you should see a screen like shown ![visual-studio-bookstore-application](images/visual-studio-bookstore-application.png) -Right-click the `Acme.BookStore.{{ if UI == "NG" || UI == "Blazor" }}HttpApi.Host{{ else if UI == "BlazorServer" }}Blazor{{ else }}Web{{ end }}` project and select the *Set as Startup Project* command. You can then hit *F5* or *Ctrl + F5* to run the web application. It will run and open the application UI in your default browser: +Right-click the `Acme.BookStore.{{ if UI == "NG" || UI == "Blazor" }}HttpApi.Host{{ else if UI == "BlazorServer" || UI == "BlazorWebApp" }}Blazor{{ else }}Web{{ end }}` project and select the *Set as Startup Project* command. You can then hit *F5* or *Ctrl + F5* to run the web application. It will run and open the application UI in your default browser: ![bookstore-browser-users-page](images/bookstore-browser-users-page.png) @@ -242,4 +242,4 @@ Before starting the mobile application, ensure that you configure it for [react- > For example in non-tiered MVC with public website application: -![solution-runner-public-website](images/solution-runner-public-website.png) \ No newline at end of file +![solution-runner-public-website](images/solution-runner-public-website.png) diff --git a/docs/en/get-started/microservice.md b/docs/en/get-started/microservice.md index 5be705e215..24fc745fe0 100644 --- a/docs/en/get-started/microservice.md +++ b/docs/en/get-started/microservice.md @@ -73,11 +73,11 @@ 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. -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: +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) -You can explore the solution, but you need to wait for background tasks to be completed before running any application in the solution (it can take up to a few minutes to set up all). +You can explore the solution, but you need to **wait for background tasks to be completed** before running any application in the solution (it can take up to a few minutes to set up all). > The solution structure can be different in your case based on the options you've selected. @@ -123,9 +123,7 @@ In the *Solution Runner* section (on the left side) you can see all the runnable ![abp-studio-microservice-solution-runner-applications](images/abp-studio-microservice-solution-runner-applications.png) -> All the leaf items in the *Solution Runner* is called as an *Application* as they are executable applications. - -> For a faster start process, first start the *Docker-Dependencies*, then you can start all applications. +> A leaf item in the *Solution Runner* is called as an *Application* as it is an executable application. As shown in the figure above, the executable applications are grouped into folders like `apps`, `gateways`, `infrastructure`, and `services`. You can start/stop them all, a group (folder) of them, or one by one. @@ -135,16 +133,14 @@ Before running the applications, it is good to be sure that all applications are > *Solution Runner* doesn't build an application before running it. That provides a great performance gain because most of the time you will work on one or a few services and you don't need to build all of the other applications in every run. However, if you want to build before running, you can right-click an item in the *Solution Runner* tree and select *Run* -> *Build & Start* command. -It will take some time to build all. Once all is done, you can start the system. - -You can click the *Play* button on the root item in Solution Runner to start all the applications. Or you can start `Docker-Dependencies` first, so the database and other infrastructure services get ready before the other applications: - -![abp-studio-microservice-solution-runner-docker-dependencies](images/abp-studio-microservice-solution-runner-docker-dependencies.png) +It will take some time to build all. Once all is done, you can start the system. You can click the *Play* button on the root item in Solution Runner to start all the applications. +> **About the Docker Containers** +> > Docker will fetch the docker images before starting the containers in your first run (if they were not fetched before) and that process may take a few minutes depending on your internet connection speed. So, please wait for it to completely start. If the process takes more time than you expect, you can right-click on `Docker-Dependencies` and select the *Logs* command to see what's happening. -Once `Docker-Dependencies` is ready, you can click the *Play* button on the root item in Solution Runner to start all the applications. - +> **About Failing Services on Startup** +> > Some applications/services may fail on the first run. That may be because of service and database dependencies were not satisfied and an error occurs on the application startup. ABP Studio automatically restarts failing services until it is successfully started. Being completely ready for such a distributed solution may take a while, but it will be eventually started. Once all the applications are ready, you can right-click the `Web` application and select the *Browse* command: @@ -175,9 +171,11 @@ Once you run the `IdentityService` in Visual Studio, it will be completely integ As an alternative approach, especially if you don't need to debug your service, you can enable the watching feature of ABP Studio to automatically re-build and re-start when there is change in your application/service. -To enable watching, right-click the application/service you want to watch, select the *Run* -> *Enable Watch* command as shown in the following figure: +To enable watching, right-click the application/service you want to watch, select the *Properties* -> *Watch changes while running* option as shown in the following figure: + +![abp-studio-microservice-solution-runner-enable-watch-1](images/abp-studio-microservice-solution-runner-enable-watch-1.png) -![abp-studio-microservice-solution-runner-enable-watch](images/abp-studio-microservice-solution-runner-enable-watch.png) +![abp-studio-microservice-solution-runner-enable-watch-2](images/abp-studio-microservice-solution-runner-enable-watch-2.png) Now, you can make your development on the `IdentityService`. Whenever you save a code file, it is automatically rebuilt and restarted by ABP Studio, so any change will be effective on the running solution in a few seconds. @@ -185,8 +183,6 @@ When you enable watch for an application an *eye* icon is added near to the appl ![abp-studio-microservice-solution-runner-watch-enabled-icon](images/abp-studio-microservice-solution-runner-watch-enabled-icon.png) -You can disable watching by right-clicking an application and selecting *Run* -> *Disable Watch* command. - ## Kubernetes Integration: Working with Helm Charts Solution Runner is a great way to locally run all the applications and services of your solution. However, there are some drawbacks: @@ -222,6 +218,8 @@ Once the solution is ready in Kubernetes, you can open a browser and visit the f ![abp-studio-microservice-web-application-home-page](images/abp-studio-microservice-web-application-home-page.png) +> We could use `cloudcrm-local-web` as the host name since ABP Studio has added an entry to the host file for us. + Click the *Login* link in the application UI, it will redirect you to the *Authentication Server* application, enter `admin` as username and `1q2w3E*` as password to login to the application. > The services run independently from each other and perform some initial data seed logic on their startups. So, they may fail in their first run. In that case, Kubernetes will re-start them. So, it may initially get some time to make the solution fully ready and working. @@ -248,11 +246,11 @@ Clicking the *Connect* button will start a process that establishes the VPN conn ![abp-studio-microservice-kubernetes-services](images/abp-studio-microservice-kubernetes-services.png) -Now, you can access all the services inside the Kubernetes cluster, including the services those are not exposes out of the cluster. You can use the service name as DNS. For example, you can directly visit `http://cloudcrm-local-identity` in your Browser. You can also right-click to a service or application and select the Browse command to open it's UI in the built-in browser of ABP Studio: +Now, you can access all the services inside the Kubernetes cluster, including the services those are not exposed out of the cluster. You can use the service name as DNS. For example, you can directly visit `http://cloudcrm-local-identity` in your Browser. You can also right-click to a service or application and select the Browse command to open it's UI in the built-in browser of ABP Studio: ![abp-studio-microservice-kubernetes-services-browse](images/abp-studio-microservice-kubernetes-services-browse.png) -You can even use the other services (e.g. SQL Server or RabbitMQ) from your local computer (even if they were not exposed out of cluster) with their service names. `sa` password for the SQL server is `myPassw@rd` by default, you can use your SQL Server management studio to connect to it and see the databases: +You can even use the other services (e.g. SQL Server or RabbitMQ) from your local computer (even if they were not exposed out of cluster) with their service names. `sa` password for the SQL server is `myPassw@rd` by default, you can use your SQL Server management studio to connect to it and see the databases (*Server name* is `cloudcrm-local-sqlserver`): ![abp-studio-microservice-sql-server-connection](images/abp-studio-microservice-sql-server-connection.png) @@ -266,6 +264,8 @@ When you connect to Kubernetes, ABP Studio automatically connects to the applica In this way, you can easily track HTTP requests, distributed events, exceptions, logs and other details of your applications. +> If you want to browse a web application in the integrated browser of ABP Studio, right-click to a service in the *Kubernetes* tab of the *Kubernetes* panel and select the *Browse* command. + ## Kubernetes Integration: Intercepting Services The next step is to intercept a service to forward the traffic (coming to that service) to your local computer, so you can run the same service in your local computer to test, debug and develop it. This is the way of connecting two environments (your local machine and the Kubernetes cluster) to develop your services integrated to Kubernetes. @@ -306,3 +306,7 @@ To re-deploy a service to Kubernetes, right-click the service and select *Comman ![abp-studio-microservice-kubernetes-redeploy](images/abp-studio-microservice-kubernetes-redeploy.png) ABP Studio will re-build the Docker image and re-install it using the related Helm chart. + +## See Also + +* [Microservice Development Tutorial](../tutorials/microservice/index.md) diff --git a/docs/en/get-started/single-layer-web-application.md b/docs/en/get-started/single-layer-web-application.md index 319fb19c9a..9bcf2e0e7e 100644 --- a/docs/en/get-started/single-layer-web-application.md +++ b/docs/en/get-started/single-layer-web-application.md @@ -18,10 +18,10 @@ First things first! Let's setup your development environment before creating the The following tools should be installed on your development machine: -* [Visual Studio 2022](https://visualstudio.microsoft.com/vs/) (v17.3+) for Windows / [Visual Studio for Mac](https://visualstudio.microsoft.com/vs/mac/). [1](#f-editor) -* [.NET 8.0+](https://dotnet.microsoft.com/en-us/download/dotnet) +* [Visual Studio 2022](https://visualstudio.microsoft.com/) or another IDE that supports [.NET 9.0+](https://dotnet.microsoft.com/download/dotnet) development. [1](#f-editor) +* [.NET 9.0+](https://dotnet.microsoft.com/en-us/download/dotnet) {{ if UI != "Blazor" }} -* [Node v18.19+](https://nodejs.org/) +* [Node v20.11+](https://nodejs.org/) * [Yarn v1.22+ (not v2)](https://classic.yarnpkg.com/en/docs/install) [2](#f-yarn) or npm v10+ (already installed with Node) {{ end }} {{ if Tiered == "Yes" }} @@ -50,11 +50,11 @@ Assuming that you have [installed and logged in](../studio/installation.md) to t Select the *File* -> *New Solution* in the main menu, or click the *New solution* button on the Welcome screen to open the *Create new solution* wizard: -![abp-studio-new-solution-dialog](images/abp-studio-no-layers-new-solution-dialog.png) +![abp-studio-new-solution-dialog](images/abp-studio-no-layers-new-solution-dialog-0.9.13.png) We will use the *Application (Single Layer)* solution template for this tutorial, so pick it and click the *Next* button: -![abp-studio-new-solution-dialog-solution-properties](images/abp-studio-no-layers-new-solution-dialog-solution-properties.png) +![abp-studio-new-solution-dialog-solution-properties](images/abp-studio-no-layers-new-solution-dialog-solution-properties-0.9.13.png) On that screen, you choose a name for your solution. You can use different levels of namespaces; e.g. `BookStore`, `Acme.BookStore` or `Acme.Retail.BookStore`. @@ -62,31 +62,35 @@ Then select an *output folder* to create your solution. The *Create solution fol Once your configuration is done, click the *Next* button to navigate to the *UI Framework* selection: -![abp-studio-new-solution-dialog-ui-framework](images/abp-studio-no-layers-new-solution-dialog-ui-framework.png) +![abp-studio-new-solution-dialog-ui-framework](images/abp-studio-no-layers-new-solution-dialog-ui-framework-0.9.13.png) Here, you see all the possible UI options supported by that startup solution template. Pick the **{{ UI_Value }}**. Notice that; Once you select a UI type, some additional options will be available under the UI Framework list. You can further configure the options or leave them as default and click the *Next* button for the *UI Theme* selection screen: -![abp-studio-new-solution-dialog-ui-theme](images/abp-studio-nolayers-new-solution-dialog-ui-theme.png) +![abp-studio-new-solution-dialog-ui-theme](images/abp-studio-nolayers-new-solution-dialog-ui-theme-0.9.13.png) LeptonX is the suggested UI theme that is proper for production usage. Select one of the themes, configure the additional options, and click the *Next* button for the *Database Provider* selection: {{ if DB == "EF" }} -![abp-studio-new-solution-dialog-database-provider](images/abp-studio-no-layers-new-solution-dialog-database-provider-efcore.png) +![abp-studio-new-solution-dialog-database-provider](images/abp-studio-no-layers-new-solution-dialog-database-provider-efcore-0.9.13.png) {{ else }} -![abp-studio-new-solution-dialog-database-provider](images/abp-studio-no-layers-new-solution-dialog-database-provider-mongo.png) +![abp-studio-new-solution-dialog-database-provider](images/abp-studio-no-layers-new-solution-dialog-database-provider-mongo-0.9.13.png) {{ end }} On that screen, you can decide on your database provider by selecting one of the provided options. There are some additional options for each database provider. Leave them as default or change them based on your preferences, then click the *Next* button for additional *Database Configurations*: {{ if DB == "EF" }} -![abp-studio-new-solution-dialog-database-configurations](images/abp-studio-no-layers-new-solution-dialog-database-configurations-efcore.png) +![abp-studio-new-solution-dialog-database-configurations](images/abp-studio-no-layers-new-solution-dialog-database-configurations-efcore-0.9.13.png) {{ else }} -![abp-studio-new-solution-dialog-database-configurations](images/abp-studio-no-layers-new-solution-dialog-database-configurations-mongo.png) +![abp-studio-new-solution-dialog-database-configurations](images/abp-studio-no-layers-new-solution-dialog-database-configurations-mongo-0.9.13.png) {{ end }} -Here, you can select the database management systems (DBMS){{ if DB == "EF" }} and the connection string{{ end }}. 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. +Here, you can select the database management systems (DBMS){{ if DB == "EF" }} and the connection string{{ end }}. Then, you can select optional modules and enable additional options according to your preferences. + +![abp-studio-no-layers-new-solution-additional-options](images/abp-studio-no-layers-new-solution-additional-options-0.9.13.png) + +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: diff --git a/docs/en/images/generic-repositories.png b/docs/en/images/generic-repositories.png index 6287afc56c..00f751a7bf 100644 Binary files a/docs/en/images/generic-repositories.png and b/docs/en/images/generic-repositories.png differ diff --git a/docs/en/images/idle-message.png b/docs/en/images/idle-message.png new file mode 100644 index 0000000000..14ea10c9f8 Binary files /dev/null and b/docs/en/images/idle-message.png differ diff --git a/docs/en/images/idle-setting.png b/docs/en/images/idle-setting.png new file mode 100644 index 0000000000..faecb9174c Binary files /dev/null and b/docs/en/images/idle-setting.png differ diff --git a/docs/en/images/pen-test-alert-list-9.0.png b/docs/en/images/pen-test-alert-list-9.0.png new file mode 100644 index 0000000000..ad07a574ca Binary files /dev/null and b/docs/en/images/pen-test-alert-list-9.0.png differ diff --git a/docs/en/modules/account-pro.md b/docs/en/modules/account-pro.md index 327a274f84..0dd960e97e 100644 --- a/docs/en/modules/account-pro.md +++ b/docs/en/modules/account-pro.md @@ -358,3 +358,4 @@ This module doesn't define any additional distributed event. See the [standard d * [Impersonation](./account/impersonation.md) * [Linked Accounts](./account/linkedaccounts.md) * [Session Management](./account/session-management.md) +* [Idle Session Timeout](./account/idle-session-timeout.md)] diff --git a/docs/en/modules/account/idle-session-timeout.md b/docs/en/modules/account/idle-session-timeout.md new file mode 100644 index 0000000000..069e6db665 --- /dev/null +++ b/docs/en/modules/account/idle-session-timeout.md @@ -0,0 +1,19 @@ +# Idle Session Timeout + +The `Idle Session Timeout` feature allows you to automatically log out users after a certain period of inactivity. + +## Configure Idle Session Timeout + +You can enable/disable the `Idle Session Timeout` feature in the `Setting > Account > Idle Session Timeout` page. + +The default idle session timeout is 1 hour. You can change it by selecting a different value from the dropdown list or entering a custom value(in minutes). + +![idle-setting](../../images/idle-setting.png) + +Once the idle session timeout is reached, the user will see a warning modal before being logged out. if user does not respond for 60 seconds, the user will be logged out automatically. + +![idle-setting](../../images/idle-message.png) + +## How it works + +There is JavaScript code running in the background to detect user activity. such as mouse movement, key press, click, etc. If there is no activity detected for setting time, The warning modal will be shown to the user. diff --git a/docs/en/others/penetration-test-report.md b/docs/en/others/penetration-test-report.md index c092a856ea..c9d8280405 100644 --- a/docs/en/others/penetration-test-report.md +++ b/docs/en/others/penetration-test-report.md @@ -1,6 +1,6 @@ # ABP Penetration Test Report -The ABP Commercial MVC `v8.3.0` application template has been tested against security vulnerabilities by the [OWASP ZAP v2.14.0](https://www.zaproxy.org/) tool. The demo web application was started on the `https://localhost:44349` address. The below alerts have been reported by the pentest tool. These alerts are sorted by the risk level as high, medium, and low. The informational alerts are not mentioned in this document. +The ABP Commercial MVC `v9.0.0` application template has been tested against security vulnerabilities by the [OWASP ZAP v2.14.0](https://www.zaproxy.org/) tool. The demo web application was started on the `https://localhost:44349` address. The below alerts have been reported by the pentest tool. These alerts are sorted by the risk level as high, medium, and low. The informational alerts are not mentioned in this document. Many of these alerts are **false-positive**, meaning the vulnerability scanner detected these issues, but they are not exploitable. It's clearly explained for each false-positive alert why this alert is a false-positive. @@ -10,14 +10,14 @@ In the next sections, you will find the affected URLs, attack parameters (reques There are high _(red flag)_, medium _(orange flag)_, low _(yellow flag)_, and informational _(blue flag)_ alerts. -![penetration-test-8.3.0](../images/pen-test-alert-list-8.3.png) +![penetration-test-9.0.0](../images/pen-test-alert-list-9.0.png) > The informational alerts are not mentioned in this document. These alerts are not raising any risks on your application and they are optional. ### Path Traversal [Risk: High] - False Positive -- *[GET] - https://localhost:44349/api/audit-logging/audit-logs?startTime=&endTime=&url=&userName=&applicationName=&clientIpAddress=&correlationId=&httpMethod=audit-logs&httpStatusCode=&maxExecutionDuration=&minExecutionDuration=&hasException=true&sorting=executionTime+desc&skipCount=0&maxResultCount=10* (attack: **httpMethod=audit-logs**) - *[POST] - https://localhost:44349/Account/Login* (attack: **\Login**) +- *[POST] - https://localhost:44349/Account/LinkLogin* (attack: **\LinkLogin**) - *[POST] - https://localhost:44349/Account/Register* (attack: **\Register**) - *[POST] - https://localhost:44349/Account/SecurityLogs* (attack: **\SecurityLogs**) - *[POST] - https://localhost:44349/Identity/SecurityLogs* (attack: **\SecurityLogs**) @@ -28,19 +28,15 @@ The Path Traversal attack technique allows an attacker access to files, director **Solution**: -This is a **false-positive** alert since ABP does all related checks for this kind of attack on the backend side for these endpoints. +This is a **false-positive** alert since ABP does all related checks for this kind of attacks on the backend side for these endpoints. ### SQL Injection [Risk: High] - False Positive * *[POST] — https://localhost:44349/Account/Login* (attack: **1q2w3E* AND 1=1 --**) -* *[POST] — https://localhost:44349/AuditLogs* (attack: **GET' AND '1'='1' --**) -* *[POST] — https://localhost:44349/Identity/SecurityLogs* (attack: **admin' AND '1'='1**) -* *[POST] — https://localhost:44349/api/account/verify-authenticator-code* (attack: **AND '1'='1**) -* *[POST] — https://localhost:44349/Identity/ClaimTypes/CreateModal* (attack: **aaaa AND '1'='1**) +* *[POST] — https://localhost:44349/Account/ImpersonateUser* (attack: **CfDJ8Pyqeg0vtHtJpnK-9eLaft7-JxLJfJ6WHKPOdBZVxz14BDo061qpJ2NLplgAn2Hw16ec0IR38_wWAUkJGxP8hL6PcLfH0bh-ATNTspWyWYTGGbiH-zeKWiS5vWX-br2BA1hE7Dc45eWGUZNcVc_vm2s AND 1=1 --**) +* *[POST] — https://localhost:44349/Abp/MultiTenancy/TenantSwitchModal* (attack: **CfDJ8Pyqeg0vtHtJpnK-9eLaft7-JxLJfJ6WHKPOdBZVxz14BDo061qpJ2NLplgAn2Hw16ec0IR38_wWAUkJGxP8hL6PcLfH0bh-ATNTspWyWYTGGbiH-zeKWiS5vWX-br2BA1hE7Dc45eWGUZNcVc_vm2s AND 1=1 --**) * *[POST] — https://localhost:44349/Identity/OrganizationUnits/\** (attack: **6f4cd0ab-f4eb-7ce0-8b26-3a138af1840d" AND '1'='1**) (also, several other URLs...) -* *[POST] — https://localhost:44349/Identity/ClaimTypes/EditModal* (attack: **aaaa AND '1'='1**) -* *[POST] — https://localhost:44349/LanguageManagement/Texts* (attack: **true" AND "1"="1" --**) -* *[POST] — https://localhost:44349/Account/Manage?CurrentPassword=ZAP%27+AND+%271%27%3D%271%27+--+&NewPassword=ZAP&NewPasswordConfirm=ZAP* +* *[POST] — https://localhost:44349/Identity/ClaimTypes/CreateModal* (attack: **aaaad AND '1'='1**) **Description**: @@ -95,11 +91,17 @@ There are only one URL that is reported as exposing error messages. This is a ** ### Content Security Policy (CSP) Header Not Set [Risk: Medium] — Positive (Fixed) - *[GET] — https://localhost:44349* +- *[GET] — https://localhost:44349/AuditLogs* +- *[GET] — https://localhost:44349/CookiePolicy* +- *[GET] — https://localhost:44349/Gdpr/PersonalData* +- *[GET] — https://localhost:44349/Identity/ClaimTypes/{0}* (create & edit modal URLs - also there are other modal related URLs...) - *[GET] — https://localhost:44349/AbpPermissionManagement/PermissionManagementModal?providerName=R&providerKey=role&providerKeyDisplayName=role* - *[GET] — https://localhost:44349/Abp/MultiTenancy/TenantSwitchModal* - *[GET] — https://localhost:44349/Account/AuthorityDelegation/AuthorityDelegationModal* - *[GET] — https://localhost:44349/Account/AuthorityDelegation/DelegateNewUserModal* - *[GET] — https://localhost:44349/Account/ForgotPassword _(other several account URLS)_* +- *[GET] — https://localhost:44349/Account/ExternalLogins _(other several account URLS)_* +- *[GET] — https://localhost:44349/Account/SecurityLogs _(other several account URLS)_* - *[GET] — https://localhost:44349/Account/Login _(other several account URLS)_* - *[GET] — https://localhost:44349/Account/Register _(other several account URLS)_* - *[GET] — https://localhost:44349/Account/Manage _(other several account URLS)_* @@ -143,12 +145,13 @@ The first affected URL is a **false-positive** alert since it's already fixed an The second URL is also a **false-positive** alert because there is no bad character string in the response. -> **Note**: However, it might be possible if you had any sensitive localization key-value pair in your localization entries, because this endpoint returns all localization values to be able to be used in the application. Therefore, keep that in mind while defining new localization entries. +> **Note**: However, it might be possible if you had any sensitive localization key-value pair in your localization entries, because this endpoint returns all localization values to be able to be used in the application. Therefore, keep that in mind while defining new localization entries. Pass the critical values in your code while using the localization entry as a parameter. ### XSLT Injection [Risk: Medium] - False Positive - *[GET] — https://localhost:44349/Abp/Languages/Switch?culture=%3Cxsl%3Avalue-of+select%3D%22system-property%28%27xsl%3Avendor%27%29%22%2F%3E&returnUrl=%2F&uiCulture=ar* - *[POST] — https://localhost:44349/Account/Login _(same URL with different parameters...)_* +- *[POST] — https://localhost:44349/Account/ImpersonateUser _(same URL with different parameters...)_* - *[POST] — https://localhost:44349/Account/Register _(same URL with different parameters...)_* - *[POST] — https://localhost:44349/Account/Manage _(same URL with different parameters...)_* - *[POST] — https://localhost:44349/Account/ForgotPassword _(same URL with different parameters...)_* @@ -161,13 +164,14 @@ Injection using XSL transformations may be possible and may allow an attacker to **Explanation**: -This is a **false-positive** alert. v8.3.0 uses .NET 8 and the XSLT transformation is not possible on .NET5 or higher. +This is a **false-positive** alert. v9.0 uses .NET 9 and the XSLT transformation is not possible on .NET5 or higher. ### Application Error Disclosure [Risk: Low] — False Positive +- *[GET] — https://localhost:44349/Abp/Languages/Switch* - *[POST] — https://localhost:44349/Account/ImpersonateUser* -- *[POST] — https://localhost:44349/Saas/Host/Editions* -- *[POST] — https://localhost:44349/Saas/Host/Tenants* +- *[GET] — https://localhost:44349/Account/ExternalLogins* +- *[GET] — https://localhost:44349/Account/Logout* **Description:** @@ -304,6 +308,7 @@ This vulnerability was reported as a positive alert because the application ran ### Timestamp Disclosure - Unix [Risk: Low] - False Positive - *[GET] — https://localhost:44349/libs/zxcvbn/zxcvbn.js?=* +- *[GET] — https://localhost:44349/libs/sweetalert2/sweetalert2.all.min.js?=* **Description**: @@ -319,8 +324,9 @@ This vulnerability was reported as a positive alert, because ABP uses the [zxcvb ### X-Content-Type-Options Header Missing [Risk: Low] - Positive (Fixed) -- *[GET] — https://localhost:44349/client-proxies/account-proxy.js?_v=638550091940000000 (and other client-proxies related URLs)* +- *[GET] — https://localhost:44349/client-proxies/account-proxy.js?_v=638550091940000000 (and other client-proxies related URLs...)* - *[GET] — https://localhost:44349/favicon.svg* +- *[GET] — https://localhost:44349/images/getting-started/bg-01.png* (and other image URLs...) - *[GET] — https://localhost:44349/global-styles.css?_v=638556076064360335* - *[GET] — https://localhost:44349/libs/@fortawesome/fontawesome-free/css/all.css?_v=%5CWEB-INF%5Cweb.xml (other several URLs...)* - other URLs... @@ -340,11 +346,3 @@ If possible, ensure that the end user uses a standards-compliant and modern web The `X-Content-Type-Options` header allows you to avoid MIME type sniffing by saying that the MIME types are deliberately configured. This headeer is not strictly required, but it is highly recommended for security reasons. While modern browsers have improved security features, you can still set this header for ensuring the security of web applications. You can add the [ABP's Security Header Middleware](../framework/ui/mvc-razor-pages/security-headers.md#security-headers-middleware) into the request pipeline to set the `X-Content-Type-Options` as *no-sniff*. Also, this middleware adds other pre-defined security headers to your application, including `X-XSS-Protection`, `X-Frame-Options` and `Content-Security-Policy` (if it's enabled). Read [Security Headers](../framework/ui/mvc-razor-pages/security-headers.md) documentation for more info. - -## Other Alerts (Fixed) - -The following alerts were reported by the community or our customers in v8.2 and fixed: - -* https://github.com/abpframework/abp/issues/19576 -* https://github.com/abpframework/abp/issues/19588 -* https://github.com/abpframework/abp/issues/19589 diff --git a/docs/en/release-info/release-notes.md b/docs/en/release-info/release-notes.md index e94086e14f..b86da2c079 100644 --- a/docs/en/release-info/release-notes.md +++ b/docs/en/release-info/release-notes.md @@ -4,11 +4,9 @@ This document contains **brief release notes** for each release. Release notes o > If you want to read the release notes for each ABP Studio release, check it out from [here](../studio/release-notes.md). -## 9.0 (2024-10-22) +## 9.0 (2024-11-19) -> This version is currently in preview. The final release date is planned for November, 2024. - -See the detailed **[blog post / announcement](https://abp.io/blog/announcing-abp-9-0-release-candidate)** for the v9.0 release. +See the detailed **[blog post / announcement](https://abp.io/blog/abp-9-0-stable-release-with-dotnet-9-0)** for the v9.0 release. * Upgraded to .NET 9.0 * Introducing the `Extension Property Policy` diff --git a/docs/en/release-info/upgrading.md b/docs/en/release-info/upgrading.md index 496b3b2961..28404c20b4 100644 --- a/docs/en/release-info/upgrading.md +++ b/docs/en/release-info/upgrading.md @@ -20,7 +20,7 @@ Run this command in the terminal while you are in the root folder of your soluti When you upgrade to a new version, it is good to check if there is a database schema change and upgrade your database schema if your database provider is **Entity Framework Core**; -* Use `Add-Migration "Upgraded_To_Abp_8_2"` or a similar command in the Package Manager Console (PMC) to create a new migration (Set the `EntityFrameworkCore` as the Default project in the PMC and `.DbMigrator` as the Startup Project in the Solution Explorer, in the Visual Studio). +* Use `Add-Migration "Upgraded_To_Abp_8_3"` or a similar command in the Package Manager Console (PMC) to create a new migration (Set the `EntityFrameworkCore` as the Default project in the PMC and `.DbMigrator` as the Startup Project in the Solution Explorer, in the Visual Studio). * Apply the database migrations to your database. If available, you can run the `.DbMigrator` application to upgrade the database and seed the initial data. > If `Add-Migration` generates an empty migration (that means no schema change), you can use `Remove-Migration` to delete it before executing the `.DbMigrator`. @@ -57,4 +57,4 @@ Preview releases and nightly builds can help you to try new features and adapt y ## See Also -* [Migration Guides](migration-guides) \ No newline at end of file +* [Migration Guides](migration-guides) diff --git a/docs/en/samples/easy-crm.md b/docs/en/samples/easy-crm.md index 480aa80316..1a0fff3b3f 100644 --- a/docs/en/samples/easy-crm.md +++ b/docs/en/samples/easy-crm.md @@ -35,7 +35,7 @@ When you download and open the zip file, you will see two folders: * First, follow all the steps above to run the server side and seed the sample data. * Open a command prompt in the angular folder. -* Run the `yarn` command to install NPM packages (requires the [Yarn](https://yarnpkg.com/) package manager). +* Run the `yarn` command to install NPM packages (requires the [Yarn v1.22+ (not v2)](https://classic.yarnpkg.com/en/docs/install) package manager). * Run the `yarn start` command to run the Angular application. It will automatically open the `localhost://4200` in your default browser once the application initialized. ### Blazor UI diff --git a/docs/en/studio/installation.md b/docs/en/studio/installation.md index 4dc158e464..34dde8a5c9 100644 --- a/docs/en/studio/installation.md +++ b/docs/en/studio/installation.md @@ -8,7 +8,7 @@ Before you begin the installation process for ABP Studio, ensure that your system meets the following pre-requirements: ### Node -Make sure [Node.js](https://nodejs.org/en) is installed on your system. If you have not installed Node.js, you can download the `v18.19+` version from the official [Node.js website](https://nodejs.org/en/download/prebuilt-installer). +Make sure [Node.js](https://nodejs.org/en) is installed on your system. If you have not installed Node.js, you can download the `v22+` version from the official [Node.js website](https://nodejs.org/en/download/prebuilt-installer). ### WireGuard (Optional) ABP Studio needs [WireGuard](https://www.wireguard.com/) for Kubernetes operations. You can find the installation instructions for your specific operating system below: @@ -19,7 +19,7 @@ Installation instructions for your Windows operating system are on the official **For macOS:** Installation instructions for your macOS operating system are on the official [WireGuard website](https://www.wireguard.com/install/#macos-homebrew-and-macports-basic-cli-homebrew-userspace-go-homebrew-tools-macports-userspace-go-macports-tools). -### Docker (Optional) +### Docker ABP Studio needs [Docker](https://www.docker.com/) for [Kubernetes](https://kubernetes.io/) operations. Install Docker by following the guidelines on the official [Docker website](https://docs.docker.com/get-docker/). ## Installation diff --git a/docs/en/studio/release-notes.md b/docs/en/studio/release-notes.md index 3d13c3f6a9..6d5016d111 100644 --- a/docs/en/studio/release-notes.md +++ b/docs/en/studio/release-notes.md @@ -2,6 +2,62 @@ 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.14 (2024-12-03) + +* Refactored `dotnet watch` command in solution runner. +* Added multi-tenancy option for open source startup templates. +* Implemented adding angular library when a new microservice is created. +* Adjusted *Optional Modules* section in solution configurations +* Fixed bugs in the nolayers host project. + +## 0.9.13 (2024-11-25) + +* Angular - Theme-based Fixes for the Home Page. + +## 0.9.12 (2024-11-25) + +* Handled the `DynamicPermissionDefinitionsChangedEto` event to automatically add permissions for the admin role. +* Enhanced the Solution Configuration window with a more intuitive design and updated content. +* Improved MAUI application support by displaying all target frameworks in the Solution Runner and automatically setting the appropriate targetFramework based on the operating system. + +## 0.9.11 (2024-11-21) + +* Fixed the extension loading problem occured in v0.9.9 & v0.9.10. + +## 0.9.10 (2024-11-21) + +> Recommended to use v0.9.11+ for .NET 9. + +* Added shortcut for Build & Start operation (CTRL + Click) +* Fixed extension loading loop problem in v0.9.9 +* Fixed MAUI template for android + +## 0.9.9 (2024-11-21) + +> Recommended to use v0.9.11+ for .NET 9. + +* Upgraded templates to .NET 9 +* Fixed blazor wasm bundle problem in microservice template + +## 0.9.8 (2024-11-20) + +* Upgraded templates to version `8.3.4` + +## 0.9.7 (2024-11-19) + +* Added `AppearanceStyles` component to blazor server templates +* Fixed module import window +* Made several enhancements to the existing features + +## 0.9.6 (2024-11-15) + +* Added missing imports to templates +* Fixed bugs during EF Core package installation +* Show errors to the user when adding a database migration +* Changed empty solution description on create new solution wizard +* Fixed problems with templates created with Basic Theme +* Ensure the correct version is used when adding a new module/package to an existing solution + ## 0.9.5 (2024-11-06) * Added dynamic localization option to microservice template diff --git a/docs/en/studio/running-applications.md b/docs/en/studio/running-applications.md index a41f15207d..a4dc4f8388 100644 --- a/docs/en/studio/running-applications.md +++ b/docs/en/studio/running-applications.md @@ -187,6 +187,8 @@ We have several options in C# applications. Those options are `Start`(If the app > When *Watch* is enable you should see an *eye* icon next to the application name. +> Hint: Performing CTRL+Click on the start icon left to a stopped C# application equals to `Build & Start` command. Same applies for folders. + ![csharp-application-context-menu-run-connection](images/solution-runner/csharp-application-context-menu-run-connection.png) ### Build diff --git a/docs/en/studio/version-mapping.md b/docs/en/studio/version-mapping.md index 0741820956..428282ea48 100644 --- a/docs/en/studio/version-mapping.md +++ b/docs/en/studio/version-mapping.md @@ -4,7 +4,9 @@ This document provides a general overview of the relationship between various ve | **ABP Studio Version** | **ABP Version of Startup Template** | |------------------------|---------------------------| -| 0.9.5 | 8.3.3 | +| 0.9.9 to 0.9.14 | 9.0.0 | +| 0.9.8 | 8.3.4 | +| 0.9.5 to 0.9.7 | 8.3.3 | | 0.9.2 to 0.9.4 | 8.3.2 | | 0.8.4 - 0.9.1 | 8.3.1 | | 0.8.1 to 0.8.3 | 8.3.0 | @@ -19,4 +21,4 @@ This document provides a general overview of the relationship between various ve By default, ABP Studio uses stable versions to create solutions. Therefore, if you want to create a solution with a preview version, first you need to create a solution and then switch your solution to the preview version from the ABP Studio UI: -![](images/abp-studio-switch-to-preview.png) \ No newline at end of file +![](images/abp-studio-switch-to-preview.png) diff --git a/docs/en/tutorials/book-store-with-abp-suite/images/abp-suite-generated-tests.png b/docs/en/tutorials/book-store-with-abp-suite/images/abp-suite-generated-tests.png new file mode 100644 index 0000000000..f678598b4d Binary files /dev/null and b/docs/en/tutorials/book-store-with-abp-suite/images/abp-suite-generated-tests.png differ diff --git a/docs/en/tutorials/book-store-with-abp-suite/images/abp-suite-navigation-property.png b/docs/en/tutorials/book-store-with-abp-suite/images/abp-suite-navigation-property.png new file mode 100644 index 0000000000..03808be6ba Binary files /dev/null and b/docs/en/tutorials/book-store-with-abp-suite/images/abp-suite-navigation-property.png differ diff --git a/docs/en/tutorials/book-store-with-abp-suite/images/abp-suite-opening.png b/docs/en/tutorials/book-store-with-abp-suite/images/abp-suite-opening.png new file mode 100644 index 0000000000..adebe653b5 Binary files /dev/null and b/docs/en/tutorials/book-store-with-abp-suite/images/abp-suite-opening.png differ diff --git a/docs/en/tutorials/book-store-with-abp-suite/images/abp-suite-solution-test-projects.png b/docs/en/tutorials/book-store-with-abp-suite/images/abp-suite-solution-test-projects.png new file mode 100644 index 0000000000..8a5689290d Binary files /dev/null and b/docs/en/tutorials/book-store-with-abp-suite/images/abp-suite-solution-test-projects.png differ diff --git a/docs/en/tutorials/book-store-with-abp-suite/images/book-store-suite-solution-explorer.png b/docs/en/tutorials/book-store-with-abp-suite/images/book-store-suite-solution-explorer.png new file mode 100644 index 0000000000..7b53aca64d Binary files /dev/null and b/docs/en/tutorials/book-store-with-abp-suite/images/book-store-suite-solution-explorer.png differ diff --git a/docs/en/tutorials/book-store-with-abp-suite/images/bookstore-test-succeed.png b/docs/en/tutorials/book-store-with-abp-suite/images/bookstore-test-succeed.png new file mode 100644 index 0000000000..8211638242 Binary files /dev/null and b/docs/en/tutorials/book-store-with-abp-suite/images/bookstore-test-succeed.png differ diff --git a/docs/en/tutorials/book-store-with-abp-suite/images/studio-browser-suite.png b/docs/en/tutorials/book-store-with-abp-suite/images/studio-browser-suite.png new file mode 100644 index 0000000000..80a53dcae2 Binary files /dev/null and b/docs/en/tutorials/book-store-with-abp-suite/images/studio-browser-suite.png differ diff --git a/docs/en/tutorials/book-store-with-abp-suite/images/suite-author-entity-1.png b/docs/en/tutorials/book-store-with-abp-suite/images/suite-author-entity-1.png new file mode 100644 index 0000000000..1e9e9bf3c6 Binary files /dev/null and b/docs/en/tutorials/book-store-with-abp-suite/images/suite-author-entity-1.png differ diff --git a/docs/en/tutorials/book-store-with-abp-suite/images/suite-author-entity-2.png b/docs/en/tutorials/book-store-with-abp-suite/images/suite-author-entity-2.png new file mode 100644 index 0000000000..bf47159ec6 Binary files /dev/null and b/docs/en/tutorials/book-store-with-abp-suite/images/suite-author-entity-2.png differ diff --git a/docs/en/tutorials/book-store-with-abp-suite/images/suite-author-new-entity.png b/docs/en/tutorials/book-store-with-abp-suite/images/suite-author-new-entity.png new file mode 100644 index 0000000000..a680fc0bc3 Binary files /dev/null and b/docs/en/tutorials/book-store-with-abp-suite/images/suite-author-new-entity.png differ diff --git a/docs/en/tutorials/book-store-with-abp-suite/images/suite-author-pages-1.png b/docs/en/tutorials/book-store-with-abp-suite/images/suite-author-pages-1.png new file mode 100644 index 0000000000..1a50cb0cd8 Binary files /dev/null and b/docs/en/tutorials/book-store-with-abp-suite/images/suite-author-pages-1.png differ diff --git a/docs/en/tutorials/book-store-with-abp-suite/images/suite-book-entity-1.png b/docs/en/tutorials/book-store-with-abp-suite/images/suite-book-entity-1.png new file mode 100644 index 0000000000..dbb1890c14 Binary files /dev/null and b/docs/en/tutorials/book-store-with-abp-suite/images/suite-book-entity-1.png differ diff --git a/docs/en/tutorials/book-store-with-abp-suite/images/suite-book-entity-2.png b/docs/en/tutorials/book-store-with-abp-suite/images/suite-book-entity-2.png new file mode 100644 index 0000000000..a77794ba1b Binary files /dev/null and b/docs/en/tutorials/book-store-with-abp-suite/images/suite-book-entity-2.png differ diff --git a/docs/en/tutorials/book-store-with-abp-suite/images/suite-book-entity-3.png b/docs/en/tutorials/book-store-with-abp-suite/images/suite-book-entity-3.png new file mode 100644 index 0000000000..e4bd459172 Binary files /dev/null and b/docs/en/tutorials/book-store-with-abp-suite/images/suite-book-entity-3.png differ diff --git a/docs/en/tutorials/book-store-with-abp-suite/images/suite-book-entity-4.png b/docs/en/tutorials/book-store-with-abp-suite/images/suite-book-entity-4.png new file mode 100644 index 0000000000..df96e6a4dd Binary files /dev/null and b/docs/en/tutorials/book-store-with-abp-suite/images/suite-book-entity-4.png differ diff --git a/docs/en/tutorials/book-store-with-abp-suite/images/suite-book-entity-5.png b/docs/en/tutorials/book-store-with-abp-suite/images/suite-book-entity-5.png new file mode 100644 index 0000000000..68b31641dd Binary files /dev/null and b/docs/en/tutorials/book-store-with-abp-suite/images/suite-book-entity-5.png differ diff --git a/docs/en/tutorials/book-store-with-abp-suite/images/suite-book-entity-6.png b/docs/en/tutorials/book-store-with-abp-suite/images/suite-book-entity-6.png new file mode 100644 index 0000000000..b7814a7d7c Binary files /dev/null and b/docs/en/tutorials/book-store-with-abp-suite/images/suite-book-entity-6.png differ diff --git a/docs/en/tutorials/book-store-with-abp-suite/images/suite-book-entity-selection.png b/docs/en/tutorials/book-store-with-abp-suite/images/suite-book-entity-selection.png new file mode 100644 index 0000000000..9da2a63705 Binary files /dev/null and b/docs/en/tutorials/book-store-with-abp-suite/images/suite-book-entity-selection.png differ diff --git a/docs/en/tutorials/book-store-with-abp-suite/images/suite-book-pages-1.png b/docs/en/tutorials/book-store-with-abp-suite/images/suite-book-pages-1.png new file mode 100644 index 0000000000..a42a39b648 Binary files /dev/null and b/docs/en/tutorials/book-store-with-abp-suite/images/suite-book-pages-1.png differ diff --git a/docs/en/tutorials/book-store-with-abp-suite/images/suite-book-with-author-create-modal.png b/docs/en/tutorials/book-store-with-abp-suite/images/suite-book-with-author-create-modal.png new file mode 100644 index 0000000000..7fa41795e1 Binary files /dev/null and b/docs/en/tutorials/book-store-with-abp-suite/images/suite-book-with-author-create-modal.png differ diff --git a/docs/en/tutorials/book-store-with-abp-suite/images/suite-bookstore-advanced-filter-section.png b/docs/en/tutorials/book-store-with-abp-suite/images/suite-bookstore-advanced-filter-section.png new file mode 100644 index 0000000000..af9501d9eb Binary files /dev/null and b/docs/en/tutorials/book-store-with-abp-suite/images/suite-bookstore-advanced-filter-section.png differ diff --git a/docs/en/tutorials/book-store-with-abp-suite/images/suite-custom-code-result.png b/docs/en/tutorials/book-store-with-abp-suite/images/suite-custom-code-result.png new file mode 100644 index 0000000000..30997d4c5b Binary files /dev/null and b/docs/en/tutorials/book-store-with-abp-suite/images/suite-custom-code-result.png differ diff --git a/docs/en/tutorials/book-store-with-abp-suite/images/suite-enabling-custom-code.png b/docs/en/tutorials/book-store-with-abp-suite/images/suite-enabling-custom-code.png new file mode 100644 index 0000000000..c597bbcc41 Binary files /dev/null and b/docs/en/tutorials/book-store-with-abp-suite/images/suite-enabling-custom-code.png differ diff --git a/docs/en/tutorials/book-store-with-abp-suite/images/suite-end-of-generation-modal.png b/docs/en/tutorials/book-store-with-abp-suite/images/suite-end-of-generation-modal.png new file mode 100644 index 0000000000..6940a9b7a6 Binary files /dev/null and b/docs/en/tutorials/book-store-with-abp-suite/images/suite-end-of-generation-modal.png differ diff --git a/docs/en/tutorials/book-store-with-abp-suite/images/suite-repository-custom-code.png b/docs/en/tutorials/book-store-with-abp-suite/images/suite-repository-custom-code.png new file mode 100644 index 0000000000..8c8f696a11 Binary files /dev/null and b/docs/en/tutorials/book-store-with-abp-suite/images/suite-repository-custom-code.png differ diff --git a/docs/en/tutorials/book-store-with-abp-suite/images/test-data-seed-contributors.png b/docs/en/tutorials/book-store-with-abp-suite/images/test-data-seed-contributors.png new file mode 100644 index 0000000000..0c2ca8db13 Binary files /dev/null and b/docs/en/tutorials/book-store-with-abp-suite/images/test-data-seed-contributors.png differ diff --git a/docs/en/tutorials/book-store-with-abp-suite/index.md b/docs/en/tutorials/book-store-with-abp-suite/index.md new file mode 100644 index 0000000000..b0f24ef6d3 --- /dev/null +++ b/docs/en/tutorials/book-store-with-abp-suite/index.md @@ -0,0 +1,40 @@ +# Web Application Development (with ABP Suite) Tutorial +````json +//[doc-params] +{ + "UI": ["MVC"], + "DB": ["EF"] +} +```` +````json +//[doc-nav] +{ + "Next": { + "Name": "Creating the Solution", + "Path": "tutorials/book-store-with-abp-suite/part-01" + } +} +```` + +> This tutorial is suitable for those who have an ABP Team or a higher [license](https://abp.io/pricing). + +## About This Tutorial + +> In this tutorial, you will use the [ABP Suite](../../suite/index.md) to generate everything you need to build the **BookStore** application, such as [*Entities*](../../framework/architecture/domain-driven-design/entities.md), [*Domain Services*](../../framework/architecture/domain-driven-design/domain-services.md), [*Application Services*](../../framework/architecture/domain-driven-design/application-services.md), *CRUD pages* and more... + +In this tutorial series, you will build an ABP based web application named `Acme.BookStore`. This application is used to manage a list of books and their authors. It is developed using the following technologies: + +* **{{DB_Value}}** as the database provider. +* **{{UI_Value}}** as the UI Framework. + +This tutorial is organized as the following parts: + +- [Part 1: Creating the Solution](part-01.md) +- [Part 2: Creating the Books](part-02.md) +- [Part 3: Creating the Authors](part-03.md) +- [Part 4: Book to Author Relation](part-04.md) +- [Part 5: Customizing the Generated Code](part-05.md) + +### Download the Source Code + +After logging in to the ABP website, you can download the source code from [here](https://abp.io/api/download/samples/suite-bookstore-mvc-ef). \ No newline at end of file diff --git a/docs/en/tutorials/book-store-with-abp-suite/part-01.md b/docs/en/tutorials/book-store-with-abp-suite/part-01.md new file mode 100644 index 0000000000..d3a258448a --- /dev/null +++ b/docs/en/tutorials/book-store-with-abp-suite/part-01.md @@ -0,0 +1,40 @@ +# Web Application Development (with ABP Suite) Tutorial - Part 1: Creating the Solution + +````json +//[doc-params] +{ + "UI": ["MVC"], + "DB": ["EF"] +} +```` +````json +//[doc-nav] +{ + "Next": { + "Name": "Creating the Books", + "Path": "tutorials/book-store-with-abp-suite/part-02" + } +} +```` + +Before starting the development, create a new solution named `Acme.BookStore` and run it by following the [getting started tutorial](../../get-started/layered-web-application.md). + +You can use the following configurations: + +* **Solution Name:** `Acme.BookStore` +* **UI Framework:** {{if UI=="MVC"}} ASP.NET Core MVC / Razor Pages {{end}} +* **UI Theme:** LeptonX +* **Mobile Framework:** None +* **Database Provider:** {{if DB=="EF"}} Entity Framework Core {{end}} + +You can select the other options based on your preference. + +> **Please complete the [Get Started](../../get-started/layered-web-application.md) guide and run the web application before going further.** + +The initial solution structure should be like the following in the ABP Studio's [Solution Explorer](../../studio/solution-explorer.md): + +![](./images/book-store-suite-solution-explorer.png) + +## Summary + +We've created the initial layered monolith solution. In the next part, we will learn how to create entities, and generate CRUD pages based on the specified options (including tests, UI, customizable code support etc.) with [ABP Suite](../../suite/index.md). diff --git a/docs/en/tutorials/book-store-with-abp-suite/part-02.md b/docs/en/tutorials/book-store-with-abp-suite/part-02.md new file mode 100644 index 0000000000..b9eca0166c --- /dev/null +++ b/docs/en/tutorials/book-store-with-abp-suite/part-02.md @@ -0,0 +1,123 @@ +# Web Application Development (with ABP Suite) Tutorial - Part 2: Creating the Books +````json +//[doc-params] +{ + "UI": ["MVC"], + "DB": ["EF"] +} +```` +````json +//[doc-nav] +{ + "Previous": { + "Name": "Creating the Solution", + "Path": "tutorials/book-store-with-abp-suite/part-01" + }, + "Next": { + "Name": "Creating the Authors", + "Path": "tutorials/book-store-with-abp-suite/part-03" + } +} +```` + +In this part, you will create a new entity named `Book` and generate CRUD pages for the related entities with everything that you would normally implement manually (including application services, tests, CRUD pages, database relations and more...) via [ABP Suite](../../suite/index.md) with few clicks. + +## Opening the ABP Suite + +> Please **stop the application** in ABP Studio's *Solution Runner* panel, if it's currently running, because ABP Suite will make changes in the solution and it might need to build the solution in some steps and running the solution prevents to build it. + +After creating the solution in the previous part, now you can open the ABP Suite and start generating CRUD pages. You can select the *ABP Suite -> Open* command on the main menu to open ABP Suite: + +![opening the ABP Suite](./images/abp-suite-opening.png) + +After clicking the related command, pre-integrated browser of ABP Studio should open, then you can start generating entities and all related codes with a few configurations: + +![](./images/studio-browser-suite.png) + +## Creating the Book Entity + +Let's create a `Book` entity with some properties. First, type `Book` for the *Name* field and leave the other options as is. ABP Suite automatically calculates proper values for the rest of the inputs for you: + +![](./images/suite-book-entity-1.png) + +ABP Suite sets: + +* Entity type as **master** (ABP Suite allows you to establish [master-child relationship](../../suite/creating-master-detail-relationship.md)), +* Base class as **FullAuditedAggregateRoot** ([see other possible values](../../framework/architecture/domain-driven-design/entities.md)), +* Primary key type as **Guid**, +* Plural name, database name, namespace, page title, menu item and more... + +You can change the menu-item value as **book** to show a proper icon in the generated UI, and also enable **code customization**, **creating unit & integration tests**, and other options as you wish: + +![](./images/suite-book-entity-2.png) + +After, specifying the entity metadata, open the *Properties* tab and create the properties shown in the following figure: + +![](./images/suite-book-entity-3.png) + +Here the details: + +* `Name` is **required**, it's a **string** property and maximum length is **128**. +* `Type` is an **enum** and the enum file path is *\Acme.BookStore.Domain.Shared\Books\BookType.cs* (we will create the file, in the next section). +* `PublishDate` is a **DateTime** property and **not nullable**. +* `Price` is a **float** property and **required**. + +You can leave the other configurations as default. + +> ABP Suite allows you to define properties with a great range of options, for example, you can specify the property type as *string*, *int*, *float*, *Guid*, *DateTime*, and even *File* (for file upload) and also you can set any options while defining your properties, such as specifying it as *required*, or *nullable*, setting *max-min length*, *default value* and more... + +While defining the properties, you defined a *Type* property with the type of *enum*. ABP Suite asks for an enum path to read the enum file, and set the namespace, and enum name in the generated code. + +For that purpose, you should create a `BookType` enum in the `Acme.BookStore.Domain.Shared` project under the **Books** folder as follows: + +```csharp +namespace Acme.BookStore.Books; + +public enum BookType +{ + Undefined, + Adventure, + Biography, + Dystopia, + Fantastic, + Horror, + Science, + ScienceFiction, + Poetry +} +``` + +Then, you can specify the enum path for the `Type` property in ABP Suite like in the following figure: + +![](./images/suite-book-entity-4.png) + +> After you select the enum file, ABP Suite automatically sets the namespace and enum name, and lists your enum values in the next section. You can change these values, but for now, you can leave as is. + +After that, you can click the **Save and Generate** button to start the code generation process: + +![](./images/suite-book-entity-5.png) + +ABP Suite will generate the necessary code for you. It generates: + +* `Book` entity (also `BookBase` class, which is allow you customizing the generated entity), +* Repository implementation (`EfCoreBookRepository` class), +* `BookManager` domain service, +* Input & Output **DTOs** and **application service** implementations (`IBookAppService` & `BookAppService`), +* **Unit & integration tests**, +* A new **migration** (and also applies to the database), +* All related **permission**, **object mapping** and **navigation menu item** configurations, +* and all required **UI components and pages**. + +It will take some time to complete the process. After the process is completed, you will see a success message, you can click the *Ok* button, and build & start the application by clicking the *Run -> Build & Start* button in the *Solution Runner* panel: + +![](./images/suite-book-entity-6.png) + +After the application is started, you can right-click and *Browse* on the application to open it in the ABP Studio's pre-integrated browser. You can see the Books page in the following figure with a single record: + +![](./images/suite-book-pages-1.png) + +On this page, you can create a new book, update an existing book, delete a book, export all records (or the filtered records) to excel, filter the records by using the advanced filter section, bulk delete multiple records and so on. + +## Summary + +In this part, you've created a new entity named `Book` and generated the necessary code for it with [ABP Suite](../../suite/index.md) with a few clicks. ABP Suite generated the all code for you, including the **entity**, **application service**, **database relations**, **unit & integration tests**, **UI** and **defined the custom hooks for code customization**. \ No newline at end of file diff --git a/docs/en/tutorials/book-store-with-abp-suite/part-03.md b/docs/en/tutorials/book-store-with-abp-suite/part-03.md new file mode 100644 index 0000000000..9f5e1acf6d --- /dev/null +++ b/docs/en/tutorials/book-store-with-abp-suite/part-03.md @@ -0,0 +1,79 @@ +# Web Application Development (with ABP Suite) Tutorial - Part 3: Creating the Authors +````json +//[doc-params] +{ + "UI": ["MVC"], + "DB": ["EF"] +} +```` +````json +//[doc-nav] +{ + "Previous": { + "Name": "Creating the Books", + "Path": "tutorials/book-store-with-abp-suite/part-02" + }, + "Next": { + "Name": "Book to Author Relation", + "Path": "tutorials/book-store-with-abp-suite/part-04" + } +} +```` + +In the previous part, you have created the `Book` entity and in this part, you will create a new entity named `Author` and generate all necesssary code via [ABP Suite](../../suite/index.md) with few clicks. After creating the `Author` entity, you will be establishing [one-to-many relationship](../../suite/generating-crud-page.md#step-by-step-creating-a-navigation-property-with-1-to-many-relationship) with *Book* and *Author* entities, in the next part. + +## Creating the Author Entity + +After generating the all necessary code for the `Book` entity, and testing the *Books* page, by building & starting the application, now you can continue with creating the `Author` entity. + +> Before, creating the `Author` entity, please **stop the application** in ABP Studio's *Solution Runner* panel, because ABP Suite will make changes in the solution and it might need to build the solution in some steps and running the solution prevents to build it. + +Click the entity selection box in the top right of the *CRUD page generation* page, and select the *-New entity-*: + +![](/images/suite-author-new-entity.png) + +Then, you can type `Author` for the *Name* field and leave the other options as is (you can change the menu icon as **pen** for a proper menu icon, and/or other options, if you wish). ABP Suite automatically calculates proper values for the rest of the inputs for you: + +![](/images/suite-author-entity-1.png) + +ABP Suite sets: + +* Entity type as **master** (ABP Suite allows you to establish [master-child relationship](../../suite/creating-master-detail-relationship.md)), +* Base class as **FullAuditedAggregateRoot** ([see other possible values](../../framework/architecture/domain-driven-design/entities.md)), +* Primary key type as **Guid**, +* Plural name, database name, namespace, page title, menu item and more... +* Also, it enables **code customization**, **UI code generation**, **unit & integration test generation** and **bulk delete** by default. + +After, specifying the entity metadata, open the *Properties* tab and create the properties shown in the following figure: + +![](./images/suite-author-entity-2.png) + +Here the details: + +* `Name` is **required**, it's a **string** property, and it's a **textarea**. Minimum length is **2** and maximum length is **128**. +* `BirthDate` is a **DateTime** property and **not nullable**. +* `ShortBio` is a **string** property, it's **required**, maximum length is **256**. + +You can leave the other configurations as default. + +> **Note:** All properties are marked as **filterable** by default, and they appear in the advanced filter section because of that. You can set any properties you want as **not filterable** and then the related property will be removed from the advanced filter section and code will be generated accordingly. + +You can click the **Save and Generate** button to start the code generation process: + +![](./images/suite-book-entity-5.png) + +ABP Suite will generate the necessary code for you. It will take some time to complete the process. After the process is completed, you will see a success message, you can click the *Ok* button, and build & start the application by clicking the *Run -> Build & Start* button in the *Solution Runner* panel: + +![](./images/suite-book-entity-6.png) + +After the application is started, you can right-click and *Browse* on the application to open it in the ABP Studio's pre-integrated browser and try to add a new author: + +![](./images/suite-author-pages-1.png) + +As you can see, the *Name* field is **required**, the *Birth Date* field shows a datepicker, and the *Short Bio* field is also **required** and it's a **textarea**. You just configured how you want your properties with some options (for example, setting the short bio as **textarea** and **required**), and ABP Suite generated code according that. + +## Summary + +In this part, you've created a new entity named `Author` and generated the necessary code for it with [ABP Suite](../../suite/index.md) with a few clicks. ABP Suite generated the all code for you, including the **entity**, **application service**, **database relations**, **unit & integration tests**, **UI** and **defined the custom hooks for code customization**. + +In the next part, you will establish [one-to-many relation](../../suite/generating-crud-page.md) between the `Book` and `Author` entities. \ No newline at end of file diff --git a/docs/en/tutorials/book-store-with-abp-suite/part-04.md b/docs/en/tutorials/book-store-with-abp-suite/part-04.md new file mode 100644 index 0000000000..ee4497bbfd --- /dev/null +++ b/docs/en/tutorials/book-store-with-abp-suite/part-04.md @@ -0,0 +1,168 @@ +# Web Application Development (with ABP Suite) Tutorial - Part 4: Book to Author Relation +````json +//[doc-params] +{ + "UI": ["MVC"], + "DB": ["EF"] +} +```` +````json +//[doc-nav] +{ + "Previous": { + "Name": "Creating the Author", + "Path": "tutorials/book-store-with-abp-suite/part-03" + }, + "Next": { + "Name": "Customizing the Generated Code", + "Path": "tutorials/book-store-with-abp-suite/part-05" + } +} +```` + +In the previous parts, you have created the `Book` and `Author` entities (& generated code for all functionalities) for the book store application. However, currently there is no relation between these entities. + +In this part, you will establish to **one-to-many relation** between the `Book` and `Author` entities. + +## Establishing Relations with ABP Suite + +ABP Suite allows establishing both **one-to-many** and [many-to-many](../../suite/creating-many-to-many-relationship.md) relationships. + +In this tutorial, you will only establish **one-to-many relation** between `Book` and `Author` entities. It's pretty straightforward to establish a relationship with ABP Suite. You should just need to navigate to the *Navigations* tab, and provide the metadata for navigation property (1-n) or navigation collection (n-n) relations. + +## Creating Book to Author Relationship + +> Please **stop the application** in ABP Studio's *Solution Runner* panel, because ABP Suite will make changes in the solution and it might need to build the solution in some steps and running the solution prevents to build it. + +To establish **one-to-many relations** between *Book* and *Author* entities, select the `Book` entity from the entity selection box on the top-right of the *CRUD page generation* page: + +![](./images/suite-book-entity-selection.png) + +Then, you can open the *Navigations* tab, and click the **Add navigation property (1-n)** button. After that, a navigation property model will open, and you can fill the fields like in the following figure: + +![](./images/abp-suite-navigation-property.png) + +Here is the details: + +* Selected the entity as `Author`. (ABP Suite will establish one-to-many relation between *Book* and *Author* entities with this configuration) +* Set the property name as *AuthorId*, it will be set as foreign-key restriction in the database and all related database configurations will be made by ABP Suite. +* Selected the display property as *Name*, this will be used in the dropdown component to set an author with a book & also it will be shown in the datatable of the *Books* page. +* Also, made the relation **required** and set it **filterable** so books can be filterable by authors. + +After, specifying the metadata, you can click the *Ok* button to close the modal. Then, click the **Save and generate** button to start code generation process. ABP Suite will establish one-to-many relationship between the entities, and will generate all necessary code automatically: + +![](./images/suite-end-of-generation-modal.png) + +It will take some time to complete the process. After the process is completed, you will see a success message, you can click the *Ok* button, and build & start the application by clicking the *Run -> Build & Start* button in the *Solution Runner* panel: + +![](./images/suite-book-entity-6.png) + +After the application is started, you can right-click and *Browse* on the application to open it in the ABP Studio's pre-integrated browser. You can first create an author and then create a book with the author for testing: + +![](./images/suite-book-with-author-create-modal.png) + +Also, notice that, in the advanced filter section, there is an **Author** dropdown, which you can use to filter books by authors (remember you set **filterable** while defining navigation property and thanks to that, ABP Suite generated the code accordingly): + +![](./images/suite-bookstore-advanced-filter-section.png) + +## Unit & Integration Tests + +Since you completed the bookstore application, now we can check the generated tests, and run them to see if all of them pass or not. + +There are several test projects in the solution: + +![](./images/abp-suite-solution-test-projects.png) + +> Test projects slightly differs based on your UI and Database selection. For example, if you select MongoDB, then the `Acme.BookStore.EntityFrameworkCore.Tests` will be `Acme.BookStore.MongoDB.Tests`. + +ABP Suite generated unit & integration tests, for the `Book` & `Author` entities. If you open the **Test explorer** in your IDE, you will see the following tests are generated: + +![](./images/abp-suite-generated-tests.png) + +ABP Suite generated tests for repository implementations & application service implementations for the generated code, if you enable *Create unit & integration tests* option, while creating the entity. Since, you already did that in the previous parts, it generated the all required tests for the entities. + +Let's examine one of the generated test classes. Open the *BooksAppServiceTests* (under the *test/Acme.BookStore.Application.Tests/Books/BookApplicationTests.cs*) and check the `CreateAsync` method: + +```csharp + [Fact] + public async Task CreateAsync() + { + // Arrange + var input = new BookCreateDto + { + Name = "6c3d1eda8bf04852b7bd5dfdbbd93224b252478c2e474d4c8faf24fa6b182168ca830d4f80e64e4a8e363f33e151d1d34a04be4709274c7fbf2214f9bb3a16c3", + Type = default, + PublishDate = new DateTime(2006, 8, 21), + Price = 754882891, + AuthorId = Guid.Parse("602460f6-df6e-456a-89d9-8c5870dfc583") + }; + + // Act + var serviceResult = await _booksAppService.CreateAsync(input); + + // Assert + var result = await _bookRepository.FindAsync(c => c.Id == serviceResult.Id); + + result.ShouldNotBe(null); + result.Name.ShouldBe("6c3d1eda8bf04852b7bd5dfdbbd93224b252478c2e474d4c8faf24fa6b182168ca830d4f80e64e4a8e363f33e151d1d34a04be4709274c7fbf2214f9bb3a16c3"); + result.Type.ShouldBe(default); + result.PublishDate.ShouldBe(new DateTime(2006, 8, 21)); + result.Price.ShouldBe(754882891); + } +``` + +ABP Suite; + +* Create the `BookCreateDto` input DTO object, and fill its values with dummy data to simulate creating a book, +* Then, it calls the `IBooksAppService.CreateAsync` method to create a book, +* And finally, asserts the returned result to see if it's as expected or not. + +Notice, also the *AuthorId* is set in the `BookCreateDto` object. At that point, you might ask yourself that I haven't created the author with that ID before, should not it throw exception? + +No, it will not throw an exception, because ABP Suite also generates simple dummy data for the entities just for the tests! You can see the test data seed contributors under the *Acme.BookStore.Domain.Tests* project: + +![](./images/test-data-seed-contributors.png) + +Here is the content of the `AuthorsDataSeedContributor.SeedAsync` method: + +```csharp + public async Task SeedAsync(DataSeedContext context) + { + if (IsSeeded) + { + return; + } + + await _authorRepository.InsertAsync(new Author + ( + id: Guid.Parse("602460f6-df6e-456a-89d9-8c5870dfc583"), + name: "d7bbb3bff0d54ad799477298c4572e9c05fd1175ab21416da17d0001e2b697cd7fef99fdb4414f26a05789667a97442bd65865510ba34c3599e874ccf08b45e4", + birthDate: new DateTime(2010, 2, 11), + shortBio: "3c2ff43c18e34d7b9ad3f1b9c444cbb000f90808d3774cb6b7702b957f472d74048597f93df744f6a6fdf507be428e016edec982f1174e09b124982cbc40156290ce6bc9fd7b49b4972741956cc847891cb55ad0942f4534b90aa0561d3e0c200340b613c7ad40c38b4b2f2c39298169a853473faed34341a130b31e1eb57e92" + )); + + await _authorRepository.InsertAsync(new Author + ( + id: Guid.Parse("6ea5a6b2-919e-4334-9728-13f4872e5e0e"), + name: "fd332fb58f184716962b08fbaa92f1c3e0963d843ba34c82bb5409517f60da3727c43b05e8d4490f996c5d19265962e53a69ed5e3e144509aad1441e37ce5081", + birthDate: new DateTime(2010, 6, 10), + shortBio: "b7808946c46c42e3935c4d8203d82973cfb98c5d81644f1da4ce1e643767849e23e0eb12a92f48be8f7eec0c07aefa043721fdd3fea542cfa644d2b7d428dc8842647180ef8a47139e097f6674c4f0d86c46765c406042a2a858865cb112ecd78d9ef6f5843e444994641f924a38a2d24ee4e212d41444888d3c0861af0cf9dd" + )); + + await _unitOfWorkManager!.Current!.SaveChangesAsync(); + + IsSeeded = true; + } +``` + +Since ABP Suite generated the test data seed contributors for each entity, you have initial data while testing your services. Also, as you would notice, the id in this example (*602460f6-df6e-456a-89d9-8c5870dfc583*) is same as the *authorId* field in the `BooksAppServiceTests.CreateAsync` method. + +Let's execute all tests, and see the results: + +![](./images/bookstore-test-succeed.png) + +## Summary + +So far, you have created the all functionality for the bookstore application without needing to write any single line of code. ABP Suite generated the entities, application services, UI components, unit & integration tests and more... + +In the next part, you will write some code and modify the ABP Suite's generated code by writing the code in the specified hookpoints. Thanks to [ABP Suite's Customized Code Support](../../suite/customizing-the-generated-code.md), in the next generation, our custom code will not be overridden and will be preserved. \ No newline at end of file diff --git a/docs/en/tutorials/book-store-with-abp-suite/part-05.md b/docs/en/tutorials/book-store-with-abp-suite/part-05.md new file mode 100644 index 0000000000..842399a80f --- /dev/null +++ b/docs/en/tutorials/book-store-with-abp-suite/part-05.md @@ -0,0 +1,123 @@ +# Web Application Development (with ABP Suite) Tutorial - Part 5: Customizing the Generated Code +````json +//[doc-params] +{ + "UI": ["MVC"], + "DB": ["EF"] +} +```` +````json +//[doc-nav] +{ + "Previous": { + "Name": "Book to Author Relation", + "Path": "tutorials/book-store-with-abp-suite/part-04" + } +} +```` + +So far, you have created the all functionality for the bookstore application without needing to write any single line of code. In this part, let's write some code and check one of the great features of the ABP Suite, which is [Customizable Code Support](../../suite/customizing-the-generated-code.md). + +## Customizable Code Support + +ABP Suite allows you to customize the generated code blocks and preserve your custom code changes in the next CRUD Page Generation. It specifies hook points to allow adding custom code blocks. Then, the code written by you to these hook points will be respected and will not be overridden in the next CRUD Page Generation. + +To enable custom code support, you should check the *Customizable code* option in the **CRUD Page Generation** page (it's selected by default), and you enabled it for both entities: + +![](./images/suite-enabling-custom-code.png) + +## Custom Code Hookpoints + +When you enable the *custom code support*, ABP Suite adds some hookpoints that you can write your own custom code without worrying about, are my codes being overridden with the next CRUD page generation. + +On the C# side, ABP Suite adds abstract base classes for entities, application services, interfaces, domain services and so on... (and partial classes for interfaces) + +You can write your custom code in those classes (with the `*.Extended.cs` extension) and next time when you need to re-generate the entity, your custom code will not be overridden (only the base abstract classes will be re-generated and your changes on Suite will be respected): + +![](./images/suite-repository-custom-code.png) + +> For example, you can create a new repository method like in the example above, and in the next CRUD page generation, you will ABP Suite won't override your custom code. + +On the UI side, ABP Suite provides convenient comment placeholders within pages for MVC, Blazor, and Angular UIs. These comment sections serve as hook points where you can add your custom code. + +For example, if you open the *Books/Index.cshtml* file in your IDE, you will see those placeholders like following: + +```xml + + +@section styles +{ +@*//*@ +@*//*@ +} + + +``` + +You can write your custom codes between the _****_ placeholders and you can also extend these placeholders by customizing the [ABP Suite templates](../../suite/editing-templates.md). + +> For more information, please refer to [Customizing the Generated Code documentation](../../suite/customizing-the-generated-code.md) + +## Implementing Custom Code + +Let's see the custom code support in action. We can demonstrate this feature with an easy example. + +Assume that we want to show the author's name with his abbreviated name. For example, for the author *John Ronald Reuel Tolkien*, we want to show the name *John Ronald Reuel Tolkien (a.k.a J.R.R.T)*. Achieving that is pretty straightforward. + +We just need to open the *src/Acme.BookStore.Application/Books/BooksAppService.Extended.cs* file and override the base `GetListAsync` method, which is called on the books page: + +```csharp +using System; +using System.Linq; +using System.Collections.Generic; +using System.Threading.Tasks; +using Volo.Abp.Application.Dtos; +using Volo.Abp.Domain.Repositories; +using Volo.Abp.Caching; + +namespace Acme.BookStore.Books +{ + public class BooksAppService : BooksAppServiceBase, IBooksAppService + { + // + public BooksAppService(IBookRepository bookRepository, BookManager bookManager, IDistributedCache downloadTokenCache, IRepository authorRepository) + : base(bookRepository, bookManager, downloadTokenCache, authorRepository) + { + } + // + + //Write your custom code... + public override async Task> GetListAsync(GetBooksInput input) + { + var result = await base.GetListAsync(input); + + foreach (var book in result.Items) + { + var akaName = book.Author.Name.Split(" ").Select(q => q[0]).JoinAsString("."); + book.Author.Name += $" (a.k.a {akaName})"; + } + + return result; + } + } +} +``` + +* Here, we have overridden the `GetListAsync` method and changed its result according to our need. +* Notice, this class is derieved from the `BooksAppServiceBase` class and implements the `IBooksAppService`. +* Thus, ABP Suite only modifies the `BooksAppServiceBase` class and implements the necessary services in each generation, but does not generate the files with the `*.Extended` postfixes and let you implement your own custom code. +* You can create new methods, override an existing method and change its behaviour, add custom hookpoints to extend customization capabilities and more... + +Now, we can open ABP Suite and try to regenerate the book entity and see if our custom code is gone or not: + +![](./images/suite-end-of-generation-modal.png) + +After the regeneration has been completed, we can check the **BooksAppService.Extended.cs** file and we should see our custom code is there without any modification. ABP Suite didn't override our custom code, and finally, we can run the application to see the final result: + +![](./images/suite-custom-code-result.png) + +ABP Suite's custom code support is not limited to the backend side. You can also override the UI. You can refer to the [Customizing the Generated Code document](../../suite/customizing-the-generated-code.md) for further info. + +## Summary + +In this tutorial, you created the bookstore application without needing to write a single line of code with ABP Suite. Then, in this last part, you have written custom code in the specified hookpoints and it did not override by ABP Suite. \ No newline at end of file diff --git a/docs/en/tutorials/book-store/part-01.md b/docs/en/tutorials/book-store/part-01.md index 8f1d5df346..91700a1a25 100644 --- a/docs/en/tutorials/book-store/part-01.md +++ b/docs/en/tutorials/book-store/part-01.md @@ -2,7 +2,7 @@ ````json //[doc-params] { - "UI": ["MVC","Blazor","BlazorServer","NG"], + "UI": ["MVC","Blazor","BlazorServer", "BlazorWebApp","NG"], "DB": ["EF","Mongo"] } ```` @@ -34,9 +34,9 @@ For such cases, run the `abp install-libs` command on the root directory of your abp install-libs ``` -> We suggest you install [Yarn](https://classic.yarnpkg.com/) to prevent possible package inconsistencies, if you haven't installed it yet. +> 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"}} +{{if UI=="Blazor" || UI=="BlazorWebApp"}} ### Bundling and Minification @@ -440,7 +440,7 @@ ABP can [**automagically**](../../framework/api-development/auto-controllers.md) ### Swagger UI -The startup template is configured to run the [Swagger UI](https://swagger.io/tools/swagger-ui/) using the [Swashbuckle.AspNetCore](https://github.com/domaindrivendev/Swashbuckle.AspNetCore) library. Run the application ({{if UI=="MVC"}}`Acme.BookStore.Web`{{else if UI=="BlazorServer"}}`Acme.BookStore.Blazor`{{else}}`Acme.BookStore.HttpApi.Host`{{end}}) by pressing `CTRL+F5` and navigate to `https://localhost:/swagger/` on your browser. Replace `` with your own port number. +The startup template is configured to run the [Swagger UI](https://swagger.io/tools/swagger-ui/) using the [Swashbuckle.AspNetCore](https://github.com/domaindrivendev/Swashbuckle.AspNetCore) library. Run the application ({{if UI=="MVC"}}`Acme.BookStore.Web`{{else if UI=="BlazorServer" || UI=="BlazorWebApp"}}`Acme.BookStore.Blazor`{{else}}`Acme.BookStore.HttpApi.Host`{{end}}) by pressing `CTRL+F5` and navigate to `https://localhost:/swagger/` on your browser. Replace `` with your own port number. You will see some built-in service endpoints as well as the `Book` service and its REST-style endpoints: @@ -480,4 +480,4 @@ If you try to execute the `[GET] /api/app/book` API to get a list of books, the } ```` -That's pretty cool since we haven't written a single line of code to create the API controller, but now we have a fully working REST API! \ No newline at end of file +That's pretty cool since we haven't written a single line of code to create the API controller, but now we have a fully working REST API! diff --git a/docs/en/tutorials/book-store/part-02.md b/docs/en/tutorials/book-store/part-02.md index df5a5ac598..bb812e7d81 100644 --- a/docs/en/tutorials/book-store/part-02.md +++ b/docs/en/tutorials/book-store/part-02.md @@ -2,7 +2,7 @@ ````json //[doc-params] { - "UI": ["MVC","Blazor","BlazorServer","NG"], + "UI": ["MVC","Blazor","BlazorServer", "BlazorWebApp", "NG"], "DB": ["EF","Mongo"] } ```` @@ -514,13 +514,13 @@ Now you can see the final result on your browser: ![Book list final result](images/bookstore-book-list-angular.png) -{{else if UI == "Blazor" || UI == "BlazorServer"}} +{{else if UI == "Blazor" || UI == "BlazorServer" || UI == "BlazorWebApp"}} ## Create a Books Page -It's time to create something visible and usable! Right click on the `Pages` folder under the {{ if UI == "Blazor"}}`Acme.BookStore.Blazor.Client`{{ else }}`Acme.BookStore.Blazor`{{ end }} project and add a new **razor component**, named `Books.razor`: +It's time to create something visible and usable! Right click on the `Pages` folder under the {{ if UI == "BlazorServer" }}`Acme.BookStore.Blazor`{{ else }}`Acme.BookStore.Blazor.Client`{{ end }} project and add a new **razor component**, named `Books.razor`: -{{ if UI == "Blazor"}} +{{ if UI == "Blazor" || UI == "BlazorWebApp" }} ![blazor-add-books-component](images/blazor-add-books-component-client.png) {{ else }} ![blazor-add-books-component](images/blazor-add-books-component.png) @@ -540,7 +540,7 @@ Replace the contents of this component as shown below: ### Add the Books Page to the Main Menu -Open the `BookStoreMenuContributor` class in the {{ if UI == "Blazor"}}`Acme.BookStore.Blazor.Client`{{ else }}`Acme.BookStore.Blazor`{{ end }} project add the following code to the end of the `ConfigureMainMenuAsync` method: +Open the `BookStoreMenuContributor` class in the {{ if UI == "BlazorServer"}}`Acme.BookStore.Blazor`{{ else }}`Acme.BookStore.Blazor.Client`{{ end }} project add the following code to the end of the `ConfigureMainMenuAsync` method: ````csharp context.Menu.AddItem( diff --git a/docs/en/tutorials/book-store/part-03.md b/docs/en/tutorials/book-store/part-03.md index a770d62f29..65f6d482dd 100644 --- a/docs/en/tutorials/book-store/part-03.md +++ b/docs/en/tutorials/book-store/part-03.md @@ -2,7 +2,7 @@ ````json //[doc-params] { - "UI": ["MVC","Blazor","BlazorServer","NG"], + "UI": ["MVC","Blazor","BlazorServer","BlazorWebApp","NG"], "DB": ["EF","Mongo"] } ```` @@ -1101,7 +1101,7 @@ Clicking the "Delete" action calls the `delete` method which then shows a confir {{end}} -{{if UI == "Blazor" || UI == "BlazorServer"}} +{{if UI == "Blazor" || UI == "BlazorServer" || UI == "BlazorWebApp"}} ## Creating a New Book @@ -1292,13 +1292,13 @@ We can now define a modal to edit the book. Add the following code to the end of The base `AbpCrudPageBase` uses the [object to object mapping](../../framework/infrastructure/object-to-object-mapping.md) system to convert an incoming `BookDto` object to a `CreateUpdateBookDto` object. So, we need to define the mapping. -Open the `BookStoreBlazorAutoMapperProfile` inside the `Acme.BookStore.Blazor.Client` project and change the content as the following: +Open the `BookStoreBlazorAutoMapperProfile` inside the {{ if UI == "BlazorServer" }}`Acme.BookStore.Blazor`{{ else }}`Acme.BookStore.Blazor.Client`{{ end }} project and change the content as the following: ````csharp using Acme.BookStore.Books; using AutoMapper; -namespace Acme.BookStore.Blazor.Client; +{{ if UI == "BlazorServer" }}namespace Acme.BookStore.Blazor;{{ else }}namespace Acme.BookStore.Blazor.Client;{{ end }} public class BookStoreBlazorAutoMapperProfile : Profile { diff --git a/docs/en/tutorials/book-store/part-04.md b/docs/en/tutorials/book-store/part-04.md index b529748efb..4ab950b0e1 100644 --- a/docs/en/tutorials/book-store/part-04.md +++ b/docs/en/tutorials/book-store/part-04.md @@ -2,7 +2,7 @@ ````json //[doc-params] { - "UI": ["MVC","Blazor","BlazorServer","NG"], + "UI": ["MVC","Blazor","BlazorServer","BlazorWebApp","NG"], "DB": ["EF","Mongo"] } ```` diff --git a/docs/en/tutorials/book-store/part-05.md b/docs/en/tutorials/book-store/part-05.md index 947eec65f0..95ee1f53a6 100644 --- a/docs/en/tutorials/book-store/part-05.md +++ b/docs/en/tutorials/book-store/part-05.md @@ -2,7 +2,7 @@ ````json //[doc-params] { - "UI": ["MVC","Blazor","BlazorServer","NG"], + "UI": ["MVC","Blazor","BlazorServer","BlazorWebApp","NG"], "DB": ["EF","Mongo"] } ```` @@ -389,11 +389,11 @@ Open the `/src/app/book/book.component.html` file and replace the edit and delet * Added `*abpPermission="'BookStore.Books.Edit'"` that hides the edit action if the current user has no editing permission. * Added `*abpPermission="'BookStore.Books.Delete'"` that hides the delete action if the current user has no delete permission. -{{else if UI == "Blazor"}} +{{else if UI == "Blazor" || UI == "BlazorServer" || UI == "BlazorWebApp"}} ### Authorize the Razor Component -Open the `/Pages/Books.razor` file in the `Acme.BookStore.Blazor.Client` project and add an `Authorize` attribute just after the `@page` directive and the following namespace imports (`@using` lines), as shown below: +Open the `/Pages/Books.razor` file in the {{ if UI == "BlazorServer" }}`Acme.BookStore.Blazor`{{ else }}`Acme.BookStore.Blazor.Client`{{ end }} project and add an `Authorize` attribute just after the `@page` directive and the following namespace imports (`@using` lines), as shown below: ````html @page "/books" @@ -479,7 +479,7 @@ You can run and test the permissions. Remove a book related permission from the Even we have secured all the layers of the book management page, it is still visible on the main menu of the application. We should hide the menu item if the current user has no permission. -Open the `BookStoreMenuContributor` class in the `Acme.BookStore.Blazor.Client` project, find the code block below: +Open the `BookStoreMenuContributor` class in the {{ if UI == "BlazorServer" }}`Acme.BookStore.Blazor`{{ else }}`Acme.BookStore.Blazor.Client`{{ end }} project, find the code block below: ````csharp context.Menu.AddItem( diff --git a/docs/en/tutorials/book-store/part-06.md b/docs/en/tutorials/book-store/part-06.md index a19248ec64..58a83cfc16 100644 --- a/docs/en/tutorials/book-store/part-06.md +++ b/docs/en/tutorials/book-store/part-06.md @@ -2,7 +2,7 @@ ````json //[doc-params] { - "UI": ["MVC","Blazor","BlazorServer","NG"], + "UI": ["MVC","Blazor","BlazorServer", "BlazorWebApp", "NG"], "DB": ["EF","Mongo"] } ```` diff --git a/docs/en/tutorials/book-store/part-07.md b/docs/en/tutorials/book-store/part-07.md index 70d73da97b..b8aa17ace8 100644 --- a/docs/en/tutorials/book-store/part-07.md +++ b/docs/en/tutorials/book-store/part-07.md @@ -2,7 +2,7 @@ ````json //[doc-params] { - "UI": ["MVC","Blazor","BlazorServer","NG"], + "UI": ["MVC","Blazor","BlazorServer","BlazorWebApp","NG"], "DB": ["EF","Mongo"] } ```` diff --git a/docs/en/tutorials/book-store/part-08.md b/docs/en/tutorials/book-store/part-08.md index 61412ba770..679b6d84ca 100644 --- a/docs/en/tutorials/book-store/part-08.md +++ b/docs/en/tutorials/book-store/part-08.md @@ -2,7 +2,7 @@ ````json //[doc-params] { - "UI": ["MVC","Blazor","BlazorServer","NG"], + "UI": ["MVC","Blazor","BlazorServer","BlazorWebApp","NG"], "DB": ["EF","Mongo"] } ```` diff --git a/docs/en/tutorials/book-store/part-09.md b/docs/en/tutorials/book-store/part-09.md index d1c446bc3f..3c1b0cb7d5 100644 --- a/docs/en/tutorials/book-store/part-09.md +++ b/docs/en/tutorials/book-store/part-09.md @@ -2,7 +2,7 @@ ````json //[doc-params] { - "UI": ["MVC","Blazor","BlazorServer","NG"], + "UI": ["MVC","Blazor","BlazorServer","BlazorWebApp","NG"], "DB": ["EF","Mongo"] } ```` @@ -848,13 +848,13 @@ That's all! This is a fully working CRUD page, you can create, edit and delete a {{end}} -{{if UI == "Blazor" || UI == "BlazorServer"}} +{{if UI == "Blazor" || UI == "BlazorServer" || UI == "BlazorWebApp"}} ## The Author Management Page ### Authors Razor Component -Create a new Razor Component Page, `/Pages/Authors.razor`, in the `Acme.BookStore.Blazor.Client` project with the following content: +Create a new Razor Component Page, `/Pages/Authors.razor`, in the {{ if UI == "BlazorServer" }}`Acme.BookStore.Blazor`{{ else }}`Acme.BookStore.Blazor.Client`{{ end }} project with the following content: ````xml @page "/authors" @@ -1055,7 +1055,7 @@ using Blazorise.DataGrid; using Microsoft.AspNetCore.Authorization; using Volo.Abp.Application.Dtos; -namespace Acme.BookStore.Blazor.Client.Pages; +{{ if UI == "BlazorServer" }}namespace Acme.BookStore.Blazor.Pages;{{ else }}namespace Acme.BookStore.Blazor.Client.Pages;{{ end }} public partial class Authors { @@ -1201,7 +1201,7 @@ This class typically defines the properties and methods used by the `Authors.raz `Authors` class uses the `IObjectMapper` in the `OpenEditAuthorModal` method. So, we need to define this mapping. -Open the `BookStoreBlazorAutoMapperProfile.cs` in the `Acme.BookStore.Blazor.Client` project and add the following mapping code in the constructor: +Open the `BookStoreBlazorAutoMapperProfile.cs` in the {{ if UI == "BlazorServer" }}`Acme.BookStore.Blazor`{{ else }}`Acme.BookStore.Blazor.Client`{{ end }} project and add the following mapping code in the constructor: ````csharp CreateMap(); @@ -1211,7 +1211,7 @@ You will need to declare a `using Acme.BookStore.Authors;` statement to the begi ### Add to the Main Menu -Open the `BookStoreMenuContributor.cs` in the `Acme.BookStore.Blazor.Client` project and add the following code to the end of the `ConfigureMainMenuAsync` method: +Open the `BookStoreMenuContributor.cs` in the {{ if UI == "BlazorServer" }}`Acme.BookStore.Blazor`{{ else }}`Acme.BookStore.Blazor.Client`{{ end }} project and add the following code to the end of the `ConfigureMainMenuAsync` method: ````csharp if (await context.IsGrantedAsync(BookStorePermissions.Authors.Default)) diff --git a/docs/en/tutorials/book-store/part-10.md b/docs/en/tutorials/book-store/part-10.md index 5a6acb752b..928881ffec 100644 --- a/docs/en/tutorials/book-store/part-10.md +++ b/docs/en/tutorials/book-store/part-10.md @@ -2,7 +2,7 @@ ````json //[doc-params] { - "UI": ["MVC","Blazor","BlazorServer","NG"], + "UI": ["MVC","Blazor","BlazorServer","BlazorWebApp","NG"], "DB": ["EF","Mongo"] } ```` @@ -1071,11 +1071,11 @@ That's all. Just run the application and try to create or edit an author. {{end}} -{{if UI == "Blazor" || UI == "BlazorServer"}} +{{if UI == "Blazor" || UI == "BlazorServer" || UI == "BlazorWebApp" }} ### The Book List -It is very easy to show the *Author Name* in the book list. Open the `/Pages/Books.razor` file in the `Acme.BookStore.Blazor.Client` project and add the following `DataGridColumn` definition just after the `Name` (book name) column: +It is very easy to show the *Author Name* in the book list. Open the `/Pages/Books.razor` file in the {{ if UI == "BlazorServer" }}`Acme.BookStore.Blazor`{{ else }}`Acme.BookStore.Blazor.Client`{{ end }} project and add the following `DataGridColumn` definition just after the `Name` (book name) column: ````xml This tutorial is suitable for those who have an ABP Business or a higher [license](https://abp.io/pricing). + +ABP is designed to be a powerful platform to build microservice solutions. It provides a [microservice solution template](../../solution-templates/microservice/index.md) to easily start a sophisticated microservice solution. All of the [pre-built application modules](../../modules/index.md) are microservice compatible and the core framework fully [supports and simplifies](../../framework/architecture/microservices/index.md) distributed application development. + +In this tutorial, you will learn how to start a new microservice solution, create services and communicate between them. You will also learn to use these services from a web application through an API gateway and automatically generate CRUD pages using the [ABP Suite](../../suite/index.md) tool. + +## Tutorial Outline + +This tutorial is organized as the following parts: + +* [Part 01: Creating the initial solution](part-01.md) +* [Part 02: Creating the initial Catalog microservice](part-02.md) +* [Part 03: Building the Catalog microservice](part-03.md) +* [Part 04: Creating the initial Ordering service](part-04.md) +* [Part 05: Building the Ordering service](part-05.md) +* [Part 06: Integrating the services: HTTP API Calls](part-06.md) +* [Part 07: Integrating the services: Using Distributed Events](part-07.md) + +## Download the Source Code + +After logging in to the ABP website, you can download the source code from [here](https://abp.io/api/download/samples/cloud-crm-mvc-ef). + +## See Also + +* [Microservice solution template](../../solution-templates/microservice/index.md) \ No newline at end of file diff --git a/docs/en/tutorials/microservice/part-01.md b/docs/en/tutorials/microservice/part-01.md new file mode 100644 index 0000000000..d843e744ca --- /dev/null +++ b/docs/en/tutorials/microservice/part-01.md @@ -0,0 +1,40 @@ +# Microservice Tutorial Part 01: Creating the Initial Solution + +````json +//[doc-nav] +{ + "Next": { + "Name": "Creating the initial Catalog service", + "Path": "tutorials/microservice/part-02" + } +} +```` + +Follow the *[Get Started](../../get-started/microservice.md)* guide to create a new layered web application with the following configurations: + +* **Solution name**: `CloudCrm` +* **Database Provider**: Entity Framework Core +* **Database Management System**: SQL Server +* **UI Framework**: MVC / Razor Pages +* **Mobile framework**: None +* **Public website**: Selected + +You can select the other options based on your preference. + +> **Please complete the *[Get Started](../../get-started/layered-web-application.md)* guide and run the web application before going further.** You can skip the sections after the *Running the Solution* section, if you don't prefer to complete all. + +The initial solution structure should be like the following in ABP Studio's *[Solution Explorer](../../studio/solution-explorer.md)*: + +![abp-studio-solution-explorer-initial-cloud-crm-microservice-solution](images/abp-studio-solution-explorer-initial-cloud-crm-microservice-solution.png) + +> ABP Studio will perform a few additional steps after creating your solution. **Please wait until all the background tasks are completed** before going further. + +Initially you see three folders (`apps`, `gateways` and `services`) and ~10 ABP Studio modules (depends on your preferences while creating the solution) under the `CloudCrm` ABP Studio solution. Some of these modules represent microservices, some of them represent web applications and some others represent API gateways in our system. + +> An **ABP Studio module** is typically a .NET solution and an **ABP Studio solution** is an umbrella concept for multiple .NET Solutions (see the *[Concepts](../../studio/concepts.md)* document for more). + +You can see the *[Microservice Solution Template](../../solution-templates/microservice/index.md)* document later if you want to understand the initial solution structure with all its details. However, it is not needed to follow this tutorial. + +## Summary + +In this part, you've created the initial microservice solution, which already contains a few infrastructure services. We will create our first business service in the [next part](part-02.md). \ No newline at end of file diff --git a/docs/en/tutorials/microservice/part-02.md b/docs/en/tutorials/microservice/part-02.md new file mode 100644 index 0000000000..014daf9b11 --- /dev/null +++ b/docs/en/tutorials/microservice/part-02.md @@ -0,0 +1,123 @@ +# Microservice Tutorial Part 02: Creating the initial Catalog service + +````json +//[doc-nav] +{ + "Previous": { + "Name": "Creating the initial solution", + "Path": "tutorials/microservice/part-01" + }, + "Next": { + "Name": "Building the Catalog service", + "Path": "tutorials/microservice/part-03" + } +} +```` + +In this tutorial, you will create a new Catalog service and integrate it to the solution. + +## Creating the Catalog Service + +Right-click the `services` folder in the *Solution Explorer* panel, select the *Add* -> *New Module* -> *Microservice* command: + +![abp-studio-add-new-microservice-command](images/abp-studio-add-new-microservice-command.png) + +This command opens a new dialog to define the properties of the new microservice. You can use the following values to create a new microservice named `CatalogService`: + +![abp-studio-add-new-microservice-dialog](images/abp-studio-add-new-microservice-dialog.png) + +When you click the *Next* button, you are redirected to the database provider selection step. + +### Selecting the Database Type + +Here, you can select the database provider to be used by the new microservice: + +![abp-studio-add-new-microservice-dialog-database-step](images/abp-studio-add-new-microservice-dialog-database-step.png) + +Select *Entity Framework Core* option and proceed the *Next* step. + +### Integrating to the Solution + +In this step, we can select the options for integrating the new microservice to the rest of the solution components: + +![abp-studio-add-new-microservice-dialog-integration-step](images/abp-studio-add-new-microservice-dialog-integration-step.png) + +ABP Studio intelligently selects the right values for you, but you should still check them carefully since they directly affect what we will do in the next parts of this tutorial. + +**Ensure the options are configured the same as in the preceding figure**, and click the *Next* button. + +### Additional Options + +![abp-studio-add-new-microservice-dialog-additional-options-step](images/abp-studio-add-new-microservice-dialog-additional-options-step.png) + +In this step, you can select additional options for the new microservice. You can leave them as default and click the *Create* button. + +That's all, ABP Studio creates the new microservice and arranges all the integration and configuration for you. + +## Exploring the New Catalog Microservice + +In this section, we will investigate the new microservice in overall. + +### Understanding the Packages of The Service + +The new microservice is added under the `services` folder in the `CloudCrm` ABP Studio solution: + +![abp-studio-new-catalog-service-in-solution-explorer](images/abp-studio-new-catalog-service-in-solution-explorer.png) + +The new microservice has its own separate .NET solution that includes three packages (.NET projects): + +* `CloudCrm.CatalogService` is the main project that you will implement your service. It typically contains your [entities](../../framework/architecture/domain-driven-design/entities.md), [repositories](../../framework/architecture/domain-driven-design/repositories.md), [application services](../../framework/architecture/domain-driven-design/application-services.md), API controllers, etc. +* `CloudCrm.CatalogService.Contracts` project can be shared with the other services and applications. It typically contains interfaces of your [application services](../../framework/architecture/domain-driven-design/application-services.md), [data transfer objects](../../framework/architecture/domain-driven-design/data-transfer-objects.md), and some other types you may want to share with the clients of this microservice. +* `CloudCrm.CatalogService.Tests` is for building your unit and integration tests for this microservice. + +### Opening the Service in an IDE + +You can open the new microservice in your favorite IDE for development. As a shortcut, you can right-click it in ABP Studio, select the *Open with* -> *Visual Studio* command for example: + +![abp-studio-open-with-visual-studio](images/abp-studio-open-with-visual-studio.png) + +Here is the `CloudCrm.CatalogService` .NET solution in Visual Studio: + +![visual-studio-solution-explorer-catalog-service](images/visual-studio-solution-explorer-catalog-service.png) + +### Running the New Service + +You can run the solution using ABP Studio's *Solution Runner*. It will also run the new Catalog service as a part of the solution. + +> Before running the solution, **ensure that all the applications are built**. If you are not sure, right-click the root item (`CloudCrm`) in the *Solution Explorer* panel and select the *Build* -> *Graph Build* command. + +Click the *Play* button near to the solution root: + +![abp-studio-solution-runner-play-all](images/abp-studio-solution-runner-play-all.png) + +### Browsing the Catalog Service + +Once all of the applications have started, right-click the Catalog service and select the *Browse* command: + +![abp-studio-browse-catalog-service](images/abp-studio-browse-catalog-service.png) + +It will open the built-in browser and you will see the Swagger UI for the Catalog service: + +![abp-studio-browser-catalog-service-swagger-ui](images/abp-studio-browser-catalog-service-swagger-ui.png) + +You can test the APIs on the Swagger UI to see if the new microservice is properly working. + +### Opening the Catalog Database + +The new Catalog microservice has its own database. That database is created automatically by the microservice application, when you run the microservice. Also, [Entity Framework's database migrations](https://learn.microsoft.com/en-us/ef/core/managing-schemas/migrations/) are automatically applied by the microservice when it runs. So, you don't care about the database schema changes every time you deploy the microservice. + +Assuming you've selected SQL Server as your DBMS, you can open the SQL Server Management Studio to see its databases: + +![sql-server-management-studio-login-screen](images/sql-server-management-studio-login-screen.png) + +Use `localhost,1434` as the *Server name*, select the *SQL Server Authentication* as the *Authentication* type, use `sa` as the *Login* name and `myPassw@rd` as the *Password* value. You can find these values in the `appsettings.json` file in the `CloudCrm.CatalogService` project of the .NET solution of the Catalog microservice. + +Once you click the *Connect* button, you can see all the databases and explore their data: + +![sql-server-management-studio-databases](images/sql-server-management-studio-databases.png) + +The Catalog service's database has only three initial table. The first one is for Entity Framework Core's migration system, and the others are for ABP's [distributed event bus](../../solution-templates/microservice/distributed-events.md) to properly apply transactional events using the outbox and inbox patterns. You don't need to care about these tables since they are created and managed by Entity Framework Core and ABP. + +## Summary + +In this part of the Microservice Development Tutorial, we added a new Catalog microservice to the solution, explored its code structure and database, and browse its APIs using the Swagger UI. In the next part, we will create functionality in that new microservice. \ No newline at end of file diff --git a/docs/en/tutorials/microservice/part-03.md b/docs/en/tutorials/microservice/part-03.md new file mode 100644 index 0000000000..31491ef004 --- /dev/null +++ b/docs/en/tutorials/microservice/part-03.md @@ -0,0 +1,126 @@ +# Microservice Tutorial Part 03: Building the Catalog service + +````json +//[doc-nav] +{ + "Previous": { + "Name": "Creating the initial Catalog service", + "Path": "tutorials/microservice/part-02" + }, + "Next": { + "Name": "Creating the initial Ordering service", + "Path": "tutorials/microservice/part-04" + } +} +```` + +In the previous part, we've created a new microservice named Catalog. In this part, we will build functionality to create and manage products in our system. + +In this part, we will use [ABP Suite](../../suite/index.md) to automatically create all the necessary code for us. So, you will see how to use ABP Suite in a microservice solution. We will do everything manually while we will create the Ordering microservice in next parts, so you will learn the details better. We suggest to use ABP Suite wherever it is possible, because it saves a lot of time. You can then investigate the changes done by ABP Suite to understand what it produced. + +## Opening the ABP Suite + +First of all, **stop all the applications** in ABP Studio's *Solution Runner* panel, because ABP Suite will make changes in the solution and it will also needs to build the solution in some steps. Running the solution prevents to build it. + +Now, select the *ABP Suite* -> *Open* command on the main menu to open ABP Suite: + +![abp-studio-open-abp-suite](images/abp-studio-open-abp-suite.png) + +It will ask to you which module you want to use: + +![abp-studio-open-abp-suite-select-module](images/abp-studio-open-abp-suite-select-module.png) + +The `CloudCrm` microservice solution contains more than one .NET solution. Typically, each ABP Studio module represents a separate .NET solution (see the [concepts](../../studio/concepts.md) document). ABP Suite works on a single .NET solution to generate code, so we should select a module here. + +Select the `CloudCrm.CatalogService` module and click the *OK* button. It will open ABP Suite as shown below: + +![abp-studio-abp-suite-inside](images/abp-studio-abp-suite-inside.png) + +## Generating a Products Page + +In the next section, we will use ABP Suite to create a fully functional CRUD page with ABP Suite. The UI part will be in the main web application (`CloudCrm.Web`) and the application service and other parts will be generated in the Catalog microservice. + +### Configuring the Product Entity Information + +Type `Product` for the *Name* field and leave the other options as is. ABP Suite will automatically calculate proper values for you: + +![abp-suite-product-info](images/abp-suite-product-info.png) + +### Configuring Properties of the Product Entity + +Open the *Properties* tab and create the properties shown in the following figure: + +![abp-suite-product-properties](images/abp-suite-product-properties.png) + +Here the details: + +* `Name` is required, minimum length is `2` and maximum length is `120`. +* `Description` is not required, it is a *Text area*, not *Filterable*, not *Shown on the list page*. +* `StockCount` has a *Default value* `0`, minimum value `0` and maximum value `999999`. +* `ReleaseDate` is *Nullable*. + +You can leave the other configurations as default. + +### Generating the Code + +![abp-suite-product-generating.png](images/abp-suite-product-generating.png) + +That's all. You can click the *Save and generate* button to start the code generation process. + +![abp-suite-product-generated](images/abp-suite-product-generated.png) + +ABP Suite will generate the necessary code for you. It will take some time to complete the process. After the process is completed, you will see a success message, click the *OK* button. + +![abp-studio-catalog-service-build-and-start](images/abp-studio-catalog-service-build-and-start.png) + +We can now build and start the `CloudCrm.CatalogService` application by clicking the *Run* -> *Build & Start* button in the *Solution Runner* panel. + +![abp-studio-browse-catalog-service-2](images/abp-studio-browse-catalog-service-2.png) + +After the application is started, you can right-click and [Browse](../../studio/running-applications.md#monitoring) on the `CloudCrm.CatalogService` application to open it in the ABP Studio's pre-integrated browser. You can see the *Products* controller in the Swagger UI. + +### Generating the UI Proxy + +Now, we need to generate the [Static API Proxy](../../framework/api-development/static-csharp-clients.md) for the *Web* project. Right-click the *CloudCrm.Web* [package](../../studio/concepts.md#package) and select the *ABP CLI* -> *Generate Proxy* -> *C#* command: + +![abp-studio-generate-proxy](images/abp-studio-generate-proxy.png) + +It will open the *Generate C# Proxies* window. Select the `CloudCrm.CatalogService` application, and it will automatically populate the *URL* field. Select the *catalog* module, set the service type to *application*, and check the *Without contracts* checkbox, as the `CloudCrm.Web` project already depends on the `CloudCrm.CatalogService.Contracts` package: + +![abp-studio-generate-proxy-window](images/abp-studio-generate-proxy-window.png) + +> To be able to select the *Application*, you must *Build & Start* the related application beforehand. You can start the application using [Solution Runner](../../studio/running-applications.md) as explained in the previous parts. + +Lastly, we need to configure the use of a static HTTP client for the `CatalogService` in the `CloudCrm.Web` project. Open the `CloudCrmWebModule.cs` file in the `Web` project and add the following line to the `ConfigureServices` method: + +```csharp +//... +using CloudCrm.CatalogService; + +public override void ConfigureServices(ServiceConfigurationContext context) +{ + // Code omitted for brevity + context.Services.AddStaticHttpClientProxies( + typeof(CloudCrmCatalogServiceContractsModule).Assembly); +} +``` + +### Running the Application + +Now, stop any application running in the *Solution Runner* panel, and then run the applications by clicking the *Run* -> *Build & Start All* button on the root item in the *Solution Runner* panel: + +![abp-studio-run-build-and-start-all](images/abp-studio-run-build-and-start-all.png) + +After the application is started, you can right-click and [Browse](../../studio/running-applications.md#monitoring) on the `CloudCrm.Web` application to open it in the ABP Studio's pre-integrated browser: + +![abp-studio-browse-cloud-crm-products](images/abp-studio-browse-cloud-crm-products.png) + +> If you can't see the *Products* menu item, you need to grant the `CatalogService` *Product* permission to the *admin* role. You can do this by navigating to *Identity Management* -> *Roles* and editing the *admin* role. Alternatively, you can restart the *CloudCrm.AdministrationService* application to automatically seed all permissions for the *admin* role. + +You can open the Sql Server Management Studio to see the created tables and data: + +![sql-server-management-studio-products](images/sql-server-management-studio-products.png) + +## Summary + +In this part, we've created a new entity named *Product* and generated the necessary code for it. We've also generated the UI proxy for the `CatalogService` application and configured the static HTTP client for it in the `Web` project. We've run the application and tested the *Products* page. \ No newline at end of file diff --git a/docs/en/tutorials/microservice/part-04.md b/docs/en/tutorials/microservice/part-04.md new file mode 100644 index 0000000000..50386ab8e1 --- /dev/null +++ b/docs/en/tutorials/microservice/part-04.md @@ -0,0 +1,97 @@ +# Microservice Tutorial Part 04: Creating the initial Ordering service + +````json +//[doc-nav] +{ + "Previous": { + "Name": "Building the Catalog service", + "Path": "tutorials/microservice/part-03" + }, + "Next": { + "Name": "Building the Ordering service", + "Path": "tutorials/microservice/part-05" + } +} +```` + +In the previous part, we implemented the Catalog microservice functionality using ABP Suite. In this part, we will create the Ordering microservice, and the following part will cover implementing its functionality manually. + +## Creating the Ordering Microservice + +Right-click the `services` folder in the *Solution Explorer* panel, select the *Add* -> *New Module* -> *Microservice* command: + +![abp-studio-add-new-microservice-command](images/abp-studio-add-new-microservice-command-2.png) + +This command opens a new dialog to define the properties of the new microservice. You can use the following values to create a new microservice named `OrderingService`: + +![abp-studio-add-new-microservice-dialog](images/abp-studio-add-new-microservice-dialog-2.png) + +When you click the *Next* button, you are redirected to the database provider selection step. + +### Selecting the Database Type + +Here, you can select the database provider to be used by the new microservice: + +![abp-studio-add-new-microservice-dialog-database-step](images/abp-studio-add-new-microservice-dialog-database-step.png) + +Select *Entity Framework Core* option and proceed the *Next* step. + +### Integrating to the Solution + +In this step, we can select the options for integrating the new microservice to the rest of the solution components: + +![abp-studio-add-new-microservice-dialog-integration-step](images/abp-studio-add-new-microservice-dialog-integration-step.png) + +ABP Studio intelligently selects the right values for you, but you should still check them carefully since they directly affect what we will do in the next parts of this tutorial. + +**Ensure the options are configured the same as in the preceding figure**, and click the *Next* button. + +### Additional Options + +![abp-studio-add-new-microservice-dialog-additional-options-step](images/abp-studio-add-new-microservice-dialog-additional-options-step.png) + +In this step, you can select additional options for the new microservice. You can leave them as default and click the *Create* button. + +That's all, ABP Studio creates the new microservice and arranges all the integration and configuration for you. + +## Exploring the New Ordering Microservice + +In this section, we will investigate the new microservice in overall. + +### Understanding the Solution Structure + +Just like the Catalog microservice, the Ordering microservice is a .NET solution that contains multiple projects. You can see the solution structure in the *Solution Explorer* panel: + +![abp-studio-solution-explorer-ordering-microservice](images/abp-studio-solution-explorer-ordering-microservice.png) + +* `CloudCrm.OrderingService` is the main project that you will implement your service. It typically contains your [entities](../../framework/architecture/domain-driven-design/entities.md), [repositories](../../framework/architecture/domain-driven-design/repositories.md), [application services](../../framework/architecture/domain-driven-design/application-services.md), API controllers, etc. +* `CloudCrm.OrderingService.Contracts` project can be shared with the other services and applications. It typically contains interfaces of your [application services](../../framework/architecture/domain-driven-design/application-services.md), [data transfer objects](../../framework/architecture/domain-driven-design/data-transfer-objects.md), and some other types you may want to share with the clients of this microservice. +* `CloudCrm.OrderingService.Tests` is for building your unit and integration tests for this microservice. + +### Running the New Service + +You can run the solution using ABP Studio's *Solution Runner*. It will also run the new Ordering service as a part of the solution. + +> Before running the solution, **ensure that all the applications are built**. If you are not sure, right-click the root item (`CloudCrm`) in the *Solution Explorer* panel and select the *Build* -> *Graph Build* command. + +Click the *Play* button near to the solution root: + +![abp-studio-run-solution](images/abp-studio-run-solution.png) + +### Browsing the Ordering Service + +After the application is started, you can right-click and [Browse](../../studio/running-applications.md#monitoring) on the `CloudCrm.OrderingService` application to open it in the ABP Studio's pre-integrated browser. You can see the *Orders* controller in the Swagger UI: + +![abp-studio-browse-ordering-service](images/abp-studio-browse-ordering-service.png) + +### Opening the Ordering Database + +You can use the SQL Server Management Studio or any other tool to connect to the Ordering service's database. Use `localhost,1434` as the *Server name*, select the *SQL Server Authentication* as the *Authentication* type, use `sa` as the *Login* name and `myPassw@rd` as the *Password* value. You can find these values in the `appsettings.json` file in the `CloudCrm.OrderingService` project of the .NET solution of the Ordering microservice: + +![sql-server-management-studio-databases-2](images/sql-server-management-studio-databases-2.png) + +Similarly the Ordering service's database has only three initial table. The first one is for Entity Framework Core's migration system, and the others are for ABP's [distributed event bus](../../solution-templates/microservice/distributed-events.md) to properly apply transactional events using the outbox and inbox patterns. You don't need to care about these tables since they are created and managed by Entity Framework Core and ABP. + +## Summary + +In this part, we've created the initial Ordering microservice. We will implement its functionality in the next part. \ No newline at end of file diff --git a/docs/en/tutorials/microservice/part-05.md b/docs/en/tutorials/microservice/part-05.md new file mode 100644 index 0000000000..249cdc8890 --- /dev/null +++ b/docs/en/tutorials/microservice/part-05.md @@ -0,0 +1,430 @@ +# Microservice Tutorial Part 05: Building the Ordering service + +````json +//[doc-nav] +{ + "Previous": { + "Name": "Creating the initial Ordering service", + "Path": "tutorials/microservice/part-04" + }, + "Next": { + "Name": "Integrating the services: HTTP API Calls", + "Path": "tutorials/microservice/part-06" + } +} +```` + +In the previous part, we created the Ordering microservice. In this part, we will implement the functionality of the Ordering microservice manually. We will not use ABP Suite to generate the code. Instead, we will create the necessary code step by step to understand the details better. + +## Creating the Order Entity + +We will start by creating the `Order` entity, which will represent an order in our system. We'll add this entity to the `CloudCrm.OrderingService` project. Create a new folder named `Entities` and add a class named `Order` inside it: + +```csharp +using CloudCrm.OrderingService.Enums; +using Volo.Abp.Domain.Entities.Auditing; + +namespace CloudCrm.OrderingService.Entities; + +public class Order : CreationAuditedAggregateRoot +{ + public Guid ProductId { get; set; } + public string CustomerName { get; set; } + public OrderState State { get; set; } +} +``` + +To keep this example simple, we allow users to include only a single product within an order. The `Order` entity inherits from the [CreationAuditedAggregateRoot<>](../../framework/architecture/domain-driven-design/entities.md) class. This class, provided by the ABP Framework, includes common properties like `Id`, `CreationTime`, `CreatorId`, etc. + +### Adding the OrderState Enum + +We also need to define the `OrderState` enum. In the `CloudCrm.OrderingService.Contracts` project, create a folder named `Enums` and add an `OrderState` enum inside it: + +```csharp +namespace CloudCrm.OrderingService.Enums; + +public enum OrderState : byte +{ + Placed = 0, + Delivered = 1, + Canceled = 2 +} +``` + +The final solution structure should look like this: + +![vs-ordering-entity](images/vs-ordering-entity.png) + +## Configuring the Database Mapping + +First, we need to add the `Order` entity to the `OrderingServiceDbContext` class. Open the `OrderingServiceDbContext` class in the `CloudCrm.OrderingService` project, located in the `Data` folder, and add the following code to the `DbSet` properties: + +```csharp +using CloudCrm.OrderingService.Entities; +using Microsoft.EntityFrameworkCore; +using Volo.Abp.Data; +using Volo.Abp.EntityFrameworkCore; +using Volo.Abp.EntityFrameworkCore.DistributedEvents; +using Volo.Abp.EntityFrameworkCore.Modeling; + +namespace CloudCrm.OrderingService.Data; + +[ConnectionStringName(DatabaseName)] +public class OrderingServiceDbContext : + AbpDbContext, + IHasEventInbox, + IHasEventOutbox +{ + public const string DbTablePrefix = ""; + public const string DbSchema = null; + + public const string DatabaseName = "OrderingService"; + + public DbSet IncomingEvents { get; set; } + public DbSet OutgoingEvents { get; set; } + public DbSet Orders { get; set; } // NEW: ADD DBSET PROPERTY + + // Code omitted for brevity +} +``` + +Next, we need to configure the database mapping for the `Order` entity. We'll use the [EF Core Fluent API](https://docs.microsoft.com/en-us/ef/core/modeling/relational/tables) for this configuration. In the `OrderingServiceDbContext` class add the following code to the `OnModelCreating` method: + +```csharp +protected override void OnModelCreating(ModelBuilder builder) +{ + base.OnModelCreating(builder); + + builder.ConfigureEventInbox(); + builder.ConfigureEventOutbox(); + + builder.Entity(b => + { + // Configure table name + b.ToTable("Orders"); + + // Always call this method to set base entity properties + b.ConfigureByConvention(); + + // Properties of the entity + b.Property(q => q.CustomerName).IsRequired().HasMaxLength(120); + }); +} +``` + +In this code snippet, we configure the `Order` entity to use the `Orders` table in the database. We also specify that the `CustomerName` property is required and has a maximum length of 120 characters. + +### Add a Database Migration + +Now, we can add a new database migration. You can use Entity Framework Core's `Add-Migration` (or `dotnet ef migrations add`) terminal command, but in this tutorial, we will use ABP Studio's shortcut UI. + +Ensure that the solution has built. You can right-click the `CloudCrm.OrderingService` (under the `services` folder) on ABP Studio *Solution Explorer* and select the *Dotnet CLI* -> *Graph Build* command. + +Right-click the `CloudCrm.OrderingService` package and select the *EF Core CLI* -> *Add Migration* command: + +![abp-studio-add-entity-framework-core-migration](images/abp-studio-add-entity-framework-core-migration.png) + +The *Add Migration* command opens a new dialog to get a migration name: + +![abp-studio-entity-framework-core-add-migration-order](images/abp-studio-entity-framework-core-add-migration-order.png) + +Once you click the *OK* button, a new database migration class is added to the `Migrations` folder of the `CloudCrm.OrderingService` project: + +![visual-studio-new-migration-class](images/visual-studio-new-migration-class.png) + +The changes will be applied to the database during the next application startup. For more details, refer to the [database migrations on service startup](../../solution-templates/microservice/database-configurations.md#database-migrations-on-service-startup) section. + +## Creating the Application Service + +Now, we will create the application service to manage the `Order` entity. + +### Defining the Application Service Contract + +First, we need to define the application service contract under the `CloudCrm.OrderingService.Contracts` project. Return to your IDE, open the `CloudCrm.OrderingService` module's .NET solution and create an `IOrderAppService` interface under the `Services` folder for the `CloudCrm.OrderingService.Contracts` project: + +```csharp +using System.Collections.Generic; +using System.Threading.Tasks; +using Volo.Abp.Application.Services; + +namespace CloudCrm.OrderingService.Services; + +public interface IOrderAppService : IApplicationService +{ + Task> GetListAsync(); + Task CreateAsync(OrderCreationDto input); +} +``` + +### Defining the Data Transfer Objects + +Next, we need to define the data transfer objects (DTOs) for the `Order` entity. The `GetListAsync` and `CreateAsync` methods will use these DTOs to communicate with the client applications. + +Create a `OrderCreationDto` class under the `Services` folder in the `CloudCrm.OrderingService.Contracts` project: + +```csharp +using System; +using System.ComponentModel.DataAnnotations; + +namespace CloudCrm.OrderingService.Services; + +public class OrderCreationDto +{ + [Required] + [StringLength(150)] + public string CustomerName { get; set; } + + [Required] + public Guid ProductId { get; set; } +} +``` + +Create a `OrderDto` class under the `Services` folder in the `CloudCrm.OrderingService.Contracts` project: + +```csharp +using System; +using CloudCrm.OrderingService.Enums; + +namespace CloudCrm.OrderingService.Services; + +public class OrderDto +{ + public Guid Id { get; set; } + public string CustomerName { get; set; } + public Guid ProductId { get; set; } + public OrderState State { get; set; } +} +``` + +The final solution structure should look like this: + +![vs-ordering-contracts](images/vs-ordering-contracts.png) + +## Implementing the Application Service + +Now, we will implement the `IOrderAppService` interface in the `OrderAppService` class. Create an `OrderAppService` class under the `Services` folder in the `CloudCrm.OrderingService` project: + +```csharp +using System; +using System.Collections.Generic; +using CloudCrm.OrderingService.Entities; +using CloudCrm.OrderingService.Enums; +using CloudCrm.OrderingService.Localization; +using Volo.Abp.Application.Services; +using Volo.Abp.Domain.Repositories; + +namespace CloudCrm.OrderingService.Services; + +public class OrderAppService : ApplicationService, IOrderAppService +{ + private readonly IRepository _orderRepository; + + public OrderAppService(IRepository orderRepository) + { + LocalizationResource = typeof(OrderingServiceResource); + _orderRepository = orderRepository; + } + + public async Task> GetListAsync() + { + var orders = await _orderRepository.GetListAsync(); + return ObjectMapper.Map, List>(orders); + } + + public async Task CreateAsync(OrderCreationDto input) + { + var order = new Order + { + CustomerName = input.CustomerName, + ProductId = input.ProductId, + State = OrderState.Placed + }; + + await _orderRepository.InsertAsync(order); + } +} +``` + +In this code snippet, we inject the `IRepository` into the `OrderAppService` class. We use this repository to interact with the `Order` entity. The `GetListAsync` method retrieves a list of orders from the database and maps them to the `OrderDto` class. The `CreateAsync` method creates a new order entity and inserts it into the database. + +Afterward, we need to configure the *AutoMapper* object to map the `Order` entity to the `OrderDto` class. Open the `OrderingServiceApplicationAutoMapperProfile` class in the `CloudCrm.OrderingService` project, located in the `ObjectMapping` folder, and add the following code: + +```csharp +using AutoMapper; +using CloudCrm.OrderingService.Entities; +using CloudCrm.OrderingService.Services; + +namespace CloudCrm.OrderingService.ObjectMapping; + +public class OrderingServiceApplicationAutoMapperProfile : Profile +{ + public OrderingServiceApplicationAutoMapperProfile() + { + CreateMap(); + } +} +``` + +## Testing the Application Service + +Now, we can test the `OrderAppService` class using the Swagger UI. Open the Solution Runner and right-click to `CloudCrm.OrderingService` project and select the *Run* -> *Build & Start* command. After the application starts, you can open the Swagger UI by clicking to the [Browse](../../studio/running-applications.md#monitoring) command: + +![ordering-service-swagger-ui](images/ordering-service-swagger-ui.png) + +Expand the `api/ordering/order` API and click the *Try it out* button. Then, create a few orders by filling in the request body and clicking the *Execute* button: + +![ordering-service-order-swagger-ui](images/ordering-service-order-swagger-ui.png) + +If you check the database, you should see the entities created in the `Orders` table: + +![sql-server-orders-database-table-records](images/sql-server-orders-database-table-records.png) + +> Since we're using the [Auto API Controller](../../framework/api-development/auto-controllers.md) we don't need to create a controller for the `OrderAppService`. The ABP Framework automatically creates an API controller for the `OrderAppService` class. You can find the configuration in the `CloudCrmOrderingServiceModule` class, in the `ConfigureAutoControllers` method of the `CloudCrm.OrderingService` project. + +## Creating the User Interface + +Now, we will create the user interface for the Ordering module. We will use the `CloudCrm.Web` project to create the user interface. Open the `CloudCrm.Web` .NET solution in your favorite IDE. + +### Creating the Orders Page + +Create a new `Orders` folder under the `Pages` folder in the `CloudCrm.Web` project. Then, create an `Index.cshtml` Razor Page inside that new folder and edit the `Index.cshtml.cs` file as follows: + +```csharp +using CloudCrm.OrderingService.Services; +using Microsoft.AspNetCore.Mvc.RazorPages; +using Volo.Abp.AspNetCore.Mvc.UI.RazorPages; + +namespace CloudCrm.Web.Pages.Orders; + +public class Index : AbpPageModel +{ + public List Orders { get; set; } + + private readonly IOrderAppService _orderAppService; + + public Index(IOrderAppService orderAppService) + { + _orderAppService = orderAppService; + } + + public async Task OnGetAsync() + { + Orders = await _orderAppService.GetListAsync(); + } +} +``` + +Here, we inject the `IOrderAppService` into the `Index` Razor Page. We use this service to retrieve the list of orders from the database and assign them to the `Orders` property. Open the `Index.cshtml` file and add the following code: + +```html +@page +@model CloudCrm.Web.Pages.Orders.Index + +

Orders

+ + + + + @foreach (var order in Model.Orders) + { + + Customer: @order.CustomerName
+ Product: @order.ProductId
+ State: @order.State +
+ } +
+
+
+``` + +This page shows a list of orders on the UI. We haven't created a UI to create new orders, and we will not do it to keep this tutorial simple. If you want to learn how to create advanced UIs with ABP, please follow the [Book Store tutorial](../../tutorials/book-store/index.md). + +### Generating the UI Proxy + +To select the *Application* during proxy generation, ensure that the `CloudCrm.OrderingService` is *Started* beforehand. You can start the application using [Solution Runner](../../studio/running-applications.md). + +Now, we need to generate the [Static API Proxy](../../framework/api-development/static-csharp-clients.md) for the *Web* project. Right-click the *CloudCrm.Web* [package](../../studio/concepts.md#package) and select the *ABP CLI* -> *Generate Proxy* -> *C#* command: + +![abp-studio-generate-proxy-2](images/abp-studio-generate-proxy-2.png) + +It will open the *Generate C# Proxies* window. Select the `CloudCrm.OrderingService` application, and it will automatically populate the *URL* field. Choose the *ordering* module and service type is *application* lastly check the *Without contracts* checkbox, since we already have a dependency on the `CloudCrm.OrderingService.Contracts` package in the `CloudCrm.Web` project: + +![abp-studio-generate-proxy-window-ordering-module](images/abp-studio-generate-proxy-window-ordering-module.png) + +Lastly, we need to configure the use of a static HTTP client for the `OrderingService` in the `CloudCrm.Web` project. Open the `CloudCrmWebModule.cs` file in the `Web` project and add the following line to the `ConfigureServices` method: + +```csharp +//... +using CloudCrm.OrderingService; + +public override void ConfigureServices(ServiceConfigurationContext context) +{ + // Code omitted for brevity + context.Services.AddStaticHttpClientProxies( + typeof(CloudCrmOrderingServiceContractsModule).Assembly); +} +``` + +### Adding the Menu Item + +> ABP provides a modular navigation [menu system](../../framework/ui/mvc-razor-pages/navigation-menu.md) that allows you to define the menu items in a modular way. + +Finally, we need to add a menu item to the sidebar to navigate to the `Orders` page. Open the `CloudCrmMenus` file in the `Navigation` folder of the `CloudCrm.Web` project and edit with the following code: + +```csharp +namespace CloudCrm.Web.Navigation; + +public class CloudCrmMenus +{ + private const string Prefix = "CloudCrm"; + + public const string Home = Prefix + ".Home"; + + public const string HostDashboard = Prefix + ".HostDashboard"; + + public const string TenantDashboard = Prefix + ".TenantDashboard"; + + public const string Products = Prefix + ".Products"; + + public const string Orders = Prefix + ".Orders"; // NEW: ADD MENU ITEM +} +``` + +Then, open the `CloudCrmMenuContributor` class in the `CloudCrm.Web` project, located in the `Navigation` folder, and add the following code to `ConfigureMainMenuAsync` method: + +```csharp +private static async Task ConfigureMainMenuAsync(MenuConfigurationContext context) +{ + // Code omitted for brevity + + context.Menu.AddItem( + new ApplicationMenuItem( + CloudCrmMenus.Orders, // Unique menu id + "Orders", // Menu display text + "~/Orders", // URL + "fa-solid fa-basket-shopping" // Icon CSS class + ) + ); +} +``` + +## Building and Running the Application + +Now, we can build and run the application to see the changes. Please stop the applications if they are running. Then open the *Solution Runner* panel, right-click the `CloudCrm` root item, and select the *Run* -> *Build & Start* command: + +![abp-studio-run-build-start](images/abp-studio-run-build-start.png) + +After the applications are started, you can *Browse* and navigate to the `Orders` page to see the list of orders: + +![web-orders-page](images/web-orders-page.png) + +Great! We have successfully implemented the Ordering module. However, there is a problem: + +- We see Product's GUID ID instead of its name. This is because the *Ordering* microservice has no integration with the *Catalog* microservice and doesn't have access to Product microservice's database to perform a JOIN query. + +We will solve this problem in the next part by implementing an integration service between the *Ordering* and *Catalog* microservices. + +## Summary + +In this part, we implemented the Ordering module manually. We created the `Order` entity, the `OrderState` enum, the `OrderAppService` application service, and the user interface for the `Orders` page. We also added a menu item to the sidebar to navigate to the `Orders` page. \ No newline at end of file diff --git a/docs/en/tutorials/microservice/part-06.md b/docs/en/tutorials/microservice/part-06.md new file mode 100644 index 0000000000..f171767260 --- /dev/null +++ b/docs/en/tutorials/microservice/part-06.md @@ -0,0 +1,311 @@ +# Microservice Tutorial Part 06: Integrating the services: HTTP API Calls + +````json +//[doc-nav] +{ + "Previous": { + "Name": "Building the Ordering service", + "Path": "tutorials/microservice/part-05" + }, + "Next": { + "Name": "Integrating the services: Using Distributed Events", + "Path": "tutorials/microservice/part-07" + } +} +```` + +In the previous part, we implemented the functionality of the Ordering microservice. However, when listing orders, we need to display the product name instead of the product ID. To achieve this, we must call the Catalog service to retrieve the product name for each order item. + +In this section, we will integrate the Ordering service with the Catalog service using HTTP API calls. + +## The Need for the Integration Services + +In a microservices architecture, each service is responsible for its own data and business logic. However, services often need to communicate with each other to fulfill their responsibilities. This communication can be synchronous or asynchronous, depending on the requirements. + +![web-orders-page](images/web-orders-page.png) + +In our case, the Ordering service needs to display the product name instead of the product ID. To achieve this, we need to call the Catalog service to retrieve the product details based on the product ID. This is a typical example of a synchronous communication pattern between microservices. As a solution to that problem, we will use an [integration service](../../framework/api-development/integration-services.md) that will handle the communication with the Catalog service. Integration service concept in ABP is designed for request/response style inter-module (in modular applications) and inter-microservice (in distributed systems) communication. + +## Creating a Products Integration Service + +First, we need to create a service that will handle the communication with the Catalog service. This service will be responsible for fetching the product details based on the product ID. + +### Defining the `IProductIntegrationService` Interface + +Open the `CloudCrm.CatalogService` .NET solution in your IDE. Locate the `CloudCrm.CatalogService.Contracts` project, and create a new folder named `IntegrationServices`. Inside this folder, add a new interface named `IProductIntegrationService` with the following code: + +```csharp +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using CloudCrm.CatalogService.Products; +using Volo.Abp; +using Volo.Abp.Application.Services; + +namespace CloudCrm.CatalogService.IntegrationServices; + +[IntegrationService] +public interface IProductIntegrationService : IApplicationService +{ + Task> GetProductsByIdsAsync(List ids); +} +``` + +`IProductIntegrationService` is very similar to a typical [application service](../../framework/architecture/domain-driven-design/application-services.md). The only difference is that it is marked with the `[IntegrationService]` attribute. This attribute is used to identify the service as an integration service, which allows ABP to handle the communication between services. ABP behave differently for them (for example, ABP doesn't expose [integration services](../../framework/api-development/integration-services.md) as HTTP APIs by default if you've configured the [Auto API Controllers](../../framework/api-development/auto-controllers.md) feature) + +`IProductIntegrationService` contains a single method named `GetProductsByIdsAsync`. This method takes a list of product IDs and returns a list of `ProductDto` objects. This is exactly what we need in the Ordering service. + +> **Design Tip** +> +> You may think if we can use the existing application services (like `IProductAppService`) from other services instead of creating specific integration services. Technically you can use, ABP has no restriction. However, from good design and best practice points, we don't suggest it. Because, application services are designed to be consumed specifically by the presentation layer. They will have different authorization and validation logic, they will need different DTO input and output properties, they will have different performance, optimization and caching requirements, and so on. And most importantly, all these will change by the time based on UI requirements and these changes may break your integrations later. It is best to implement specific integration APIs that is designed and optimized for that purpose. +> +> We've reused the `ProductDto` object created for `IProductAppService`, which can be reasonable from a maintenance point of view. But if you think your integration service results will be different from the application service results in the future, it can be good to separate them from the first day so you don't need to introduce breaking changes later. + +### Implementing the `ProductIntegrationService` Class + +Now, let's implement the `IProductIntegrationService` interface. Create a new folder named `IntegrationServices` in the `CloudCrm.CatalogService` project. Inside this folder, add a new class named `ProductIntegrationService` with the following code: + +```csharp +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using CloudCrm.CatalogService.Localization; +using CloudCrm.CatalogService.Products; +using Volo.Abp; +using Volo.Abp.Application.Services; +using Volo.Abp.Domain.Repositories; + +namespace CloudCrm.CatalogService.IntegrationServices; + +[IntegrationService] +public class ProductIntegrationService : ApplicationService, IProductIntegrationService +{ + private readonly IRepository _productRepository; + + public ProductIntegrationService(IRepository productRepository) + { + LocalizationResource = typeof(CatalogServiceResource); + _productRepository = productRepository; + } + + public async Task> GetProductsByIdsAsync(List ids) + { + var products = await _productRepository.GetListAsync( + product => ids.Contains(product.Id) + ); + + return ObjectMapper.Map, List>(products); + } +} +``` + +`ProductIntegrationService` is a typical application service class that implements the `IProductIntegrationService` interface. It has a constructor that takes an `IRepository` object. This repository is used to fetch the product details from the database. + +> Here, we directly used `List` classes, but instead, you could wrap inputs and outputs into [DTOs](../../framework/architecture/domain-driven-design/data-transfer-objects.md). In that way, it can be possible to add new properties to these DTOs without changing the signature of your integration service method (and without introducing breaking changes for your client applications). + +### Exposing the Integration Service as an API + +Integration services are not exposed as HTTP APIs by default. However, you can expose them as HTTP APIs if you need to. To do this, you should configure the `AbpAspNetCoreMvcOptions` in the `ConfigureServices` method of the `CloudCrmCatalogServiceModule`. Open the `CloudCrm.CatalogService` project and locate the `CloudCrmCatalogServiceModule` class. Add the following code to the `ConfigureServices` method: + +```csharp +public override void ConfigureServices(ServiceConfigurationContext context) +{ + // Other configurations... + + Configure(options => + { + options.ExposeIntegrationServices = true; + }); +} +``` + +This code configures the `AbpAspNetCoreMvcOptions` to expose integration services as HTTP APIs. This is useful when you need to call the integration service from a different service using HTTP. You can learn more about this in the [Integration Services](../../framework/api-development/integration-services.md#exposing-integration-services) document. + +## Consuming the Products Integration Service + +Now that we have created the `IProductIntegrationService` interface and the `ProductIntegrationService` class, we can consume this service from the Ordering service. + +### Adding a Reference to the `CloudCrm.CatalogService.Contracts` Package + +First, we need to add a reference to the `CloudCrm.CatalogService.Contracts` package in the Ordering service. Open the ABP Studio, and stop the application(s) if it is running. Then, open the *Solution Explorer* and right-click on the `CloudCrm.OrderingService` package. Select *Add* -> *Package Reference* command: + +![add-package-reference-ordering-service](images/add-package-reference-ordering-service.png) + +In the *Add Package Reference* window, select the `CloudCrm.CatalogService.Contracts` package from the *This solution* tab. Click the *OK* button to add the reference: + +![add-catalog-service-contracts-reference](images/add-catalog-service-contracts-reference.png) + +ABP Studio adds the package reference and arranges the [module](../../framework/architecture/modularity/basics.md) dependency. + +> Instead of directly adding such a package reference, it can be best to import the module first (right-click the `CloudCrm.OrderingService`, select the _Import Module_ command and import the `CloudCrm.CatalogService` module), then install the package reference. In that way, it would be easy to see and keep track of inter-module dependencies. + +### Using the Products Integration Service + +Now, we can use the `IProductIntegrationService` interface to fetch the product details in the `OrderAppService` class. + +Open the `OrderAppService` class (the `OrderAppService.cs` file under the `Services` folder of the `CloudCrm.OrderingService` project of the `CloudCrm.OrderingService` .NET solution) and change its content as like the following code block: + +```csharp +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using CloudCrm.CatalogService.IntegrationServices; +using CloudCrm.OrderingService.Entities; +using CloudCrm.OrderingService.Enums; +using CloudCrm.OrderingService.Localization; +using Volo.Abp.Application.Services; +using Volo.Abp.Domain.Repositories; + +namespace CloudCrm.OrderingService.Services; + +public class OrderAppService : ApplicationService, IOrderAppService +{ + private readonly IRepository _orderRepository; + private readonly IProductIntegrationService _productIntegrationService; + + public OrderAppService( + IRepository orderRepository, + IProductIntegrationService productIntegrationService) + { + LocalizationResource = typeof(OrderingServiceResource); + + _orderRepository = orderRepository; + _productIntegrationService = productIntegrationService; + } + + public async Task> GetListAsync() + { + var orders = await _orderRepository.GetListAsync(); + + // Prepare a list of products we need + var productIds = orders.Select(o => o.ProductId).Distinct().ToList(); + var products = (await _productIntegrationService + .GetProductsByIdsAsync(productIds)) + .ToDictionary(p => p.Id, p => p.Name); + + var orderDtos = ObjectMapper.Map, List>(orders); + + orderDtos.ForEach(orderDto => + { + orderDto.ProductName = products[orderDto.ProductId]; + }); + + return orderDtos; + } + + public async Task CreateAsync(OrderCreationDto input) + { + var order = new Order + { + CustomerName = input.CustomerName, + ProductId = input.ProductId, + State = OrderState.Placed + }; + + await _orderRepository.InsertAsync(order); + } +} +``` + +Now open the `OrderDto` class (the `OrderDto.cs` file under the `Services` folder of the `CloudCrm.OrderingService.Contracts` project of the `CloudCrm.OrderingService` .NET solution) and add a new property named `ProductName`: + +```csharp +using System; +using CloudCrm.OrderingService.Enums; + +namespace CloudCrm.OrderingService.Services; + +public class OrderDto +{ + public Guid Id { get; set; } + public string CustomerName { get; set; } + public Guid ProductId { get; set; } + public string ProductName { get; set; } // New property + public OrderState State { get; set; } +} +``` + +Lastly, open the `OrderingServiceApplicationAutoMapperProfile` class (the `OrderingServiceApplicationAutoMapperProfile.cs` file under the `ObjectMapping` folder of the `CloudCrm.OrderingService` project of the `CloudCrm.OrderingService` .NET solution) and ignore the `ProductName` property in the mapping configuration: + +```csharp +using AutoMapper; +using CloudCrm.OrderingService.Entities; +using CloudCrm.OrderingService.Services; +using Volo.Abp.AutoMapper; + +namespace CloudCrm.OrderingService.ObjectMapping; + +public class OrderingServiceApplicationAutoMapperProfile : Profile +{ + public OrderingServiceApplicationAutoMapperProfile() + { + CreateMap() + .Ignore(x => x.ProductName); // New line + } +} +``` +Let's explain the changes we made: + +- We added a new property named `ProductName` to the `OrderDto` class. This property will hold the product name. +- We modified the `GetListAsync` method of the `OrderAppService` class to fetch the product details using the `IProductIntegrationService` interface. We first fetch the product IDs from the orders, then call the `GetProductsByIdsAsync` method of the `IProductIntegrationService` interface to fetch the product details. Finally, we map the product names to the `OrderDto` objects. + +### Generating Proxy Classes for the Integration Service + +We have created the `IProductIntegrationService` interface and the `ProductIntegrationService` class in the `CloudCrm.CatalogService` solution. Now, we need to generate the proxy classes for the integration service in the `CloudCrm.OrderingService` package. First, *Build & Start* the `CloudCrm.CatalogService` application in ABP Studio *Solution Runner*. Then, open the *Solution Explorer* and right-click on the `CloudCrm.OrderingService` package. Select the *ABP CLI* -> *Generate Proxy* -> *C#* command: + +![generate-proxy-catalog-service](images/generate-proxy-catalog-service.png) + +It opens the *Generate C# proxies* window. Select the `CloudCrm.CatalogService` application from the *Application* dropdown list. Then, choose the *catalog* module from the *Module* dropdown list and choose the *integration* service from the *Service type* dropdown list. Check the *Without contracts* checkbox and click the *Generate* button: + +![generate-catalog-service-proxy](images/generate-catalog-service-proxy.png) + +We have generated the proxy classes for the `IProductIntegrationService` interface. Now, we must add the *Remote Service* url to the `appsettings.json` file of the `CloudCrm.OrderingService` project. Open the `appsettings.json` file (the `appsettings.json` file of the `CloudCrm.OrderingService` project of the `CloudCrm.OrderingService` .NET solution) and add the *CatalogService* section following configuration: + +```json +{ + "RemoteServices": { + "CatalogService": { + "BaseUrl": "http://localhost:44334" + } + } +} +``` + +> **BaseUrl** refers to the base URL of the Catalog service. You can use the *Copy Url* option from the Catalog service's context menu in the ABP Studio **Solution Runner** to paste it here. + +### Updating the UI to Display the Product Name + +Open the `Index.cshtml` file (the `Index.cshtml` file under the `Pages/Orders` folder of the `CloudCrm.Web` project of the `CloudCrm.Web` .NET solution) and update the table content to display the product name instead of the product ID: + +```html +@page +@model CloudCrm.Web.Pages.Orders.Index + +

Orders

+ + + + + @foreach (var order in Model.Orders) + { + + Customer: @order.CustomerName
+ Product: @order.ProductName
+ State: @order.State +
+ } +
+
+
+``` + +That's it! Now, you can *Build & Start* the all applications and run it in ABP Studio to see the result: + +![web-orders-page-with-product-name](images/web-orders-page-with-product-name.png) + +Now, the Ordering service displays the product name instead of the product ID. We have successfully integrated the Ordering service with the Catalog service using HTTP API calls. + +> **Design Tip** +> +> It is suggested that you keep that type of communication to a minimum and not couple your services with each other. It can make your solution complicated and may also decrease your system performance. When you need to do it, think about performance and try to make some optimizations. For example, if the Ordering service frequently needs product data, you can use a kind of [cache layer](../../framework/fundamentals/caching.md), so it doesn't make frequent requests to the Catalog service. diff --git a/docs/en/tutorials/microservice/part-07.md b/docs/en/tutorials/microservice/part-07.md new file mode 100644 index 0000000000..0351df2a52 --- /dev/null +++ b/docs/en/tutorials/microservice/part-07.md @@ -0,0 +1,231 @@ +# Microservice Tutorial Part 07: Integrating the services: Using Distributed Events + +````json +//[doc-nav] +{ + "Previous": { + "Name": "Integrating the services: HTTP API Calls", + "Path": "tutorials/microservice/part-06" + } +} +```` + +Another common approach to communicating between microservices is messaging. By publishing and handling messages, a microservice can perform an operation when an event happens in another microservice. + +ABP provides two types of event buses for loosely coupled communication: + +* [Local Event Bus](../../framework/infrastructure/event-bus/local/index.md) is suitable for in-process messaging. However, it’s not suitable for microservices as it cannot communicate across different processes. For distributed systems, consider using a distributed event bus. + +* **[Distributed Event Bus](../../framework/infrastructure/event-bus/distributed/index.md)** is normal for inter-process messaging, like microservices, for publishing and subscribing to distributed events. However, ABP's distributed event bus works as local (in-process) by default (actually, it uses the Local Event Bus under the hood by default) unless you configure an external message broker. + +In this tutorial, we will use the distributed event bus to communicate between the `Order` and `Catalog` microservices. + +## Publishing an Event + +In the example scenario, we want to publish an event when a new order is placed. The Ordering service will publish the event since it knows when a new order is placed. The Catalog service will subscribe to that event and get notified when a new order is placed. This will decrease the stock count of the product related to the new order. The scenario is pretty simple; let's implement it. + +### Defining the Event Class + +Open the `CloudCrm.OrderingService` .NET solution in your IDE, create an `Events` folder and create a new class named `OrderPlacedEto` under the `CloudCrm.OrderingService.Contracts` project: + +```csharp +using System; + +namespace CloudCrm.OrderingService.Events; + +public class OrderPlacedEto +{ + public string CustomerName { get; set; } + public Guid ProductId { get; set; } +} +``` + +`OrderPlacedEto` is very simple. It is a plain C# class used to transfer data related to the event (*ETO* is an acronym for *Event Transfer Object*, a suggested naming convention but not required). You can add more properties if needed, but for this tutorial, it is more than enough. + +### Using the `IDistributedEventBus` Service + +The `IDistributedEventBus` service publishes events to the event bus. Until this point, the Ordering service only creates an Order and insert to database. Let's change that and publish `OrderPlacedEto` event, for that purpose open the `CloudCrm.OrderingService` project and update to the `OrderAppService` class as shown below: + +```csharp +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using CloudCrm.CatalogService.IntegrationServices; +using CloudCrm.OrderingService.Entities; +using CloudCrm.OrderingService.Enums; +using CloudCrm.OrderingService.Events; +using CloudCrm.OrderingService.Localization; +using Volo.Abp.Application.Services; +using Volo.Abp.Domain.Repositories; +using Volo.Abp.EventBus.Distributed; + +namespace CloudCrm.OrderingService.Services; + +public class OrderAppService : ApplicationService, IOrderAppService +{ + private readonly IRepository _orderRepository; + private readonly IProductIntegrationService _productIntegrationService; + private readonly IDistributedEventBus _distributedEventBus; + + public OrderAppService( + IRepository orderRepository, + IProductIntegrationService productIntegrationService, + IDistributedEventBus distributedEventBus) + { + LocalizationResource = typeof(OrderingServiceResource); + + _orderRepository = orderRepository; + _productIntegrationService = productIntegrationService; + _distributedEventBus = distributedEventBus; + } + + public async Task> GetListAsync() + { + var orders = await _orderRepository.GetListAsync(); + + // Prepare a list of products we need + var productIds = orders.Select(o => o.ProductId).Distinct().ToList(); + var products = (await _productIntegrationService + .GetProductsByIdsAsync(productIds)) + .ToDictionary(p => p.Id, p => p.Name); + + var orderDtos = ObjectMapper.Map, List>(orders); + + orderDtos.ForEach(orderDto => + { + orderDto.ProductName = products[orderDto.ProductId]; + }); + + return orderDtos; + } + + public async Task CreateAsync(OrderCreationDto input) + { + // Create a new Order entity + var order = new Order + { + CustomerName = input.CustomerName, + ProductId = input.ProductId, + State = OrderState.Placed + }; + + // Save it to the database + await _orderRepository.InsertAsync(order); + + // Publish an event so other microservices can be informed + await _distributedEventBus.PublishAsync( + new OrderPlacedEto + { + ProductId = order.ProductId, + CustomerName = order.CustomerName + }); + } +} +``` +The `OrderAppService.CreateAsync` method creates a new `Order` entity, saves it to the database and finally publishes an `OrderPlacedEto` event. + +## Subscribing to an Event + +The Catalog service will subscribe to the `OrderPlacedEto` event and decrease the stock count of the product related to the new order. Let's implement it. + +### Adding a Reference to the `CloudCrm.OrderingService.Contracts` Package + +Since the `OrderPlacedEto` class is in the `CloudCrm.OrderingService.Contracts` project, we must add that package's reference to the Catalog service. This time, we will use the Import Module feature of ABP Studio (as an alternative to the approach we used in the Adding a Reference to the `CloudCrm.CatalogService.Contracts` Package section of the [previous part](./part-06.md#adding-a-reference-to-the-cloudcrmcatalogservicecontracts-package)). + +Open the ABP Studio UI and stop the applications if they are running. Then, open the *Solution Explorer* panel and right-click on the `CloudCrm.CatalogService`. Select *Import Module* from the context menu: + +![Import Module](images/import-module.png) + +In the opening dialog, find and select the `CloudCrm.OrderingService` module, check the *Install this module* option, click the *OK* button: + +![Import Module Dialog](images/import-module-dialog.png) + +Once you click the OK button, the Ordering service is imported to the Catalog service. It opens the *Install Module* dialog: + +![Install Module Dialog](images/install-module-dialog.png) + +Here, select the `CloudCrm.OrderingService.Contracts` package on the left side (because we want to add that package reference) and `CloudCrm.CatalogService` package on the middle area (because we want to add the package reference to that project). + +You can check the ABP Studio's *Solution Explorer* panel to see the module and the project reference (dependency): + +![catalog-service-dependency](images/catalog-service-dependency.png) + +### Handling the `OrderPlacedEto` Event + +Now, it's time to handle the `OrderPlacedEto` event in the Catalog service. Open the `CloudCrm.CatalogService` .NET solution in your IDE. Create a new `Orders` folder, and add a new class named `OrderEventHandler` inside that folder within the `CloudCrm.CatalogService` project: + +```csharp +using System; +using System.Threading.Tasks; +using CloudCrm.CatalogService.Products; +using CloudCrm.OrderingService.Events; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Domain.Repositories; +using Volo.Abp.EventBus.Distributed; + +namespace CloudCrm.CatalogService.Orders; + +public class OrderEventHandler : + IDistributedEventHandler, + ITransientDependency +{ + private readonly IRepository _productRepository; + + public OrderEventHandler(IRepository productRepository) + { + _productRepository = productRepository; + } + + public async Task HandleEventAsync(OrderPlacedEto eventData) + { + // Find the related product + var product = await _productRepository.FindAsync(eventData.ProductId); + if (product == null) + { + return; + } + + // Decrease the stock count + product.StockCount = product.StockCount - 1; + + // Update the entity in the database + await _productRepository.UpdateAsync(product); + } +} +``` + +The `OrderEventHandler` class implements the `IDistributedEventHandler` interface to handle the `OrderPlacedEto` event. When the event is published, the `HandleEventAsync` method is called. In this method, we find the related product, decrease the stock count by one, and update the entity in the database. + +Implementing `ITransientDependency` registers the `OrderEventHandler` class to the dependency injection system as a transient object. + +### Testing the Order Creation + +To keep this tutorial simple, we will not implement a user interface for creating orders. Instead, we will use the Swagger UI to create an order. Open the *Solution Runner* panel in ABP Studio and use *Build & Start* to launch the `CloudCrm.OrderingService` and `CloudCrm.CatalogService` applications. Then, go to *Run* -> *Start All* to start the remaining applications listed in the [Solution Runner root item](../../studio/running-applications.md#run). + +Once the application is running and ready, [Browse](../../studio/running-applications.md#c-application) the `CloudCrm.OrderingService` application. Use the `POST /api/ordering/order` endpoint to create a new order: + +![Create Order](images/create-order.png) + +Find the *Order* API, click the *Try it out* button, enter a sample value the *Request body* section, and click the *Execute* button: + +```json +{ + "customerName": "David", + "productId": "5995897b-1de9-7272-b31c-3a165bbe7b18" +} +``` + +> **IMPORTANT:** Here, you should type a valid Product Id from the Products table of your database! + +Once you press the *Execute* button, a new order is created. At that point, you can check the `/Orders` page to see if the new order is listed. You can also check the `/Products` page to see if the stock count of the related product is decreased by one in the `CloudCrm.Web` application. + +Here are sample screenshots from the Orders and Products pages of the `CloudCrm.Web` application: + +![Orders](images/orders.png) + +We placed a new order for *Product A*. As a result, the stock count of *Product A* is decreased from 53 to 52 and a new line is added to the Orders page. + +## Conclusion + +In this tutorial, we used the distributed event bus to communicate between the `Order` and `Catalog` microservices. We published an event when a new order is placed and handled that event in the Catalog service to decrease the stock count of the related product. This is a simple example, but it shows how you can use distributed events to communicate between microservices. \ No newline at end of file diff --git a/docs/en/tutorials/modular-crm/part-01.md b/docs/en/tutorials/modular-crm/part-01.md index 61698fb48a..316aff6150 100644 --- a/docs/en/tutorials/modular-crm/part-01.md +++ b/docs/en/tutorials/modular-crm/part-01.md @@ -10,7 +10,7 @@ } ```` -Follow the *[Get Stared](../../get-started/layered-web-application.md)* guide to create a new layered web application with the following configuration: +Follow the *[Get Started](../../get-started/layered-web-application.md)* guide to create a new layered web application with the following configuration: * **Solution name**: `ModularCrm` * **UI Framework**: ASP.NET Core MVC / Razor Pages @@ -34,4 +34,4 @@ Initially, you see a `ModularCrm` solution and a `ModularCrm` module under that ## Summary -We've created the initial layered monolith solution. In the next part, we will learn how to create a new application module and install it to the main application. \ No newline at end of file +We've created the initial layered monolith solution. In the next part, we will learn how to create a new application module and install it to the main application. diff --git a/docs/en/tutorials/modular-crm/part-02.md b/docs/en/tutorials/modular-crm/part-02.md index 6ebc22f20c..8a5b4b9e6c 100644 --- a/docs/en/tutorials/modular-crm/part-02.md +++ b/docs/en/tutorials/modular-crm/part-02.md @@ -14,7 +14,7 @@ } ```` -In this part, you will build a new product management module and install it in the main CRM application. +In this part, you will create a new product management module and install it in the main CRM application. ## Creating Solution Folders diff --git a/docs/en/tutorials/todo/layered/index.md b/docs/en/tutorials/todo/layered/index.md index 2eef34bbd2..a679bacac5 100644 --- a/docs/en/tutorials/todo/layered/index.md +++ b/docs/en/tutorials/todo/layered/index.md @@ -52,8 +52,8 @@ This documentation has a video tutorial on **YouTube**!! You can watch it here: ## Pre-Requirements -* An IDE (e.g. [Visual Studio](https://visualstudio.microsoft.com/vs/)) that supports [.NET 8.0+](https://dotnet.microsoft.com/download/dotnet) development. -* [Node v18.19+](https://nodejs.org/) +* An IDE (e.g. [Visual Studio](https://visualstudio.microsoft.com/vs/)) that supports [.NET 9.0+](https://dotnet.microsoft.com/download/dotnet) development. +* [Node v20.11+](https://nodejs.org/) {{if DB=="Mongo"}} @@ -74,7 +74,7 @@ dotnet tool install -g Volo.Abp.Studio.Cli Create an empty folder, open a command-line terminal and execute the following command in the terminal: ````bash -abp new TodoApp{{if UI=="Blazor"}} -u blazor{{else if UI=="BlazorServer"}} -u blazor-server{{else if UI=="NG"}} -u angular{{end}}{{if DB=="Mongo"}} -d mongodb{{end}} +abp new TodoApp{{if UI=="Blazor"}} -u blazor{{else if UI=="BlazorServer"}} -u blazor-server{{else if UI=="BlazorWebApp"}} -u blazor-webapp{{else if UI=="NG"}} -u angular{{end}}{{if DB=="Mongo"}} -d mongodb{{end}} ```` {{if UI=="NG"}} @@ -111,15 +111,16 @@ For such cases, run the `abp install-libs` command on the root directory of your abp install-libs ```` -> We suggest you install [Yarn](https://classic.yarnpkg.com/) to prevent possible package inconsistencies, if you haven't installed it yet. +> 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"}} +{{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/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 application: +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 @@ -131,7 +132,7 @@ abp bundle ### Run the Application -{{if UI=="MVC" || UI=="BlazorServer"}} +{{if UI=="MVC" || UI=="BlazorServer" || UI=="BlazorWebApp"}} It is good to run the application before starting the development. Ensure the {{if UI=="BlazorServer"}}`TodoApp.Blazor`{{else}}`TodoApp.Web`{{end}} project is the startup project, then run the application (Ctrl+F5 in Visual Studio) to see the initial UI: @@ -148,10 +149,6 @@ Ensure the `TodoApp.HttpApi.Host` project is the startup project, then run the a You can explore and test your HTTP API with this UI. Now, we can set the `TodoApp.Blazor` as the startup project and run it to open the actual Blazor application UI: -{{else if UI=="BlazorWebApp" }} - -It is good to run the application before starting the development. Ensure the `TodoApp.Blazor` project is the startup project, then run the application (Ctrl+F5 in Visual Studio) to see the initial UI: - {{else if UI=="NG"}} It is good to run the application before starting the development. The solution has two main applications: @@ -589,7 +586,7 @@ If you open the [Swagger UI](https://swagger.io/tools/swagger-ui/) by entering t ### Index.razor.cs -Open the `Index.razor.cs` file in the `Pages` folder of the {{if UI=="BlazorWebApp"}} *TodoApp.Blazor.Client* {{else}}*TodoApp.Blazor*{{end}} project and replace the content with the following code block: +Open the `Index.razor.cs` file in the `Pages` folder of the {{if UI=="Blazor" || UI=="BlazorWebApp"}} *TodoApp.Blazor.Client* {{else}}*TodoApp.Blazor*{{end}} project and replace the content with the following code block: ```csharp using Microsoft.AspNetCore.Components; @@ -638,7 +635,7 @@ See the *Dynamic C# Proxies & Auto API Controllers* section below to learn how w ### Index.razor -Open the `Index.razor` file in the `Pages` folder of the {{if UI=="BlazorWebApp"}} *TodoApp.Blazor.Client* {{else}} *TodoApp.Blazor* {{end}} project and replace the content with the following code block: +Open the `Index.razor` file in the `Pages` folder of the {{if UI=="Blazor" || UI=="BlazorWebApp"}} *TodoApp.Blazor.Client* {{else}} *TodoApp.Blazor* {{end}} project and replace the content with the following code block: ```xml @page "/" @@ -680,7 +677,7 @@ Open the `Index.razor` file in the `Pages` folder of the {{if UI=="BlazorWebApp" ### Index.razor.css -As the final touch, open the `Index.razor.css` file in the `Pages` folder of the {{if UI=="BlazorWebApp"}}*TodoApp.Blazor.Client*{{else}}*TodoApp.Blazor*{{end}} project and replace it with the following content: +As the final touch, open the `Index.razor.css` file in the `Pages` folder of the {{if UI=="Blazor" || UI=="BlazorWebApp"}}*TodoApp.Blazor.Client*{{else}}*TodoApp.Blazor*{{end}} project and replace it with the following content: ```css #TodoList{ diff --git a/docs/en/tutorials/todo/single-layer/index.md b/docs/en/tutorials/todo/single-layer/index.md index 3b4f755c70..c96c3715ef 100644 --- a/docs/en/tutorials/todo/single-layer/index.md +++ b/docs/en/tutorials/todo/single-layer/index.md @@ -48,8 +48,8 @@ This documentation has a video tutorial on **YouTube**!! You can watch it here: ## Pre-Requirements -* An IDE (e.g. [Visual Studio](https://visualstudio.microsoft.com/vs/)) that supports [.NET 8.0+](https://dotnet.microsoft.com/download/dotnet) development. -* [Node v18.19+](https://nodejs.org/) +* An IDE (e.g. [Visual Studio](https://visualstudio.microsoft.com/vs/)) that supports [.NET 9.0+](https://dotnet.microsoft.com/download/dotnet) development. +* [Node v20.11+](https://nodejs.org/) {{if DB=="Mongo"}} @@ -113,7 +113,7 @@ Run the `abp install-libs` command on the root directory of your solution to ins abp install-libs ``` -> We suggest you install [Yarn](https://classic.yarnpkg.com/) to prevent possible package inconsistencies, if you haven't installed it yet. +> 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"}} diff --git a/docs/en/ui-themes/lepton-x/blazor.md b/docs/en/ui-themes/lepton-x/blazor.md index ef7ad683fb..78e0dc433d 100644 --- a/docs/en/ui-themes/lepton-x/blazor.md +++ b/docs/en/ui-themes/lepton-x/blazor.md @@ -262,7 +262,7 @@ If you need to replace the component, you can follow the steps below. * Create a razor page, like `MyBreadcrumbs.razor`, in your blazor application as shown below: ```html -@Volo.Abp.AspNetCore.Components.Web.LeptonXTheme.Components.ApplicationLayout.Common; +@using Volo.Abp.AspNetCore.Components.Web.LeptonXTheme.Components.ApplicationLayout.Common; @using Volo.Abp.DependencyInjection @inherits Breadcrumbs @@ -295,7 +295,7 @@ namespace LeptonXLite.DemoApp.Blazor.MyComponents * Create a razor page, like `MyContentToolbar.razor`, in your blazor application as shown below: ```html -@Volo.Abp.AspNetCore.Components.Web.LeptonXTheme.Components.ApplicationLayout.Common; +@using Volo.Abp.AspNetCore.Components.Web.LeptonXTheme.Components.ApplicationLayout.Common; @using Volo.Abp.DependencyInjection @inherits ContentToolbar @@ -328,7 +328,7 @@ namespace LeptonXLite.DemoApp.Blazor.MyComponents * Create a razor page, like `MyGeneralSettings.razor`, in your blazor application as shown below: ```html -@Volo.Abp.AspNetCore.Components.Web.LeptonXTheme.Components.ApplicationLayout.Common; +@using Volo.Abp.AspNetCore.Components.Web.LeptonXTheme.Components.ApplicationLayout.Common; @using Volo.Abp.DependencyInjection @inherits GeneralSettings @@ -361,7 +361,7 @@ namespace LeptonXLite.DemoApp.Blazor.MyComponents * Create a razor page, like `MyMobileGeneralSettings.razor`, in your blazor application as shown below: ```html -@Volo.Abp.AspNetCore.Components.Web.LeptonXTheme.Components.ApplicationLayout.Common; +@using Volo.Abp.AspNetCore.Components.Web.LeptonXTheme.Components.ApplicationLayout.Common; @using Volo.Abp.DependencyInjection @inherits MobileGeneralSettings @@ -400,7 +400,7 @@ Components used in the side menu layout. * Create a razor page, like `MyMainMenu.razor`, in your blazor application as shown below: ```html -@Volo.Abp.AspNetCore.Components.Web.LeptonXTheme.Components.ApplicationLayout.TopMenu.Navigation; +@using Volo.Abp.AspNetCore.Components.Web.LeptonXTheme.Components.ApplicationLayout.TopMenu.Navigation; @using Volo.Abp.DependencyInjection @inherits MainMenu @@ -431,7 +431,7 @@ namespace LeptonXLite.DemoApp.Blazor.MyComponents * Create a razor page, like `MyMainMenuItem.razor`, in your blazor application as shown below: ```html -@Volo.Abp.AspNetCore.Components.Web.LeptonXTheme.Components.ApplicationLayout.SideMenu.Navigation; +@using Volo.Abp.AspNetCore.Components.Web.LeptonXTheme.Components.ApplicationLayout.SideMenu.Navigation; @using Volo.Abp.DependencyInjection @inherits MainMenuItem @@ -464,7 +464,7 @@ namespace LeptonXLite.DemoApp.Blazor.MyComponents * Create a razor page, like `MyMobileNavbar.razor`, in your blazor application as shown below: ```html -@Volo.Abp.AspNetCore.Components.Web.LeptonXTheme.Components.ApplicationLayout.SideMenu.Navigation; +@using Volo.Abp.AspNetCore.Components.Web.LeptonXTheme.Components.ApplicationLayout.SideMenu.Navigation; @using Volo.Abp.DependencyInjection @inherits MobileNavbar @@ -497,7 +497,7 @@ namespace LeptonXLite.DemoApp.Blazor.MyComponents * Create a razor page, like `MyMainHeader.razor`, in your blazor application as shown below: ```html -@Volo.Abp.AspNetCore.Components.Web.LeptonXTheme.Components.ApplicationLayout.SideMenu.MainHeader +@using Volo.Abp.AspNetCore.Components.Web.LeptonXTheme.Components.ApplicationLayout.SideMenu.MainHeader @using Volo.Abp.DependencyInjection @inherits MainHeader @@ -534,7 +534,7 @@ If you need to replace the component, you can follow the steps below. * Create a razor page, like `MyMainHeaderBranding.razor`, in your blazor application as shown below: ```html -@Volo.Abp.AspNetCore.Components.Web.LeptonXTheme.Components.ApplicationLayout.SideMenu.MainHeader +@using Volo.Abp.AspNetCore.Components.Web.LeptonXTheme.Components.ApplicationLayout.SideMenu.MainHeader @using Volo.Abp.DependencyInjection @inherits MainHeaderBranding @@ -571,7 +571,7 @@ If you need to replace the component, you can follow the steps below. * Create a razor page, like `MyMainHeaderToolbar.razor`, in your blazor application as shown below: ```html -@Volo.Abp.AspNetCore.Components.Web.LeptonXTheme.Components.ApplicationLayout.SideMenu.MainHeader +@using Volo.Abp.AspNetCore.Components.Web.LeptonXTheme.Components.ApplicationLayout.SideMenu.MainHeader @using Volo.Abp.DependencyInjection @inherits MainHeaderToolbar @@ -610,7 +610,7 @@ Components used in the top menu layout. * Create a razor page, like `MyMainMenu.razor`, in your blazor application as shown below: ```html -@Volo.Abp.AspNetCore.Components.Web.LeptonXTheme.Components.ApplicationLayout.TopMenu.Navigation; +@using Volo.Abp.AspNetCore.Components.Web.LeptonXTheme.Components.ApplicationLayout.TopMenu.Navigation; @using Volo.Abp.DependencyInjection @inherits MainMenu @@ -641,7 +641,7 @@ namespace LeptonXLite.DemoApp.Blazor.MyComponents * Create a razor page, like `MyMainMenuItem.razor`, in your blazor application as shown below: ```html -@Volo.Abp.AspNetCore.Components.Web.LeptonXTheme.Components.ApplicationLayout.TopMenu.Navigation; +@using Volo.Abp.AspNetCore.Components.Web.LeptonXTheme.Components.ApplicationLayout.TopMenu.Navigation; @using Volo.Abp.DependencyInjection @inherits MainMenuItem @@ -674,7 +674,7 @@ namespace LeptonXLite.DemoApp.Blazor.MyComponents * Create a razor page, like `MyMobileNavbar.razor`, in your blazor application as shown below: ```html -@Volo.Abp.AspNetCore.Components.Web.LeptonXTheme.Components.ApplicationLayout.TopMenu.Navigation; +@using Volo.Abp.AspNetCore.Components.Web.LeptonXTheme.Components.ApplicationLayout.TopMenu.Navigation; @using Volo.Abp.DependencyInjection @inherits MobileNavbar @@ -707,7 +707,7 @@ namespace LeptonXLite.DemoApp.Blazor.MyComponents * Create a razor page, like `MyMainHeader.razor`, in your blazor application as shown below: ```html -@Volo.Abp.AspNetCore.Components.Web.LeptonXTheme.Components.ApplicationLayout.TopMenu.MainHeader +@using Volo.Abp.AspNetCore.Components.Web.LeptonXTheme.Components.ApplicationLayout.TopMenu.MainHeader @using Volo.Abp.DependencyInjection @inherits MainHeader @@ -742,7 +742,7 @@ Application branding can be customized with the `IBrandingProvider`. See the [Br * Create a razor page, like `MyMainHeaderBranding.razor`, in your blazor application as shown below: ```html -@Volo.Abp.AspNetCore.Components.Web.LeptonXTheme.Components.ApplicationLayout.TopMenu.MainHeader +@using Volo.Abp.AspNetCore.Components.Web.LeptonXTheme.Components.ApplicationLayout.TopMenu.MainHeader @using Volo.Abp.DependencyInjection @inherits MainHeaderBranding @@ -779,7 +779,7 @@ If you need to replace the component, you can follow the steps below. * Create a razor page, like `MyMainHeaderToolbar.razor`, in your blazor application as shown below: ```html -@Volo.Abp.AspNetCore.Components.Web.LeptonXTheme.Components.ApplicationLayout.TopMenu.MainHeader +@using Volo.Abp.AspNetCore.Components.Web.LeptonXTheme.Components.ApplicationLayout.TopMenu.MainHeader @using Volo.Abp.DependencyInjection @inherits MainHeaderToolbar diff --git a/docs/en/ui-themes/lepton-x/index.md b/docs/en/ui-themes/lepton-x/index.md index 241d4dfb89..e2b09358a4 100644 --- a/docs/en/ui-themes/lepton-x/index.md +++ b/docs/en/ui-themes/lepton-x/index.md @@ -88,6 +88,8 @@ You can use the following CLI command to download the source-code: abp get-source Volo.Abp.LeptonXTheme ``` +> If you are using the old ABP CLI, you can use the command: `abp get-source Volo.Abp.LeptonXTheme.Pro` + If you want to download the source code of the preview version, you can use the following command: ```bash diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Dapr.EventBus/DaprAspNetCore/AbpDaprEndpointRouteBuilderExtensions.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.Dapr.EventBus/DaprAspNetCore/AbpDaprEndpointRouteBuilderExtensions.cs deleted file mode 100644 index 24f68ef9ab..0000000000 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.Dapr.EventBus/DaprAspNetCore/AbpDaprEndpointRouteBuilderExtensions.cs +++ /dev/null @@ -1,296 +0,0 @@ -// ------------------------------------------------------------------------ -// Copyright 2021 The Dapr Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// http://www.apache.org/licenses/LICENSE-2.0 -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// ------------------------------------------------------------------------ - -using System; -using System.Collections.Generic; -using System.Threading.Tasks; - -namespace Dapr -{ - /// - /// This class defines configurations for the subscribe endpoint. - /// - public class AbpSubscribeOptions - { - /// - /// Gets or Sets a value which indicates whether to enable or disable processing raw messages. - /// - public bool EnableRawPayload { get; set; } - - /// - /// An optional delegate used to configure the subscriptions. - /// - public Func, Task>? SubscriptionsCallback { get; set; } - } - - /// - /// This class defines subscribe endpoint response - /// - public class AbpSubscription - { - /// - /// Gets or sets the topic name. - /// - public string Topic { get; set; } = default!; - - /// - /// Gets or sets the pubsub name - /// - public string PubsubName { get; set; } = default!; - - /// - /// Gets or sets the route - /// - public string? Route { get; set; } - - /// - /// Gets or sets the routes - /// - public AbpRoutes? Routes { get; set; } - - /// - /// Gets or sets the metadata. - /// - public AbpMetadata? Metadata { get; set; } - - /// - /// Gets or sets the deadletter topic. - /// - public string? DeadLetterTopic { get; set; } - } - - /// - /// This class defines the metadata for subscribe endpoint. - /// - public class AbpMetadata : Dictionary - { - /// - /// Initializes a new instance of the Metadata class. - /// - public AbpMetadata() { } - - /// - /// Initializes a new instance of the Metadata class. - /// - /// - public AbpMetadata(IDictionary dictionary) : base(dictionary) { } - - /// - /// RawPayload key - /// - internal const string RawPayload = "rawPayload"; - } - - /// - /// This class defines the routes for subscribe endpoint. - /// - public class AbpRoutes - { - /// - /// Gets or sets the default route - /// - public string? Default { get; set; } - - /// - /// Gets or sets the routing rules - /// - public List? Rules { get; set; } - } - - /// - /// This class defines the rule for subscribe endpoint. - /// - public class AbpRule - { - /// - /// Gets or sets the CEL expression to match this route. - /// - public string Match { get; set; } = default!; - - /// - /// Gets or sets the path of the route. - /// - public string Path { get; set; } = default!; - } -} - -namespace Microsoft.AspNetCore.Builder -{ - using System.Collections.Generic; - using System.Linq; - using System.Text.Json; - using System.Text.Json.Serialization; - using Dapr; - using Microsoft.AspNetCore.Http; - using Microsoft.AspNetCore.Routing; - using Microsoft.AspNetCore.Routing.Patterns; - using Microsoft.Extensions.DependencyInjection; - using Microsoft.Extensions.Logging; - - /// - /// Contains extension methods for . - /// - public static class AbpDaprEndpointRouteBuilderExtensions - { - /// - /// Maps an endpoint that will respond to requests to /dapr/subscribe from the - /// Dapr runtime. - /// - /// The . - /// The . - public static IEndpointConventionBuilder MapAbpSubscribeHandler(this IEndpointRouteBuilder endpoints) - { - return CreateSubscribeEndPoint(endpoints); - } - - /// - /// Maps an endpoint that will respond to requests to /dapr/subscribe from the - /// Dapr runtime. - /// - /// The . - /// Configuration options - /// The . - /// - public static IEndpointConventionBuilder MapAbpSubscribeHandler(this IEndpointRouteBuilder endpoints, AbpSubscribeOptions options) - { - return CreateSubscribeEndPoint(endpoints, options); - } - - private static IEndpointConventionBuilder CreateSubscribeEndPoint(IEndpointRouteBuilder endpoints, AbpSubscribeOptions? options = null) - { - if (endpoints is null) - { - throw new System.ArgumentNullException(nameof(endpoints)); - } - - return endpoints.MapGet("dapr/subscribe", async context => - { - var logger = context.RequestServices.GetService()?.CreateLogger("DaprTopicSubscription"); - var dataSource = context.RequestServices.GetRequiredService(); - var subscriptions = dataSource.Endpoints - .OfType() - .Where(e => e.Metadata.GetOrderedMetadata().Any(t => t.Name != null)) // only endpoints which have TopicAttribute with not null Name. - .SelectMany(e => - { - var topicMetadata = e.Metadata.GetOrderedMetadata(); - var originalTopicMetadata = e.Metadata.GetOrderedMetadata(); - - var subs = new List<(string PubsubName, string Name, string? DeadLetterTopic, bool? EnableRawPayload, string Match, int Priority, Dictionary OriginalTopicMetadata, string? MetadataSeparator, RoutePattern RoutePattern)>(); - - for (int i = 0; i < topicMetadata.Count(); i++) - { - subs.Add((topicMetadata[i].PubsubName, - topicMetadata[i].Name, - (topicMetadata[i] as IDeadLetterTopicMetadata)?.DeadLetterTopic, - (topicMetadata[i] as IRawTopicMetadata)?.EnableRawPayload, - topicMetadata[i].Match, - topicMetadata[i].Priority, - originalTopicMetadata.Where(m => (topicMetadata[i] as IOwnedOriginalTopicMetadata)?.OwnedMetadatas?.Any(o => o.Equals(m.Id)) == true || string.IsNullOrEmpty(m.Id)) - .GroupBy(c => c.Name) - .ToDictionary(m => m.Key, m => m.Select(c => c.Value).Distinct().ToArray()), - (topicMetadata[i] as IOwnedOriginalTopicMetadata)?.MetadataSeparator, - e.RoutePattern)); - } - - return subs; - }) - .Distinct() - .GroupBy(e => new { e.PubsubName, e.Name }) - .Select(e => e.OrderBy(e => e.Priority)) - .Select(e => - { - var first = e.First(); - var rawPayload = e.Any(e => e.EnableRawPayload.GetValueOrDefault()); - var metadataSeparator = e.FirstOrDefault(e => !string.IsNullOrEmpty(e.MetadataSeparator)).MetadataSeparator?.ToString() ?? ","; - var rules = e.Where(e => !string.IsNullOrEmpty(e.Match)).ToList(); - var defaultRoutes = e.Where(e => string.IsNullOrEmpty(e.Match)).Select(e => RoutePatternToString(e.RoutePattern)).ToList(); - var defaultRoute = defaultRoutes.FirstOrDefault(); - - //multiple identical names. use comma separation. - var metadata = new AbpMetadata(e.SelectMany(c => c.OriginalTopicMetadata).GroupBy(c => c.Key).ToDictionary(c => c.Key, c => string.Join(metadataSeparator, c.SelectMany(c => c.Value).Distinct()))); - if (rawPayload || options?.EnableRawPayload is true) - { - metadata.Add(AbpMetadata.RawPayload, "true"); - } - - if (logger != null) - { - if (defaultRoutes.Count > 1) - { - logger.LogError("A default subscription to topic {name} on pubsub {pubsub} already exists.", first.Name, first.PubsubName); - } - - var duplicatePriorities = rules.GroupBy(e => e.Priority) - .Where(g => g.Count() > 1) - .ToDictionary(x => x.Key, y => y.Count()); - - foreach (var entry in duplicatePriorities) - { - logger.LogError("A subscription to topic {name} on pubsub {pubsub} has duplicate priorities for {priority}: found {count} occurrences.", first.Name, first.PubsubName, entry.Key, entry.Value); - } - } - - var subscription = new AbpSubscription - { - Topic = first.Name, - PubsubName = first.PubsubName, - Metadata = metadata.Count > 0 ? metadata : null, - }; - - if (first.DeadLetterTopic != null) - { - subscription.DeadLetterTopic = first.DeadLetterTopic; - } - - // Use the V2 routing rules structure - if (rules.Count > 0) - { - subscription.Routes = new AbpRoutes - { - Rules = rules.Select(e => new AbpRule - { - Match = e.Match, - Path = RoutePatternToString(e.RoutePattern), - }).ToList(), - Default = defaultRoute, - }; - } - // Use the V1 structure for backward compatibility. - else - { - subscription.Route = defaultRoute; - } - - return subscription; - }) - .OrderBy(e => (e.PubsubName, e.Topic)) - .ToList(); - - await options?.SubscriptionsCallback!(subscriptions)!; - await context.Response.WriteAsync(JsonSerializer.Serialize(subscriptions, - new JsonSerializerOptions - { - PropertyNamingPolicy = JsonNamingPolicy.CamelCase, - DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull - })); - }); - } - - private static string RoutePatternToString(RoutePattern routePattern) - { - return string.Join("/", routePattern.PathSegments - .Select(segment => string.Concat(segment.Parts.Cast() - .Select(part => part.Content)))); - } - } -} diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Dapr.EventBus/Volo/Abp/AspNetCore/Mvc/Dapr/EventBus/AbpAspNetCoreMvcDaprEventBusModule.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.Dapr.EventBus/Volo/Abp/AspNetCore/Mvc/Dapr/EventBus/AbpAspNetCoreMvcDaprEventBusModule.cs index a291c4e769..a4a4f97f5d 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.Dapr.EventBus/Volo/Abp/AspNetCore/Mvc/Dapr/EventBus/AbpAspNetCoreMvcDaprEventBusModule.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Dapr.EventBus/Volo/Abp/AspNetCore/Mvc/Dapr/EventBus/AbpAspNetCoreMvcDaprEventBusModule.cs @@ -1,11 +1,16 @@ -using System.Linq; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text.Json; using System.Threading.Tasks; using Dapr; using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Routing; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -using Volo.Abp.DependencyInjection; +using Volo.Abp.Dapr; using Volo.Abp.EventBus; using Volo.Abp.EventBus.Dapr; using Volo.Abp.EventBus.Distributed; @@ -21,50 +26,98 @@ public class AbpAspNetCoreMvcDaprEventBusModule : AbpModule { public override void ConfigureServices(ServiceConfigurationContext context) { - var subscribeOptions = context.Services.ExecutePreConfiguredActions(); - - Configure(options => + PostConfigure(options => { options.EndpointConfigureActions.Add(endpointContext => { - var rootServiceProvider = endpointContext.ScopeServiceProvider.GetRequiredService(); - subscribeOptions.SubscriptionsCallback = subscriptions => - { - var daprEventBusOptions = rootServiceProvider.GetRequiredService>().Value; - foreach (var handler in rootServiceProvider.GetRequiredService>().Value.Handlers) + var topicMetadatas = endpointContext.Endpoints.DataSources.SelectMany(x => x.Endpoints).OfType() + .Where(e => e.Metadata.GetOrderedMetadata().Any(t => t.Name != null)) + .SelectMany(e => e.Metadata.GetOrderedMetadata()) + .ToList(); + + var endpointConventionBuilder = endpointContext.Endpoints.MapPost( + "/api/abp/dapr/event", async httpContext => { - foreach (var @interface in handler.GetInterfaces().Where(x => x.IsGenericType && x.GetGenericTypeDefinition() == typeof(IDistributedEventHandler<>))) - { - var eventType = @interface.GetGenericArguments()[0]; - var eventName = EventNameAttribute.GetNameOrDefault(eventType); - - if (subscriptions.Any(x => x.PubsubName == daprEventBusOptions.PubSubName && x.Topic == eventName)) - { - // Controllers with a [Topic] attribute can replace built-in event handlers. - continue; - } - - var subscription = new AbpSubscription - { - PubsubName = daprEventBusOptions.PubSubName, - Topic = eventName, - Route = AbpAspNetCoreMvcDaprPubSubConsts.DaprEventCallbackUrl, - Metadata = new AbpMetadata - { - { - AbpMetadata.RawPayload, "true" - } - } - }; - subscriptions.Add(subscription); - } - } - - return Task.CompletedTask; - }; - - endpointContext.Endpoints.MapAbpSubscribeHandler(subscribeOptions); + await HandleEventAsync(httpContext); + }); + + var abpEvents = GetAbpEvents(endpointContext); + foreach (var @event in abpEvents.Where(x => !topicMetadatas.Any(t => t.PubsubName == x.PubsubName && t.Name == x.Name))) + { + endpointConventionBuilder.WithMetadata(new TopicAttribute( + @event.PubsubName, + @event.Name, + true)); + } + + endpointContext.Endpoints.MapSubscribeHandler(); }); }); } + + private List GetAbpEvents(EndpointRouteBuilderContext endpointContext) + { + var subscriptions = new List(); + var daprEventBusOptions = endpointContext.Endpoints.ServiceProvider.GetRequiredService>().Value; + + foreach (var @interface in endpointContext.Endpoints.ServiceProvider.GetRequiredService>().Value.Handlers + .SelectMany(x => x.GetInterfaces().Where(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IDistributedEventHandler<>)))) + { + var eventType = @interface.GetGenericArguments()[0]; + var eventName = EventNameAttribute.GetNameOrDefault(eventType); + + var subscription = new TopicAttribute(daprEventBusOptions.PubSubName, eventName); + subscriptions.Add(subscription); + } + + return subscriptions; + } + + private async static Task HandleEventAsync(HttpContext httpContext) + { + var logger = httpContext.RequestServices.GetRequiredService>(); + + httpContext.ValidateDaprAppApiToken(); + + var daprSerializer = httpContext.RequestServices.GetRequiredService(); + var body = (await JsonDocument.ParseAsync(httpContext.Request.Body)); + + var pubSubName = body.RootElement.GetProperty("pubsubname").GetString(); + var topic = body.RootElement.GetProperty("topic").GetString(); + var data = body.RootElement.GetProperty("data").GetRawText(); + if (pubSubName.IsNullOrWhiteSpace() || topic.IsNullOrWhiteSpace() || data.IsNullOrWhiteSpace()) + { + logger.LogError("Invalid Dapr event request."); + httpContext.Response.StatusCode = 400; + return; + } + + var distributedEventBus = httpContext.RequestServices.GetRequiredService(); + + if (IsAbpDaprEventData(data)) + { + var daprEventData = daprSerializer.Deserialize(data, typeof(AbpDaprEventData)).As(); + var eventData = daprSerializer.Deserialize(daprEventData.JsonData, distributedEventBus.GetEventType(daprEventData.Topic)); + await distributedEventBus.TriggerHandlersAsync(distributedEventBus.GetEventType(daprEventData.Topic), eventData, daprEventData.MessageId, daprEventData.CorrelationId); + } + else + { + var eventData = daprSerializer.Deserialize(data, distributedEventBus.GetEventType(topic!)); + await distributedEventBus.TriggerHandlersAsync(distributedEventBus.GetEventType(topic!), eventData); + } + + httpContext.Response.StatusCode = 200; + } + + private static bool IsAbpDaprEventData(string data) + { + var document = JsonDocument.Parse(data); + var objects = document.RootElement.EnumerateObject().ToList(); + return objects.Count == 5 && + objects.Any(x => x.Name.Equals("PubSubName", StringComparison.CurrentCultureIgnoreCase)) && + objects.Any(x => x.Name.Equals("Topic", StringComparison.CurrentCultureIgnoreCase)) && + objects.Any(x => x.Name.Equals("MessageId", StringComparison.CurrentCultureIgnoreCase)) && + objects.Any(x => x.Name.Equals("JsonData", StringComparison.CurrentCultureIgnoreCase)) && + objects.Any(x => x.Name.Equals("CorrelationId", StringComparison.CurrentCultureIgnoreCase)); + } } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Dapr.EventBus/Volo/Abp/AspNetCore/Mvc/Dapr/EventBus/AbpAspNetCoreMvcDaprPubSubConsts.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.Dapr.EventBus/Volo/Abp/AspNetCore/Mvc/Dapr/EventBus/AbpAspNetCoreMvcDaprPubSubConsts.cs deleted file mode 100644 index 5f224abc7e..0000000000 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.Dapr.EventBus/Volo/Abp/AspNetCore/Mvc/Dapr/EventBus/AbpAspNetCoreMvcDaprPubSubConsts.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace Volo.Abp.AspNetCore.Mvc.Dapr.EventBus; - -public class AbpAspNetCoreMvcDaprPubSubConsts -{ - public const string DaprEventCallbackUrl = "api/abp/dapr/event"; -} diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Dapr.EventBus/Volo/Abp/AspNetCore/Mvc/Dapr/EventBus/Controllers/AbpAspNetCoreMvcDaprEventsController.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.Dapr.EventBus/Volo/Abp/AspNetCore/Mvc/Dapr/EventBus/Controllers/AbpAspNetCoreMvcDaprEventsController.cs deleted file mode 100644 index 946c39f59c..0000000000 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.Dapr.EventBus/Volo/Abp/AspNetCore/Mvc/Dapr/EventBus/Controllers/AbpAspNetCoreMvcDaprEventsController.cs +++ /dev/null @@ -1,62 +0,0 @@ -using System; -using System.Linq; -using System.Text.Json; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Mvc; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Logging; -using Volo.Abp.Dapr; -using Volo.Abp.EventBus.Dapr; - -namespace Volo.Abp.AspNetCore.Mvc.Dapr.EventBus.Controllers; - -[Area("abp")] -[RemoteService(Name = "abp")] -public class AbpAspNetCoreMvcDaprEventsController : AbpController -{ - [HttpPost(AbpAspNetCoreMvcDaprPubSubConsts.DaprEventCallbackUrl)] - public virtual async Task EventAsync() - { - HttpContext.ValidateDaprAppApiToken(); - - var daprSerializer = HttpContext.RequestServices.GetRequiredService(); - var body = (await JsonDocument.ParseAsync(HttpContext.Request.Body)); - - var pubSubName = body.RootElement.GetProperty("pubsubname").GetString(); - var topic = body.RootElement.GetProperty("topic").GetString(); - var data = body.RootElement.GetProperty("data").GetRawText(); - if (pubSubName.IsNullOrWhiteSpace() || topic.IsNullOrWhiteSpace() || data.IsNullOrWhiteSpace()) - { - Logger.LogError("Invalid Dapr event request."); - return BadRequest(); - } - - var distributedEventBus = HttpContext.RequestServices.GetRequiredService(); - - if (IsAbpDaprEventData(data)) - { - var daprEventData = daprSerializer.Deserialize(data, typeof(AbpDaprEventData)).As(); - var eventData = daprSerializer.Deserialize(daprEventData.JsonData, distributedEventBus.GetEventType(daprEventData.Topic)); - await distributedEventBus.TriggerHandlersAsync(distributedEventBus.GetEventType(daprEventData.Topic), eventData, daprEventData.MessageId, daprEventData.CorrelationId); - } - else - { - var eventData = daprSerializer.Deserialize(data, distributedEventBus.GetEventType(topic!)); - await distributedEventBus.TriggerHandlersAsync(distributedEventBus.GetEventType(topic!), eventData); - } - - return Ok(); - } - - protected virtual bool IsAbpDaprEventData(string data) - { - var document = JsonDocument.Parse(data); - var objects = document.RootElement.EnumerateObject().ToList(); - return objects.Count == 5 && - objects.Any(x => x.Name.Equals("PubSubName", StringComparison.CurrentCultureIgnoreCase)) && - objects.Any(x => x.Name.Equals("Topic", StringComparison.CurrentCultureIgnoreCase)) && - objects.Any(x => x.Name.Equals("MessageId", StringComparison.CurrentCultureIgnoreCase)) && - objects.Any(x => x.Name.Equals("JsonData", StringComparison.CurrentCultureIgnoreCase)) && - objects.Any(x => x.Name.Equals("CorrelationId", StringComparison.CurrentCultureIgnoreCase)); - } -} diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Conventions/ConventionalRouteBuilder.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Conventions/ConventionalRouteBuilder.cs index 62dfc66f93..48919e56da 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Conventions/ConventionalRouteBuilder.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Conventions/ConventionalRouteBuilder.cs @@ -2,6 +2,7 @@ using System.ComponentModel; using System.Linq; using System.Reflection; +using System.Runtime.InteropServices; using Microsoft.AspNetCore.Mvc.ApplicationModels; using Microsoft.Extensions.Options; using Volo.Abp.DependencyInjection; @@ -63,7 +64,7 @@ public class ConventionalRouteBuilder : IConventionalRouteBuilder, ITransientDep //Add secondary Id var secondaryIds = action.Parameters .Where(p => p.ParameterName.EndsWith("Id", StringComparison.Ordinal)).ToList(); - if (secondaryIds.Count == 1) + if (secondaryIds.Count == 1 && !secondaryIds[0].Attributes.Any(x => x is OptionalAttribute)) { url += $"/{{{NormalizeSecondaryIdNameCase(secondaryIds[0], configuration)}}}"; } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Libs/AbpMvcLibsService.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Libs/AbpMvcLibsService.cs index e806996ebb..410260674b 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Libs/AbpMvcLibsService.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Libs/AbpMvcLibsService.cs @@ -34,7 +34,7 @@ public class AbpMvcLibsService : IAbpMvcLibsService, ITransientDependency app.Use(async (httpContext, next) => { - if (!await CheckLibsAsyncOnceAsync(httpContext)) + if (!httpContext.Request.IsAjax() && !await CheckLibsAsyncOnceAsync(httpContext)) { var errorPage = new AbpMvcLibsErrorPage(); await errorPage.ExecuteAsync(httpContext); diff --git a/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/Security/Claims/AbpDynamicClaimsMiddleware.cs b/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/Security/Claims/AbpDynamicClaimsMiddleware.cs index b2bbb78e7b..36012a123b 100644 --- a/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/Security/Claims/AbpDynamicClaimsMiddleware.cs +++ b/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/Security/Claims/AbpDynamicClaimsMiddleware.cs @@ -2,7 +2,6 @@ using System; using System.Threading.Tasks; using Microsoft.AspNetCore.Authentication; using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Http.Features.Authentication; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using Volo.Abp.AspNetCore.Middleware; @@ -27,12 +26,10 @@ public class AbpDynamicClaimsMiddleware : AbpMiddlewareBase, ITransientDependenc var abpClaimsPrincipalFactory = context.RequestServices.GetRequiredService(); var user = await abpClaimsPrincipalFactory.CreateDynamicAsync(context.User); - authenticateResultFeature.AuthenticateResult = AuthenticateResult.Success(new AuthenticationTicket(user, authenticationType)); - var httpAuthenticationFeature = context.Features.Get(); - if (httpAuthenticationFeature != null) - { - httpAuthenticationFeature.User = authenticateResultFeature.AuthenticateResult.Principal; - } + authenticateResultFeature.AuthenticateResult = AuthenticateResult.Success(new AuthenticationTicket( + user, + authenticateResultFeature?.AuthenticateResult?.Properties, + authenticationType)); } if (context.User.Identity?.IsAuthenticated == false) diff --git a/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AuditingInterceptor.cs b/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AuditingInterceptor.cs index 6be28d24cf..0f8894ed10 100644 --- a/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AuditingInterceptor.cs +++ b/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AuditingInterceptor.cs @@ -191,7 +191,9 @@ public class AuditingInterceptor : AbpInterceptor, ITransientDependency } if (!options.IsEnabledForGetRequests && - invocation.Method.Name.StartsWith("Get", StringComparison.OrdinalIgnoreCase)) + (string.Equals(auditLogInfo.HttpMethod, "Get", StringComparison.OrdinalIgnoreCase) || + string.Equals(auditLogInfo.HttpMethod, "Head", StringComparison.OrdinalIgnoreCase) || + invocation.Method.Name.StartsWith("Get", StringComparison.OrdinalIgnoreCase))) { return false; } diff --git a/framework/src/Volo.Abp.BlazoriseUI/Components/EntityAction.razor b/framework/src/Volo.Abp.BlazoriseUI/Components/EntityAction.razor index 9bd07ce7da..d913647264 100644 --- a/framework/src/Volo.Abp.BlazoriseUI/Components/EntityAction.razor +++ b/framework/src/Volo.Abp.BlazoriseUI/Components/EntityAction.razor @@ -17,7 +17,8 @@ Disabled=@Disabled> @if(!string.IsNullOrEmpty(Icon)) { - + var iconClass = Text.IsNullOrEmpty() ? "" : "me-1"; + } @Text diff --git a/framework/src/Volo.Abp.EntityFrameworkCore.PostgreSql/Volo.Abp.EntityFrameworkCore.PostgreSql.csproj b/framework/src/Volo.Abp.EntityFrameworkCore.PostgreSql/Volo.Abp.EntityFrameworkCore.PostgreSql.csproj index 16e650b2b2..382ef142fa 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore.PostgreSql/Volo.Abp.EntityFrameworkCore.PostgreSql.csproj +++ b/framework/src/Volo.Abp.EntityFrameworkCore.PostgreSql/Volo.Abp.EntityFrameworkCore.PostgreSql.csproj @@ -22,8 +22,6 @@ - - diff --git a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/DistributedEventBusBase.cs b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/DistributedEventBusBase.cs index 72a20748c6..96a11f928e 100644 --- a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/DistributedEventBusBase.cs +++ b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/DistributedEventBusBase.cs @@ -132,7 +132,13 @@ public abstract class DistributedEventBusBase : EventBusBase, IDistributedEventB Serialize(eventData), Clock.Now ); - outgoingEventInfo.SetCorrelationId(CorrelationIdProvider.Get()!); + + var correlationId = CorrelationIdProvider.Get(); + if (correlationId != null) + { + outgoingEventInfo.SetCorrelationId(correlationId); + } + await eventOutbox.EnqueueAsync(outgoingEventInfo); return true; } diff --git a/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/AbpHttpClientOptions.cs b/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/AbpHttpClientOptions.cs index 6743ab5174..bfe52508e4 100644 --- a/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/AbpHttpClientOptions.cs +++ b/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/AbpHttpClientOptions.cs @@ -1,5 +1,7 @@ using System; using System.Collections.Generic; +using System.Net.Http; +using Volo.Abp.Http.Client.ClientProxying; using Volo.Abp.Http.Client.Proxying; namespace Volo.Abp.Http.Client; @@ -8,8 +10,17 @@ public class AbpHttpClientOptions { public Dictionary HttpClientProxies { get; set; } + public Dictionary>> ProxyHttpClientPreSendActions { get; } + public AbpHttpClientOptions() { HttpClientProxies = new Dictionary(); + ProxyHttpClientPreSendActions = new Dictionary>>(); + } + + public AbpHttpClientOptions AddPreSendAction(string remoteServiceName, Action action) + { + ProxyHttpClientPreSendActions.GetOrAdd(remoteServiceName, () => new List>()).Add(action); + return this; } } diff --git a/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/ClientProxying/ClientProxyBase.cs b/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/ClientProxying/ClientProxyBase.cs index a4306050a4..01c1e2a720 100644 --- a/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/ClientProxying/ClientProxyBase.cs +++ b/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/ClientProxying/ClientProxyBase.cs @@ -146,6 +146,11 @@ public class ClientProxyBase : ITransientDependency HttpResponseMessage response; try { + foreach (var preSendAction in ClientOptions.Value.ProxyHttpClientPreSendActions.Where(x => x.Key == clientConfig.RemoteServiceName).SelectMany(x => x.Value)) + { + preSendAction(clientConfig, requestContext, client); + } + response = await client.SendAsync( requestMessage, HttpCompletionOption.ResponseHeadersRead /*this will buffer only the headers, the content will be used as a stream*/, @@ -309,7 +314,11 @@ public class ClientProxyBase : ITransientDependency } //CorrelationId - requestMessage.Headers.Add(AbpCorrelationIdOptions.Value.HttpHeaderName, CorrelationIdProvider.Get()); + var correlationId = CorrelationIdProvider.Get(); + if (correlationId != null) + { + requestMessage.Headers.Add(AbpCorrelationIdOptions.Value.HttpHeaderName, correlationId); + } //TenantId if (CurrentTenant.Id.HasValue) diff --git a/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/ApiDescriptionFinder.cs b/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/ApiDescriptionFinder.cs index 10089c52cd..e54e24ced0 100644 --- a/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/ApiDescriptionFinder.cs +++ b/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/ApiDescriptionFinder.cs @@ -126,7 +126,11 @@ public class ApiDescriptionFinder : IApiDescriptionFinder, ITransientDependency protected virtual void AddHeaders(HttpRequestMessage requestMessage) { //CorrelationId - requestMessage.Headers.Add(AbpCorrelationIdOptions.HttpHeaderName, CorrelationIdProvider.Get()); + var correlationId = CorrelationIdProvider.Get(); + if (correlationId != null) + { + requestMessage.Headers.Add(AbpCorrelationIdOptions.HttpHeaderName, correlationId); + } //TenantId if (CurrentTenant.Id.HasValue) diff --git a/framework/src/Volo.Abp.Swashbuckle/Microsoft/AspNetCore/Builder/AbpSwaggerUIBuilderExtensions.cs b/framework/src/Volo.Abp.Swashbuckle/Microsoft/AspNetCore/Builder/AbpSwaggerUIBuilderExtensions.cs index f7d85e3256..b999005f25 100644 --- a/framework/src/Volo.Abp.Swashbuckle/Microsoft/AspNetCore/Builder/AbpSwaggerUIBuilderExtensions.cs +++ b/framework/src/Volo.Abp.Swashbuckle/Microsoft/AspNetCore/Builder/AbpSwaggerUIBuilderExtensions.cs @@ -16,7 +16,6 @@ public static class AbpSwaggerUIBuilderExtensions return app.UseSwaggerUI(options => { options.InjectJavascript("ui/abp.js"); - options.InjectJavascript("ui/abp.swagger.js"); options.IndexStream = () => resolver?.Resolver(); setupAction?.Invoke(options); diff --git a/framework/src/Volo.Abp.Swashbuckle/Volo/Abp/Swashbuckle/SwaggerHtmlResolver.cs b/framework/src/Volo.Abp.Swashbuckle/Volo/Abp/Swashbuckle/SwaggerHtmlResolver.cs index 628a361826..be4ebfe4e8 100644 --- a/framework/src/Volo.Abp.Swashbuckle/Volo/Abp/Swashbuckle/SwaggerHtmlResolver.cs +++ b/framework/src/Volo.Abp.Swashbuckle/Volo/Abp/Swashbuckle/SwaggerHtmlResolver.cs @@ -10,12 +10,14 @@ public class SwaggerHtmlResolver : ISwaggerHtmlResolver, ITransientDependency { public virtual Stream Resolver() { + var scriptBundleScript = ""; + var abpSwaggerScript = ""; var stream = typeof(SwaggerUIOptions).GetTypeInfo().Assembly .GetManifestResourceStream("Swashbuckle.AspNetCore.SwaggerUI.index.html"); var html = new StreamReader(stream!) .ReadToEnd() - .Replace("SwaggerUIBundle(configObject)", "abp.SwaggerUIBundle(configObject)"); + .Replace(scriptBundleScript, $"{scriptBundleScript}\n{abpSwaggerScript}"); return new MemoryStream(Encoding.UTF8.GetBytes(html)); } diff --git a/framework/src/Volo.Abp.Swashbuckle/wwwroot/swagger/ui/abp.swagger.js b/framework/src/Volo.Abp.Swashbuckle/wwwroot/swagger/ui/abp.swagger.js index 4e8790d38c..b8abb0df25 100644 --- a/framework/src/Volo.Abp.Swashbuckle/wwwroot/swagger/ui/abp.swagger.js +++ b/framework/src/Volo.Abp.Swashbuckle/wwwroot/swagger/ui/abp.swagger.js @@ -1,9 +1,10 @@ var abp = abp || {}; (function () { - - abp.SwaggerUIBundle = function (configObject) { - + + var oldSwaggerUIBundle = SwaggerUIBundle; + + SwaggerUIBundle = function (configObject) { var excludeUrl = ["swagger.json", "connect/token"] var firstRequest = true; var oidcSupportedFlows = configObject.oidcSupportedFlows || []; @@ -109,6 +110,9 @@ var abp = abp || {}; }); } - return SwaggerUIBundle(configObject); + return oldSwaggerUIBundle(configObject); } + + SwaggerUIBundle = Object.assign(SwaggerUIBundle, oldSwaggerUIBundle); + })(); diff --git a/framework/test/Volo.Abp.Http.Client.Tests/Volo/Abp/Http/AbpHttpClientTestModule.cs b/framework/test/Volo.Abp.Http.Client.Tests/Volo/Abp/Http/AbpHttpClientTestModule.cs index 5e9107a23b..4dd69041fc 100644 --- a/framework/test/Volo.Abp.Http.Client.Tests/Volo/Abp/Http/AbpHttpClientTestModule.cs +++ b/framework/test/Volo.Abp.Http.Client.Tests/Volo/Abp/Http/AbpHttpClientTestModule.cs @@ -1,8 +1,11 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; +using System.Net.Http; using Microsoft.Extensions.DependencyInjection; using Volo.Abp.AspNetCore.Mvc; using Volo.Abp.Http.Client; using Volo.Abp.Http.Client.ClientProxying; +using Volo.Abp.Http.Client.Proxying; using Volo.Abp.Http.DynamicProxying; using Volo.Abp.Http.Localization; using Volo.Abp.Localization; @@ -60,5 +63,16 @@ public class AbpHttpClientTestModule : AbpModule options.FormDataConverts.Add(typeof(List), typeof(TestObjectToFormData)); options.PathConverts.Add(typeof(int), typeof(TestObjectToPath)); }); + + Configure(options => + { + options.AddPreSendAction("Default", (_, requestContext, httpclient) => + { + if (requestContext.Action.Name.Equals("TimeOutRequestAsync")) + { + httpclient.Timeout = TimeSpan.FromMilliseconds(1); + } + }); + }); } } diff --git a/framework/test/Volo.Abp.Http.Client.Tests/Volo/Abp/Http/DynamicProxying/IRegularTestController.cs b/framework/test/Volo.Abp.Http.Client.Tests/Volo/Abp/Http/DynamicProxying/IRegularTestController.cs index 547f1bf5a7..21786155bf 100644 --- a/framework/test/Volo.Abp.Http.Client.Tests/Volo/Abp/Http/DynamicProxying/IRegularTestController.cs +++ b/framework/test/Volo.Abp.Http.Client.Tests/Volo/Abp/Http/DynamicProxying/IRegularTestController.cs @@ -43,4 +43,7 @@ public interface IRegularTestController Task DeleteByIdAsync(int id); Task AbortRequestAsync(CancellationToken cancellationToken = default); + + Task TimeOutRequestAsync(); + } diff --git a/framework/test/Volo.Abp.Http.Client.Tests/Volo/Abp/Http/DynamicProxying/RegularTestController.cs b/framework/test/Volo.Abp.Http.Client.Tests/Volo/Abp/Http/DynamicProxying/RegularTestController.cs index b092e67bc8..46b355090b 100644 --- a/framework/test/Volo.Abp.Http.Client.Tests/Volo/Abp/Http/DynamicProxying/RegularTestController.cs +++ b/framework/test/Volo.Abp.Http.Client.Tests/Volo/Abp/Http/DynamicProxying/RegularTestController.cs @@ -152,6 +152,14 @@ public class RegularTestController : AbpController, IRegularTestController await Task.Delay(100, cancellationToken); return "AbortRequestAsync"; } + + [HttpGet] + [Route("timeout-request")] + public async Task TimeOutRequestAsync() + { + await Task.Delay(100); + return "TimeOutRequestAsync"; + } } public class Car diff --git a/framework/test/Volo.Abp.Http.Client.Tests/Volo/Abp/Http/DynamicProxying/RegularTestControllerClientProxy_Tests.cs b/framework/test/Volo.Abp.Http.Client.Tests/Volo/Abp/Http/DynamicProxying/RegularTestControllerClientProxy_Tests.cs index f094c756a9..01ec97d734 100644 --- a/framework/test/Volo.Abp.Http.Client.Tests/Volo/Abp/Http/DynamicProxying/RegularTestControllerClientProxy_Tests.cs +++ b/framework/test/Volo.Abp.Http.Client.Tests/Volo/Abp/Http/DynamicProxying/RegularTestControllerClientProxy_Tests.cs @@ -1,4 +1,5 @@ using System; +using System.Net.Http; using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; @@ -187,4 +188,11 @@ public class RegularTestControllerClientProxy_Tests : AbpHttpClientTestBase var exception = await Assert.ThrowsAsync(async () => await _controller.AbortRequestAsync(cts.Token)); exception.InnerException.InnerException.InnerException.Message.ShouldBe("The client aborted the request."); } + + [Fact] + public async Task TimeOutRequestAsync() + { + var exception = await Assert.ThrowsAsync(async () => await _controller.TimeOutRequestAsync()); + exception.InnerException.InnerException.Message.ShouldBe("The client aborted the request."); + } } diff --git a/latest-versions.json b/latest-versions.json index fa2c98b342..27908ad9cb 100644 --- a/latest-versions.json +++ b/latest-versions.json @@ -1,6 +1,6 @@ [ { - "version": "8.3.3", + "version": "9.0.1", "releaseDate": "", "type": "stable", "message": "" 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 7674e22438..fdd7728237 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.0.0-rc.2", - "@abp/prismjs": "~9.0.0-rc.2", - "@abp/highlight.js": "~9.0.0-rc.2" + "@abp/aspnetcore.mvc.ui.theme.shared": "~9.0.1", + "@abp/prismjs": "~9.0.1", + "@abp/highlight.js": "~9.0.1" } } 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 54dafa4837..842e1aadb4 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.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-9.0.0-rc.2.tgz#acaeaa5e0b329e5d836a198f7a3563d141d7fc79" - integrity sha512-hs8AoZwOnrMYmFl7/GQc6EUr5Jz5lTXWgSmp0l/DdH7f3INYEgCrIp5qvLFyNu8CHv6Gbegw2vGdpfDQbkiasw== - dependencies: - "@abp/aspnetcore.mvc.ui" "~9.0.0-rc.2" - "@abp/bootstrap" "~9.0.0-rc.2" - "@abp/bootstrap-datepicker" "~9.0.0-rc.2" - "@abp/bootstrap-daterangepicker" "~9.0.0-rc.2" - "@abp/datatables.net-bs5" "~9.0.0-rc.2" - "@abp/font-awesome" "~9.0.0-rc.2" - "@abp/jquery-form" "~9.0.0-rc.2" - "@abp/jquery-validation-unobtrusive" "~9.0.0-rc.2" - "@abp/lodash" "~9.0.0-rc.2" - "@abp/luxon" "~9.0.0-rc.2" - "@abp/malihu-custom-scrollbar-plugin" "~9.0.0-rc.2" - "@abp/moment" "~9.0.0-rc.2" - "@abp/select2" "~9.0.0-rc.2" - "@abp/sweetalert2" "~9.0.0-rc.2" - "@abp/timeago" "~9.0.0-rc.2" - "@abp/toastr" "~9.0.0-rc.2" - -"@abp/aspnetcore.mvc.ui@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-9.0.0-rc.2.tgz#5fc82ab4872b955cf46d755e99c656e0420a3c64" - integrity sha512-gGfHAsznxFIqTk6OFuRzcJ8D65VWmHkRqQjzmd97GZ1lNXRGDNGtYXbC/L1bA88O+qAXzhQ/c47h6in9cGh38w== +"@abp/aspnetcore.mvc.ui.theme.shared@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-9.0.1.tgz#7a1be780a305aa0d0f467472fc721b6f710fda7a" + integrity sha512-vrgRYKNctdZYhPCQ2I6Z10gUI1S5ynDj+DgnV7x7a7G/juuHaOSbkRXgwrmJsmYLfGA7KFCoJcbpER8mmXQeHQ== + dependencies: + "@abp/aspnetcore.mvc.ui" "~9.0.1" + "@abp/bootstrap" "~9.0.1" + "@abp/bootstrap-datepicker" "~9.0.1" + "@abp/bootstrap-daterangepicker" "~9.0.1" + "@abp/datatables.net-bs5" "~9.0.1" + "@abp/font-awesome" "~9.0.1" + "@abp/jquery-form" "~9.0.1" + "@abp/jquery-validation-unobtrusive" "~9.0.1" + "@abp/lodash" "~9.0.1" + "@abp/luxon" "~9.0.1" + "@abp/malihu-custom-scrollbar-plugin" "~9.0.1" + "@abp/moment" "~9.0.1" + "@abp/select2" "~9.0.1" + "@abp/sweetalert2" "~9.0.1" + "@abp/timeago" "~9.0.1" + "@abp/toastr" "~9.0.1" + +"@abp/aspnetcore.mvc.ui@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-9.0.1.tgz#811dd91138efb82345fc06559b5d2feea88021af" + integrity sha512-KVbWCpBV7S1ViHYQP/hn4gSMzSiA2e8/zC0HND1fjE+1zXJqJyEWto1eg2DaKSOs/rmHD8WtFVMU4hCLQTCuIA== dependencies: ansi-colors "^4.1.3" -"@abp/bootstrap-datepicker@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-9.0.0-rc.2.tgz#884343a8c0b881e6612cbbbf1fb9af0f40cbc223" - integrity sha512-JqPKn0xFyqoA4smY3gtUE/HcbG5QmLtFpZNG/zMnDq2JEtJt13xee9FguYXrlMOrM9PqAwnq2Wrc8s71ROh8Zg== +"@abp/bootstrap-datepicker@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-9.0.1.tgz#21cd19090b9a571ddf5a9019bc17864c8685408c" + integrity sha512-LhgqBRr66x9gGTAyv1FuPAw8u8N77WQK2AfDkNgLueurM2+xMYQzH3pWWLhcN676/JXafxfALCfBoM8U7CfXLg== dependencies: bootstrap-datepicker "^1.10.0" -"@abp/bootstrap-daterangepicker@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-9.0.0-rc.2.tgz#bc0e134e36da111aaa25f7d4d3e90d394c873b50" - integrity sha512-5KChSBquD7pQNiI3TgJSYHw549Pxuom8TAg+44edjEKRvR7KUR8IkfdImlZYHPeLmoUTnnWXiFKOIxOi9OjLoA== +"@abp/bootstrap-daterangepicker@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-9.0.1.tgz#c19c23ede6fd868a147ea893d4fdecfa60b177f7" + integrity sha512-SlBVgiYa75uQyaGt5EVjduren7Po5UP26A1tXEQQr0hDia1+1TK0qxmJ2YxjeJpB7FwtcmJiofv5fngvJqhxIA== dependencies: bootstrap-daterangepicker "^3.1.0" -"@abp/bootstrap@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-9.0.0-rc.2.tgz#cf0b2567f44030d5d0620ca36d9d25999cd25e0e" - integrity sha512-Fkagr1fTyeKDtsvn7TKJKRkWNaYd6ZmE1IhLffwLwDpyt26JBYK3XqGXT+eHFXXpSxrgANERVogSN5E46IU1OQ== +"@abp/bootstrap@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-9.0.1.tgz#2360303ec24c8f3eb755b10fa6a953db6d858daf" + integrity sha512-uAfVNsUYSsRqgeO9JMnhJJlFoDmO3/lTvER/iYOqerF0X03KQnR8HZy2V3MD1D+fSh/4JuU6aAZFl6IQLinMKQ== dependencies: - "@abp/core" "~9.0.0-rc.2" + "@abp/core" "~9.0.1" bootstrap "^5.3.3" -"@abp/clipboard@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-9.0.0-rc.2.tgz#dfa4df015beba83f7c44d749a24987a74a419b59" - integrity sha512-xuhFygNc4c67QkVMqsArQ4qGRJX+qKwSx4LQIaASaZq91ACtU2r5iTjCDb/YFcUVxXXufNLvuFgARGJp5vvvxA== +"@abp/clipboard@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-9.0.1.tgz#b1712b2d940caecc85eb99247a569ffe3ab1a387" + integrity sha512-obDYqUTf+65E26yHZO2DigQOeDnzAEvak0Umz91cholZHVRvzc9X1itv/abS/whU0YOU/d8Viud8zFv1MnM83w== dependencies: - "@abp/core" "~9.0.0-rc.2" + "@abp/core" "~9.0.1" clipboard "^2.0.11" -"@abp/core@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-9.0.0-rc.2.tgz#f0344669a745581b1032de396b1165f4cb3ea834" - integrity sha512-rmlWc6ydzRWVvQpkqSGEXcmYx1WJvxLajC7Ts6epbmmyklrx+tA5uQqCiSlsJWfIyaejLOjDka319arukaMb/Q== +"@abp/core@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-9.0.1.tgz#727fc1dfac21cca1216c4f5091da7d5efefdb467" + integrity sha512-NWXDVCIJePbcKCrRvGxAlaA2MrOF2IZox37bQkW7/mTeOPpNoTa6lhowksNNcTpFq2YdD8bG0i0kfskkp3EZ2w== dependencies: - "@abp/utils" "~9.0.0-rc.2" + "@abp/utils" "~9.0.1" -"@abp/datatables.net-bs5@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-9.0.0-rc.2.tgz#7f01e5e74530cd9bb13545917f00a5c38163745a" - integrity sha512-snZi/kAtkH4p1t1cUIKU5DRDz+U2CUHk7JAZE+g9bClMvmDTh4Kta5JmTW3g++JSh+C0LQzYXRPXnV7TgUcBgw== +"@abp/datatables.net-bs5@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-9.0.1.tgz#61e2a3daacf1c074ed6b459e25084cc1f5c4eeab" + integrity sha512-tAHdf4TBAS0bVRcvovDKS0OHFyeRSPYbiSIwDn8AIWzW9Weav31jhZ5jL3HEtBKVdb7zqUQ8/3dYPufjDuDdDA== dependencies: - "@abp/datatables.net" "~9.0.0-rc.2" + "@abp/datatables.net" "~9.0.1" datatables.net-bs5 "^2.1.8" -"@abp/datatables.net@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-9.0.0-rc.2.tgz#cf5a5df0c6735080f2ba1f1746f4eb8d05d02c5b" - integrity sha512-hdJH5xN6SXTFZXnv+fTmcmFU19Fr2sIZMrfirUfH1of8qTn7cObjAe9r189PGt/3FZeFPA8pmfnNL6ZLwnLKtw== +"@abp/datatables.net@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-9.0.1.tgz#4cf193e7493f85a272de47326a32a021e3ba40f5" + integrity sha512-JY53zVQPluRrBiKwtgk4gfSgD8VDs/VU8LWizhGCprXt3h9vXx0SQL4My6zvXVkv4hUjaq4+MYo84OI8EwFvsg== dependencies: - "@abp/jquery" "~9.0.0-rc.2" + "@abp/jquery" "~9.0.1" datatables.net "^2.1.8" -"@abp/font-awesome@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-9.0.0-rc.2.tgz#1493057e28b2e1e8a434ff1599e8b4b72b8784d2" - integrity sha512-EsQYx89OBquIxqGLgjAgMpUeAnWW316ruAmmxzGsusVT9KuIL6iuA4j4bdM8/6wJgi6zm2A/bDBjiiDDg2Cyyg== +"@abp/font-awesome@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-9.0.1.tgz#69da15018e7e5f2ff0d3c0d113a4325f54ffc0c3" + integrity sha512-7NnYBmk0plLVElUWR1zohul87vE9wKJItemWT5Kskf/IJirKOvXwSSu+7Jg1LmnVtIxcH6qgRpJMmzuAJgawnQ== dependencies: - "@abp/core" "~9.0.0-rc.2" + "@abp/core" "~9.0.1" "@fortawesome/fontawesome-free" "^6.6.0" -"@abp/highlight.js@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/highlight.js/-/highlight.js-9.0.0-rc.2.tgz#c511f5cd29eef7089d491646ffe31797d4543be9" - integrity sha512-04XWQnuN2ri2Rlkauy7h3444RofCra4B/6GjN53YM3ekZ50Xhe3QsfMhkCzLn0Izgypa3FkNkFq86JvUbyH3Uw== +"@abp/highlight.js@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/highlight.js/-/highlight.js-9.0.1.tgz#22f135e73d5ee5ce14e31fe6c1a1b3eee6a91f55" + integrity sha512-K1EXCtRsc116c7UYcUXRVmrPFHDY4531+ij9P32EdP1/3AIwm50r+tz2epZV2GyIuGw/mVWyFB0vduqFlr0W3g== dependencies: - "@abp/core" "~9.0.0-rc.2" + "@abp/core" "~9.0.1" "@highlightjs/cdn-assets" "~11.10.0" -"@abp/jquery-form@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-9.0.0-rc.2.tgz#05a9082bc6c42fca3e001d97f77c0aa2e941448b" - integrity sha512-OUuwB/dgryiBG/iZCedwP2+8ot+PCeuAAMuZ1A/VXbNUJAbhiXF24tQM73wIhpAYcSc5egWjJ+VNTJKMKImTqA== +"@abp/jquery-form@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-9.0.1.tgz#35e0a23cf50b00e0d3b0886f097233b79144145b" + integrity sha512-9co0+Cver+RUSOpfuukSWQhR+TCnO9Dly4RTVRIKFksGVfN8hA70NqRrVxaASNNFv42ynK88FQK+2bLPswz/iw== dependencies: - "@abp/jquery" "~9.0.0-rc.2" + "@abp/jquery" "~9.0.1" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-9.0.0-rc.2.tgz#d38f053ad3a8509dc683dc3091128eb445579176" - integrity sha512-170ARAIz0NWuQnleB2nWPKYQl3x/Za2yxc0utjxY0rruHflNQPF2cMagLu+eBI6gDkThXNps74HiRPXOPdgc4A== +"@abp/jquery-validation-unobtrusive@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-9.0.1.tgz#f9564aabebf4d9f90b4ee5c3f3de0e1a348d8ecc" + integrity sha512-Zpz48wIFjq7eIApG/sEVjkfaJWZhcyCnlCtDf5eU3vvh82nRetbiCEAVLpZ4LVjorlyp3VvVAxReUSeeWflu8A== dependencies: - "@abp/jquery-validation" "~9.0.0-rc.2" + "@abp/jquery-validation" "~9.0.1" jquery-validation-unobtrusive "^4.0.0" -"@abp/jquery-validation@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-9.0.0-rc.2.tgz#79c96c7eb48d5bebb3e7e86f8f9e2d6e2e45c5cb" - integrity sha512-6W2LiLgcC4FGTMLsoNkRBJTqDq6YR3ctLKzRfis9kOigkd0QT/PnB/451rrVb7+BCl9luKaA8DDYF671S8klFA== +"@abp/jquery-validation@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-9.0.1.tgz#ad37a44e82fb32ec9bfe2b736dfc8a143fca89c7" + integrity sha512-uFSxiPMEkaPlcuyXIoKbeOIIRHo4IrgRbmnlHwI1uETrW60ENUdE2LJAVcYS77JROrjVtv8FPlaffWuva6sGeQ== dependencies: - "@abp/jquery" "~9.0.0-rc.2" + "@abp/jquery" "~9.0.1" jquery-validation "^1.21.0" -"@abp/jquery@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-9.0.0-rc.2.tgz#c8bd299d1b5558a4c3cef26b248d42e9a6303e33" - integrity sha512-GrO0gKdi20jlQ0YjWaddal0X0+5LkMpOAyMB1GdaDetLaaVjcZ+92zx1cApcAdIsCKgB+kyutRQv0b82o/EZPQ== +"@abp/jquery@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-9.0.1.tgz#ecce14644c753c581caee0df7bfafd3d083e70f0" + integrity sha512-z8EcnOveItAszbTsM9GFFDQSlcIg/ym6+WZME9uldLoetdxkmI9ij0knVeGj5eqMjQaHvTWwrVLObiBbZwYFWw== dependencies: - "@abp/core" "~9.0.0-rc.2" + "@abp/core" "~9.0.1" jquery "~3.7.1" -"@abp/lodash@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-9.0.0-rc.2.tgz#980a0ae2d95c83663f0f52f1b67b5cfb00d04b96" - integrity sha512-uwxv7WJqwRcGkVoB44JR1QJaMbe3RhCQsG6+Wee1Jjdgi2vkpFUCj2arM4Rxz1igntFjY2Z7NiBq+iL9HYIkSw== +"@abp/lodash@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-9.0.1.tgz#c52c8a4125ecfbeaad7badc5c28bf86d5168799a" + integrity sha512-D+/iOyh/O+jV80bK5vWxyn++IVmeRbZq/UaXanA4RKpzigxJUsgOiSD9lUj85BkfKn2YyFmoR39xwaAqkWoyRA== dependencies: - "@abp/core" "~9.0.0-rc.2" + "@abp/core" "~9.0.1" lodash "^4.17.21" -"@abp/luxon@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-9.0.0-rc.2.tgz#1bb0eae53b707371489a4e0edf2869d7acc71da8" - integrity sha512-iWE8sbBWxCbNYSO3TTTzeotGS6kAnIwCKos/96mtaYJ4wzPW9pgF7K94CvwLAAg9NTsx/J/OGdmhhM2cULhv+w== +"@abp/luxon@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-9.0.1.tgz#ac59a56653d51b997dbbde8ccc58dac5746a9ef4" + integrity sha512-1ZHXP5SGz05tQ1tzYmPcRiZwmkCKGX0KWFoV0zF3ATRaevzku9nXvSy7K6GIFkkgTb9f9XNx4/OBBF/GXkuRqw== dependencies: - "@abp/core" "~9.0.0-rc.2" + "@abp/core" "~9.0.1" luxon "^3.5.0" -"@abp/malihu-custom-scrollbar-plugin@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-9.0.0-rc.2.tgz#fce5c12be2bdf350b18aae52619309a474995442" - integrity sha512-e3JTnDSkjF9/MPh/nPqcvU8hkUxSMc5U6DnP169GBdVAYQwwnGD24x4QCWU7ch7s65FDJ8/uq7bYOcIAD0B+Dw== +"@abp/malihu-custom-scrollbar-plugin@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-9.0.1.tgz#9e60bcfb9f9d76fed9c50e45bf490d5abd0f4689" + integrity sha512-GkKPLg9Z9UTTSSpW2hYZYZ9IgCvDSOYJmyRSl/h4fG8cWMgGCPVpv8MPPu0+WtIfwW/mT4SPX9X+sjUlRL5XRQ== dependencies: - "@abp/core" "~9.0.0-rc.2" + "@abp/core" "~9.0.1" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/moment@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-9.0.0-rc.2.tgz#2fc0feaaa0a26436cf00a6beccaa64f505aef301" - integrity sha512-yqkgu0bo3ra6HVFdS2wlqwTysciYOJWi/ERFVS2MfUkAKFA0P7mv8Jg5tB4vGY2Km++7r22kCDRlK3KUPmk21g== +"@abp/moment@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-9.0.1.tgz#d67fa25017fe15dae10e0a0fcebb03aeb63d31d3" + integrity sha512-bTuCc7pi/DCtgz7t96UBU0wn9UGt4b50JhDCVeTKquh+gP1sgWoI5hyvEBkmgE4dcffO0yzZU2opHYTKYGl/OQ== dependencies: moment "^2.30.1" -"@abp/prismjs@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-9.0.0-rc.2.tgz#2de7bc2882fee46d3d7e2da1fb66bca6b06cc4dd" - integrity sha512-rQ4dVGk+lEHFFSIBsJPqijeh4k3UgoDMZL1rns2a6NR+QnR0J2Slx3Awt8SH+inQFH2JiLHVo9q4bG+81vCsag== +"@abp/prismjs@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-9.0.1.tgz#2693014c8161d561e7c7bef01d5cd24ee53be1b3" + integrity sha512-NwW+vpTiAsuJYNC/MEiAj0dGMWml95mAQD1Z0Djfsg9D6OpcLsdlgWX+KVdZvHoJ+SPgTDIqdt/0LnIv1w/XdA== dependencies: - "@abp/clipboard" "~9.0.0-rc.2" - "@abp/core" "~9.0.0-rc.2" + "@abp/clipboard" "~9.0.1" + "@abp/core" "~9.0.1" prismjs "^1.29.0" -"@abp/select2@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-9.0.0-rc.2.tgz#53806118fdfe9f9228e26c6867ce0e75e6572b81" - integrity sha512-arKdcs95+4zp5764iOz09aJ3C1F2SsBIzekpjpJwMBdLRfoleZZFm12itO8I4Jjb1R+2CkW6MXjLR5xL2aE0PQ== +"@abp/select2@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-9.0.1.tgz#9f1c5c27e72bef910fdf63fc3167f415d2ba8db8" + integrity sha512-epyYJH2gAOU2UvGn5FD6372hbW3fL7uZIgGpvfgEfa+l6HPdlV9B1OweU2xkONNCoylShAcP/y8qf+bUh8WDEA== dependencies: - "@abp/core" "~9.0.0-rc.2" + "@abp/core" "~9.0.1" select2 "^4.0.13" -"@abp/sweetalert2@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-9.0.0-rc.2.tgz#60b25d65b3e5eb53e18ba5b1f3663783562d2506" - integrity sha512-VJslD1AMDZJhOEko79UYIxIYeAmr1YUwJu8XNAurBGPa9sWGI+jPY/dYg3uptg8GEJHsFtog84m3nUQ/prRUcw== +"@abp/sweetalert2@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-9.0.1.tgz#a364b21665cb76e92640496dc8a77b8edbce4500" + integrity sha512-0RXR/lzy3qMJLisGUz4qrcA9Clu/Tt1ABGzB64ynG1t/l5XessQsIB5Hkt6MbSyOEsprRsq+ZtKH35CwTRPdAw== dependencies: - "@abp/core" "~9.0.0-rc.2" + "@abp/core" "~9.0.1" sweetalert2 "^11.14.1" -"@abp/timeago@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-9.0.0-rc.2.tgz#72a7da1eda19beb34c352f3f43d2f5181b0b926a" - integrity sha512-zRj+TssaDXW2OM4mNn47G1tRg4BZ2sqbEiiUIQrU9hHMHmxOf8bAJhqsouGDDZF3xetcwKhmLN08VWK1sqqpQA== +"@abp/timeago@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-9.0.1.tgz#d1b7e11fdc267bdb736ff4b591afd3fb81c07cce" + integrity sha512-dNfUQwilrY+JHxL5lwJ++ixYDGAs5lF1EDxKMQMIXD/ak5L8rkdLns8Otta7FhgDDny9UJ7XWQjYsG8ZxxybRQ== dependencies: - "@abp/jquery" "~9.0.0-rc.2" + "@abp/jquery" "~9.0.1" timeago "^1.6.7" -"@abp/toastr@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-9.0.0-rc.2.tgz#ddbf0b6362941f62c07c9820af59dcd6912331d0" - integrity sha512-l4z6z3Oc/JF4XJplqGETQtBkqzjbpobcfzEHeH6LjUeunLMEVQOtjhPUBLrhg4ZM0i9k46hmxsoOkWXu7tClyQ== +"@abp/toastr@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-9.0.1.tgz#2105a639d7cd4fa9c671b4215d719a78fef7e0ee" + integrity sha512-10KuHnSJOxkvzqs6Aim6GJp8xBuT+TsZqBE1KaXQnERPawmOo4+ME28kA/7lq8fvgFUNO3K41T2uuA1GPHVQcg== dependencies: - "@abp/jquery" "~9.0.0-rc.2" + "@abp/jquery" "~9.0.1" toastr "^2.1.4" -"@abp/utils@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-9.0.0-rc.2.tgz#e644889f1c1c4828b509aea9ae3ae48439a5b89d" - integrity sha512-eIL3syPE0LzPyeHV5+pgRxw3/H2YTmK2U9VEOUu26ExiCMIt5Waf8T92BjaH9sLrMD5P9ZAT2jWaxh+VTsEtKA== +"@abp/utils@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-9.0.1.tgz#dccaf7cf92147304d454ffb9a8664d52dc7e5c5a" + integrity sha512-7eOKT0ciKNdtuASck1kifyc4dC6CeebgxV+rx/EAi3YwPMDkqie6YwLGUqKdGW2N/MZ15JuDR6gkuZxKHEb0NQ== 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 596f9bd6a8..dbf6946a98 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.0.0-rc.2", - "@abp/prismjs": "~9.0.0-rc.2" + "@abp/aspnetcore.mvc.ui.theme.basic": "~9.0.1", + "@abp/prismjs": "~9.0.1" }, "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 4711769a05..cf7895df68 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.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-9.0.0-rc.2.tgz#db73b3121cbd02207842f0388999298df49392ac" - integrity sha512-vzUPdL1UJ+aXKcei0rCpm3VYX9twhmomd+HqfzcL65TtrXgIK8jCv4Wn0rRFfSGtUfM8OetIVVkmggIZusGTZQ== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~9.0.0-rc.2" - -"@abp/aspnetcore.mvc.ui.theme.shared@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-9.0.0-rc.2.tgz#acaeaa5e0b329e5d836a198f7a3563d141d7fc79" - integrity sha512-hs8AoZwOnrMYmFl7/GQc6EUr5Jz5lTXWgSmp0l/DdH7f3INYEgCrIp5qvLFyNu8CHv6Gbegw2vGdpfDQbkiasw== - dependencies: - "@abp/aspnetcore.mvc.ui" "~9.0.0-rc.2" - "@abp/bootstrap" "~9.0.0-rc.2" - "@abp/bootstrap-datepicker" "~9.0.0-rc.2" - "@abp/bootstrap-daterangepicker" "~9.0.0-rc.2" - "@abp/datatables.net-bs5" "~9.0.0-rc.2" - "@abp/font-awesome" "~9.0.0-rc.2" - "@abp/jquery-form" "~9.0.0-rc.2" - "@abp/jquery-validation-unobtrusive" "~9.0.0-rc.2" - "@abp/lodash" "~9.0.0-rc.2" - "@abp/luxon" "~9.0.0-rc.2" - "@abp/malihu-custom-scrollbar-plugin" "~9.0.0-rc.2" - "@abp/moment" "~9.0.0-rc.2" - "@abp/select2" "~9.0.0-rc.2" - "@abp/sweetalert2" "~9.0.0-rc.2" - "@abp/timeago" "~9.0.0-rc.2" - "@abp/toastr" "~9.0.0-rc.2" - -"@abp/aspnetcore.mvc.ui@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-9.0.0-rc.2.tgz#5fc82ab4872b955cf46d755e99c656e0420a3c64" - integrity sha512-gGfHAsznxFIqTk6OFuRzcJ8D65VWmHkRqQjzmd97GZ1lNXRGDNGtYXbC/L1bA88O+qAXzhQ/c47h6in9cGh38w== +"@abp/aspnetcore.mvc.ui.theme.basic@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-9.0.1.tgz#cdb6130ac6f8499f9a3f856b596c46745d056a30" + integrity sha512-JaxuDH8WTnZYX6C7CX7ZVHfhTDR/SxfwRvtJaGGijSX8QKd1DXpfi9lYEF4Y9k5b48YT/0slBqU5g0sLmBd3+g== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~9.0.1" + +"@abp/aspnetcore.mvc.ui.theme.shared@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-9.0.1.tgz#7a1be780a305aa0d0f467472fc721b6f710fda7a" + integrity sha512-vrgRYKNctdZYhPCQ2I6Z10gUI1S5ynDj+DgnV7x7a7G/juuHaOSbkRXgwrmJsmYLfGA7KFCoJcbpER8mmXQeHQ== + dependencies: + "@abp/aspnetcore.mvc.ui" "~9.0.1" + "@abp/bootstrap" "~9.0.1" + "@abp/bootstrap-datepicker" "~9.0.1" + "@abp/bootstrap-daterangepicker" "~9.0.1" + "@abp/datatables.net-bs5" "~9.0.1" + "@abp/font-awesome" "~9.0.1" + "@abp/jquery-form" "~9.0.1" + "@abp/jquery-validation-unobtrusive" "~9.0.1" + "@abp/lodash" "~9.0.1" + "@abp/luxon" "~9.0.1" + "@abp/malihu-custom-scrollbar-plugin" "~9.0.1" + "@abp/moment" "~9.0.1" + "@abp/select2" "~9.0.1" + "@abp/sweetalert2" "~9.0.1" + "@abp/timeago" "~9.0.1" + "@abp/toastr" "~9.0.1" + +"@abp/aspnetcore.mvc.ui@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-9.0.1.tgz#811dd91138efb82345fc06559b5d2feea88021af" + integrity sha512-KVbWCpBV7S1ViHYQP/hn4gSMzSiA2e8/zC0HND1fjE+1zXJqJyEWto1eg2DaKSOs/rmHD8WtFVMU4hCLQTCuIA== dependencies: ansi-colors "^4.1.3" -"@abp/bootstrap-datepicker@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-9.0.0-rc.2.tgz#884343a8c0b881e6612cbbbf1fb9af0f40cbc223" - integrity sha512-JqPKn0xFyqoA4smY3gtUE/HcbG5QmLtFpZNG/zMnDq2JEtJt13xee9FguYXrlMOrM9PqAwnq2Wrc8s71ROh8Zg== +"@abp/bootstrap-datepicker@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-9.0.1.tgz#21cd19090b9a571ddf5a9019bc17864c8685408c" + integrity sha512-LhgqBRr66x9gGTAyv1FuPAw8u8N77WQK2AfDkNgLueurM2+xMYQzH3pWWLhcN676/JXafxfALCfBoM8U7CfXLg== dependencies: bootstrap-datepicker "^1.10.0" -"@abp/bootstrap-daterangepicker@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-9.0.0-rc.2.tgz#bc0e134e36da111aaa25f7d4d3e90d394c873b50" - integrity sha512-5KChSBquD7pQNiI3TgJSYHw549Pxuom8TAg+44edjEKRvR7KUR8IkfdImlZYHPeLmoUTnnWXiFKOIxOi9OjLoA== +"@abp/bootstrap-daterangepicker@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-9.0.1.tgz#c19c23ede6fd868a147ea893d4fdecfa60b177f7" + integrity sha512-SlBVgiYa75uQyaGt5EVjduren7Po5UP26A1tXEQQr0hDia1+1TK0qxmJ2YxjeJpB7FwtcmJiofv5fngvJqhxIA== dependencies: bootstrap-daterangepicker "^3.1.0" -"@abp/bootstrap@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-9.0.0-rc.2.tgz#cf0b2567f44030d5d0620ca36d9d25999cd25e0e" - integrity sha512-Fkagr1fTyeKDtsvn7TKJKRkWNaYd6ZmE1IhLffwLwDpyt26JBYK3XqGXT+eHFXXpSxrgANERVogSN5E46IU1OQ== +"@abp/bootstrap@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-9.0.1.tgz#2360303ec24c8f3eb755b10fa6a953db6d858daf" + integrity sha512-uAfVNsUYSsRqgeO9JMnhJJlFoDmO3/lTvER/iYOqerF0X03KQnR8HZy2V3MD1D+fSh/4JuU6aAZFl6IQLinMKQ== dependencies: - "@abp/core" "~9.0.0-rc.2" + "@abp/core" "~9.0.1" bootstrap "^5.3.3" -"@abp/clipboard@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-9.0.0-rc.2.tgz#dfa4df015beba83f7c44d749a24987a74a419b59" - integrity sha512-xuhFygNc4c67QkVMqsArQ4qGRJX+qKwSx4LQIaASaZq91ACtU2r5iTjCDb/YFcUVxXXufNLvuFgARGJp5vvvxA== +"@abp/clipboard@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-9.0.1.tgz#b1712b2d940caecc85eb99247a569ffe3ab1a387" + integrity sha512-obDYqUTf+65E26yHZO2DigQOeDnzAEvak0Umz91cholZHVRvzc9X1itv/abS/whU0YOU/d8Viud8zFv1MnM83w== dependencies: - "@abp/core" "~9.0.0-rc.2" + "@abp/core" "~9.0.1" clipboard "^2.0.11" -"@abp/core@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-9.0.0-rc.2.tgz#f0344669a745581b1032de396b1165f4cb3ea834" - integrity sha512-rmlWc6ydzRWVvQpkqSGEXcmYx1WJvxLajC7Ts6epbmmyklrx+tA5uQqCiSlsJWfIyaejLOjDka319arukaMb/Q== +"@abp/core@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-9.0.1.tgz#727fc1dfac21cca1216c4f5091da7d5efefdb467" + integrity sha512-NWXDVCIJePbcKCrRvGxAlaA2MrOF2IZox37bQkW7/mTeOPpNoTa6lhowksNNcTpFq2YdD8bG0i0kfskkp3EZ2w== dependencies: - "@abp/utils" "~9.0.0-rc.2" + "@abp/utils" "~9.0.1" -"@abp/datatables.net-bs5@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-9.0.0-rc.2.tgz#7f01e5e74530cd9bb13545917f00a5c38163745a" - integrity sha512-snZi/kAtkH4p1t1cUIKU5DRDz+U2CUHk7JAZE+g9bClMvmDTh4Kta5JmTW3g++JSh+C0LQzYXRPXnV7TgUcBgw== +"@abp/datatables.net-bs5@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-9.0.1.tgz#61e2a3daacf1c074ed6b459e25084cc1f5c4eeab" + integrity sha512-tAHdf4TBAS0bVRcvovDKS0OHFyeRSPYbiSIwDn8AIWzW9Weav31jhZ5jL3HEtBKVdb7zqUQ8/3dYPufjDuDdDA== dependencies: - "@abp/datatables.net" "~9.0.0-rc.2" + "@abp/datatables.net" "~9.0.1" datatables.net-bs5 "^2.1.8" -"@abp/datatables.net@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-9.0.0-rc.2.tgz#cf5a5df0c6735080f2ba1f1746f4eb8d05d02c5b" - integrity sha512-hdJH5xN6SXTFZXnv+fTmcmFU19Fr2sIZMrfirUfH1of8qTn7cObjAe9r189PGt/3FZeFPA8pmfnNL6ZLwnLKtw== +"@abp/datatables.net@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-9.0.1.tgz#4cf193e7493f85a272de47326a32a021e3ba40f5" + integrity sha512-JY53zVQPluRrBiKwtgk4gfSgD8VDs/VU8LWizhGCprXt3h9vXx0SQL4My6zvXVkv4hUjaq4+MYo84OI8EwFvsg== dependencies: - "@abp/jquery" "~9.0.0-rc.2" + "@abp/jquery" "~9.0.1" datatables.net "^2.1.8" -"@abp/font-awesome@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-9.0.0-rc.2.tgz#1493057e28b2e1e8a434ff1599e8b4b72b8784d2" - integrity sha512-EsQYx89OBquIxqGLgjAgMpUeAnWW316ruAmmxzGsusVT9KuIL6iuA4j4bdM8/6wJgi6zm2A/bDBjiiDDg2Cyyg== +"@abp/font-awesome@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-9.0.1.tgz#69da15018e7e5f2ff0d3c0d113a4325f54ffc0c3" + integrity sha512-7NnYBmk0plLVElUWR1zohul87vE9wKJItemWT5Kskf/IJirKOvXwSSu+7Jg1LmnVtIxcH6qgRpJMmzuAJgawnQ== dependencies: - "@abp/core" "~9.0.0-rc.2" + "@abp/core" "~9.0.1" "@fortawesome/fontawesome-free" "^6.6.0" -"@abp/jquery-form@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-9.0.0-rc.2.tgz#05a9082bc6c42fca3e001d97f77c0aa2e941448b" - integrity sha512-OUuwB/dgryiBG/iZCedwP2+8ot+PCeuAAMuZ1A/VXbNUJAbhiXF24tQM73wIhpAYcSc5egWjJ+VNTJKMKImTqA== +"@abp/jquery-form@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-9.0.1.tgz#35e0a23cf50b00e0d3b0886f097233b79144145b" + integrity sha512-9co0+Cver+RUSOpfuukSWQhR+TCnO9Dly4RTVRIKFksGVfN8hA70NqRrVxaASNNFv42ynK88FQK+2bLPswz/iw== dependencies: - "@abp/jquery" "~9.0.0-rc.2" + "@abp/jquery" "~9.0.1" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-9.0.0-rc.2.tgz#d38f053ad3a8509dc683dc3091128eb445579176" - integrity sha512-170ARAIz0NWuQnleB2nWPKYQl3x/Za2yxc0utjxY0rruHflNQPF2cMagLu+eBI6gDkThXNps74HiRPXOPdgc4A== +"@abp/jquery-validation-unobtrusive@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-9.0.1.tgz#f9564aabebf4d9f90b4ee5c3f3de0e1a348d8ecc" + integrity sha512-Zpz48wIFjq7eIApG/sEVjkfaJWZhcyCnlCtDf5eU3vvh82nRetbiCEAVLpZ4LVjorlyp3VvVAxReUSeeWflu8A== dependencies: - "@abp/jquery-validation" "~9.0.0-rc.2" + "@abp/jquery-validation" "~9.0.1" jquery-validation-unobtrusive "^4.0.0" -"@abp/jquery-validation@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-9.0.0-rc.2.tgz#79c96c7eb48d5bebb3e7e86f8f9e2d6e2e45c5cb" - integrity sha512-6W2LiLgcC4FGTMLsoNkRBJTqDq6YR3ctLKzRfis9kOigkd0QT/PnB/451rrVb7+BCl9luKaA8DDYF671S8klFA== +"@abp/jquery-validation@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-9.0.1.tgz#ad37a44e82fb32ec9bfe2b736dfc8a143fca89c7" + integrity sha512-uFSxiPMEkaPlcuyXIoKbeOIIRHo4IrgRbmnlHwI1uETrW60ENUdE2LJAVcYS77JROrjVtv8FPlaffWuva6sGeQ== dependencies: - "@abp/jquery" "~9.0.0-rc.2" + "@abp/jquery" "~9.0.1" jquery-validation "^1.21.0" -"@abp/jquery@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-9.0.0-rc.2.tgz#c8bd299d1b5558a4c3cef26b248d42e9a6303e33" - integrity sha512-GrO0gKdi20jlQ0YjWaddal0X0+5LkMpOAyMB1GdaDetLaaVjcZ+92zx1cApcAdIsCKgB+kyutRQv0b82o/EZPQ== +"@abp/jquery@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-9.0.1.tgz#ecce14644c753c581caee0df7bfafd3d083e70f0" + integrity sha512-z8EcnOveItAszbTsM9GFFDQSlcIg/ym6+WZME9uldLoetdxkmI9ij0knVeGj5eqMjQaHvTWwrVLObiBbZwYFWw== dependencies: - "@abp/core" "~9.0.0-rc.2" + "@abp/core" "~9.0.1" jquery "~3.7.1" -"@abp/lodash@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-9.0.0-rc.2.tgz#980a0ae2d95c83663f0f52f1b67b5cfb00d04b96" - integrity sha512-uwxv7WJqwRcGkVoB44JR1QJaMbe3RhCQsG6+Wee1Jjdgi2vkpFUCj2arM4Rxz1igntFjY2Z7NiBq+iL9HYIkSw== +"@abp/lodash@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-9.0.1.tgz#c52c8a4125ecfbeaad7badc5c28bf86d5168799a" + integrity sha512-D+/iOyh/O+jV80bK5vWxyn++IVmeRbZq/UaXanA4RKpzigxJUsgOiSD9lUj85BkfKn2YyFmoR39xwaAqkWoyRA== dependencies: - "@abp/core" "~9.0.0-rc.2" + "@abp/core" "~9.0.1" lodash "^4.17.21" -"@abp/luxon@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-9.0.0-rc.2.tgz#1bb0eae53b707371489a4e0edf2869d7acc71da8" - integrity sha512-iWE8sbBWxCbNYSO3TTTzeotGS6kAnIwCKos/96mtaYJ4wzPW9pgF7K94CvwLAAg9NTsx/J/OGdmhhM2cULhv+w== +"@abp/luxon@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-9.0.1.tgz#ac59a56653d51b997dbbde8ccc58dac5746a9ef4" + integrity sha512-1ZHXP5SGz05tQ1tzYmPcRiZwmkCKGX0KWFoV0zF3ATRaevzku9nXvSy7K6GIFkkgTb9f9XNx4/OBBF/GXkuRqw== dependencies: - "@abp/core" "~9.0.0-rc.2" + "@abp/core" "~9.0.1" luxon "^3.5.0" -"@abp/malihu-custom-scrollbar-plugin@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-9.0.0-rc.2.tgz#fce5c12be2bdf350b18aae52619309a474995442" - integrity sha512-e3JTnDSkjF9/MPh/nPqcvU8hkUxSMc5U6DnP169GBdVAYQwwnGD24x4QCWU7ch7s65FDJ8/uq7bYOcIAD0B+Dw== +"@abp/malihu-custom-scrollbar-plugin@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-9.0.1.tgz#9e60bcfb9f9d76fed9c50e45bf490d5abd0f4689" + integrity sha512-GkKPLg9Z9UTTSSpW2hYZYZ9IgCvDSOYJmyRSl/h4fG8cWMgGCPVpv8MPPu0+WtIfwW/mT4SPX9X+sjUlRL5XRQ== dependencies: - "@abp/core" "~9.0.0-rc.2" + "@abp/core" "~9.0.1" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/moment@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-9.0.0-rc.2.tgz#2fc0feaaa0a26436cf00a6beccaa64f505aef301" - integrity sha512-yqkgu0bo3ra6HVFdS2wlqwTysciYOJWi/ERFVS2MfUkAKFA0P7mv8Jg5tB4vGY2Km++7r22kCDRlK3KUPmk21g== +"@abp/moment@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-9.0.1.tgz#d67fa25017fe15dae10e0a0fcebb03aeb63d31d3" + integrity sha512-bTuCc7pi/DCtgz7t96UBU0wn9UGt4b50JhDCVeTKquh+gP1sgWoI5hyvEBkmgE4dcffO0yzZU2opHYTKYGl/OQ== dependencies: moment "^2.30.1" -"@abp/prismjs@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-9.0.0-rc.2.tgz#2de7bc2882fee46d3d7e2da1fb66bca6b06cc4dd" - integrity sha512-rQ4dVGk+lEHFFSIBsJPqijeh4k3UgoDMZL1rns2a6NR+QnR0J2Slx3Awt8SH+inQFH2JiLHVo9q4bG+81vCsag== +"@abp/prismjs@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-9.0.1.tgz#2693014c8161d561e7c7bef01d5cd24ee53be1b3" + integrity sha512-NwW+vpTiAsuJYNC/MEiAj0dGMWml95mAQD1Z0Djfsg9D6OpcLsdlgWX+KVdZvHoJ+SPgTDIqdt/0LnIv1w/XdA== dependencies: - "@abp/clipboard" "~9.0.0-rc.2" - "@abp/core" "~9.0.0-rc.2" + "@abp/clipboard" "~9.0.1" + "@abp/core" "~9.0.1" prismjs "^1.29.0" -"@abp/select2@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-9.0.0-rc.2.tgz#53806118fdfe9f9228e26c6867ce0e75e6572b81" - integrity sha512-arKdcs95+4zp5764iOz09aJ3C1F2SsBIzekpjpJwMBdLRfoleZZFm12itO8I4Jjb1R+2CkW6MXjLR5xL2aE0PQ== +"@abp/select2@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-9.0.1.tgz#9f1c5c27e72bef910fdf63fc3167f415d2ba8db8" + integrity sha512-epyYJH2gAOU2UvGn5FD6372hbW3fL7uZIgGpvfgEfa+l6HPdlV9B1OweU2xkONNCoylShAcP/y8qf+bUh8WDEA== dependencies: - "@abp/core" "~9.0.0-rc.2" + "@abp/core" "~9.0.1" select2 "^4.0.13" -"@abp/sweetalert2@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-9.0.0-rc.2.tgz#60b25d65b3e5eb53e18ba5b1f3663783562d2506" - integrity sha512-VJslD1AMDZJhOEko79UYIxIYeAmr1YUwJu8XNAurBGPa9sWGI+jPY/dYg3uptg8GEJHsFtog84m3nUQ/prRUcw== +"@abp/sweetalert2@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-9.0.1.tgz#a364b21665cb76e92640496dc8a77b8edbce4500" + integrity sha512-0RXR/lzy3qMJLisGUz4qrcA9Clu/Tt1ABGzB64ynG1t/l5XessQsIB5Hkt6MbSyOEsprRsq+ZtKH35CwTRPdAw== dependencies: - "@abp/core" "~9.0.0-rc.2" + "@abp/core" "~9.0.1" sweetalert2 "^11.14.1" -"@abp/timeago@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-9.0.0-rc.2.tgz#72a7da1eda19beb34c352f3f43d2f5181b0b926a" - integrity sha512-zRj+TssaDXW2OM4mNn47G1tRg4BZ2sqbEiiUIQrU9hHMHmxOf8bAJhqsouGDDZF3xetcwKhmLN08VWK1sqqpQA== +"@abp/timeago@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-9.0.1.tgz#d1b7e11fdc267bdb736ff4b591afd3fb81c07cce" + integrity sha512-dNfUQwilrY+JHxL5lwJ++ixYDGAs5lF1EDxKMQMIXD/ak5L8rkdLns8Otta7FhgDDny9UJ7XWQjYsG8ZxxybRQ== dependencies: - "@abp/jquery" "~9.0.0-rc.2" + "@abp/jquery" "~9.0.1" timeago "^1.6.7" -"@abp/toastr@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-9.0.0-rc.2.tgz#ddbf0b6362941f62c07c9820af59dcd6912331d0" - integrity sha512-l4z6z3Oc/JF4XJplqGETQtBkqzjbpobcfzEHeH6LjUeunLMEVQOtjhPUBLrhg4ZM0i9k46hmxsoOkWXu7tClyQ== +"@abp/toastr@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-9.0.1.tgz#2105a639d7cd4fa9c671b4215d719a78fef7e0ee" + integrity sha512-10KuHnSJOxkvzqs6Aim6GJp8xBuT+TsZqBE1KaXQnERPawmOo4+ME28kA/7lq8fvgFUNO3K41T2uuA1GPHVQcg== dependencies: - "@abp/jquery" "~9.0.0-rc.2" + "@abp/jquery" "~9.0.1" toastr "^2.1.4" -"@abp/utils@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-9.0.0-rc.2.tgz#e644889f1c1c4828b509aea9ae3ae48439a5b89d" - integrity sha512-eIL3syPE0LzPyeHV5+pgRxw3/H2YTmK2U9VEOUu26ExiCMIt5Waf8T92BjaH9sLrMD5P9ZAT2jWaxh+VTsEtKA== +"@abp/utils@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-9.0.1.tgz#dccaf7cf92147304d454ffb9a8664d52dc7e5c5a" + integrity sha512-7eOKT0ciKNdtuASck1kifyc4dC6CeebgxV+rx/EAi3YwPMDkqie6YwLGUqKdGW2N/MZ15JuDR6gkuZxKHEb0NQ== dependencies: just-compare "^2.3.0" diff --git a/modules/blogging/app/Volo.BloggingTestApp/package.json b/modules/blogging/app/Volo.BloggingTestApp/package.json index 42628a1fcb..3d2acf8641 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.0.0-rc.2", - "@abp/blogging": "~9.0.0-rc.2" + "@abp/aspnetcore.mvc.ui.theme.basic": "~9.0.1", + "@abp/blogging": "~9.0.1" } } diff --git a/modules/blogging/app/Volo.BloggingTestApp/yarn.lock b/modules/blogging/app/Volo.BloggingTestApp/yarn.lock index 8aeea320e7..46619a0994 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.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-9.0.0-rc.2.tgz#db73b3121cbd02207842f0388999298df49392ac" - integrity sha512-vzUPdL1UJ+aXKcei0rCpm3VYX9twhmomd+HqfzcL65TtrXgIK8jCv4Wn0rRFfSGtUfM8OetIVVkmggIZusGTZQ== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~9.0.0-rc.2" - -"@abp/aspnetcore.mvc.ui.theme.shared@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-9.0.0-rc.2.tgz#acaeaa5e0b329e5d836a198f7a3563d141d7fc79" - integrity sha512-hs8AoZwOnrMYmFl7/GQc6EUr5Jz5lTXWgSmp0l/DdH7f3INYEgCrIp5qvLFyNu8CHv6Gbegw2vGdpfDQbkiasw== - dependencies: - "@abp/aspnetcore.mvc.ui" "~9.0.0-rc.2" - "@abp/bootstrap" "~9.0.0-rc.2" - "@abp/bootstrap-datepicker" "~9.0.0-rc.2" - "@abp/bootstrap-daterangepicker" "~9.0.0-rc.2" - "@abp/datatables.net-bs5" "~9.0.0-rc.2" - "@abp/font-awesome" "~9.0.0-rc.2" - "@abp/jquery-form" "~9.0.0-rc.2" - "@abp/jquery-validation-unobtrusive" "~9.0.0-rc.2" - "@abp/lodash" "~9.0.0-rc.2" - "@abp/luxon" "~9.0.0-rc.2" - "@abp/malihu-custom-scrollbar-plugin" "~9.0.0-rc.2" - "@abp/moment" "~9.0.0-rc.2" - "@abp/select2" "~9.0.0-rc.2" - "@abp/sweetalert2" "~9.0.0-rc.2" - "@abp/timeago" "~9.0.0-rc.2" - "@abp/toastr" "~9.0.0-rc.2" - -"@abp/aspnetcore.mvc.ui@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-9.0.0-rc.2.tgz#5fc82ab4872b955cf46d755e99c656e0420a3c64" - integrity sha512-gGfHAsznxFIqTk6OFuRzcJ8D65VWmHkRqQjzmd97GZ1lNXRGDNGtYXbC/L1bA88O+qAXzhQ/c47h6in9cGh38w== +"@abp/aspnetcore.mvc.ui.theme.basic@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-9.0.1.tgz#cdb6130ac6f8499f9a3f856b596c46745d056a30" + integrity sha512-JaxuDH8WTnZYX6C7CX7ZVHfhTDR/SxfwRvtJaGGijSX8QKd1DXpfi9lYEF4Y9k5b48YT/0slBqU5g0sLmBd3+g== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~9.0.1" + +"@abp/aspnetcore.mvc.ui.theme.shared@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-9.0.1.tgz#7a1be780a305aa0d0f467472fc721b6f710fda7a" + integrity sha512-vrgRYKNctdZYhPCQ2I6Z10gUI1S5ynDj+DgnV7x7a7G/juuHaOSbkRXgwrmJsmYLfGA7KFCoJcbpER8mmXQeHQ== + dependencies: + "@abp/aspnetcore.mvc.ui" "~9.0.1" + "@abp/bootstrap" "~9.0.1" + "@abp/bootstrap-datepicker" "~9.0.1" + "@abp/bootstrap-daterangepicker" "~9.0.1" + "@abp/datatables.net-bs5" "~9.0.1" + "@abp/font-awesome" "~9.0.1" + "@abp/jquery-form" "~9.0.1" + "@abp/jquery-validation-unobtrusive" "~9.0.1" + "@abp/lodash" "~9.0.1" + "@abp/luxon" "~9.0.1" + "@abp/malihu-custom-scrollbar-plugin" "~9.0.1" + "@abp/moment" "~9.0.1" + "@abp/select2" "~9.0.1" + "@abp/sweetalert2" "~9.0.1" + "@abp/timeago" "~9.0.1" + "@abp/toastr" "~9.0.1" + +"@abp/aspnetcore.mvc.ui@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-9.0.1.tgz#811dd91138efb82345fc06559b5d2feea88021af" + integrity sha512-KVbWCpBV7S1ViHYQP/hn4gSMzSiA2e8/zC0HND1fjE+1zXJqJyEWto1eg2DaKSOs/rmHD8WtFVMU4hCLQTCuIA== dependencies: ansi-colors "^4.1.3" -"@abp/blogging@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/blogging/-/blogging-9.0.0-rc.2.tgz#3cc6c811590156f0b9549dff7421b7638867c215" - integrity sha512-/zRHwKRKq4qJ0UDlbMvNR3n/bbNJ/7iHlcS8N5Fs8gOWqKhHMo9bH6F4vYIJ+d7C0nnlKU+KSN4Ldwyg69N/UA== +"@abp/blogging@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/blogging/-/blogging-9.0.1.tgz#7d5351b4e6b28bd25edf480e51d1a115699387ec" + integrity sha512-ocwDEWQe5bkDSObEX6As8DD2Kgsn8qgK0OZvNEZo5xPvpUNMnbcvG5tzdXMBbR+bb++J+M5VjDQydOWJ5uuxjw== dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~9.0.0-rc.2" - "@abp/owl.carousel" "~9.0.0-rc.2" - "@abp/prismjs" "~9.0.0-rc.2" - "@abp/tui-editor" "~9.0.0-rc.2" + "@abp/aspnetcore.mvc.ui.theme.shared" "~9.0.1" + "@abp/owl.carousel" "~9.0.1" + "@abp/prismjs" "~9.0.1" + "@abp/tui-editor" "~9.0.1" -"@abp/bootstrap-datepicker@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-9.0.0-rc.2.tgz#884343a8c0b881e6612cbbbf1fb9af0f40cbc223" - integrity sha512-JqPKn0xFyqoA4smY3gtUE/HcbG5QmLtFpZNG/zMnDq2JEtJt13xee9FguYXrlMOrM9PqAwnq2Wrc8s71ROh8Zg== +"@abp/bootstrap-datepicker@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-9.0.1.tgz#21cd19090b9a571ddf5a9019bc17864c8685408c" + integrity sha512-LhgqBRr66x9gGTAyv1FuPAw8u8N77WQK2AfDkNgLueurM2+xMYQzH3pWWLhcN676/JXafxfALCfBoM8U7CfXLg== dependencies: bootstrap-datepicker "^1.10.0" -"@abp/bootstrap-daterangepicker@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-9.0.0-rc.2.tgz#bc0e134e36da111aaa25f7d4d3e90d394c873b50" - integrity sha512-5KChSBquD7pQNiI3TgJSYHw549Pxuom8TAg+44edjEKRvR7KUR8IkfdImlZYHPeLmoUTnnWXiFKOIxOi9OjLoA== +"@abp/bootstrap-daterangepicker@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-9.0.1.tgz#c19c23ede6fd868a147ea893d4fdecfa60b177f7" + integrity sha512-SlBVgiYa75uQyaGt5EVjduren7Po5UP26A1tXEQQr0hDia1+1TK0qxmJ2YxjeJpB7FwtcmJiofv5fngvJqhxIA== dependencies: bootstrap-daterangepicker "^3.1.0" -"@abp/bootstrap@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-9.0.0-rc.2.tgz#cf0b2567f44030d5d0620ca36d9d25999cd25e0e" - integrity sha512-Fkagr1fTyeKDtsvn7TKJKRkWNaYd6ZmE1IhLffwLwDpyt26JBYK3XqGXT+eHFXXpSxrgANERVogSN5E46IU1OQ== +"@abp/bootstrap@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-9.0.1.tgz#2360303ec24c8f3eb755b10fa6a953db6d858daf" + integrity sha512-uAfVNsUYSsRqgeO9JMnhJJlFoDmO3/lTvER/iYOqerF0X03KQnR8HZy2V3MD1D+fSh/4JuU6aAZFl6IQLinMKQ== dependencies: - "@abp/core" "~9.0.0-rc.2" + "@abp/core" "~9.0.1" bootstrap "^5.3.3" -"@abp/clipboard@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-9.0.0-rc.2.tgz#dfa4df015beba83f7c44d749a24987a74a419b59" - integrity sha512-xuhFygNc4c67QkVMqsArQ4qGRJX+qKwSx4LQIaASaZq91ACtU2r5iTjCDb/YFcUVxXXufNLvuFgARGJp5vvvxA== +"@abp/clipboard@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-9.0.1.tgz#b1712b2d940caecc85eb99247a569ffe3ab1a387" + integrity sha512-obDYqUTf+65E26yHZO2DigQOeDnzAEvak0Umz91cholZHVRvzc9X1itv/abS/whU0YOU/d8Viud8zFv1MnM83w== dependencies: - "@abp/core" "~9.0.0-rc.2" + "@abp/core" "~9.0.1" clipboard "^2.0.11" -"@abp/core@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-9.0.0-rc.2.tgz#f0344669a745581b1032de396b1165f4cb3ea834" - integrity sha512-rmlWc6ydzRWVvQpkqSGEXcmYx1WJvxLajC7Ts6epbmmyklrx+tA5uQqCiSlsJWfIyaejLOjDka319arukaMb/Q== +"@abp/core@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-9.0.1.tgz#727fc1dfac21cca1216c4f5091da7d5efefdb467" + integrity sha512-NWXDVCIJePbcKCrRvGxAlaA2MrOF2IZox37bQkW7/mTeOPpNoTa6lhowksNNcTpFq2YdD8bG0i0kfskkp3EZ2w== dependencies: - "@abp/utils" "~9.0.0-rc.2" + "@abp/utils" "~9.0.1" -"@abp/datatables.net-bs5@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-9.0.0-rc.2.tgz#7f01e5e74530cd9bb13545917f00a5c38163745a" - integrity sha512-snZi/kAtkH4p1t1cUIKU5DRDz+U2CUHk7JAZE+g9bClMvmDTh4Kta5JmTW3g++JSh+C0LQzYXRPXnV7TgUcBgw== +"@abp/datatables.net-bs5@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-9.0.1.tgz#61e2a3daacf1c074ed6b459e25084cc1f5c4eeab" + integrity sha512-tAHdf4TBAS0bVRcvovDKS0OHFyeRSPYbiSIwDn8AIWzW9Weav31jhZ5jL3HEtBKVdb7zqUQ8/3dYPufjDuDdDA== dependencies: - "@abp/datatables.net" "~9.0.0-rc.2" + "@abp/datatables.net" "~9.0.1" datatables.net-bs5 "^2.1.8" -"@abp/datatables.net@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-9.0.0-rc.2.tgz#cf5a5df0c6735080f2ba1f1746f4eb8d05d02c5b" - integrity sha512-hdJH5xN6SXTFZXnv+fTmcmFU19Fr2sIZMrfirUfH1of8qTn7cObjAe9r189PGt/3FZeFPA8pmfnNL6ZLwnLKtw== +"@abp/datatables.net@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-9.0.1.tgz#4cf193e7493f85a272de47326a32a021e3ba40f5" + integrity sha512-JY53zVQPluRrBiKwtgk4gfSgD8VDs/VU8LWizhGCprXt3h9vXx0SQL4My6zvXVkv4hUjaq4+MYo84OI8EwFvsg== dependencies: - "@abp/jquery" "~9.0.0-rc.2" + "@abp/jquery" "~9.0.1" datatables.net "^2.1.8" -"@abp/font-awesome@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-9.0.0-rc.2.tgz#1493057e28b2e1e8a434ff1599e8b4b72b8784d2" - integrity sha512-EsQYx89OBquIxqGLgjAgMpUeAnWW316ruAmmxzGsusVT9KuIL6iuA4j4bdM8/6wJgi6zm2A/bDBjiiDDg2Cyyg== +"@abp/font-awesome@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-9.0.1.tgz#69da15018e7e5f2ff0d3c0d113a4325f54ffc0c3" + integrity sha512-7NnYBmk0plLVElUWR1zohul87vE9wKJItemWT5Kskf/IJirKOvXwSSu+7Jg1LmnVtIxcH6qgRpJMmzuAJgawnQ== dependencies: - "@abp/core" "~9.0.0-rc.2" + "@abp/core" "~9.0.1" "@fortawesome/fontawesome-free" "^6.6.0" -"@abp/jquery-form@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-9.0.0-rc.2.tgz#05a9082bc6c42fca3e001d97f77c0aa2e941448b" - integrity sha512-OUuwB/dgryiBG/iZCedwP2+8ot+PCeuAAMuZ1A/VXbNUJAbhiXF24tQM73wIhpAYcSc5egWjJ+VNTJKMKImTqA== +"@abp/jquery-form@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-9.0.1.tgz#35e0a23cf50b00e0d3b0886f097233b79144145b" + integrity sha512-9co0+Cver+RUSOpfuukSWQhR+TCnO9Dly4RTVRIKFksGVfN8hA70NqRrVxaASNNFv42ynK88FQK+2bLPswz/iw== dependencies: - "@abp/jquery" "~9.0.0-rc.2" + "@abp/jquery" "~9.0.1" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-9.0.0-rc.2.tgz#d38f053ad3a8509dc683dc3091128eb445579176" - integrity sha512-170ARAIz0NWuQnleB2nWPKYQl3x/Za2yxc0utjxY0rruHflNQPF2cMagLu+eBI6gDkThXNps74HiRPXOPdgc4A== +"@abp/jquery-validation-unobtrusive@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-9.0.1.tgz#f9564aabebf4d9f90b4ee5c3f3de0e1a348d8ecc" + integrity sha512-Zpz48wIFjq7eIApG/sEVjkfaJWZhcyCnlCtDf5eU3vvh82nRetbiCEAVLpZ4LVjorlyp3VvVAxReUSeeWflu8A== dependencies: - "@abp/jquery-validation" "~9.0.0-rc.2" + "@abp/jquery-validation" "~9.0.1" jquery-validation-unobtrusive "^4.0.0" -"@abp/jquery-validation@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-9.0.0-rc.2.tgz#79c96c7eb48d5bebb3e7e86f8f9e2d6e2e45c5cb" - integrity sha512-6W2LiLgcC4FGTMLsoNkRBJTqDq6YR3ctLKzRfis9kOigkd0QT/PnB/451rrVb7+BCl9luKaA8DDYF671S8klFA== +"@abp/jquery-validation@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-9.0.1.tgz#ad37a44e82fb32ec9bfe2b736dfc8a143fca89c7" + integrity sha512-uFSxiPMEkaPlcuyXIoKbeOIIRHo4IrgRbmnlHwI1uETrW60ENUdE2LJAVcYS77JROrjVtv8FPlaffWuva6sGeQ== dependencies: - "@abp/jquery" "~9.0.0-rc.2" + "@abp/jquery" "~9.0.1" jquery-validation "^1.21.0" -"@abp/jquery@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-9.0.0-rc.2.tgz#c8bd299d1b5558a4c3cef26b248d42e9a6303e33" - integrity sha512-GrO0gKdi20jlQ0YjWaddal0X0+5LkMpOAyMB1GdaDetLaaVjcZ+92zx1cApcAdIsCKgB+kyutRQv0b82o/EZPQ== +"@abp/jquery@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-9.0.1.tgz#ecce14644c753c581caee0df7bfafd3d083e70f0" + integrity sha512-z8EcnOveItAszbTsM9GFFDQSlcIg/ym6+WZME9uldLoetdxkmI9ij0knVeGj5eqMjQaHvTWwrVLObiBbZwYFWw== dependencies: - "@abp/core" "~9.0.0-rc.2" + "@abp/core" "~9.0.1" jquery "~3.7.1" -"@abp/lodash@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-9.0.0-rc.2.tgz#980a0ae2d95c83663f0f52f1b67b5cfb00d04b96" - integrity sha512-uwxv7WJqwRcGkVoB44JR1QJaMbe3RhCQsG6+Wee1Jjdgi2vkpFUCj2arM4Rxz1igntFjY2Z7NiBq+iL9HYIkSw== +"@abp/lodash@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-9.0.1.tgz#c52c8a4125ecfbeaad7badc5c28bf86d5168799a" + integrity sha512-D+/iOyh/O+jV80bK5vWxyn++IVmeRbZq/UaXanA4RKpzigxJUsgOiSD9lUj85BkfKn2YyFmoR39xwaAqkWoyRA== dependencies: - "@abp/core" "~9.0.0-rc.2" + "@abp/core" "~9.0.1" lodash "^4.17.21" -"@abp/luxon@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-9.0.0-rc.2.tgz#1bb0eae53b707371489a4e0edf2869d7acc71da8" - integrity sha512-iWE8sbBWxCbNYSO3TTTzeotGS6kAnIwCKos/96mtaYJ4wzPW9pgF7K94CvwLAAg9NTsx/J/OGdmhhM2cULhv+w== +"@abp/luxon@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-9.0.1.tgz#ac59a56653d51b997dbbde8ccc58dac5746a9ef4" + integrity sha512-1ZHXP5SGz05tQ1tzYmPcRiZwmkCKGX0KWFoV0zF3ATRaevzku9nXvSy7K6GIFkkgTb9f9XNx4/OBBF/GXkuRqw== dependencies: - "@abp/core" "~9.0.0-rc.2" + "@abp/core" "~9.0.1" luxon "^3.5.0" -"@abp/malihu-custom-scrollbar-plugin@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-9.0.0-rc.2.tgz#fce5c12be2bdf350b18aae52619309a474995442" - integrity sha512-e3JTnDSkjF9/MPh/nPqcvU8hkUxSMc5U6DnP169GBdVAYQwwnGD24x4QCWU7ch7s65FDJ8/uq7bYOcIAD0B+Dw== +"@abp/malihu-custom-scrollbar-plugin@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-9.0.1.tgz#9e60bcfb9f9d76fed9c50e45bf490d5abd0f4689" + integrity sha512-GkKPLg9Z9UTTSSpW2hYZYZ9IgCvDSOYJmyRSl/h4fG8cWMgGCPVpv8MPPu0+WtIfwW/mT4SPX9X+sjUlRL5XRQ== dependencies: - "@abp/core" "~9.0.0-rc.2" + "@abp/core" "~9.0.1" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/moment@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-9.0.0-rc.2.tgz#2fc0feaaa0a26436cf00a6beccaa64f505aef301" - integrity sha512-yqkgu0bo3ra6HVFdS2wlqwTysciYOJWi/ERFVS2MfUkAKFA0P7mv8Jg5tB4vGY2Km++7r22kCDRlK3KUPmk21g== +"@abp/moment@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-9.0.1.tgz#d67fa25017fe15dae10e0a0fcebb03aeb63d31d3" + integrity sha512-bTuCc7pi/DCtgz7t96UBU0wn9UGt4b50JhDCVeTKquh+gP1sgWoI5hyvEBkmgE4dcffO0yzZU2opHYTKYGl/OQ== dependencies: moment "^2.30.1" -"@abp/owl.carousel@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/owl.carousel/-/owl.carousel-9.0.0-rc.2.tgz#23871fd8ffe693670ea78bdeac52733558d1b266" - integrity sha512-GzD8XSr6dzlsOPYUPO1Ug7FUIIGwZA1O95STNKla8x02V40pbo+VgFrYg3TyHbY4u35eyl+xeNN5heJd57nr7w== +"@abp/owl.carousel@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/owl.carousel/-/owl.carousel-9.0.1.tgz#83e7f7448976ab66facaa4d4c27bf7dac3d37b07" + integrity sha512-kNE/iv6fvI4V+5suVgMPrmT0ACqi3TEW5wqn+mWq1SwfD1qGZG0p+60NCEuhMdNVLZKD3xvwn3Ba7+KFjmAd4w== dependencies: - "@abp/core" "~9.0.0-rc.2" + "@abp/core" "~9.0.1" owl.carousel "^2.3.4" -"@abp/prismjs@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-9.0.0-rc.2.tgz#2de7bc2882fee46d3d7e2da1fb66bca6b06cc4dd" - integrity sha512-rQ4dVGk+lEHFFSIBsJPqijeh4k3UgoDMZL1rns2a6NR+QnR0J2Slx3Awt8SH+inQFH2JiLHVo9q4bG+81vCsag== +"@abp/prismjs@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-9.0.1.tgz#2693014c8161d561e7c7bef01d5cd24ee53be1b3" + integrity sha512-NwW+vpTiAsuJYNC/MEiAj0dGMWml95mAQD1Z0Djfsg9D6OpcLsdlgWX+KVdZvHoJ+SPgTDIqdt/0LnIv1w/XdA== dependencies: - "@abp/clipboard" "~9.0.0-rc.2" - "@abp/core" "~9.0.0-rc.2" + "@abp/clipboard" "~9.0.1" + "@abp/core" "~9.0.1" prismjs "^1.29.0" -"@abp/select2@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-9.0.0-rc.2.tgz#53806118fdfe9f9228e26c6867ce0e75e6572b81" - integrity sha512-arKdcs95+4zp5764iOz09aJ3C1F2SsBIzekpjpJwMBdLRfoleZZFm12itO8I4Jjb1R+2CkW6MXjLR5xL2aE0PQ== +"@abp/select2@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-9.0.1.tgz#9f1c5c27e72bef910fdf63fc3167f415d2ba8db8" + integrity sha512-epyYJH2gAOU2UvGn5FD6372hbW3fL7uZIgGpvfgEfa+l6HPdlV9B1OweU2xkONNCoylShAcP/y8qf+bUh8WDEA== dependencies: - "@abp/core" "~9.0.0-rc.2" + "@abp/core" "~9.0.1" select2 "^4.0.13" -"@abp/sweetalert2@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-9.0.0-rc.2.tgz#60b25d65b3e5eb53e18ba5b1f3663783562d2506" - integrity sha512-VJslD1AMDZJhOEko79UYIxIYeAmr1YUwJu8XNAurBGPa9sWGI+jPY/dYg3uptg8GEJHsFtog84m3nUQ/prRUcw== +"@abp/sweetalert2@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-9.0.1.tgz#a364b21665cb76e92640496dc8a77b8edbce4500" + integrity sha512-0RXR/lzy3qMJLisGUz4qrcA9Clu/Tt1ABGzB64ynG1t/l5XessQsIB5Hkt6MbSyOEsprRsq+ZtKH35CwTRPdAw== dependencies: - "@abp/core" "~9.0.0-rc.2" + "@abp/core" "~9.0.1" sweetalert2 "^11.14.1" -"@abp/timeago@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-9.0.0-rc.2.tgz#72a7da1eda19beb34c352f3f43d2f5181b0b926a" - integrity sha512-zRj+TssaDXW2OM4mNn47G1tRg4BZ2sqbEiiUIQrU9hHMHmxOf8bAJhqsouGDDZF3xetcwKhmLN08VWK1sqqpQA== +"@abp/timeago@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-9.0.1.tgz#d1b7e11fdc267bdb736ff4b591afd3fb81c07cce" + integrity sha512-dNfUQwilrY+JHxL5lwJ++ixYDGAs5lF1EDxKMQMIXD/ak5L8rkdLns8Otta7FhgDDny9UJ7XWQjYsG8ZxxybRQ== dependencies: - "@abp/jquery" "~9.0.0-rc.2" + "@abp/jquery" "~9.0.1" timeago "^1.6.7" -"@abp/toastr@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-9.0.0-rc.2.tgz#ddbf0b6362941f62c07c9820af59dcd6912331d0" - integrity sha512-l4z6z3Oc/JF4XJplqGETQtBkqzjbpobcfzEHeH6LjUeunLMEVQOtjhPUBLrhg4ZM0i9k46hmxsoOkWXu7tClyQ== +"@abp/toastr@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-9.0.1.tgz#2105a639d7cd4fa9c671b4215d719a78fef7e0ee" + integrity sha512-10KuHnSJOxkvzqs6Aim6GJp8xBuT+TsZqBE1KaXQnERPawmOo4+ME28kA/7lq8fvgFUNO3K41T2uuA1GPHVQcg== dependencies: - "@abp/jquery" "~9.0.0-rc.2" + "@abp/jquery" "~9.0.1" toastr "^2.1.4" -"@abp/tui-editor@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/tui-editor/-/tui-editor-9.0.0-rc.2.tgz#abe8e13566b337be023881627d4bd0dd574ed89f" - integrity sha512-Skw3/+Rda6iIyygtlLeam2J0cAH27WNN3bKVavRK4NLvq3mp2qdiV2eHgfVcZDLyc1X2UbrrzkqD9BQ288S+ag== +"@abp/tui-editor@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/tui-editor/-/tui-editor-9.0.1.tgz#df2ef5101300f2f739c0c93b66f63ccd8492a42d" + integrity sha512-0H9AK4/YXsDmLruHMqk2uygWkWTR9pRRexGCr+IzoAeb+tljg15MnmlboTE9iNOntUug6Iml9tyY5gNOUuQXvQ== dependencies: - "@abp/jquery" "~9.0.0-rc.2" - "@abp/prismjs" "~9.0.0-rc.2" + "@abp/jquery" "~9.0.1" + "@abp/prismjs" "~9.0.1" -"@abp/utils@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-9.0.0-rc.2.tgz#e644889f1c1c4828b509aea9ae3ae48439a5b89d" - integrity sha512-eIL3syPE0LzPyeHV5+pgRxw3/H2YTmK2U9VEOUu26ExiCMIt5Waf8T92BjaH9sLrMD5P9ZAT2jWaxh+VTsEtKA== +"@abp/utils@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-9.0.1.tgz#dccaf7cf92147304d454ffb9a8664d52dc7e5c5a" + integrity sha512-7eOKT0ciKNdtuASck1kifyc4dC6CeebgxV+rx/EAi3YwPMDkqie6YwLGUqKdGW2N/MZ15JuDR6gkuZxKHEb0NQ== dependencies: just-compare "^2.3.0" diff --git a/modules/client-simulation/demo/Volo.ClientSimulation.Demo/package.json b/modules/client-simulation/demo/Volo.ClientSimulation.Demo/package.json index 487234559a..9f481e899f 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.0.0-rc.2" + "@abp/aspnetcore.mvc.ui.theme.basic": "~9.0.1" } } diff --git a/modules/client-simulation/demo/Volo.ClientSimulation.Demo/yarn.lock b/modules/client-simulation/demo/Volo.ClientSimulation.Demo/yarn.lock index db507796bb..0ac91bf6da 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.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-9.0.0-rc.2.tgz#db73b3121cbd02207842f0388999298df49392ac" - integrity sha512-vzUPdL1UJ+aXKcei0rCpm3VYX9twhmomd+HqfzcL65TtrXgIK8jCv4Wn0rRFfSGtUfM8OetIVVkmggIZusGTZQ== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~9.0.0-rc.2" - -"@abp/aspnetcore.mvc.ui.theme.shared@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-9.0.0-rc.2.tgz#acaeaa5e0b329e5d836a198f7a3563d141d7fc79" - integrity sha512-hs8AoZwOnrMYmFl7/GQc6EUr5Jz5lTXWgSmp0l/DdH7f3INYEgCrIp5qvLFyNu8CHv6Gbegw2vGdpfDQbkiasw== - dependencies: - "@abp/aspnetcore.mvc.ui" "~9.0.0-rc.2" - "@abp/bootstrap" "~9.0.0-rc.2" - "@abp/bootstrap-datepicker" "~9.0.0-rc.2" - "@abp/bootstrap-daterangepicker" "~9.0.0-rc.2" - "@abp/datatables.net-bs5" "~9.0.0-rc.2" - "@abp/font-awesome" "~9.0.0-rc.2" - "@abp/jquery-form" "~9.0.0-rc.2" - "@abp/jquery-validation-unobtrusive" "~9.0.0-rc.2" - "@abp/lodash" "~9.0.0-rc.2" - "@abp/luxon" "~9.0.0-rc.2" - "@abp/malihu-custom-scrollbar-plugin" "~9.0.0-rc.2" - "@abp/moment" "~9.0.0-rc.2" - "@abp/select2" "~9.0.0-rc.2" - "@abp/sweetalert2" "~9.0.0-rc.2" - "@abp/timeago" "~9.0.0-rc.2" - "@abp/toastr" "~9.0.0-rc.2" - -"@abp/aspnetcore.mvc.ui@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-9.0.0-rc.2.tgz#5fc82ab4872b955cf46d755e99c656e0420a3c64" - integrity sha512-gGfHAsznxFIqTk6OFuRzcJ8D65VWmHkRqQjzmd97GZ1lNXRGDNGtYXbC/L1bA88O+qAXzhQ/c47h6in9cGh38w== +"@abp/aspnetcore.mvc.ui.theme.basic@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-9.0.1.tgz#cdb6130ac6f8499f9a3f856b596c46745d056a30" + integrity sha512-JaxuDH8WTnZYX6C7CX7ZVHfhTDR/SxfwRvtJaGGijSX8QKd1DXpfi9lYEF4Y9k5b48YT/0slBqU5g0sLmBd3+g== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~9.0.1" + +"@abp/aspnetcore.mvc.ui.theme.shared@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-9.0.1.tgz#7a1be780a305aa0d0f467472fc721b6f710fda7a" + integrity sha512-vrgRYKNctdZYhPCQ2I6Z10gUI1S5ynDj+DgnV7x7a7G/juuHaOSbkRXgwrmJsmYLfGA7KFCoJcbpER8mmXQeHQ== + dependencies: + "@abp/aspnetcore.mvc.ui" "~9.0.1" + "@abp/bootstrap" "~9.0.1" + "@abp/bootstrap-datepicker" "~9.0.1" + "@abp/bootstrap-daterangepicker" "~9.0.1" + "@abp/datatables.net-bs5" "~9.0.1" + "@abp/font-awesome" "~9.0.1" + "@abp/jquery-form" "~9.0.1" + "@abp/jquery-validation-unobtrusive" "~9.0.1" + "@abp/lodash" "~9.0.1" + "@abp/luxon" "~9.0.1" + "@abp/malihu-custom-scrollbar-plugin" "~9.0.1" + "@abp/moment" "~9.0.1" + "@abp/select2" "~9.0.1" + "@abp/sweetalert2" "~9.0.1" + "@abp/timeago" "~9.0.1" + "@abp/toastr" "~9.0.1" + +"@abp/aspnetcore.mvc.ui@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-9.0.1.tgz#811dd91138efb82345fc06559b5d2feea88021af" + integrity sha512-KVbWCpBV7S1ViHYQP/hn4gSMzSiA2e8/zC0HND1fjE+1zXJqJyEWto1eg2DaKSOs/rmHD8WtFVMU4hCLQTCuIA== dependencies: ansi-colors "^4.1.3" -"@abp/bootstrap-datepicker@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-9.0.0-rc.2.tgz#884343a8c0b881e6612cbbbf1fb9af0f40cbc223" - integrity sha512-JqPKn0xFyqoA4smY3gtUE/HcbG5QmLtFpZNG/zMnDq2JEtJt13xee9FguYXrlMOrM9PqAwnq2Wrc8s71ROh8Zg== +"@abp/bootstrap-datepicker@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-9.0.1.tgz#21cd19090b9a571ddf5a9019bc17864c8685408c" + integrity sha512-LhgqBRr66x9gGTAyv1FuPAw8u8N77WQK2AfDkNgLueurM2+xMYQzH3pWWLhcN676/JXafxfALCfBoM8U7CfXLg== dependencies: bootstrap-datepicker "^1.10.0" -"@abp/bootstrap-daterangepicker@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-9.0.0-rc.2.tgz#bc0e134e36da111aaa25f7d4d3e90d394c873b50" - integrity sha512-5KChSBquD7pQNiI3TgJSYHw549Pxuom8TAg+44edjEKRvR7KUR8IkfdImlZYHPeLmoUTnnWXiFKOIxOi9OjLoA== +"@abp/bootstrap-daterangepicker@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-9.0.1.tgz#c19c23ede6fd868a147ea893d4fdecfa60b177f7" + integrity sha512-SlBVgiYa75uQyaGt5EVjduren7Po5UP26A1tXEQQr0hDia1+1TK0qxmJ2YxjeJpB7FwtcmJiofv5fngvJqhxIA== dependencies: bootstrap-daterangepicker "^3.1.0" -"@abp/bootstrap@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-9.0.0-rc.2.tgz#cf0b2567f44030d5d0620ca36d9d25999cd25e0e" - integrity sha512-Fkagr1fTyeKDtsvn7TKJKRkWNaYd6ZmE1IhLffwLwDpyt26JBYK3XqGXT+eHFXXpSxrgANERVogSN5E46IU1OQ== +"@abp/bootstrap@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-9.0.1.tgz#2360303ec24c8f3eb755b10fa6a953db6d858daf" + integrity sha512-uAfVNsUYSsRqgeO9JMnhJJlFoDmO3/lTvER/iYOqerF0X03KQnR8HZy2V3MD1D+fSh/4JuU6aAZFl6IQLinMKQ== dependencies: - "@abp/core" "~9.0.0-rc.2" + "@abp/core" "~9.0.1" bootstrap "^5.3.3" -"@abp/core@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-9.0.0-rc.2.tgz#f0344669a745581b1032de396b1165f4cb3ea834" - integrity sha512-rmlWc6ydzRWVvQpkqSGEXcmYx1WJvxLajC7Ts6epbmmyklrx+tA5uQqCiSlsJWfIyaejLOjDka319arukaMb/Q== +"@abp/core@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-9.0.1.tgz#727fc1dfac21cca1216c4f5091da7d5efefdb467" + integrity sha512-NWXDVCIJePbcKCrRvGxAlaA2MrOF2IZox37bQkW7/mTeOPpNoTa6lhowksNNcTpFq2YdD8bG0i0kfskkp3EZ2w== dependencies: - "@abp/utils" "~9.0.0-rc.2" + "@abp/utils" "~9.0.1" -"@abp/datatables.net-bs5@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-9.0.0-rc.2.tgz#7f01e5e74530cd9bb13545917f00a5c38163745a" - integrity sha512-snZi/kAtkH4p1t1cUIKU5DRDz+U2CUHk7JAZE+g9bClMvmDTh4Kta5JmTW3g++JSh+C0LQzYXRPXnV7TgUcBgw== +"@abp/datatables.net-bs5@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-9.0.1.tgz#61e2a3daacf1c074ed6b459e25084cc1f5c4eeab" + integrity sha512-tAHdf4TBAS0bVRcvovDKS0OHFyeRSPYbiSIwDn8AIWzW9Weav31jhZ5jL3HEtBKVdb7zqUQ8/3dYPufjDuDdDA== dependencies: - "@abp/datatables.net" "~9.0.0-rc.2" + "@abp/datatables.net" "~9.0.1" datatables.net-bs5 "^2.1.8" -"@abp/datatables.net@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-9.0.0-rc.2.tgz#cf5a5df0c6735080f2ba1f1746f4eb8d05d02c5b" - integrity sha512-hdJH5xN6SXTFZXnv+fTmcmFU19Fr2sIZMrfirUfH1of8qTn7cObjAe9r189PGt/3FZeFPA8pmfnNL6ZLwnLKtw== +"@abp/datatables.net@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-9.0.1.tgz#4cf193e7493f85a272de47326a32a021e3ba40f5" + integrity sha512-JY53zVQPluRrBiKwtgk4gfSgD8VDs/VU8LWizhGCprXt3h9vXx0SQL4My6zvXVkv4hUjaq4+MYo84OI8EwFvsg== dependencies: - "@abp/jquery" "~9.0.0-rc.2" + "@abp/jquery" "~9.0.1" datatables.net "^2.1.8" -"@abp/font-awesome@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-9.0.0-rc.2.tgz#1493057e28b2e1e8a434ff1599e8b4b72b8784d2" - integrity sha512-EsQYx89OBquIxqGLgjAgMpUeAnWW316ruAmmxzGsusVT9KuIL6iuA4j4bdM8/6wJgi6zm2A/bDBjiiDDg2Cyyg== +"@abp/font-awesome@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-9.0.1.tgz#69da15018e7e5f2ff0d3c0d113a4325f54ffc0c3" + integrity sha512-7NnYBmk0plLVElUWR1zohul87vE9wKJItemWT5Kskf/IJirKOvXwSSu+7Jg1LmnVtIxcH6qgRpJMmzuAJgawnQ== dependencies: - "@abp/core" "~9.0.0-rc.2" + "@abp/core" "~9.0.1" "@fortawesome/fontawesome-free" "^6.6.0" -"@abp/jquery-form@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-9.0.0-rc.2.tgz#05a9082bc6c42fca3e001d97f77c0aa2e941448b" - integrity sha512-OUuwB/dgryiBG/iZCedwP2+8ot+PCeuAAMuZ1A/VXbNUJAbhiXF24tQM73wIhpAYcSc5egWjJ+VNTJKMKImTqA== +"@abp/jquery-form@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-9.0.1.tgz#35e0a23cf50b00e0d3b0886f097233b79144145b" + integrity sha512-9co0+Cver+RUSOpfuukSWQhR+TCnO9Dly4RTVRIKFksGVfN8hA70NqRrVxaASNNFv42ynK88FQK+2bLPswz/iw== dependencies: - "@abp/jquery" "~9.0.0-rc.2" + "@abp/jquery" "~9.0.1" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-9.0.0-rc.2.tgz#d38f053ad3a8509dc683dc3091128eb445579176" - integrity sha512-170ARAIz0NWuQnleB2nWPKYQl3x/Za2yxc0utjxY0rruHflNQPF2cMagLu+eBI6gDkThXNps74HiRPXOPdgc4A== +"@abp/jquery-validation-unobtrusive@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-9.0.1.tgz#f9564aabebf4d9f90b4ee5c3f3de0e1a348d8ecc" + integrity sha512-Zpz48wIFjq7eIApG/sEVjkfaJWZhcyCnlCtDf5eU3vvh82nRetbiCEAVLpZ4LVjorlyp3VvVAxReUSeeWflu8A== dependencies: - "@abp/jquery-validation" "~9.0.0-rc.2" + "@abp/jquery-validation" "~9.0.1" jquery-validation-unobtrusive "^4.0.0" -"@abp/jquery-validation@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-9.0.0-rc.2.tgz#79c96c7eb48d5bebb3e7e86f8f9e2d6e2e45c5cb" - integrity sha512-6W2LiLgcC4FGTMLsoNkRBJTqDq6YR3ctLKzRfis9kOigkd0QT/PnB/451rrVb7+BCl9luKaA8DDYF671S8klFA== +"@abp/jquery-validation@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-9.0.1.tgz#ad37a44e82fb32ec9bfe2b736dfc8a143fca89c7" + integrity sha512-uFSxiPMEkaPlcuyXIoKbeOIIRHo4IrgRbmnlHwI1uETrW60ENUdE2LJAVcYS77JROrjVtv8FPlaffWuva6sGeQ== dependencies: - "@abp/jquery" "~9.0.0-rc.2" + "@abp/jquery" "~9.0.1" jquery-validation "^1.21.0" -"@abp/jquery@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-9.0.0-rc.2.tgz#c8bd299d1b5558a4c3cef26b248d42e9a6303e33" - integrity sha512-GrO0gKdi20jlQ0YjWaddal0X0+5LkMpOAyMB1GdaDetLaaVjcZ+92zx1cApcAdIsCKgB+kyutRQv0b82o/EZPQ== +"@abp/jquery@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-9.0.1.tgz#ecce14644c753c581caee0df7bfafd3d083e70f0" + integrity sha512-z8EcnOveItAszbTsM9GFFDQSlcIg/ym6+WZME9uldLoetdxkmI9ij0knVeGj5eqMjQaHvTWwrVLObiBbZwYFWw== dependencies: - "@abp/core" "~9.0.0-rc.2" + "@abp/core" "~9.0.1" jquery "~3.7.1" -"@abp/lodash@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-9.0.0-rc.2.tgz#980a0ae2d95c83663f0f52f1b67b5cfb00d04b96" - integrity sha512-uwxv7WJqwRcGkVoB44JR1QJaMbe3RhCQsG6+Wee1Jjdgi2vkpFUCj2arM4Rxz1igntFjY2Z7NiBq+iL9HYIkSw== +"@abp/lodash@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-9.0.1.tgz#c52c8a4125ecfbeaad7badc5c28bf86d5168799a" + integrity sha512-D+/iOyh/O+jV80bK5vWxyn++IVmeRbZq/UaXanA4RKpzigxJUsgOiSD9lUj85BkfKn2YyFmoR39xwaAqkWoyRA== dependencies: - "@abp/core" "~9.0.0-rc.2" + "@abp/core" "~9.0.1" lodash "^4.17.21" -"@abp/luxon@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-9.0.0-rc.2.tgz#1bb0eae53b707371489a4e0edf2869d7acc71da8" - integrity sha512-iWE8sbBWxCbNYSO3TTTzeotGS6kAnIwCKos/96mtaYJ4wzPW9pgF7K94CvwLAAg9NTsx/J/OGdmhhM2cULhv+w== +"@abp/luxon@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-9.0.1.tgz#ac59a56653d51b997dbbde8ccc58dac5746a9ef4" + integrity sha512-1ZHXP5SGz05tQ1tzYmPcRiZwmkCKGX0KWFoV0zF3ATRaevzku9nXvSy7K6GIFkkgTb9f9XNx4/OBBF/GXkuRqw== dependencies: - "@abp/core" "~9.0.0-rc.2" + "@abp/core" "~9.0.1" luxon "^3.5.0" -"@abp/malihu-custom-scrollbar-plugin@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-9.0.0-rc.2.tgz#fce5c12be2bdf350b18aae52619309a474995442" - integrity sha512-e3JTnDSkjF9/MPh/nPqcvU8hkUxSMc5U6DnP169GBdVAYQwwnGD24x4QCWU7ch7s65FDJ8/uq7bYOcIAD0B+Dw== +"@abp/malihu-custom-scrollbar-plugin@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-9.0.1.tgz#9e60bcfb9f9d76fed9c50e45bf490d5abd0f4689" + integrity sha512-GkKPLg9Z9UTTSSpW2hYZYZ9IgCvDSOYJmyRSl/h4fG8cWMgGCPVpv8MPPu0+WtIfwW/mT4SPX9X+sjUlRL5XRQ== dependencies: - "@abp/core" "~9.0.0-rc.2" + "@abp/core" "~9.0.1" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/moment@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-9.0.0-rc.2.tgz#2fc0feaaa0a26436cf00a6beccaa64f505aef301" - integrity sha512-yqkgu0bo3ra6HVFdS2wlqwTysciYOJWi/ERFVS2MfUkAKFA0P7mv8Jg5tB4vGY2Km++7r22kCDRlK3KUPmk21g== +"@abp/moment@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-9.0.1.tgz#d67fa25017fe15dae10e0a0fcebb03aeb63d31d3" + integrity sha512-bTuCc7pi/DCtgz7t96UBU0wn9UGt4b50JhDCVeTKquh+gP1sgWoI5hyvEBkmgE4dcffO0yzZU2opHYTKYGl/OQ== dependencies: moment "^2.30.1" -"@abp/select2@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-9.0.0-rc.2.tgz#53806118fdfe9f9228e26c6867ce0e75e6572b81" - integrity sha512-arKdcs95+4zp5764iOz09aJ3C1F2SsBIzekpjpJwMBdLRfoleZZFm12itO8I4Jjb1R+2CkW6MXjLR5xL2aE0PQ== +"@abp/select2@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-9.0.1.tgz#9f1c5c27e72bef910fdf63fc3167f415d2ba8db8" + integrity sha512-epyYJH2gAOU2UvGn5FD6372hbW3fL7uZIgGpvfgEfa+l6HPdlV9B1OweU2xkONNCoylShAcP/y8qf+bUh8WDEA== dependencies: - "@abp/core" "~9.0.0-rc.2" + "@abp/core" "~9.0.1" select2 "^4.0.13" -"@abp/sweetalert2@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-9.0.0-rc.2.tgz#60b25d65b3e5eb53e18ba5b1f3663783562d2506" - integrity sha512-VJslD1AMDZJhOEko79UYIxIYeAmr1YUwJu8XNAurBGPa9sWGI+jPY/dYg3uptg8GEJHsFtog84m3nUQ/prRUcw== +"@abp/sweetalert2@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-9.0.1.tgz#a364b21665cb76e92640496dc8a77b8edbce4500" + integrity sha512-0RXR/lzy3qMJLisGUz4qrcA9Clu/Tt1ABGzB64ynG1t/l5XessQsIB5Hkt6MbSyOEsprRsq+ZtKH35CwTRPdAw== dependencies: - "@abp/core" "~9.0.0-rc.2" + "@abp/core" "~9.0.1" sweetalert2 "^11.14.1" -"@abp/timeago@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-9.0.0-rc.2.tgz#72a7da1eda19beb34c352f3f43d2f5181b0b926a" - integrity sha512-zRj+TssaDXW2OM4mNn47G1tRg4BZ2sqbEiiUIQrU9hHMHmxOf8bAJhqsouGDDZF3xetcwKhmLN08VWK1sqqpQA== +"@abp/timeago@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-9.0.1.tgz#d1b7e11fdc267bdb736ff4b591afd3fb81c07cce" + integrity sha512-dNfUQwilrY+JHxL5lwJ++ixYDGAs5lF1EDxKMQMIXD/ak5L8rkdLns8Otta7FhgDDny9UJ7XWQjYsG8ZxxybRQ== dependencies: - "@abp/jquery" "~9.0.0-rc.2" + "@abp/jquery" "~9.0.1" timeago "^1.6.7" -"@abp/toastr@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-9.0.0-rc.2.tgz#ddbf0b6362941f62c07c9820af59dcd6912331d0" - integrity sha512-l4z6z3Oc/JF4XJplqGETQtBkqzjbpobcfzEHeH6LjUeunLMEVQOtjhPUBLrhg4ZM0i9k46hmxsoOkWXu7tClyQ== +"@abp/toastr@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-9.0.1.tgz#2105a639d7cd4fa9c671b4215d719a78fef7e0ee" + integrity sha512-10KuHnSJOxkvzqs6Aim6GJp8xBuT+TsZqBE1KaXQnERPawmOo4+ME28kA/7lq8fvgFUNO3K41T2uuA1GPHVQcg== dependencies: - "@abp/jquery" "~9.0.0-rc.2" + "@abp/jquery" "~9.0.1" toastr "^2.1.4" -"@abp/utils@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-9.0.0-rc.2.tgz#e644889f1c1c4828b509aea9ae3ae48439a5b89d" - integrity sha512-eIL3syPE0LzPyeHV5+pgRxw3/H2YTmK2U9VEOUu26ExiCMIt5Waf8T92BjaH9sLrMD5P9ZAT2jWaxh+VTsEtKA== +"@abp/utils@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-9.0.1.tgz#dccaf7cf92147304d454ffb9a8664d52dc7e5c5a" + integrity sha512-7eOKT0ciKNdtuASck1kifyc4dC6CeebgxV+rx/EAi3YwPMDkqie6YwLGUqKdGW2N/MZ15JuDR6gkuZxKHEb0NQ== dependencies: just-compare "^2.3.0" diff --git a/modules/cms-kit/angular/package.json b/modules/cms-kit/angular/package.json index 819a00231f..d22ed86827 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.0.0-rc.2", - "@abp/ng.identity": "~9.0.0-rc.2", - "@abp/ng.setting-management": "~9.0.0-rc.2", - "@abp/ng.tenant-management": "~9.0.0-rc.2", - "@abp/ng.theme.basic": "~9.0.0-rc.2", + "@abp/ng.account": "~9.0.1", + "@abp/ng.identity": "~9.0.1", + "@abp/ng.setting-management": "~9.0.1", + "@abp/ng.tenant-management": "~9.0.1", + "@abp/ng.theme.basic": "~9.0.1", "@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 85c8b8ae73..390734e951 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.0.0-rc.2", - "@abp/ng.theme.shared": ">=9.0.0-rc.2" + "@abp/ng.core": ">=9.0.1", + "@abp/ng.theme.shared": ">=9.0.1" }, "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 ad4c41c0b4..e1e64e5277 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.0.0-rc.2" + "@abp/aspnetcore.mvc.ui.theme.basic": "~9.0.1" } } diff --git a/modules/cms-kit/host/Volo.CmsKit.IdentityServer/yarn.lock b/modules/cms-kit/host/Volo.CmsKit.IdentityServer/yarn.lock index db507796bb..0ac91bf6da 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.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-9.0.0-rc.2.tgz#db73b3121cbd02207842f0388999298df49392ac" - integrity sha512-vzUPdL1UJ+aXKcei0rCpm3VYX9twhmomd+HqfzcL65TtrXgIK8jCv4Wn0rRFfSGtUfM8OetIVVkmggIZusGTZQ== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~9.0.0-rc.2" - -"@abp/aspnetcore.mvc.ui.theme.shared@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-9.0.0-rc.2.tgz#acaeaa5e0b329e5d836a198f7a3563d141d7fc79" - integrity sha512-hs8AoZwOnrMYmFl7/GQc6EUr5Jz5lTXWgSmp0l/DdH7f3INYEgCrIp5qvLFyNu8CHv6Gbegw2vGdpfDQbkiasw== - dependencies: - "@abp/aspnetcore.mvc.ui" "~9.0.0-rc.2" - "@abp/bootstrap" "~9.0.0-rc.2" - "@abp/bootstrap-datepicker" "~9.0.0-rc.2" - "@abp/bootstrap-daterangepicker" "~9.0.0-rc.2" - "@abp/datatables.net-bs5" "~9.0.0-rc.2" - "@abp/font-awesome" "~9.0.0-rc.2" - "@abp/jquery-form" "~9.0.0-rc.2" - "@abp/jquery-validation-unobtrusive" "~9.0.0-rc.2" - "@abp/lodash" "~9.0.0-rc.2" - "@abp/luxon" "~9.0.0-rc.2" - "@abp/malihu-custom-scrollbar-plugin" "~9.0.0-rc.2" - "@abp/moment" "~9.0.0-rc.2" - "@abp/select2" "~9.0.0-rc.2" - "@abp/sweetalert2" "~9.0.0-rc.2" - "@abp/timeago" "~9.0.0-rc.2" - "@abp/toastr" "~9.0.0-rc.2" - -"@abp/aspnetcore.mvc.ui@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-9.0.0-rc.2.tgz#5fc82ab4872b955cf46d755e99c656e0420a3c64" - integrity sha512-gGfHAsznxFIqTk6OFuRzcJ8D65VWmHkRqQjzmd97GZ1lNXRGDNGtYXbC/L1bA88O+qAXzhQ/c47h6in9cGh38w== +"@abp/aspnetcore.mvc.ui.theme.basic@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-9.0.1.tgz#cdb6130ac6f8499f9a3f856b596c46745d056a30" + integrity sha512-JaxuDH8WTnZYX6C7CX7ZVHfhTDR/SxfwRvtJaGGijSX8QKd1DXpfi9lYEF4Y9k5b48YT/0slBqU5g0sLmBd3+g== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~9.0.1" + +"@abp/aspnetcore.mvc.ui.theme.shared@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-9.0.1.tgz#7a1be780a305aa0d0f467472fc721b6f710fda7a" + integrity sha512-vrgRYKNctdZYhPCQ2I6Z10gUI1S5ynDj+DgnV7x7a7G/juuHaOSbkRXgwrmJsmYLfGA7KFCoJcbpER8mmXQeHQ== + dependencies: + "@abp/aspnetcore.mvc.ui" "~9.0.1" + "@abp/bootstrap" "~9.0.1" + "@abp/bootstrap-datepicker" "~9.0.1" + "@abp/bootstrap-daterangepicker" "~9.0.1" + "@abp/datatables.net-bs5" "~9.0.1" + "@abp/font-awesome" "~9.0.1" + "@abp/jquery-form" "~9.0.1" + "@abp/jquery-validation-unobtrusive" "~9.0.1" + "@abp/lodash" "~9.0.1" + "@abp/luxon" "~9.0.1" + "@abp/malihu-custom-scrollbar-plugin" "~9.0.1" + "@abp/moment" "~9.0.1" + "@abp/select2" "~9.0.1" + "@abp/sweetalert2" "~9.0.1" + "@abp/timeago" "~9.0.1" + "@abp/toastr" "~9.0.1" + +"@abp/aspnetcore.mvc.ui@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-9.0.1.tgz#811dd91138efb82345fc06559b5d2feea88021af" + integrity sha512-KVbWCpBV7S1ViHYQP/hn4gSMzSiA2e8/zC0HND1fjE+1zXJqJyEWto1eg2DaKSOs/rmHD8WtFVMU4hCLQTCuIA== dependencies: ansi-colors "^4.1.3" -"@abp/bootstrap-datepicker@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-9.0.0-rc.2.tgz#884343a8c0b881e6612cbbbf1fb9af0f40cbc223" - integrity sha512-JqPKn0xFyqoA4smY3gtUE/HcbG5QmLtFpZNG/zMnDq2JEtJt13xee9FguYXrlMOrM9PqAwnq2Wrc8s71ROh8Zg== +"@abp/bootstrap-datepicker@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-9.0.1.tgz#21cd19090b9a571ddf5a9019bc17864c8685408c" + integrity sha512-LhgqBRr66x9gGTAyv1FuPAw8u8N77WQK2AfDkNgLueurM2+xMYQzH3pWWLhcN676/JXafxfALCfBoM8U7CfXLg== dependencies: bootstrap-datepicker "^1.10.0" -"@abp/bootstrap-daterangepicker@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-9.0.0-rc.2.tgz#bc0e134e36da111aaa25f7d4d3e90d394c873b50" - integrity sha512-5KChSBquD7pQNiI3TgJSYHw549Pxuom8TAg+44edjEKRvR7KUR8IkfdImlZYHPeLmoUTnnWXiFKOIxOi9OjLoA== +"@abp/bootstrap-daterangepicker@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-9.0.1.tgz#c19c23ede6fd868a147ea893d4fdecfa60b177f7" + integrity sha512-SlBVgiYa75uQyaGt5EVjduren7Po5UP26A1tXEQQr0hDia1+1TK0qxmJ2YxjeJpB7FwtcmJiofv5fngvJqhxIA== dependencies: bootstrap-daterangepicker "^3.1.0" -"@abp/bootstrap@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-9.0.0-rc.2.tgz#cf0b2567f44030d5d0620ca36d9d25999cd25e0e" - integrity sha512-Fkagr1fTyeKDtsvn7TKJKRkWNaYd6ZmE1IhLffwLwDpyt26JBYK3XqGXT+eHFXXpSxrgANERVogSN5E46IU1OQ== +"@abp/bootstrap@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-9.0.1.tgz#2360303ec24c8f3eb755b10fa6a953db6d858daf" + integrity sha512-uAfVNsUYSsRqgeO9JMnhJJlFoDmO3/lTvER/iYOqerF0X03KQnR8HZy2V3MD1D+fSh/4JuU6aAZFl6IQLinMKQ== dependencies: - "@abp/core" "~9.0.0-rc.2" + "@abp/core" "~9.0.1" bootstrap "^5.3.3" -"@abp/core@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-9.0.0-rc.2.tgz#f0344669a745581b1032de396b1165f4cb3ea834" - integrity sha512-rmlWc6ydzRWVvQpkqSGEXcmYx1WJvxLajC7Ts6epbmmyklrx+tA5uQqCiSlsJWfIyaejLOjDka319arukaMb/Q== +"@abp/core@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-9.0.1.tgz#727fc1dfac21cca1216c4f5091da7d5efefdb467" + integrity sha512-NWXDVCIJePbcKCrRvGxAlaA2MrOF2IZox37bQkW7/mTeOPpNoTa6lhowksNNcTpFq2YdD8bG0i0kfskkp3EZ2w== dependencies: - "@abp/utils" "~9.0.0-rc.2" + "@abp/utils" "~9.0.1" -"@abp/datatables.net-bs5@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-9.0.0-rc.2.tgz#7f01e5e74530cd9bb13545917f00a5c38163745a" - integrity sha512-snZi/kAtkH4p1t1cUIKU5DRDz+U2CUHk7JAZE+g9bClMvmDTh4Kta5JmTW3g++JSh+C0LQzYXRPXnV7TgUcBgw== +"@abp/datatables.net-bs5@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-9.0.1.tgz#61e2a3daacf1c074ed6b459e25084cc1f5c4eeab" + integrity sha512-tAHdf4TBAS0bVRcvovDKS0OHFyeRSPYbiSIwDn8AIWzW9Weav31jhZ5jL3HEtBKVdb7zqUQ8/3dYPufjDuDdDA== dependencies: - "@abp/datatables.net" "~9.0.0-rc.2" + "@abp/datatables.net" "~9.0.1" datatables.net-bs5 "^2.1.8" -"@abp/datatables.net@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-9.0.0-rc.2.tgz#cf5a5df0c6735080f2ba1f1746f4eb8d05d02c5b" - integrity sha512-hdJH5xN6SXTFZXnv+fTmcmFU19Fr2sIZMrfirUfH1of8qTn7cObjAe9r189PGt/3FZeFPA8pmfnNL6ZLwnLKtw== +"@abp/datatables.net@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-9.0.1.tgz#4cf193e7493f85a272de47326a32a021e3ba40f5" + integrity sha512-JY53zVQPluRrBiKwtgk4gfSgD8VDs/VU8LWizhGCprXt3h9vXx0SQL4My6zvXVkv4hUjaq4+MYo84OI8EwFvsg== dependencies: - "@abp/jquery" "~9.0.0-rc.2" + "@abp/jquery" "~9.0.1" datatables.net "^2.1.8" -"@abp/font-awesome@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-9.0.0-rc.2.tgz#1493057e28b2e1e8a434ff1599e8b4b72b8784d2" - integrity sha512-EsQYx89OBquIxqGLgjAgMpUeAnWW316ruAmmxzGsusVT9KuIL6iuA4j4bdM8/6wJgi6zm2A/bDBjiiDDg2Cyyg== +"@abp/font-awesome@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-9.0.1.tgz#69da15018e7e5f2ff0d3c0d113a4325f54ffc0c3" + integrity sha512-7NnYBmk0plLVElUWR1zohul87vE9wKJItemWT5Kskf/IJirKOvXwSSu+7Jg1LmnVtIxcH6qgRpJMmzuAJgawnQ== dependencies: - "@abp/core" "~9.0.0-rc.2" + "@abp/core" "~9.0.1" "@fortawesome/fontawesome-free" "^6.6.0" -"@abp/jquery-form@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-9.0.0-rc.2.tgz#05a9082bc6c42fca3e001d97f77c0aa2e941448b" - integrity sha512-OUuwB/dgryiBG/iZCedwP2+8ot+PCeuAAMuZ1A/VXbNUJAbhiXF24tQM73wIhpAYcSc5egWjJ+VNTJKMKImTqA== +"@abp/jquery-form@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-9.0.1.tgz#35e0a23cf50b00e0d3b0886f097233b79144145b" + integrity sha512-9co0+Cver+RUSOpfuukSWQhR+TCnO9Dly4RTVRIKFksGVfN8hA70NqRrVxaASNNFv42ynK88FQK+2bLPswz/iw== dependencies: - "@abp/jquery" "~9.0.0-rc.2" + "@abp/jquery" "~9.0.1" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-9.0.0-rc.2.tgz#d38f053ad3a8509dc683dc3091128eb445579176" - integrity sha512-170ARAIz0NWuQnleB2nWPKYQl3x/Za2yxc0utjxY0rruHflNQPF2cMagLu+eBI6gDkThXNps74HiRPXOPdgc4A== +"@abp/jquery-validation-unobtrusive@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-9.0.1.tgz#f9564aabebf4d9f90b4ee5c3f3de0e1a348d8ecc" + integrity sha512-Zpz48wIFjq7eIApG/sEVjkfaJWZhcyCnlCtDf5eU3vvh82nRetbiCEAVLpZ4LVjorlyp3VvVAxReUSeeWflu8A== dependencies: - "@abp/jquery-validation" "~9.0.0-rc.2" + "@abp/jquery-validation" "~9.0.1" jquery-validation-unobtrusive "^4.0.0" -"@abp/jquery-validation@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-9.0.0-rc.2.tgz#79c96c7eb48d5bebb3e7e86f8f9e2d6e2e45c5cb" - integrity sha512-6W2LiLgcC4FGTMLsoNkRBJTqDq6YR3ctLKzRfis9kOigkd0QT/PnB/451rrVb7+BCl9luKaA8DDYF671S8klFA== +"@abp/jquery-validation@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-9.0.1.tgz#ad37a44e82fb32ec9bfe2b736dfc8a143fca89c7" + integrity sha512-uFSxiPMEkaPlcuyXIoKbeOIIRHo4IrgRbmnlHwI1uETrW60ENUdE2LJAVcYS77JROrjVtv8FPlaffWuva6sGeQ== dependencies: - "@abp/jquery" "~9.0.0-rc.2" + "@abp/jquery" "~9.0.1" jquery-validation "^1.21.0" -"@abp/jquery@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-9.0.0-rc.2.tgz#c8bd299d1b5558a4c3cef26b248d42e9a6303e33" - integrity sha512-GrO0gKdi20jlQ0YjWaddal0X0+5LkMpOAyMB1GdaDetLaaVjcZ+92zx1cApcAdIsCKgB+kyutRQv0b82o/EZPQ== +"@abp/jquery@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-9.0.1.tgz#ecce14644c753c581caee0df7bfafd3d083e70f0" + integrity sha512-z8EcnOveItAszbTsM9GFFDQSlcIg/ym6+WZME9uldLoetdxkmI9ij0knVeGj5eqMjQaHvTWwrVLObiBbZwYFWw== dependencies: - "@abp/core" "~9.0.0-rc.2" + "@abp/core" "~9.0.1" jquery "~3.7.1" -"@abp/lodash@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-9.0.0-rc.2.tgz#980a0ae2d95c83663f0f52f1b67b5cfb00d04b96" - integrity sha512-uwxv7WJqwRcGkVoB44JR1QJaMbe3RhCQsG6+Wee1Jjdgi2vkpFUCj2arM4Rxz1igntFjY2Z7NiBq+iL9HYIkSw== +"@abp/lodash@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-9.0.1.tgz#c52c8a4125ecfbeaad7badc5c28bf86d5168799a" + integrity sha512-D+/iOyh/O+jV80bK5vWxyn++IVmeRbZq/UaXanA4RKpzigxJUsgOiSD9lUj85BkfKn2YyFmoR39xwaAqkWoyRA== dependencies: - "@abp/core" "~9.0.0-rc.2" + "@abp/core" "~9.0.1" lodash "^4.17.21" -"@abp/luxon@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-9.0.0-rc.2.tgz#1bb0eae53b707371489a4e0edf2869d7acc71da8" - integrity sha512-iWE8sbBWxCbNYSO3TTTzeotGS6kAnIwCKos/96mtaYJ4wzPW9pgF7K94CvwLAAg9NTsx/J/OGdmhhM2cULhv+w== +"@abp/luxon@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-9.0.1.tgz#ac59a56653d51b997dbbde8ccc58dac5746a9ef4" + integrity sha512-1ZHXP5SGz05tQ1tzYmPcRiZwmkCKGX0KWFoV0zF3ATRaevzku9nXvSy7K6GIFkkgTb9f9XNx4/OBBF/GXkuRqw== dependencies: - "@abp/core" "~9.0.0-rc.2" + "@abp/core" "~9.0.1" luxon "^3.5.0" -"@abp/malihu-custom-scrollbar-plugin@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-9.0.0-rc.2.tgz#fce5c12be2bdf350b18aae52619309a474995442" - integrity sha512-e3JTnDSkjF9/MPh/nPqcvU8hkUxSMc5U6DnP169GBdVAYQwwnGD24x4QCWU7ch7s65FDJ8/uq7bYOcIAD0B+Dw== +"@abp/malihu-custom-scrollbar-plugin@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-9.0.1.tgz#9e60bcfb9f9d76fed9c50e45bf490d5abd0f4689" + integrity sha512-GkKPLg9Z9UTTSSpW2hYZYZ9IgCvDSOYJmyRSl/h4fG8cWMgGCPVpv8MPPu0+WtIfwW/mT4SPX9X+sjUlRL5XRQ== dependencies: - "@abp/core" "~9.0.0-rc.2" + "@abp/core" "~9.0.1" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/moment@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-9.0.0-rc.2.tgz#2fc0feaaa0a26436cf00a6beccaa64f505aef301" - integrity sha512-yqkgu0bo3ra6HVFdS2wlqwTysciYOJWi/ERFVS2MfUkAKFA0P7mv8Jg5tB4vGY2Km++7r22kCDRlK3KUPmk21g== +"@abp/moment@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-9.0.1.tgz#d67fa25017fe15dae10e0a0fcebb03aeb63d31d3" + integrity sha512-bTuCc7pi/DCtgz7t96UBU0wn9UGt4b50JhDCVeTKquh+gP1sgWoI5hyvEBkmgE4dcffO0yzZU2opHYTKYGl/OQ== dependencies: moment "^2.30.1" -"@abp/select2@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-9.0.0-rc.2.tgz#53806118fdfe9f9228e26c6867ce0e75e6572b81" - integrity sha512-arKdcs95+4zp5764iOz09aJ3C1F2SsBIzekpjpJwMBdLRfoleZZFm12itO8I4Jjb1R+2CkW6MXjLR5xL2aE0PQ== +"@abp/select2@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-9.0.1.tgz#9f1c5c27e72bef910fdf63fc3167f415d2ba8db8" + integrity sha512-epyYJH2gAOU2UvGn5FD6372hbW3fL7uZIgGpvfgEfa+l6HPdlV9B1OweU2xkONNCoylShAcP/y8qf+bUh8WDEA== dependencies: - "@abp/core" "~9.0.0-rc.2" + "@abp/core" "~9.0.1" select2 "^4.0.13" -"@abp/sweetalert2@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-9.0.0-rc.2.tgz#60b25d65b3e5eb53e18ba5b1f3663783562d2506" - integrity sha512-VJslD1AMDZJhOEko79UYIxIYeAmr1YUwJu8XNAurBGPa9sWGI+jPY/dYg3uptg8GEJHsFtog84m3nUQ/prRUcw== +"@abp/sweetalert2@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-9.0.1.tgz#a364b21665cb76e92640496dc8a77b8edbce4500" + integrity sha512-0RXR/lzy3qMJLisGUz4qrcA9Clu/Tt1ABGzB64ynG1t/l5XessQsIB5Hkt6MbSyOEsprRsq+ZtKH35CwTRPdAw== dependencies: - "@abp/core" "~9.0.0-rc.2" + "@abp/core" "~9.0.1" sweetalert2 "^11.14.1" -"@abp/timeago@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-9.0.0-rc.2.tgz#72a7da1eda19beb34c352f3f43d2f5181b0b926a" - integrity sha512-zRj+TssaDXW2OM4mNn47G1tRg4BZ2sqbEiiUIQrU9hHMHmxOf8bAJhqsouGDDZF3xetcwKhmLN08VWK1sqqpQA== +"@abp/timeago@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-9.0.1.tgz#d1b7e11fdc267bdb736ff4b591afd3fb81c07cce" + integrity sha512-dNfUQwilrY+JHxL5lwJ++ixYDGAs5lF1EDxKMQMIXD/ak5L8rkdLns8Otta7FhgDDny9UJ7XWQjYsG8ZxxybRQ== dependencies: - "@abp/jquery" "~9.0.0-rc.2" + "@abp/jquery" "~9.0.1" timeago "^1.6.7" -"@abp/toastr@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-9.0.0-rc.2.tgz#ddbf0b6362941f62c07c9820af59dcd6912331d0" - integrity sha512-l4z6z3Oc/JF4XJplqGETQtBkqzjbpobcfzEHeH6LjUeunLMEVQOtjhPUBLrhg4ZM0i9k46hmxsoOkWXu7tClyQ== +"@abp/toastr@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-9.0.1.tgz#2105a639d7cd4fa9c671b4215d719a78fef7e0ee" + integrity sha512-10KuHnSJOxkvzqs6Aim6GJp8xBuT+TsZqBE1KaXQnERPawmOo4+ME28kA/7lq8fvgFUNO3K41T2uuA1GPHVQcg== dependencies: - "@abp/jquery" "~9.0.0-rc.2" + "@abp/jquery" "~9.0.1" toastr "^2.1.4" -"@abp/utils@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-9.0.0-rc.2.tgz#e644889f1c1c4828b509aea9ae3ae48439a5b89d" - integrity sha512-eIL3syPE0LzPyeHV5+pgRxw3/H2YTmK2U9VEOUu26ExiCMIt5Waf8T92BjaH9sLrMD5P9ZAT2jWaxh+VTsEtKA== +"@abp/utils@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-9.0.1.tgz#dccaf7cf92147304d454ffb9a8664d52dc7e5c5a" + integrity sha512-7eOKT0ciKNdtuASck1kifyc4dC6CeebgxV+rx/EAi3YwPMDkqie6YwLGUqKdGW2N/MZ15JuDR6gkuZxKHEb0NQ== 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 49894b8882..716eaed26c 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.0.0-rc.2" + "@abp/aspnetcore.mvc.ui.theme.basic": "~9.0.1" } } 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 db507796bb..0ac91bf6da 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.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-9.0.0-rc.2.tgz#db73b3121cbd02207842f0388999298df49392ac" - integrity sha512-vzUPdL1UJ+aXKcei0rCpm3VYX9twhmomd+HqfzcL65TtrXgIK8jCv4Wn0rRFfSGtUfM8OetIVVkmggIZusGTZQ== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~9.0.0-rc.2" - -"@abp/aspnetcore.mvc.ui.theme.shared@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-9.0.0-rc.2.tgz#acaeaa5e0b329e5d836a198f7a3563d141d7fc79" - integrity sha512-hs8AoZwOnrMYmFl7/GQc6EUr5Jz5lTXWgSmp0l/DdH7f3INYEgCrIp5qvLFyNu8CHv6Gbegw2vGdpfDQbkiasw== - dependencies: - "@abp/aspnetcore.mvc.ui" "~9.0.0-rc.2" - "@abp/bootstrap" "~9.0.0-rc.2" - "@abp/bootstrap-datepicker" "~9.0.0-rc.2" - "@abp/bootstrap-daterangepicker" "~9.0.0-rc.2" - "@abp/datatables.net-bs5" "~9.0.0-rc.2" - "@abp/font-awesome" "~9.0.0-rc.2" - "@abp/jquery-form" "~9.0.0-rc.2" - "@abp/jquery-validation-unobtrusive" "~9.0.0-rc.2" - "@abp/lodash" "~9.0.0-rc.2" - "@abp/luxon" "~9.0.0-rc.2" - "@abp/malihu-custom-scrollbar-plugin" "~9.0.0-rc.2" - "@abp/moment" "~9.0.0-rc.2" - "@abp/select2" "~9.0.0-rc.2" - "@abp/sweetalert2" "~9.0.0-rc.2" - "@abp/timeago" "~9.0.0-rc.2" - "@abp/toastr" "~9.0.0-rc.2" - -"@abp/aspnetcore.mvc.ui@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-9.0.0-rc.2.tgz#5fc82ab4872b955cf46d755e99c656e0420a3c64" - integrity sha512-gGfHAsznxFIqTk6OFuRzcJ8D65VWmHkRqQjzmd97GZ1lNXRGDNGtYXbC/L1bA88O+qAXzhQ/c47h6in9cGh38w== +"@abp/aspnetcore.mvc.ui.theme.basic@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-9.0.1.tgz#cdb6130ac6f8499f9a3f856b596c46745d056a30" + integrity sha512-JaxuDH8WTnZYX6C7CX7ZVHfhTDR/SxfwRvtJaGGijSX8QKd1DXpfi9lYEF4Y9k5b48YT/0slBqU5g0sLmBd3+g== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~9.0.1" + +"@abp/aspnetcore.mvc.ui.theme.shared@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-9.0.1.tgz#7a1be780a305aa0d0f467472fc721b6f710fda7a" + integrity sha512-vrgRYKNctdZYhPCQ2I6Z10gUI1S5ynDj+DgnV7x7a7G/juuHaOSbkRXgwrmJsmYLfGA7KFCoJcbpER8mmXQeHQ== + dependencies: + "@abp/aspnetcore.mvc.ui" "~9.0.1" + "@abp/bootstrap" "~9.0.1" + "@abp/bootstrap-datepicker" "~9.0.1" + "@abp/bootstrap-daterangepicker" "~9.0.1" + "@abp/datatables.net-bs5" "~9.0.1" + "@abp/font-awesome" "~9.0.1" + "@abp/jquery-form" "~9.0.1" + "@abp/jquery-validation-unobtrusive" "~9.0.1" + "@abp/lodash" "~9.0.1" + "@abp/luxon" "~9.0.1" + "@abp/malihu-custom-scrollbar-plugin" "~9.0.1" + "@abp/moment" "~9.0.1" + "@abp/select2" "~9.0.1" + "@abp/sweetalert2" "~9.0.1" + "@abp/timeago" "~9.0.1" + "@abp/toastr" "~9.0.1" + +"@abp/aspnetcore.mvc.ui@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-9.0.1.tgz#811dd91138efb82345fc06559b5d2feea88021af" + integrity sha512-KVbWCpBV7S1ViHYQP/hn4gSMzSiA2e8/zC0HND1fjE+1zXJqJyEWto1eg2DaKSOs/rmHD8WtFVMU4hCLQTCuIA== dependencies: ansi-colors "^4.1.3" -"@abp/bootstrap-datepicker@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-9.0.0-rc.2.tgz#884343a8c0b881e6612cbbbf1fb9af0f40cbc223" - integrity sha512-JqPKn0xFyqoA4smY3gtUE/HcbG5QmLtFpZNG/zMnDq2JEtJt13xee9FguYXrlMOrM9PqAwnq2Wrc8s71ROh8Zg== +"@abp/bootstrap-datepicker@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-9.0.1.tgz#21cd19090b9a571ddf5a9019bc17864c8685408c" + integrity sha512-LhgqBRr66x9gGTAyv1FuPAw8u8N77WQK2AfDkNgLueurM2+xMYQzH3pWWLhcN676/JXafxfALCfBoM8U7CfXLg== dependencies: bootstrap-datepicker "^1.10.0" -"@abp/bootstrap-daterangepicker@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-9.0.0-rc.2.tgz#bc0e134e36da111aaa25f7d4d3e90d394c873b50" - integrity sha512-5KChSBquD7pQNiI3TgJSYHw549Pxuom8TAg+44edjEKRvR7KUR8IkfdImlZYHPeLmoUTnnWXiFKOIxOi9OjLoA== +"@abp/bootstrap-daterangepicker@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-9.0.1.tgz#c19c23ede6fd868a147ea893d4fdecfa60b177f7" + integrity sha512-SlBVgiYa75uQyaGt5EVjduren7Po5UP26A1tXEQQr0hDia1+1TK0qxmJ2YxjeJpB7FwtcmJiofv5fngvJqhxIA== dependencies: bootstrap-daterangepicker "^3.1.0" -"@abp/bootstrap@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-9.0.0-rc.2.tgz#cf0b2567f44030d5d0620ca36d9d25999cd25e0e" - integrity sha512-Fkagr1fTyeKDtsvn7TKJKRkWNaYd6ZmE1IhLffwLwDpyt26JBYK3XqGXT+eHFXXpSxrgANERVogSN5E46IU1OQ== +"@abp/bootstrap@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-9.0.1.tgz#2360303ec24c8f3eb755b10fa6a953db6d858daf" + integrity sha512-uAfVNsUYSsRqgeO9JMnhJJlFoDmO3/lTvER/iYOqerF0X03KQnR8HZy2V3MD1D+fSh/4JuU6aAZFl6IQLinMKQ== dependencies: - "@abp/core" "~9.0.0-rc.2" + "@abp/core" "~9.0.1" bootstrap "^5.3.3" -"@abp/core@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-9.0.0-rc.2.tgz#f0344669a745581b1032de396b1165f4cb3ea834" - integrity sha512-rmlWc6ydzRWVvQpkqSGEXcmYx1WJvxLajC7Ts6epbmmyklrx+tA5uQqCiSlsJWfIyaejLOjDka319arukaMb/Q== +"@abp/core@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-9.0.1.tgz#727fc1dfac21cca1216c4f5091da7d5efefdb467" + integrity sha512-NWXDVCIJePbcKCrRvGxAlaA2MrOF2IZox37bQkW7/mTeOPpNoTa6lhowksNNcTpFq2YdD8bG0i0kfskkp3EZ2w== dependencies: - "@abp/utils" "~9.0.0-rc.2" + "@abp/utils" "~9.0.1" -"@abp/datatables.net-bs5@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-9.0.0-rc.2.tgz#7f01e5e74530cd9bb13545917f00a5c38163745a" - integrity sha512-snZi/kAtkH4p1t1cUIKU5DRDz+U2CUHk7JAZE+g9bClMvmDTh4Kta5JmTW3g++JSh+C0LQzYXRPXnV7TgUcBgw== +"@abp/datatables.net-bs5@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-9.0.1.tgz#61e2a3daacf1c074ed6b459e25084cc1f5c4eeab" + integrity sha512-tAHdf4TBAS0bVRcvovDKS0OHFyeRSPYbiSIwDn8AIWzW9Weav31jhZ5jL3HEtBKVdb7zqUQ8/3dYPufjDuDdDA== dependencies: - "@abp/datatables.net" "~9.0.0-rc.2" + "@abp/datatables.net" "~9.0.1" datatables.net-bs5 "^2.1.8" -"@abp/datatables.net@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-9.0.0-rc.2.tgz#cf5a5df0c6735080f2ba1f1746f4eb8d05d02c5b" - integrity sha512-hdJH5xN6SXTFZXnv+fTmcmFU19Fr2sIZMrfirUfH1of8qTn7cObjAe9r189PGt/3FZeFPA8pmfnNL6ZLwnLKtw== +"@abp/datatables.net@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-9.0.1.tgz#4cf193e7493f85a272de47326a32a021e3ba40f5" + integrity sha512-JY53zVQPluRrBiKwtgk4gfSgD8VDs/VU8LWizhGCprXt3h9vXx0SQL4My6zvXVkv4hUjaq4+MYo84OI8EwFvsg== dependencies: - "@abp/jquery" "~9.0.0-rc.2" + "@abp/jquery" "~9.0.1" datatables.net "^2.1.8" -"@abp/font-awesome@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-9.0.0-rc.2.tgz#1493057e28b2e1e8a434ff1599e8b4b72b8784d2" - integrity sha512-EsQYx89OBquIxqGLgjAgMpUeAnWW316ruAmmxzGsusVT9KuIL6iuA4j4bdM8/6wJgi6zm2A/bDBjiiDDg2Cyyg== +"@abp/font-awesome@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-9.0.1.tgz#69da15018e7e5f2ff0d3c0d113a4325f54ffc0c3" + integrity sha512-7NnYBmk0plLVElUWR1zohul87vE9wKJItemWT5Kskf/IJirKOvXwSSu+7Jg1LmnVtIxcH6qgRpJMmzuAJgawnQ== dependencies: - "@abp/core" "~9.0.0-rc.2" + "@abp/core" "~9.0.1" "@fortawesome/fontawesome-free" "^6.6.0" -"@abp/jquery-form@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-9.0.0-rc.2.tgz#05a9082bc6c42fca3e001d97f77c0aa2e941448b" - integrity sha512-OUuwB/dgryiBG/iZCedwP2+8ot+PCeuAAMuZ1A/VXbNUJAbhiXF24tQM73wIhpAYcSc5egWjJ+VNTJKMKImTqA== +"@abp/jquery-form@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-9.0.1.tgz#35e0a23cf50b00e0d3b0886f097233b79144145b" + integrity sha512-9co0+Cver+RUSOpfuukSWQhR+TCnO9Dly4RTVRIKFksGVfN8hA70NqRrVxaASNNFv42ynK88FQK+2bLPswz/iw== dependencies: - "@abp/jquery" "~9.0.0-rc.2" + "@abp/jquery" "~9.0.1" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-9.0.0-rc.2.tgz#d38f053ad3a8509dc683dc3091128eb445579176" - integrity sha512-170ARAIz0NWuQnleB2nWPKYQl3x/Za2yxc0utjxY0rruHflNQPF2cMagLu+eBI6gDkThXNps74HiRPXOPdgc4A== +"@abp/jquery-validation-unobtrusive@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-9.0.1.tgz#f9564aabebf4d9f90b4ee5c3f3de0e1a348d8ecc" + integrity sha512-Zpz48wIFjq7eIApG/sEVjkfaJWZhcyCnlCtDf5eU3vvh82nRetbiCEAVLpZ4LVjorlyp3VvVAxReUSeeWflu8A== dependencies: - "@abp/jquery-validation" "~9.0.0-rc.2" + "@abp/jquery-validation" "~9.0.1" jquery-validation-unobtrusive "^4.0.0" -"@abp/jquery-validation@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-9.0.0-rc.2.tgz#79c96c7eb48d5bebb3e7e86f8f9e2d6e2e45c5cb" - integrity sha512-6W2LiLgcC4FGTMLsoNkRBJTqDq6YR3ctLKzRfis9kOigkd0QT/PnB/451rrVb7+BCl9luKaA8DDYF671S8klFA== +"@abp/jquery-validation@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-9.0.1.tgz#ad37a44e82fb32ec9bfe2b736dfc8a143fca89c7" + integrity sha512-uFSxiPMEkaPlcuyXIoKbeOIIRHo4IrgRbmnlHwI1uETrW60ENUdE2LJAVcYS77JROrjVtv8FPlaffWuva6sGeQ== dependencies: - "@abp/jquery" "~9.0.0-rc.2" + "@abp/jquery" "~9.0.1" jquery-validation "^1.21.0" -"@abp/jquery@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-9.0.0-rc.2.tgz#c8bd299d1b5558a4c3cef26b248d42e9a6303e33" - integrity sha512-GrO0gKdi20jlQ0YjWaddal0X0+5LkMpOAyMB1GdaDetLaaVjcZ+92zx1cApcAdIsCKgB+kyutRQv0b82o/EZPQ== +"@abp/jquery@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-9.0.1.tgz#ecce14644c753c581caee0df7bfafd3d083e70f0" + integrity sha512-z8EcnOveItAszbTsM9GFFDQSlcIg/ym6+WZME9uldLoetdxkmI9ij0knVeGj5eqMjQaHvTWwrVLObiBbZwYFWw== dependencies: - "@abp/core" "~9.0.0-rc.2" + "@abp/core" "~9.0.1" jquery "~3.7.1" -"@abp/lodash@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-9.0.0-rc.2.tgz#980a0ae2d95c83663f0f52f1b67b5cfb00d04b96" - integrity sha512-uwxv7WJqwRcGkVoB44JR1QJaMbe3RhCQsG6+Wee1Jjdgi2vkpFUCj2arM4Rxz1igntFjY2Z7NiBq+iL9HYIkSw== +"@abp/lodash@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-9.0.1.tgz#c52c8a4125ecfbeaad7badc5c28bf86d5168799a" + integrity sha512-D+/iOyh/O+jV80bK5vWxyn++IVmeRbZq/UaXanA4RKpzigxJUsgOiSD9lUj85BkfKn2YyFmoR39xwaAqkWoyRA== dependencies: - "@abp/core" "~9.0.0-rc.2" + "@abp/core" "~9.0.1" lodash "^4.17.21" -"@abp/luxon@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-9.0.0-rc.2.tgz#1bb0eae53b707371489a4e0edf2869d7acc71da8" - integrity sha512-iWE8sbBWxCbNYSO3TTTzeotGS6kAnIwCKos/96mtaYJ4wzPW9pgF7K94CvwLAAg9NTsx/J/OGdmhhM2cULhv+w== +"@abp/luxon@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-9.0.1.tgz#ac59a56653d51b997dbbde8ccc58dac5746a9ef4" + integrity sha512-1ZHXP5SGz05tQ1tzYmPcRiZwmkCKGX0KWFoV0zF3ATRaevzku9nXvSy7K6GIFkkgTb9f9XNx4/OBBF/GXkuRqw== dependencies: - "@abp/core" "~9.0.0-rc.2" + "@abp/core" "~9.0.1" luxon "^3.5.0" -"@abp/malihu-custom-scrollbar-plugin@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-9.0.0-rc.2.tgz#fce5c12be2bdf350b18aae52619309a474995442" - integrity sha512-e3JTnDSkjF9/MPh/nPqcvU8hkUxSMc5U6DnP169GBdVAYQwwnGD24x4QCWU7ch7s65FDJ8/uq7bYOcIAD0B+Dw== +"@abp/malihu-custom-scrollbar-plugin@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-9.0.1.tgz#9e60bcfb9f9d76fed9c50e45bf490d5abd0f4689" + integrity sha512-GkKPLg9Z9UTTSSpW2hYZYZ9IgCvDSOYJmyRSl/h4fG8cWMgGCPVpv8MPPu0+WtIfwW/mT4SPX9X+sjUlRL5XRQ== dependencies: - "@abp/core" "~9.0.0-rc.2" + "@abp/core" "~9.0.1" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/moment@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-9.0.0-rc.2.tgz#2fc0feaaa0a26436cf00a6beccaa64f505aef301" - integrity sha512-yqkgu0bo3ra6HVFdS2wlqwTysciYOJWi/ERFVS2MfUkAKFA0P7mv8Jg5tB4vGY2Km++7r22kCDRlK3KUPmk21g== +"@abp/moment@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-9.0.1.tgz#d67fa25017fe15dae10e0a0fcebb03aeb63d31d3" + integrity sha512-bTuCc7pi/DCtgz7t96UBU0wn9UGt4b50JhDCVeTKquh+gP1sgWoI5hyvEBkmgE4dcffO0yzZU2opHYTKYGl/OQ== dependencies: moment "^2.30.1" -"@abp/select2@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-9.0.0-rc.2.tgz#53806118fdfe9f9228e26c6867ce0e75e6572b81" - integrity sha512-arKdcs95+4zp5764iOz09aJ3C1F2SsBIzekpjpJwMBdLRfoleZZFm12itO8I4Jjb1R+2CkW6MXjLR5xL2aE0PQ== +"@abp/select2@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-9.0.1.tgz#9f1c5c27e72bef910fdf63fc3167f415d2ba8db8" + integrity sha512-epyYJH2gAOU2UvGn5FD6372hbW3fL7uZIgGpvfgEfa+l6HPdlV9B1OweU2xkONNCoylShAcP/y8qf+bUh8WDEA== dependencies: - "@abp/core" "~9.0.0-rc.2" + "@abp/core" "~9.0.1" select2 "^4.0.13" -"@abp/sweetalert2@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-9.0.0-rc.2.tgz#60b25d65b3e5eb53e18ba5b1f3663783562d2506" - integrity sha512-VJslD1AMDZJhOEko79UYIxIYeAmr1YUwJu8XNAurBGPa9sWGI+jPY/dYg3uptg8GEJHsFtog84m3nUQ/prRUcw== +"@abp/sweetalert2@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-9.0.1.tgz#a364b21665cb76e92640496dc8a77b8edbce4500" + integrity sha512-0RXR/lzy3qMJLisGUz4qrcA9Clu/Tt1ABGzB64ynG1t/l5XessQsIB5Hkt6MbSyOEsprRsq+ZtKH35CwTRPdAw== dependencies: - "@abp/core" "~9.0.0-rc.2" + "@abp/core" "~9.0.1" sweetalert2 "^11.14.1" -"@abp/timeago@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-9.0.0-rc.2.tgz#72a7da1eda19beb34c352f3f43d2f5181b0b926a" - integrity sha512-zRj+TssaDXW2OM4mNn47G1tRg4BZ2sqbEiiUIQrU9hHMHmxOf8bAJhqsouGDDZF3xetcwKhmLN08VWK1sqqpQA== +"@abp/timeago@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-9.0.1.tgz#d1b7e11fdc267bdb736ff4b591afd3fb81c07cce" + integrity sha512-dNfUQwilrY+JHxL5lwJ++ixYDGAs5lF1EDxKMQMIXD/ak5L8rkdLns8Otta7FhgDDny9UJ7XWQjYsG8ZxxybRQ== dependencies: - "@abp/jquery" "~9.0.0-rc.2" + "@abp/jquery" "~9.0.1" timeago "^1.6.7" -"@abp/toastr@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-9.0.0-rc.2.tgz#ddbf0b6362941f62c07c9820af59dcd6912331d0" - integrity sha512-l4z6z3Oc/JF4XJplqGETQtBkqzjbpobcfzEHeH6LjUeunLMEVQOtjhPUBLrhg4ZM0i9k46hmxsoOkWXu7tClyQ== +"@abp/toastr@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-9.0.1.tgz#2105a639d7cd4fa9c671b4215d719a78fef7e0ee" + integrity sha512-10KuHnSJOxkvzqs6Aim6GJp8xBuT+TsZqBE1KaXQnERPawmOo4+ME28kA/7lq8fvgFUNO3K41T2uuA1GPHVQcg== dependencies: - "@abp/jquery" "~9.0.0-rc.2" + "@abp/jquery" "~9.0.1" toastr "^2.1.4" -"@abp/utils@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-9.0.0-rc.2.tgz#e644889f1c1c4828b509aea9ae3ae48439a5b89d" - integrity sha512-eIL3syPE0LzPyeHV5+pgRxw3/H2YTmK2U9VEOUu26ExiCMIt5Waf8T92BjaH9sLrMD5P9ZAT2jWaxh+VTsEtKA== +"@abp/utils@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-9.0.1.tgz#dccaf7cf92147304d454ffb9a8664d52dc7e5c5a" + integrity sha512-7eOKT0ciKNdtuASck1kifyc4dC6CeebgxV+rx/EAi3YwPMDkqie6YwLGUqKdGW2N/MZ15JuDR6gkuZxKHEb0NQ== 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 7d09b0ec28..bd0c0c849c 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.0.0-rc.2", - "@abp/cms-kit": "9.0.0-rc.2" + "@abp/aspnetcore.mvc.ui.theme.basic": "~9.0.1", + "@abp/cms-kit": "9.0.1" } } 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 5f985b9791..add9990c9d 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.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-9.0.0-rc.2.tgz#db73b3121cbd02207842f0388999298df49392ac" - integrity sha512-vzUPdL1UJ+aXKcei0rCpm3VYX9twhmomd+HqfzcL65TtrXgIK8jCv4Wn0rRFfSGtUfM8OetIVVkmggIZusGTZQ== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~9.0.0-rc.2" - -"@abp/aspnetcore.mvc.ui.theme.shared@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-9.0.0-rc.2.tgz#acaeaa5e0b329e5d836a198f7a3563d141d7fc79" - integrity sha512-hs8AoZwOnrMYmFl7/GQc6EUr5Jz5lTXWgSmp0l/DdH7f3INYEgCrIp5qvLFyNu8CHv6Gbegw2vGdpfDQbkiasw== - dependencies: - "@abp/aspnetcore.mvc.ui" "~9.0.0-rc.2" - "@abp/bootstrap" "~9.0.0-rc.2" - "@abp/bootstrap-datepicker" "~9.0.0-rc.2" - "@abp/bootstrap-daterangepicker" "~9.0.0-rc.2" - "@abp/datatables.net-bs5" "~9.0.0-rc.2" - "@abp/font-awesome" "~9.0.0-rc.2" - "@abp/jquery-form" "~9.0.0-rc.2" - "@abp/jquery-validation-unobtrusive" "~9.0.0-rc.2" - "@abp/lodash" "~9.0.0-rc.2" - "@abp/luxon" "~9.0.0-rc.2" - "@abp/malihu-custom-scrollbar-plugin" "~9.0.0-rc.2" - "@abp/moment" "~9.0.0-rc.2" - "@abp/select2" "~9.0.0-rc.2" - "@abp/sweetalert2" "~9.0.0-rc.2" - "@abp/timeago" "~9.0.0-rc.2" - "@abp/toastr" "~9.0.0-rc.2" - -"@abp/aspnetcore.mvc.ui@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-9.0.0-rc.2.tgz#5fc82ab4872b955cf46d755e99c656e0420a3c64" - integrity sha512-gGfHAsznxFIqTk6OFuRzcJ8D65VWmHkRqQjzmd97GZ1lNXRGDNGtYXbC/L1bA88O+qAXzhQ/c47h6in9cGh38w== +"@abp/aspnetcore.mvc.ui.theme.basic@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-9.0.1.tgz#cdb6130ac6f8499f9a3f856b596c46745d056a30" + integrity sha512-JaxuDH8WTnZYX6C7CX7ZVHfhTDR/SxfwRvtJaGGijSX8QKd1DXpfi9lYEF4Y9k5b48YT/0slBqU5g0sLmBd3+g== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~9.0.1" + +"@abp/aspnetcore.mvc.ui.theme.shared@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-9.0.1.tgz#7a1be780a305aa0d0f467472fc721b6f710fda7a" + integrity sha512-vrgRYKNctdZYhPCQ2I6Z10gUI1S5ynDj+DgnV7x7a7G/juuHaOSbkRXgwrmJsmYLfGA7KFCoJcbpER8mmXQeHQ== + dependencies: + "@abp/aspnetcore.mvc.ui" "~9.0.1" + "@abp/bootstrap" "~9.0.1" + "@abp/bootstrap-datepicker" "~9.0.1" + "@abp/bootstrap-daterangepicker" "~9.0.1" + "@abp/datatables.net-bs5" "~9.0.1" + "@abp/font-awesome" "~9.0.1" + "@abp/jquery-form" "~9.0.1" + "@abp/jquery-validation-unobtrusive" "~9.0.1" + "@abp/lodash" "~9.0.1" + "@abp/luxon" "~9.0.1" + "@abp/malihu-custom-scrollbar-plugin" "~9.0.1" + "@abp/moment" "~9.0.1" + "@abp/select2" "~9.0.1" + "@abp/sweetalert2" "~9.0.1" + "@abp/timeago" "~9.0.1" + "@abp/toastr" "~9.0.1" + +"@abp/aspnetcore.mvc.ui@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-9.0.1.tgz#811dd91138efb82345fc06559b5d2feea88021af" + integrity sha512-KVbWCpBV7S1ViHYQP/hn4gSMzSiA2e8/zC0HND1fjE+1zXJqJyEWto1eg2DaKSOs/rmHD8WtFVMU4hCLQTCuIA== dependencies: ansi-colors "^4.1.3" -"@abp/bootstrap-datepicker@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-9.0.0-rc.2.tgz#884343a8c0b881e6612cbbbf1fb9af0f40cbc223" - integrity sha512-JqPKn0xFyqoA4smY3gtUE/HcbG5QmLtFpZNG/zMnDq2JEtJt13xee9FguYXrlMOrM9PqAwnq2Wrc8s71ROh8Zg== +"@abp/bootstrap-datepicker@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-9.0.1.tgz#21cd19090b9a571ddf5a9019bc17864c8685408c" + integrity sha512-LhgqBRr66x9gGTAyv1FuPAw8u8N77WQK2AfDkNgLueurM2+xMYQzH3pWWLhcN676/JXafxfALCfBoM8U7CfXLg== dependencies: bootstrap-datepicker "^1.10.0" -"@abp/bootstrap-daterangepicker@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-9.0.0-rc.2.tgz#bc0e134e36da111aaa25f7d4d3e90d394c873b50" - integrity sha512-5KChSBquD7pQNiI3TgJSYHw549Pxuom8TAg+44edjEKRvR7KUR8IkfdImlZYHPeLmoUTnnWXiFKOIxOi9OjLoA== +"@abp/bootstrap-daterangepicker@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-9.0.1.tgz#c19c23ede6fd868a147ea893d4fdecfa60b177f7" + integrity sha512-SlBVgiYa75uQyaGt5EVjduren7Po5UP26A1tXEQQr0hDia1+1TK0qxmJ2YxjeJpB7FwtcmJiofv5fngvJqhxIA== dependencies: bootstrap-daterangepicker "^3.1.0" -"@abp/bootstrap@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-9.0.0-rc.2.tgz#cf0b2567f44030d5d0620ca36d9d25999cd25e0e" - integrity sha512-Fkagr1fTyeKDtsvn7TKJKRkWNaYd6ZmE1IhLffwLwDpyt26JBYK3XqGXT+eHFXXpSxrgANERVogSN5E46IU1OQ== +"@abp/bootstrap@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-9.0.1.tgz#2360303ec24c8f3eb755b10fa6a953db6d858daf" + integrity sha512-uAfVNsUYSsRqgeO9JMnhJJlFoDmO3/lTvER/iYOqerF0X03KQnR8HZy2V3MD1D+fSh/4JuU6aAZFl6IQLinMKQ== dependencies: - "@abp/core" "~9.0.0-rc.2" + "@abp/core" "~9.0.1" bootstrap "^5.3.3" -"@abp/clipboard@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-9.0.0-rc.2.tgz#dfa4df015beba83f7c44d749a24987a74a419b59" - integrity sha512-xuhFygNc4c67QkVMqsArQ4qGRJX+qKwSx4LQIaASaZq91ACtU2r5iTjCDb/YFcUVxXXufNLvuFgARGJp5vvvxA== +"@abp/clipboard@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-9.0.1.tgz#b1712b2d940caecc85eb99247a569ffe3ab1a387" + integrity sha512-obDYqUTf+65E26yHZO2DigQOeDnzAEvak0Umz91cholZHVRvzc9X1itv/abS/whU0YOU/d8Viud8zFv1MnM83w== dependencies: - "@abp/core" "~9.0.0-rc.2" + "@abp/core" "~9.0.1" clipboard "^2.0.11" -"@abp/cms-kit.admin@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/cms-kit.admin/-/cms-kit.admin-9.0.0-rc.2.tgz#6300fb61805c70aa0c5071a4d88db3fa0833ff9d" - integrity sha512-dqDlRU306GqE8F92A7Aj+5ONzSralXXdnlQVutpp95NE629S1I2LvndC8ehCkbqSBkDPT3sWIKirstInFiRpKw== +"@abp/cms-kit.admin@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/cms-kit.admin/-/cms-kit.admin-9.0.1.tgz#f71256abfab7f8fe498061a22be5a5d3763e8304" + integrity sha512-cAYmPYNJOnIvsBsrTrOeQebUMFxIVd74m/pGVId59yago01CMjUSbKIjhNx9Mj5udzPBI9qDGg/B8fqTh4hlwQ== dependencies: - "@abp/codemirror" "~9.0.0-rc.2" - "@abp/jstree" "~9.0.0-rc.2" - "@abp/markdown-it" "~9.0.0-rc.2" - "@abp/slugify" "~9.0.0-rc.2" - "@abp/tui-editor" "~9.0.0-rc.2" - "@abp/uppy" "~9.0.0-rc.2" + "@abp/codemirror" "~9.0.1" + "@abp/jstree" "~9.0.1" + "@abp/markdown-it" "~9.0.1" + "@abp/slugify" "~9.0.1" + "@abp/tui-editor" "~9.0.1" + "@abp/uppy" "~9.0.1" -"@abp/cms-kit.public@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/cms-kit.public/-/cms-kit.public-9.0.0-rc.2.tgz#3dc5d16dc9e329e8043e961e851167e1f8cae5ef" - integrity sha512-5dQr6SKY5v4fZ9l8eTZBwWcRbj8+1EA1MoamUaRHcoCDcDb+JnCfqUjDFCT4Tj+W4LxypmtSmeHrfSeYIJBEyg== +"@abp/cms-kit.public@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/cms-kit.public/-/cms-kit.public-9.0.1.tgz#f06dd9f234f8fe76738503bb46714a2e43afdda2" + integrity sha512-40cyzPS05tZlmeDg4IvhugjvPHMiP2bfevDZPVnAsHZN1JIGKeT5bTeqoiIXPzhEylrmT7FEnXHQSrZh/osLwA== dependencies: - "@abp/highlight.js" "~9.0.0-rc.2" - "@abp/star-rating-svg" "~9.0.0-rc.2" + "@abp/highlight.js" "~9.0.1" + "@abp/star-rating-svg" "~9.0.1" -"@abp/cms-kit@9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/cms-kit/-/cms-kit-9.0.0-rc.2.tgz#afbc3e4d5616b5190b7c96cd87f326a1c4dca982" - integrity sha512-Au3LPZ64XKt22r63oQ1Z7DAanr3cdl5wdUpMLodJgw/n1ESH4Mi5gIKKH6InTo7ZjpVmQNdgqXA+/jw+SKTUdQ== +"@abp/cms-kit@9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/cms-kit/-/cms-kit-9.0.1.tgz#4aa0712e80757c671cbf7fc2ccf66e086d0714db" + integrity sha512-+9SE2YbuyJY45A7J7ww1X+/fEXavi1EgJdtS3H66VlXemvNXsVo4oF3d5aZePoY/sj8mRcueOy2lW4v7iYUbkA== dependencies: - "@abp/cms-kit.admin" "~9.0.0-rc.2" - "@abp/cms-kit.public" "~9.0.0-rc.2" + "@abp/cms-kit.admin" "~9.0.1" + "@abp/cms-kit.public" "~9.0.1" -"@abp/codemirror@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/codemirror/-/codemirror-9.0.0-rc.2.tgz#63f6b271ac00faf7166b4cd9807b19c854b67756" - integrity sha512-V7LWwhtphp7UEfS6ivR7Ksi7W4Va30ecA5jTS4PGRLRb2R8GOEBvdIOBH6BqhqoQh3AKVtMiqr+IsinQZcBhrQ== +"@abp/codemirror@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/codemirror/-/codemirror-9.0.1.tgz#b2bf78b93ca522fc0cbc03685bccfa201bcbff78" + integrity sha512-WEQbaDDXZGsKxEHn2MHCg9yT4h0n6Lf+DorWPtdCPmmyNWOFbHex9cNzhuM2kxIfFuwmDQKcO1z99EmZQs5xfw== dependencies: - "@abp/core" "~9.0.0-rc.2" + "@abp/core" "~9.0.1" codemirror "^5.65.1" -"@abp/core@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-9.0.0-rc.2.tgz#f0344669a745581b1032de396b1165f4cb3ea834" - integrity sha512-rmlWc6ydzRWVvQpkqSGEXcmYx1WJvxLajC7Ts6epbmmyklrx+tA5uQqCiSlsJWfIyaejLOjDka319arukaMb/Q== +"@abp/core@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-9.0.1.tgz#727fc1dfac21cca1216c4f5091da7d5efefdb467" + integrity sha512-NWXDVCIJePbcKCrRvGxAlaA2MrOF2IZox37bQkW7/mTeOPpNoTa6lhowksNNcTpFq2YdD8bG0i0kfskkp3EZ2w== dependencies: - "@abp/utils" "~9.0.0-rc.2" + "@abp/utils" "~9.0.1" -"@abp/datatables.net-bs5@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-9.0.0-rc.2.tgz#7f01e5e74530cd9bb13545917f00a5c38163745a" - integrity sha512-snZi/kAtkH4p1t1cUIKU5DRDz+U2CUHk7JAZE+g9bClMvmDTh4Kta5JmTW3g++JSh+C0LQzYXRPXnV7TgUcBgw== +"@abp/datatables.net-bs5@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-9.0.1.tgz#61e2a3daacf1c074ed6b459e25084cc1f5c4eeab" + integrity sha512-tAHdf4TBAS0bVRcvovDKS0OHFyeRSPYbiSIwDn8AIWzW9Weav31jhZ5jL3HEtBKVdb7zqUQ8/3dYPufjDuDdDA== dependencies: - "@abp/datatables.net" "~9.0.0-rc.2" + "@abp/datatables.net" "~9.0.1" datatables.net-bs5 "^2.1.8" -"@abp/datatables.net@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-9.0.0-rc.2.tgz#cf5a5df0c6735080f2ba1f1746f4eb8d05d02c5b" - integrity sha512-hdJH5xN6SXTFZXnv+fTmcmFU19Fr2sIZMrfirUfH1of8qTn7cObjAe9r189PGt/3FZeFPA8pmfnNL6ZLwnLKtw== +"@abp/datatables.net@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-9.0.1.tgz#4cf193e7493f85a272de47326a32a021e3ba40f5" + integrity sha512-JY53zVQPluRrBiKwtgk4gfSgD8VDs/VU8LWizhGCprXt3h9vXx0SQL4My6zvXVkv4hUjaq4+MYo84OI8EwFvsg== dependencies: - "@abp/jquery" "~9.0.0-rc.2" + "@abp/jquery" "~9.0.1" datatables.net "^2.1.8" -"@abp/font-awesome@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-9.0.0-rc.2.tgz#1493057e28b2e1e8a434ff1599e8b4b72b8784d2" - integrity sha512-EsQYx89OBquIxqGLgjAgMpUeAnWW316ruAmmxzGsusVT9KuIL6iuA4j4bdM8/6wJgi6zm2A/bDBjiiDDg2Cyyg== +"@abp/font-awesome@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-9.0.1.tgz#69da15018e7e5f2ff0d3c0d113a4325f54ffc0c3" + integrity sha512-7NnYBmk0plLVElUWR1zohul87vE9wKJItemWT5Kskf/IJirKOvXwSSu+7Jg1LmnVtIxcH6qgRpJMmzuAJgawnQ== dependencies: - "@abp/core" "~9.0.0-rc.2" + "@abp/core" "~9.0.1" "@fortawesome/fontawesome-free" "^6.6.0" -"@abp/highlight.js@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/highlight.js/-/highlight.js-9.0.0-rc.2.tgz#c511f5cd29eef7089d491646ffe31797d4543be9" - integrity sha512-04XWQnuN2ri2Rlkauy7h3444RofCra4B/6GjN53YM3ekZ50Xhe3QsfMhkCzLn0Izgypa3FkNkFq86JvUbyH3Uw== +"@abp/highlight.js@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/highlight.js/-/highlight.js-9.0.1.tgz#22f135e73d5ee5ce14e31fe6c1a1b3eee6a91f55" + integrity sha512-K1EXCtRsc116c7UYcUXRVmrPFHDY4531+ij9P32EdP1/3AIwm50r+tz2epZV2GyIuGw/mVWyFB0vduqFlr0W3g== dependencies: - "@abp/core" "~9.0.0-rc.2" + "@abp/core" "~9.0.1" "@highlightjs/cdn-assets" "~11.10.0" -"@abp/jquery-form@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-9.0.0-rc.2.tgz#05a9082bc6c42fca3e001d97f77c0aa2e941448b" - integrity sha512-OUuwB/dgryiBG/iZCedwP2+8ot+PCeuAAMuZ1A/VXbNUJAbhiXF24tQM73wIhpAYcSc5egWjJ+VNTJKMKImTqA== +"@abp/jquery-form@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-9.0.1.tgz#35e0a23cf50b00e0d3b0886f097233b79144145b" + integrity sha512-9co0+Cver+RUSOpfuukSWQhR+TCnO9Dly4RTVRIKFksGVfN8hA70NqRrVxaASNNFv42ynK88FQK+2bLPswz/iw== dependencies: - "@abp/jquery" "~9.0.0-rc.2" + "@abp/jquery" "~9.0.1" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-9.0.0-rc.2.tgz#d38f053ad3a8509dc683dc3091128eb445579176" - integrity sha512-170ARAIz0NWuQnleB2nWPKYQl3x/Za2yxc0utjxY0rruHflNQPF2cMagLu+eBI6gDkThXNps74HiRPXOPdgc4A== +"@abp/jquery-validation-unobtrusive@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-9.0.1.tgz#f9564aabebf4d9f90b4ee5c3f3de0e1a348d8ecc" + integrity sha512-Zpz48wIFjq7eIApG/sEVjkfaJWZhcyCnlCtDf5eU3vvh82nRetbiCEAVLpZ4LVjorlyp3VvVAxReUSeeWflu8A== dependencies: - "@abp/jquery-validation" "~9.0.0-rc.2" + "@abp/jquery-validation" "~9.0.1" jquery-validation-unobtrusive "^4.0.0" -"@abp/jquery-validation@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-9.0.0-rc.2.tgz#79c96c7eb48d5bebb3e7e86f8f9e2d6e2e45c5cb" - integrity sha512-6W2LiLgcC4FGTMLsoNkRBJTqDq6YR3ctLKzRfis9kOigkd0QT/PnB/451rrVb7+BCl9luKaA8DDYF671S8klFA== +"@abp/jquery-validation@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-9.0.1.tgz#ad37a44e82fb32ec9bfe2b736dfc8a143fca89c7" + integrity sha512-uFSxiPMEkaPlcuyXIoKbeOIIRHo4IrgRbmnlHwI1uETrW60ENUdE2LJAVcYS77JROrjVtv8FPlaffWuva6sGeQ== dependencies: - "@abp/jquery" "~9.0.0-rc.2" + "@abp/jquery" "~9.0.1" jquery-validation "^1.21.0" -"@abp/jquery@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-9.0.0-rc.2.tgz#c8bd299d1b5558a4c3cef26b248d42e9a6303e33" - integrity sha512-GrO0gKdi20jlQ0YjWaddal0X0+5LkMpOAyMB1GdaDetLaaVjcZ+92zx1cApcAdIsCKgB+kyutRQv0b82o/EZPQ== +"@abp/jquery@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-9.0.1.tgz#ecce14644c753c581caee0df7bfafd3d083e70f0" + integrity sha512-z8EcnOveItAszbTsM9GFFDQSlcIg/ym6+WZME9uldLoetdxkmI9ij0knVeGj5eqMjQaHvTWwrVLObiBbZwYFWw== dependencies: - "@abp/core" "~9.0.0-rc.2" + "@abp/core" "~9.0.1" jquery "~3.7.1" -"@abp/jstree@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jstree/-/jstree-9.0.0-rc.2.tgz#7c0d59df045d5d9ab05ffcd54f3ec6e8928afc16" - integrity sha512-ixr6iNvCSFCPaFn/GwCwaHyEwZGJO9xYU7XXRDRa+SbN+lZggbRY7ttkIzv4aAfzMUtA9aCrN9HttJFwc21RSA== +"@abp/jstree@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/jstree/-/jstree-9.0.1.tgz#4a7cc3becc46d3e08740b67e88a048d307e5a6a8" + integrity sha512-QlXjqY/G8k2reXcua9u9mPldgq9oQUq4LiBdzciMdEqfF4nen84aaXvq+vFSsaKZ9/hoqiCz4cT41FkhNJ4d2g== dependencies: - "@abp/jquery" "~9.0.0-rc.2" + "@abp/jquery" "~9.0.1" jstree "^3.3.17" -"@abp/lodash@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-9.0.0-rc.2.tgz#980a0ae2d95c83663f0f52f1b67b5cfb00d04b96" - integrity sha512-uwxv7WJqwRcGkVoB44JR1QJaMbe3RhCQsG6+Wee1Jjdgi2vkpFUCj2arM4Rxz1igntFjY2Z7NiBq+iL9HYIkSw== +"@abp/lodash@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-9.0.1.tgz#c52c8a4125ecfbeaad7badc5c28bf86d5168799a" + integrity sha512-D+/iOyh/O+jV80bK5vWxyn++IVmeRbZq/UaXanA4RKpzigxJUsgOiSD9lUj85BkfKn2YyFmoR39xwaAqkWoyRA== dependencies: - "@abp/core" "~9.0.0-rc.2" + "@abp/core" "~9.0.1" lodash "^4.17.21" -"@abp/luxon@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-9.0.0-rc.2.tgz#1bb0eae53b707371489a4e0edf2869d7acc71da8" - integrity sha512-iWE8sbBWxCbNYSO3TTTzeotGS6kAnIwCKos/96mtaYJ4wzPW9pgF7K94CvwLAAg9NTsx/J/OGdmhhM2cULhv+w== +"@abp/luxon@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-9.0.1.tgz#ac59a56653d51b997dbbde8ccc58dac5746a9ef4" + integrity sha512-1ZHXP5SGz05tQ1tzYmPcRiZwmkCKGX0KWFoV0zF3ATRaevzku9nXvSy7K6GIFkkgTb9f9XNx4/OBBF/GXkuRqw== dependencies: - "@abp/core" "~9.0.0-rc.2" + "@abp/core" "~9.0.1" luxon "^3.5.0" -"@abp/malihu-custom-scrollbar-plugin@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-9.0.0-rc.2.tgz#fce5c12be2bdf350b18aae52619309a474995442" - integrity sha512-e3JTnDSkjF9/MPh/nPqcvU8hkUxSMc5U6DnP169GBdVAYQwwnGD24x4QCWU7ch7s65FDJ8/uq7bYOcIAD0B+Dw== +"@abp/malihu-custom-scrollbar-plugin@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-9.0.1.tgz#9e60bcfb9f9d76fed9c50e45bf490d5abd0f4689" + integrity sha512-GkKPLg9Z9UTTSSpW2hYZYZ9IgCvDSOYJmyRSl/h4fG8cWMgGCPVpv8MPPu0+WtIfwW/mT4SPX9X+sjUlRL5XRQ== dependencies: - "@abp/core" "~9.0.0-rc.2" + "@abp/core" "~9.0.1" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/markdown-it@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/markdown-it/-/markdown-it-9.0.0-rc.2.tgz#94733e069533dc68140b905fd213dc3e1ec67561" - integrity sha512-WwY6EWX7aB4zaf0lB16Eo0KA+cJ0jyJy5U7Irp/rg8PasSXC2peq5BOmjFY0dnXFcFzsKlaY8dMiPB2ZW50wnA== +"@abp/markdown-it@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/markdown-it/-/markdown-it-9.0.1.tgz#286a524ff7bd0cde37dedfb56f8de58f96ba5933" + integrity sha512-ml1xHXr/fiu0GTu5XiYoBm7bF/bCXCZ0EZvvJNNJjQFaaRcRbSasvhZjDVlnZdmAcfKTl9TKvz8H0mNd12Cdww== dependencies: - "@abp/core" "~9.0.0-rc.2" + "@abp/core" "~9.0.1" markdown-it "^14.1.0" -"@abp/moment@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-9.0.0-rc.2.tgz#2fc0feaaa0a26436cf00a6beccaa64f505aef301" - integrity sha512-yqkgu0bo3ra6HVFdS2wlqwTysciYOJWi/ERFVS2MfUkAKFA0P7mv8Jg5tB4vGY2Km++7r22kCDRlK3KUPmk21g== +"@abp/moment@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-9.0.1.tgz#d67fa25017fe15dae10e0a0fcebb03aeb63d31d3" + integrity sha512-bTuCc7pi/DCtgz7t96UBU0wn9UGt4b50JhDCVeTKquh+gP1sgWoI5hyvEBkmgE4dcffO0yzZU2opHYTKYGl/OQ== dependencies: moment "^2.30.1" -"@abp/prismjs@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-9.0.0-rc.2.tgz#2de7bc2882fee46d3d7e2da1fb66bca6b06cc4dd" - integrity sha512-rQ4dVGk+lEHFFSIBsJPqijeh4k3UgoDMZL1rns2a6NR+QnR0J2Slx3Awt8SH+inQFH2JiLHVo9q4bG+81vCsag== +"@abp/prismjs@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-9.0.1.tgz#2693014c8161d561e7c7bef01d5cd24ee53be1b3" + integrity sha512-NwW+vpTiAsuJYNC/MEiAj0dGMWml95mAQD1Z0Djfsg9D6OpcLsdlgWX+KVdZvHoJ+SPgTDIqdt/0LnIv1w/XdA== dependencies: - "@abp/clipboard" "~9.0.0-rc.2" - "@abp/core" "~9.0.0-rc.2" + "@abp/clipboard" "~9.0.1" + "@abp/core" "~9.0.1" prismjs "^1.29.0" -"@abp/select2@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-9.0.0-rc.2.tgz#53806118fdfe9f9228e26c6867ce0e75e6572b81" - integrity sha512-arKdcs95+4zp5764iOz09aJ3C1F2SsBIzekpjpJwMBdLRfoleZZFm12itO8I4Jjb1R+2CkW6MXjLR5xL2aE0PQ== +"@abp/select2@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-9.0.1.tgz#9f1c5c27e72bef910fdf63fc3167f415d2ba8db8" + integrity sha512-epyYJH2gAOU2UvGn5FD6372hbW3fL7uZIgGpvfgEfa+l6HPdlV9B1OweU2xkONNCoylShAcP/y8qf+bUh8WDEA== dependencies: - "@abp/core" "~9.0.0-rc.2" + "@abp/core" "~9.0.1" select2 "^4.0.13" -"@abp/slugify@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/slugify/-/slugify-9.0.0-rc.2.tgz#6c613531fd0f956ba586c3fc3f97cb954060d06b" - integrity sha512-mch+VFoNLpgVK2JrWc96PHxXNX28plVWJDIy+hPlOwR9VVkKr8NgtYe+MrwCCOws/GI0WqlwqoAMZ4bdhEohqw== +"@abp/slugify@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/slugify/-/slugify-9.0.1.tgz#82aa76f131aab619f1d68d8e276b2263be5f0141" + integrity sha512-H8pkDkJMgXvSGPboX1ZZTkgw7G2kUd4cAco0kkCjNdpkVPGCwQSg9TfJgTmZLmvKRFVxOpGTInuzB3/tP6NFFw== dependencies: slugify "^1.6.6" -"@abp/star-rating-svg@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/star-rating-svg/-/star-rating-svg-9.0.0-rc.2.tgz#293404430bff89d2f03b8dade8115e67ea9cab92" - integrity sha512-dpIixk5e7HaKv5G5nC7k6u1ML/eH+BXkBd4M2LOD9jKaMk/YcvHQyzz0YWcF44C29kcDEwc+/xPq2zPtWG0FvQ== +"@abp/star-rating-svg@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/star-rating-svg/-/star-rating-svg-9.0.1.tgz#35f9b226b323d9e102e8c9a306edf798422dd807" + integrity sha512-nND7HnGHFx+uIlMtAhCP3syOui9ZO84KYZnxWAwY/T3ZqV1vzvk8OyyfTZUtt8FWoKRj9JkBvaNUDu4VnMrQWg== dependencies: - "@abp/jquery" "~9.0.0-rc.2" + "@abp/jquery" "~9.0.1" star-rating-svg "^3.5.0" -"@abp/sweetalert2@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-9.0.0-rc.2.tgz#60b25d65b3e5eb53e18ba5b1f3663783562d2506" - integrity sha512-VJslD1AMDZJhOEko79UYIxIYeAmr1YUwJu8XNAurBGPa9sWGI+jPY/dYg3uptg8GEJHsFtog84m3nUQ/prRUcw== +"@abp/sweetalert2@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-9.0.1.tgz#a364b21665cb76e92640496dc8a77b8edbce4500" + integrity sha512-0RXR/lzy3qMJLisGUz4qrcA9Clu/Tt1ABGzB64ynG1t/l5XessQsIB5Hkt6MbSyOEsprRsq+ZtKH35CwTRPdAw== dependencies: - "@abp/core" "~9.0.0-rc.2" + "@abp/core" "~9.0.1" sweetalert2 "^11.14.1" -"@abp/timeago@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-9.0.0-rc.2.tgz#72a7da1eda19beb34c352f3f43d2f5181b0b926a" - integrity sha512-zRj+TssaDXW2OM4mNn47G1tRg4BZ2sqbEiiUIQrU9hHMHmxOf8bAJhqsouGDDZF3xetcwKhmLN08VWK1sqqpQA== +"@abp/timeago@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-9.0.1.tgz#d1b7e11fdc267bdb736ff4b591afd3fb81c07cce" + integrity sha512-dNfUQwilrY+JHxL5lwJ++ixYDGAs5lF1EDxKMQMIXD/ak5L8rkdLns8Otta7FhgDDny9UJ7XWQjYsG8ZxxybRQ== dependencies: - "@abp/jquery" "~9.0.0-rc.2" + "@abp/jquery" "~9.0.1" timeago "^1.6.7" -"@abp/toastr@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-9.0.0-rc.2.tgz#ddbf0b6362941f62c07c9820af59dcd6912331d0" - integrity sha512-l4z6z3Oc/JF4XJplqGETQtBkqzjbpobcfzEHeH6LjUeunLMEVQOtjhPUBLrhg4ZM0i9k46hmxsoOkWXu7tClyQ== +"@abp/toastr@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-9.0.1.tgz#2105a639d7cd4fa9c671b4215d719a78fef7e0ee" + integrity sha512-10KuHnSJOxkvzqs6Aim6GJp8xBuT+TsZqBE1KaXQnERPawmOo4+ME28kA/7lq8fvgFUNO3K41T2uuA1GPHVQcg== dependencies: - "@abp/jquery" "~9.0.0-rc.2" + "@abp/jquery" "~9.0.1" toastr "^2.1.4" -"@abp/tui-editor@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/tui-editor/-/tui-editor-9.0.0-rc.2.tgz#abe8e13566b337be023881627d4bd0dd574ed89f" - integrity sha512-Skw3/+Rda6iIyygtlLeam2J0cAH27WNN3bKVavRK4NLvq3mp2qdiV2eHgfVcZDLyc1X2UbrrzkqD9BQ288S+ag== +"@abp/tui-editor@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/tui-editor/-/tui-editor-9.0.1.tgz#df2ef5101300f2f739c0c93b66f63ccd8492a42d" + integrity sha512-0H9AK4/YXsDmLruHMqk2uygWkWTR9pRRexGCr+IzoAeb+tljg15MnmlboTE9iNOntUug6Iml9tyY5gNOUuQXvQ== dependencies: - "@abp/jquery" "~9.0.0-rc.2" - "@abp/prismjs" "~9.0.0-rc.2" + "@abp/jquery" "~9.0.1" + "@abp/prismjs" "~9.0.1" -"@abp/uppy@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/uppy/-/uppy-9.0.0-rc.2.tgz#bede50f95533f34c5ec17ec792a41a14fdcae9d2" - integrity sha512-dPdbVz+xMdFI/fAKtf3lX6sMXZi6U7IbifP0UI1slvMnGHtiKrnwWW64OnNCWpkWPUUBqz1HwASTRTyf4AzVJA== +"@abp/uppy@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/uppy/-/uppy-9.0.1.tgz#35af2483439c1ee0e4ec07299f8ada17f235d97b" + integrity sha512-rPM0Fy0qef1xw28a+qzFWNL8OeXzHXY1Qyq0W9VKUhFwUYKYKTALwi6k7SVQh5Dq+X2blSStVkJD5tuADxSnIg== dependencies: - "@abp/core" "~9.0.0-rc.2" + "@abp/core" "~9.0.1" uppy "^4.4.1" -"@abp/utils@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-9.0.0-rc.2.tgz#e644889f1c1c4828b509aea9ae3ae48439a5b89d" - integrity sha512-eIL3syPE0LzPyeHV5+pgRxw3/H2YTmK2U9VEOUu26ExiCMIt5Waf8T92BjaH9sLrMD5P9ZAT2jWaxh+VTsEtKA== +"@abp/utils@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-9.0.1.tgz#dccaf7cf92147304d454ffb9a8664d52dc7e5c5a" + integrity sha512-7eOKT0ciKNdtuASck1kifyc4dC6CeebgxV+rx/EAi3YwPMDkqie6YwLGUqKdGW2N/MZ15JuDR6gkuZxKHEb0NQ== dependencies: just-compare "^2.3.0" diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/BlogDto.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/BlogDto.cs index 0245b1348e..93c5374281 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/BlogDto.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/BlogDto.cs @@ -11,4 +11,6 @@ public class BlogDto : ExtensibleEntityDto, IHasConcurrencyStamp public string Slug { get; set; } public string ConcurrencyStamp { get; set; } + + public int BlogPostCount { get; set; } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/IBlogAdminAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/IBlogAdminAppService.cs index 647c2bde15..e0f2b3311b 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/IBlogAdminAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/IBlogAdminAppService.cs @@ -1,8 +1,13 @@ using System; +using System.Threading.Tasks; +using Volo.Abp.Application.Dtos; using Volo.Abp.Application.Services; namespace Volo.CmsKit.Admin.Blogs; public interface IBlogAdminAppService : ICrudAppService { + Task> GetAllListAsync(); + + Task MoveAllBlogPostsAsync(Guid blogId, Guid? assignToBlogId = null); } 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 d5f32c4bfc..e3ef03e2de 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 @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Authorization; using Volo.Abp.Application.Dtos; @@ -20,16 +21,19 @@ namespace Volo.CmsKit.Admin.Blogs; public class BlogAdminAppService : CmsKitAdminAppServiceBase, IBlogAdminAppService { protected IBlogRepository BlogRepository { get; } + protected IBlogPostRepository BlogPostRepository { get; } protected BlogManager BlogManager { get; } protected BlogFeatureManager BlogFeatureManager { get; } public BlogAdminAppService( IBlogRepository blogRepository, - BlogManager blogManager, + BlogManager blogManager, + IBlogPostRepository blogPostRepository, BlogFeatureManager blogFeatureManager = null) { BlogRepository = blogRepository; BlogManager = blogManager; + BlogPostRepository = blogPostRepository; BlogFeatureManager = blogFeatureManager; } @@ -37,20 +41,44 @@ public class BlogAdminAppService : CmsKitAdminAppServiceBase, IBlogAdminAppServi { var blog = await BlogRepository.GetAsync(id); - return ObjectMapper.Map(blog); + var blogDto = ObjectMapper.Map(blog); + blogDto.BlogPostCount = await BlogPostRepository.GetCountAsync(blogId : blog.Id); + + return blogDto; } public virtual async Task> GetListAsync(BlogGetListInput input) { var totalCount = await BlogRepository.GetCountAsync(input.Filter); - var blogs = await BlogRepository.GetListAsync( + var blogs = await BlogRepository.GetListWithBlogPostCountAsync( input.Filter, 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) + { + blogDto.BlogPostCount = blogs.First(x => x.Blog.Id == blogDto.Id).BlogPostCount; + } - return new PagedResultDto(totalCount, ObjectMapper.Map, List>(blogs)); + 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) + { + blogDto.BlogPostCount = blogs.First(x => x.Blog.Id == blogDto.Id).BlogPostCount; + } + + return blogDtos; } [Authorize(CmsKitAdminPermissions.Blogs.Create)] @@ -79,10 +107,18 @@ public class BlogAdminAppService : CmsKitAdminAppServiceBase, IBlogAdminAppServi return ObjectMapper.Map(blog); } + + [Authorize(CmsKitAdminPermissions.Blogs.Delete)] + public virtual async Task MoveAllBlogPostsAsync(Guid blogId, Guid? assignToBlogId) + { + var blog = await BlogRepository.GetAsync(blogId); + await BlogPostRepository.UpdateBlogAsync(blog.Id, assignToBlogId); + } [Authorize(CmsKitAdminPermissions.Blogs.Delete)] public virtual Task DeleteAsync(Guid id) { + return BlogRepository.DeleteAsync(id); } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/CmsKitAdminApplicationAutoMapperProfile.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/CmsKitAdminApplicationAutoMapperProfile.cs index a6a0d6512a..60f8ccb8a8 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/CmsKitAdminApplicationAutoMapperProfile.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/CmsKitAdminApplicationAutoMapperProfile.cs @@ -38,7 +38,7 @@ public class CmsKitAdminApplicationAutoMapperProfile : Profile CreateMap(MemberList.Source).MapExtraProperties(); CreateMap(MemberList.Source).MapExtraProperties(); - CreateMap().MapExtraProperties(); + CreateMap().Ignore(b => b.BlogPostCount).MapExtraProperties(); CreateMap(MemberList.Destination); diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi.Client/ClientProxies/Volo/CmsKit/Admin/Blogs/BlogAdminClientProxy.Generated.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi.Client/ClientProxies/Volo/CmsKit/Admin/Blogs/BlogAdminClientProxy.Generated.cs index d102ea4d1f..7eb5d91f3b 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi.Client/ClientProxies/Volo/CmsKit/Admin/Blogs/BlogAdminClientProxy.Generated.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi.Client/ClientProxies/Volo/CmsKit/Admin/Blogs/BlogAdminClientProxy.Generated.cs @@ -57,4 +57,18 @@ public partial class BlogAdminClientProxy : ClientProxyBase> GetAllListAsync() + { + return await RequestAsync>(nameof(GetAllListAsync)); + } + + public virtual async Task MoveAllBlogPostsAsync(Guid blogId, Guid? assignToBlogId) + { + await RequestAsync(nameof(MoveAllBlogPostsAsync), new ClientProxyRequestTypeValue + { + { typeof(Guid), blogId }, + { typeof(Guid?), assignToBlogId } + }); + } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi.Client/ClientProxies/cms-kit-admin-generate-proxy.json b/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi.Client/ClientProxies/cms-kit-admin-generate-proxy.json index cf4bbd1034..8f0e7e677d 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi.Client/ClientProxies/cms-kit-admin-generate-proxy.json +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi.Client/ClientProxies/cms-kit-admin-generate-proxy.json @@ -16,6 +16,39 @@ "type": "Volo.CmsKit.Admin.Blogs.IBlogAdminAppService", "name": "IBlogAdminAppService", "methods": [ + { + "name": "GetAllListAsync", + "parametersOnMethod": [], + "returnValue": { + "type": "Volo.Abp.Application.Dtos.ListResultDto", + "typeSimple": "Volo.Abp.Application.Dtos.ListResultDto" + } + }, + { + "name": "MoveAllBlogPostsAsync", + "parametersOnMethod": [ + { + "name": "blogId", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "assignToBlogId", + "typeAsString": "System.Nullable`1[[System.Guid, System.Private.CoreLib, Version=9.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]], System.Private.CoreLib", + "type": "System.Guid?", + "typeSimple": "string?", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + } + }, { "name": "GetAsync", "parametersOnMethod": [ @@ -353,6 +386,90 @@ }, "allowAnonymous": false, "implementFrom": "Volo.Abp.Application.Services.IDeleteAppService" + }, + "GetAllListAsync": { + "uniqueName": "GetAllListAsync", + "name": "GetAllListAsync", + "httpMethod": "GET", + "url": "api/cms-kit-admin/blogs/all", + "supportedVersions": [], + "parametersOnMethod": [], + "parameters": [], + "returnValue": { + "type": "Volo.Abp.Application.Dtos.ListResultDto", + "typeSimple": "Volo.Abp.Application.Dtos.ListResultDto" + }, + "allowAnonymous": false, + "implementFrom": "Volo.CmsKit.Admin.Blogs.IBlogAdminAppService" + }, + "MoveAllBlogPostsAsyncByBlogIdAndAssignToBlogId": { + "uniqueName": "MoveAllBlogPostsAsyncByBlogIdAndAssignToBlogId", + "name": "MoveAllBlogPostsAsync", + "httpMethod": "PUT", + "url": "api/cms-kit-admin/blogs/{id}/move-all-blog-posts", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "blogId", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "assignToBlogId", + "typeAsString": "System.Nullable`1[[System.Guid, System.Private.CoreLib, Version=9.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]], System.Private.CoreLib", + "type": "System.Guid?", + "typeSimple": "string?", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "blogId", + "name": "blogId", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "" + }, + { + "nameOnMethod": "assignToBlogId", + "name": "assignToBlogId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Query", + "descriptorName": "" + }, + { + "nameOnMethod": "id", + "name": "id", + "jsonName": null, + "type": null, + "typeSimple": null, + "isOptional": false, + "defaultValue": null, + "constraintTypes": [], + "bindingSourceId": "Path", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": false, + "implementFrom": "Volo.CmsKit.Admin.Blogs.IBlogAdminAppService" } } }, diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Blogs/BlogAdminController.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Blogs/BlogAdminController.cs index e7d59ddbcd..f90215ed38 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Blogs/BlogAdminController.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Blogs/BlogAdminController.cs @@ -62,4 +62,19 @@ public class BlogAdminController : CmsKitAdminController, IBlogAdminAppService { return BlogAdminAppService.DeleteAsync(id); } + + [HttpGet] + [Route("all")] + public Task> GetAllListAsync() + { + return BlogAdminAppService.GetAllListAsync(); + } + + [HttpPut] + [Route("{id}/move-all-blog-posts")] + [Authorize(CmsKitAdminPermissions.Blogs.Delete)] + public Task MoveAllBlogPostsAsync(Guid blogId, [FromQuery]Guid? assignToBlogId) + { + return BlogAdminAppService.MoveAllBlogPostsAsync(blogId, assignToBlogId); + } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/CmsKitAdminWebModule.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/CmsKitAdminWebModule.cs index 70c2b575f4..45cbbd818d 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/CmsKitAdminWebModule.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/CmsKitAdminWebModule.cs @@ -13,6 +13,7 @@ using Volo.Abp.Localization; using Volo.Abp.Modularity; using Volo.Abp.ObjectExtending; using Volo.Abp.ObjectExtending.Modularity; +using Volo.Abp.SettingManagement.Web; using Volo.Abp.SettingManagement.Web.Pages.SettingManagement; using Volo.Abp.Threading; using Volo.Abp.UI.Navigation; @@ -29,7 +30,8 @@ namespace Volo.CmsKit.Admin.Web; [DependsOn( typeof(CmsKitAdminApplicationContractsModule), - typeof(CmsKitCommonWebModule) + typeof(CmsKitCommonWebModule), + typeof(AbpSettingManagementWebModule) )] public class CmsKitAdminWebModule : AbpModule { diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Blogs/DeleteBlogModal.cshtml b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Blogs/DeleteBlogModal.cshtml new file mode 100644 index 0000000000..5f32d8e9bf --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Blogs/DeleteBlogModal.cshtml @@ -0,0 +1,59 @@ +@page +@using Microsoft.AspNetCore.Mvc.Localization +@using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Modal +@using Volo.CmsKit.Admin.Web.Pages.CmsKit.Blogs +@using Volo.CmsKit.Localization +@model DeleteBlogModal +@inject IHtmlLocalizer L +@{ + Layout = null; +} + +
+ @{ + var deleteAllClicked = "checked"; + var deleteButtonDisabled = ""; + + + + + + +

@L.GetString("BlogDeletionConfirmationMessage", Model.Blog.Name).Value

+ + @if (Model.Blog.BlogPostCount > 0) + { +

@L.GetString("ChooseAnActionForBlog", Model.Blog.BlogPostCount).Value

+ + + if (Model.Blog.OtherBlogs.Any()) + { + deleteAllClicked = ""; + deleteButtonDisabled = "disabled"; +
+ + +
+ + } + +
+ + +
+ } +
+ + + + +
+ } + +
diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Blogs/DeleteBlogModal.cshtml.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Blogs/DeleteBlogModal.cshtml.cs new file mode 100644 index 0000000000..08e320b6f5 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Blogs/DeleteBlogModal.cshtml.cs @@ -0,0 +1,57 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.RazorPages; +using Volo.Abp.ObjectExtending; +using Volo.CmsKit.Admin.Blogs; + +namespace Volo.CmsKit.Admin.Web.Pages.CmsKit.Blogs; + +public class DeleteBlogModal : CmsKitAdminPageModel +{ + [BindProperty] + public BlogInfoModel Blog { get; set; } + + protected IBlogAdminAppService BlogAdminAppService { get; } + + public DeleteBlogModal(IBlogAdminAppService blogAdminAppService) + { + BlogAdminAppService = blogAdminAppService; + } + + public virtual async Task OnGetAsync(Guid id) + { + var blog = await BlogAdminAppService.GetAsync(id); + var allBlogs = await BlogAdminAppService.GetAllListAsync(); + + Blog = new BlogInfoModel + { + Id = blog.Id, + Name = blog.Name, + BlogPostCount = blog.BlogPostCount, + OtherBlogs = allBlogs.Items.Where(b => b.Id != blog.Id).Select(e => new KeyValuePair(e.Id, e.Name)).ToList() + }; + } + + public virtual async Task OnPostAsync() + { + await BlogAdminAppService.MoveAllBlogPostsAsync(Blog.Id, Blog.AssignToBlogId); + await BlogAdminAppService.DeleteAsync(Blog.Id); + return NoContent(); + } + + public class BlogInfoModel : ExtensibleObject + { + public Guid Id { get; set; } + + public string Name { get; set; } + + public int BlogPostCount { get; set; } + + public List> OtherBlogs { get; set; } + + public Guid? AssignToBlogId { get; set; } + } +} \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Blogs/index.js b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Blogs/index.js index 0ead857f17..eef9af3f09 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Blogs/index.js +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Blogs/index.js @@ -6,6 +6,35 @@ $(function () { var updateModal = new abp.ModalManager({ viewUrl: abp.appPath + "CmsKit/Blogs/UpdateModal", modalClass: 'updateBlog' }); var featuresModal = new abp.ModalManager(abp.appPath + "CmsKit/Blogs/FeaturesModal"); + + var deleteBlogModal = new abp.ModalManager(abp.appPath + 'CmsKit/Blogs/DeleteBlogModal'); + + deleteBlogModal.onResult(function(){ + abp.notify.success(l('DeletedSuccessfully')); + }); + + deleteBlogModal.onOpen(function () { + var $form = deleteBlogModal.getForm(); + $form.find('#assign').click(function () { + $form.find('#Blog_AssignToBlogId').show(); + $form.find('[type=submit]').attr("disabled","disabled") + }) + $form.find('#deleteAll').click(function () { + $form.find('#Blog_AssignToBlogId').hide(); + $form.find('#Blog_AssignToBlogId').val(""); + $form.find('[type=submit]').removeAttr("disabled"); + }) + + $("#Blog_AssignToBlogId").on("change", function () { + var val = $(this).val(); + if(val === ''){ + $form.find('[type=submit]').attr("disabled","disabled") + }else{ + $form.find('[type=submit]').removeAttr("disabled"); + } + }) + }) + var blogsService = volo.cmsKit.admin.blogs.blogAdmin; var dataTable = $("#BlogsTable").DataTable(abp.libs.datatables.normalizeConfiguration({ @@ -41,16 +70,10 @@ $(function () { { text: l('Delete'), visible: abp.auth.isGranted('CmsKit.Blogs.Delete'), - confirmMessage: function (data) { - return l("BlogDeletionConfirmationMessage", data.record.name) - }, action: function (data) { - blogsService - .delete(data.record.id) - .then(function () { - dataTable.ajax.reloadEx(); - abp.notify.success(l('DeletedSuccessfully')); - }); + deleteBlogModal.open({ + id: data.record.id + }); } } ] @@ -74,6 +97,7 @@ $(function () { createModal.open(); }); + createModal.onResult(function () { dataTable.ajax.reloadEx(); }); @@ -81,4 +105,8 @@ $(function () { updateModal.onResult(function () { dataTable.ajax.reloadEx(); }); + + deleteBlogModal.onResult(function () { + dataTable.ajax.reloadEx(); + }); }); \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Volo.CmsKit.Admin.Web.abppkg.analyze.json b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Volo.CmsKit.Admin.Web.abppkg.analyze.json index b8b9d3e51e..b42079c218 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Volo.CmsKit.Admin.Web.abppkg.analyze.json +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Volo.CmsKit.Admin.Web.abppkg.analyze.json @@ -14,6 +14,11 @@ "declaringAssemblyName": "Volo.CmsKit.Common.Web", "namespace": "Volo.CmsKit.Web", "name": "CmsKitCommonWebModule" + }, + { + "declaringAssemblyName": "Volo.Abp.SettingManagement.Web", + "namespace": "Volo.Abp.SettingManagement.Web", + "name": "AbpSettingManagementWebModule" } ], "implementingInterfaces": [ diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Volo.CmsKit.Admin.Web.csproj b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Volo.CmsKit.Admin.Web.csproj index 9323e3044e..6dbaea3eb9 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Volo.CmsKit.Admin.Web.csproj +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Volo.CmsKit.Admin.Web.csproj @@ -15,6 +15,8 @@ + + diff --git a/modules/cms-kit/src/Volo.CmsKit.Common.Web/CmsKitCommonWebModule.cs b/modules/cms-kit/src/Volo.CmsKit.Common.Web/CmsKitCommonWebModule.cs index 5f27f785f8..e8a30a75bc 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Common.Web/CmsKitCommonWebModule.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Common.Web/CmsKitCommonWebModule.cs @@ -7,15 +7,13 @@ using Volo.CmsKit.Reactions; using Volo.CmsKit.Web.Icons; using Markdig; using Microsoft.Extensions.DependencyInjection; -using Volo.Abp.SettingManagement.Web; namespace Volo.CmsKit.Web; [DependsOn( typeof(AbpAspNetCoreMvcUiThemeSharedModule), typeof(CmsKitCommonApplicationContractsModule), - typeof(AbpAutoMapperModule), - typeof(AbpSettingManagementWebModule) + typeof(AbpAutoMapperModule) )] public class CmsKitCommonWebModule : AbpModule { diff --git a/modules/cms-kit/src/Volo.CmsKit.Common.Web/Volo.CmsKit.Common.Web.abppkg.analyze.json b/modules/cms-kit/src/Volo.CmsKit.Common.Web/Volo.CmsKit.Common.Web.abppkg.analyze.json index 56c251adff..6b69cfe938 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Common.Web/Volo.CmsKit.Common.Web.abppkg.analyze.json +++ b/modules/cms-kit/src/Volo.CmsKit.Common.Web/Volo.CmsKit.Common.Web.abppkg.analyze.json @@ -19,11 +19,6 @@ "declaringAssemblyName": "Volo.Abp.AutoMapper", "namespace": "Volo.Abp.AutoMapper", "name": "AbpAutoMapperModule" - }, - { - "declaringAssemblyName": "Volo.Abp.SettingManagement.Web", - "namespace": "Volo.Abp.SettingManagement.Web", - "name": "AbpSettingManagementWebModule" } ], "implementingInterfaces": [ diff --git a/modules/cms-kit/src/Volo.CmsKit.Common.Web/Volo.CmsKit.Common.Web.csproj b/modules/cms-kit/src/Volo.CmsKit.Common.Web/Volo.CmsKit.Common.Web.csproj index f051498795..8e8fe81033 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Common.Web/Volo.CmsKit.Common.Web.csproj +++ b/modules/cms-kit/src/Volo.CmsKit.Common.Web/Volo.CmsKit.Common.Web.csproj @@ -16,7 +16,6 @@ - diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/ar.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/ar.json index c86c314d87..1236f52999 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/ar.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/ar.json @@ -237,6 +237,10 @@ "CssClass": "فئة CSS", "TagsHelpText": "يجب أن تكون العلامات مفصولة بفواصل (على سبيل المثال: tag1، tag2، tag3)", "ThisPartOfContentCouldntBeLoaded": "لا يمكن تحميل هذا الجزء من المحتوى.", - "DuplicateCommentAttemptMessage": "تم اكتشاف محاولة نشر تعليق مكررة. لقد تم بالفعل تقديم تعليقك." + "DuplicateCommentAttemptMessage": "تم اكتشاف محاولة نشر تعليق مكررة. لقد تم بالفعل تقديم تعليقك.", + "ChooseAnActionForBlog": "اختر إجراءً للمدونة", + "AssignBlogPostsToOtherBlog": "تعيين مشاركات المدونة إلى مدونة أخرى", + "SelectAnBlogToAssign": "حدد مدونة لتعيين مشاركات المدونة إليها", + "DeleteAllBlogPostsOfThisBlog": "حذف جميع مشاركات المدونة" } } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/cs.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/cs.json index c4534837fa..946336668f 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/cs.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/cs.json @@ -227,6 +227,10 @@ "CssClass": "Třída CSS", "TagsHelpText": "Značky by měly být odděleny čárkami (např.: tag1, tag2, tag3)", "ThisPartOfContentCouldntBeLoaded": "Tato část obsahu nemohla být načtena.", - "DuplicateCommentAttemptMessage": "Byl zjištěn duplicitní pokus o vložení komentáře. Váš komentář již byl odeslán." + "DuplicateCommentAttemptMessage": "Byl zjištěn duplicitní pokus o vložení komentáře. Váš komentář již byl odeslán.", + "ChooseAnActionForBlog": "Vyberte akci pro blog", + "AssignBlogPostsToOtherBlog": "Přiřaďte blogové příspěvky k jinému blogu", + "SelectAnBlogToAssign": "Vyberte blog, ke kterému chcete přiřadit blogové příspěvky", + "DeleteAllBlogPostsOfThisBlog": "Smazat všechny blogové příspěvky tohoto blogu" } } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/de-DE.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/de-DE.json index 98b8b731c4..49b5f96ff5 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/de-DE.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/de-DE.json @@ -161,6 +161,10 @@ "YourFullName": "Ihren vollständigen Namen", "YourMessage": "Ihre Nachricht", "YourReply": "Ihre Antwort", - "ThisPartOfContentCouldntBeLoaded": "Dieser Teil des Inhalts konnte nicht geladen werden." + "ThisPartOfContentCouldntBeLoaded": "Dieser Teil des Inhalts konnte nicht geladen werden.", + "ChooseAnActionForBlog": "Wählen Sie eine Aktion für den Blog", + "AssignBlogPostsToOtherBlog": "Blogbeiträge einem anderen Blog zuweisen", + "SelectAnBlogToAssign": "Wählen Sie einen Blog aus, um Blogbeiträge zuzuweisen", + "DeleteAllBlogPostsOfThisBlog": "Alle Blogbeiträge dieses Blogs löschen" } } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/de.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/de.json index 31bae240c3..e950983d9c 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/de.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/de.json @@ -227,6 +227,10 @@ "CssClass": "CSS-Klasse", "TagsHelpText": "Tags sollten durch Kommas getrennt werden (z. B. Tag1, Tag2, Tag3).", "ThisPartOfContentCouldntBeLoaded": "Dieser Teil des Inhalts konnte nicht geladen werden.", - "DuplicateCommentAttemptMessage": "Es wurde versucht, einen doppelten Kommentar zu posten. Ihr Kommentar wurde bereits übermittelt." + "DuplicateCommentAttemptMessage": "Es wurde versucht, einen doppelten Kommentar zu posten. Ihr Kommentar wurde bereits übermittelt.", + "ChooseAnActionForBlog": "Wählen Sie eine Aktion für den Blog", + "AssignBlogPostsToOtherBlog": "Blogbeiträge einem anderen Blog zuweisen", + "SelectAnBlogToAssign": "Wählen Sie einen Blog aus, um Blogbeiträge zuzuweisen", + "DeleteAllBlogPostsOfThisBlog": "Alle Blogbeiträge dieses Blogs löschen" } } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/el.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/el.json index 695cdd21eb..5c3bd58461 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/el.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/el.json @@ -184,6 +184,10 @@ "SelectAStatus": "Επιλέξτε μια κατάσταση", "Status": "Κατάσταση", "CmsKit.BlogPost.ScrollIndex": "Γραμμή γρήγορης πλοήγησης σε αναρτήσεις ιστολογίου", - "ThisPartOfContentCouldntBeLoaded": "Αυτό το τμήμα του περιεχομένου δεν μπορούσε να φορτωθεί." + "ThisPartOfContentCouldntBeLoaded": "Αυτό το τμήμα του περιεχομένου δεν μπορούσε να φορτωθεί.", + "ChooseAnActionForBlog": "Επιλέξτε μια ενέργεια για το ιστολόγιο", + "AssignBlogPostsToOtherBlog": "Ανάθεση αναρτήσεων ιστολογίου σε άλλο ιστολόγιο", + "SelectAnBlogToAssign": "Επιλέξτε ένα ιστολόγιο για να αναθέσετε αναρτήσεις ιστολογίου", + "DeleteAllBlogPostsOfThisBlog": "Διαγραφή όλων των αναρτήσεων ιστολογίου αυτού του ιστολογίου" } } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en-GB.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en-GB.json index f6256d81ba..b8b9060f45 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en-GB.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en-GB.json @@ -28,6 +28,10 @@ "Undo": "Undo", "Update": "Update", "YourComment": "Your comment", - "YourReply": "Your reply" + "YourReply": "Your reply", + "ChooseAnActionForBlog": "Choose an action for the blog", + "AssignBlogPostsToOtherBlog": "Assign blog posts to another blog", + "SelectAnBlogToAssign": "Select a blog to assign", + "DeleteAllBlogPostsOfThisBlog": "Delete all blog posts of this blog" } } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json index 149f1072bf..596b9250f6 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json @@ -255,6 +255,10 @@ "CommentAlertMessage": "There are {0} comments waiting for approval", "Settings:Menu:CmsKit": "CMS", "CommentsAwaitingApproval": "Comments Awaiting Approval", - "CommentSubmittedForApproval": "Your comment has been submitted for approval." + "CommentSubmittedForApproval": "Your comment has been submitted for approval.", + "ChooseAnActionForBlog": "Choose an action for the blog", + "AssignBlogPostsToOtherBlog": "Assign blog posts to another blog", + "SelectAnBlogToAssign": "Select a blog to assign", + "DeleteAllBlogPostsOfThisBlog": "Delete all blog posts of this blog" } } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/es.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/es.json index e1ff8d7fc8..ffe5b410be 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/es.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/es.json @@ -227,6 +227,10 @@ "CssClass": "Clase CSS", "TagsHelpText": "Las etiquetas deben estar separadas por comas (por ejemplo: etiqueta1, etiqueta2, etiqueta3)", "ThisPartOfContentCouldntBeLoaded": "Esta parte del contenido no se pudo cargar.", - "DuplicateCommentAttemptMessage": "Intento de publicación de comentario duplicado detectado. Tu comentario ya ha sido enviado." + "DuplicateCommentAttemptMessage": "Intento de publicación de comentario duplicado detectado. Tu comentario ya ha sido enviado.", + "ChooseAnActionForBlog": "Elija una acción para el blog", + "AssignBlogPostsToOtherBlog": "Asignar publicaciones de blog a otro blog", + "SelectAnBlogToAssign": "Seleccione un blog para asignar publicaciones de blog", + "DeleteAllBlogPostsOfThisBlog": "Eliminar todas las publicaciones de blog de este blog" } } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/fa.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/fa.json index e044cde1a5..fa6695709d 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/fa.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/fa.json @@ -183,6 +183,10 @@ "Status": "وضعیت", "CmsKit.BlogPost.ScrollIndex": "نوار پیمایش سریع در پست های وبلاگ", "CmsKit.BlogPost.PreventXssFeature": "جلوگیری از XSS", - "ThisPartOfContentCouldntBeLoaded": "این قسمت از محتوا قابل بارگیری نیست." + "ThisPartOfContentCouldntBeLoaded": "این قسمت از محتوا قابل بارگیری نیست.", + "ChooseAnActionForBlog": "یک عمل برای وبلاگ انتخاب کنید", + "AssignBlogPostsToOtherBlog": "پست های وبلاگ را به وبلاگ دیگری اختصاص دهید", + "SelectAnBlogToAssign": "یک وبلاگ برای اختصاص دادن انتخاب کنید", + "DeleteAllBlogPostsOfThisBlog": "تمام پست های وبلاگ این وبلاگ را حذف کنید" } } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/fi.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/fi.json index 82d622f05f..f13dc7620c 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/fi.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/fi.json @@ -227,6 +227,10 @@ "CssClass": "CSS-luokka", "TagsHelpText": "Tunnisteet on erotettava pilkuilla (esim. tag1, tag2, tag3)", "ThisPartOfContentCouldntBeLoaded": "Tämä sisällön osa ei voitu ladata.", - "DuplicateCommentAttemptMessage": "Kopiokommenttiyritys havaittiin. Kommenttisi on jo lähetetty." + "DuplicateCommentAttemptMessage": "Kopiokommenttiyritys havaittiin. Kommenttisi on jo lähetetty.", + "ChooseAnActionForBlog": "Valitse toiminto blogille", + "AssignBlogPostsToOtherBlog": "Määritä blogiviestit toiseen blogiin", + "SelectAnBlogToAssign": "Valitse blogi, johon haluat määrittää", + "DeleteAllBlogPostsOfThisBlog": "Poista tämän blogin kaikki blogiviestit" } } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/fr.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/fr.json index 634c1fec85..f2828aa40e 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/fr.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/fr.json @@ -227,6 +227,10 @@ "CssClass": "Classe CSS", "TagsHelpText": "Les balises doivent être séparées par des virgules (par exemple : tag1, tag2, tag3)", "ThisPartOfContentCouldntBeLoaded": "Cette partie du contenu n'a pas pu être chargée.", - "DuplicateCommentAttemptMessage": "Tentative de publication de commentaire en double détectée. Votre commentaire a déjà été soumis." + "DuplicateCommentAttemptMessage": "Tentative de publication de commentaire en double détectée. Votre commentaire a déjà été soumis.", + "ChooseAnActionForBlog": "Choisissez une action pour le blog", + "AssignBlogPostsToOtherBlog": "Attribuer des articles de blog à un autre blog", + "SelectAnBlogToAssign": "Sélectionnez un blog à attribuer", + "DeleteAllBlogPostsOfThisBlog": "Supprimer tous les articles de blog de ce blog" } } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/hi.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/hi.json index dcea398df5..ad2dbc18d9 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/hi.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/hi.json @@ -227,6 +227,10 @@ "CssClass": "सीएसएस क्लास", "TagsHelpText": "टैग को अल्पविराम से अलग किया जाना चाहिए (जैसे: टैग1, टैग2, टैग3)", "ThisPartOfContentCouldntBeLoaded": "यह भाग लोड नहीं किया जा सका।", - "DuplicateCommentAttemptMessage": "डुप्लिकेट टिप्पणी पोस्ट प्रयास का पता चला। आपकी टिप्पणी पहले ही सबमिट की जा चुकी है." + "DuplicateCommentAttemptMessage": "डुप्लिकेट टिप्पणी पोस्ट प्रयास का पता चला। आपकी टिप्पणी पहले ही सबमिट की जा चुकी है.", + "ChooseAnActionForBlog": "ब्लॉग के लिए कोई कार्रवाई चुनें", + "AssignBlogPostsToOtherBlog": "अन्य ब्लॉग को ब्लॉग पोस्ट असाइन करें", + "SelectAnBlogToAssign": "असाइन करने के लिए एक ब्लॉग चुनें", + "DeleteAllBlogPostsOfThisBlog": "इस ब्लॉग के सभी ब्लॉग पोस्ट हटाएं" } } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/hr.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/hr.json index d2dff83aee..8e35745e21 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/hr.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/hr.json @@ -227,6 +227,10 @@ "CssClass": "CSS klasa", "TagsHelpText": "Oznake trebaju biti odvojene zarezom (npr. oznaka1, oznaka2, oznaka3)", "ThisPartOfContentCouldntBeLoaded": "Ovaj dio sadržaja nije bilo moguće učitati.", - "DuplicateCommentAttemptMessage": "Otkriven pokušaj postavljanja duplikata komentara. Vaš komentar je već poslan." + "DuplicateCommentAttemptMessage": "Otkriven pokušaj postavljanja duplikata komentara. Vaš komentar je već poslan.", + "ChooseAnActionForBlog": "Odaberite radnju za blog", + "AssignBlogPostsToOtherBlog": "Dodijelite postove na blogu drugom blogu", + "SelectAnBlogToAssign": "Odaberite blog za dodjelu", + "DeleteAllBlogPostsOfThisBlog": "Izbrišite sve postove na blogu" } } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/hu.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/hu.json index 219d9f95a7..9a3e4fb64e 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/hu.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/hu.json @@ -227,6 +227,10 @@ "CssClass": "CSS osztály", "TagsHelpText": "A címkéket vesszővel kell elválasztani (pl.: tag1, tag2, tag3)", "ThisPartOfContentCouldntBeLoaded": "A tartalom ezen része nem tölthető be.", - "DuplicateCommentAttemptMessage": "Ismétlődő megjegyzés közzétételi kísérlet észlelve. Megjegyzését már elküldtük." + "DuplicateCommentAttemptMessage": "Ismétlődő megjegyzés közzétételi kísérlet észlelve. Megjegyzését már elküldtük.", + "ChooseAnActionForBlog": "Válasszon egy műveletet a bloghoz", + "AssignBlogPostsToOtherBlog": "Blogbejegyzések hozzárendelése egy másik bloghoz", + "SelectAnBlogToAssign": "Válasszon egy blogot a hozzárendeléshez", + "DeleteAllBlogPostsOfThisBlog": "Ez a művelet törli az összes blogbejegyzést ebből a blogból. Biztos vagy benne?" } } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/is.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/is.json index 6788847dd7..bf02d1ff68 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/is.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/is.json @@ -227,6 +227,10 @@ "CssClass": "CSS flokkur", "TagsHelpText": "Merki ættu að vera aðskilin með kommum (td: tag1, tag2, tag3)", "ThisPartOfContentCouldntBeLoaded": "Þessi hluti af efni gat ekki verið hlaðið inn.", - "DuplicateCommentAttemptMessage": "Tvítekin tilraun til að skrifa athugasemd fannst. Athugasemd þín hefur þegar verið send." + "DuplicateCommentAttemptMessage": "Tvítekin tilraun til að skrifa athugasemd fannst. Athugasemd þín hefur þegar verið send.", + "ChooseAnActionForBlog": "Veldu aðgerð fyrir blogg", + "AssignBlogPostsToOtherBlog": "Úthluta bloggfærslum til annars bloggs", + "SelectAnBlogToAssign": "Veldu blogg til að úthluta", + "DeleteAllBlogPostsOfThisBlog": "Eyða öllum bloggfærslum þessa bloggs" } } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/it.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/it.json index c6d84a4f62..7506c439f3 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/it.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/it.json @@ -227,6 +227,10 @@ "CssClass": "Classe CSS", "TagsHelpText": "I tag devono essere separati da virgole (ad esempio: tag1, tag2, tag3)", "ThisPartOfContentCouldntBeLoaded": "Questa parte del contenuto non può essere caricata.", - "DuplicateCommentAttemptMessage": "Rilevato tentativo di pubblicare commenti duplicati. Il tuo commento è già stato inviato." + "DuplicateCommentAttemptMessage": "Rilevato tentativo di pubblicare commenti duplicati. Il tuo commento è già stato inviato.", + "ChooseAnActionForBlog": "Scegli un'azione per il blog", + "AssignBlogPostsToOtherBlog": "Assegna i post del blog ad un altro blog", + "SelectAnBlogToAssign": "Seleziona un blog a cui assegnare i post del blog", + "DeleteAllBlogPostsOfThisBlog": "Elimina tutti i post del blog di questo blog" } } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/nl.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/nl.json index b7c275078a..1d367dfa5c 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/nl.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/nl.json @@ -227,6 +227,10 @@ "CssClass": "CSS-klasse", "TagsHelpText": "Tags moeten door komma's worden gescheiden (bijvoorbeeld: tag1, tag2, tag3)", "ThisPartOfContentCouldntBeLoaded": "Dit deel van de inhoud kon niet worden geladen.", - "DuplicateCommentAttemptMessage": "Dubbele poging tot posten van commentaar gedetecteerd. Uw reactie is al verzonden." + "DuplicateCommentAttemptMessage": "Dubbele poging tot posten van commentaar gedetecteerd. Uw reactie is al verzonden.", + "ChooseAnActionForBlog": "Kies een actie voor de blog", + "AssignBlogPostsToOtherBlog": "Wijs blogberichten toe aan een andere blog", + "SelectAnBlogToAssign": "Selecteer een blog om toe te wijzen", + "DeleteAllBlogPostsOfThisBlog": "Verwijder alle blogberichten van deze blog" } } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/pl-PL.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/pl-PL.json index 5237c0dc95..0b084f585c 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/pl-PL.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/pl-PL.json @@ -227,6 +227,10 @@ "CssClass": "Klasa CSS", "TagsHelpText": "Tagi powinny być oddzielone przecinkami (np. tag1, tag2, tag3)", "ThisPartOfContentCouldntBeLoaded": "Ta część zawartości nie mogła zostać załadowana.", - "DuplicateCommentAttemptMessage": "Wykryto zduplikowaną próbę opublikowania komentarza. Twój komentarz został już przesłany." + "DuplicateCommentAttemptMessage": "Wykryto zduplikowaną próbę opublikowania komentarza. Twój komentarz został już przesłany.", + "ChooseAnActionForBlog": "Wybierz akcję dla bloga", + "AssignBlogPostsToOtherBlog": "Przypisz posty na blogu do innego bloga", + "SelectAnBlogToAssign": "Wybierz blog, do którego chcesz przypisać posty na blogu", + "DeleteAllBlogPostsOfThisBlog": "Usuń wszystkie posty na blogu tego bloga" } } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/pt-BR.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/pt-BR.json index 3182469634..3991bc0595 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/pt-BR.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/pt-BR.json @@ -227,6 +227,10 @@ "CssClass": "Classe CSS", "TagsHelpText": "As tags devem ser separadas por vírgula (por exemplo: tag1, tag2, tag3)", "ThisPartOfContentCouldntBeLoaded": "Esta parte do conteúdo não pôde ser carregada.", - "DuplicateCommentAttemptMessage": "Tentativa duplicada de postagem de comentário detectada. Seu comentário já foi enviado." + "DuplicateCommentAttemptMessage": "Tentativa duplicada de postagem de comentário detectada. Seu comentário já foi enviado.", + "ChooseAnActionForBlog": "Escolha uma ação para o blog", + "AssignBlogPostsToOtherBlog": "Atribuir postagens de blog a outro blog", + "SelectAnBlogToAssign": "Selecione um blog para atribuir", + "DeleteAllBlogPostsOfThisBlog": "Excluir todas as postagens de blog deste blog" } } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/ro-RO.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/ro-RO.json index 7b9173f477..c6b486a11a 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/ro-RO.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/ro-RO.json @@ -227,6 +227,10 @@ "CssClass": "Clasa CSS", "TagsHelpText": "Etichetele ar trebui să fie separate prin virgulă (de exemplu: tag1, tag2, tag3)", "ThisPartOfContentCouldntBeLoaded": "Această parte a conţinutului nu a putut fi încărcată.", - "DuplicateCommentAttemptMessage": "A fost detectată o încercare de postare de comentarii duplicată. Comentariul dvs. a fost deja trimis." + "DuplicateCommentAttemptMessage": "A fost detectată o încercare de postare de comentarii duplicată. Comentariul dvs. a fost deja trimis.", + "ChooseAnActionForBlog": "Alegeţi o acţiune pentru blog", + "AssignBlogPostsToOtherBlog": "Atribuiţi postările de blog la alt blog", + "SelectAnBlogToAssign": "Selectaţi un blog pentru a atribui postările de blog", + "DeleteAllBlogPostsOfThisBlog": "Ştergeţi toate postările de blog ale acestui blog" } } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/ru.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/ru.json index 491435bc02..c23671c843 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/ru.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/ru.json @@ -227,6 +227,10 @@ "CssClass": "CSS-класс", "TagsHelpText": "Теги должны быть разделены запятыми (например: тег1, тег2, тег3).", "ThisPartOfContentCouldntBeLoaded": "Эта часть содержимого не может быть загружена.", - "DuplicateCommentAttemptMessage": "Обнаружена повторная попытка публикации комментария. Ваш комментарий уже отправлен." + "DuplicateCommentAttemptMessage": "Обнаружена повторная попытка публикации комментария. Ваш комментарий уже отправлен.", + "ChooseAnActionForBlog": "Выберите действие для блога", + "AssignBlogPostsToOtherBlog": "Назначить сообщения в блоге другому блогу", + "SelectAnBlogToAssign": "Выберите блог для назначения", + "DeleteAllBlogPostsOfThisBlog": "Удалить все сообщения в блоге этого блога" } } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/sk.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/sk.json index c579340750..a1ff2cfb01 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/sk.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/sk.json @@ -227,6 +227,10 @@ "CssClass": "CSS trieda", "TagsHelpText": "Značky by mali byť oddelené čiarkou (napr.: tag1, tag2, tag3)", "ThisPartOfContentCouldntBeLoaded": "Táto časť obsahu sa nedá načítať.", - "DuplicateCommentAttemptMessage": "Zistil sa duplicitný pokus o uverejnenie komentára. Váš komentár už bol odoslaný." + "DuplicateCommentAttemptMessage": "Zistil sa duplicitný pokus o uverejnenie komentára. Váš komentár už bol odoslaný.", + "ChooseAnActionForBlog": "Vyberte akciu pre blog", + "AssignBlogPostsToOtherBlog": "Priradiť blogové príspevky k inému blogu", + "SelectAnBlogToAssign": "Vyberte blog, na ktorý chcete priradiť blogové príspevky", + "DeleteAllBlogPostsOfThisBlog": "Zmazať všetky blogové príspevky tohto blogu" } } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/sl.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/sl.json index 6e3157f56e..b4d525c3e4 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/sl.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/sl.json @@ -227,6 +227,10 @@ "CssClass": "Razred CSS", "TagsHelpText": "Oznake morajo biti ločene z vejicami (npr. oznaka1, oznaka2, oznaka3)", "ThisPartOfContentCouldntBeLoaded": "Ta del vsebine ni bil naložen.", - "DuplicateCommentAttemptMessage": "Zaznan poskus podvojene objave komentarja. Vaš komentar je že oddan." + "DuplicateCommentAttemptMessage": "Zaznan poskus podvojene objave komentarja. Vaš komentar je že oddan.", + "ChooseAnActionForBlog": "Izberite dejanje za blog", + "AssignBlogPostsToOtherBlog": "Dodeli objave v blogu drugemu blogu", + "SelectAnBlogToAssign": "Izberite blog, ki mu želite dodeliti objave", + "DeleteAllBlogPostsOfThisBlog": "Izbriši vse objave v tem blogu" } } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/sv.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/sv.json index 6e8962915b..f9604657ce 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/sv.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/sv.json @@ -254,6 +254,10 @@ "CommentAlertMessage": "Det finns {0} kommentarer som väntar på godkännande", "Settings:Menu:CmsKit": "CMS", "CommentsAwaitingApproval": "Kommentarer som väntar på godkännande", - "CommentSubmittedForApproval": "Din kommentar har skickats in för godkännande." + "CommentSubmittedForApproval": "Din kommentar har skickats in för godkännande.", + "ChooseAnActionForBlog": "Välj en åtgärd för bloggen", + "AssignBlogPostsToOtherBlog": "Tilldela blogginlägg till en annan blogg", + "SelectAnBlogToAssign": "Välj en blogg att tilldela", + "DeleteAllBlogPostsOfThisBlog": "Radera alla blogginlägg i denna blogg" } } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json index 3605cb9d3b..0e5d6d7c11 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json @@ -218,6 +218,10 @@ "CaptchaCode": "Captcha kodu", "CommentTextRequired": "Yorum zorunlu", "PopularTags": "Popüler Etiketler", - "ThisPartOfContentCouldntBeLoaded": "Bu içerik yüklenemedi" + "ThisPartOfContentCouldntBeLoaded": "Bu içerik yüklenemedi", + "ChooseAnActionForBlog": "Blog için bir eylem seçin", + "AssignBlogPostsToOtherBlog": "Diğer bloglara blog yazıları atayın", + "SelectAnBlogToAssign": "Atanacak bir blog seçin", + "DeleteAllBlogPostsOfThisBlog": "Bu blogun tüm blog yazılarını sil" } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/vi.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/vi.json index 1ec430edc3..0a2159e104 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/vi.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/vi.json @@ -227,6 +227,10 @@ "CssClass": "Lớp CSS", "TagsHelpText": "Các thẻ phải được phân tách bằng dấu phẩy (ví dụ: tag1, tag2, tag3)", "ThisPartOfContentCouldntBeLoaded": "Phần này của nội dung không thể được tải.", - "DuplicateCommentAttemptMessage": "Đã phát hiện nỗ lực đăng bình luận trùng lặp. Bình luận của bạn đã được gửi." + "DuplicateCommentAttemptMessage": "Đã phát hiện nỗ lực đăng bình luận trùng lặp. Bình luận của bạn đã được gửi.", + "ChooseAnActionForBlog": "Chọn một hành động cho blog", + "AssignBlogPostsToOtherBlog": "Gán bài đăng trên blog cho blog khác", + "SelectAnBlogToAssign": "Chọn một blog để gán", + "DeleteAllBlogPostsOfThisBlog": "Xóa tất cả bài đăng trên blog của blog này" } } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/zh-Hans.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/zh-Hans.json index c02fcf614d..18ae3004cb 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/zh-Hans.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/zh-Hans.json @@ -227,6 +227,10 @@ "CssClass": "CSS 类", "TagsHelpText": "标签应以逗号分隔(例如:标签 1,标签 2,标签 3)", "ThisPartOfContentCouldntBeLoaded": "这部分内容无法加载。", - "DuplicateCommentAttemptMessage": "检测到重复发表评论。您的评论已经提交。" + "DuplicateCommentAttemptMessage": "检测到重复发表评论。您的评论已经提交。", + "ChooseAnActionForBlog": "选择博客的操作", + "AssignBlogPostsToOtherBlog": "将博客文章分配给其他博客", + "SelectAnBlogToAssign": "选择要分配的博客", + "DeleteAllBlogPostsOfThisBlog": "删除此博客的所有博客文章" } } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/zh-Hant.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/zh-Hant.json index 866fd3fcea..80c30a6be3 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/zh-Hant.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/zh-Hant.json @@ -227,6 +227,10 @@ "CssClass": "CSS類", "TagsHelpText": "標籤應以逗號分隔(例如:tag1、tag2、tag3)", "ThisPartOfContentCouldntBeLoaded": "這部分內容無法加載", - "DuplicateCommentAttemptMessage": "偵測到重複的評論貼文嘗試。您的評論已經提交。" + "DuplicateCommentAttemptMessage": "偵測到重複的評論貼文嘗試。您的評論已經提交。", + "ChooseAnActionForBlog": "選擇部落格的操作", + "AssignBlogPostsToOtherBlog": "將部落格文章分配給其他部落格", + "SelectAnBlogToAssign": "選擇要分配的部落格", + "DeleteAllBlogPostsOfThisBlog": "刪除此部落格的所有部落格文章" } } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Pages/PageCacheItem.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Pages/PageCacheItem.cs similarity index 96% rename from modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Pages/PageCacheItem.cs rename to modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Pages/PageCacheItem.cs index d4f7925160..d4d662a8a6 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Pages/PageCacheItem.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Pages/PageCacheItem.cs @@ -3,10 +3,11 @@ using Volo.Abp.ObjectExtending; namespace Volo.CmsKit.Pages; +[Serializable] public class PageCacheItem : ExtensibleObject { public Guid Id { get; set; } - + public string Title { get; set; } public string Slug { get; set; } @@ -23,4 +24,4 @@ public class PageCacheItem : ExtensibleObject { return $"CmsPage_{slug}"; } -} \ No newline at end of file +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogPost.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogPost.cs index 3a4cf26c1b..a34a303008 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogPost.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogPost.cs @@ -53,7 +53,7 @@ public class BlogPost : FullAuditedAggregateRoot, IMultiTenant, IHasEntity ) : base(id) { TenantId = tenantId; - BlogId = blogId; + SetBlogId(blogId); AuthorId = authorId; SetTitle(title); SetSlug(slug); @@ -68,6 +68,11 @@ public class BlogPost : FullAuditedAggregateRoot, IMultiTenant, IHasEntity Title = Check.NotNullOrWhiteSpace(title, nameof(title), BlogPostConsts.MaxTitleLength); } + public virtual void SetBlogId(Guid blogId) + { + BlogId = blogId; + } + internal void SetSlug(string slug) { Check.NotNullOrWhiteSpace(slug, nameof(slug), BlogPostConsts.MaxSlugLength, BlogPostConsts.MinSlugLength); diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogWithBlogPostCount.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogWithBlogPostCount.cs new file mode 100644 index 0000000000..9a84402375 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogWithBlogPostCount.cs @@ -0,0 +1,14 @@ +namespace Volo.CmsKit.Blogs; + +public class BlogWithBlogPostCount +{ + public Blog Blog { get; set; } + + public int BlogPostCount { get; set; } + + public BlogWithBlogPostCount(Blog blog, int blogPostCount) + { + Blog = blog; + BlogPostCount = blogPostCount; + } +} \ No newline at end of file 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 404d21dc83..885d0de800 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 @@ -44,4 +44,6 @@ public interface IBlogPostRepository : IBasicRepository Task GetAuthorHasBlogPostAsync(Guid id, CancellationToken cancellationToken = default); Task HasBlogPostWaitingForReviewAsync(CancellationToken cancellationToken = default); + + Task UpdateBlogAsync(Guid sourceBlogId, Guid? targetBlogId = null, CancellationToken cancellationToken = default); } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/IBlogRepository.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/IBlogRepository.cs index 60005db319..aebdfc3f24 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/IBlogRepository.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/IBlogRepository.cs @@ -16,6 +16,13 @@ public interface IBlogRepository : IBasicRepository CancellationToken cancellationToken = default ); + Task> GetListWithBlogPostCountAsync( + string filter = null, + string sorting = null, + int maxResultCount = int.MaxValue, + int skipCount = 0, + CancellationToken cancellationToken = default); + Task GetCountAsync( string filter = null, 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 266a04a910..1160387151 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 @@ -160,4 +160,17 @@ public class EfCoreBlogPostRepository : EfCoreRepository x.Status == BlogPostStatus.WaitingForReview, GetCancellationToken(cancellationToken)); } + + public 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 diff --git a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Blogs/EfCoreBlogRepository.cs b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Blogs/EfCoreBlogRepository.cs index daf915f675..5234577f02 100644 --- a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Blogs/EfCoreBlogRepository.cs +++ b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Blogs/EfCoreBlogRepository.cs @@ -43,6 +43,31 @@ public class EfCoreBlogRepository : EfCoreRepository> GetListWithBlogPostCountAsync( + string filter = null, + string sorting = null, + int maxResultCount = int.MaxValue, + int skipCount = 0, + CancellationToken cancellationToken = default) + { + var blogs = await (await GetListQueryAsync(filter)).OrderBy(sorting.IsNullOrEmpty() ? "creationTime desc" : sorting) + .PageBy(skipCount, maxResultCount).ToListAsync(GetCancellationToken(cancellationToken)); + + var blogIds = blogs.Select(x => x.Id).ToArray(); + + var blogPostCount = await (await GetDbContextAsync()).Set() + .Where(blogPost => blogIds.Contains(blogPost.BlogId)) + .GroupBy(blogPost => blogPost.BlogId) + .Select(x => new + { + BlogId = x.Key, + Count = x.Count() + }) + .ToListAsync(GetCancellationToken(cancellationToken)); + + return blogs.Select(blog => new BlogWithBlogPostCount(blog, blogPostCount.FirstOrDefault(x => x.BlogId == blog.Id)?.Count ?? 0)).ToList(); + } + public virtual async Task GetCountAsync(string filter = null, CancellationToken cancellationToken = default) { var query = await GetListQueryAsync(filter); 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 d3ae31926b..d27fdf16b6 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 @@ -192,4 +192,24 @@ public class MongoBlogPostRepository : MongoDbRepository x.Status == BlogPostStatus.WaitingForReview, cancellationToken); } + + public async Task UpdateBlogAsync(Guid sourceBlogId, Guid? targetBlogId, CancellationToken cancellationToken = default) + { + cancellationToken = GetCancellationToken(cancellationToken); + var blogPosts = await (await GetMongoQueryableAsync(cancellationToken)).Where(x => x.BlogId == sourceBlogId).ToListAsync(cancellationToken); + if (targetBlogId.HasValue) + { + foreach (var blogPost in blogPosts) + { + blogPost.SetBlogId(targetBlogId.Value); + } + + await UpdateManyAsync(blogPosts, false, cancellationToken); + } + else + { + + await DeleteManyAsync(blogPosts, false, cancellationToken); + } + } } diff --git a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Blogs/MongoBlogRepository.cs b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Blogs/MongoBlogRepository.cs index b34c452621..98567899e5 100644 --- a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Blogs/MongoBlogRepository.cs +++ b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Blogs/MongoBlogRepository.cs @@ -49,6 +49,33 @@ public class MongoBlogRepository : MongoDbRepository> GetListWithBlogPostCountAsync( + string filter = null, + string sorting = null, + int maxResultCount = int.MaxValue, + int skipCount = 0, + CancellationToken cancellationToken = default) + { + var token = GetCancellationToken(cancellationToken); + + var blogs = await GetListQueryAsync(filter, token); + + var blogIds = blogs.OrderBy(sorting.IsNullOrEmpty() ? "creationTime desc" : sorting) + .PageBy(skipCount, maxResultCount).Select(x => x.Id).ToList(); + + var blogPostCount = await (await GetMongoQueryableAsync(token)) + .Where(blogPost => blogIds.Contains(blogPost.Id)) + .GroupBy(blogPost => blogPost.BlogId) + .Select(x => new + { + BlogId = x.Key, + Count = x.Count() + }) + .ToListAsync(GetCancellationToken(cancellationToken)); + + return blogs.Select(blog => new BlogWithBlogPostCount(blog, blogPostCount.FirstOrDefault(x => x.BlogId == blog.Id) != null ? blogPostCount.FirstOrDefault(x => x.BlogId == blog.Id).Count : 0)).ToList(); + } + public virtual async Task GetCountAsync(string filter = null, CancellationToken cancellationToken = default) { var token = GetCancellationToken(cancellationToken); diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Commenting/Default.cshtml b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Commenting/Default.cshtml index 1b86ade0a8..7033978f48 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Commenting/Default.cshtml +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Commenting/Default.cshtml @@ -87,32 +87,32 @@ Func GetCommentActionArea(Guid id, Guid authorId, bool isReply) => @
@if (!isReply) - { - @if (CurrentUser.IsAuthenticated) - { - - @L["Reply"] - - - - @L["Delete"] - - } - else - { - - @L["LoginToReply"] - - } - } + { + @if (CurrentUser.IsAuthenticated) + { + + @L["Reply"] + + } + else + { + + @L["LoginToReply"] + + } + } @if (authorId == CurrentUser.Id) - { - - @L["Edit"] - - } + { + + @L["Edit"] + + + + @L["Delete"] + + }
; } @{ diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKitPageRouteValueTransformer.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKitPageRouteValueTransformer.cs index d9bba6cd0b..53f7fe50ba 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKitPageRouteValueTransformer.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKitPageRouteValueTransformer.cs @@ -2,9 +2,11 @@ using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc.Routing; using Microsoft.AspNetCore.Routing; +using Volo.Abp.Caching; using Volo.Abp.DependencyInjection; using Volo.Abp.Features; using Volo.CmsKit.Features; +using Volo.CmsKit.Pages; using Volo.CmsKit.Public.Pages; namespace Volo.CmsKit.Public.Web.Pages; @@ -13,14 +15,16 @@ public class CmsKitPageRouteValueTransformer : DynamicRouteValueTransformer, ITr { protected IFeatureChecker FeatureChecker { get; } protected IPagePublicAppService PagePublicAppService { get; } + protected IDistributedCache PageCache { get; } - public CmsKitPageRouteValueTransformer(IFeatureChecker featureChecker, IPagePublicAppService pagePublicAppService) + public CmsKitPageRouteValueTransformer(IFeatureChecker featureChecker, IPagePublicAppService pagePublicAppService, IDistributedCache pageCache) { FeatureChecker = featureChecker; PagePublicAppService = pagePublicAppService; + PageCache = pageCache; } - public override async ValueTask TransformAsync(HttpContext httpContext, RouteValueDictionary values) + public async override ValueTask TransformAsync(HttpContext httpContext, RouteValueDictionary values) { if (values.TryGetValue("slug", out var slugParameter) && slugParameter is not null) { @@ -30,7 +34,12 @@ public class CmsKitPageRouteValueTransformer : DynamicRouteValueTransformer, ITr } var slug = slugParameter.ToString().TrimStart('/'); - var exist = await PagePublicAppService.DoesSlugExistAsync(slug); + + var exist = await PageCache.GetAsync(PageCacheItem.GetKey(slug)) != null; + if (!exist) + { + exist = await PagePublicAppService.DoesSlugExistAsync(slug); + } if (exist) { @@ -40,4 +49,4 @@ public class CmsKitPageRouteValueTransformer : DynamicRouteValueTransformer, ITr return values; } -} \ No newline at end of file +} diff --git a/modules/docs/app/VoloDocs.Web/package.json b/modules/docs/app/VoloDocs.Web/package.json index 51dbf39a97..6035df65f0 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.0.0-rc.2", - "@abp/docs": "~9.0.0-rc.2" + "@abp/aspnetcore.mvc.ui.theme.basic": "~9.0.1", + "@abp/docs": "~9.0.1" } } diff --git a/modules/docs/app/VoloDocs.Web/yarn.lock b/modules/docs/app/VoloDocs.Web/yarn.lock index fcbfe59c8c..46507843d9 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.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/anchor-js/-/anchor-js-9.0.0-rc.2.tgz#50f13ecddb163f549ced84711e857dd6d98921e9" - integrity sha512-YYOY5oaN2GdN7em5cckSX0t3pTRaQ1TFkjilzRQHiAgwmS/B5SO09V9hvQ0lLvpIPGQ7JzaomkZxCaQpMLeMCA== +"@abp/anchor-js@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/anchor-js/-/anchor-js-9.0.1.tgz#fd23f51989ce65c05fc6e717a07e28048210339c" + integrity sha512-yyYk6HKNXDCJi5skwoG52j6lulicPFNg53hmWEvC11L3O00SWEJw3RzflwQDOKzRQGlBq+pbzqUB5h3nm0KV+w== dependencies: - "@abp/core" "~9.0.0-rc.2" + "@abp/core" "~9.0.1" anchor-js "^5.0.0" -"@abp/aspnetcore.mvc.ui.theme.basic@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-9.0.0-rc.2.tgz#db73b3121cbd02207842f0388999298df49392ac" - integrity sha512-vzUPdL1UJ+aXKcei0rCpm3VYX9twhmomd+HqfzcL65TtrXgIK8jCv4Wn0rRFfSGtUfM8OetIVVkmggIZusGTZQ== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~9.0.0-rc.2" - -"@abp/aspnetcore.mvc.ui.theme.shared@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-9.0.0-rc.2.tgz#acaeaa5e0b329e5d836a198f7a3563d141d7fc79" - integrity sha512-hs8AoZwOnrMYmFl7/GQc6EUr5Jz5lTXWgSmp0l/DdH7f3INYEgCrIp5qvLFyNu8CHv6Gbegw2vGdpfDQbkiasw== - dependencies: - "@abp/aspnetcore.mvc.ui" "~9.0.0-rc.2" - "@abp/bootstrap" "~9.0.0-rc.2" - "@abp/bootstrap-datepicker" "~9.0.0-rc.2" - "@abp/bootstrap-daterangepicker" "~9.0.0-rc.2" - "@abp/datatables.net-bs5" "~9.0.0-rc.2" - "@abp/font-awesome" "~9.0.0-rc.2" - "@abp/jquery-form" "~9.0.0-rc.2" - "@abp/jquery-validation-unobtrusive" "~9.0.0-rc.2" - "@abp/lodash" "~9.0.0-rc.2" - "@abp/luxon" "~9.0.0-rc.2" - "@abp/malihu-custom-scrollbar-plugin" "~9.0.0-rc.2" - "@abp/moment" "~9.0.0-rc.2" - "@abp/select2" "~9.0.0-rc.2" - "@abp/sweetalert2" "~9.0.0-rc.2" - "@abp/timeago" "~9.0.0-rc.2" - "@abp/toastr" "~9.0.0-rc.2" - -"@abp/aspnetcore.mvc.ui@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-9.0.0-rc.2.tgz#5fc82ab4872b955cf46d755e99c656e0420a3c64" - integrity sha512-gGfHAsznxFIqTk6OFuRzcJ8D65VWmHkRqQjzmd97GZ1lNXRGDNGtYXbC/L1bA88O+qAXzhQ/c47h6in9cGh38w== +"@abp/aspnetcore.mvc.ui.theme.basic@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-9.0.1.tgz#cdb6130ac6f8499f9a3f856b596c46745d056a30" + integrity sha512-JaxuDH8WTnZYX6C7CX7ZVHfhTDR/SxfwRvtJaGGijSX8QKd1DXpfi9lYEF4Y9k5b48YT/0slBqU5g0sLmBd3+g== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~9.0.1" + +"@abp/aspnetcore.mvc.ui.theme.shared@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-9.0.1.tgz#7a1be780a305aa0d0f467472fc721b6f710fda7a" + integrity sha512-vrgRYKNctdZYhPCQ2I6Z10gUI1S5ynDj+DgnV7x7a7G/juuHaOSbkRXgwrmJsmYLfGA7KFCoJcbpER8mmXQeHQ== + dependencies: + "@abp/aspnetcore.mvc.ui" "~9.0.1" + "@abp/bootstrap" "~9.0.1" + "@abp/bootstrap-datepicker" "~9.0.1" + "@abp/bootstrap-daterangepicker" "~9.0.1" + "@abp/datatables.net-bs5" "~9.0.1" + "@abp/font-awesome" "~9.0.1" + "@abp/jquery-form" "~9.0.1" + "@abp/jquery-validation-unobtrusive" "~9.0.1" + "@abp/lodash" "~9.0.1" + "@abp/luxon" "~9.0.1" + "@abp/malihu-custom-scrollbar-plugin" "~9.0.1" + "@abp/moment" "~9.0.1" + "@abp/select2" "~9.0.1" + "@abp/sweetalert2" "~9.0.1" + "@abp/timeago" "~9.0.1" + "@abp/toastr" "~9.0.1" + +"@abp/aspnetcore.mvc.ui@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-9.0.1.tgz#811dd91138efb82345fc06559b5d2feea88021af" + integrity sha512-KVbWCpBV7S1ViHYQP/hn4gSMzSiA2e8/zC0HND1fjE+1zXJqJyEWto1eg2DaKSOs/rmHD8WtFVMU4hCLQTCuIA== dependencies: ansi-colors "^4.1.3" -"@abp/bootstrap-datepicker@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-9.0.0-rc.2.tgz#884343a8c0b881e6612cbbbf1fb9af0f40cbc223" - integrity sha512-JqPKn0xFyqoA4smY3gtUE/HcbG5QmLtFpZNG/zMnDq2JEtJt13xee9FguYXrlMOrM9PqAwnq2Wrc8s71ROh8Zg== +"@abp/bootstrap-datepicker@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-9.0.1.tgz#21cd19090b9a571ddf5a9019bc17864c8685408c" + integrity sha512-LhgqBRr66x9gGTAyv1FuPAw8u8N77WQK2AfDkNgLueurM2+xMYQzH3pWWLhcN676/JXafxfALCfBoM8U7CfXLg== dependencies: bootstrap-datepicker "^1.10.0" -"@abp/bootstrap-daterangepicker@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-9.0.0-rc.2.tgz#bc0e134e36da111aaa25f7d4d3e90d394c873b50" - integrity sha512-5KChSBquD7pQNiI3TgJSYHw549Pxuom8TAg+44edjEKRvR7KUR8IkfdImlZYHPeLmoUTnnWXiFKOIxOi9OjLoA== +"@abp/bootstrap-daterangepicker@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-9.0.1.tgz#c19c23ede6fd868a147ea893d4fdecfa60b177f7" + integrity sha512-SlBVgiYa75uQyaGt5EVjduren7Po5UP26A1tXEQQr0hDia1+1TK0qxmJ2YxjeJpB7FwtcmJiofv5fngvJqhxIA== dependencies: bootstrap-daterangepicker "^3.1.0" -"@abp/bootstrap@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-9.0.0-rc.2.tgz#cf0b2567f44030d5d0620ca36d9d25999cd25e0e" - integrity sha512-Fkagr1fTyeKDtsvn7TKJKRkWNaYd6ZmE1IhLffwLwDpyt26JBYK3XqGXT+eHFXXpSxrgANERVogSN5E46IU1OQ== +"@abp/bootstrap@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-9.0.1.tgz#2360303ec24c8f3eb755b10fa6a953db6d858daf" + integrity sha512-uAfVNsUYSsRqgeO9JMnhJJlFoDmO3/lTvER/iYOqerF0X03KQnR8HZy2V3MD1D+fSh/4JuU6aAZFl6IQLinMKQ== dependencies: - "@abp/core" "~9.0.0-rc.2" + "@abp/core" "~9.0.1" bootstrap "^5.3.3" -"@abp/clipboard@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-9.0.0-rc.2.tgz#dfa4df015beba83f7c44d749a24987a74a419b59" - integrity sha512-xuhFygNc4c67QkVMqsArQ4qGRJX+qKwSx4LQIaASaZq91ACtU2r5iTjCDb/YFcUVxXXufNLvuFgARGJp5vvvxA== +"@abp/clipboard@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-9.0.1.tgz#b1712b2d940caecc85eb99247a569ffe3ab1a387" + integrity sha512-obDYqUTf+65E26yHZO2DigQOeDnzAEvak0Umz91cholZHVRvzc9X1itv/abS/whU0YOU/d8Viud8zFv1MnM83w== dependencies: - "@abp/core" "~9.0.0-rc.2" + "@abp/core" "~9.0.1" clipboard "^2.0.11" -"@abp/core@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-9.0.0-rc.2.tgz#f0344669a745581b1032de396b1165f4cb3ea834" - integrity sha512-rmlWc6ydzRWVvQpkqSGEXcmYx1WJvxLajC7Ts6epbmmyklrx+tA5uQqCiSlsJWfIyaejLOjDka319arukaMb/Q== +"@abp/core@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-9.0.1.tgz#727fc1dfac21cca1216c4f5091da7d5efefdb467" + integrity sha512-NWXDVCIJePbcKCrRvGxAlaA2MrOF2IZox37bQkW7/mTeOPpNoTa6lhowksNNcTpFq2YdD8bG0i0kfskkp3EZ2w== dependencies: - "@abp/utils" "~9.0.0-rc.2" + "@abp/utils" "~9.0.1" -"@abp/datatables.net-bs5@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-9.0.0-rc.2.tgz#7f01e5e74530cd9bb13545917f00a5c38163745a" - integrity sha512-snZi/kAtkH4p1t1cUIKU5DRDz+U2CUHk7JAZE+g9bClMvmDTh4Kta5JmTW3g++JSh+C0LQzYXRPXnV7TgUcBgw== +"@abp/datatables.net-bs5@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-9.0.1.tgz#61e2a3daacf1c074ed6b459e25084cc1f5c4eeab" + integrity sha512-tAHdf4TBAS0bVRcvovDKS0OHFyeRSPYbiSIwDn8AIWzW9Weav31jhZ5jL3HEtBKVdb7zqUQ8/3dYPufjDuDdDA== dependencies: - "@abp/datatables.net" "~9.0.0-rc.2" + "@abp/datatables.net" "~9.0.1" datatables.net-bs5 "^2.1.8" -"@abp/datatables.net@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-9.0.0-rc.2.tgz#cf5a5df0c6735080f2ba1f1746f4eb8d05d02c5b" - integrity sha512-hdJH5xN6SXTFZXnv+fTmcmFU19Fr2sIZMrfirUfH1of8qTn7cObjAe9r189PGt/3FZeFPA8pmfnNL6ZLwnLKtw== +"@abp/datatables.net@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-9.0.1.tgz#4cf193e7493f85a272de47326a32a021e3ba40f5" + integrity sha512-JY53zVQPluRrBiKwtgk4gfSgD8VDs/VU8LWizhGCprXt3h9vXx0SQL4My6zvXVkv4hUjaq4+MYo84OI8EwFvsg== dependencies: - "@abp/jquery" "~9.0.0-rc.2" + "@abp/jquery" "~9.0.1" datatables.net "^2.1.8" -"@abp/docs@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/docs/-/docs-9.0.0-rc.2.tgz#cc68ed146197a165c51c06eff5a8b41416476e9c" - integrity sha512-BaWL/x/b9fE+GGwNbQVmUgpVyNJZAVqDZlZP0YUVjn4uz1KwvjJMPbhUws/0Xl647cQHSAz5S3LDQVQDQl+rYg== +"@abp/docs@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/docs/-/docs-9.0.1.tgz#7e1d09ef62f686771d550d7a0e158abac0e51650" + integrity sha512-RZphDobO0cWZGoOB1FOly3gdJ4KWeCrurp8kWaReWMmdIAc4xmg6CMK07XGz6fKC8SuU8GLJ8vP2cI+QsPmiKw== dependencies: - "@abp/anchor-js" "~9.0.0-rc.2" - "@abp/clipboard" "~9.0.0-rc.2" - "@abp/malihu-custom-scrollbar-plugin" "~9.0.0-rc.2" - "@abp/popper.js" "~9.0.0-rc.2" - "@abp/prismjs" "~9.0.0-rc.2" + "@abp/anchor-js" "~9.0.1" + "@abp/clipboard" "~9.0.1" + "@abp/malihu-custom-scrollbar-plugin" "~9.0.1" + "@abp/popper.js" "~9.0.1" + "@abp/prismjs" "~9.0.1" -"@abp/font-awesome@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-9.0.0-rc.2.tgz#1493057e28b2e1e8a434ff1599e8b4b72b8784d2" - integrity sha512-EsQYx89OBquIxqGLgjAgMpUeAnWW316ruAmmxzGsusVT9KuIL6iuA4j4bdM8/6wJgi6zm2A/bDBjiiDDg2Cyyg== +"@abp/font-awesome@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-9.0.1.tgz#69da15018e7e5f2ff0d3c0d113a4325f54ffc0c3" + integrity sha512-7NnYBmk0plLVElUWR1zohul87vE9wKJItemWT5Kskf/IJirKOvXwSSu+7Jg1LmnVtIxcH6qgRpJMmzuAJgawnQ== dependencies: - "@abp/core" "~9.0.0-rc.2" + "@abp/core" "~9.0.1" "@fortawesome/fontawesome-free" "^6.6.0" -"@abp/jquery-form@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-9.0.0-rc.2.tgz#05a9082bc6c42fca3e001d97f77c0aa2e941448b" - integrity sha512-OUuwB/dgryiBG/iZCedwP2+8ot+PCeuAAMuZ1A/VXbNUJAbhiXF24tQM73wIhpAYcSc5egWjJ+VNTJKMKImTqA== +"@abp/jquery-form@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-9.0.1.tgz#35e0a23cf50b00e0d3b0886f097233b79144145b" + integrity sha512-9co0+Cver+RUSOpfuukSWQhR+TCnO9Dly4RTVRIKFksGVfN8hA70NqRrVxaASNNFv42ynK88FQK+2bLPswz/iw== dependencies: - "@abp/jquery" "~9.0.0-rc.2" + "@abp/jquery" "~9.0.1" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-9.0.0-rc.2.tgz#d38f053ad3a8509dc683dc3091128eb445579176" - integrity sha512-170ARAIz0NWuQnleB2nWPKYQl3x/Za2yxc0utjxY0rruHflNQPF2cMagLu+eBI6gDkThXNps74HiRPXOPdgc4A== +"@abp/jquery-validation-unobtrusive@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-9.0.1.tgz#f9564aabebf4d9f90b4ee5c3f3de0e1a348d8ecc" + integrity sha512-Zpz48wIFjq7eIApG/sEVjkfaJWZhcyCnlCtDf5eU3vvh82nRetbiCEAVLpZ4LVjorlyp3VvVAxReUSeeWflu8A== dependencies: - "@abp/jquery-validation" "~9.0.0-rc.2" + "@abp/jquery-validation" "~9.0.1" jquery-validation-unobtrusive "^4.0.0" -"@abp/jquery-validation@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-9.0.0-rc.2.tgz#79c96c7eb48d5bebb3e7e86f8f9e2d6e2e45c5cb" - integrity sha512-6W2LiLgcC4FGTMLsoNkRBJTqDq6YR3ctLKzRfis9kOigkd0QT/PnB/451rrVb7+BCl9luKaA8DDYF671S8klFA== +"@abp/jquery-validation@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-9.0.1.tgz#ad37a44e82fb32ec9bfe2b736dfc8a143fca89c7" + integrity sha512-uFSxiPMEkaPlcuyXIoKbeOIIRHo4IrgRbmnlHwI1uETrW60ENUdE2LJAVcYS77JROrjVtv8FPlaffWuva6sGeQ== dependencies: - "@abp/jquery" "~9.0.0-rc.2" + "@abp/jquery" "~9.0.1" jquery-validation "^1.21.0" -"@abp/jquery@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-9.0.0-rc.2.tgz#c8bd299d1b5558a4c3cef26b248d42e9a6303e33" - integrity sha512-GrO0gKdi20jlQ0YjWaddal0X0+5LkMpOAyMB1GdaDetLaaVjcZ+92zx1cApcAdIsCKgB+kyutRQv0b82o/EZPQ== +"@abp/jquery@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-9.0.1.tgz#ecce14644c753c581caee0df7bfafd3d083e70f0" + integrity sha512-z8EcnOveItAszbTsM9GFFDQSlcIg/ym6+WZME9uldLoetdxkmI9ij0knVeGj5eqMjQaHvTWwrVLObiBbZwYFWw== dependencies: - "@abp/core" "~9.0.0-rc.2" + "@abp/core" "~9.0.1" jquery "~3.7.1" -"@abp/lodash@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-9.0.0-rc.2.tgz#980a0ae2d95c83663f0f52f1b67b5cfb00d04b96" - integrity sha512-uwxv7WJqwRcGkVoB44JR1QJaMbe3RhCQsG6+Wee1Jjdgi2vkpFUCj2arM4Rxz1igntFjY2Z7NiBq+iL9HYIkSw== +"@abp/lodash@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-9.0.1.tgz#c52c8a4125ecfbeaad7badc5c28bf86d5168799a" + integrity sha512-D+/iOyh/O+jV80bK5vWxyn++IVmeRbZq/UaXanA4RKpzigxJUsgOiSD9lUj85BkfKn2YyFmoR39xwaAqkWoyRA== dependencies: - "@abp/core" "~9.0.0-rc.2" + "@abp/core" "~9.0.1" lodash "^4.17.21" -"@abp/luxon@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-9.0.0-rc.2.tgz#1bb0eae53b707371489a4e0edf2869d7acc71da8" - integrity sha512-iWE8sbBWxCbNYSO3TTTzeotGS6kAnIwCKos/96mtaYJ4wzPW9pgF7K94CvwLAAg9NTsx/J/OGdmhhM2cULhv+w== +"@abp/luxon@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-9.0.1.tgz#ac59a56653d51b997dbbde8ccc58dac5746a9ef4" + integrity sha512-1ZHXP5SGz05tQ1tzYmPcRiZwmkCKGX0KWFoV0zF3ATRaevzku9nXvSy7K6GIFkkgTb9f9XNx4/OBBF/GXkuRqw== dependencies: - "@abp/core" "~9.0.0-rc.2" + "@abp/core" "~9.0.1" luxon "^3.5.0" -"@abp/malihu-custom-scrollbar-plugin@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-9.0.0-rc.2.tgz#fce5c12be2bdf350b18aae52619309a474995442" - integrity sha512-e3JTnDSkjF9/MPh/nPqcvU8hkUxSMc5U6DnP169GBdVAYQwwnGD24x4QCWU7ch7s65FDJ8/uq7bYOcIAD0B+Dw== +"@abp/malihu-custom-scrollbar-plugin@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-9.0.1.tgz#9e60bcfb9f9d76fed9c50e45bf490d5abd0f4689" + integrity sha512-GkKPLg9Z9UTTSSpW2hYZYZ9IgCvDSOYJmyRSl/h4fG8cWMgGCPVpv8MPPu0+WtIfwW/mT4SPX9X+sjUlRL5XRQ== dependencies: - "@abp/core" "~9.0.0-rc.2" + "@abp/core" "~9.0.1" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/moment@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-9.0.0-rc.2.tgz#2fc0feaaa0a26436cf00a6beccaa64f505aef301" - integrity sha512-yqkgu0bo3ra6HVFdS2wlqwTysciYOJWi/ERFVS2MfUkAKFA0P7mv8Jg5tB4vGY2Km++7r22kCDRlK3KUPmk21g== +"@abp/moment@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-9.0.1.tgz#d67fa25017fe15dae10e0a0fcebb03aeb63d31d3" + integrity sha512-bTuCc7pi/DCtgz7t96UBU0wn9UGt4b50JhDCVeTKquh+gP1sgWoI5hyvEBkmgE4dcffO0yzZU2opHYTKYGl/OQ== dependencies: moment "^2.30.1" -"@abp/popper.js@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/popper.js/-/popper.js-9.0.0-rc.2.tgz#f2bb752d015077ca4f09362550a657083544f8a8" - integrity sha512-hwZvx02ULi5ShxLdBQogMBD+DCSQN3/aOT8NqrllasrHgzRQ9NhKi9Mdez+5mJMJKAaJz2kX41ivV7I5MOpb9g== +"@abp/popper.js@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/popper.js/-/popper.js-9.0.1.tgz#df1f7fc86c642c5998c9226204a65e6ef248b759" + integrity sha512-bOTL+fih9iXKZdSIoaJ531R+prMSzhyTzSYHevCHF9BozXA+rGnXPqEV6KQWrT0xi1bIFFrlSKajJInNyiy77g== dependencies: - "@abp/core" "~9.0.0-rc.2" + "@abp/core" "~9.0.1" "@popperjs/core" "^2.11.8" -"@abp/prismjs@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-9.0.0-rc.2.tgz#2de7bc2882fee46d3d7e2da1fb66bca6b06cc4dd" - integrity sha512-rQ4dVGk+lEHFFSIBsJPqijeh4k3UgoDMZL1rns2a6NR+QnR0J2Slx3Awt8SH+inQFH2JiLHVo9q4bG+81vCsag== +"@abp/prismjs@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-9.0.1.tgz#2693014c8161d561e7c7bef01d5cd24ee53be1b3" + integrity sha512-NwW+vpTiAsuJYNC/MEiAj0dGMWml95mAQD1Z0Djfsg9D6OpcLsdlgWX+KVdZvHoJ+SPgTDIqdt/0LnIv1w/XdA== dependencies: - "@abp/clipboard" "~9.0.0-rc.2" - "@abp/core" "~9.0.0-rc.2" + "@abp/clipboard" "~9.0.1" + "@abp/core" "~9.0.1" prismjs "^1.29.0" -"@abp/select2@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-9.0.0-rc.2.tgz#53806118fdfe9f9228e26c6867ce0e75e6572b81" - integrity sha512-arKdcs95+4zp5764iOz09aJ3C1F2SsBIzekpjpJwMBdLRfoleZZFm12itO8I4Jjb1R+2CkW6MXjLR5xL2aE0PQ== +"@abp/select2@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-9.0.1.tgz#9f1c5c27e72bef910fdf63fc3167f415d2ba8db8" + integrity sha512-epyYJH2gAOU2UvGn5FD6372hbW3fL7uZIgGpvfgEfa+l6HPdlV9B1OweU2xkONNCoylShAcP/y8qf+bUh8WDEA== dependencies: - "@abp/core" "~9.0.0-rc.2" + "@abp/core" "~9.0.1" select2 "^4.0.13" -"@abp/sweetalert2@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-9.0.0-rc.2.tgz#60b25d65b3e5eb53e18ba5b1f3663783562d2506" - integrity sha512-VJslD1AMDZJhOEko79UYIxIYeAmr1YUwJu8XNAurBGPa9sWGI+jPY/dYg3uptg8GEJHsFtog84m3nUQ/prRUcw== +"@abp/sweetalert2@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-9.0.1.tgz#a364b21665cb76e92640496dc8a77b8edbce4500" + integrity sha512-0RXR/lzy3qMJLisGUz4qrcA9Clu/Tt1ABGzB64ynG1t/l5XessQsIB5Hkt6MbSyOEsprRsq+ZtKH35CwTRPdAw== dependencies: - "@abp/core" "~9.0.0-rc.2" + "@abp/core" "~9.0.1" sweetalert2 "^11.14.1" -"@abp/timeago@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-9.0.0-rc.2.tgz#72a7da1eda19beb34c352f3f43d2f5181b0b926a" - integrity sha512-zRj+TssaDXW2OM4mNn47G1tRg4BZ2sqbEiiUIQrU9hHMHmxOf8bAJhqsouGDDZF3xetcwKhmLN08VWK1sqqpQA== +"@abp/timeago@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-9.0.1.tgz#d1b7e11fdc267bdb736ff4b591afd3fb81c07cce" + integrity sha512-dNfUQwilrY+JHxL5lwJ++ixYDGAs5lF1EDxKMQMIXD/ak5L8rkdLns8Otta7FhgDDny9UJ7XWQjYsG8ZxxybRQ== dependencies: - "@abp/jquery" "~9.0.0-rc.2" + "@abp/jquery" "~9.0.1" timeago "^1.6.7" -"@abp/toastr@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-9.0.0-rc.2.tgz#ddbf0b6362941f62c07c9820af59dcd6912331d0" - integrity sha512-l4z6z3Oc/JF4XJplqGETQtBkqzjbpobcfzEHeH6LjUeunLMEVQOtjhPUBLrhg4ZM0i9k46hmxsoOkWXu7tClyQ== +"@abp/toastr@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-9.0.1.tgz#2105a639d7cd4fa9c671b4215d719a78fef7e0ee" + integrity sha512-10KuHnSJOxkvzqs6Aim6GJp8xBuT+TsZqBE1KaXQnERPawmOo4+ME28kA/7lq8fvgFUNO3K41T2uuA1GPHVQcg== dependencies: - "@abp/jquery" "~9.0.0-rc.2" + "@abp/jquery" "~9.0.1" toastr "^2.1.4" -"@abp/utils@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-9.0.0-rc.2.tgz#e644889f1c1c4828b509aea9ae3ae48439a5b89d" - integrity sha512-eIL3syPE0LzPyeHV5+pgRxw3/H2YTmK2U9VEOUu26ExiCMIt5Waf8T92BjaH9sLrMD5P9ZAT2jWaxh+VTsEtKA== +"@abp/utils@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-9.0.1.tgz#dccaf7cf92147304d454ffb9a8664d52dc7e5c5a" + integrity sha512-7eOKT0ciKNdtuASck1kifyc4dC6CeebgxV+rx/EAi3YwPMDkqie6YwLGUqKdGW2N/MZ15JuDR6gkuZxKHEb0NQ== dependencies: just-compare "^2.3.0" diff --git a/modules/openiddict/app/OpenIddict.Demo.Server/package.json b/modules/openiddict/app/OpenIddict.Demo.Server/package.json index 49894b8882..716eaed26c 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.0.0-rc.2" + "@abp/aspnetcore.mvc.ui.theme.basic": "~9.0.1" } } diff --git a/modules/openiddict/app/angular/package.json b/modules/openiddict/app/angular/package.json index de241c6b2e..0c362f715c 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.0.0-rc.2", - "@abp/ng.components": "~9.0.0-rc.2", - "@abp/ng.core": "~9.0.0-rc.2", - "@abp/ng.oauth": "~9.0.0-rc.2", - "@abp/ng.identity": "~9.0.0-rc.2", - "@abp/ng.setting-management": "~9.0.0-rc.2", - "@abp/ng.tenant-management": "~9.0.0-rc.2", - "@abp/ng.theme.shared": "~9.0.0-rc.2", - "@abp/ng.theme.lepton-x": "~4.0.0-rc.2", + "@abp/ng.account": "~9.0.1", + "@abp/ng.components": "~9.0.1", + "@abp/ng.core": "~9.0.1", + "@abp/ng.oauth": "~9.0.1", + "@abp/ng.identity": "~9.0.1", + "@abp/ng.setting-management": "~9.0.1", + "@abp/ng.tenant-management": "~9.0.1", + "@abp/ng.theme.shared": "~9.0.1", + "@abp/ng.theme.lepton-x": "~4.0.1", "@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.0.0-rc.2", + "@abp/ng.schematics": "~9.0.1", "@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/AbpOpenIddictAspNetCoreModule.cs b/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/AbpOpenIddictAspNetCoreModule.cs index 94e662f936..6ebb66cb6a 100644 --- a/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/AbpOpenIddictAspNetCoreModule.cs +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/AbpOpenIddictAspNetCoreModule.cs @@ -140,7 +140,5 @@ public class AbpOpenIddictAspNetCoreModule : AbpModule services.ExecutePreConfiguredActions(builder); }); - - services.ExecutePreConfiguredActions(openIddictBuilder); } } 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 4227819fa6..1e8a4aab7b 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 @@ -35,19 +35,12 @@ public class PermissionDataSeeder : IPermissionDataSeeder, ITransientDependency { var names = grantedPermissions.ToArray(); var existsPermissionGrants = (await PermissionGrantRepository.GetListAsync(names, providerName, providerKey)).Select(x => x.Name).ToList(); - - foreach (var permissionName in names.Except(existsPermissionGrants)) + var permissions = names.Except(existsPermissionGrants).Select(permissionName => new PermissionGrant(GuidGenerator.Create(), permissionName, providerName, providerKey, tenantId)).ToList(); + if (!permissions.Any()) { - await PermissionGrantRepository.InsertAsync( - new PermissionGrant( - GuidGenerator.Create(), - permissionName, - providerName, - providerKey, - tenantId - ) - ); + return; } + await PermissionGrantRepository.InsertManyAsync(permissions); } } } 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 f205e18814..aa3599532c 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.0.0-rc.2" + "@abp/aspnetcore.mvc.ui.theme.basic": "~9.0.1" } } 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 db507796bb..0ac91bf6da 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.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-9.0.0-rc.2.tgz#db73b3121cbd02207842f0388999298df49392ac" - integrity sha512-vzUPdL1UJ+aXKcei0rCpm3VYX9twhmomd+HqfzcL65TtrXgIK8jCv4Wn0rRFfSGtUfM8OetIVVkmggIZusGTZQ== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~9.0.0-rc.2" - -"@abp/aspnetcore.mvc.ui.theme.shared@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-9.0.0-rc.2.tgz#acaeaa5e0b329e5d836a198f7a3563d141d7fc79" - integrity sha512-hs8AoZwOnrMYmFl7/GQc6EUr5Jz5lTXWgSmp0l/DdH7f3INYEgCrIp5qvLFyNu8CHv6Gbegw2vGdpfDQbkiasw== - dependencies: - "@abp/aspnetcore.mvc.ui" "~9.0.0-rc.2" - "@abp/bootstrap" "~9.0.0-rc.2" - "@abp/bootstrap-datepicker" "~9.0.0-rc.2" - "@abp/bootstrap-daterangepicker" "~9.0.0-rc.2" - "@abp/datatables.net-bs5" "~9.0.0-rc.2" - "@abp/font-awesome" "~9.0.0-rc.2" - "@abp/jquery-form" "~9.0.0-rc.2" - "@abp/jquery-validation-unobtrusive" "~9.0.0-rc.2" - "@abp/lodash" "~9.0.0-rc.2" - "@abp/luxon" "~9.0.0-rc.2" - "@abp/malihu-custom-scrollbar-plugin" "~9.0.0-rc.2" - "@abp/moment" "~9.0.0-rc.2" - "@abp/select2" "~9.0.0-rc.2" - "@abp/sweetalert2" "~9.0.0-rc.2" - "@abp/timeago" "~9.0.0-rc.2" - "@abp/toastr" "~9.0.0-rc.2" - -"@abp/aspnetcore.mvc.ui@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-9.0.0-rc.2.tgz#5fc82ab4872b955cf46d755e99c656e0420a3c64" - integrity sha512-gGfHAsznxFIqTk6OFuRzcJ8D65VWmHkRqQjzmd97GZ1lNXRGDNGtYXbC/L1bA88O+qAXzhQ/c47h6in9cGh38w== +"@abp/aspnetcore.mvc.ui.theme.basic@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-9.0.1.tgz#cdb6130ac6f8499f9a3f856b596c46745d056a30" + integrity sha512-JaxuDH8WTnZYX6C7CX7ZVHfhTDR/SxfwRvtJaGGijSX8QKd1DXpfi9lYEF4Y9k5b48YT/0slBqU5g0sLmBd3+g== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~9.0.1" + +"@abp/aspnetcore.mvc.ui.theme.shared@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-9.0.1.tgz#7a1be780a305aa0d0f467472fc721b6f710fda7a" + integrity sha512-vrgRYKNctdZYhPCQ2I6Z10gUI1S5ynDj+DgnV7x7a7G/juuHaOSbkRXgwrmJsmYLfGA7KFCoJcbpER8mmXQeHQ== + dependencies: + "@abp/aspnetcore.mvc.ui" "~9.0.1" + "@abp/bootstrap" "~9.0.1" + "@abp/bootstrap-datepicker" "~9.0.1" + "@abp/bootstrap-daterangepicker" "~9.0.1" + "@abp/datatables.net-bs5" "~9.0.1" + "@abp/font-awesome" "~9.0.1" + "@abp/jquery-form" "~9.0.1" + "@abp/jquery-validation-unobtrusive" "~9.0.1" + "@abp/lodash" "~9.0.1" + "@abp/luxon" "~9.0.1" + "@abp/malihu-custom-scrollbar-plugin" "~9.0.1" + "@abp/moment" "~9.0.1" + "@abp/select2" "~9.0.1" + "@abp/sweetalert2" "~9.0.1" + "@abp/timeago" "~9.0.1" + "@abp/toastr" "~9.0.1" + +"@abp/aspnetcore.mvc.ui@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-9.0.1.tgz#811dd91138efb82345fc06559b5d2feea88021af" + integrity sha512-KVbWCpBV7S1ViHYQP/hn4gSMzSiA2e8/zC0HND1fjE+1zXJqJyEWto1eg2DaKSOs/rmHD8WtFVMU4hCLQTCuIA== dependencies: ansi-colors "^4.1.3" -"@abp/bootstrap-datepicker@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-9.0.0-rc.2.tgz#884343a8c0b881e6612cbbbf1fb9af0f40cbc223" - integrity sha512-JqPKn0xFyqoA4smY3gtUE/HcbG5QmLtFpZNG/zMnDq2JEtJt13xee9FguYXrlMOrM9PqAwnq2Wrc8s71ROh8Zg== +"@abp/bootstrap-datepicker@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-9.0.1.tgz#21cd19090b9a571ddf5a9019bc17864c8685408c" + integrity sha512-LhgqBRr66x9gGTAyv1FuPAw8u8N77WQK2AfDkNgLueurM2+xMYQzH3pWWLhcN676/JXafxfALCfBoM8U7CfXLg== dependencies: bootstrap-datepicker "^1.10.0" -"@abp/bootstrap-daterangepicker@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-9.0.0-rc.2.tgz#bc0e134e36da111aaa25f7d4d3e90d394c873b50" - integrity sha512-5KChSBquD7pQNiI3TgJSYHw549Pxuom8TAg+44edjEKRvR7KUR8IkfdImlZYHPeLmoUTnnWXiFKOIxOi9OjLoA== +"@abp/bootstrap-daterangepicker@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-9.0.1.tgz#c19c23ede6fd868a147ea893d4fdecfa60b177f7" + integrity sha512-SlBVgiYa75uQyaGt5EVjduren7Po5UP26A1tXEQQr0hDia1+1TK0qxmJ2YxjeJpB7FwtcmJiofv5fngvJqhxIA== dependencies: bootstrap-daterangepicker "^3.1.0" -"@abp/bootstrap@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-9.0.0-rc.2.tgz#cf0b2567f44030d5d0620ca36d9d25999cd25e0e" - integrity sha512-Fkagr1fTyeKDtsvn7TKJKRkWNaYd6ZmE1IhLffwLwDpyt26JBYK3XqGXT+eHFXXpSxrgANERVogSN5E46IU1OQ== +"@abp/bootstrap@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-9.0.1.tgz#2360303ec24c8f3eb755b10fa6a953db6d858daf" + integrity sha512-uAfVNsUYSsRqgeO9JMnhJJlFoDmO3/lTvER/iYOqerF0X03KQnR8HZy2V3MD1D+fSh/4JuU6aAZFl6IQLinMKQ== dependencies: - "@abp/core" "~9.0.0-rc.2" + "@abp/core" "~9.0.1" bootstrap "^5.3.3" -"@abp/core@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-9.0.0-rc.2.tgz#f0344669a745581b1032de396b1165f4cb3ea834" - integrity sha512-rmlWc6ydzRWVvQpkqSGEXcmYx1WJvxLajC7Ts6epbmmyklrx+tA5uQqCiSlsJWfIyaejLOjDka319arukaMb/Q== +"@abp/core@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-9.0.1.tgz#727fc1dfac21cca1216c4f5091da7d5efefdb467" + integrity sha512-NWXDVCIJePbcKCrRvGxAlaA2MrOF2IZox37bQkW7/mTeOPpNoTa6lhowksNNcTpFq2YdD8bG0i0kfskkp3EZ2w== dependencies: - "@abp/utils" "~9.0.0-rc.2" + "@abp/utils" "~9.0.1" -"@abp/datatables.net-bs5@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-9.0.0-rc.2.tgz#7f01e5e74530cd9bb13545917f00a5c38163745a" - integrity sha512-snZi/kAtkH4p1t1cUIKU5DRDz+U2CUHk7JAZE+g9bClMvmDTh4Kta5JmTW3g++JSh+C0LQzYXRPXnV7TgUcBgw== +"@abp/datatables.net-bs5@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-9.0.1.tgz#61e2a3daacf1c074ed6b459e25084cc1f5c4eeab" + integrity sha512-tAHdf4TBAS0bVRcvovDKS0OHFyeRSPYbiSIwDn8AIWzW9Weav31jhZ5jL3HEtBKVdb7zqUQ8/3dYPufjDuDdDA== dependencies: - "@abp/datatables.net" "~9.0.0-rc.2" + "@abp/datatables.net" "~9.0.1" datatables.net-bs5 "^2.1.8" -"@abp/datatables.net@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-9.0.0-rc.2.tgz#cf5a5df0c6735080f2ba1f1746f4eb8d05d02c5b" - integrity sha512-hdJH5xN6SXTFZXnv+fTmcmFU19Fr2sIZMrfirUfH1of8qTn7cObjAe9r189PGt/3FZeFPA8pmfnNL6ZLwnLKtw== +"@abp/datatables.net@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-9.0.1.tgz#4cf193e7493f85a272de47326a32a021e3ba40f5" + integrity sha512-JY53zVQPluRrBiKwtgk4gfSgD8VDs/VU8LWizhGCprXt3h9vXx0SQL4My6zvXVkv4hUjaq4+MYo84OI8EwFvsg== dependencies: - "@abp/jquery" "~9.0.0-rc.2" + "@abp/jquery" "~9.0.1" datatables.net "^2.1.8" -"@abp/font-awesome@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-9.0.0-rc.2.tgz#1493057e28b2e1e8a434ff1599e8b4b72b8784d2" - integrity sha512-EsQYx89OBquIxqGLgjAgMpUeAnWW316ruAmmxzGsusVT9KuIL6iuA4j4bdM8/6wJgi6zm2A/bDBjiiDDg2Cyyg== +"@abp/font-awesome@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-9.0.1.tgz#69da15018e7e5f2ff0d3c0d113a4325f54ffc0c3" + integrity sha512-7NnYBmk0plLVElUWR1zohul87vE9wKJItemWT5Kskf/IJirKOvXwSSu+7Jg1LmnVtIxcH6qgRpJMmzuAJgawnQ== dependencies: - "@abp/core" "~9.0.0-rc.2" + "@abp/core" "~9.0.1" "@fortawesome/fontawesome-free" "^6.6.0" -"@abp/jquery-form@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-9.0.0-rc.2.tgz#05a9082bc6c42fca3e001d97f77c0aa2e941448b" - integrity sha512-OUuwB/dgryiBG/iZCedwP2+8ot+PCeuAAMuZ1A/VXbNUJAbhiXF24tQM73wIhpAYcSc5egWjJ+VNTJKMKImTqA== +"@abp/jquery-form@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-9.0.1.tgz#35e0a23cf50b00e0d3b0886f097233b79144145b" + integrity sha512-9co0+Cver+RUSOpfuukSWQhR+TCnO9Dly4RTVRIKFksGVfN8hA70NqRrVxaASNNFv42ynK88FQK+2bLPswz/iw== dependencies: - "@abp/jquery" "~9.0.0-rc.2" + "@abp/jquery" "~9.0.1" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-9.0.0-rc.2.tgz#d38f053ad3a8509dc683dc3091128eb445579176" - integrity sha512-170ARAIz0NWuQnleB2nWPKYQl3x/Za2yxc0utjxY0rruHflNQPF2cMagLu+eBI6gDkThXNps74HiRPXOPdgc4A== +"@abp/jquery-validation-unobtrusive@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-9.0.1.tgz#f9564aabebf4d9f90b4ee5c3f3de0e1a348d8ecc" + integrity sha512-Zpz48wIFjq7eIApG/sEVjkfaJWZhcyCnlCtDf5eU3vvh82nRetbiCEAVLpZ4LVjorlyp3VvVAxReUSeeWflu8A== dependencies: - "@abp/jquery-validation" "~9.0.0-rc.2" + "@abp/jquery-validation" "~9.0.1" jquery-validation-unobtrusive "^4.0.0" -"@abp/jquery-validation@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-9.0.0-rc.2.tgz#79c96c7eb48d5bebb3e7e86f8f9e2d6e2e45c5cb" - integrity sha512-6W2LiLgcC4FGTMLsoNkRBJTqDq6YR3ctLKzRfis9kOigkd0QT/PnB/451rrVb7+BCl9luKaA8DDYF671S8klFA== +"@abp/jquery-validation@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-9.0.1.tgz#ad37a44e82fb32ec9bfe2b736dfc8a143fca89c7" + integrity sha512-uFSxiPMEkaPlcuyXIoKbeOIIRHo4IrgRbmnlHwI1uETrW60ENUdE2LJAVcYS77JROrjVtv8FPlaffWuva6sGeQ== dependencies: - "@abp/jquery" "~9.0.0-rc.2" + "@abp/jquery" "~9.0.1" jquery-validation "^1.21.0" -"@abp/jquery@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-9.0.0-rc.2.tgz#c8bd299d1b5558a4c3cef26b248d42e9a6303e33" - integrity sha512-GrO0gKdi20jlQ0YjWaddal0X0+5LkMpOAyMB1GdaDetLaaVjcZ+92zx1cApcAdIsCKgB+kyutRQv0b82o/EZPQ== +"@abp/jquery@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-9.0.1.tgz#ecce14644c753c581caee0df7bfafd3d083e70f0" + integrity sha512-z8EcnOveItAszbTsM9GFFDQSlcIg/ym6+WZME9uldLoetdxkmI9ij0knVeGj5eqMjQaHvTWwrVLObiBbZwYFWw== dependencies: - "@abp/core" "~9.0.0-rc.2" + "@abp/core" "~9.0.1" jquery "~3.7.1" -"@abp/lodash@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-9.0.0-rc.2.tgz#980a0ae2d95c83663f0f52f1b67b5cfb00d04b96" - integrity sha512-uwxv7WJqwRcGkVoB44JR1QJaMbe3RhCQsG6+Wee1Jjdgi2vkpFUCj2arM4Rxz1igntFjY2Z7NiBq+iL9HYIkSw== +"@abp/lodash@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-9.0.1.tgz#c52c8a4125ecfbeaad7badc5c28bf86d5168799a" + integrity sha512-D+/iOyh/O+jV80bK5vWxyn++IVmeRbZq/UaXanA4RKpzigxJUsgOiSD9lUj85BkfKn2YyFmoR39xwaAqkWoyRA== dependencies: - "@abp/core" "~9.0.0-rc.2" + "@abp/core" "~9.0.1" lodash "^4.17.21" -"@abp/luxon@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-9.0.0-rc.2.tgz#1bb0eae53b707371489a4e0edf2869d7acc71da8" - integrity sha512-iWE8sbBWxCbNYSO3TTTzeotGS6kAnIwCKos/96mtaYJ4wzPW9pgF7K94CvwLAAg9NTsx/J/OGdmhhM2cULhv+w== +"@abp/luxon@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-9.0.1.tgz#ac59a56653d51b997dbbde8ccc58dac5746a9ef4" + integrity sha512-1ZHXP5SGz05tQ1tzYmPcRiZwmkCKGX0KWFoV0zF3ATRaevzku9nXvSy7K6GIFkkgTb9f9XNx4/OBBF/GXkuRqw== dependencies: - "@abp/core" "~9.0.0-rc.2" + "@abp/core" "~9.0.1" luxon "^3.5.0" -"@abp/malihu-custom-scrollbar-plugin@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-9.0.0-rc.2.tgz#fce5c12be2bdf350b18aae52619309a474995442" - integrity sha512-e3JTnDSkjF9/MPh/nPqcvU8hkUxSMc5U6DnP169GBdVAYQwwnGD24x4QCWU7ch7s65FDJ8/uq7bYOcIAD0B+Dw== +"@abp/malihu-custom-scrollbar-plugin@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-9.0.1.tgz#9e60bcfb9f9d76fed9c50e45bf490d5abd0f4689" + integrity sha512-GkKPLg9Z9UTTSSpW2hYZYZ9IgCvDSOYJmyRSl/h4fG8cWMgGCPVpv8MPPu0+WtIfwW/mT4SPX9X+sjUlRL5XRQ== dependencies: - "@abp/core" "~9.0.0-rc.2" + "@abp/core" "~9.0.1" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/moment@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-9.0.0-rc.2.tgz#2fc0feaaa0a26436cf00a6beccaa64f505aef301" - integrity sha512-yqkgu0bo3ra6HVFdS2wlqwTysciYOJWi/ERFVS2MfUkAKFA0P7mv8Jg5tB4vGY2Km++7r22kCDRlK3KUPmk21g== +"@abp/moment@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-9.0.1.tgz#d67fa25017fe15dae10e0a0fcebb03aeb63d31d3" + integrity sha512-bTuCc7pi/DCtgz7t96UBU0wn9UGt4b50JhDCVeTKquh+gP1sgWoI5hyvEBkmgE4dcffO0yzZU2opHYTKYGl/OQ== dependencies: moment "^2.30.1" -"@abp/select2@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-9.0.0-rc.2.tgz#53806118fdfe9f9228e26c6867ce0e75e6572b81" - integrity sha512-arKdcs95+4zp5764iOz09aJ3C1F2SsBIzekpjpJwMBdLRfoleZZFm12itO8I4Jjb1R+2CkW6MXjLR5xL2aE0PQ== +"@abp/select2@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-9.0.1.tgz#9f1c5c27e72bef910fdf63fc3167f415d2ba8db8" + integrity sha512-epyYJH2gAOU2UvGn5FD6372hbW3fL7uZIgGpvfgEfa+l6HPdlV9B1OweU2xkONNCoylShAcP/y8qf+bUh8WDEA== dependencies: - "@abp/core" "~9.0.0-rc.2" + "@abp/core" "~9.0.1" select2 "^4.0.13" -"@abp/sweetalert2@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-9.0.0-rc.2.tgz#60b25d65b3e5eb53e18ba5b1f3663783562d2506" - integrity sha512-VJslD1AMDZJhOEko79UYIxIYeAmr1YUwJu8XNAurBGPa9sWGI+jPY/dYg3uptg8GEJHsFtog84m3nUQ/prRUcw== +"@abp/sweetalert2@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-9.0.1.tgz#a364b21665cb76e92640496dc8a77b8edbce4500" + integrity sha512-0RXR/lzy3qMJLisGUz4qrcA9Clu/Tt1ABGzB64ynG1t/l5XessQsIB5Hkt6MbSyOEsprRsq+ZtKH35CwTRPdAw== dependencies: - "@abp/core" "~9.0.0-rc.2" + "@abp/core" "~9.0.1" sweetalert2 "^11.14.1" -"@abp/timeago@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-9.0.0-rc.2.tgz#72a7da1eda19beb34c352f3f43d2f5181b0b926a" - integrity sha512-zRj+TssaDXW2OM4mNn47G1tRg4BZ2sqbEiiUIQrU9hHMHmxOf8bAJhqsouGDDZF3xetcwKhmLN08VWK1sqqpQA== +"@abp/timeago@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-9.0.1.tgz#d1b7e11fdc267bdb736ff4b591afd3fb81c07cce" + integrity sha512-dNfUQwilrY+JHxL5lwJ++ixYDGAs5lF1EDxKMQMIXD/ak5L8rkdLns8Otta7FhgDDny9UJ7XWQjYsG8ZxxybRQ== dependencies: - "@abp/jquery" "~9.0.0-rc.2" + "@abp/jquery" "~9.0.1" timeago "^1.6.7" -"@abp/toastr@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-9.0.0-rc.2.tgz#ddbf0b6362941f62c07c9820af59dcd6912331d0" - integrity sha512-l4z6z3Oc/JF4XJplqGETQtBkqzjbpobcfzEHeH6LjUeunLMEVQOtjhPUBLrhg4ZM0i9k46hmxsoOkWXu7tClyQ== +"@abp/toastr@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-9.0.1.tgz#2105a639d7cd4fa9c671b4215d719a78fef7e0ee" + integrity sha512-10KuHnSJOxkvzqs6Aim6GJp8xBuT+TsZqBE1KaXQnERPawmOo4+ME28kA/7lq8fvgFUNO3K41T2uuA1GPHVQcg== dependencies: - "@abp/jquery" "~9.0.0-rc.2" + "@abp/jquery" "~9.0.1" toastr "^2.1.4" -"@abp/utils@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-9.0.0-rc.2.tgz#e644889f1c1c4828b509aea9ae3ae48439a5b89d" - integrity sha512-eIL3syPE0LzPyeHV5+pgRxw3/H2YTmK2U9VEOUu26ExiCMIt5Waf8T92BjaH9sLrMD5P9ZAT2jWaxh+VTsEtKA== +"@abp/utils@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-9.0.1.tgz#dccaf7cf92147304d454ffb9a8664d52dc7e5c5a" + integrity sha512-7eOKT0ciKNdtuASck1kifyc4dC6CeebgxV+rx/EAi3YwPMDkqie6YwLGUqKdGW2N/MZ15JuDR6gkuZxKHEb0NQ== dependencies: just-compare "^2.3.0" diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/Pages/SettingManagement/SettingManagement.razor.cs b/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/Pages/SettingManagement/SettingManagement.razor.cs index 202598ff8d..9eb0ca977a 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/Pages/SettingManagement/SettingManagement.razor.cs +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/Pages/SettingManagement/SettingManagement.razor.cs @@ -42,7 +42,10 @@ public partial class SettingManagement SettingComponentCreationContext.Normalize(); SettingItemRenders.Clear(); - SelectedGroup = GetNormalizedString(SettingComponentCreationContext.Groups.First().Id); + if (SettingComponentCreationContext.Groups.Any()) + { + SelectedGroup = GetNormalizedString(SettingComponentCreationContext.Groups.First().Id); + } } protected override async Task OnAfterRenderAsync(bool firstRender) diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/Settings/TimeZonePageContributor.cs b/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/Settings/TimeZonePageContributor.cs index 6effd64494..7aa4164bdf 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/Settings/TimeZonePageContributor.cs +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/Settings/TimeZonePageContributor.cs @@ -14,7 +14,7 @@ public class TimeZonePageContributor : ISettingComponentContributor public async Task ConfigureAsync(SettingComponentCreationContext context) { var l = context.ServiceProvider.GetRequiredService>(); - if (context.ServiceProvider.GetRequiredService().SupportsMultipleTimezone) + if (await CheckPermissionsAsync(context)) { context.Groups.Add( new SettingComponentGroup( @@ -30,6 +30,7 @@ public class TimeZonePageContributor : ISettingComponentContributor { var authorizationService = context.ServiceProvider.GetRequiredService(); - return await authorizationService.IsGrantedAsync(SettingManagementPermissions.TimeZone); + return context.ServiceProvider.GetRequiredService().SupportsMultipleTimezone + && await authorizationService.IsGrantedAsync(SettingManagementPermissions.TimeZone); } } 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 index a7c7ea664b..fc83403e01 100644 --- a/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/package.json +++ b/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/package.json @@ -3,7 +3,7 @@ "version": "1.0.0", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "~9.0.0-rc.2", - "@abp/virtual-file-explorer": "~9.0.0-rc.2" + "@abp/aspnetcore.mvc.ui.theme.basic": "~9.0.1", + "@abp/virtual-file-explorer": "~9.0.1" } } 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 index d81ac4fce9..f761366309 100644 --- a/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/yarn.lock +++ b/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/yarn.lock @@ -2,221 +2,221 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.basic@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-9.0.0-rc.2.tgz#db73b3121cbd02207842f0388999298df49392ac" - integrity sha512-vzUPdL1UJ+aXKcei0rCpm3VYX9twhmomd+HqfzcL65TtrXgIK8jCv4Wn0rRFfSGtUfM8OetIVVkmggIZusGTZQ== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~9.0.0-rc.2" - -"@abp/aspnetcore.mvc.ui.theme.shared@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-9.0.0-rc.2.tgz#acaeaa5e0b329e5d836a198f7a3563d141d7fc79" - integrity sha512-hs8AoZwOnrMYmFl7/GQc6EUr5Jz5lTXWgSmp0l/DdH7f3INYEgCrIp5qvLFyNu8CHv6Gbegw2vGdpfDQbkiasw== - dependencies: - "@abp/aspnetcore.mvc.ui" "~9.0.0-rc.2" - "@abp/bootstrap" "~9.0.0-rc.2" - "@abp/bootstrap-datepicker" "~9.0.0-rc.2" - "@abp/bootstrap-daterangepicker" "~9.0.0-rc.2" - "@abp/datatables.net-bs5" "~9.0.0-rc.2" - "@abp/font-awesome" "~9.0.0-rc.2" - "@abp/jquery-form" "~9.0.0-rc.2" - "@abp/jquery-validation-unobtrusive" "~9.0.0-rc.2" - "@abp/lodash" "~9.0.0-rc.2" - "@abp/luxon" "~9.0.0-rc.2" - "@abp/malihu-custom-scrollbar-plugin" "~9.0.0-rc.2" - "@abp/moment" "~9.0.0-rc.2" - "@abp/select2" "~9.0.0-rc.2" - "@abp/sweetalert2" "~9.0.0-rc.2" - "@abp/timeago" "~9.0.0-rc.2" - "@abp/toastr" "~9.0.0-rc.2" - -"@abp/aspnetcore.mvc.ui@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-9.0.0-rc.2.tgz#5fc82ab4872b955cf46d755e99c656e0420a3c64" - integrity sha512-gGfHAsznxFIqTk6OFuRzcJ8D65VWmHkRqQjzmd97GZ1lNXRGDNGtYXbC/L1bA88O+qAXzhQ/c47h6in9cGh38w== +"@abp/aspnetcore.mvc.ui.theme.basic@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-9.0.1.tgz#cdb6130ac6f8499f9a3f856b596c46745d056a30" + integrity sha512-JaxuDH8WTnZYX6C7CX7ZVHfhTDR/SxfwRvtJaGGijSX8QKd1DXpfi9lYEF4Y9k5b48YT/0slBqU5g0sLmBd3+g== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~9.0.1" + +"@abp/aspnetcore.mvc.ui.theme.shared@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-9.0.1.tgz#7a1be780a305aa0d0f467472fc721b6f710fda7a" + integrity sha512-vrgRYKNctdZYhPCQ2I6Z10gUI1S5ynDj+DgnV7x7a7G/juuHaOSbkRXgwrmJsmYLfGA7KFCoJcbpER8mmXQeHQ== + dependencies: + "@abp/aspnetcore.mvc.ui" "~9.0.1" + "@abp/bootstrap" "~9.0.1" + "@abp/bootstrap-datepicker" "~9.0.1" + "@abp/bootstrap-daterangepicker" "~9.0.1" + "@abp/datatables.net-bs5" "~9.0.1" + "@abp/font-awesome" "~9.0.1" + "@abp/jquery-form" "~9.0.1" + "@abp/jquery-validation-unobtrusive" "~9.0.1" + "@abp/lodash" "~9.0.1" + "@abp/luxon" "~9.0.1" + "@abp/malihu-custom-scrollbar-plugin" "~9.0.1" + "@abp/moment" "~9.0.1" + "@abp/select2" "~9.0.1" + "@abp/sweetalert2" "~9.0.1" + "@abp/timeago" "~9.0.1" + "@abp/toastr" "~9.0.1" + +"@abp/aspnetcore.mvc.ui@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-9.0.1.tgz#811dd91138efb82345fc06559b5d2feea88021af" + integrity sha512-KVbWCpBV7S1ViHYQP/hn4gSMzSiA2e8/zC0HND1fjE+1zXJqJyEWto1eg2DaKSOs/rmHD8WtFVMU4hCLQTCuIA== dependencies: ansi-colors "^4.1.3" -"@abp/bootstrap-datepicker@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-9.0.0-rc.2.tgz#884343a8c0b881e6612cbbbf1fb9af0f40cbc223" - integrity sha512-JqPKn0xFyqoA4smY3gtUE/HcbG5QmLtFpZNG/zMnDq2JEtJt13xee9FguYXrlMOrM9PqAwnq2Wrc8s71ROh8Zg== +"@abp/bootstrap-datepicker@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-9.0.1.tgz#21cd19090b9a571ddf5a9019bc17864c8685408c" + integrity sha512-LhgqBRr66x9gGTAyv1FuPAw8u8N77WQK2AfDkNgLueurM2+xMYQzH3pWWLhcN676/JXafxfALCfBoM8U7CfXLg== dependencies: bootstrap-datepicker "^1.10.0" -"@abp/bootstrap-daterangepicker@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-9.0.0-rc.2.tgz#bc0e134e36da111aaa25f7d4d3e90d394c873b50" - integrity sha512-5KChSBquD7pQNiI3TgJSYHw549Pxuom8TAg+44edjEKRvR7KUR8IkfdImlZYHPeLmoUTnnWXiFKOIxOi9OjLoA== +"@abp/bootstrap-daterangepicker@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-9.0.1.tgz#c19c23ede6fd868a147ea893d4fdecfa60b177f7" + integrity sha512-SlBVgiYa75uQyaGt5EVjduren7Po5UP26A1tXEQQr0hDia1+1TK0qxmJ2YxjeJpB7FwtcmJiofv5fngvJqhxIA== dependencies: bootstrap-daterangepicker "^3.1.0" -"@abp/bootstrap@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-9.0.0-rc.2.tgz#cf0b2567f44030d5d0620ca36d9d25999cd25e0e" - integrity sha512-Fkagr1fTyeKDtsvn7TKJKRkWNaYd6ZmE1IhLffwLwDpyt26JBYK3XqGXT+eHFXXpSxrgANERVogSN5E46IU1OQ== +"@abp/bootstrap@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-9.0.1.tgz#2360303ec24c8f3eb755b10fa6a953db6d858daf" + integrity sha512-uAfVNsUYSsRqgeO9JMnhJJlFoDmO3/lTvER/iYOqerF0X03KQnR8HZy2V3MD1D+fSh/4JuU6aAZFl6IQLinMKQ== dependencies: - "@abp/core" "~9.0.0-rc.2" + "@abp/core" "~9.0.1" bootstrap "^5.3.3" -"@abp/clipboard@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-9.0.0-rc.2.tgz#dfa4df015beba83f7c44d749a24987a74a419b59" - integrity sha512-xuhFygNc4c67QkVMqsArQ4qGRJX+qKwSx4LQIaASaZq91ACtU2r5iTjCDb/YFcUVxXXufNLvuFgARGJp5vvvxA== +"@abp/clipboard@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-9.0.1.tgz#b1712b2d940caecc85eb99247a569ffe3ab1a387" + integrity sha512-obDYqUTf+65E26yHZO2DigQOeDnzAEvak0Umz91cholZHVRvzc9X1itv/abS/whU0YOU/d8Viud8zFv1MnM83w== dependencies: - "@abp/core" "~9.0.0-rc.2" + "@abp/core" "~9.0.1" clipboard "^2.0.11" -"@abp/core@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-9.0.0-rc.2.tgz#f0344669a745581b1032de396b1165f4cb3ea834" - integrity sha512-rmlWc6ydzRWVvQpkqSGEXcmYx1WJvxLajC7Ts6epbmmyklrx+tA5uQqCiSlsJWfIyaejLOjDka319arukaMb/Q== +"@abp/core@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-9.0.1.tgz#727fc1dfac21cca1216c4f5091da7d5efefdb467" + integrity sha512-NWXDVCIJePbcKCrRvGxAlaA2MrOF2IZox37bQkW7/mTeOPpNoTa6lhowksNNcTpFq2YdD8bG0i0kfskkp3EZ2w== dependencies: - "@abp/utils" "~9.0.0-rc.2" + "@abp/utils" "~9.0.1" -"@abp/datatables.net-bs5@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-9.0.0-rc.2.tgz#7f01e5e74530cd9bb13545917f00a5c38163745a" - integrity sha512-snZi/kAtkH4p1t1cUIKU5DRDz+U2CUHk7JAZE+g9bClMvmDTh4Kta5JmTW3g++JSh+C0LQzYXRPXnV7TgUcBgw== +"@abp/datatables.net-bs5@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-9.0.1.tgz#61e2a3daacf1c074ed6b459e25084cc1f5c4eeab" + integrity sha512-tAHdf4TBAS0bVRcvovDKS0OHFyeRSPYbiSIwDn8AIWzW9Weav31jhZ5jL3HEtBKVdb7zqUQ8/3dYPufjDuDdDA== dependencies: - "@abp/datatables.net" "~9.0.0-rc.2" + "@abp/datatables.net" "~9.0.1" datatables.net-bs5 "^2.1.8" -"@abp/datatables.net@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-9.0.0-rc.2.tgz#cf5a5df0c6735080f2ba1f1746f4eb8d05d02c5b" - integrity sha512-hdJH5xN6SXTFZXnv+fTmcmFU19Fr2sIZMrfirUfH1of8qTn7cObjAe9r189PGt/3FZeFPA8pmfnNL6ZLwnLKtw== +"@abp/datatables.net@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-9.0.1.tgz#4cf193e7493f85a272de47326a32a021e3ba40f5" + integrity sha512-JY53zVQPluRrBiKwtgk4gfSgD8VDs/VU8LWizhGCprXt3h9vXx0SQL4My6zvXVkv4hUjaq4+MYo84OI8EwFvsg== dependencies: - "@abp/jquery" "~9.0.0-rc.2" + "@abp/jquery" "~9.0.1" datatables.net "^2.1.8" -"@abp/font-awesome@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-9.0.0-rc.2.tgz#1493057e28b2e1e8a434ff1599e8b4b72b8784d2" - integrity sha512-EsQYx89OBquIxqGLgjAgMpUeAnWW316ruAmmxzGsusVT9KuIL6iuA4j4bdM8/6wJgi6zm2A/bDBjiiDDg2Cyyg== +"@abp/font-awesome@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-9.0.1.tgz#69da15018e7e5f2ff0d3c0d113a4325f54ffc0c3" + integrity sha512-7NnYBmk0plLVElUWR1zohul87vE9wKJItemWT5Kskf/IJirKOvXwSSu+7Jg1LmnVtIxcH6qgRpJMmzuAJgawnQ== dependencies: - "@abp/core" "~9.0.0-rc.2" + "@abp/core" "~9.0.1" "@fortawesome/fontawesome-free" "^6.6.0" -"@abp/jquery-form@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-9.0.0-rc.2.tgz#05a9082bc6c42fca3e001d97f77c0aa2e941448b" - integrity sha512-OUuwB/dgryiBG/iZCedwP2+8ot+PCeuAAMuZ1A/VXbNUJAbhiXF24tQM73wIhpAYcSc5egWjJ+VNTJKMKImTqA== +"@abp/jquery-form@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-9.0.1.tgz#35e0a23cf50b00e0d3b0886f097233b79144145b" + integrity sha512-9co0+Cver+RUSOpfuukSWQhR+TCnO9Dly4RTVRIKFksGVfN8hA70NqRrVxaASNNFv42ynK88FQK+2bLPswz/iw== dependencies: - "@abp/jquery" "~9.0.0-rc.2" + "@abp/jquery" "~9.0.1" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-9.0.0-rc.2.tgz#d38f053ad3a8509dc683dc3091128eb445579176" - integrity sha512-170ARAIz0NWuQnleB2nWPKYQl3x/Za2yxc0utjxY0rruHflNQPF2cMagLu+eBI6gDkThXNps74HiRPXOPdgc4A== +"@abp/jquery-validation-unobtrusive@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-9.0.1.tgz#f9564aabebf4d9f90b4ee5c3f3de0e1a348d8ecc" + integrity sha512-Zpz48wIFjq7eIApG/sEVjkfaJWZhcyCnlCtDf5eU3vvh82nRetbiCEAVLpZ4LVjorlyp3VvVAxReUSeeWflu8A== dependencies: - "@abp/jquery-validation" "~9.0.0-rc.2" + "@abp/jquery-validation" "~9.0.1" jquery-validation-unobtrusive "^4.0.0" -"@abp/jquery-validation@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-9.0.0-rc.2.tgz#79c96c7eb48d5bebb3e7e86f8f9e2d6e2e45c5cb" - integrity sha512-6W2LiLgcC4FGTMLsoNkRBJTqDq6YR3ctLKzRfis9kOigkd0QT/PnB/451rrVb7+BCl9luKaA8DDYF671S8klFA== +"@abp/jquery-validation@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-9.0.1.tgz#ad37a44e82fb32ec9bfe2b736dfc8a143fca89c7" + integrity sha512-uFSxiPMEkaPlcuyXIoKbeOIIRHo4IrgRbmnlHwI1uETrW60ENUdE2LJAVcYS77JROrjVtv8FPlaffWuva6sGeQ== dependencies: - "@abp/jquery" "~9.0.0-rc.2" + "@abp/jquery" "~9.0.1" jquery-validation "^1.21.0" -"@abp/jquery@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-9.0.0-rc.2.tgz#c8bd299d1b5558a4c3cef26b248d42e9a6303e33" - integrity sha512-GrO0gKdi20jlQ0YjWaddal0X0+5LkMpOAyMB1GdaDetLaaVjcZ+92zx1cApcAdIsCKgB+kyutRQv0b82o/EZPQ== +"@abp/jquery@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-9.0.1.tgz#ecce14644c753c581caee0df7bfafd3d083e70f0" + integrity sha512-z8EcnOveItAszbTsM9GFFDQSlcIg/ym6+WZME9uldLoetdxkmI9ij0knVeGj5eqMjQaHvTWwrVLObiBbZwYFWw== dependencies: - "@abp/core" "~9.0.0-rc.2" + "@abp/core" "~9.0.1" jquery "~3.7.1" -"@abp/lodash@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-9.0.0-rc.2.tgz#980a0ae2d95c83663f0f52f1b67b5cfb00d04b96" - integrity sha512-uwxv7WJqwRcGkVoB44JR1QJaMbe3RhCQsG6+Wee1Jjdgi2vkpFUCj2arM4Rxz1igntFjY2Z7NiBq+iL9HYIkSw== +"@abp/lodash@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-9.0.1.tgz#c52c8a4125ecfbeaad7badc5c28bf86d5168799a" + integrity sha512-D+/iOyh/O+jV80bK5vWxyn++IVmeRbZq/UaXanA4RKpzigxJUsgOiSD9lUj85BkfKn2YyFmoR39xwaAqkWoyRA== dependencies: - "@abp/core" "~9.0.0-rc.2" + "@abp/core" "~9.0.1" lodash "^4.17.21" -"@abp/luxon@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-9.0.0-rc.2.tgz#1bb0eae53b707371489a4e0edf2869d7acc71da8" - integrity sha512-iWE8sbBWxCbNYSO3TTTzeotGS6kAnIwCKos/96mtaYJ4wzPW9pgF7K94CvwLAAg9NTsx/J/OGdmhhM2cULhv+w== +"@abp/luxon@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-9.0.1.tgz#ac59a56653d51b997dbbde8ccc58dac5746a9ef4" + integrity sha512-1ZHXP5SGz05tQ1tzYmPcRiZwmkCKGX0KWFoV0zF3ATRaevzku9nXvSy7K6GIFkkgTb9f9XNx4/OBBF/GXkuRqw== dependencies: - "@abp/core" "~9.0.0-rc.2" + "@abp/core" "~9.0.1" luxon "^3.5.0" -"@abp/malihu-custom-scrollbar-plugin@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-9.0.0-rc.2.tgz#fce5c12be2bdf350b18aae52619309a474995442" - integrity sha512-e3JTnDSkjF9/MPh/nPqcvU8hkUxSMc5U6DnP169GBdVAYQwwnGD24x4QCWU7ch7s65FDJ8/uq7bYOcIAD0B+Dw== +"@abp/malihu-custom-scrollbar-plugin@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-9.0.1.tgz#9e60bcfb9f9d76fed9c50e45bf490d5abd0f4689" + integrity sha512-GkKPLg9Z9UTTSSpW2hYZYZ9IgCvDSOYJmyRSl/h4fG8cWMgGCPVpv8MPPu0+WtIfwW/mT4SPX9X+sjUlRL5XRQ== dependencies: - "@abp/core" "~9.0.0-rc.2" + "@abp/core" "~9.0.1" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/moment@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-9.0.0-rc.2.tgz#2fc0feaaa0a26436cf00a6beccaa64f505aef301" - integrity sha512-yqkgu0bo3ra6HVFdS2wlqwTysciYOJWi/ERFVS2MfUkAKFA0P7mv8Jg5tB4vGY2Km++7r22kCDRlK3KUPmk21g== +"@abp/moment@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-9.0.1.tgz#d67fa25017fe15dae10e0a0fcebb03aeb63d31d3" + integrity sha512-bTuCc7pi/DCtgz7t96UBU0wn9UGt4b50JhDCVeTKquh+gP1sgWoI5hyvEBkmgE4dcffO0yzZU2opHYTKYGl/OQ== dependencies: moment "^2.30.1" -"@abp/prismjs@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-9.0.0-rc.2.tgz#2de7bc2882fee46d3d7e2da1fb66bca6b06cc4dd" - integrity sha512-rQ4dVGk+lEHFFSIBsJPqijeh4k3UgoDMZL1rns2a6NR+QnR0J2Slx3Awt8SH+inQFH2JiLHVo9q4bG+81vCsag== +"@abp/prismjs@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-9.0.1.tgz#2693014c8161d561e7c7bef01d5cd24ee53be1b3" + integrity sha512-NwW+vpTiAsuJYNC/MEiAj0dGMWml95mAQD1Z0Djfsg9D6OpcLsdlgWX+KVdZvHoJ+SPgTDIqdt/0LnIv1w/XdA== dependencies: - "@abp/clipboard" "~9.0.0-rc.2" - "@abp/core" "~9.0.0-rc.2" + "@abp/clipboard" "~9.0.1" + "@abp/core" "~9.0.1" prismjs "^1.29.0" -"@abp/select2@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-9.0.0-rc.2.tgz#53806118fdfe9f9228e26c6867ce0e75e6572b81" - integrity sha512-arKdcs95+4zp5764iOz09aJ3C1F2SsBIzekpjpJwMBdLRfoleZZFm12itO8I4Jjb1R+2CkW6MXjLR5xL2aE0PQ== +"@abp/select2@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-9.0.1.tgz#9f1c5c27e72bef910fdf63fc3167f415d2ba8db8" + integrity sha512-epyYJH2gAOU2UvGn5FD6372hbW3fL7uZIgGpvfgEfa+l6HPdlV9B1OweU2xkONNCoylShAcP/y8qf+bUh8WDEA== dependencies: - "@abp/core" "~9.0.0-rc.2" + "@abp/core" "~9.0.1" select2 "^4.0.13" -"@abp/sweetalert2@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-9.0.0-rc.2.tgz#60b25d65b3e5eb53e18ba5b1f3663783562d2506" - integrity sha512-VJslD1AMDZJhOEko79UYIxIYeAmr1YUwJu8XNAurBGPa9sWGI+jPY/dYg3uptg8GEJHsFtog84m3nUQ/prRUcw== +"@abp/sweetalert2@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-9.0.1.tgz#a364b21665cb76e92640496dc8a77b8edbce4500" + integrity sha512-0RXR/lzy3qMJLisGUz4qrcA9Clu/Tt1ABGzB64ynG1t/l5XessQsIB5Hkt6MbSyOEsprRsq+ZtKH35CwTRPdAw== dependencies: - "@abp/core" "~9.0.0-rc.2" + "@abp/core" "~9.0.1" sweetalert2 "^11.14.1" -"@abp/timeago@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-9.0.0-rc.2.tgz#72a7da1eda19beb34c352f3f43d2f5181b0b926a" - integrity sha512-zRj+TssaDXW2OM4mNn47G1tRg4BZ2sqbEiiUIQrU9hHMHmxOf8bAJhqsouGDDZF3xetcwKhmLN08VWK1sqqpQA== +"@abp/timeago@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-9.0.1.tgz#d1b7e11fdc267bdb736ff4b591afd3fb81c07cce" + integrity sha512-dNfUQwilrY+JHxL5lwJ++ixYDGAs5lF1EDxKMQMIXD/ak5L8rkdLns8Otta7FhgDDny9UJ7XWQjYsG8ZxxybRQ== dependencies: - "@abp/jquery" "~9.0.0-rc.2" + "@abp/jquery" "~9.0.1" timeago "^1.6.7" -"@abp/toastr@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-9.0.0-rc.2.tgz#ddbf0b6362941f62c07c9820af59dcd6912331d0" - integrity sha512-l4z6z3Oc/JF4XJplqGETQtBkqzjbpobcfzEHeH6LjUeunLMEVQOtjhPUBLrhg4ZM0i9k46hmxsoOkWXu7tClyQ== +"@abp/toastr@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-9.0.1.tgz#2105a639d7cd4fa9c671b4215d719a78fef7e0ee" + integrity sha512-10KuHnSJOxkvzqs6Aim6GJp8xBuT+TsZqBE1KaXQnERPawmOo4+ME28kA/7lq8fvgFUNO3K41T2uuA1GPHVQcg== dependencies: - "@abp/jquery" "~9.0.0-rc.2" + "@abp/jquery" "~9.0.1" toastr "^2.1.4" -"@abp/utils@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-9.0.0-rc.2.tgz#e644889f1c1c4828b509aea9ae3ae48439a5b89d" - integrity sha512-eIL3syPE0LzPyeHV5+pgRxw3/H2YTmK2U9VEOUu26ExiCMIt5Waf8T92BjaH9sLrMD5P9ZAT2jWaxh+VTsEtKA== +"@abp/utils@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-9.0.1.tgz#dccaf7cf92147304d454ffb9a8664d52dc7e5c5a" + integrity sha512-7eOKT0ciKNdtuASck1kifyc4dC6CeebgxV+rx/EAi3YwPMDkqie6YwLGUqKdGW2N/MZ15JuDR6gkuZxKHEb0NQ== dependencies: just-compare "^2.3.0" -"@abp/virtual-file-explorer@~9.0.0-rc.2": - version "9.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/virtual-file-explorer/-/virtual-file-explorer-9.0.0-rc.2.tgz#5755078114cd42657351a5d57618bc8210900dd9" - integrity sha512-pjhF8+K0FfN2fUKS889mOv/QuZi8KcDxBdOcLBOaq1op6Uqf9olftWNe/udmyANTJvsN4FH7QLv96o2H0+dYHg== +"@abp/virtual-file-explorer@~9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@abp/virtual-file-explorer/-/virtual-file-explorer-9.0.1.tgz#4f36dfecdf2c29a9a65f03296fc740ee42d1d3c0" + integrity sha512-U6u+hfgEAC3AFJ89qJrkZFn8YSHqi+Ba97xbADzcGeAwmmCLxx+ZD5H9WziSot4KmVOe1Mfe5p6q4graDvz5jQ== dependencies: - "@abp/clipboard" "~9.0.0-rc.2" - "@abp/prismjs" "~9.0.0-rc.2" + "@abp/clipboard" "~9.0.1" + "@abp/prismjs" "~9.0.1" "@fortawesome/fontawesome-free@^6.6.0": version "6.6.0" diff --git a/npm/lerna.json b/npm/lerna.json index dadf9b6854..0b1aafb01b 100644 --- a/npm/lerna.json +++ b/npm/lerna.json @@ -1,5 +1,5 @@ { - "version": "9.0.0-rc.2", + "version": "9.0.1", "packages": [ "packs/*" ], diff --git a/npm/ng-packs/package.json b/npm/ng-packs/package.json index b45b6e8b8f..8d0d1f2f60 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.0.0-rc.2", - "@abp/utils": "~9.0.0-rc.2", + "@abp/ng.theme.lepton-x": "~4.0.1", + "@abp/utils": "~9.0.1", "@angular-devkit/build-angular": "~18.1.0", "@angular-devkit/core": "~18.1.0", "@angular-devkit/schematics": "~18.1.0", diff --git a/npm/ng-packs/packages/account-core/package.json b/npm/ng-packs/packages/account-core/package.json index e4ca022b5a..4bb296e081 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.0.0-rc.2", + "version": "9.0.1", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.core": "~9.0.0-rc.2", - "@abp/ng.theme.shared": "~9.0.0-rc.2", + "@abp/ng.core": "~9.0.1", + "@abp/ng.theme.shared": "~9.0.1", "tslib": "^2.0.0" }, "publishConfig": { diff --git a/npm/ng-packs/packages/account/package.json b/npm/ng-packs/packages/account/package.json index 60f21f1ec5..9f1fa97a4d 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.0.0-rc.2", + "version": "9.0.1", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.account.core": "~9.0.0-rc.2", - "@abp/ng.theme.shared": "~9.0.0-rc.2", + "@abp/ng.account.core": "~9.0.1", + "@abp/ng.theme.shared": "~9.0.1", "tslib": "^2.0.0" }, "publishConfig": { diff --git a/npm/ng-packs/packages/components/package.json b/npm/ng-packs/packages/components/package.json index 970b860ad7..0fe4bdd04c 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.0.0-rc.2", + "version": "9.0.1", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "peerDependencies": { - "@abp/ng.core": ">=9.0.0-rc.2", - "@abp/ng.theme.shared": ">=9.0.0-rc.2" + "@abp/ng.core": ">=9.0.1", + "@abp/ng.theme.shared": ">=9.0.1" }, "dependencies": { "chart.js": "^3.5.1", diff --git a/npm/ng-packs/packages/components/page/src/page.component.ts b/npm/ng-packs/packages/components/page/src/page.component.ts index d0a48b145c..06a8e3af6d 100644 --- a/npm/ng-packs/packages/components/page/src/page.component.ts +++ b/npm/ng-packs/packages/components/page/src/page.component.ts @@ -45,7 +45,8 @@ export class PageComponent { this.breadcrumb || this.customTitle || this.customBreadcrumb || - this.customToolbar + this.customToolbar || + this.pageParts ); } } diff --git a/npm/ng-packs/packages/core/package.json b/npm/ng-packs/packages/core/package.json index 6e388ad2c6..509687116e 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.0.0-rc.2", + "version": "9.0.1", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/utils": "~9.0.0-rc.2", + "@abp/utils": "~9.0.1", "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 f12752fbb9..53bebefa35 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.0.0-rc.2", + "version": "9.0.1", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.theme.shared": "~9.0.0-rc.2", + "@abp/ng.theme.shared": "~9.0.1", "tslib": "^2.0.0" }, "publishConfig": { diff --git a/npm/ng-packs/packages/generators/package.json b/npm/ng-packs/packages/generators/package.json index 5234d0f297..cc35e266d1 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.0.0-rc.2", + "version": "9.0.1", "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 0d405a8140..63692f5787 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.0.0-rc.2", + "version": "9.0.1", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.components": "~9.0.0-rc.2", - "@abp/ng.permission-management": "~9.0.0-rc.2", - "@abp/ng.theme.shared": "~9.0.0-rc.2", + "@abp/ng.components": "~9.0.1", + "@abp/ng.permission-management": "~9.0.1", + "@abp/ng.theme.shared": "~9.0.1", "tslib": "^2.0.0" }, "publishConfig": { diff --git a/npm/ng-packs/packages/oauth/package.json b/npm/ng-packs/packages/oauth/package.json index b76342cf08..486612d35e 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.0.0-rc.2", + "version": "9.0.1", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.core": "~9.0.0-rc.2", - "@abp/utils": "~9.0.0-rc.2", + "@abp/ng.core": "~9.0.1", + "@abp/utils": "~9.0.1", "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 a639a8fbe8..50c4f3a48d 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.0.0-rc.2", + "version": "9.0.1", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.theme.shared": "~9.0.0-rc.2", + "@abp/ng.theme.shared": "~9.0.1", "tslib": "^2.0.0" }, "publishConfig": { diff --git a/npm/ng-packs/packages/schematics/package.json b/npm/ng-packs/packages/schematics/package.json index 6409b24963..b6f022890e 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.0.0-rc.2", + "version": "9.0.1", "author": "", "schematics": "./collection.json", "dependencies": { diff --git a/npm/ng-packs/packages/schematics/src/commands/change-theme/index.ts b/npm/ng-packs/packages/schematics/src/commands/change-theme/index.ts index f922288f31..de0c75c2ef 100644 --- a/npm/ng-packs/packages/schematics/src/commands/change-theme/index.ts +++ b/npm/ng-packs/packages/schematics/src/commands/change-theme/index.ts @@ -15,6 +15,7 @@ import { import { ThemeOptionsEnum } from './theme-options.enum'; import { addImportToModule, + addProviderToModule, findNodes, getDecoratorMetadata, getMetadataField, @@ -49,8 +50,7 @@ function updateProjectStyle( throw new SchematicsException('The target project does not selected'); } - const isProjectLibrary = isLibrary(project); - if (isProjectLibrary) { + if (isLibrary(project)) { throw new SchematicsException('The library project does not supported'); } @@ -73,7 +73,9 @@ function updateAppModule(selectedProject: string, targetThemeName: ThemeOptionsE return chain([ removeImportPath(appModulePath, targetThemeName), removeImportFromNgModuleMetadata(appModulePath, targetThemeName), + removeProviderFromNgModuleMetadata(appModulePath, targetThemeName), insertImports(appModulePath, targetThemeName), + insertProviders(appModulePath, targetThemeName), ]); }; } @@ -151,6 +153,45 @@ export function removeImportFromNgModuleMetadata( }; } +export function removeProviderFromNgModuleMetadata( + appModulePath: string, + selectedTheme: ThemeOptionsEnum, +): Rule { + return (host: Tree) => { + const recorder = host.beginUpdate(appModulePath); + const source = createSourceFile(host, appModulePath); + const impMap = getImportPaths(selectedTheme, true); + + const node = getDecoratorMetadata(source, 'NgModule', '@angular/core')[0] || {}; + if (!node) { + throw new SchematicsException('The app module does not found'); + } + + const matchingProperties = getMetadataField(node as ts.ObjectLiteralExpression, 'providers'); + const assignment = matchingProperties[0] as ts.PropertyAssignment; + const assignmentInit = assignment.initializer as ts.ArrayLiteralExpression; + + const elements = assignmentInit.elements; + if (!elements || elements.length < 1) { + throw new SchematicsException(`Elements could not found: ${elements}`); + } + + const filteredElements = elements.filter(f => + impMap.filter(f => !!f.provider).some(s => f.getText().match(s.provider!)), + ); + + if (!filteredElements || filteredElements.length < 1) { + return; + } + + filteredElements.map(willRemoveModule => { + recorder.remove(willRemoveModule.getStart(), willRemoveModule.getWidth()); + }); + host.commitUpdate(recorder); + return host; + }; +} + export function insertImports(appModulePath: string, selectedTheme: ThemeOptionsEnum): Rule { return (host: Tree) => { const recorder = host.beginUpdate(appModulePath); @@ -170,7 +211,7 @@ export function insertImports(appModulePath: string, selectedTheme: ThemeOptions if (changes.length > 0) { for (const change of changes) { if (change instanceof InsertChange) { - recorder.insertLeft(change.pos, change.toAdd); + recorder.insertLeft(change.order, change.toAdd); } } } @@ -179,6 +220,35 @@ export function insertImports(appModulePath: string, selectedTheme: ThemeOptions }; } +export function insertProviders(appModulePath: string, selectedTheme: ThemeOptionsEnum): Rule { + return (host: Tree) => { + const recorder = host.beginUpdate(appModulePath); + const source = createSourceFile(host, appModulePath); + const selected = importMap.get(selectedTheme); + + if (!selected) { + return host; + } + + const changes: Change[] = []; + + selected.map(({ path, provider }) => { + if (provider) { + changes.push(...addProviderToModule(source, appModulePath, provider + '()', path)); + } + }); + + for (const change of changes) { + if (change instanceof InsertChange) { + recorder.insertLeft(change.order, change.toAdd); + } + } + + host.commitUpdate(recorder); + return host; + }; +} + export function createSourceFile(host: Tree, appModulePath: string): ts.SourceFile { const buffer = host.read(appModulePath); if (!buffer || buffer.length === 0) { diff --git a/npm/ng-packs/packages/schematics/src/commands/change-theme/style-map.ts b/npm/ng-packs/packages/schematics/src/commands/change-theme/style-map.ts index 4bf4300a2b..7dc9bf8053 100644 --- a/npm/ng-packs/packages/schematics/src/commands/change-theme/style-map.ts +++ b/npm/ng-packs/packages/schematics/src/commands/change-theme/style-map.ts @@ -11,6 +11,7 @@ export type StyleDefinition = export type ImportDefinition = { path: string; importName: string; + provider?: string; }; export const styleMap = new Map(); @@ -267,14 +268,16 @@ export const importMap = new Map(); importMap.set(ThemeOptionsEnum.Basic, [ { path: '@abp/ng.theme.basic', - importName: 'ThemeBasicModule.forRoot()', + importName: 'ThemeBasicModule', + provider: 'provideThemeBasicConfig', }, ]); importMap.set(ThemeOptionsEnum.Lepton, [ { path: '@volo/abp.ng.theme.lepton', - importName: 'ThemeLeptonModule.forRoot()', + importName: 'ThemeLeptonModule', + provider: 'provideThemeLepton', }, ]); diff --git a/npm/ng-packs/packages/schematics/src/utils/angular/ast-utils.ts b/npm/ng-packs/packages/schematics/src/utils/angular/ast-utils.ts index 55477b41d3..d435b90c85 100644 --- a/npm/ng-packs/packages/schematics/src/utils/angular/ast-utils.ts +++ b/npm/ng-packs/packages/schematics/src/utils/angular/ast-utils.ts @@ -399,7 +399,12 @@ export function addSymbolToNgModuleMetadata( if (importPath !== null) { return [ new InsertChange(ngModulePath, position, toInsert), - insertImport(source, ngModulePath, symbolName.replace(/\..*$/, ''), importPath), + insertImport( + source, + ngModulePath, + symbolName.replace(/\..*$/, '').replace(/\(\)/, ''), + importPath, + ), ]; } else { return [new InsertChange(ngModulePath, position, toInsert)]; @@ -449,7 +454,12 @@ export function addSymbolToNgModuleMetadata( if (importPath !== null) { return [ new InsertChange(ngModulePath, position, toInsert), - insertImport(source, ngModulePath, symbolName.replace(/\..*$/, ''), importPath), + insertImport( + source, + ngModulePath, + symbolName.replace(/\..*$/, '').replace(/\(\)/, ''), + importPath, + ), ]; } diff --git a/npm/ng-packs/packages/setting-management/config/src/lib/components/email-setting-group/email-setting-group.component.html b/npm/ng-packs/packages/setting-management/config/src/lib/components/email-setting-group/email-setting-group.component.html index bc944af045..2264b9939a 100644 --- a/npm/ng-packs/packages/setting-management/config/src/lib/components/email-setting-group/email-setting-group.component.html +++ b/npm/ng-packs/packages/setting-management/config/src/lib/components/email-setting-group/email-setting-group.component.html @@ -51,7 +51,7 @@
@@ -93,7 +93,7 @@ -

{{ 'SendTestEmail' | abpLocalization }}

+

{{ 'AbpSettingManagement::SendTestEmail' | abpLocalization }}

diff --git a/npm/ng-packs/packages/setting-management/package.json b/npm/ng-packs/packages/setting-management/package.json index 0197a9d3c4..f39f8897bb 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.0.0-rc.2", + "version": "9.0.1", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.components": "~9.0.0-rc.2", - "@abp/ng.theme.shared": "~9.0.0-rc.2", + "@abp/ng.components": "~9.0.1", + "@abp/ng.theme.shared": "~9.0.1", "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 c8723f26f6..ffe4cc547f 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.0.0-rc.2", + "version": "9.0.1", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.feature-management": "~9.0.0-rc.2", - "@abp/ng.theme.shared": "~9.0.0-rc.2", + "@abp/ng.feature-management": "~9.0.1", + "@abp/ng.theme.shared": "~9.0.1", "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 068f5f5441..4971dc7746 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.0.0-rc.2", + "version": "9.0.1", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.account.core": "~9.0.0-rc.2", - "@abp/ng.theme.shared": "~9.0.0-rc.2", + "@abp/ng.account.core": "~9.0.1", + "@abp/ng.theme.shared": "~9.0.1", "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 eb769fa1cb..36f7c76e05 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.0.0-rc.2", + "version": "9.0.1", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.core": "~9.0.0-rc.2", + "@abp/ng.core": "~9.0.1", "@fortawesome/fontawesome-free": "^5.15.4", "@ng-bootstrap/ng-bootstrap": "~16.0.0", "@ngx-validate/core": "^0.2.0", diff --git a/npm/ng-packs/packages/theme-shared/src/lib/services/abstract-menu.service.ts b/npm/ng-packs/packages/theme-shared/src/lib/services/abstract-menu.service.ts index 4c3137b332..1af504f0ee 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/services/abstract-menu.service.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/services/abstract-menu.service.ts @@ -1,12 +1,12 @@ import { BehaviorSubject, Observable } from 'rxjs'; import { NavItem } from '../models/nav-item'; import { inject, Type } from '@angular/core'; -import { SORT_COMPARE_FUNC } from '@abp/ng.core'; +import { SORT_COMPARE_FUNC, SortableItem } from '@abp/ng.core'; export abstract class AbstractMenuService { protected abstract baseClass: Type; - protected readonly sortFn = inject(SORT_COMPARE_FUNC); + protected readonly sortFn: (a: SortableItem, b: SortableItem) => number; protected _items$ = new BehaviorSubject([]); @@ -18,6 +18,10 @@ export abstract class AbstractMenuService { return this._items$.asObservable(); } + constructor() { + this.sortFn = inject(SORT_COMPARE_FUNC); + } + addItems(newItems: T[]) { const items = [...this.items]; newItems.forEach(item => { diff --git a/npm/ng-packs/packages/theme-shared/src/lib/services/toaster.service.ts b/npm/ng-packs/packages/theme-shared/src/lib/services/toaster.service.ts index 9b45be4d1b..7b5496d879 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/services/toaster.service.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/services/toaster.service.ts @@ -4,7 +4,7 @@ import { PROJECTION_STRATEGY, Strict, } from '@abp/ng.core'; -import { ComponentRef, Injectable } from '@angular/core'; +import { ComponentRef, inject, Injectable } from '@angular/core'; import { ReplaySubject } from 'rxjs'; import { ToastContainerComponent } from '../components/toast-container/toast-container.component'; import { Toaster } from '../models'; @@ -20,8 +20,7 @@ export class ToasterService implements ToasterContract { private toasts = [] as Toaster.Toast[]; private containerComponentRef!: ComponentRef; - - constructor(private contentProjectionService: ContentProjectionService) {} + private contentProjectionService: ContentProjectionService; private setContainer() { this.containerComponentRef = this.contentProjectionService.projectContent( @@ -34,6 +33,10 @@ export class ToasterService implements ToasterContract { this.containerComponentRef.changeDetectorRef.detectChanges(); } + constructor() { + this.contentProjectionService = inject(ContentProjectionService); + } + /** * Creates an info toast with given parameters. * @param message Content of the toast diff --git a/npm/packs/anchor-js/package.json b/npm/packs/anchor-js/package.json index 8854ea360e..dbceb8240f 100644 --- a/npm/packs/anchor-js/package.json +++ b/npm/packs/anchor-js/package.json @@ -1,11 +1,11 @@ { - "version": "9.0.0-rc.2", + "version": "9.0.1", "name": "@abp/anchor-js", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~9.0.0-rc.2", + "@abp/core": "~9.0.1", "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 b0375e8f76..bffa58dd77 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.0.0-rc.2", + "version": "9.0.1", "name": "@abp/aspnetcore.components.server.basictheme", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/aspnetcore.components.server.theming": "~9.0.0-rc.2" + "@abp/aspnetcore.components.server.theming": "~9.0.1" }, "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 adbe7c506f..12f5bfe334 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.0.0-rc.2", + "version": "9.0.1", "name": "@abp/aspnetcore.components.server.theming", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/bootstrap": "~9.0.0-rc.2", - "@abp/font-awesome": "~9.0.0-rc.2" + "@abp/bootstrap": "~9.0.1", + "@abp/font-awesome": "~9.0.1" }, "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 65789cbbfe..c416a199aa 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.0.0-rc.2", + "version": "9.0.1", "name": "@abp/aspnetcore.mvc.ui.theme.basic", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.shared": "~9.0.0-rc.2" + "@abp/aspnetcore.mvc.ui.theme.shared": "~9.0.1" }, "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 3532373227..6f79469dea 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.0.0-rc.2", + "version": "9.0.1", "name": "@abp/aspnetcore.mvc.ui.theme.shared", "repository": { "type": "git", @@ -10,22 +10,22 @@ "access": "public" }, "dependencies": { - "@abp/aspnetcore.mvc.ui": "~9.0.0-rc.2", - "@abp/bootstrap": "~9.0.0-rc.2", - "@abp/bootstrap-datepicker": "~9.0.0-rc.2", - "@abp/bootstrap-daterangepicker": "~9.0.0-rc.2", - "@abp/datatables.net-bs5": "~9.0.0-rc.2", - "@abp/font-awesome": "~9.0.0-rc.2", - "@abp/jquery-form": "~9.0.0-rc.2", - "@abp/jquery-validation-unobtrusive": "~9.0.0-rc.2", - "@abp/lodash": "~9.0.0-rc.2", - "@abp/luxon": "~9.0.0-rc.2", - "@abp/malihu-custom-scrollbar-plugin": "~9.0.0-rc.2", - "@abp/moment": "~9.0.0-rc.2", - "@abp/select2": "~9.0.0-rc.2", - "@abp/sweetalert2": "~9.0.0-rc.2", - "@abp/timeago": "~9.0.0-rc.2", - "@abp/toastr": "~9.0.0-rc.2" + "@abp/aspnetcore.mvc.ui": "~9.0.1", + "@abp/bootstrap": "~9.0.1", + "@abp/bootstrap-datepicker": "~9.0.1", + "@abp/bootstrap-daterangepicker": "~9.0.1", + "@abp/datatables.net-bs5": "~9.0.1", + "@abp/font-awesome": "~9.0.1", + "@abp/jquery-form": "~9.0.1", + "@abp/jquery-validation-unobtrusive": "~9.0.1", + "@abp/lodash": "~9.0.1", + "@abp/luxon": "~9.0.1", + "@abp/malihu-custom-scrollbar-plugin": "~9.0.1", + "@abp/moment": "~9.0.1", + "@abp/select2": "~9.0.1", + "@abp/sweetalert2": "~9.0.1", + "@abp/timeago": "~9.0.1", + "@abp/toastr": "~9.0.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", "homepage": "https://abp.io", diff --git a/npm/packs/aspnetcore.mvc.ui/package-lock.json b/npm/packs/aspnetcore.mvc.ui/package-lock.json index eb24394cb1..d40fb0810f 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.0.0-rc.2", + "version": "9.0.1", "lockfileVersion": 1, "requires": true, "packages": { diff --git a/npm/packs/aspnetcore.mvc.ui/package.json b/npm/packs/aspnetcore.mvc.ui/package.json index 259417b93b..b561b8532b 100644 --- a/npm/packs/aspnetcore.mvc.ui/package.json +++ b/npm/packs/aspnetcore.mvc.ui/package.json @@ -1,5 +1,5 @@ { - "version": "9.0.0-rc.2", + "version": "9.0.1", "name": "@abp/aspnetcore.mvc.ui", "repository": { "type": "git", diff --git a/npm/packs/blogging/package.json b/npm/packs/blogging/package.json index f806191fa3..d664b6745b 100644 --- a/npm/packs/blogging/package.json +++ b/npm/packs/blogging/package.json @@ -1,14 +1,14 @@ { - "version": "9.0.0-rc.2", + "version": "9.0.1", "name": "@abp/blogging", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.shared": "~9.0.0-rc.2", - "@abp/owl.carousel": "~9.0.0-rc.2", - "@abp/prismjs": "~9.0.0-rc.2", - "@abp/tui-editor": "~9.0.0-rc.2" + "@abp/aspnetcore.mvc.ui.theme.shared": "~9.0.1", + "@abp/owl.carousel": "~9.0.1", + "@abp/prismjs": "~9.0.1", + "@abp/tui-editor": "~9.0.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", "homepage": "https://abp.io", diff --git a/npm/packs/bootstrap-datepicker/package.json b/npm/packs/bootstrap-datepicker/package.json index 1e5c0c9a31..7ef747f5af 100644 --- a/npm/packs/bootstrap-datepicker/package.json +++ b/npm/packs/bootstrap-datepicker/package.json @@ -1,5 +1,5 @@ { - "version": "9.0.0-rc.2", + "version": "9.0.1", "name": "@abp/bootstrap-datepicker", "repository": { "type": "git", diff --git a/npm/packs/bootstrap-daterangepicker/package.json b/npm/packs/bootstrap-daterangepicker/package.json index df9978e5b5..dc34cfb26b 100644 --- a/npm/packs/bootstrap-daterangepicker/package.json +++ b/npm/packs/bootstrap-daterangepicker/package.json @@ -1,5 +1,5 @@ { - "version": "9.0.0-rc.2", + "version": "9.0.1", "name": "@abp/bootstrap-daterangepicker", "repository": { "type": "git", diff --git a/npm/packs/bootstrap/package.json b/npm/packs/bootstrap/package.json index 13b0f6a3e4..18899e2fdb 100644 --- a/npm/packs/bootstrap/package.json +++ b/npm/packs/bootstrap/package.json @@ -1,5 +1,5 @@ { - "version": "9.0.0-rc.2", + "version": "9.0.1", "name": "@abp/bootstrap", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/core": "~9.0.0-rc.2", + "@abp/core": "~9.0.1", "bootstrap": "^5.3.3" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/chart.js/package.json b/npm/packs/chart.js/package.json index f0431e2b53..5ac2b49f2d 100644 --- a/npm/packs/chart.js/package.json +++ b/npm/packs/chart.js/package.json @@ -1,5 +1,5 @@ { - "version": "9.0.0-rc.2", + "version": "9.0.1", "name": "@abp/chart.js", "publishConfig": { "access": "public" diff --git a/npm/packs/clipboard/package.json b/npm/packs/clipboard/package.json index 64b033bfa4..6c3ae7d91a 100644 --- a/npm/packs/clipboard/package.json +++ b/npm/packs/clipboard/package.json @@ -1,11 +1,11 @@ { - "version": "9.0.0-rc.2", + "version": "9.0.1", "name": "@abp/clipboard", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~9.0.0-rc.2", + "@abp/core": "~9.0.1", "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 6ccd0c7f2d..0f947e3821 100644 --- a/npm/packs/cms-kit.admin/package.json +++ b/npm/packs/cms-kit.admin/package.json @@ -1,16 +1,16 @@ { - "version": "9.0.0-rc.2", + "version": "9.0.1", "name": "@abp/cms-kit.admin", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/codemirror": "~9.0.0-rc.2", - "@abp/jstree": "~9.0.0-rc.2", - "@abp/markdown-it": "~9.0.0-rc.2", - "@abp/slugify": "~9.0.0-rc.2", - "@abp/tui-editor": "~9.0.0-rc.2", - "@abp/uppy": "~9.0.0-rc.2" + "@abp/codemirror": "~9.0.1", + "@abp/jstree": "~9.0.1", + "@abp/markdown-it": "~9.0.1", + "@abp/slugify": "~9.0.1", + "@abp/tui-editor": "~9.0.1", + "@abp/uppy": "~9.0.1" }, "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 b142ee37b7..1498f2ba67 100644 --- a/npm/packs/cms-kit.public/package.json +++ b/npm/packs/cms-kit.public/package.json @@ -1,12 +1,12 @@ { - "version": "9.0.0-rc.2", + "version": "9.0.1", "name": "@abp/cms-kit.public", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/highlight.js": "~9.0.0-rc.2", - "@abp/star-rating-svg": "~9.0.0-rc.2" + "@abp/highlight.js": "~9.0.1", + "@abp/star-rating-svg": "~9.0.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", "homepage": "https://abp.io", diff --git a/npm/packs/cms-kit/package.json b/npm/packs/cms-kit/package.json index c5bedaac67..5fe2a850f2 100644 --- a/npm/packs/cms-kit/package.json +++ b/npm/packs/cms-kit/package.json @@ -1,12 +1,12 @@ { - "version": "9.0.0-rc.2", + "version": "9.0.1", "name": "@abp/cms-kit", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/cms-kit.admin": "~9.0.0-rc.2", - "@abp/cms-kit.public": "~9.0.0-rc.2" + "@abp/cms-kit.admin": "~9.0.1", + "@abp/cms-kit.public": "~9.0.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", "homepage": "https://abp.io", diff --git a/npm/packs/codemirror/package.json b/npm/packs/codemirror/package.json index d0f063327c..01bda62adb 100644 --- a/npm/packs/codemirror/package.json +++ b/npm/packs/codemirror/package.json @@ -1,11 +1,11 @@ { - "version": "9.0.0-rc.2", + "version": "9.0.1", "name": "@abp/codemirror", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~9.0.0-rc.2", + "@abp/core": "~9.0.1", "codemirror": "^5.65.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/core/package.json b/npm/packs/core/package.json index 7a154a6702..7e29ac3083 100644 --- a/npm/packs/core/package.json +++ b/npm/packs/core/package.json @@ -1,5 +1,5 @@ { - "version": "9.0.0-rc.2", + "version": "9.0.1", "name": "@abp/core", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/utils": "~9.0.0-rc.2" + "@abp/utils": "~9.0.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", "homepage": "https://abp.io", diff --git a/npm/packs/cropperjs/package.json b/npm/packs/cropperjs/package.json index 7c29883c5b..130518e020 100644 --- a/npm/packs/cropperjs/package.json +++ b/npm/packs/cropperjs/package.json @@ -1,11 +1,11 @@ { - "version": "9.0.0-rc.2", + "version": "9.0.1", "name": "@abp/cropperjs", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~9.0.0-rc.2", + "@abp/core": "~9.0.1", "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 1a0ea05e87..8ca8cdd9b9 100644 --- a/npm/packs/datatables.net-bs4/package.json +++ b/npm/packs/datatables.net-bs4/package.json @@ -1,5 +1,5 @@ { - "version": "9.0.0-rc.2", + "version": "9.0.1", "name": "@abp/datatables.net-bs4", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/datatables.net": "~9.0.0-rc.2", + "@abp/datatables.net": "~9.0.1", "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 3b7315f963..5178d3020b 100644 --- a/npm/packs/datatables.net-bs5/package.json +++ b/npm/packs/datatables.net-bs5/package.json @@ -1,11 +1,11 @@ { - "version": "9.0.0-rc.2", + "version": "9.0.1", "name": "@abp/datatables.net-bs5", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/datatables.net": "~9.0.0-rc.2", + "@abp/datatables.net": "~9.0.1", "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 a24da96f35..74e12baa26 100644 --- a/npm/packs/datatables.net/package.json +++ b/npm/packs/datatables.net/package.json @@ -1,5 +1,5 @@ { - "version": "9.0.0-rc.2", + "version": "9.0.1", "name": "@abp/datatables.net", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/jquery": "~9.0.0-rc.2", + "@abp/jquery": "~9.0.1", "datatables.net": "^2.1.8" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/docs/package.json b/npm/packs/docs/package.json index e8ba7ba405..747f51f254 100644 --- a/npm/packs/docs/package.json +++ b/npm/packs/docs/package.json @@ -1,15 +1,15 @@ { - "version": "9.0.0-rc.2", + "version": "9.0.1", "name": "@abp/docs", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/anchor-js": "~9.0.0-rc.2", - "@abp/clipboard": "~9.0.0-rc.2", - "@abp/malihu-custom-scrollbar-plugin": "~9.0.0-rc.2", - "@abp/popper.js": "~9.0.0-rc.2", - "@abp/prismjs": "~9.0.0-rc.2" + "@abp/anchor-js": "~9.0.1", + "@abp/clipboard": "~9.0.1", + "@abp/malihu-custom-scrollbar-plugin": "~9.0.1", + "@abp/popper.js": "~9.0.1", + "@abp/prismjs": "~9.0.1" }, "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 a40885d286..1be037076e 100644 --- a/npm/packs/flag-icon-css/package.json +++ b/npm/packs/flag-icon-css/package.json @@ -1,5 +1,5 @@ { - "version": "9.0.0-rc.2", + "version": "9.0.1", "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 d4b5911be3..fb124c2d3c 100644 --- a/npm/packs/flag-icons/package.json +++ b/npm/packs/flag-icons/package.json @@ -1,5 +1,5 @@ { - "version": "9.0.0-rc.2", + "version": "9.0.1", "name": "@abp/flag-icons", "publishConfig": { "access": "public" diff --git a/npm/packs/font-awesome/package.json b/npm/packs/font-awesome/package.json index b9243fdca5..4fc1fcf8f0 100644 --- a/npm/packs/font-awesome/package.json +++ b/npm/packs/font-awesome/package.json @@ -1,5 +1,5 @@ { - "version": "9.0.0-rc.2", + "version": "9.0.1", "name": "@abp/font-awesome", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/core": "~9.0.0-rc.2", + "@abp/core": "~9.0.1", "@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 fb165ee603..8d251ef230 100644 --- a/npm/packs/highlight.js/package.json +++ b/npm/packs/highlight.js/package.json @@ -1,11 +1,11 @@ { - "version": "9.0.0-rc.2", + "version": "9.0.1", "name": "@abp/highlight.js", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~9.0.0-rc.2", + "@abp/core": "~9.0.1", "@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 839d288ac0..f157ddb535 100644 --- a/npm/packs/jquery-form/package.json +++ b/npm/packs/jquery-form/package.json @@ -1,5 +1,5 @@ { - "version": "9.0.0-rc.2", + "version": "9.0.1", "name": "@abp/jquery-form", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/jquery": "~9.0.0-rc.2", + "@abp/jquery": "~9.0.1", "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 63114f6afd..156f79772a 100644 --- a/npm/packs/jquery-validation-unobtrusive/package.json +++ b/npm/packs/jquery-validation-unobtrusive/package.json @@ -1,5 +1,5 @@ { - "version": "9.0.0-rc.2", + "version": "9.0.1", "name": "@abp/jquery-validation-unobtrusive", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/jquery-validation": "~9.0.0-rc.2", + "@abp/jquery-validation": "~9.0.1", "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 dea56e2b33..b2ec5e5769 100644 --- a/npm/packs/jquery-validation/package.json +++ b/npm/packs/jquery-validation/package.json @@ -1,5 +1,5 @@ { - "version": "9.0.0-rc.2", + "version": "9.0.1", "name": "@abp/jquery-validation", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/jquery": "~9.0.0-rc.2", + "@abp/jquery": "~9.0.1", "jquery-validation": "^1.21.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/jquery/package.json b/npm/packs/jquery/package.json index eff344b532..cddc5c4d46 100644 --- a/npm/packs/jquery/package.json +++ b/npm/packs/jquery/package.json @@ -1,5 +1,5 @@ { - "version": "9.0.0-rc.2", + "version": "9.0.1", "name": "@abp/jquery", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/core": "~9.0.0-rc.2", + "@abp/core": "~9.0.1", "jquery": "~3.7.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/jstree/package.json b/npm/packs/jstree/package.json index 3f42b5e7e1..1b4a73ed8d 100644 --- a/npm/packs/jstree/package.json +++ b/npm/packs/jstree/package.json @@ -1,11 +1,11 @@ { - "version": "9.0.0-rc.2", + "version": "9.0.1", "name": "@abp/jstree", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/jquery": "~9.0.0-rc.2", + "@abp/jquery": "~9.0.1", "jstree": "^3.3.17" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/lodash/package.json b/npm/packs/lodash/package.json index 8d7aa6b5a6..21d41ca77b 100644 --- a/npm/packs/lodash/package.json +++ b/npm/packs/lodash/package.json @@ -1,5 +1,5 @@ { - "version": "9.0.0-rc.2", + "version": "9.0.1", "name": "@abp/lodash", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/core": "~9.0.0-rc.2", + "@abp/core": "~9.0.1", "lodash": "^4.17.21" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/luxon/package.json b/npm/packs/luxon/package.json index 048b98827c..a232d5e7c4 100644 --- a/npm/packs/luxon/package.json +++ b/npm/packs/luxon/package.json @@ -1,5 +1,5 @@ { - "version": "9.0.0-rc.2", + "version": "9.0.1", "name": "@abp/luxon", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/core": "~9.0.0-rc.2", + "@abp/core": "~9.0.1", "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 40c352d23a..e62a79b0b0 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.0.0-rc.2", + "version": "9.0.1", "name": "@abp/malihu-custom-scrollbar-plugin", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/core": "~9.0.0-rc.2", + "@abp/core": "~9.0.1", "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 46fa82ac30..2cd9ab6549 100644 --- a/npm/packs/markdown-it/package.json +++ b/npm/packs/markdown-it/package.json @@ -1,11 +1,11 @@ { - "version": "9.0.0-rc.2", + "version": "9.0.1", "name": "@abp/markdown-it", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~9.0.0-rc.2", + "@abp/core": "~9.0.1", "markdown-it": "^14.1.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/moment/package.json b/npm/packs/moment/package.json index 7464b009e7..35633c28fd 100644 --- a/npm/packs/moment/package.json +++ b/npm/packs/moment/package.json @@ -1,5 +1,5 @@ { - "version": "9.0.0-rc.2", + "version": "9.0.1", "name": "@abp/moment", "repository": { "type": "git", diff --git a/npm/packs/owl.carousel/package.json b/npm/packs/owl.carousel/package.json index 9e308a3098..2e58cb7926 100644 --- a/npm/packs/owl.carousel/package.json +++ b/npm/packs/owl.carousel/package.json @@ -1,11 +1,11 @@ { - "version": "9.0.0-rc.2", + "version": "9.0.1", "name": "@abp/owl.carousel", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~9.0.0-rc.2", + "@abp/core": "~9.0.1", "owl.carousel": "^2.3.4" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/popper.js/package.json b/npm/packs/popper.js/package.json index 000faa032d..0b7b56ead0 100644 --- a/npm/packs/popper.js/package.json +++ b/npm/packs/popper.js/package.json @@ -1,11 +1,11 @@ { - "version": "9.0.0-rc.2", + "version": "9.0.1", "name": "@abp/popper.js", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~9.0.0-rc.2", + "@abp/core": "~9.0.1", "@popperjs/core": "^2.11.8" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/prismjs/package.json b/npm/packs/prismjs/package.json index 04d89324a9..c698de42cb 100644 --- a/npm/packs/prismjs/package.json +++ b/npm/packs/prismjs/package.json @@ -1,12 +1,12 @@ { - "version": "9.0.0-rc.2", + "version": "9.0.1", "name": "@abp/prismjs", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/clipboard": "~9.0.0-rc.2", - "@abp/core": "~9.0.0-rc.2", + "@abp/clipboard": "~9.0.1", + "@abp/core": "~9.0.1", "prismjs": "^1.29.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/qrcode/package.json b/npm/packs/qrcode/package.json index 1670789230..d3739703cc 100644 --- a/npm/packs/qrcode/package.json +++ b/npm/packs/qrcode/package.json @@ -1,5 +1,5 @@ { - "version": "9.0.0-rc.2", + "version": "9.0.1", "name": "@abp/qrcode", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/core": "~9.0.0-rc.2" + "@abp/core": "~9.0.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", "homepage": "https://abp.io", diff --git a/npm/packs/select2/package.json b/npm/packs/select2/package.json index 049b2b2950..4fd759a565 100644 --- a/npm/packs/select2/package.json +++ b/npm/packs/select2/package.json @@ -1,5 +1,5 @@ { - "version": "9.0.0-rc.2", + "version": "9.0.1", "name": "@abp/select2", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/core": "~9.0.0-rc.2", + "@abp/core": "~9.0.1", "select2": "^4.0.13" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/signalr/package.json b/npm/packs/signalr/package.json index 8f26f85754..302be7b090 100644 --- a/npm/packs/signalr/package.json +++ b/npm/packs/signalr/package.json @@ -1,11 +1,11 @@ { - "version": "9.0.0-rc.2", + "version": "9.0.1", "name": "@abp/signalr", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~9.0.0-rc.2", + "@abp/core": "~9.0.1", "@microsoft/signalr": "~8.0.7" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/slugify/package.json b/npm/packs/slugify/package.json index e25cc4cdf7..aa4bc5c17e 100644 --- a/npm/packs/slugify/package.json +++ b/npm/packs/slugify/package.json @@ -1,5 +1,5 @@ { - "version": "9.0.0-rc.2", + "version": "9.0.1", "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 981cc5d0b7..c59c4f64b6 100644 --- a/npm/packs/star-rating-svg/package.json +++ b/npm/packs/star-rating-svg/package.json @@ -1,11 +1,11 @@ { - "version": "9.0.0-rc.2", + "version": "9.0.1", "name": "@abp/star-rating-svg", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/jquery": "~9.0.0-rc.2", + "@abp/jquery": "~9.0.1", "star-rating-svg": "^3.5.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/sweetalert2/package.json b/npm/packs/sweetalert2/package.json index b43749d177..0f43bcecf2 100644 --- a/npm/packs/sweetalert2/package.json +++ b/npm/packs/sweetalert2/package.json @@ -1,5 +1,5 @@ { - "version": "9.0.0-rc.2", + "version": "9.0.1", "name": "@abp/sweetalert2", "publishConfig": { "access": "public" @@ -10,7 +10,7 @@ "directory": "npm/packs/sweetalert2" }, "dependencies": { - "@abp/core": "~9.0.0-rc.2", + "@abp/core": "~9.0.1", "sweetalert2": "^11.14.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/timeago/package.json b/npm/packs/timeago/package.json index e43d03b5ff..523ba136fc 100644 --- a/npm/packs/timeago/package.json +++ b/npm/packs/timeago/package.json @@ -1,5 +1,5 @@ { - "version": "9.0.0-rc.2", + "version": "9.0.1", "name": "@abp/timeago", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/jquery": "~9.0.0-rc.2", + "@abp/jquery": "~9.0.1", "timeago": "^1.6.7" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/toastr/package.json b/npm/packs/toastr/package.json index 8724af32e7..c6f4969115 100644 --- a/npm/packs/toastr/package.json +++ b/npm/packs/toastr/package.json @@ -1,5 +1,5 @@ { - "version": "9.0.0-rc.2", + "version": "9.0.1", "name": "@abp/toastr", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/jquery": "~9.0.0-rc.2", + "@abp/jquery": "~9.0.1", "toastr": "^2.1.4" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/tui-editor/package.json b/npm/packs/tui-editor/package.json index 8d6dd2ee36..e0eac224ea 100644 --- a/npm/packs/tui-editor/package.json +++ b/npm/packs/tui-editor/package.json @@ -1,12 +1,12 @@ { - "version": "9.0.0-rc.2", + "version": "9.0.1", "name": "@abp/tui-editor", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/jquery": "~9.0.0-rc.2", - "@abp/prismjs": "~9.0.0-rc.2" + "@abp/jquery": "~9.0.1", + "@abp/prismjs": "~9.0.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", "homepage": "https://abp.io", diff --git a/npm/packs/uppy/package.json b/npm/packs/uppy/package.json index 8e15e7991d..b45d85d938 100644 --- a/npm/packs/uppy/package.json +++ b/npm/packs/uppy/package.json @@ -1,11 +1,11 @@ { - "version": "9.0.0-rc.2", + "version": "9.0.1", "name": "@abp/uppy", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~9.0.0-rc.2", + "@abp/core": "~9.0.1", "uppy": "^4.4.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/utils/package.json b/npm/packs/utils/package.json index 29af959c9f..a7ab4434eb 100644 --- a/npm/packs/utils/package.json +++ b/npm/packs/utils/package.json @@ -1,6 +1,6 @@ { "name": "@abp/utils", - "version": "9.0.0-rc.2", + "version": "9.0.1", "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 d98120a802..9be38caaee 100644 --- a/npm/packs/vee-validate/package.json +++ b/npm/packs/vee-validate/package.json @@ -1,11 +1,11 @@ { - "version": "9.0.0-rc.2", + "version": "9.0.1", "name": "@abp/vee-validate", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/vue": "~9.0.0-rc.2", + "@abp/vue": "~9.0.1", "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 945ac057a9..627f86649e 100644 --- a/npm/packs/virtual-file-explorer/package.json +++ b/npm/packs/virtual-file-explorer/package.json @@ -1,12 +1,12 @@ { - "version": "9.0.0-rc.2", + "version": "9.0.1", "name": "@abp/virtual-file-explorer", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/clipboard": "~9.0.0-rc.2", - "@abp/prismjs": "~9.0.0-rc.2" + "@abp/clipboard": "~9.0.1", + "@abp/prismjs": "~9.0.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", "homepage": "https://abp.io", diff --git a/npm/packs/vue/package.json b/npm/packs/vue/package.json index 5d1f5917c6..5aac377af9 100644 --- a/npm/packs/vue/package.json +++ b/npm/packs/vue/package.json @@ -1,5 +1,5 @@ { - "version": "9.0.0-rc.2", + "version": "9.0.1", "name": "@abp/vue", "publishConfig": { "access": "public" diff --git a/npm/packs/zxcvbn/package.json b/npm/packs/zxcvbn/package.json index eecf7edab9..1da8239f3e 100644 --- a/npm/packs/zxcvbn/package.json +++ b/npm/packs/zxcvbn/package.json @@ -1,11 +1,11 @@ { - "version": "9.0.0-rc.2", + "version": "9.0.1", "name": "@abp/zxcvbn", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~9.0.0-rc.2", + "@abp/core": "~9.0.1", "zxcvbn": "^4.4.2" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", 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 57b19fcfc9..1f9b8c3876 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 1d500e3fa7..493cba46cd 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 7e990a4dcf..d866526ef4 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 2827971dcc..222bff7333 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 d94dd52540..37360537f2 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 ac941e2087..9c8253049e 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 aadc5c9499..bb40682b1e 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 a2fd410809..7840956ce9 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 b31d09da42..cd454ae48e 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 0a06c3d86b..d06ed9b141 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 e628835605..eea1ac629e 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 424721109a..144e0f2802 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 b07bd02481..dc7203f351 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 7916abbe2a..b5f0aa70ad 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 b6f89555c1..02d470b0c7 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 28d911d11e..938372b478 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 2fbb5dc086..7706fe625b 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 7904bfcb6a..2eb7b1162d 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 12d0bba6e8..442324e2cc 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.0.0-rc.2", - "@abp/ng.components": "~9.0.0-rc.2", - "@abp/ng.core": "~9.0.0-rc.2", - "@abp/ng.identity": "~9.0.0-rc.2", - "@abp/ng.oauth": "~9.0.0-rc.2", - "@abp/ng.setting-management": "~9.0.0-rc.2", - "@abp/ng.tenant-management": "~9.0.0-rc.2", - "@abp/ng.theme.lepton-x": "~4.0.0-rc.2", - "@abp/ng.theme.shared": "~9.0.0-rc.2", + "@abp/ng.account": "~9.0.1", + "@abp/ng.components": "~9.0.1", + "@abp/ng.core": "~9.0.1", + "@abp/ng.identity": "~9.0.1", + "@abp/ng.oauth": "~9.0.1", + "@abp/ng.setting-management": "~9.0.1", + "@abp/ng.tenant-management": "~9.0.1", + "@abp/ng.theme.lepton-x": "~4.0.1", + "@abp/ng.theme.shared": "~9.0.1", "@angular/animations": "~18.1.0", "@angular/common": "~18.1.0", "@angular/compiler": "~18.1.0", @@ -36,7 +36,7 @@ "zone.js": "~0.14.0" }, "devDependencies": { - "@abp/ng.schematics": "~9.0.0-rc.2", + "@abp/ng.schematics": "~9.0.1", "@angular-devkit/build-angular": "~18.1.0", "@angular-eslint/builder": "~18.1.0", "@angular-eslint/eslint-plugin": "~18.1.0", 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 806f6d8398..4a5ae3036d 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.0.0-rc.2", - "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~4.0.0-rc.2" + "@abp/aspnetcore.components.server.leptonxlitetheme": "~4.0.1", + "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~4.0.1" } } 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 8574d5e4f6..f47644eec7 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.0.0-rc.2", - "@abp/aspnetcore.components.server.leptonxlitetheme": "~4.0.0-rc.2" + "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~4.0.1", + "@abp/aspnetcore.components.server.leptonxlitetheme": "~4.0.1" } } 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 b198098307..ff32d60b40 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.0.0-rc.2" + "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~4.0.1" } } 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 b198098307..ff32d60b40 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.0.0-rc.2" + "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~4.0.1" } } 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 b198098307..ff32d60b40 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.0.0-rc.2" + "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~4.0.1" } } 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 b198098307..ff32d60b40 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.0.0-rc.2" + "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~4.0.1" } } 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 b198098307..ff32d60b40 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.0.0-rc.2" + "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~4.0.1" } } 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 b198098307..ff32d60b40 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.0.0-rc.2" + "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~4.0.1" } } diff --git a/templates/app-nolayers/aspnet-core/README.md b/templates/app-nolayers/aspnet-core/README.md index f5d8e22afa..5aa2ba5045 100644 --- a/templates/app-nolayers/aspnet-core/README.md +++ b/templates/app-nolayers/aspnet-core/README.md @@ -6,8 +6,8 @@ This is a minimalist, non-layered startup solution with the ABP Framework. All t ### Pre-requirements -* [.NET 8.0+ SDK](https://dotnet.microsoft.com/download/dotnet) -* [Node v18 or 20](https://nodejs.org/en) +* [.NET 9.0+ SDK](https://dotnet.microsoft.com/download/dotnet) +* [Node v20.11+](https://nodejs.org/en) ### Configurations diff --git a/templates/app/angular/package.json b/templates/app/angular/package.json index 12d0bba6e8..442324e2cc 100644 --- a/templates/app/angular/package.json +++ b/templates/app/angular/package.json @@ -12,15 +12,15 @@ }, "private": true, "dependencies": { - "@abp/ng.account": "~9.0.0-rc.2", - "@abp/ng.components": "~9.0.0-rc.2", - "@abp/ng.core": "~9.0.0-rc.2", - "@abp/ng.identity": "~9.0.0-rc.2", - "@abp/ng.oauth": "~9.0.0-rc.2", - "@abp/ng.setting-management": "~9.0.0-rc.2", - "@abp/ng.tenant-management": "~9.0.0-rc.2", - "@abp/ng.theme.lepton-x": "~4.0.0-rc.2", - "@abp/ng.theme.shared": "~9.0.0-rc.2", + "@abp/ng.account": "~9.0.1", + "@abp/ng.components": "~9.0.1", + "@abp/ng.core": "~9.0.1", + "@abp/ng.identity": "~9.0.1", + "@abp/ng.oauth": "~9.0.1", + "@abp/ng.setting-management": "~9.0.1", + "@abp/ng.tenant-management": "~9.0.1", + "@abp/ng.theme.lepton-x": "~4.0.1", + "@abp/ng.theme.shared": "~9.0.1", "@angular/animations": "~18.1.0", "@angular/common": "~18.1.0", "@angular/compiler": "~18.1.0", @@ -36,7 +36,7 @@ "zone.js": "~0.14.0" }, "devDependencies": { - "@abp/ng.schematics": "~9.0.0-rc.2", + "@abp/ng.schematics": "~9.0.1", "@angular-devkit/build-angular": "~18.1.0", "@angular-eslint/builder": "~18.1.0", "@angular-eslint/eslint-plugin": "~18.1.0", diff --git a/templates/app/aspnet-core/README.md b/templates/app/aspnet-core/README.md index e9dc40663d..a35f23ea02 100644 --- a/templates/app/aspnet-core/README.md +++ b/templates/app/aspnet-core/README.md @@ -6,8 +6,8 @@ This is a layered startup solution based on [Domain Driven Design (DDD)](https:/ ### Pre-requirements -* [.NET 8.0+ SDK](https://dotnet.microsoft.com/download/dotnet) -* [Node v18 or 20](https://nodejs.org/en) +* [.NET 9.0+ SDK](https://dotnet.microsoft.com/download/dotnet) +* [Node v20.11+](https://nodejs.org/en) * [Redis](https://redis.io/) 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 4a1a4c7eed..d751059793 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.0.0-rc.2" + "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~4.0.1" } } 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 8574d5e4f6..f47644eec7 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.0.0-rc.2", - "@abp/aspnetcore.components.server.leptonxlitetheme": "~4.0.0-rc.2" + "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~4.0.1", + "@abp/aspnetcore.components.server.leptonxlitetheme": "~4.0.1" } } 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 8574d5e4f6..f47644eec7 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.0.0-rc.2", - "@abp/aspnetcore.components.server.leptonxlitetheme": "~4.0.0-rc.2" + "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~4.0.1", + "@abp/aspnetcore.components.server.leptonxlitetheme": "~4.0.1" } } 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 8574d5e4f6..f47644eec7 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.0.0-rc.2", - "@abp/aspnetcore.components.server.leptonxlitetheme": "~4.0.0-rc.2" + "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~4.0.1", + "@abp/aspnetcore.components.server.leptonxlitetheme": "~4.0.1" } } 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 8574d5e4f6..f47644eec7 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.0.0-rc.2", - "@abp/aspnetcore.components.server.leptonxlitetheme": "~4.0.0-rc.2" + "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~4.0.1", + "@abp/aspnetcore.components.server.leptonxlitetheme": "~4.0.1" } } 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 b198098307..ff32d60b40 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.0.0-rc.2" + "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~4.0.1" } } 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 b198098307..ff32d60b40 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.0.0-rc.2" + "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~4.0.1" } } 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 b198098307..ff32d60b40 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.0.0-rc.2" + "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~4.0.1" } } diff --git a/templates/module/angular/package.json b/templates/module/angular/package.json index 1283f18908..7bfc179602 100644 --- a/templates/module/angular/package.json +++ b/templates/module/angular/package.json @@ -13,15 +13,15 @@ }, "private": true, "dependencies": { - "@abp/ng.account": "~9.0.0-rc.2", - "@abp/ng.components": "~9.0.0-rc.2", - "@abp/ng.core": "~9.0.0-rc.2", - "@abp/ng.identity": "~9.0.0-rc.2", - "@abp/ng.oauth": "~9.0.0-rc.2", - "@abp/ng.setting-management": "~9.0.0-rc.2", - "@abp/ng.tenant-management": "~9.0.0-rc.2", - "@abp/ng.theme.basic": "~9.0.0-rc.2", - "@abp/ng.theme.shared": "~9.0.0-rc.2", + "@abp/ng.account": "~9.0.1", + "@abp/ng.components": "~9.0.1", + "@abp/ng.core": "~9.0.1", + "@abp/ng.identity": "~9.0.1", + "@abp/ng.oauth": "~9.0.1", + "@abp/ng.setting-management": "~9.0.1", + "@abp/ng.tenant-management": "~9.0.1", + "@abp/ng.theme.basic": "~9.0.1", + "@abp/ng.theme.shared": "~9.0.1", "@angular/animations": "~18.1.0", "@angular/common": "~18.1.0", "@angular/compiler": "~18.1.0", @@ -36,7 +36,7 @@ "zone.js": "~0.14.0" }, "devDependencies": { - "@abp/ng.schematics": "~9.0.0-rc.2", + "@abp/ng.schematics": "~9.0.1", "@angular-devkit/build-angular": "~18.1.0", "@angular-eslint/builder": "~18.1.0", "@angular-eslint/eslint-plugin": "~18.1.0", diff --git a/templates/module/angular/projects/my-project-name/package.json b/templates/module/angular/projects/my-project-name/package.json index 56d1c5fc59..d8bace158d 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": "~18.1.0", "@angular/core": "~18.1.0", - "@abp/ng.core": "~9.0.0-rc.2", - "@abp/ng.theme.shared": "~9.0.0-rc.2" + "@abp/ng.core": "~9.0.1", + "@abp/ng.theme.shared": "~9.0.1" }, "dependencies": { "tslib": "^2.1.0" 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 0b77b9e3c1..5e03e84b3e 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.0.0-rc.2" + "@abp/aspnetcore.mvc.ui.theme.basic": "~9.0.1" } } 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 0dbe4ef7f2..822c5ffdf6 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.0.0-rc.2", - "@abp/aspnetcore.components.server.basictheme": "~9.0.0-rc.2" + "@abp/aspnetcore.mvc.ui.theme.basic": "~9.0.1", + "@abp/aspnetcore.components.server.basictheme": "~9.0.1" } } 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 49894b8882..716eaed26c 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.0.0-rc.2" + "@abp/aspnetcore.mvc.ui.theme.basic": "~9.0.1" } } 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 49894b8882..716eaed26c 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.0.0-rc.2" + "@abp/aspnetcore.mvc.ui.theme.basic": "~9.0.1" } }