diff --git a/Directory.Packages.props b/Directory.Packages.props index e22ec5b093..8a2b1c786c 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -138,8 +138,8 @@ - - + + diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json index 22a73d35f7..f3c4c35a4d 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json @@ -559,6 +559,7 @@ "SessionDate": "Session Date", "AddSession": "Add Session", "AddSponsor": "Add Sponsor", - "SponsorLogo": "Sponsor Logo" + "SponsorLogo": "Sponsor Logo", + "RegistrationUrl": "Registration Url" } } diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json index 92c34ab456..faf7c0b36d 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json @@ -221,6 +221,14 @@ "More": "More", "WhyABPIOPlatform": "Why ABP.IO Platform?", "AbpStudio": "ABP Studio", - "ExtraMonths": "{0}EXTRA MONTHS" + "ExtraMonths": "{0}EXTRA MONTHS", + "RSS": "RSS", + "RSSFeed": "RSS Feed", + "Articles": "Articles", + "Organizations": "Organizations", + "ManageAccount": "Manage Account", + "CommunityProfile": "Community Profile", + "BlogProfile": "Blog Profile", + "Tickets": "Tickets" } } diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json index df6333ea0c..92d7450319 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json @@ -421,7 +421,7 @@ "UIFrameworks": "UI Frameworks", "UsefulLinks": "Useful Links", "Platform": "Platform", - "CoolestCompaniesUseABPCommercial": "The coolest companies already use ABP Commercial.", + "CoolestCompaniesUseABPCommercial": "The coolest companies already use ABP Commercial.", "UserInterface": "User Interface", "APIGateway": "API Gateway", "Microservice": "Microservice", @@ -601,7 +601,7 @@ "PaymentSucceed_ViewOrganization": "Click here to view organization", "Purchase_TotalAnnualPrice": "TOTAL (annual fee)", "Purchase_TrainingPrice": "Training Price", - "Purchase_OnboardingTraining": "ABP Onboarding & Web Application Development Live Training", + "Purchase_OnboardingTraining": "Onboarding & Web Application Development Live Training", "TotalDeveloperPrice": "Total Developer Price", "Purchase_PricePerDeveloper": "{0} {1} per developer", "Purchase_IncludedDeveloperInfo": "{0} {1} included.", @@ -978,10 +978,10 @@ "Purchase_DevelopersAlreadyIncluded": "{0} developers already included", "1Year": "1 year", "{0}Years": "{0} years", - "1YearLicense": "1 year license", - "{0}YearsLicense": "{0} years license", - "1AdditionalDeveloper": "1 additional developer", - "{0}AdditionalDevelopers": "{0} additional developers", + "1YearLicense": "1 Year License", + "{0}YearsLicense": "{0} Years License", + "1AdditionalDeveloper": "1 Additional Developer", + "{0}AdditionalDevelopers": "{0} Additional Developers", "Discount": "Discount ({0}%)", "Summary": "Summary", "TrainingPack": "Training pack", @@ -1080,6 +1080,11 @@ "AbpStudio_Page_Title": "ABP Studio", "CampaignInfo": "Buy a new license or renew your existing license and get an additional 2 months at no additional cost! This offer is valid for all license plans. Ensure you take advantage of this limited-time promotion to expand your access to premium features and upgrades.", "HurryUpLastDay": "Hurry Up! Last Day: {0}", - "CreatingCRUDPagesWithABPSuite": "Creating CRUD pages with ABP Suite" + "CreatingCRUDPagesWithABPSuite": "Creating CRUD pages with ABP Suite", + "Testimonials": "Testimonials", + "MultipleYearDiscount": "Multiple Year Discount", + "CampaignDiscountText": "Black Friday Discount", + "CampaignDiscountName": "Black Friday", + "CampaignName:BlackFriday": "Black Friday" } } diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/en.json index f295468ded..3889b5ec77 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/en.json @@ -235,6 +235,23 @@ "SponsoredConferencesDescription": "We are honoring to support .NET communities and events for software developers.", "UpcomingEvents": "Upcoming Events", "UpcomingCommunityTalkEventDescription": "The live shows, hosted by the ABP Team, are casual sessions full of community content, demos, Q&A, and discussions around what's happening in ABP.", - "UpcomingConferenceEventDescription": "ABP .NET Conference is a virtual event for the .NET Developer community to come together and listen to talks about the .NET world, common software development practices and the open source ABP Framework." + "UpcomingConferenceEventDescription": "ABP .NET Conference is a virtual event for the .NET Developer community to come together and listen to talks about the .NET world, common software development practices and the open source ABP Framework.", + "LastOneYear": "Last 1 Year", + "AllTimes": "All Times", + "TopContributors": "Top Contributors", + "{0}Posts": "{0} Posts", + "LATESTPOSTS": "LATEST POSTS", + "NoContributorsFound": "No contributors found!", + "LatestPost": "Latest post", + "MEMBERSINCE{0}": "MEMBER SINCE {0}", + "CopyLink": "Copy Link", + "ShareOnTwitter": "Share on Twitter", + "ShareOnLinkedIn": "Share on LinkedIn", + "MoreFrom{0}": "More from {0}", + "SeeAllFrom{0}": "See all from {0}", + "MostWatched": "Most Watched", + "Articles({0})": "Articles ({0})", + "Videos({0})": "Videos ({0})", + "LatestArticles": "Latest Articles" } } diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json index 5d4890331e..7b0394bac5 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json @@ -432,6 +432,11 @@ "PackageDetailPage_ManualInstallationDescription2": "Then add the {0} dependency to your module class as shown in the following example", "PackageDetailPage_SeeDocumentation": "See the documentation to learn how to use this package in your applications.", "PackageDetailPage_InstallingUsingPMC": "3: Installing with the Package Manager Console", - "PackageDetailPage_InstallingUsingPMCDescription1": "Open the Package Manager Console in Visual Studio (Tools -> Nuget Package Manager -> Package Manager Console) and execute the following command" + "PackageDetailPage_InstallingUsingPMCDescription1": "Open the Package Manager Console in Visual Studio (Tools -> Nuget Package Manager -> Package Manager Console) and execute the following command", + "UIOptions": "UI Options", + "Testimonials": "Testimonials", + "CoolestCompaniesUseABPFramework": "Coolest Companies Use ABP Framework", + "Index_Page_Testimonial_1": "ABP Framework is not just a tool but a catalyst that has accelerated my growth as a developer. It has made it possible for me to build new features faster than ever before, reminiscent of the experiences of other users. The unified coding pattern has streamlined my projects, giving me more time to focus on creating rather than troubleshooting.\nI would say the ABP Framework has been the cornerstone of my early professional journey. It has facilitated my transition from an aspiring developer to a confident professional ready to make a mark in the software world. I am looking forward to the exciting projects that await me, knowing that ABP will be there to guide me. It is more than just a product; it's a partner in success.", + "Index_Page_Testimonial_2": "ABP Framework is not only a framework, it is also a guidance for project development/management, because it provides DDD, GenericRepository, DI, Microservice, Modularity trainings. Even if you are not going to use framework itself, you can develop yourself with docs.abp.io which is well and professionally prepared. (OpenIddict, Redis, Quartz etc.)\nBecause many thing pre-built, it shortens project development time significantly. (Such as login page, exception handling, data filtering-seeding, audit logging, localization, auto api controller etc.)\nAs an example from our app, i have used Local Event Bus for stock control. So, I am able to manage order movements by writing stock handler.\nIt is wonderful not to lose time for CreationTime, CreatorId. They are filled automatically." } } diff --git a/docs/en/Community-Articles/2023-04-15-Converting-Create-Edit-Modal-To-Page/POST.md b/docs/en/Community-Articles/2023-04-15-Converting-Create-Edit-Modal-To-Page/POST.md index a8f1aeadfa..73d2e6bad5 100644 --- a/docs/en/Community-Articles/2023-04-15-Converting-Create-Edit-Modal-To-Page/POST.md +++ b/docs/en/Community-Articles/2023-04-15-Converting-Create-Edit-Modal-To-Page/POST.md @@ -315,7 +315,7 @@ import { CreateBookComponent } from './create-book/create-book.component'; import { EditBookComponent } from './edit-book/edit-book.component'; const routes: Routes = [ - { path: '', component: BookComponent, canActivate: [AuthGuard, PermissionGuard] }, + { path: '', component: BookComponent, canActivate: [authGuard, permissionGuard] }, { path: 'create', component: CreateBookComponent }, { path: 'edit/:id', component: EditBookComponent }, ]; diff --git a/docs/en/Community-Articles/2023-10-23-NET-8-Feature-containers/POST.md b/docs/en/Community-Articles/2023-10-23-NET-8-Feature-containers/POST.md new file mode 100644 index 0000000000..dc0f96e726 --- /dev/null +++ b/docs/en/Community-Articles/2023-10-23-NET-8-Feature-containers/POST.md @@ -0,0 +1,30 @@ +# New Containers feature with NET 8.0 + +This article will show you the new feature of containers with NET 8.0. + +## Non-root user + +The `Non-root user` feature on net 8 is a security measure that allows users to have limited access to the system without having full administrative privileges. Hosting containers as `non-root` aligns with the principle of least privilege. +It’s free security provided by the operating system. If you run your app as root, your app process can do anything in the container, like modify files, install packages, or run arbitrary executables. +That’s a concern if your app is ever attacked. If you run your app as non-root, your app process cannot do much, greatly limiting what a bad actor could accomplish. + +## Default ASP.NET Core port changed from 80 to 8080 + +In .NET 8, there has been a change in the default port used by ASP.NET Core applications. Previously, the default port assigned to ASP.NET Core applications was `80`. However, starting from .NET 8, the default port has been changed to `8080`. +This change was made to avoid conflicts with other applications and services that commonly use port 80, such as web servers like IIS or Apache. By using port 8080 as the default, there is less potential for clashes and easier deployment of ASP.NET Core applications alongside other services. + +It's important to note that this change only affects the default port used when an ASP.NET Core application is run without explicitly specifying a port. + +If you want your application to continue using port 80, you can still specify it during the application launch or configure it in the application settings. + +* Recommended: Explicitly set the `ASPNETCORE_HTTP_PORTS`, `ASPNETCORE_HTTPS_PORTS``, and `ASPNETCORE_URLS` environment variables to the desired port. Example: `docker run --rm -it -p 9999:80 -e ASPNETCORE_HTTP_PORTS=80 `` +* Update existing commands and configuration that rely on the expected default port of port 80 to reference port 8080 instead. Example: `docker run --rm -it -p 9999:8080 `` + +> The `dockerfile` of ABP templates has been updated to use port `80`. + +## References + +- [Secure your .NET cloud apps with rootless Linux Containers](https://devblogs.microsoft.com/dotnet/securing-containers-with-rootless/) +- [Containers breaking changes](https://learn.microsoft.com/en-us/dotnet/core/whats-new/dotnet-8#containers) +- [ASP.NET Core apps use port 8080 by default](https://learn.microsoft.com/en-us/dotnet/core/compatibility/8.0#containers) +- [Docker images for ASP.NET Core](https://learn.microsoft.com/en-us/aspnet/core/host-and-deploy/docker/building-net-docker-images?view=aspnetcore-8.0) diff --git a/docs/en/Community-Articles/2023-10-23-NET-8-Feature-raw-sql-queries-for-unmapped-types/POST.md b/docs/en/Community-Articles/2023-10-23-NET-8-Feature-raw-sql-queries-for-unmapped-types/POST.md new file mode 100644 index 0000000000..11d8e67563 --- /dev/null +++ b/docs/en/Community-Articles/2023-10-23-NET-8-Feature-raw-sql-queries-for-unmapped-types/POST.md @@ -0,0 +1,53 @@ +# New Raw SQL queries for unmapped types feature with EF Core 8.0 + +## Introduction + +I would love to talk about the new feature in EF Core 8.0, specifically the `raw SQL queries for unmapped types`. +This feature was recently introduced by Microsoft and is aimed at providing more flexibility and customization in database queries. + +## What is the raw SQL queries for the unmapped types feature? + +To give you a better understanding, let's look at a sample repository method with the ABP framework. +Here is an example of a raw SQL query using the new feature: + +````csharp +public interface IAuthorRepository : IRepository +{ + Task> GetAllAuthorNamesAsync(); +} + +public class AuthorIdWithNames +{ + public Guid Id { get; set; } + + public string Name { get; set; } +} + +public class EfCoreAuthorRepository : EfCoreRepository, IAuthorRepository +{ + public EfCoreAuthorRepository(IDbContextProvider dbContextProvider) + : base(dbContextProvider) + { + } + + public virtual async Task> GetAllAuthorNamesAsync() + { + return await (await GetDbContextAsync()).Database.SqlQuery(@$"SELECT Id, Name FROM Authors").ToListAsync(); + } +} +```` + +In this code, we can see that we are using the `SqlQuery` method to execute a raw SQL query on a custom type, `AuthorIdWithNames` in this case. This allows us to retrieve data that may not be mapped to any of our entity classes in the context. + +## In summary + +This feature can be particularly useful in scenarios where we need to access data from tables or views that are not directly mapped to our entities. It also provides an alternative to using stored procedures for querying data. + +However, it's important to note that using raw SQL queries can increase the risk of SQL injection attacks. So, it's recommended to use parameterized queries to prevent this. Additionally, this feature may not work with certain database providers, so it's important to check for compatibility before implementing it. + +In conclusion, the raw SQL queries for unmapped types feature in EF Core 8.0 is a great addition for developers looking for more flexibility in database queries. It allows us to work with data that may not be directly mapped to our entities and can be a useful tool in certain scenarios. Just remember to use parameterized queries and check for compatibility before implementing it. + +## References + +- [Raw SQL queries for unmapped types](https://learn.microsoft.com/en-us/ef/core/what-is-new/ef-core-8.0/whatsnew#raw-sql-queries-for-unmapped-types) +- [SQL Queries](https://learn.microsoft.com/en-us/ef/core/querying/sql-queries#querying-scalar-(non-entity)-types) diff --git a/docs/en/Community-Articles/2023-10-28-EF-Core-8-Primitive-Collections/POST.md b/docs/en/Community-Articles/2023-10-28-EF-Core-8-Primitive-Collections/POST.md new file mode 100644 index 0000000000..79d1b100c9 --- /dev/null +++ b/docs/en/Community-Articles/2023-10-28-EF-Core-8-Primitive-Collections/POST.md @@ -0,0 +1,118 @@ +# EF Core 8 Primitive collections + +What can we do when we want to store a list of primitive types? Before EF Core 8, there were two options: + +- Create a wrapper class and a related table, then add a foreign key linking each value to its owner of the collection. +- Use [value converter](https://learn.microsoft.com/en-us/ef/core/modeling/value-conversions) to serialize-deserialize as JSON. + +The first option covers most scenarios if we need to add some additional properties to this type but let's say we're never gonna need this type additionality. + +## Which collection types are supported ? + +EF Core has the capability to map the `IEnumerable` public properties that have both a getter and a setter, with the `T` representing a primitive type + +```csharp +public class PrimitiveCollections +{ + public IEnumerable Ints { get; set; } + public ICollection Strings { get; set; } + public ISet DateTimes { get; set; } + public IList Dates { get; set; } + public uint[] UnsignedInts { get; set; } + public List Booleans { get; set; } + public List Urls { get; set; } +} +``` + +> Some generic arguments are not considered primitive on the database side, such as `uint` and `Uri`. However, these types are also considered as primitive because there are [built-in value converters](https://learn.microsoft.com/en-us/ef/core/modeling/value-conversions?tabs=data-annotations#built-in-converters). + +## Demo + +In this sample, we have a `Car` class with a `Color` enum, and the `Car` class has a `Colors` property. + +```csharp +public enum Color +{ + Black, + White, + Red, + Blue +} + +public class Car +{ + public int Id { get; set; } + public string Brand { get; set; } + public string Model { get; set; } + public ISet Colors { get; set; } = new HashSet(); + + public Car(string brand, string model) + { + Brand = brand; + Model = model; + } +} +``` + +When we want to list the cars if they have any of the specific colors. + +```csharp +var colors = new HashSet { Color.Blue, Color.White }; +var cars = await context + .Cars + .Where(x=> x.Colors.Intersect(colors).Any()) + .ToListAsync(); +``` + +The SQL result looks like this; as you can see, it sends colors as parameters instead of adding them inline. It also uses the `json_each` function to deserialize on the database side. + +```sql +SELECT "c"."Id", "c"."Brand", "c"."Colors", "c"."Model" + FROM "Cars" AS "c" + WHERE EXISTS ( + SELECT 1 + FROM ( + SELECT "c0"."value" + FROM json_each("c"."Colors") AS "c0" + INTERSECT + SELECT "c1"."value" + FROM json_each(@__colors_0) AS "c1" + ) AS "t") + +``` + +When we insert to the car table. + +```csharp +var car = new Car("Maserati", "GranTurismo") +{ + Colors = new HashSet() + { + Color.Black, + Color.Blue + } +}; +context.Cars.Add(car); +await context.SaveChangesAsync(); +``` + +The SQL statement looks like this, and as you can see, it automatically serializes into the Colors parameter as JSON. + +```sql + Executed DbCommand (0ms) [Parameters= + [@p0='Maserati' (Nullable = false) (Size = 8), + @p1='[0,3]' (Nullable = false) (Size = 5), + @p2='Flow' (Nullable = false) (Size = 4) + ], CommandType='Text', CommandTimeout='30'] + INSERT INTO "Cars" ("Brand", "Colors", "Model") + VALUES (@p0, @p1, @p2) + RETURNING "Id"; +``` +## Conclusion + +We don't need to do anything if we just use a collection of primitive types. It serializes and deserializes them as JSON automatically. Additionally, it sends the primitive collection as a parameter to cache the query. + +## References + +- [EF Core 8 Primitive collections](https://learn.microsoft.com/en-us/ef/core/what-is-new/ef-core-8.0/whatsnew#primitive-collection-properties) +- [.NET Data Community Standup - Collections of primitive values in EF Core](https://www.youtube.com/watch?v=AUS2OZjsA2I) diff --git a/docs/en/Community-Articles/2023-10-30-Enhancements-to-JSON-column-mapping/POST.md b/docs/en/Community-Articles/2023-10-30-Enhancements-to-JSON-column-mapping/POST.md new file mode 100644 index 0000000000..db8f72ca17 --- /dev/null +++ b/docs/en/Community-Articles/2023-10-30-Enhancements-to-JSON-column-mapping/POST.md @@ -0,0 +1,124 @@ +# EF Core 8 - Enhancements to JSON column mapping + +In this article, we will examine the enhancements introduced in EF Core 8 for the JSON column feature, building upon the foundation laid by [JSON columns in Entity Framework Core 7](https://community.abp.io/posts/json-columns-in-entity-framework-core-7-cjaom76j). + +## The entity classes we will be using in the article + +```csharp +public class Person +{ + public int Id { get; set; } + [Required] + public string Name { get; set; } + [Required] + public ContactDetails ContactDetails { get; set; } +} + +public class ContactDetails +{ + public List
Addresses { get; set; } = new(); + public string? Phone { get; set; } +} + +public class Address +{ + public Address(string street, string city, string postcode, string country) + { + Street = street; + City = city; + Postcode = postcode; + Country = country; + } + + public string Street { get; set; } + public string City { get; set; } + public string Postcode { get; set; } + public string Country { get; set; } + public bool IsMainAddress { get; set; } +} +``` + +## The DbContext class we will be using in the article + +```csharp +public class AppDbContext : DbContext +{ + public DbSet Persons { get; set; } = null!; + + protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) + { +#if SQLSERVER + optionsBuilder.UseSqlServer("Server=localhost;Database=EfCore8Json;Trusted_Connection=True;TrustServerCertificate=True"); +#elif SQLITE + optionsBuilder.UseSqlite("Data Source=EfCore8Json.db"); +#endif + base.OnConfiguring(optionsBuilder); + } + + protected override void OnModelCreating(ModelBuilder modelBuilder) + { + modelBuilder.Entity(b => + { + b.ToTable("Persons"); + b.HasKey(x => x.Id); + b.Property(x => x.Name).IsRequired(); + b.OwnsOne(x => x.ContactDetails, cb => + { + cb.ToJson(); + cb.Property(x => x.Phone); + cb.OwnsMany(x => x.Addresses); + }); + }); + + base.OnModelCreating(modelBuilder); + } +} +``` + +## Translate element access into JSON arrays + +EF Core 8 supports indexing in JSON arrays when executing queries. For example, the following query returns individuals whose first address is the main address in the database: + +```csharp +var query = dbContext.Persons + .Select(x => x.ContactDetails.Addresses[0]) + .Where(x => x.IsMainAddress == true) + .ToListAsync(); +``` + +The generated SQL query is as follows when using SQL Server: + +```sql +SELECT JSON_QUERY([p].[ContactDetails], '$.Addresses[0]'), [p].[Id] +FROM [Persons] AS [p] +WHERE CAST(JSON_VALUE([p].[ContactDetails], '$.Addresses[0].IsMainAddress') AS bit) = CAST(1 AS bit) +``` + +> Note: If you attempt to access an index that is outside of the array, it will return null. + +## JSON Columns for SQLite + +In EF Core 7, JSON column mapping was supported for Azure SQL/SQL Server. In EF Core 8, this support has been extended to include SQLite as well. + +### Queries into JSON columns + +The following query returns individuals whose first address is the main address in the database: + +```csharp +var query = dbContext.Persons + .Select(x => x.ContactDetails.Addresses[0]) + .Where(x => x.IsMainAddress == true) + .ToListAsync(); +``` + +The generated SQL query is as follows when using SQLite: + +```sql +SELECT "p"."ContactDetails" ->> '$.Addresses[0]', "p"."Id" +FROM "Persons" AS "p" +WHERE "p"."ContactDetails" ->> '$.Addresses[0].IsMainAddress' = 0 +``` + +## References + +- [EF Core 8 - Enhancements to JSON column mapping](https://learn.microsoft.com/en-us/ef/core/what-is-new/ef-core-8.0/whatsnew#enhancements-to-json-column-mapping) \ No newline at end of file diff --git a/docs/en/Community-Articles/2023-10-30-NET-8-ASP-NET-Core-Metrics/POST.md b/docs/en/Community-Articles/2023-10-30-NET-8-ASP-NET-Core-Metrics/POST.md new file mode 100644 index 0000000000..9142a36be9 --- /dev/null +++ b/docs/en/Community-Articles/2023-10-30-NET-8-ASP-NET-Core-Metrics/POST.md @@ -0,0 +1,196 @@ +# .NET 8 - ASP.NET Core Metrics + +In this article, I'll show you the new built-in metrics of .NET 8, which are basically numerical measurements reported over time in your application and can be used to monitor the health of your application and generate reports according to those numerical values. We will see what the metrics are, why to use them, and how to use them in detail. So, let's dive in. + +## What are Metrics? + +Metrics are numerical measurements reported over time. These measurements are crucial for monitoring the health of an application and generating alerts when necessary. In the context of a web service, various metrics can be tracked, such as: + +* Requests per second. +* Response time. +* Status code counts etc... + +These metrics are not just collected; they are reported to a monitoring system at regular intervals. By doing so, the development and operations teams can visualize these metrics on dashboards. These dashboards provide a real-time overview of the application's performance and health. + +## Pre-Built Metrics + +ASP.NET Core has many built-in metrics. You can see the following figure for a list of built-in metrics for ASP.NET Core: + +![](built-in-metrics.png) + +> See https://learn.microsoft.com/en-us/dotnet/core/diagnostics/built-in-metrics-aspnetcore and https://github.com/dotnet/aspnetcore/issues/47536 for all built-in metrics and their descriptions. + +For example, we have the `kestrel-current-connections` metric that shows the _number of connections that are currently active on the server_ and the `http-server-request-duration` metric that shows _the duration of HTTP requests on the server_. + +All of these and other built-in metrics are produced by using the [**System.Diagnostics.Metrics**](https://learn.microsoft.com/en-us/dotnet/api/system.diagnostics.metrics) API and with a small amount of code, we can use & view them. + +## Using Pre-Built Metrics + +Let's see the pre-built metrics in action. + +Create a new ASP.NET Core app with the following command and change the directory to the created application folder: + +```bash +dotnet new web -o MetricsDemo +cd MetricsDemo +``` + +After that, open the application in your favorite IDE and add the following service registration code to your application: + +```csharp +var builder = WebApplication.CreateBuilder(args); + +builder.Services.AddOpenTelemetry() + .WithMetrics(builder => + { + builder.AddPrometheusExporter(); + + builder.AddMeter("Microsoft.AspNetCore.Hosting", + "Microsoft.AspNetCore.Server.Kestrel"); + builder.AddView("http.server.request.duration", + new ExplicitBucketHistogramConfiguration + { + Boundaries = new double[] { 0, 0.005, 0.01, 0.025, 0.05, + 0.075, 0.1, 0.25, 0.5, 0.75, 1, 2.5, 5, 7.5, 10 } + }); + }); +``` + +Here, we have done the following steps: + +* The `AddOpenTelemetry` method registers the required **OpenTelemetry** services into the DI container. +* In the `WithMetrics` method, we add pre-built metrics to the `OpenTelemetryBuilder` in the `AddMeter` method (_Microsoft.AspNetCore.Hosting_ and _Microsoft.AspNetCore.Server.Kestrel_ are pre-built metrics provided by ASP.NET Core). +* We have also used the `AddView` method to customize the output of the metrics by the SDK. It can also be used to customize which [Instruments](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/metrics/api.md#instrument) are to be processed or ignored. + +After making the related configurations, let's add the middleware below and view the metrics: + +```csharp +app.MapPrometheusScrapingEndpoint(); + +app.MapGet("/", () => +{ + Thread.Sleep(2000); + + return "Hello, ABP Community member: " + DateTime.Now.Ticks.ToString()[^3..]; +}); +``` + +* `MapPrometheusScrapingEndpoint`: Adds the OpenTelemetry Prometheus scraping endpoint middleware to the pipeline and then we can see the all metrics by navigating to the **/metrics** endpoints (optional): + +![](metrics-endpoint.png) + +### View Metrics + +You can use the `dotnet-counters` command-line tool, which allows you to view live metrics for .NET Core apps. You can run the following command to install the tool: + +```bash +dotnet tool update -g dotnet-counters +``` + +After the tool is installed, you can run the application and by running the `dotnet-counters` tool in a terminal, you can monitor for the specific metrics: + +```bash +dotnet-counters monitor -n MetricsDemo --counters Microsoft.AspNetCore.Hosting +``` + +When you run the command, it will print a message like the one below and will wait for an initial request to your application: + +```txt +Press p to pause, r to resume, q to quit. + Status: Waiting for initial payload... +``` + +If you send a request to your application, then the related built-in metrics that you have added will be collected and will be shown in the terminal instantly: + +![](built-in-metric-response.png) + +Also, you can check for the other metric that we have used in the configuration, which is _Microsoft.AspNetCore.Server.Kestrel_ by setting it as a counter as in the command below, and when you send a request to your application, you will see different metrics: + +```bash +dotnet-counters monitor -n MetricsDemo --counters Microsoft.AspNetCore.Server.Kestrel +``` + +## Creating Custom Metrics in ASP.NET Core Applications + +So far, we have seen what metrics are, which built-in metrics are provided by ASP.NET Core, the use of the built-in metrics and running the `dotnet-counters` global tool to view these metrics. At this point, let's see how we can create custom metrics and view them via the `dotnet-counters` tool. + +`IMeterFactory` is the recommended service to create *Meter* instances. ASP.NET Core registers the `IMeterFactory` in dependency injection (DI) by default. The meter factory integrates metrics with DI, making isolating and collecting metrics easy. + +Assume that, we want to create a metric that holds the sold products in our application. For that purpose, as a first step, we can create a metric class as follows: + +```csharp +using System.Diagnostics.Metrics; + +namespace MetricsDemo; + +public class ProductMetrics +{ + private readonly Counter _soldProductsCount; + + public ProductMetrics(IMeterFactory meterFactory) + { + var meterInstance = meterFactory.Create("MetricsDemo.ProductStore"); + _soldProductsCount = meterInstance.CreateCounter("metricsdemo.productstore.sold_products_count"); + } + + public void IncreaseSoldProductCount(int quantity) + { + _soldProductsCount.Add(quantity); + } +} +``` + +In this class, we are creating a counter and defining metrics that we want to collect and view. `MetricsDemo.ProductStore` is the **counter name** and `metricsdemo.productstore.sold_products_count` is the **metric**. In our example, we need to register this class with a `Singleton` lifetime because we don't want to reset the counter and want to keep it during the application runtime. + +> The [System.Diagnostics.Metrics.Meter](https://learn.microsoft.com/en-us/dotnet/api/system.diagnostics.metrics.meter) type is the entry point for a library to create a named group of instruments. Instruments record the numeric measurements that are needed to calculate metrics. Here we used [CreateCounter](https://learn.microsoft.com/en-us/dotnet/api/system.diagnostics.metrics.meter.createcounter) to create a Counter instrument named _metricsdemo.productstore.sold_products_count_. + +So, register the type with the DI container in the `Program.cs` file (or you can implement the `ISingletonDependency` interface, if you are using an ABP based application): + +```csharp +builder.Services.AddSingleton(); +``` + +Then, we can inject this class and increase the sold product count whenever it's needed. Since we have registered it in DI, we can use it in minimal APIs as in the following example: + +```csharp +app.MapPost("/complete-sale", ([FromBody] ProductSoldModel model, ProductMetrics metrics) => +{ + // ... business logic such as saving the product to the database etc... ... + + metrics.IncreaseSoldProductCount(model.Quantity); +}); +``` + +Whenever a request is made to this endpoint the metric that we've defined (_metricsdemo.productstore.sold_products_count_) will be increased and we can see this metric via the `dotnet-counters` global tool. You can run the following command to see the metrics: + +```bash +dotnet-counters monitor -n MetricsDemo --counters MetricsDemo.ProductStore +``` + +Here is an example output that you would see if you have made a POST request to the `/complete-sale` endpoint: + +```txt +Press p to pause, r to resume, q to quit. + Status: Paused + +[MetricsDemo.ProductStore] + metricsdemo.productstore.sold_products_count (Count / 1 sec) 20 +``` + +### Advanced: View Metrics in Prometheus & Grafana - Building Dashboards + +It's a common requirement to build a dashboard and monitor the metrics and check the health of your applications. At that point, you can expose the metrics and scrape them using the [Prometheus](https://learn.microsoft.com/en-us/aspnet/core/log-mon/metrics/metrics?view=aspnetcore-8.0#set-up-and-configure-prometheus) and build a dashboard by using the [Grafana](https://learn.microsoft.com/en-us/aspnet/core/log-mon/metrics/metrics?view=aspnetcore-8.0#show-metrics-on-a-grafana-dashboard). + +If you want to build a dashboard, you can see [this documentation from Microsoft](https://learn.microsoft.com/en-us/aspnet/core/log-mon/metrics/metrics?view=aspnetcore-8.0#view-metrics-in-grafana-with-opentelemetry-and-prometheus), which shows how to set up the **Prometheus server** and show metrics on a **Grafana** dashboard. + +Also, you can check [this video](https://www.youtube.com/watch?v=A2pKhNQoQUU) if you want to see it in action. + +## Conclusion + +In this article, I've shown you the new built-in metrics of .NET8, described what metrics are, which pre-built metrics are provided by ASP.NET Core, how to use & view these pre-built metrics and finally, I have shown you how to create custom metrics and view them in a dashboard. If you want to learn more about the **Metrics System of .NET**, you can check out the references that I have shared below. + +## References + +* https://learn.microsoft.com/en-us/aspnet/core/log-mon/metrics/metrics?view=aspnetcore-8.0 +* https://devblogs.microsoft.com/dotnet/announcing-dotnet-8-preview-5/ +* https://www.youtube.com/watch?v=A2pKhNQoQUU diff --git a/docs/en/Community-Articles/2023-10-30-NET-8-ASP-NET-Core-Metrics/built-in-metric-response.png b/docs/en/Community-Articles/2023-10-30-NET-8-ASP-NET-Core-Metrics/built-in-metric-response.png new file mode 100644 index 0000000000..035e76de7d Binary files /dev/null and b/docs/en/Community-Articles/2023-10-30-NET-8-ASP-NET-Core-Metrics/built-in-metric-response.png differ diff --git a/docs/en/Community-Articles/2023-10-30-NET-8-ASP-NET-Core-Metrics/built-in-metrics.png b/docs/en/Community-Articles/2023-10-30-NET-8-ASP-NET-Core-Metrics/built-in-metrics.png new file mode 100644 index 0000000000..7cf3a1896d Binary files /dev/null and b/docs/en/Community-Articles/2023-10-30-NET-8-ASP-NET-Core-Metrics/built-in-metrics.png differ diff --git a/docs/en/Community-Articles/2023-10-30-NET-8-ASP-NET-Core-Metrics/metrics-endpoint.png b/docs/en/Community-Articles/2023-10-30-NET-8-ASP-NET-Core-Metrics/metrics-endpoint.png new file mode 100644 index 0000000000..70933e0f6e Binary files /dev/null and b/docs/en/Community-Articles/2023-10-30-NET-8-ASP-NET-Core-Metrics/metrics-endpoint.png differ diff --git a/docs/en/Community-Articles/2023-10-31-NET-8-ASP-NET-Core-Minimal-APIs/POST.md b/docs/en/Community-Articles/2023-10-31-NET-8-ASP-NET-Core-Minimal-APIs/POST.md new file mode 100644 index 0000000000..03ca906884 --- /dev/null +++ b/docs/en/Community-Articles/2023-10-31-NET-8-ASP-NET-Core-Minimal-APIs/POST.md @@ -0,0 +1,156 @@ +# New Minimal APIs features in ASP.NET Core 8.0 + +In this article, we will see the new features of Minimal APIs in ASP.NET Core 8.0. + +## Binding to forms + +We can bind to forms using the [FromForm] attribute. Let's see an example: + +```csharp +app.MapPost("/books", async ([FromForm] string name, + [FromForm] BookType bookType, IFormFile? cover, BookDb db) => +{ + var book = new Book + { + Name = name, + BookType = bookType + }; + + if (cover is not null) + { + var coverName = Path.GetRandomFileName(); + + using var stream = File.Create(Path.Combine("wwwroot", coverName)); + await cover.CopyToAsync(stream); + book.Cover = coverName; + } + + db.Books.Add(book); + await db.SaveChangesAsync(); + + return Results.Ok(); +}); +``` + +Another way is using the [AsParameters] attribute, the following code binds from form values to properties of the `NewBookRequest` record struct: + +```csharp +public record NewBookRequest([FromForm] string Name, [FromForm] BookType BookType, IFormFile? Cover); + +app.MapPost("/books", async ([AsParameters] NewBookRequest request, BookDb db) => +{ + var book = new Book + { + Name = request.Name, + BookType = request.BookType + }; + + if (request.Cover is not null) + { + var coverName = Path.GetRandomFileName(); + + using var stream = File.Create(Path.Combine("wwwroot", coverName)); + await request.Cover.CopyToAsync(stream); + book.Cover = coverName; + } + + db.Books.Add(book); + await db.SaveChangesAsync(); + + return Results.Ok(); +}); +``` + +## Antiforgery + +ASP.NET Core 8.0 adds support for antiforgery tokens. We can call the `AddAntiforgery` method to register the antiforgery services and `WebApplicationBuilder` will automatically add the antiforgery middleware to the pipeline: + +```csharp +var builder = WebApplication.CreateBuilder(); + +builder.Services.AddAntiforgery(); + +var app = builder.Build(); + +// Implicitly added by WebApplicationBuilder if AddAntiforgery is called. +// app.UseAntiforgery(); + +app.MapGet("/", () => "Hello World!"); + +app.Run(); +``` + +Example of using antiforgery tokens: + +```csharp + +// Use the antiforgery service to generate tokens. +app.MapGet("/", (HttpContext context, IAntiforgery antiforgery) => +{ + var token = antiforgery.GetAndStoreTokens(context); + return Results.Content(...., "text/html"); +}); + +// It will automatically validate the token. +app.MapPost("/todo", ([FromForm] Todo todo) => Results.Ok(todo)); + +// Disable antiforgery validation for this endpoint. +app.MapPost("/todo2", ([FromForm] Todo todo) => Results.Ok(todo)) + .DisableAntiforgery(); +``` + + +## Native AOT + +ASP.NET Core 8.0 adds support for Native AOT. + +You can add `PublishAot` to the project file to enable Native AOT: + +```xml + + true + +``` + +### Web API (native AOT) template + +You can use the `dotnet new webapiaot` command to create a new Minimal APIs project with Native AOT enabled. + +```diff ++using System.Text.Json.Serialization; + +-var builder = WebApplication.CreateBuilder(); ++var builder = WebApplication.CreateSlimBuilder(args); + ++builder.Services.ConfigureHttpJsonOptions(options => ++{ ++ options.SerializerOptions.TypeInfoResolverChain.Insert(0, AppJsonSerializerContext.Default); ++}); + +var app = builder.Build(); + +var sampleTodos = TodoGenerator.GenerateTodos().ToArray(); + +var todosApi = app.MapGroup("/todos"); +todosApi.MapGet("/", () => sampleTodos); +todosApi.MapGet("/{id}", (int id) => + sampleTodos.FirstOrDefault(a => a.Id == id) is { } todo + ? Results.Ok(todo) + : Results.NotFound()); + +app.Run(); + ++[JsonSerializable(typeof(Todo[]))] ++internal partial class AppJsonSerializerContext : JsonSerializerContext ++{ ++ ++} +``` + +* Reflection isn't supported in native AOT, you must use the `JsonSerializable` attribute to specify the types that you want to serialize/deserialize. + +## References + +* https://learn.microsoft.com/en-us/aspnet/core/release-notes/aspnetcore-8.0?view=aspnetcore-8.0#minimal-apis +* https://learn.microsoft.com/en-us/aspnet/core/fundamentals/minimal-apis/parameter-binding?view=aspnetcore-8.0#explicit-binding-from-form-values +* https://learn.microsoft.com/en-us/aspnet/core/fundamentals/native-aot?view=aspnetcore-8.0 diff --git a/docs/en/Community-Articles/2023-11-03-ASPNET8-authentication-and-authorization/POST.md b/docs/en/Community-Articles/2023-11-03-ASPNET8-authentication-and-authorization/POST.md new file mode 100644 index 0000000000..22c621aa1b --- /dev/null +++ b/docs/en/Community-Articles/2023-11-03-ASPNET8-authentication-and-authorization/POST.md @@ -0,0 +1,138 @@ +# ASP.NET 8: What's New About Authentication and Authorization + +In ASP.NET 8, the concept of authentication and authorization is undergoing a transformation. Specifically, ASP.NET Core Identity is transitioning from a focus on traditional web pages to a more API-driven approach. We will see what the Identity API endpoints are, why we need them, and how to use them in detail. So, let's dive in. + +## What is ASP.NET Core Identity? + +ASP.NET Core Identity is like an extra toolkit that comes with ASP.NET Core. It offers a bunch of services to help you deal with user accounts in your ASP.NET Core application. These services include both basic concepts and ready-made solutions for each task. + +With ASP.NET Core Identity, you can save user accounts in your app, handle user information, add extra security with two-factor authentication, and even connect other log in options, like social media logins, to user accounts. In simple terms, it's all about keeping user accounts in your app and making it easy for users to log in. + +![](./identity_endpoints_scaffold.png) + +Prior to ASP.NET 8, there were limitations on using ASP.NET Identity in Single Page Applications (SPAs). Because the ASP.NET Core Identity framework is primarily tailored for traditional server-rendered web applications, like ASP.NET Core MVC or Razor Pages apps. However, the Identity API endpoints that come with ASP.NET 8 aim to solve token-based authentication and authorization in SPA without external dependencies. + +## Why do we need Identity APIs? + +The introduction of Identity endpoints in ASP.NET 8 aims to streamline the process of integrating ASP.NET Core Identity into both API server applications and front-end SPAs like those built with JavaScript or Blazor. To understand the importance of these endpoints, let's first examine the disadvantages of using ASP.NET Core Identity before ASP.NET 8. + +Let's delve into a common scenario: + +Imagine you have a straightforward application composed of an ASP.NET Core backend that exposes APIs. On the client side, you have a SPA application that communicates with these APIs. Now, you want to incorporate user accounts, complete with authentication and authorization, into your application. + +Before the advent of the identity endpoints, you could add ASP.NET Core Identity and the default Razor Pages UI to your app by adding a few packages, updating your database schema, and registering some services. However, this approach had some disadvantages. From a user experience perspective, the full-page refreshes of Razor Pages can be a major drawback especially compared to the fluidity of SPAs. On the other hand, from a developer's perspective, if you want the default pages to be compatible with the rest of your application, you may need to update more than 30 pages. Moreover, the default Razor Pages UI uses traditional cookie-based authentication, not bearer tokens. + +In ASP.NET 8, identity endpoints were introduced to simplify the process of adding user accounts to ASP.NET Core API apps used with SPAs or mobile. These endpoints streamline the user management process by providing an alternative to the traditional Razor Page Identity UI pages. Additionally, a new endpoint is included for retrieving bearer tokens, which can be used for authentication. These changes directly address the concerns mentioned earlier, making it easier to create a user-friendly and integrated experience within your app, with no full-page refreshes or styling conflicts. + +## How to add Identity APIs? + +In this part, I'll create a demo application, add all of the required packages, and lastly map the Identity APIs. + +Create a new ASP.NET Core app with the following command and change the directory to the created application folder: + +```bash +dotnet new webapi --name NewIdentityEndpoints -o IdentityDemo +cd IdentityDemo +``` + +After that, open the application in your favorite IDE and add the required packages: + +```csharp + + +``` + +**Note:** I used the `.NET 8.0.100-rc.2-**` SDK for everything in this post. + +Then replace `Program.cs` as below: + +```csharp +using System.Security.Claims; +using Microsoft.AspNetCore.Identity; +using Microsoft.AspNetCore.Identity.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore; + +var builder = WebApplication.CreateBuilder(args); + +builder.Services.AddAuthentication().AddBearerToken(IdentityConstants.BearerScheme); +builder.Services.AddAuthorizationBuilder(); + +builder.Services.AddDbContext(options => options.UseInMemoryDatabase("AppDb")); + +builder.Services.AddIdentityCore() +.AddEntityFrameworkStores() +.AddApiEndpoints(); + +builder.Services.AddEndpointsApiExplorer(); +builder.Services.AddSwaggerGen(); + +var app = builder.Build(); + +app.MapGroup("/my-identity-api").MapIdentityApi(); + +app.MapGet("/", (ClaimsPrincipal user) => $"Hello {user.Identity!.Name}").RequireAuthorization(); + +if (app.Environment.IsDevelopment()) +{ + app.UseSwagger(); + app.UseSwaggerUI(); +} + +app.Run(); + +class MyCustomUser : IdentityUser { } + +class ApplicationDbContext : IdentityDbContext +{ + public ApplicationDbContext(DbContextOptions options) : base(options) { } +} + +``` + +When you run the application, you will see a result as the following: + +![](./new-identity-endpoints.png) + +## Custom Authorization Policies + +Prior to ASP.NET 8, adding a parameterized authorization policy to an endpoint required writing a lot of code. + +- Implementing an `AuthorizeAttribute` for each policy +- Implementing an `AuthorizationPolicyProvider` to process a custom policy from a string-based contract +- Implementing an `AuthorizationRequirement` for the policy +- Implementing an `AuthorizationHandler` for each requirement + +However, implementing the `IAuthorizationRequirementData` interface that comes with ASP.NET 8, your application code should look like this: + +```csharp +class MinimumAgeAuthorizeAttribute : AuthorizeAttribute, IAuthorizationRequirement, IAuthorizationRequirementData +{ + public MinimumAgeAuthorizeAttribute(int age) => Age =age; + public int Age { get; } + + public IEnumerable GetRequirements() + { + yield return this; + } +} + +class MinimumAgeAuthorizationHandler : AuthorizationHandler +{ + protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, MinimumAgeAuthorizeAttribute requirement) + { + ... + } +} +``` + +See [here](https://gist.github.com/captainsafia/7c54e92d12df695ff0908e989fb8531f) for the complete code. + +## Conclusion + +In this article, I've shown you the Identity APIs introduced with ASP.NET 8, why we need them, and how we can add them to our application, and finally I explained how to define a custom authorization policy with fewer lines of code. + +## References +- https://learn.microsoft.com/en-us/aspnet/core/release-notes/aspnetcore-8.0?view=aspnetcore-8.0#authentication-and-authorization +- https://auth0.com/blog/whats-new-dotnet8-authentication-authorization/ +- https://andrewlock.net/exploring-the-dotnet-8-preview-introducing-the-identity-api-endpoints/ +- https://andrewlock.net/should-you-use-the-dotnet-8-identity-api-endpoints/ diff --git a/docs/en/Community-Articles/2023-11-03-ASPNET8-authentication-and-authorization/identity_endpoints_scaffold.png b/docs/en/Community-Articles/2023-11-03-ASPNET8-authentication-and-authorization/identity_endpoints_scaffold.png new file mode 100644 index 0000000000..951f6f1da6 Binary files /dev/null and b/docs/en/Community-Articles/2023-11-03-ASPNET8-authentication-and-authorization/identity_endpoints_scaffold.png differ diff --git a/docs/en/Community-Articles/2023-11-03-ASPNET8-authentication-and-authorization/new-identity-endpoints.png b/docs/en/Community-Articles/2023-11-03-ASPNET8-authentication-and-authorization/new-identity-endpoints.png new file mode 100644 index 0000000000..b8ac5021ee Binary files /dev/null and b/docs/en/Community-Articles/2023-11-03-ASPNET8-authentication-and-authorization/new-identity-endpoints.png differ diff --git a/docs/en/Community-Articles/2023-11-05-EF-Core-8-Complex-Types/POST.MD b/docs/en/Community-Articles/2023-11-05-EF-Core-8-Complex-Types/POST.MD new file mode 100644 index 0000000000..06289387e5 --- /dev/null +++ b/docs/en/Community-Articles/2023-11-05-EF-Core-8-Complex-Types/POST.MD @@ -0,0 +1,189 @@ +# Using Complex Types as Value Objects with Entity Framework Core 8.0 + +Entity Framework Core 8.0 is being shipped in a week as a part of .NET 8.0. In this article, I will introduce the new **[Complex Types](https://learn.microsoft.com/en-us/ef/core/what-is-new/ef-core-8.0/whatsnew#value-objects-using-complex-types)** feature of EF Core 8 and show some examples of how you can use it in your projects built with ABP Framework. + +## What is a Value Object? + +A [Value Object](https://docs.abp.io/en/abp/latest/Value-Objects) is a simple object that has no conceptual identity (Id). Instead, a Value Object is identified by its properties. + +A Value Object is typically owned by a parent [Entity](https://docs.abp.io/en/abp/latest/Entities) object. Using [Complex Types](https://learn.microsoft.com/en-us/ef/core/what-is-new/ef-core-8.0/whatsnew#value-objects-using-complex-types) with EF Core 8 is the best way to create Value Objects that are stored as a part of your main entity. + +## Creating an ABP Project + +> **WARNING**: ABP Framework has not a .NET 8.0 compatible version yet. It is planned to be released on November 15, 2023. I created this project with ABP 7.4.1 (based on .NET 7.0), then manually changed the `TargetFramework` (in the `csproj`) to `net8.0` and added the `Microsoft.EntityFrameworkCore.SqlServer` package with version `8.0.0-rc.2.23480.1`. After that, the project is being compiled, but some parts of this article may not work as expected until ABP Framework 8.0-RC.1 is released. +> +> **I will update the article once ABP Framework 8.0-RC.1 is released.** + +I will show code examples, so I am creating a new ABP project using the following [ABP CLI](https://docs.abp.io/en/abp/latest/CLI) command: + +````bash +abp new ComplexTypeDemo -t app-nolayers +```` + +> I prefer a non-layered project to keep the things simple. If you are new to ABP Framework, follow the [Getting Started](https://docs.abp.io/en/abp/latest/Getting-Started-Overall) tutorial to learn how to create a new project from scratch. + +Once I created the solution, I am running the following command to execute the database migrations in order to create the initial database: + +````bash +dotnet run --project ComplexTypeDemo --migrate-database +```` + +> We could also execute the `migrate-database.ps1` (that is coming as a part of the solution) as a shortcut. + +## Creating a Complex Type + +Assume that we have a `Customer` [entity](https://docs.abp.io/en/abp/latest/Entities) as shown below: + +````csharp +public class Customer : BasicAggregateRoot +{ + public string Name { get; set; } + public Address HomeAddress { get; set; } + public Address BusinessAddress { get; set; } +} +```` + +Here, we have two address properties, one for home and the other one for business. Since an address is a multi-values property, we can define it as a separate object: + +````csharp +public class Address +{ + public string City { get; set; } + public string Line1 { get; set; } + public string? Line2 { get; set; } + public string PostCode { get; set; } +} +```` + +`Address` is a typical complex object. It is actually a part of the `Customer` object, but we wanted to collect its parts into a dedicated class to make it a domain concept and easily manage its properties together. + +## Configure EF Core Mappings + +We should set the `Address` class as a Complex Type in our EF Core mapping configuration. There are two ways of it. + +As the first way, we can add the `ComplexType` attribute on top of the `Address` class: + +````csharp +[ComplexType] // Added this line +public class Address +{ + ... +} +```` + +As an alternative, we can configure the mapping using the fluent mapping API. You can write the following code into the `OnModelCreating` method of your `DbContext` class: + +````csharp +builder.Entity(b => +{ + b.ToTable("Customers"); + b.ComplexProperty(x => x.HomeAddress); // Mapping a Complex Type + b.ComplexProperty(x => x.BusinessAddress); // Mapping another Complex Type + //... configure other properties +}); + +```` + +You can further configure the properties of the `Address` class: + +````csharp +b.ComplexProperty(x => x.HomeAddress, a => +{ + a.Property(x => x.City).HasMaxLength(50).IsRequired(); +}); +```` + +Once you configure the mappings, you can use the [EF Core command-line tool](https://learn.microsoft.com/en-us/ef/core/cli/dotnet) to create a database migration: + +````bash +dotnet ef migrations add "Added_Customer_And_Address" +```` + +And update the database: + +````bash +dotnet ef database update +```` + +If you check the fields of the `Customers` table in your dayabase, you will see the following fields: + +* `Id` +* `Name` +* `HomeAddress_City` +* `HomeAddress_Line1` +* `HomeAddress_Line2` +* `HomeAddress_PostCode` +* `BusinessAddress_City` +* `BusinessAddress_Line1` +* `BusinessAddress_Line2` +* `BusinessAddress_PostCode` + +As you see, EF Core stores the `Address` properties as a part of your main entity. + +## Querying Objects + +You can query entities from database using the properties of a complex type as same as you query by the properties of the main entity. + +**Example: Find customers by `BusinessAddress.PostCode`:** + +````csharp +public class MyService : ITransientDependency +{ + private readonly IRepository _customerRepository; + + public MyService(IRepository customerRepository) + { + _customerRepository = customerRepository; + } + + public async Task DemoAsync() + { + var customers = await _customerRepository.GetListAsync( + c => c.BusinessAddress.PostCode == "12345" + ); + + //... + } +} +```` + +## Mutable vs Immutable + +Entity Framework Core Complex Types can work with mutable and immutable types. In the `Address` example above, I've shown a simple mutable class - that means you can change an individual property of an `Address` object after creating it (or after querying from database). However, designing Value Objects as immutable is a highly common approach. + +For example, you can use C#'s `struct` type to define an immutable `Address` type: + +````csharp +public readonly struct Address(string line1, string? line2, string city, string postCode) +{ + public string City { get; } = city; + public string Line1 { get; } = line1; + public string? Line2 { get; } = line2; + public string PostCode { get; } = postCode; +} +```` + +See the [Microsoft's documentation](https://learn.microsoft.com/en-us/ef/core/what-is-new/ef-core-8.0/whatsnew#mutability) for more examples and different usages. + +## Final Notes + +There are more details about using Complex Types in your applications. I want to mention some of them here: + +* You can have nested complex types. For example, `Address` may have one or more `PhoneNumber` objects as its properties. Everything will work seamlessly. +* A single instance of a Complex Type can be set to multiple properties (of the same or different entities). In that case, changing the Complex object's properties will affect all of the properties. However, try to avoid that since it may create unnecessary complexities in your code that is hard to understand. +* You can manipulate mutable complex object properties just as another property in your entity. EF Core change tracking system will track them as you expect. +* Currently, EF Core doesn't support to have a collection of complex objects in an entity. It works only for properties. + +For more details and examples, see the Microsoft's document in the *References* section. + +## Source Code + +You can find the sample project here: + +https://github.com/hikalkan/samples/tree/master/EfCoreComplexTypeDemo + +## References + +* [Value objects using Complex Types](https://learn.microsoft.com/en-us/ef/core/what-is-new/ef-core-8.0/whatsnew#value-objects-using-complex-types) in [What's new with EF Core 8.0](https://learn.microsoft.com/en-us/ef/core/what-is-new/ef-core-8.0/whatsnew) document by Microsoft. +* [ABP Entity Framework Core integration document](https://docs.abp.io/en/abp/latest/Entity-Framework-Core) + diff --git a/docs/en/Community-Articles/2023-11-06- SerializationDeserialization-Improvements/POST.md b/docs/en/Community-Articles/2023-11-06- SerializationDeserialization-Improvements/POST.md new file mode 100644 index 0000000000..74022bd572 --- /dev/null +++ b/docs/en/Community-Articles/2023-11-06- SerializationDeserialization-Improvements/POST.md @@ -0,0 +1,100 @@ +# .NET 8: Serialization Improvements + +The [System.Text.Json](https://learn.microsoft.com/en-us/dotnet/api/system.text.json) namespace provides functionality for serializing to and deserializing from JSON. In .NET 8, there have been many improvements to the System.Text.Json serialization and deserialization functionality. + +## Source generator + +.NET 8 includes enhancements of the System.Text.Json source generator that are aimed at making the Native AOT experience on par with the reflection-based serializer. This is important because now you can select the source generator for System.Text.Json. To see a comparison of Reflection versus source generation in System.Text.Json, check out the comparison [documentation](https://learn.microsoft.com/en-us/dotnet/standard/serialization/system-text-json/reflection-vs-source-generation?pivots=dotnet-8-0#reflection). + +## Interface hierarchies + +.NET 8 adds support for serializing properties from interface hierarchies. Here is a code sample that shows this feature. + +```csharp +ICar car = new MyCar { Color = "Red", NumberOfWheels = 4 }; +JsonSerializer.Serialize(car); // {"Color":"Red","NumberOfWheels":4} + +public interface IVehicle +{ + public string Color { get; set; } +} + +public interface ICar : IVehicle +{ + public int NumberOfWheels { get; set; } +} + +public class MyCar : ICar +{ + public string Color { get; set; } + public int NumberOfWheels { get; set; } +} +``` + +## Naming policies + +Two new naming policies `snake_case` and `kebab-case` have been added. You can use them as shown below: + +```csharp +var options = new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.SnakeCaseLower }; +JsonSerializer.Serialize(new { CreationTime = new DateTime(2023,11,6) }, options); // {"creation_time":"2023-11-06T00:00:00"} +``` + +## Read-only properties + +With .NET 8, you can deserialize onto read-only fields or properties. This feature can be globally enabled by setting `PreferredObjectCreationHandling` to `JsonObjectCreationHandling.Populate`. You can also enable this feature for a class or one of its members by adding the `[JsonObjectCreationHandling(JsonObjectCreationHandling.Populate)]` attribute. Here is a sample: + +```csharp +using System.Text.Json; +using System.Text.Json.Serialization; + +var book = JsonSerializer.Deserialize("""{"Contributors":["John Doe"],"Author":{"Name":"Sample Author"}}""")!; +Console.WriteLine(JsonSerializer.Serialize(book)); + +class Author +{ + public required string Name { get; set; } +} + +[JsonObjectCreationHandling(JsonObjectCreationHandling.Populate)] +class Book +{ + // Both of these properties are read-only. + public List Contributors { get; } = new(); + public Author Author { get; } = new() {Name = "Undefined"}; +} +``` + +Before .NET 8, the output was like this: + +```json +{"Contributors":[],"Author":{"Name":"Undefined"}} +``` + +With .NET 8, the output now looks like this: + +```json +{"Contributors":["John Doe"],"Author":{"Name":"Sample Author"}} +``` + +## Disable reflection-based default + +One of the nice features about Serialization is, now you can disable using the reflection-based serializer by default. To disable default reflection-based serialization, set the `JsonSerializerIsReflectionEnabledByDefault` MSBuild property to `false` in your project file. + +## Streaming deserialization APIs + +.NET 8 includes new `IAsyncEnumerable` streaming deserialization extension methods. The new extension methods invoke streaming APIs and return `IAsyncEnumerable`. Here is a sample code that uses this new feature. + +```csharp +const string RequestUri = "https://yourwebsite.com/api/saas/tenants?skipCount=0&maxResultCount=10"; +using var client = new HttpClient(); +IAsyncEnumerable tenants = client.GetFromJsonAsAsyncEnumerable(RequestUri); + +await foreach (Tenant tenant in tenants) +{ + Console.WriteLine($"* '{tenant.name}' uses '{tenant.editionName +}' edition"); +} +``` + +I have mentioned some of the items for Serialization Improvements in .NET 8. If you want to check the full list, you can read it in the .NET 8's [What's new document](https://learn.microsoft.com/en-us/dotnet/core/whats-new/dotnet-8#serialization). diff --git a/docs/en/Community-Articles/2023-11-06-Blazor-Fullstack-Web-Ui/Post.md b/docs/en/Community-Articles/2023-11-06-Blazor-Fullstack-Web-Ui/Post.md new file mode 100644 index 0000000000..a346b6f084 --- /dev/null +++ b/docs/en/Community-Articles/2023-11-06-Blazor-Fullstack-Web-Ui/Post.md @@ -0,0 +1,89 @@ +# Blazor's History and Full-stack Web UI + +Blazor is a web framework that allows developers to build interactive web applications using .NET instead of JavaScript. The first version of Blazor was **released on May 14, 2020**. Since its initial release, Blazor has evolved with the new versions. Until now, six different versions have been declared. Sometimes, it can be not very clear to see the differences between these approaches. First, let's try to understand these. + +* **Blazor-Server**: >> *Loads fast at first* >> In this version, heavy things are done in the server. Browsers are thin clients and download a small page for the first load. The page updates are done via SignalR connection. This was released with .NET Core 3. +* **Blazor WebAssembly (WASM):** >> *Loads slow at first* >> In this version, some binary files are being downloaded to the browser. This approach takes longer initialization time than the "Server" approach. The hard work is done on the browser. +* **Blazor Hybrid:** It's a combination of Blazor and Xamarin.Forms. It allows you to run your app on iOS, Android, macOS, and Windows. Blazor Hybrid uses a WebView component to host the Blazor-based user interface within the mobile app. +* **Blazor Native**: It runs natively on the devices and uses a common UI abstraction to render native controls for that device. This is very similar to how frameworks like Xamarin Forms or React Native work today. It has also been considered but has not reached [the planning stage](https://devblogs.microsoft.com/dotnet/blazor-server-in-net-core-3-0-scenarios-and-performance/). + +* **Blazor United**: Recently, Microsoft updated this name to "Fullstack web UI". Blazor-Server and Blazor WASM both have some disadvantages and advantages. So, Microsoft decided to combine these two approaches and find an optimum solution for the entire Blazor version. We can call it *Best of Blazor* 😀 + +## Why is "Blazor Fullstack Web UI" the best? + +These apps are a combination of both Blazor Server and Blazor WASM. It provides the advantages of Blazor Server and WASM. Developers would be able to more fine-tune the rendering mode. **This approach overcomes the large binary downloads of Blazor WASM, and it resolves the Blazor Server's problem, which always needs to be connected to the server via SignalR.** + +> Blazor Fullstack Web UI comes with the .NET 8, and it will be published on November 14, 2023. + +I took the following photo from Steven Sanderson's talk at NDC Porto 2023. You can read my impressions of this conf at https://volosoft.com/blog/ndc-port-2023-impressions, but after reading this one. + +![image-20231106163046763](image-20231106163046763-1699282281622-2.png) + + + +There are two basic page styles: + +* **HTML**; simple and loads fast! Eg: MVC, Razor Pages +* **Single Page Apps (SPA):** high interaction with the client and loads slower! Eg: Blazor WASM, Blazor Server... + +## HTML + SPA => Blazor Fullstack + +Blazor Fullstack (formerly United) is a technology that turns Blazor Server into a SPA style. + +.NET 8 will combine Blazor Server's server-side rendering and WebAssembly's client-side interaction. + +You can switch between two rendering modes and even mix them on the same page. With .NET 8 there also comes amazing features like; + +* [Streaming rendering](https://github.com/dotnet/aspnetcore/issues/46352): With this feature, most of the page will be rendered, and long async operations on the server will still be in progress. + +* [Progressive enhancement of form submission & navigation](https://github.com/dotnet/aspnetcore/issues/46399): With this feature, it doesn't fully reload the page after submitting the form. This gives the user a better and smoother experience. + + + + ## How it works? + +### Rendering on Server + +You can add `WebComponentRenderMode.Server` to your Blazor components so that these components will run interactively. In the below example, the list editor will make AJAX requests to the server like single-page applications. + +![image-20231106172420148](image-20231106172420148.png) + + + +And sure you can add `WebComponentRenderMode.Server` to your page level, and the complete page will be rendered as a server component. All inputs on this page can work as an interactive server component like SPA mode. + +![image-20231106172638604](image-20231106172638604.png) + + + +### Rendering on client + +You can switch to WebAssembly mode by writing `WebComponentRenderMode.WebAssembly` attribute to your page. By doing so, the whole page should run interactively using WebAssembly. This time there's no server connection anymore because it loads the binaries (WebAssembly runtimes) at the page load. + +![image-20231106173021958](image-20231106173021958.png) + +## How it works? + +To enable Blazor Full-stack Web UI, you need to write `net8.0;net7.0-browser` into the `TargetFrameworks` area of your `csproj` file. These two keywords change your app like this; `net8.0` framework renders on the server, and `net7.0-browser` framework renders on the browser. + +![image-20231106173411309](image-20231106173411309.png) + +## Let the System decide on WebAssembly or Server approach + +You can let the system decide whether it uses `WebAssembly` or `Server`. This can be done with the `Auto` mode of the `WebComponentRenderMode`. In this case, it will not load binary files (WebAssembly files) for the initial page that has `WebComponentRenderMode.Server` attribute, but whenever the user navigates to a page that has `WebComponentRenderMode.WebAssembly`, it will download the runtimes. This will allow us to load the initial page very fast, and when we need interactivity, we can switch to `WebAssembly` and wait for the binaries to download. But this download will be done one time because it will be cached. + +![image-20231106173849303](image-20231106173849303.png) + + + +## Conclusion + +I summarized the new generation Blazor in a very simple way. This architecture will be useful to everyone who uses Blazor. + + + +*Resources:* + +* You can check out Dan Roth's GitHub issue 👉 [github.com/dotnet/aspnetcore/issues/46636](https://github.com/dotnet/aspnetcore/issues/46636). +* Steven Sanderson's YouTube video is very good for understanding these concepts 👉 [Blazor United Prototype Video](https://youtu.be/48G_CEGXZZM). + diff --git a/docs/en/Community-Articles/2023-11-06-Blazor-Fullstack-Web-Ui/image-20231106163046763-1699282281622-2.png b/docs/en/Community-Articles/2023-11-06-Blazor-Fullstack-Web-Ui/image-20231106163046763-1699282281622-2.png new file mode 100644 index 0000000000..62c2bcea95 Binary files /dev/null and b/docs/en/Community-Articles/2023-11-06-Blazor-Fullstack-Web-Ui/image-20231106163046763-1699282281622-2.png differ diff --git a/docs/en/Community-Articles/2023-11-06-Blazor-Fullstack-Web-Ui/image-20231106172420148.png b/docs/en/Community-Articles/2023-11-06-Blazor-Fullstack-Web-Ui/image-20231106172420148.png new file mode 100644 index 0000000000..62d2a704b8 Binary files /dev/null and b/docs/en/Community-Articles/2023-11-06-Blazor-Fullstack-Web-Ui/image-20231106172420148.png differ diff --git a/docs/en/Community-Articles/2023-11-06-Blazor-Fullstack-Web-Ui/image-20231106172638604.png b/docs/en/Community-Articles/2023-11-06-Blazor-Fullstack-Web-Ui/image-20231106172638604.png new file mode 100644 index 0000000000..f28987d536 Binary files /dev/null and b/docs/en/Community-Articles/2023-11-06-Blazor-Fullstack-Web-Ui/image-20231106172638604.png differ diff --git a/docs/en/Community-Articles/2023-11-06-Blazor-Fullstack-Web-Ui/image-20231106173021958.png b/docs/en/Community-Articles/2023-11-06-Blazor-Fullstack-Web-Ui/image-20231106173021958.png new file mode 100644 index 0000000000..6120776e90 Binary files /dev/null and b/docs/en/Community-Articles/2023-11-06-Blazor-Fullstack-Web-Ui/image-20231106173021958.png differ diff --git a/docs/en/Community-Articles/2023-11-06-Blazor-Fullstack-Web-Ui/image-20231106173411309.png b/docs/en/Community-Articles/2023-11-06-Blazor-Fullstack-Web-Ui/image-20231106173411309.png new file mode 100644 index 0000000000..2cc92a9ee3 Binary files /dev/null and b/docs/en/Community-Articles/2023-11-06-Blazor-Fullstack-Web-Ui/image-20231106173411309.png differ diff --git a/docs/en/Community-Articles/2023-11-06-Blazor-Fullstack-Web-Ui/image-20231106173849303.png b/docs/en/Community-Articles/2023-11-06-Blazor-Fullstack-Web-Ui/image-20231106173849303.png new file mode 100644 index 0000000000..13413ca55f Binary files /dev/null and b/docs/en/Community-Articles/2023-11-06-Blazor-Fullstack-Web-Ui/image-20231106173849303.png differ diff --git a/docs/en/Community-Articles/2023-11-06-EF-Core_Hierarchy-Id/POST.md b/docs/en/Community-Articles/2023-11-06-EF-Core_Hierarchy-Id/POST.md new file mode 100644 index 0000000000..9255c39a5a --- /dev/null +++ b/docs/en/Community-Articles/2023-11-06-EF-Core_Hierarchy-Id/POST.md @@ -0,0 +1,79 @@ +# HierarchyId Support in Entity Framework Core + +Entity Framework Core has official support for HierarchyId, which allows you to store and query hierarchical data in SQL Server databases. Hierarchical data is a common data structure found in many applications. Whether you are dealing with organizational structures, product categories, or threaded discussions, handling hierarchies efficiently is crucial. In this blog post, we will explore how to manage hierarchical data using Entity Framework Core (EF Core) in combination with HierarchyId. + +## How to use HierarchyId in EF Core + +To use HierarchyId in EF Core, you need to install the [Microsoft.EntityFrameworkCore.SqlServer.HierarchyId](https://www.nuget.org/packages/Microsoft.EntityFrameworkCore.SqlServer.HierarchyId/) NuGet package. This package contains query and update support for HierarchyId. + +To configure EF Core to use HierarchyId, you need to call the `UseHierarchyId` method when configuring the SQL Server provider. + +```csharp +options.UseSqlServer( + connectionString, + x => x.UseHierarchyId()); +``` + +## Modeling Hierarchies + +The `HierarchyId` type can be used for properties of an entity type. For example, assume we want to model the personnel in an organization. Each person has a name and a manager. The manager is also a person. We can model this using the following entity type: + +```csharp +public class Person +{ + public int Id { get; set; } + public string Name { get; set; } + public HierarchyId Manager { get; set; } +} +``` + +Each person can be traced from the patriarch down the tree using its `Manager` property. SQL Server uses a compact binary format for these paths, but it is common to parse to and from a human-readable string representation when working with code. In this representation, the position at each level is separated by a `/` character. + +![Hierarchy Tree](hierarchy-tree.png) + +## Querying Hierarchies + +HierarchyId exposes several methods that can be used in LINQ queries. + +* `GetAncestor(int level)` returns the ancestor at the specified level. + +* `GetDescendant(HierarchyId? child1, HierarchyId? child2)` returns the descendant at the specified level. + +* `GetLevel()` returns the level of the node in the hierarchy. + +* `GetReparentedValue(HierarchyId? oldRoot, HierarchyId? newRoot)` returns the node with a new parent. + +* `IsDescendantOf(HierarchyId? parent)` returns whether the node is a descendant of the specified node. + +Example: + +```csharp +// Get entities at a given level in the tree +var generation = await context.Persons.Where(x => x.Manager.GetLevel() == level).ToListAsync(); + +// Get the direct ancestor of an entity +var parent = await context.Persons.Where(x => x.Manager.GetAncestor(1) == manager).SingleAsync(); +``` + +For example, your company may want to change the manager of an organizational unit. To do this, you can use the `GetReparentedValue` method to update the manager for all descendants of the organizational unit. + +```csharp +var newManager = await context.Persons.SingleAsync(x => x.Id == newManagerId); + +var descendants = await context.Persons + .Where(x => x.Manager.IsDescendantOf(oldManager)) + .ToListAsync(); + +foreach (var descendant in descendants) +{ + descendant.Manager = descendant.Manager.GetReparentedValue(oldManager.Manager, newManager.Manager); +} + +await context.SaveChangesAsync(); +``` + +## References + +For more information about hierarchy id, see the following resource: + +https://learn.microsoft.com/en-us/ef/core/what-is-new/ef-core-8.0/whatsnew#hierarchyid-in-net-and-ef-core diff --git a/docs/en/Community-Articles/2023-11-06-EF-Core_Hierarchy-Id/hierarchy-tree.png b/docs/en/Community-Articles/2023-11-06-EF-Core_Hierarchy-Id/hierarchy-tree.png new file mode 100644 index 0000000000..e22ed9781c Binary files /dev/null and b/docs/en/Community-Articles/2023-11-06-EF-Core_Hierarchy-Id/hierarchy-tree.png differ diff --git a/docs/en/Community-Articles/2023-11-97-AOT-Compilation/Post.md b/docs/en/Community-Articles/2023-11-97-AOT-Compilation/Post.md new file mode 100644 index 0000000000..2b994b59c3 --- /dev/null +++ b/docs/en/Community-Articles/2023-11-97-AOT-Compilation/Post.md @@ -0,0 +1,75 @@ +# Native AOT Compilation in .NET 8 +Native AOT (Ahead-of-Time) compilation is a feature that allows developers to create a self-contained app compiled to native code that can run on machines without the .NET runtime installed. It results in benefits such as minimized disk footprint, reduced executable size, reduced startup time, and reduced memory demand. + +Native AOT compilation isn't a new feature in .NET 8. It's first introduced in .NET 7. + + +Differences between the AOT Compilation of .NET 7 and .NET 8 are: + + +- **System.Text.Json improvements**: .NET 8 adds support for more types, source generation, interface hierarchies, naming policies, read-only properties, and more. +- **New types for performance**: .NET 8 introduces new types such as FrozenDictionary, FrozenSet, SearchValues, CompositeFormat, TimeProvider, and ITimer to improve the app performance. +- **System.Numerics and System.Runtime.Intrinsics enhancements**: .NET 8 adds support for Vector512, AVX-512, IUtf8SpanFormattable, Lerp, and more. +- **System.ComponentModel.DataAnnotations additions**: .NET 8 adds new data validation attributes for cloud-native services and a new ValidateOptionsResultBuilder type. +- **Hosted services lifecycle methods**: .NET 8 adds new methods such as StartAsync, StopAsync, StartBackgroundAsync, and StopBackgroundAsync for hosted services. + +It's important to note that not all features in ASP.NET Core are currently compatible with native AOT. For more information, see [Native AOT deployment overview](https://learn.microsoft.com/en-us/dotnet/core/deploying/native-aot/). + +## How to use Native AOT Compilation in .NET 8 + +You can add `true` in your project .csproj file to enable Native AOT Compilation. + + - For the new projects, you can create them with the `--aot` parameter. Example: `dotnet new console --aot`. + +By default, the compiler chooses a blended approach code optimization but you can specify an optimization preference inside your .csproj file. You can choose **size** or **speed** according your requirements. + +```xml +Size +``` + +or + +```xml +Speed +``` + +### Results + +I have created a simple console application to test the Native AOT Compilation. I have used a simple console application that writes "Hello World!" to the console 100 times. I have tested the application with different optimization preferences. I have used the following results: + + +| | Size | Speed | +| --- | --- | --- | +| .NET 8
_(Self-Contained, Single File)_ | 65938 kb | 00.0051806 ~5ms | +| .NET 7 AOT (default) | 4452 kb | 00.0029823 ~2ms | +| .NET 8 AOT (default) | 1242 kb | 00.0028638 ~2ms | +| AOT (Speed)| 1280 kb | 00.0023838 ~2ms | +| AOT (Size) | 1111 kb | 00.0025145 ~2ms | + +Most of existing libraries don't support AOT compilation yet, so I couldn't use [BenchmarkDotnet](https://github.com/dotnet/BenchmarkDotNet) to measure the performance. I have used [Stopwatch](https://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.stopwatch?view=net-8.0) to measure the performance. So the performance results may not be accurate but gives insight about the performance difference. + +## AOT Support in MAUI +You can now use Native AOT Compilation on iOS-like target frameworks in .NET MAUI. You can enable AOT compilation with the exact same method by adding `true` to your project .csproj file. According to the dotnet team, apps sizes reduced by 35% and startup times reduced by 28% with AOT compilation. And runtime performance is also improved by 50%. + +But there are some limitations in MAUI AOT Compilation. A lot of libraries still don't support AOT compilation and some of platform-specific feaetures may not work at the moment. + +## When to use Native AOT Compilation? + +Native AOT Compilation is beneficial when you need to optimize your .NET application for speed and size. It's particularly useful for applications that require quick startup times and efficient runtime performance, such as mobile apps or high-performance computing applications. + +However, due to its current limitations, it might not be suitable for all projects. If your project relies heavily on libraries that do not support AOT compilation, or if it uses platform-specific features that are not yet compatible with AOT, you might want to hold off on using Native AOT Compilation until further improvements are made. + +Always consider the specific needs and constraints of your project before deciding to use Native AOT Compilation. + +## Conclusion + +Native AOT Compilation is a great feature that improves the performance of .NET applications. It's still in early-stages and not all libraries support it yet. But it's a great beginning for the future of .NET 🚀 + + +## Links +- Native AOT deployment overview - .NET | Microsoft Learn. https://learn.microsoft.com/en-us/dotnet/core/deploying/native-aot/. +- +- Optimize AOT deployments https://learn.microsoft.com/en-us/dotnet/core/deploying/native-aot/optimizing +- +- What's new in .NET 8 | Microsoft Learn. https://learn.microsoft.com/en-us/dotnet/core/whats-new/dotnet-8. + diff --git a/docs/en/Deployment/Index.md b/docs/en/Deployment/Index.md index 3eb299b483..cf7137464f 100644 --- a/docs/en/Deployment/Index.md +++ b/docs/en/Deployment/Index.md @@ -6,7 +6,8 @@ However, there are some topics that you should care about when you are deploying ## Guides -* [Configuring for OpenIddict](Configuring-OpenIddict.md): Notes for some essential configurations for OpenIddict. +* [Configuring SSL certificate(HTTPS)](SSL.md): Explains how to configure SSL certificate(HTTPS) for your application. +* [Configuring OpenIddict](Configuring-OpenIddict.md): Notes for some essential configurations for OpenIddict. * [Configuring for Production](Configuring-Production.md): Notes for some essential configurations for production environments. * [Optimization for Production](Optimizing-Production.md): Tips and suggestions for optimizing your application on 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. diff --git a/docs/en/Deployment/SSL.md b/docs/en/Deployment/SSL.md new file mode 100644 index 0000000000..c48c916d93 --- /dev/null +++ b/docs/en/Deployment/SSL.md @@ -0,0 +1,34 @@ +# Configuring Configuring SSL certificate(HTTPS) + +A website needs an SSL certificate in order to keep user data secure, verify ownership of the website, prevent attackers from creating a fake version of the site, and gain user trust. + +This document introduces how to get and use SSL certificate(HTTPS) for your application. + +## Get a SSL Certificate from a Certificate Authority + +You can get a SSL certificate from a certificate authority (CA) such as [Let's Encrypt](https://letsencrypt.org/) or [Cloudflare](https://www.cloudflare.com/learning/ssl/what-is-an-ssl-certificate/) and so on. + +Once you have a certificate, you need to configure your web server to use it. The following references show how to configure your web server to use a certificate. + +* [Host ASP.NET Core on Linux with Apache: HTTPS configuration](https://learn.microsoft.com/en-us/aspnet/core/host-and-deploy/linux-apache) +* [Host ASP.NET Core on Linux with Nginx: HTTPS configuration](https://learn.microsoft.com/en-us/aspnet/core/host-and-deploy/linux-nginx) +* [How to Set Up SSL on IIS 7 or later](https://learn.microsoft.com/en-us/iis/manage/configuring-security/how-to-set-up-ssl-on-iis) + +## Create a Self-Signed Certificate + +You can create a self-signed certificate for testing purposes or internal use. + +There is an article about [how to create a self-signed certificate](https://learn.microsoft.com/en-us/dotnet/core/additional-tools/self-signed-certificates-guide), If you are using IIS, you can use the following this document to [obtain a Certificate](https://learn.microsoft.com/en-us/iis/manage/configuring-security/how-to-set-up-ssl-on-iis#obtain-a-certificate) + +## Common Problems + +### The remote certificate is invalid because of errors in the certificate chain: UntrustedRoot + +This error may occur when using IIS. You need to trust your certificate by `Manage computer certificates`. + +## References + +* [ABP commercial IIS Deployment](https://docs.abp.io/en/commercial/latest/startup-templates/application/deployment-iis) +* [HTTPS in ASP.NET Core](https://learn.microsoft.com/en-us/aspnet/core/security/enforcing-ssl) +* [Let's Encrypt](https://letsencrypt.org/getting-started) +* [Cloudflare's Free SSL / TLS](https://www.cloudflare.com/application-services/products/ssl/) \ No newline at end of file diff --git a/docs/en/Getting-Started-Running-Solution-Single-Layer.md b/docs/en/Getting-Started-Running-Solution-Single-Layer.md index f276ea5706..58783b8c3b 100644 --- a/docs/en/Getting-Started-Running-Solution-Single-Layer.md +++ b/docs/en/Getting-Started-Running-Solution-Single-Layer.md @@ -66,7 +66,7 @@ abp install-libs > We suggest you install [Yarn](https://classic.yarnpkg.com/) to prevent possible package inconsistencies, if you haven't installed it yet. -{{if UI=="Blazor" || UI="BlazorServer"}} +{{if UI=="Blazor" || UI=="BlazorServer"}} ### Bundling and Minification diff --git a/docs/en/Getting-Started-Running-Solution.md b/docs/en/Getting-Started-Running-Solution.md index 79818e25dc..921fb2b247 100644 --- a/docs/en/Getting-Started-Running-Solution.md +++ b/docs/en/Getting-Started-Running-Solution.md @@ -105,7 +105,7 @@ abp install-libs > We suggest you install [Yarn](https://classic.yarnpkg.com/) to prevent possible package inconsistencies, if you haven't installed it yet. -{{if UI=="Blazor" || UI="BlazorServer"}} +{{if UI=="Blazor" || UI=="BlazorServer"}} ### Bundling and Minification @@ -125,6 +125,8 @@ abp bundle {{ if UI == "MVC" || UI == "BlazorServer" }} +> **Note**: Before starting the application, run `abp install-libs` command in your Web directory to restore the client-side libraries. This will populate the `libs` folder. + {{ if Tiered == "Yes" }} > Tiered solutions use **Redis** as the distributed cache. Ensure that it is installed and running in your local computer. If you are using a remote Redis Server, set the configuration in the `appsettings.json` files of the projects below. diff --git a/docs/en/Image-Manipulation.md b/docs/en/Image-Manipulation.md index 1050b6005e..9d946e31dd 100644 --- a/docs/en/Image-Manipulation.md +++ b/docs/en/Image-Manipulation.md @@ -76,8 +76,8 @@ public interface IImageResizer **Example usage:** ```csharp -var result = await _imageResizer.ResizeAsync( - stream, /* A stream object that represents an image */ +var resizeResult = await _imageResizer.ResizeAsync( + imageStream, /* A stream object that represents an image */ new ImageResizeArgs { Width = 100, @@ -88,6 +88,16 @@ var result = await _imageResizer.ResizeAsync( ); ``` +> **Note:** If `resizeResult.State` returns 'Done', then it means that the resize operation was successful. However, if it returns any other state than 'Done', the stream you're using might be corrupted. Therefore, you can perform a check like the one below and assign the correct stream to the main stream: + +```csharp +if (resizeResult.Result is not null && imageStream != resizeResult.Result && resizeResult.Result.CanRead) +{ + await imageStream.DisposeAsync(); + imageStream = resizeResult.Result; +} +``` + > You can use `MimeTypes.Image.Jpeg` constant instead of the `image/jpeg` magic string used in that example. ### ImageResizeArgs @@ -170,12 +180,23 @@ public interface IImageCompressor **Example usage:** ```csharp -var result = await _imageCompressor.CompressAsync( - stream, /* A stream object that represents an image */ +var compressResult = await _imageCompressor.CompressAsync( + imageStream, /* A stream object that represents an image */ mimeType: "image/jpeg" ); ``` +> **Note:** If `compressResult.State` returns 'Done', then it means that the compression operation was successful. However, if it returns any other state than 'Done', the stream you're using might be corrupted. Therefore, you can perform a check like the one below and assign the correct stream to the main stream: + +```csharp + +if (compressResult.Result is not null && imageStream != compressResult.Result && compressResult.Result.CanRead) +{ + await imageStream.DisposeAsync(); + imageStream = compressResult.Result; +} +``` + ### ImageCompressResult The `ImageCompressResult` is a generic class that is used to return the result of the image compression operations. It has the following properties: diff --git a/docs/en/Migration-Guides/Abp-7_3.md b/docs/en/Migration-Guides/Abp-7_3.md index 9e09306ca3..1d8e5b1e36 100644 --- a/docs/en/Migration-Guides/Abp-7_3.md +++ b/docs/en/Migration-Guides/Abp-7_3.md @@ -25,4 +25,7 @@ This feature comes with a small restriction. If you use any C# code used inside For example, `` will no longer work. However, you can use the C# code for an attribute of script tag, for example, `` is completely valid and won't cause any problem. -> Note: You should not use any C# code used inside the script tag, even if you don't use this feature. Because it might cause errors. \ No newline at end of file +> Note: You should not use any C# code used inside the script tag, even if you don't use this feature. Because it might cause errors. + +## Angular UI +We would like to inform you that ABP Framework version 7.3 uses Angular version 16. Please migrate your applications to Angular 16. [Update angular](https://update.angular.io/) \ No newline at end of file diff --git a/docs/en/Migration-Guides/Abp-7_4.md b/docs/en/Migration-Guides/Abp-7_4.md index 0c69dda74e..ee72da812f 100644 --- a/docs/en/Migration-Guides/Abp-7_4.md +++ b/docs/en/Migration-Guides/Abp-7_4.md @@ -114,3 +114,6 @@ The following packages are included in the templates by default: ### Bumped the `Microsoft.AspNetCore.Components.*` dependency to `7.0.10` In this version, the `Microsoft.AspNetCore.Components.*` dependencies are upgraded to the `7.0.10` version. Therefore, you should upgrade the `Microsoft.AspNetCore.Components.Web` and `Microsoft.AspNetCore.Components.WebAssembly` packages to `7.0.10` in your `Blazor.csproj` file. + +## Angular UI +We would like to inform you that ABP Framework version 7.4 uses Angular version 16. Please migrate your applications to Angular 16. [Update angular](https://update.angular.io/) \ No newline at end of file diff --git a/docs/en/Migration-Guides/Abp-8_0.md b/docs/en/Migration-Guides/Abp-8_0.md index e90d9f04f0..108de6ba98 100644 --- a/docs/en/Migration-Guides/Abp-8_0.md +++ b/docs/en/Migration-Guides/Abp-8_0.md @@ -66,7 +66,7 @@ The following NuGet libraries have been upgraded: | Serilog.Sinks.Async | 1.4.0 | 1.5.0 | | SharpZipLib | 1.3.3 | 1.4.2 | | Shouldly | 4.1.0 | 4.2.1 | -| SixLabors.ImageSharp | 1.0.4 | 2.1.6 | +| SixLabors.ImageSharp | 1.0.4 | 3.0.2 | | Slugify.Core | 3.0.0 | 4.0.1 | | Spectre.Console | 0.46.1-preview.0.7 | 0.47.0 | | Swashbuckle.AspNetCore | 6.2.1 | 6.5.0 | diff --git a/docs/en/Modules/Cms-Kit/Blogging.md b/docs/en/Modules/Cms-Kit/Blogging.md index d45598be52..eb6619a4bc 100644 --- a/docs/en/Modules/Cms-Kit/Blogging.md +++ b/docs/en/Modules/Cms-Kit/Blogging.md @@ -29,7 +29,16 @@ A screenshot from the new blog creation modal: ![blogs-edit](../../images/cmskit-module-blogs-edit.png) -**Slug** is the URL part of the blog. For this example, the root URL of the blog becomes *https://your-domain.com/blogs/technical-blog/*. +**Slug** is the URL part of the blog. For this example, the root URL of the blog becomes `your-domain.com/blogs/technical-blog/`. + +- You can change the default slug by using `CmsBlogsWebConsts.BlogRoutePrefix` constant. For example, if you set it to `foo`, the root URL of the blog becomes `your-domain.com/foo/technical-blog/`. + + ```csharp + public override void PreConfigureServices(ServiceConfigurationContext context) + { + CmsBlogsWebConsts.BlogsRoutePrefix = "foo"; + } + ``` #### Blog Features diff --git a/docs/en/Modules/Cms-Kit/Comments.md b/docs/en/Modules/Cms-Kit/Comments.md index cc8d01249b..ddd39fc675 100644 --- a/docs/en/Modules/Cms-Kit/Comments.md +++ b/docs/en/Modules/Cms-Kit/Comments.md @@ -53,6 +53,7 @@ The comment system provides a commenting [widget](../../UI/AspNetCore/Widgets.md { entityType = "Product", entityId = "...", + isReadOnly = false, referralLinks = new [] {"nofollow"} }) ``` diff --git a/docs/en/Modules/Cms-Kit/Pages.md b/docs/en/Modules/Cms-Kit/Pages.md index cc1f5074f4..04614dd74a 100644 --- a/docs/en/Modules/Cms-Kit/Pages.md +++ b/docs/en/Modules/Cms-Kit/Pages.md @@ -22,13 +22,13 @@ CMS Kit module admin side adds the following items to the main menu, under the * #### Page Management -Pages page is used to manage dynamic pages in the system. +**Pages** page is used to manage dynamic pages in the system. You can create/edit pages with dynamic routes and contents on this page: -![pages-page](../../images/cmskit-module-pages-page.png) +![pages-edit](../../images/cmskit-module-pages-edit.png) -You can create or edit an existing page on this page. +After you have created pages, you can set one of them as a *home page*. Then, whenever anyone navigates to your application's homepage, they see the dynamic content of the page that you have defined on this page. -![pages-edit](../../images/cmskit-module-pages-edit.png) +![pages-page](../../images/cmskit-module-pages-page.png) -When you create a page, you can access the created page via `/{slug}` URL. +Also when you create a page, you can access the created page via `/{slug}` URL. diff --git a/docs/en/Modules/Cms-Kit/Ratings.md b/docs/en/Modules/Cms-Kit/Ratings.md index db58602c15..e6a2ba97fd 100644 --- a/docs/en/Modules/Cms-Kit/Ratings.md +++ b/docs/en/Modules/Cms-Kit/Ratings.md @@ -41,7 +41,8 @@ The ratings system provides a rating widget to allow users send ratings to resou @await Component.InvokeAsync(typeof(RatingViewComponent), new { entityType = "Product", - entityId = "entityId" + entityId = "entityId", + isReadOnly = false }) ``` diff --git a/docs/en/Startup-Templates/Application.md b/docs/en/Startup-Templates/Application.md index 0c5e9c4c38..fdb7569ca0 100644 --- a/docs/en/Startup-Templates/Application.md +++ b/docs/en/Startup-Templates/Application.md @@ -316,7 +316,7 @@ You should add `routes` property in the `data` object to add a link on the menu { path: 'dashboard', loadChildren: () => import('./dashboard/dashboard.module').then(m => m.DashboardModule), - canActivate: [AuthGuard, PermissionGuard], + canActivate: [authGuard, permissionGuard], data: { routes: { name: 'ProjectName::Menu:Dashboard', @@ -328,7 +328,7 @@ You should add `routes` property in the `data` object to add a link on the menu } ``` In the above example; -* If the user is not logged in, AuthGuard blocks access and redirects to the login page. +* If the user is not logged in, authGuard blocks access and redirects to the login page. * PermissionGuard checks the user's permission with the `requiredPolicy` property of the `routes` object. If the user is not authorized to access the page, the 403 page appears. * The `name` property of `routes` is the menu link label. A localization key can be defined. * The `iconClass` property of the `routes` object is the menu link icon class. diff --git a/docs/en/Timing.md b/docs/en/Timing.md index fce17de4cf..9b3eb0cca9 100644 --- a/docs/en/Timing.md +++ b/docs/en/Timing.md @@ -102,7 +102,7 @@ This section covers the ABP Framework infrastructure related to managing time zo ### TimeZone Setting -ABP Framework defines **a setting**, named `Abp.Timing.Timezone`, that can be used to set and get the time zone for a user, [tenant](Multi-Tenancy.md) or globally for the application. The default value is `UTC`. +ABP Framework defines **a setting**, named `Abp.Timing.TimeZone`, that can be used to set and get the time zone for a user, [tenant](Multi-Tenancy.md) or globally for the application. The default value is `UTC`. See the [setting documentation](Settings.md) to learn more about the setting system. diff --git a/docs/en/Tutorials/Part-1.md b/docs/en/Tutorials/Part-1.md index 0ed26ce557..6795204936 100644 --- a/docs/en/Tutorials/Part-1.md +++ b/docs/en/Tutorials/Part-1.md @@ -66,7 +66,7 @@ abp install-libs > We suggest you install [Yarn](https://classic.yarnpkg.com/) to prevent possible package inconsistencies, if you haven't installed it yet. -{{if UI=="Blazor" || UI="BlazorServer"}} +{{if UI=="Blazor" || UI=="BlazorServer"}} ### Bundling and Minification diff --git a/docs/en/Tutorials/Part-5.md b/docs/en/Tutorials/Part-5.md index f33a41f392..f306b7f4a2 100644 --- a/docs/en/Tutorials/Part-5.md +++ b/docs/en/Tutorials/Part-5.md @@ -323,11 +323,11 @@ Open the `/src/app/book/book-routing.module.ts` and replace with the following c ````js import { NgModule } from '@angular/core'; import { Routes, RouterModule } from '@angular/router'; -import { AuthGuard, PermissionGuard } from '@abp/ng.core'; +import { authGuard, permissionGuard } from '@abp/ng.core'; import { BookComponent } from './book.component'; const routes: Routes = [ - { path: '', component: BookComponent, canActivate: [AuthGuard, PermissionGuard] }, + { path: '', component: BookComponent, canActivate: [authGuard, permissionGuard] }, ]; @NgModule({ @@ -337,8 +337,8 @@ const routes: Routes = [ export class BookRoutingModule {} ```` -* Imported `AuthGuard` and `PermissionGuard` from the `@abp/ng.core`. -* Added `canActivate: [AuthGuard, PermissionGuard]` to the route definition. +* Imported `authGuard` and `permissionGuard` from the `@abp/ng.core`. +* Added `canActivate: [authGuard, permissionGuard]` to the route definition. Open the `/src/app/route.provider.ts` and add `requiredPolicy: 'BookStore.Books'` to the `/books` route. The `/books` route block should be following: diff --git a/docs/en/Tutorials/Todo/Index.md b/docs/en/Tutorials/Todo/Index.md index 0a0a080d8e..f316a9b7ed 100644 --- a/docs/en/Tutorials/Todo/Index.md +++ b/docs/en/Tutorials/Todo/Index.md @@ -113,7 +113,7 @@ abp install-libs > We suggest you install [Yarn](https://classic.yarnpkg.com/) to prevent possible package inconsistencies, if you haven't installed it yet. -{{if UI=="Blazor" || UI="BlazorServer"}} +{{if UI=="Blazor" || UI=="BlazorServer"}} #### Bundling and Minification diff --git a/docs/en/Tutorials/Todo/Single-Layer/Index.md b/docs/en/Tutorials/Todo/Single-Layer/Index.md index e08acb1167..ff075e613d 100644 --- a/docs/en/Tutorials/Todo/Single-Layer/Index.md +++ b/docs/en/Tutorials/Todo/Single-Layer/Index.md @@ -117,7 +117,7 @@ abp install-libs > We suggest you install [Yarn](https://classic.yarnpkg.com/) to prevent possible package inconsistencies, if you haven't installed it yet. -{{if UI=="Blazor" || UI="BlazorServer"}} +{{if UI=="Blazor" || UI=="BlazorServer"}} #### Bundling and Minification diff --git a/docs/en/UI/Angular/Data-Table-Column-Extensions.md b/docs/en/UI/Angular/Data-Table-Column-Extensions.md index 6f1367d934..7660ec5550 100644 --- a/docs/en/UI/Angular/Data-Table-Column-Extensions.md +++ b/docs/en/UI/Angular/Data-Table-Column-Extensions.md @@ -1,6 +1,5 @@ # Data Table Column (or Entity Prop) Extensions for Angular UI - ## Introduction Entity prop extension system allows you to add a new column to the data table for an entity or change/remove an already existing one. A "Name" column was added to the user management page below: @@ -196,6 +195,14 @@ type PropCallback = (data?: PropData) => R; type PropPredicate = (data?: PropData) => boolean; ``` +### ColumnPredicate + +`ColumnPredicate` is the type of the predicate function that can be passed to an `EntityProp` as `columnVisible` parameter. A column predicate gets a single parameter, the `GetInjected`, you can use the `GetInjected` parameter to reach injected `Service` or `Component`. The return type must be `boolean`. Here is a simplified representation: + +```js +type ColumnPredicate = (getInjected: GetInjected) => boolean; +``` + ### EntityPropOptions\ `EntityPropOptions` is the type that defines required and optional properties you have to pass in order to create an entity prop. @@ -212,6 +219,7 @@ type EntityPropOptions = { columnWidth?: number; permission?: string; visible?: PropPredicate; + columnVisible?: ColumnPredicate; }; ``` @@ -224,9 +232,12 @@ As you see, passing `type` and `name` is enough to create an entity prop. Here i - **sortable** defines if the table is sortable based on this entity prop. Sort icons are shown based on it. (_default:_ `false`) - **columnWidth** defines a minimum width for the column. Good for horizontal scroll. (_default:_ `undefined`) - **permission** is the permission context which will be used to decide if a column for this entity prop should be displayed to the user or not. (_default:_ `undefined`) -- **visible** is a predicate that will be used to decide if this entity prop should be displayed on the table or not. (_default:_ `() => true`) +- **visible** is a predicate that will be used to decide if the cell content of this entity prop should be displayed on the table or not based on the data record. (_default:_ `() => true`) +- **columnVisible** is a predicate that will be used to decide if the column of this entity prop should be displayed on the table or not. (_default:_ `() => true`) > Important Note: Do not use record in visibility predicates. First of all, the table header checks it too and the record will be `undefined`. Second, if some cells are displayed and others are not, the table will be broken. Use the `valueResolver` and render an empty cell when you need to hide a specific cell. +> +> `visible` predicate only hide the cell content, not the column. Use `columnVisible` to hide the entire column. You may find a full example below. @@ -257,6 +268,10 @@ const options: EntityPropOptions = { return store.selectSnapshot(selectSensitiveDataVisibility).toLowerCase() === 'true'; } + columnVisible: getInjected => { + const sessionStateService = getInjected(SessionStateService); + return !sessionStateService.getTenant()?.isAvailable; // hide this column when the tenant is available. + }, }; const prop = new EntityProp(options); @@ -281,19 +296,19 @@ The items in the list will be displayed according to the linked list order, i.e. ```js export function reorderUserContributors( - propList: EntityPropList, + propList: EntityPropList ) { // drop email node const emailPropNode = propList.dropByValue( 'AbpIdentity::EmailAddress', - (prop, text) => prop.text === text, + (prop, text) => prop.text === text ); // add it back after phoneNumber propList.addAfter( emailPropNode.value, 'phoneNumber', - (value, name) => value.name === name, + (value, name) => value.name === name ); } ``` @@ -304,7 +319,7 @@ export function reorderUserContributors( ```js export function isLockedOutPropContributor( - propList: EntityPropList, + propList: EntityPropList ) { // add isLockedOutProp as 2nd column propList.add(isLockedOutProp).byIndex(1); diff --git a/docs/en/UI/Angular/Entity-Action-Extensions.md b/docs/en/UI/Angular/Entity-Action-Extensions.md index 3ab035b04a..d93b2045f6 100644 --- a/docs/en/UI/Angular/Entity-Action-Extensions.md +++ b/docs/en/UI/Angular/Entity-Action-Extensions.md @@ -16,19 +16,16 @@ In this example, we will add a "Click Me!" action and alert the current row's `u The following code prepares a constant named `identityEntityActionContributors`, ready to be imported and used in your root module: -```js +```ts // src/app/entity-action-contributors.ts -import { - eIdentityComponents, - IdentityEntityActionContributors, - IdentityUserDto, -} from '@abp/ng.identity'; +import { eIdentityComponents, IdentityEntityActionContributors } from '@abp/ng.identity'; +import { IdentityUserDto } from '@abp/ng.identity/proxy'; import { EntityAction, EntityActionList } from '@abp/ng.theme.shared/extensions'; const alertUserName = new EntityAction({ text: 'Click Me!', - action: data => { + action: (data) => { // Replace alert with your custom code alert(data.record.userName); }, diff --git a/docs/en/UI/Angular/OAuth-Module.md b/docs/en/UI/Angular/OAuth-Module.md index e7a62d1d2e..b747c5221d 100644 --- a/docs/en/UI/Angular/OAuth-Module.md +++ b/docs/en/UI/Angular/OAuth-Module.md @@ -6,7 +6,6 @@ If your app is version 7.0 or higher, you should include "AbpOAuthModule.forRoot Those abstractions can be found in the @abp/ng-core packages. - `AuthService` (the class that implements the IAuthService interface). - `NAVIGATE_TO_MANAGE_PROFILE` Inject token. -- `AuthGuard` (the class that implements the IAuthGuard interface). - `ApiInterceptor` (the class that implements the IApiInterceptor interface). Those base classes are overridden by the "AbpOAuthModule" for oAuth. There are also three functions provided with AbpOAuthModule. diff --git a/docs/en/UI/Angular/Permission-Management.md b/docs/en/UI/Angular/Permission-Management.md index dd373d6274..63d919f599 100644 --- a/docs/en/UI/Angular/Permission-Management.md +++ b/docs/en/UI/Angular/Permission-Management.md @@ -54,20 +54,20 @@ As shown above you can remove elements from DOM with `abpPermission` structural ## Permission Guard -You can use `PermissionGuard` if you want to control authenticated user's permission to access to the route during navigation. +You can use `permissionGuard` if you want to control authenticated user's permission to access to the route during navigation. * Import the PermissionGuard from @abp/ng.core. -* Add `canActivate: [PermissionGuard]` to your route object. +* Add `canActivate: [permissionGuard]` to your route object. * Add `requiredPolicy` to the `data` property of your route in your routing module. ```js -import { PermissionGuard } from '@abp/ng.core'; +import { permissionGuard } from '@abp/ng.core'; // ... const routes: Routes = [ { path: 'path', component: YourComponent, - canActivate: [PermissionGuard], + canActivate: [permissionGuard], data: { requiredPolicy: 'YourProjectName.YourComponent', // policy key for your component }, diff --git a/docs/en/UI/Angular/Service-Proxies.md b/docs/en/UI/Angular/Service-Proxies.md index 6cd79505c2..43b8dc8b0f 100644 --- a/docs/en/UI/Angular/Service-Proxies.md +++ b/docs/en/UI/Angular/Service-Proxies.md @@ -73,6 +73,16 @@ export const environment: Config.Environment = { > The destination the `proxy` folder is created and the paths above may change based on your project structure. +## Parameters of generate-proxy + +- **module or -m:** The backend module name. The default is `app`. The object key of the modules defined in response of `api/abp/api-definition`. For example, if you want to generate-proxy of PermissionManagement, you should pass `permissionManagement` as a value. +- **apiName or -a:** The Backend api name, also known as remoteServiceName. It is defined in the selected module (in response of `api/abp/api-definition`). The property(key) name is `remoteServiceName`. For example for the PermissionManagement, you should pass `AbpPermissionManagement` +- **source:** Source of the Angular project for the API definition URL & root namespace resolution. +- **target:** Target for the Angular project to place the generated code. For example, if it's `permission-management`, it'll look like this (npm/ng-packs/packages/*permission-management*). +- **entryPoint:** To create the generated proxy folder in the target. The directory is `permission-management/proxy/src/lib/proxy` and the `permission-management` is the value of target. If you want to create a folder for the generated proxy, there are two options, you should either set the value `proxy` as the entryPoint or go to project.json and change the `sourceRoot` from `packages/permission-management/src` to `packages/permission-management/proxy/src`. No need to change the sourceRoot of project with the property. if you keep it empty, the proxy will be generated into the folder defined in the sourceRoot property. +- **serviceType:** The service type of the generated proxy. The options are `application`, `integration` and `all`. The default value is `application`. A developer can mark a service "integration service". If you want to skip proxy generation for the service, then this is the correct setting. More info about [Integration Services](../../Integration-Services) + + ### Services The `generate-proxy` command generates one service per back-end controller and a method (property with a function value actually) for each action in the controller. These methods call backend APIs via [RestService](./Http-Requests#restservice). diff --git a/docs/en/UI/AspNetCore/Bundling-Minification.md b/docs/en/UI/AspNetCore/Bundling-Minification.md index dd2282c883..6164d00c7d 100644 --- a/docs/en/UI/AspNetCore/Bundling-Minification.md +++ b/docs/en/UI/AspNetCore/Bundling-Minification.md @@ -382,6 +382,83 @@ Configure(options => ```` +### External/CDN file Support + +The bundling system automatically recognizes the external/CDN files and adds them to the page without any change. + +#### Using External/CDN files in `AbpBundlingOptions` + +````csharp +Configure(options => +{ + options.StyleBundles + .Add("MyStyleBundle", configuration => + { + configuration + .AddFiles("/styles/my-style1.css") + .AddFiles("/styles/my-style2.css") + .AddFiles("https://cdn.abp.io/bootstrap.css") + .AddFiles("/styles/my-style3.css") + .AddFiles("/styles/my-style4.css"); + }); + + options.ScriptBundles + .Add("MyScriptBundle", configuration => + { + configuration + .AddFiles("/scripts/my-script1.js") + .AddFiles("/scripts/my-script2.js") + .AddFiles("https://cdn.abp.io/bootstrap.js") + .AddFiles("/scripts/my-script3.js") + .AddFiles("/scripts/my-script4.js"); + }); +}); +```` + +**Output HTML:** + +````html + + + + + + + +```` + +#### Using External/CDN files in Tag Helpers. + +````html + + + + + + + + + + + + + + + +```` + +**Output HTML:** + +````html + + + + + + + +```` + ## Themes Themes uses the standard package contributors to add library resources to page layouts. Themes may also define some standard/global bundles, so any module can contribute to these standard/global bundles. See the [theming documentation](Theming.md) for more. diff --git a/docs/en/docs-nav.json b/docs/en/docs-nav.json index 582dcf98cc..fa0a98915a 100644 --- a/docs/en/docs-nav.json +++ b/docs/en/docs-nav.json @@ -1363,6 +1363,10 @@ "text": "Deployment", "path": "Deployment/Index.md", "items": [ + { + "text": "Configuring SSL certificate(HTTPS)", + "path": "Deployment/SSL.md" + }, { "text": "Configuring OpenIddict", "path": "Deployment/Configuring-OpenIddict.md" diff --git a/docs/en/images/cmskit-module-pages-page.png b/docs/en/images/cmskit-module-pages-page.png index b64915493c..5265577565 100644 Binary files a/docs/en/images/cmskit-module-pages-page.png and b/docs/en/images/cmskit-module-pages-page.png differ diff --git a/docs/zh-Hans/Startup-Templates/Application.md b/docs/zh-Hans/Startup-Templates/Application.md index 91d7308226..d6733b8633 100644 --- a/docs/zh-Hans/Startup-Templates/Application.md +++ b/docs/zh-Hans/Startup-Templates/Application.md @@ -302,7 +302,7 @@ ABP 配置模块也已经导入到 `AppModule` 中, 以满足可延迟加载 ABP { path: 'dashboard', loadChildren: () => import('./dashboard/dashboard.module').then(m => m.DashboardModule), - canActivate: [AuthGuard, PermissionGuard], + canActivate: [authGuard, permissionGuard], data: { routes: { name: 'ProjectName::Menu:Dashboard', @@ -315,7 +315,7 @@ ABP 配置模块也已经导入到 `AppModule` 中, 以满足可延迟加载 ABP ``` 在上面的例子中; * 如果用户没有登录, AuthGuard 会阻塞访问并重定向到登录页面. -* PermissionGuard 使用 `rotues` 对象的 `requiredPolicy` 属性检查用户的权限. 如果用户未被授权访问该页, 则显示403页. +* permissionGuard 使用 `rotues` 对象的 `requiredPolicy` 属性检查用户的权限. 如果用户未被授权访问该页, 则显示403页. * `routes` 的 `name` 属性是菜单链接标签. 可以定义本地化 key. * `routes` 对象的 `iconClass` 属性是菜单链接图标类. * `routes` 对象的 `requiredPolicy` 属性是访问页面所需的策略 key. diff --git a/docs/zh-Hans/Timing.md b/docs/zh-Hans/Timing.md index 71ddbb9058..1d220a7aad 100644 --- a/docs/zh-Hans/Timing.md +++ b/docs/zh-Hans/Timing.md @@ -102,7 +102,7 @@ var normalizedDateTime = Clock.Normalize(dateTime) ### 时区设置 -ABP框架定义了一个名为 `Abp.Timing.Timezone` 的**设置**,可用于为应用程序的用户,[租户](Multi-Tenancy.md)或全局设置和获取时区. 默认值为 `UTC`. +ABP框架定义了一个名为 `Abp.Timing.TimeZone` 的**设置**,可用于为应用程序的用户,[租户](Multi-Tenancy.md)或全局设置和获取时区. 默认值为 `UTC`. 参阅[设置系统]了解更多关于设置系统. @@ -110,4 +110,4 @@ ABP框架定义了一个名为 `Abp.Timing.Timezone` 的**设置**,可用于为 `ITimezoneProvider` 是一个服务,可将[Windows时区ID](https://support.microsoft.com/en-us/help/973627/microsoft-time-zone-index-values)值简单转换为[Iana时区名称](https://www.iana.org/time-zones)值,反之亦然. 它还提供了获取这些时区列表与获取具有给定名称的 `TimeZoneInfo` 的方法. -它已使用[TimeZoneConverter](https://github.com/mj1856/TimeZoneConverter)库实现. \ No newline at end of file +它已使用[TimeZoneConverter](https://github.com/mj1856/TimeZoneConverter)库实现. diff --git a/docs/zh-Hans/Tutorials/Part-5.md b/docs/zh-Hans/Tutorials/Part-5.md index 5bdad55c1c..ec308f3ee7 100644 --- a/docs/zh-Hans/Tutorials/Part-5.md +++ b/docs/zh-Hans/Tutorials/Part-5.md @@ -389,11 +389,11 @@ UI的第一步是防止未认证用户看见"图书"菜单项并进入图书管 ````js import { NgModule } from '@angular/core'; import { Routes, RouterModule } from '@angular/router'; -import { AuthGuard, PermissionGuard } from '@abp/ng.core'; +import { authGuard, permissionGuard } from '@abp/ng.core'; import { BookComponent } from './book.component'; const routes: Routes = [ - { path: '', component: BookComponent, canActivate: [AuthGuard, PermissionGuard] }, + { path: '', component: BookComponent, canActivate: [authGuard, permissionGuard] }, ]; @NgModule({ @@ -403,8 +403,8 @@ const routes: Routes = [ export class BookRoutingModule {} ```` -* 从 `@abp/ng.core` 引入 `AuthGuard` 和 `PermissionGuard`. -* 在路由定义中添加 `canActivate: [AuthGuard, PermissionGuard]`. +* 从 `@abp/ng.core` 引入 `authGuard` 和 `permissionGuard`. +* 在路由定义中添加 `canActivate: [authGuard, permissionGuard]`. 打开 `/src/app/route.provider.ts`, 在 `/books` 路由中添加 `requiredPolicy: 'BookStore.Books'`. `/books` 路由应该如以下配置: diff --git a/docs/zh-Hans/UI/Angular/Permission-Management.md b/docs/zh-Hans/UI/Angular/Permission-Management.md index 08496f03fe..05e3dacbf1 100644 --- a/docs/zh-Hans/UI/Angular/Permission-Management.md +++ b/docs/zh-Hans/UI/Angular/Permission-Management.md @@ -53,20 +53,20 @@ export class YourComponent { ## 权限守卫 -如果你想要在导航过程中控制经过身份验证的用户对路由的访问权限,可以使用 `PermissionGuard`. +如果你想要在导航过程中控制经过身份验证的用户对路由的访问权限,可以使用 `permissionGuard`. -* 从@abp/ng.core导入PermissionGuard. -* 添加 `canActivate: [PermissionGuard]` 到你的路由对象. +* 从@abp/ng.core导入permissionGuard. +* 添加 `canActivate: [permissionGuard]` 到你的路由对象. * 添加 `requiredPolicy` 到路由模块路由的 `data` 属性. ```js -import { PermissionGuard } from '@abp/ng.core'; +import { permissionGuard } from '@abp/ng.core'; // ... const routes: Routes = [ { path: 'path', component: YourComponent, - canActivate: [PermissionGuard], + canActivate: [permissionGuard], data: { requiredPolicy: 'YourProjectName.YourComponent', // policy key for your component }, diff --git a/docs/zh-Hans/UI/AspNetCore/Bundling-Minification.md b/docs/zh-Hans/UI/AspNetCore/Bundling-Minification.md index 338afe8967..72bee2eedb 100644 --- a/docs/zh-Hans/UI/AspNetCore/Bundling-Minification.md +++ b/docs/zh-Hans/UI/AspNetCore/Bundling-Minification.md @@ -353,6 +353,83 @@ services.Configure(options => }); ```` +### 外部/CDN文件支持 + +捆绑系统会自动识别外部/CDN文件,并将其添加到页面中,无需进行任何更改。 + +#### 在`AbpBundlingOptions`中添加外部/CDN文件 + +````csharp +Configure(options => +{ + options.StyleBundles + .Add("MyStyleBundle", configuration => + { + configuration + .AddFiles("/styles/my-style1.css") + .AddFiles("/styles/my-style2.css") + .AddFiles("https://cdn.abp.io/bootstrap.css") + .AddFiles("/styles/my-style3.css") + .AddFiles("/styles/my-style4.css"); + }); + + options.ScriptBundles + .Add("MyScriptBundle", configuration => + { + configuration + .AddFiles("/scripts/my-script1.js") + .AddFiles("/scripts/my-script2.js") + .AddFiles("https://cdn.abp.io/bootstrap.js") + .AddFiles("/scripts/my-script3.js") + .AddFiles("/scripts/my-script4.js"); + }); +}); +```` + +**输出HTMl:** + +````html + + + + + + + +```` + +#### 在TagHelpers中添加外部/CDN文件 + +````html + + + + + + + + + + + + + + + +```` + +**输出HTMl:** + +````html + + + + + + + +```` + ### 主题 主题使用标准包贡献者将库资源添加到页面布局. 主题还可以定义一些标准/全局包, 因此任何模块都可以为这些标准/全局包做出贡献. 有关更多信息, 请参阅[主题文档](Theming.md). diff --git a/framework/src/Volo.Abp.AspNetCore.Components.Server.Theming/Bundling/BlazorGlobalStyleContributor.cs b/framework/src/Volo.Abp.AspNetCore.Components.Server.Theming/Bundling/BlazorGlobalStyleContributor.cs index 3223be417c..3a94e1a568 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.Server.Theming/Bundling/BlazorGlobalStyleContributor.cs +++ b/framework/src/Volo.Abp.AspNetCore.Components.Server.Theming/Bundling/BlazorGlobalStyleContributor.cs @@ -17,5 +17,6 @@ public class BlazorGlobalStyleContributor : BundleContributor context.Files.AddIfNotContains("/_content/Blazorise/blazorise.css"); context.Files.AddIfNotContains("/_content/Blazorise.Bootstrap5/blazorise.bootstrap5.css"); context.Files.AddIfNotContains("/_content/Blazorise.Snackbar/blazorise.snackbar.css"); + context.Files.AddIfNotContains("/_content/Volo.Abp.BlazoriseUI/volo.abp.blazoriseui.css"); } } diff --git a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly.Theming/ComponentsComponentsBundleContributor.cs b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly.Theming/ComponentsComponentsBundleContributor.cs index 61f42e8222..45b06e5484 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly.Theming/ComponentsComponentsBundleContributor.cs +++ b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly.Theming/ComponentsComponentsBundleContributor.cs @@ -26,5 +26,6 @@ public class ComponentsComponentsBundleContributor : IBundleContributor context.Add("_content/Blazorise/blazorise.css"); context.Add("_content/Blazorise.Bootstrap5/blazorise.bootstrap5.css"); context.Add("_content/Blazorise.Snackbar/blazorise.snackbar.css"); + context.Add("_content/Volo.Abp.BlazoriseUI/volo.abp.blazoriseui.css"); } } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Card/AbpCardTagHelper.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Card/AbpCardTagHelper.cs index 5b568e16a6..dee16585b7 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Card/AbpCardTagHelper.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Card/AbpCardTagHelper.cs @@ -4,6 +4,8 @@ public class AbpCardTagHelper : AbpTagHelper public override void Process(TagHelperContext context, TagHelperOutput output) { output.TagName = "div"; - output.Attributes.AddClass("card mb-3"); + output.Attributes.AddClass("card"); + if (TagHelper.AddMarginBottomClass) + { + output.Attributes.AddClass("mb-3"); + } SetBorder(context, output); } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpInputTagHelper.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpInputTagHelper.cs index a426b50d33..62cae94413 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpInputTagHelper.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpInputTagHelper.cs @@ -52,6 +52,8 @@ public class AbpInputTagHelper : AbpTagHelper { output.Attributes.AddClass("form-floating"); } - output.Attributes.AddClass(isCheckBox ? "mb-2" : "mb-3"); + if (TagHelper.AddMarginBottomClass) + { + output.Attributes.AddClass(isCheckBox ? "mb-2" : "mb-3"); + } if (isCheckBox) { output.Attributes.AddClass("custom-checkbox"); @@ -110,7 +113,8 @@ public class AbpInputTagHelperService : AbpTagHelperService protected virtual string SurroundInnerHtmlAndGet(TagHelperContext context, TagHelperOutput output, string innerHtml, bool isCheckbox) { - return "
" + + var mb = TagHelper.AddMarginBottomClass ? (isCheckbox ? "mb-2" : "mb-3") : string.Empty; + return "
" + Environment.NewLine + innerHtml + Environment.NewLine + "
"; } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpSelectTagHelper.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpSelectTagHelper.cs index 7d11f69636..dbcf84437f 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpSelectTagHelper.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpSelectTagHelper.cs @@ -37,7 +37,7 @@ public class AbpSelectTagHelper : AbpTagHelper { output.Attributes.AddClass("form-floating"); } - output.Attributes.AddClass("mb-3"); + + if (TagHelper.AddMarginBottomClass) + { + output.Attributes.AddClass("mb-3"); + } output.TagMode = TagMode.StartTagAndEndTag; output.Content.SetHtmlContent(innerHtml); } @@ -79,7 +83,8 @@ public class AbpSelectTagHelperService : AbpTagHelperService protected virtual string SurroundInnerHtmlAndGet(TagHelperContext context, TagHelperOutput output, string innerHtml) { - return "
" + Environment.NewLine + innerHtml + Environment.NewLine + "
"; + var mb3 = TagHelper.AddMarginBottomClass ? "mb-3" : string.Empty; + return $"
" + Environment.NewLine + innerHtml + Environment.NewLine + "
"; } protected virtual async Task GetSelectTagAsync(TagHelperContext context, TagHelperOutput output, TagHelperContent childContent) diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDatePickerBaseTagHelper.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDatePickerBaseTagHelper.cs index fed2981613..079431c9c6 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDatePickerBaseTagHelper.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDatePickerBaseTagHelper.cs @@ -21,20 +21,20 @@ public abstract class public bool LabelTooltipHtml { get; set; } = false; - [HtmlAttributeName("info")] + [HtmlAttributeName("info")] public string? InfoText { get; set; } - [HtmlAttributeName("disabled")] + [HtmlAttributeName("disabled")] public bool IsDisabled { get; set; } = false; - [HtmlAttributeName("readonly")] + [HtmlAttributeName("readonly")] public bool? IsReadonly { get; set; } = false; public bool AutoFocus { get; set; } public AbpFormControlSize Size { get; set; } = AbpFormControlSize.Default; - [HtmlAttributeName("required-symbol")] + [HtmlAttributeName("required-symbol")] public bool DisplayRequiredSymbol { get; set; } = true; public string? Name { get; set; } @@ -43,11 +43,13 @@ public abstract class public bool SuppressLabel { get; set; } + public bool AddMarginBottomClass { get; set; } = true; + protected AbpDatePickerBaseTagHelper(AbpDatePickerBaseTagHelperService service) : base(service) { _abpDatePickerOptionsImplementation = new AbpDatePickerOptions(); } - + public void SetDatePickerOptions(IAbpDatePickerOptions options) { _abpDatePickerOptionsImplementation = options; @@ -217,4 +219,4 @@ public abstract class get => _abpDatePickerOptionsImplementation.Options; set => _abpDatePickerOptionsImplementation.Options = value; } -} \ No newline at end of file +} diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDatePickerBaseTagHelperService.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDatePickerBaseTagHelperService.cs index 024fd4dd45..54e8720b17 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDatePickerBaseTagHelperService.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDatePickerBaseTagHelperService.cs @@ -22,7 +22,7 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form.DatePicker; public abstract class AbpDatePickerBaseTagHelperService : AbpTagHelperService where TTagHelper : AbpDatePickerBaseTagHelper { - protected readonly Dictionary> SupportedInputTypes = new() + protected readonly Dictionary> SupportedInputTypes = new() { { typeof(string), o => @@ -42,7 +42,7 @@ public abstract class AbpDatePickerBaseTagHelperService : AbpTagHelp { return dt.ToString("O"); } - + return string.Empty; } }, @@ -54,7 +54,7 @@ public abstract class AbpDatePickerBaseTagHelperService : AbpTagHelp { return dto.ToString("O"); } - + return string.Empty; } }, @@ -161,7 +161,10 @@ public abstract class AbpDatePickerBaseTagHelperService : AbpTagHelp output.TagMode = TagMode.StartTagAndEndTag; output.TagName = "div"; LeaveOnlyGroupAttributes(context, output); - output.Attributes.AddClass("mb-3"); + if (TagHelper.AddMarginBottomClass) + { + output.Attributes.AddClass("mb-3"); + } output.Content.AppendHtml(innerHtml); } @@ -224,7 +227,8 @@ public abstract class AbpDatePickerBaseTagHelperService : AbpTagHelp protected virtual string SurroundInnerHtmlAndGet(TagHelperContext context, TagHelperOutput output, string innerHtml) { - return "
" + + var mb = TagHelper.AddMarginBottomClass ? "mb-3" : string.Empty; + return $"
" + Environment.NewLine + innerHtml + Environment.NewLine + "
"; } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleConfigurationContext.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleConfigurationContext.cs index b67c8f6d3d..bc4dc14d11 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleConfigurationContext.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleConfigurationContext.cs @@ -8,7 +8,7 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bundling; public class BundleConfigurationContext : IBundleConfigurationContext { - public List Files { get; } + public List Files { get; } public IFileProvider FileProvider { get; } @@ -18,7 +18,7 @@ public class BundleConfigurationContext : IBundleConfigurationContext public BundleConfigurationContext(IServiceProvider serviceProvider, IFileProvider fileProvider) { - Files = new List(); + Files = new List(); ServiceProvider = serviceProvider; LazyServiceProvider = ServiceProvider.GetRequiredService(); FileProvider = fileProvider; diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleConfigurationExtensions.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleConfigurationExtensions.cs index 3ee0fe6cd9..62f7950c5a 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleConfigurationExtensions.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleConfigurationExtensions.cs @@ -1,4 +1,5 @@ using System; +using System.Linq; namespace Volo.Abp.AspNetCore.Mvc.UI.Bundling; @@ -10,6 +11,18 @@ public static class BundleConfigurationExtensions return bundleConfiguration; } + public static BundleConfiguration AddFiles(this BundleConfiguration bundleConfiguration, params BundleFile[] files) + { + bundleConfiguration.Contributors.AddFiles(files); + return bundleConfiguration; + } + + public static BundleConfiguration AddExternalFiles(this BundleConfiguration bundleConfiguration, params string[] files) + { + bundleConfiguration.Contributors.AddExternalFiles(files.Select(x => new BundleFile(x, true)).ToArray()); + return bundleConfiguration; + } + public static BundleConfiguration AddContributors(this BundleConfiguration bundleConfiguration, params IBundleContributor[] contributors) { Check.NotNull(contributors, nameof(contributors)); diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleContributorCollectionExtensions.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleContributorCollectionExtensions.cs index dc0ac8bfbb..addbe7e2cd 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleContributorCollectionExtensions.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleContributorCollectionExtensions.cs @@ -6,4 +6,14 @@ public static class BundleContributorCollectionExtensions { contributors.Add(new BundleFileContributor(files)); } + + public static void AddFiles(this BundleContributorCollection contributors, params BundleFile[] files) + { + contributors.Add(new BundleFileContributor(files)); + } + + public static void AddExternalFiles(this BundleContributorCollection contributors, params BundleFile[] files) + { + contributors.Add(new BundleFileContributor(files)); + } } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleFile.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleFile.cs new file mode 100644 index 0000000000..fbd6c3eaa1 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleFile.cs @@ -0,0 +1,31 @@ +using System; + +namespace Volo.Abp.AspNetCore.Mvc.UI.Bundling; + +public class BundleFile +{ + public string FileName { get; set; } + + public bool IsExternalFile { get; set; } + + public BundleFile(string fileName) + { + FileName = fileName; + IsExternalFile = fileName.StartsWith("http://", StringComparison.OrdinalIgnoreCase) || + fileName.StartsWith("https://", StringComparison.OrdinalIgnoreCase); + } + + public BundleFile(string fileName, bool isExternalFile) + { + FileName = fileName; + IsExternalFile = isExternalFile; + } + + /// + /// This method is used to compatible with old code. + /// + public static implicit operator BundleFile(string fileName) + { + return new BundleFile(fileName); + } +} diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleFileContributor.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleFileContributor.cs index 7f218e7fbf..df55266110 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleFileContributor.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleFileContributor.cs @@ -1,22 +1,30 @@ using System; using System.Collections.Generic; +using System.Linq; namespace Volo.Abp.AspNetCore.Mvc.UI.Bundling; public class BundleFileContributor : BundleContributor { - public string[] Files { get; } + public List Files { get; } + + public BundleFileContributor(params BundleFile[] files) + { + Files = new List(); + Files.AddRange(files); + } public BundleFileContributor(params string[] files) { - Files = files ?? Array.Empty(); + Files = new List(); + Files.AddRange(files.Select(file => new BundleFile(file))); } public override void ConfigureBundle(BundleConfigurationContext context) { foreach (var file in Files) { - context.Files.AddIfNotContains(x => x.Equals(file, StringComparison.OrdinalIgnoreCase), () => file); + context.Files.AddIfNotContains(x => x.FileName.Equals(file.FileName, StringComparison.OrdinalIgnoreCase), () => file); } } } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions/Volo/Abp/AspNetCore/Mvc/UI/Bundling/IBundleConfigurationContext.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions/Volo/Abp/AspNetCore/Mvc/UI/Bundling/IBundleConfigurationContext.cs index 61d772d638..96df341514 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions/Volo/Abp/AspNetCore/Mvc/UI/Bundling/IBundleConfigurationContext.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions/Volo/Abp/AspNetCore/Mvc/UI/Bundling/IBundleConfigurationContext.cs @@ -5,5 +5,5 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bundling; public interface IBundleConfigurationContext : IServiceProviderAccessor { - List Files { get; } + List Files { get; } } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleCacheItem.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleCacheItem.cs index 5c3890a852..f6830cbd74 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleCacheItem.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleCacheItem.cs @@ -5,11 +5,11 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bundling; public class BundleCacheItem { - public List Files { get; } + public List Files { get; } public List WatchDisposeHandles { get; } - public BundleCacheItem(List files) + public BundleCacheItem(List files) { Files = files; WatchDisposeHandles = new List(); diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleManager.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleManager.cs index 8291c2c75f..20c33e86e5 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleManager.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleManager.cs @@ -12,7 +12,6 @@ using Microsoft.Extensions.Options; using Volo.Abp.AspNetCore.Mvc.UI.Bundling.Scripts; using Volo.Abp.AspNetCore.Mvc.UI.Bundling.Styles; using Volo.Abp.AspNetCore.Mvc.UI.Resources; -using Volo.Abp.AspNetCore.VirtualFileSystem; using Volo.Abp.DependencyInjection; using Volo.Abp.VirtualFileSystem; @@ -56,18 +55,20 @@ public class BundleManager : IBundleManager, ITransientDependency Logger = NullLogger.Instance; } - public virtual async Task> GetStyleBundleFilesAsync(string bundleName) + public virtual async Task> GetStyleBundleFilesAsync(string bundleName) { return await GetBundleFilesAsync(Options.StyleBundles, bundleName, StyleBundler); } - public virtual async Task> GetScriptBundleFilesAsync(string bundleName) + public virtual async Task> GetScriptBundleFilesAsync(string bundleName) { return await GetBundleFilesAsync(Options.ScriptBundles, bundleName, ScriptBundler); } - protected virtual async Task> GetBundleFilesAsync(BundleConfigurationCollection bundles, string bundleName, IBundler bundler) + protected virtual async Task> GetBundleFilesAsync(BundleConfigurationCollection bundles, string bundleName, IBundler bundler) { + var files = new List(); + var contributors = GetContributors(bundles, bundleName); var bundleFiles = RequestResources.TryAdd(await GetBundleFilesAsync(contributors)); var dynamicResources = RequestResources.TryAdd(await GetDynamicResourcesAsync(contributors)); @@ -77,16 +78,45 @@ public class BundleManager : IBundleManager, ITransientDependency return bundleFiles.Union(dynamicResources).ToImmutableList(); } + var localBundleFiles = new List(); + foreach (var bundleFile in bundleFiles) + { + if (!bundleFile.IsExternalFile) + { + localBundleFiles.Add(bundleFile.FileName); + } + else + { + if (localBundleFiles.Count != 0) + { + files.AddRange(AddToBundleCache(bundleName, bundler, localBundleFiles).Files); + localBundleFiles.Clear(); + } + + files.Add(bundleFile); + } + } + + if (localBundleFiles.Count != 0) + { + files.AddRange(AddToBundleCache(bundleName, bundler, localBundleFiles).Files); + } + + return files.Union(dynamicResources).ToImmutableList(); + } + + private BundleCacheItem AddToBundleCache(string bundleName, IBundler bundler, List bundleFiles) + { var bundleRelativePath = Options.BundleFolderName.EnsureEndsWith('/') + bundleName + "." + bundleFiles.JoinAsString("|").ToMd5() + "." + bundler.FileExtension; - var cacheItem = BundleCache.GetOrAdd(bundleRelativePath, () => + return BundleCache.GetOrAdd(bundleRelativePath, () => { var cacheValue = new BundleCacheItem( - new List + new List { - "/" + bundleRelativePath + new BundleFile("/" + bundleRelativePath) } ); @@ -104,8 +134,6 @@ public class BundleManager : IBundleManager, ITransientDependency return cacheValue; }); - - return cacheItem.Files.Union(dynamicResources).ToImmutableList(); } private void WatchChanges(BundleCacheItem cacheValue, List files, string bundleRelativePath) @@ -176,7 +204,7 @@ public class BundleManager : IBundleManager, ITransientDependency } } - protected async Task> GetBundleFilesAsync(List contributors) + protected async Task> GetBundleFilesAsync(List contributors) { var context = CreateBundleConfigurationContext(); @@ -198,7 +226,7 @@ public class BundleManager : IBundleManager, ITransientDependency return context.Files; } - protected virtual async Task> GetDynamicResourcesAsync(List contributors) + protected virtual async Task> GetDynamicResourcesAsync(List contributors) { var context = CreateBundleConfigurationContext(); diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/IBundleManager.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/IBundleManager.cs index b4ce56cb62..067554e102 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/IBundleManager.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/IBundleManager.cs @@ -5,7 +5,7 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bundling; public interface IBundleManager { - Task> GetStyleBundleFilesAsync(string bundleName); + Task> GetStyleBundleFilesAsync(string bundleName); - Task> GetScriptBundleFilesAsync(string bundleName); + Task> GetScriptBundleFilesAsync(string bundleName); } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/AbpBundleItemTagHelper.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/AbpBundleItemTagHelper.cs index 1240dbef11..03ed327dc0 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/AbpBundleItemTagHelper.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/AbpBundleItemTagHelper.cs @@ -1,4 +1,5 @@ using System; +using Microsoft.AspNetCore.Razor.TagHelpers; using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers; namespace Volo.Abp.AspNetCore.Mvc.UI.Bundling.TagHelpers; @@ -49,7 +50,7 @@ public abstract class AbpBundleItemTagHelper : Ab if (Src != null) { - return new BundleTagHelperFileItem(Src); + return new BundleTagHelperFileItem(new BundleFile(Src)); } throw new AbpException("abp-script tag helper requires to set either src or type!"); diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/AbpTagHelperResourceService.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/AbpTagHelperResourceService.cs index a247022674..9be91c535f 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/AbpTagHelperResourceService.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/AbpTagHelperResourceService.cs @@ -3,10 +3,12 @@ using Microsoft.AspNetCore.Razor.TagHelpers; using System; using System.Collections.Generic; using System.Diagnostics; +using System.IO; using System.Text.Encodings.Web; using System.Threading.Tasks; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Mvc.Rendering; +using Microsoft.Extensions.FileProviders; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Options; @@ -63,18 +65,24 @@ public abstract class AbpTagHelperResourceService : ITransientDependency foreach (var bundleFile in bundleFiles) { - var file = HostingEnvironment.WebRootFileProvider.GetFileInfo(bundleFile); - - if (file == null || !file.Exists) + if (bundleFile.IsExternalFile) { - Logger.LogError($"Could not find the bundle file '{bundleFile}' for the bundle '{bundleName}'!"); - AddErrorScript(viewContext, tagHelper, context, output, bundleFile, bundleName!); - continue; + AddHtmlTag(viewContext, tagHelper, context, output, bundleFile, null); } - - if (file.Length > 0) + else { - AddHtmlTag(viewContext, tagHelper, context, output, bundleFile + "?_v=" + file.LastModified.UtcTicks); + var file = HostingEnvironment.WebRootFileProvider.GetFileInfo(bundleFile.FileName); + if (file == null || !file.Exists) + { + Logger.LogError($"Could not find the bundle file '{bundleFile.FileName}' for the bundle '{bundleName}'!"); + AddErrorScript(viewContext, tagHelper, context, output, bundleFile, bundleName!); + continue; + } + + if (file.Length > 0) + { + AddHtmlTag(viewContext, tagHelper, context, output, bundleFile, file); + } } } @@ -84,13 +92,13 @@ public abstract class AbpTagHelperResourceService : ITransientDependency protected abstract void CreateBundle(string bundleName, List bundleItems); - protected abstract Task> GetBundleFilesAsync(string bundleName); + protected abstract Task> GetBundleFilesAsync(string bundleName); - protected abstract void AddHtmlTag(ViewContext viewContext, TagHelper tagHelper, TagHelperContext context, TagHelperOutput output, string file); + protected abstract void AddHtmlTag(ViewContext viewContext, TagHelper tagHelper, TagHelperContext context, TagHelperOutput output, BundleFile file, IFileInfo? fileInfo = null); - protected virtual void AddErrorScript(ViewContext viewContext, TagHelper tagHelper, TagHelperContext context, TagHelperOutput output, string file, string bundleName) + protected virtual void AddErrorScript(ViewContext viewContext, TagHelper tagHelper, TagHelperContext context, TagHelperOutput output, BundleFile file, string bundleName) { - output.Content.AppendHtml($"{Environment.NewLine}"); + output.Content.AppendHtml($"{Environment.NewLine}"); } protected virtual string GenerateBundleName(List bundleItems) diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/AbpTagHelperScriptService.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/AbpTagHelperScriptService.cs index 260f28f812..c8486ebadd 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/AbpTagHelperScriptService.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/AbpTagHelperScriptService.cs @@ -6,6 +6,7 @@ using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Mvc.Rendering; using Microsoft.AspNetCore.Mvc.ViewFeatures; using Microsoft.AspNetCore.Razor.TagHelpers; +using Microsoft.Extensions.FileProviders; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Options; @@ -32,12 +33,12 @@ public class AbpTagHelperScriptService : AbpTagHelperResourceService ); } - protected override async Task> GetBundleFilesAsync(string bundleName) + protected override async Task> GetBundleFilesAsync(string bundleName) { return await BundleManager.GetScriptBundleFilesAsync(bundleName); } - protected override void AddHtmlTag(ViewContext viewContext, TagHelper tagHelper, TagHelperContext context, TagHelperOutput output, string file) + protected override void AddHtmlTag(ViewContext viewContext, TagHelper tagHelper, TagHelperContext context, TagHelperOutput output, BundleFile file, IFileInfo? fileInfo = null) { var defer = tagHelper switch { @@ -46,12 +47,13 @@ public class AbpTagHelperScriptService : AbpTagHelperResourceService _ => false }; - var deferText = (defer || Options.DeferScriptsByDefault || Options.DeferScripts.Any(x => file.StartsWith(x, StringComparison.OrdinalIgnoreCase))) - ? "defer" + var deferText = (defer || Options.DeferScriptsByDefault || Options.DeferScripts.Any(x => file.FileName.StartsWith(x, StringComparison.OrdinalIgnoreCase))) + ? "defer " : string.Empty; var nonceText = (viewContext.HttpContext.Items.TryGetValue(AbpAspNetCoreConsts.ScriptNonceKey, out var nonce) && nonce is string nonceString && !string.IsNullOrEmpty(nonceString)) - ? $"nonce=\"{nonceString}\"" + ? $"nonce=\"{nonceString}\" " : string.Empty; - output.Content.AppendHtml($"{Environment.NewLine}"); + var src = file.IsExternalFile ? file.FileName : viewContext.GetUrlHelper().Content((file.FileName + "?_v=" + fileInfo!.LastModified.UtcTicks).EnsureStartsWith('~')); + output.Content.AppendHtml($"{Environment.NewLine}"); } } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/AbpTagHelperStyleService.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/AbpTagHelperStyleService.cs index 0f68433f4c..bcfd7d95e2 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/AbpTagHelperStyleService.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/AbpTagHelperStyleService.cs @@ -6,6 +6,7 @@ using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Mvc.Rendering; using Microsoft.AspNetCore.Mvc.ViewFeatures; using Microsoft.AspNetCore.Razor.TagHelpers; +using Microsoft.Extensions.FileProviders; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Options; using Volo.Abp.AspNetCore.Security; @@ -18,7 +19,7 @@ public class AbpTagHelperStyleService : AbpTagHelperResourceService public AbpTagHelperStyleService( IBundleManager bundleManager, IOptions options, - IWebHostEnvironment hostingEnvironment, + IWebHostEnvironment hostingEnvironment, IOptions securityHeadersOptions) : base( bundleManager, options, @@ -36,12 +37,12 @@ public class AbpTagHelperStyleService : AbpTagHelperResourceService ); } - protected override async Task> GetBundleFilesAsync(string bundleName) + protected override async Task> GetBundleFilesAsync(string bundleName) { return await BundleManager.GetStyleBundleFilesAsync(bundleName); } - protected override void AddHtmlTag(ViewContext viewContext, TagHelper tagHelper, TagHelperContext context, TagHelperOutput output, string file) + protected override void AddHtmlTag(ViewContext viewContext, TagHelper tagHelper, TagHelperContext context, TagHelperOutput output, BundleFile file, IFileInfo? fileInfo = null) { var preload = tagHelper switch { @@ -50,15 +51,16 @@ public class AbpTagHelperStyleService : AbpTagHelperResourceService _ => false }; - if (preload || Options.PreloadStylesByDefault || Options.PreloadStyles.Any(x => file.StartsWith(x, StringComparison.OrdinalIgnoreCase))) + var href = file.IsExternalFile ? file.FileName : viewContext.GetUrlHelper().Content((file.FileName + "?_v=" + fileInfo!.LastModified.UtcTicks).EnsureStartsWith('~')); + if (preload || Options.PreloadStylesByDefault || Options.PreloadStyles.Any(x => file.FileName.StartsWith(x, StringComparison.OrdinalIgnoreCase))) { output.Content.AppendHtml(SecurityHeadersOptions.UseContentSecurityPolicyScriptNonce - ? $"{Environment.NewLine}" - : $"{Environment.NewLine}"); + ? $"{Environment.NewLine}" + : $"{Environment.NewLine}"); } else { - output.Content.AppendHtml($"{Environment.NewLine}"); + output.Content.AppendHtml($"{Environment.NewLine}"); } } } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/BundleTagHelperFileItem.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/BundleTagHelperFileItem.cs index 45ab8b64eb..b5f6ca74aa 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/BundleTagHelperFileItem.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/BundleTagHelperFileItem.cs @@ -5,16 +5,16 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bundling.TagHelpers; public class BundleTagHelperFileItem : BundleTagHelperItem { [NotNull] - public string File { get; } + public BundleFile File { get; } - public BundleTagHelperFileItem([NotNull] string file) + public BundleTagHelperFileItem([NotNull] BundleFile file) { File = Check.NotNull(file, nameof(file)); } public override string ToString() { - return File; + return File.FileName; } public override void AddToConfiguration(BundleConfiguration configuration) diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Resources/IWebRequestResources.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Resources/IWebRequestResources.cs index 2eefbcc0dd..9479dec8ce 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Resources/IWebRequestResources.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Resources/IWebRequestResources.cs @@ -1,8 +1,9 @@ using System.Collections.Generic; +using Volo.Abp.AspNetCore.Mvc.UI.Bundling; namespace Volo.Abp.AspNetCore.Mvc.UI.Resources; public interface IWebRequestResources { - List TryAdd(List resources); + List TryAdd(List resources); } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Resources/WebRequestResources.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Resources/WebRequestResources.cs index 3e046499ab..e68b671fc6 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Resources/WebRequestResources.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Resources/WebRequestResources.cs @@ -1,23 +1,24 @@ using System.Collections.Generic; using System.Linq; using Microsoft.AspNetCore.Http; +using Volo.Abp.AspNetCore.Mvc.UI.Bundling; using Volo.Abp.DependencyInjection; namespace Volo.Abp.AspNetCore.Mvc.UI.Resources; public class WebRequestResources : IWebRequestResources, IScopedDependency { - protected Dictionary> Resources { get; } + protected Dictionary> Resources { get; } protected IHttpContextAccessor HttpContextAccessor { get; } public WebRequestResources(IHttpContextAccessor httpContextAccessor) { HttpContextAccessor = httpContextAccessor; - Resources = new Dictionary>(); + Resources = new Dictionary>(); } - public List TryAdd(List resources) + public List TryAdd(List resources) { var path = HttpContextAccessor.HttpContext?.Request?.Path ?? ""; diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Packages/Volo/Abp/AspNetCore/Mvc/UI/Packages/AbpAspNetCoreMvcUiPackagesModule.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Packages/Volo/Abp/AspNetCore/Mvc/UI/Packages/AbpAspNetCoreMvcUiPackagesModule.cs index 4970015a46..7ba8105d43 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Packages/Volo/Abp/AspNetCore/Mvc/UI/Packages/AbpAspNetCoreMvcUiPackagesModule.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Packages/Volo/Abp/AspNetCore/Mvc/UI/Packages/AbpAspNetCoreMvcUiPackagesModule.cs @@ -30,11 +30,13 @@ public class AbpAspNetCoreMvcUiPackagesModule : AbpModule //moment options.AddLanguagesMapOrUpdate(MomentScriptContributor.PackageName, new NameValue("zh-Hans", "zh-cn"), - new NameValue("zh-Hant", "zh-tw")); + new NameValue("zh-Hant", "zh-tw"), + new NameValue("de-DE", "de")); options.AddLanguageFilesMapOrUpdate(MomentScriptContributor.PackageName, new NameValue("zh-Hans", "zh-cn"), - new NameValue("zh-Hant", "zh-tw")); + new NameValue("zh-Hant", "zh-tw"), + new NameValue("de-DE", "de")); //Timeago options.AddLanguageFilesMapOrUpdate(TimeagoScriptContributor.PackageName, diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Bundling/SharedThemeGlobalScriptContributor.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Bundling/SharedThemeGlobalScriptContributor.cs index 2ac299959a..2ca7c191c8 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Bundling/SharedThemeGlobalScriptContributor.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Bundling/SharedThemeGlobalScriptContributor.cs @@ -35,20 +35,20 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Bundling; )] public class SharedThemeGlobalScriptContributor : BundleContributor { - + public override void ConfigureBundle(BundleConfigurationContext context) { - context.Files.AddRange(new[] + context.Files.AddRange(new BundleFile[] { - "/libs/abp/aspnetcore-mvc-ui-theme-shared/ui-extensions.js", - "/libs/abp/aspnetcore-mvc-ui-theme-shared/jquery/jquery-extensions.js", - "/libs/abp/aspnetcore-mvc-ui-theme-shared/jquery-form/jquery-form-extensions.js", - "/libs/abp/aspnetcore-mvc-ui-theme-shared/jquery/widget-manager.js", - "/libs/abp/aspnetcore-mvc-ui-theme-shared/bootstrap/dom-event-handlers.js", - "/libs/abp/aspnetcore-mvc-ui-theme-shared/bootstrap/modal-manager.js", - "/libs/abp/aspnetcore-mvc-ui-theme-shared/datatables/datatables-extensions.js", - "/libs/abp/aspnetcore-mvc-ui-theme-shared/sweetalert2/abp-sweetalert2.js", - "/libs/abp/aspnetcore-mvc-ui-theme-shared/toastr/abp-toastr.js" + "/libs/abp/aspnetcore-mvc-ui-theme-shared/ui-extensions.js", + "/libs/abp/aspnetcore-mvc-ui-theme-shared/jquery/jquery-extensions.js", + "/libs/abp/aspnetcore-mvc-ui-theme-shared/jquery-form/jquery-form-extensions.js", + "/libs/abp/aspnetcore-mvc-ui-theme-shared/jquery/widget-manager.js", + "/libs/abp/aspnetcore-mvc-ui-theme-shared/bootstrap/dom-event-handlers.js", + "/libs/abp/aspnetcore-mvc-ui-theme-shared/bootstrap/modal-manager.js", + "/libs/abp/aspnetcore-mvc-ui-theme-shared/datatables/datatables-extensions.js", + "/libs/abp/aspnetcore-mvc-ui-theme-shared/sweetalert2/abp-sweetalert2.js", + "/libs/abp/aspnetcore-mvc-ui-theme-shared/toastr/abp-toastr.js" }); } } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Bundling/SharedThemeGlobalStyleContributor.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Bundling/SharedThemeGlobalStyleContributor.cs index 01f490425c..f959d73f05 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Bundling/SharedThemeGlobalStyleContributor.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Bundling/SharedThemeGlobalStyleContributor.cs @@ -27,10 +27,10 @@ public class SharedThemeGlobalStyleContributor : BundleContributor { public override void ConfigureBundle(BundleConfigurationContext context) { - context.Files.AddRange(new[] + context.Files.AddRange(new BundleFile[] { - "/libs/abp/aspnetcore-mvc-ui-theme-shared/datatables/datatables-styles.css", - "/libs/abp/aspnetcore-mvc-ui-theme-shared/date-range-picker/date-range-picker-styles.css" - }); + "/libs/abp/aspnetcore-mvc-ui-theme-shared/datatables/datatables-styles.css", + "/libs/abp/aspnetcore-mvc-ui-theme-shared/date-range-picker/date-range-picker-styles.css" + }); } } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/bootstrap/dom-event-handlers.js b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/bootstrap/dom-event-handlers.js index 1baa46de9a..8e567d626a 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/bootstrap/dom-event-handlers.js +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/bootstrap/dom-event-handlers.js @@ -417,7 +417,7 @@ var isUtc = options.isUtc; dateFormat = dateFormat || options.dateFormat; if (!date) { - return isUtc ? moment.utc() : moment(); + return isUtc ? moment.utc().startOf('day') : moment().startOf('day'); } if (isUtc) { diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/bootstrap/modal-manager.js b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/bootstrap/modal-manager.js index e524881176..03ba2706d0 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/bootstrap/modal-manager.js +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/bootstrap/modal-manager.js @@ -134,10 +134,18 @@ $.validator.defaults.ignore = ''; //TODO: Would be better if we can apply only f _args = args || {}; + var argsWithoutFunc = {}; + for (var a in _args) { + if (_args.hasOwnProperty(a) && typeof _args[a] !== 'function') { + argsWithoutFunc[a] = _args[a]; + } + } + _createContainer(_modalId) - .load(options.viewUrl, $.param(_args), function (response, status, xhr) { + .load(options.viewUrl, $.param(argsWithoutFunc), function (response, status, xhr) { if (status === "error") { - //TODO: Handle! + var responseJSON = xhr.responseJSON ? xhr.responseJSON : JSON.parse(xhr.responseText); + abp.ajax.showError(responseJSON.error ? responseJSON.error : abp.ajax.defaultError); return; }; diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AspNetCoreApiDescriptionModelProvider.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AspNetCoreApiDescriptionModelProvider.cs index f1d014b76a..0a10835e3c 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AspNetCoreApiDescriptionModelProvider.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AspNetCoreApiDescriptionModelProvider.cs @@ -214,6 +214,8 @@ public class AspNetCoreApiDescriptionModelProvider : IApiDescriptionModelProvide type == typeof(void) || type == typeof(Enum) || type == typeof(ValueType) || + type == typeof(DateOnly) || + type == typeof(TimeOnly) || TypeHelper.IsPrimitiveExtended(type)) { return; diff --git a/framework/src/Volo.Abp.AspNetCore/Microsoft/Extensions/DependencyInjection/CookieAuthenticationOptionsExtensions.cs b/framework/src/Volo.Abp.AspNetCore/Microsoft/Extensions/DependencyInjection/CookieAuthenticationOptionsExtensions.cs index 28537f5179..15e353431e 100644 --- a/framework/src/Volo.Abp.AspNetCore/Microsoft/Extensions/DependencyInjection/CookieAuthenticationOptionsExtensions.cs +++ b/framework/src/Volo.Abp.AspNetCore/Microsoft/Extensions/DependencyInjection/CookieAuthenticationOptionsExtensions.cs @@ -28,8 +28,8 @@ public static class CookieAuthenticationOptionsExtensions var logger = principalContext.HttpContext.RequestServices.GetRequiredService>(); - var tokenExpiresAt = principalContext.Properties.Items[".Token.expires_at"]; - if (DateTimeOffset.TryParseExact(tokenExpiresAt, "o", null, DateTimeStyles.RoundtripKind, out var expiresAt) && + var tokenExpiresAt = principalContext.Properties.GetString(".Token.expires_at"); + if (!tokenExpiresAt.IsNullOrWhiteSpace() && DateTimeOffset.TryParseExact(tokenExpiresAt, "o", null, DateTimeStyles.RoundtripKind, out var expiresAt) && expiresAt < DateTimeOffset.UtcNow.Subtract(advance.Value)) { logger.LogInformation("The access_token is expired."); diff --git a/framework/src/Volo.Abp.BlazoriseUI/wwwroot/volo.abp.blazoriseui.css b/framework/src/Volo.Abp.BlazoriseUI/wwwroot/volo.abp.blazoriseui.css new file mode 100644 index 0000000000..84814c2ef3 --- /dev/null +++ b/framework/src/Volo.Abp.BlazoriseUI/wwwroot/volo.abp.blazoriseui.css @@ -0,0 +1,60 @@ +.radar-spinner, .radar-spinner * { + box-sizing: border-box; +} + +.radar-spinner { + height: 60px; + width: 60px; + position: relative; +} + +.radar-spinner .circle { + position: absolute; + height: 100%; + width: 100%; + top: 0; + left: 0; + animation: radar-spinner-animation 2s infinite; +} + +.radar-spinner .circle:nth-child(1) { + padding: calc(60px * 5 * 2 * 0 / 110); + animation-delay: 300ms; +} + +.radar-spinner .circle:nth-child(2) { + padding: calc(60px * 5 * 2 * 1 / 110); + animation-delay: 300ms; +} + +.radar-spinner .circle:nth-child(3) { + padding: calc(60px * 5 * 2 * 2 / 110); + animation-delay: 300ms; +} + +.radar-spinner .circle:nth-child(4) { + padding: calc(60px * 5 * 2 * 3 / 110); + animation-delay: 0ms; +} + +.radar-spinner .circle-inner, .radar-spinner .circle-inner-container { + height: 100%; + width: 100%; + border-radius: 50%; + border: calc(60px * 5 / 110) solid transparent; +} + +.radar-spinner .circle-inner { + border-left-color: var(--secondary, #ff1d5e); + border-right-color: var(--secondary, #ff1d5e); +} + +@keyframes radar-spinner-animation { + 50% { + transform: rotate(180deg); + } + + 100% { + transform: rotate(0deg); + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/TemplateInfo.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/TemplateInfo.cs index d33aa103ba..8a59d2d8b1 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/TemplateInfo.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/TemplateInfo.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using JetBrains.Annotations; +using Volo.Abp.Cli.ProjectBuilding.Templates.App; using Volo.Abp.Cli.ProjectBuilding.Templates; namespace Volo.Abp.Cli.ProjectBuilding.Building; @@ -43,4 +44,9 @@ public abstract class TemplateInfo { return Name.EndsWith("-pro", StringComparison.OrdinalIgnoreCase); } + + public bool IsNoLayer() + { + return Name is AppNoLayersTemplate.TemplateName or AppNoLayersProTemplate.TemplateName; + } } diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplateRemoveMongodbCollectionFixtureStep.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplateRemoveMongodbCollectionFixtureStep.cs index 842e194eeb..ed290508a2 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplateRemoveMongodbCollectionFixtureStep.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplateRemoveMongodbCollectionFixtureStep.cs @@ -8,6 +8,11 @@ public class AppTemplateRemoveMongodbCollectionFixtureStep : ProjectBuildPipelin { public override void Execute(ProjectBuildContext context) { + if (context.Template.IsNoLayer()) + { + return; + } + //MyCompanyName.MyProjectName.Application.Tests RemoveFile(context, "/aspnet-core/test/MyCompanyName.MyProjectName.Application.Tests/MyProjectNameApplicationCollection.cs"); RemoveKeyword(context, diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/AngularSourceCodeAdder.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/AngularSourceCodeAdder.cs index 42e23ab7c8..7cf083fa1a 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/AngularSourceCodeAdder.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/AngularSourceCodeAdder.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.IO; using System.Linq; +using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; using Microsoft.Extensions.Logging; @@ -71,6 +72,7 @@ public class AngularSourceCodeAdder : ITransientDependency { await AddProjectToEnvironmentTsAsync(angularPath, moduleName); await AddProjectToAppModuleTsAsync(angularPath, moduleName); + await AddProjectToAppRoutingTsAsync(angularPath, moduleName); } private async Task AddProjectsToAngularJsonAsync(string angularPath, List projects) @@ -244,15 +246,15 @@ public class AngularSourceCodeAdder : ITransientDependency { return; } - + var fileContent = File.ReadAllText(filePath); - fileContent = Regex.Replace(fileContent, @"apis\s*:\s*{", - "apis: {"+ Environment.NewLine + - " " + moduleName.Split(".").Last() + ": {"+ Environment.NewLine + - " rootNamespace: '" + moduleName + "',"+ Environment.NewLine + + fileContent = Regex.Replace(fileContent, @"apis\s*:\s*{", + "apis: {" + Environment.NewLine + + " " + moduleName.Split(".").Last() + ": {" + Environment.NewLine + + " rootNamespace: '" + moduleName + "'," + Environment.NewLine + " },"); - + File.WriteAllText(filePath, fileContent); } @@ -264,23 +266,56 @@ public class AngularSourceCodeAdder : ITransientDependency { return; } - + var fileContent = File.ReadAllText(filePath); var moduleNameAsConfigPath = moduleName.ToKebabCase(); - + if (moduleName.Contains(".")) { var moduleNameSplited = moduleName.Split("."); - moduleNameAsConfigPath = moduleNameSplited.Take(moduleNameSplited.Length-1).JoinAsString(".").ToKebabCase() + "/" + moduleNameSplited.Last().ToKebabCase(); + moduleNameAsConfigPath = moduleNameSplited.Take(moduleNameSplited.Length - 1).JoinAsString(".").ToKebabCase() + "/" + moduleNameSplited.Last().ToKebabCase(); } - fileContent = "import { "+moduleName.Split(".").Last()+"ConfigModule } from '@"+moduleNameAsConfigPath+"/config';" + Environment.NewLine + fileContent; - - fileContent = Regex.Replace(fileContent, "imports\\s*:\\s*\\[", - "imports: ["+ Environment.NewLine + + fileContent = "import { " + moduleName.Split(".").Last() + "ConfigModule } from '@" + moduleNameAsConfigPath + "/config';" + Environment.NewLine + fileContent; + + fileContent = Regex.Replace(fileContent, "imports\\s*:\\s*\\[", + "imports: [" + Environment.NewLine + " " + moduleName.Split(".").Last() + "ConfigModule.forRoot(),"); - + + File.WriteAllText(filePath, fileContent); + } + + private async Task AddProjectToAppRoutingTsAsync(string angularPath, string moduleName) + { + string filePath = Path.Combine(angularPath, "src", "app", "app-routing.module.ts"); + + if (!File.Exists(filePath)) + { + return; + } + + string fileContent = File.ReadAllText(filePath); + string moduleNameAsConfigPath = moduleName.ToKebabCase(); + string path = moduleName.ToKebabCase(); + + if (moduleName.Contains(".")) + { + var moduleNameSplitted = moduleName.Split("."); + moduleNameAsConfigPath = moduleNameSplitted.Take(moduleNameSplitted.Length - 1).JoinAsString(".").ToKebabCase() + "/" + moduleNameSplitted.Last().ToKebabCase(); + path = $"{moduleNameSplitted.Last().ToKebabCase()}"; + } + + string pattern = "Routes\\s*=\\s*\\["; + string newContent = $@"Routes = [ + {{ + path: '{path}', + loadChildren: () => import('@{moduleNameAsConfigPath}') + .then(m => m.{(moduleName.Split(".").Length > 1 ? moduleName.Split(".")[1] : moduleName)}Module.forLazy()) + }}, +"; + + fileContent = Regex.Replace(fileContent, pattern, newContent); File.WriteAllText(filePath, fileContent); } @@ -311,7 +346,7 @@ public class AngularSourceCodeAdder : ITransientDependency { Directory.Delete(vscodeFolder, true); } - + var projectsInFolder = Directory.GetDirectories(folder); if (projectsInFolder.Length == 1 && Path.GetFileName(projectsInFolder[0]) == "projects") @@ -360,7 +395,7 @@ public class AngularSourceCodeAdder : ITransientDependency return projects; } - + private async Task GetProjectPackageNameAsync(string angularProjectsPath, string project) { var packageJsonPath = Path.Combine(angularProjectsPath, project, "package.json"); diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ServiceProxying/CSharp/CSharpServiceProxyGenerator.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ServiceProxying/CSharp/CSharpServiceProxyGenerator.cs index 45b93423c4..88ce572d33 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ServiceProxying/CSharp/CSharpServiceProxyGenerator.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ServiceProxying/CSharp/CSharpServiceProxyGenerator.cs @@ -539,17 +539,11 @@ public class CSharpServiceProxyGenerator : ServiceProxyGeneratorBase")) + if(usingNamespaceList != null) { - var left = typeName.IndexOf("<", StringComparison.Ordinal); - var right = typeName.LastIndexOf(">", StringComparison.Ordinal); - var genericTypes = typeName.Substring(left + 1, right - left - 1); - foreach (var genericType in genericTypes.Split(",").Where(x => x.Contains("."))) - { - usingNamespaceList?.AddIfNotContains($"using {GetTypeNamespace(genericType)};"); - } + AddGenericTypeUsingNamespace(typeName, usingNamespaceList); } - + var type = new StringBuilder(); var s1 = typeName.Split("<"); for (var i = 0; i < s1.Length; i++) @@ -579,6 +573,25 @@ public class CSharpServiceProxyGenerator : ServiceProxyGeneratorBase usingNamespaceList) + { + if(!typeFullName.Contains("<")) + { + usingNamespaceList.AddIfNotContains($"using {GetTypeNamespace(typeFullName)};"); + } + + if (typeFullName.Contains("<") && typeFullName.Contains(">")) + { + var left = typeFullName.IndexOf("<", StringComparison.Ordinal); + var right = typeFullName.LastIndexOf(">", StringComparison.Ordinal); + var genericTypes = typeFullName.Substring(left + 1, right - left - 1); + foreach (var genericType in genericTypes.Split(",").Where(x => x.Contains("."))) + { + AddGenericTypeUsingNamespace(genericType, usingNamespaceList); + } + } + } + private static string NormalizeTypeName(string typeName) { var nullable = string.Empty; diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Version/PackageVersionCheckerService.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Version/PackageVersionCheckerService.cs index f4b87ea047..ff35fcf17f 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Version/PackageVersionCheckerService.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Version/PackageVersionCheckerService.cs @@ -46,7 +46,7 @@ public class PackageVersionCheckerService : ITransientDependency { var versionList = await GetPackageVersionListAsync(packageId, false); - if (versionList == null) + if (!versionList.Any()) { return false; } @@ -121,10 +121,10 @@ public class PackageVersionCheckerService : ITransientDependency } var searchUrl = CliUrls.GetNuGetPackageSearchUrl(_apiKeyResult.ApiKey, packageId); - return await HasAnyPackageAsync(searchUrl); + return await HasAnyPackageAsync(searchUrl, packageId); } - private async Task HasAnyPackageAsync(string url) + private async Task HasAnyPackageAsync(string url, string packageId) { try { @@ -139,8 +139,9 @@ public class PackageVersionCheckerService : ITransientDependency await RemoteServiceExceptionHandler.EnsureSuccessfulHttpResponseAsync(responseMessage); var responseContent = await responseMessage.Content.ReadAsStringAsync(); - - return JsonSerializer.Deserialize(responseContent).TotalHits > 0; + var nugetSearchResult = JsonSerializer.Deserialize(responseContent); + + return nugetSearchResult.TotalHits > 0 && nugetSearchResult.Packages.Any(package => package.Id.ToLowerInvariant() == packageId.ToLowerInvariant()); } } catch (Exception) @@ -182,7 +183,7 @@ public class PackageVersionCheckerService : ITransientDependency if (responseMessage.StatusCode == HttpStatusCode.NotFound) { //the package doesn't exist... - return null; + return new List(); } await RemoteServiceExceptionHandler.EnsureSuccessfulHttpResponseAsync(responseMessage); @@ -193,7 +194,7 @@ public class PackageVersionCheckerService : ITransientDependency } catch (Exception) { - return null; + return new List(); } } @@ -238,6 +239,18 @@ public class PackageVersionCheckerService : ITransientDependency { [JsonProperty("totalHits")] public int TotalHits { get; set; } + + [JsonProperty("data")] + public NuGetSearchResultPackagesDto[] Packages { get; set; } + } + + public class NuGetSearchResultPackagesDto + { + [JsonProperty("id")] + public string Id { get; set; } + + [JsonProperty("version")] + public string Version { get; set; } } public class NuGetVersionResultDto diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Reflection/TypeHelper.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Reflection/TypeHelper.cs index b439a5a07b..1efa6c4f29 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/Reflection/TypeHelper.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/Reflection/TypeHelper.cs @@ -257,6 +257,14 @@ public static class TypeHelper { return "string"; } + else if (type.FullName == "System.DateOnly") + { + return "string"; + } + else if (type.FullName == "System.TimeOnly") + { + return "string"; + } else if (type == typeof(TimeSpan)) { return "string"; diff --git a/framework/src/Volo.Abp.Dapr/Volo.Abp.Dapr.csproj b/framework/src/Volo.Abp.Dapr/Volo.Abp.Dapr.csproj index 92377ef51a..34a505110c 100644 --- a/framework/src/Volo.Abp.Dapr/Volo.Abp.Dapr.csproj +++ b/framework/src/Volo.Abp.Dapr/Volo.Abp.Dapr.csproj @@ -12,6 +12,7 @@ + diff --git a/framework/src/Volo.Abp.Dapr/Volo/Abp/Dapr/AbpDaprClientFactory.cs b/framework/src/Volo.Abp.Dapr/Volo/Abp/Dapr/AbpDaprClientFactory.cs index 43e9dbc953..92a2961cd4 100644 --- a/framework/src/Volo.Abp.Dapr/Volo/Abp/Dapr/AbpDaprClientFactory.cs +++ b/framework/src/Volo.Abp.Dapr/Volo/Abp/Dapr/AbpDaprClientFactory.cs @@ -1,10 +1,14 @@ using System; +using System.Globalization; using System.Net.Http; +using System.Net.Http.Headers; using System.Text.Json; using Dapr.Client; using Microsoft.Extensions.Options; using Volo.Abp.DependencyInjection; using Volo.Abp.Json.SystemTextJson; +using Volo.Abp.MultiTenancy; +using Volo.Abp.Tracing; namespace Volo.Abp.Dapr; @@ -13,13 +17,21 @@ public class AbpDaprClientFactory : IAbpDaprClientFactory, ISingletonDependency protected AbpDaprOptions DaprOptions { get; } protected JsonSerializerOptions JsonSerializerOptions { get; } protected IDaprApiTokenProvider DaprApiTokenProvider { get; } + protected ICurrentTenant CurrentTenant { get; } + protected ICorrelationIdProvider CorrelationIdProvider { get; } + protected IOptions AbpCorrelationIdOptions { get; } public AbpDaprClientFactory( IOptions options, IOptions systemTextJsonSerializerOptions, - IDaprApiTokenProvider daprApiTokenProvider) + IDaprApiTokenProvider daprApiTokenProvider, + ICurrentTenant currentTenant, ICorrelationIdProvider correlationIdProvider, + IOptions abpCorrelationIdOptions) { DaprApiTokenProvider = daprApiTokenProvider; + CurrentTenant = currentTenant; + CorrelationIdProvider = correlationIdProvider; + AbpCorrelationIdOptions = abpCorrelationIdOptions; DaprOptions = options.Value; JsonSerializerOptions = CreateJsonSerializerOptions(systemTextJsonSerializerOptions.Value); } @@ -61,11 +73,39 @@ public class AbpDaprClientFactory : IAbpDaprClientFactory, ISingletonDependency daprEndpoint = DaprOptions.HttpEndpoint; } - return DaprClient.CreateInvokeHttpClient( + var httpClient = DaprClient.CreateInvokeHttpClient( appId, daprEndpoint, daprApiToken ?? DaprApiTokenProvider.GetDaprApiToken() ); + + AddHeaders(httpClient); + + return httpClient; + } + + protected virtual void AddHeaders(HttpClient httpClient) + { + //CorrelationId + httpClient.DefaultRequestHeaders.Add(AbpCorrelationIdOptions.Value.HttpHeaderName, CorrelationIdProvider.Get()); + + //TenantId + if (CurrentTenant.Id.HasValue) + { + //TODO: Use AbpAspNetCoreMultiTenancyOptions to get the key + httpClient.DefaultRequestHeaders.Add(TenantResolverConsts.DefaultTenantKey, CurrentTenant.Id.Value.ToString()); + } + + //Culture + //TODO: Is that the way we want? Couldn't send the culture (not ui culture) + var currentCulture = CultureInfo.CurrentUICulture.Name ?? CultureInfo.CurrentCulture.Name; + if (!currentCulture.IsNullOrEmpty()) + { + httpClient.DefaultRequestHeaders.AcceptLanguage.Add(new StringWithQualityHeaderValue(currentCulture)); + } + + //X-Requested-With + httpClient.DefaultRequestHeaders.Add("X-Requested-With", "XMLHttpRequest"); } protected virtual JsonSerializerOptions CreateJsonSerializerOptions(AbpSystemTextJsonSerializerOptions systemTextJsonSerializerOptions) diff --git a/framework/src/Volo.Abp.Dapr/Volo/Abp/Dapr/AbpDaprModule.cs b/framework/src/Volo.Abp.Dapr/Volo/Abp/Dapr/AbpDaprModule.cs index e1ca4bb0db..65605bc342 100644 --- a/framework/src/Volo.Abp.Dapr/Volo/Abp/Dapr/AbpDaprModule.cs +++ b/framework/src/Volo.Abp.Dapr/Volo/Abp/Dapr/AbpDaprModule.cs @@ -4,10 +4,11 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; using Volo.Abp.Json; using Volo.Abp.Modularity; +using Volo.Abp.MultiTenancy; namespace Volo.Abp.Dapr; -[DependsOn(typeof(AbpJsonModule))] +[DependsOn(typeof(AbpJsonModule), typeof(AbpMultiTenancyAbstractionsModule))] public class AbpDaprModule : AbpModule { public override void ConfigureServices(ServiceConfigurationContext context) diff --git a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Domain/Repositories/EntityFrameworkCore/EfCoreRepository.cs b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Domain/Repositories/EntityFrameworkCore/EfCoreRepository.cs index 3274360ba2..799397218c 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Domain/Repositories/EntityFrameworkCore/EfCoreRepository.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Domain/Repositories/EntityFrameworkCore/EfCoreRepository.cs @@ -161,16 +161,18 @@ public class EfCoreRepository : RepositoryBase, IE { var dbContext = await GetDbContextAsync(); - dbContext.Attach(entity); - - var updatedEntity = dbContext.Update(entity).Entity; + if (dbContext.Set().Local.All(e => e != entity)) + { + dbContext.Set().Attach(entity); + dbContext.Update(entity); + } if (autoSave) { await dbContext.SaveChangesAsync(GetCancellationToken(cancellationToken)); } - return updatedEntity; + return entity; } public async override Task UpdateManyAsync(IEnumerable entities, bool autoSave = false, CancellationToken cancellationToken = default) diff --git a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/EntityHistory/EntityHistoryHelper.cs b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/EntityHistory/EntityHistoryHelper.cs index cb97111c59..dc3754be3b 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/EntityHistory/EntityHistoryHelper.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/EntityHistory/EntityHistoryHelper.cs @@ -85,8 +85,10 @@ public class EntityHistoryHelper : IEntityHistoryHelper, ITransientDependency case EntityState.Modified: changeType = IsDeleted(entityEntry) ? EntityChangeType.Deleted : EntityChangeType.Updated; break; - case EntityState.Detached: case EntityState.Unchanged: + changeType = EntityChangeType.Updated; // Navigation property changes. + break; + case EntityState.Detached: default: return null; } @@ -184,6 +186,21 @@ public class EntityHistoryHelper : IEntityHistoryHelper, ITransientDependency } } + if (entityEntry.State == EntityState.Unchanged) + { + foreach (var navigation in entityEntry.Navigations) + { + if (navigation.IsModified || (navigation is ReferenceEntry && navigation.As().TargetEntry?.State == EntityState.Modified)) + { + propertyChanges.Add(new EntityPropertyChangeInfo + { + PropertyName = navigation.Metadata.Name, + PropertyTypeFullName = navigation.Metadata.ClrType.GetFirstGenericArgumentIfNullable().FullName! + }); + } + } + } + return propertyChanges; } @@ -205,12 +222,26 @@ public class EntityHistoryHelper : IEntityHistoryHelper, ITransientDependency protected virtual bool ShouldSaveEntityHistory(EntityEntry entityEntry, bool defaultValue = false) { - if (entityEntry.State == EntityState.Detached || - entityEntry.State == EntityState.Unchanged) + if (entityEntry.State == EntityState.Detached) { return false; } + if (entityEntry.State == EntityState.Unchanged) + { + if (entityEntry.Navigations.Any(navigationEntry => navigationEntry.IsModified)) + { + return true; + } + + if (entityEntry.Navigations.Where(x => x is ReferenceEntry).Cast().Any(x => x.TargetEntry != null && x.TargetEntry.State == EntityState.Modified)) + { + return true; + } + + return false; + } + var entityType = entityEntry.Metadata.ClrType; if (!EntityHelper.IsEntity(entityType) && !EntityHelper.IsValueObject(entityType)) diff --git a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/ValueConverters/AbpJsonValueConverter.cs b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/ValueConverters/AbpJsonValueConverter.cs index 80035c3252..2d237bdcc2 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/ValueConverters/AbpJsonValueConverter.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/ValueConverters/AbpJsonValueConverter.cs @@ -19,7 +19,7 @@ public class AbpJsonValueConverter : ValueConverter(stream, ImageProcessState.Unsupported); + } + + if(!stream.CanSeek) + { + var memoryStream = new MemoryStream(); + await stream.CopyToAsync(memoryStream, CancellationTokenProvider.FallbackToProvider(cancellationToken)); + SeekToBegin(memoryStream); + stream = memoryStream; + } + foreach (var imageCompressorContributor in ImageCompressorContributors) { var result = await imageCompressorContributor.TryCompressAsync(stream, mimeType, CancellationTokenProvider.FallbackToProvider(cancellationToken)); + SeekToBegin(stream); + if (result.State == ImageProcessState.Unsupported) { continue; @@ -64,4 +79,12 @@ public class ImageCompressor : IImageCompressor, ITransientDependency return new ImageCompressResult(bytes, ImageProcessState.Unsupported); } + + protected virtual void SeekToBegin(Stream stream) + { + if (stream.CanSeek) + { + stream.Seek(0, SeekOrigin.Begin); + } + } } \ No newline at end of file diff --git a/framework/src/Volo.Abp.Imaging.Abstractions/Volo/Abp/Imaging/ImageResizer.cs b/framework/src/Volo.Abp.Imaging.Abstractions/Volo/Abp/Imaging/ImageResizer.cs index e2c4ad7d77..80d9ec8815 100644 --- a/framework/src/Volo.Abp.Imaging.Abstractions/Volo/Abp/Imaging/ImageResizer.cs +++ b/framework/src/Volo.Abp.Imaging.Abstractions/Volo/Abp/Imaging/ImageResizer.cs @@ -38,9 +38,24 @@ public class ImageResizer : IImageResizer, ITransientDependency ChangeDefaultResizeMode(resizeArgs); + if(!stream.CanRead) + { + return new ImageResizeResult(stream, ImageProcessState.Unsupported); + } + + if(!stream.CanSeek) + { + var memoryStream = new MemoryStream(); + await stream.CopyToAsync(memoryStream, CancellationTokenProvider.FallbackToProvider(cancellationToken)); + SeekToBegin(memoryStream); + stream = memoryStream; + } + foreach (var imageResizerContributor in ImageResizerContributors) { var result = await imageResizerContributor.TryResizeAsync(stream, resizeArgs, mimeType, CancellationTokenProvider.FallbackToProvider(cancellationToken)); + + SeekToBegin(stream); if (result.State == ImageProcessState.Unsupported) { @@ -85,4 +100,12 @@ public class ImageResizer : IImageResizer, ITransientDependency resizeArgs.Mode = ImageResizeOptions.DefaultResizeMode; } } + + protected virtual void SeekToBegin(Stream stream) + { + if (stream.CanSeek) + { + stream.Seek(0, SeekOrigin.Begin); + } + } } \ No newline at end of file diff --git a/framework/src/Volo.Abp.Imaging.ImageSharp/Volo.Abp.Imaging.ImageSharp.csproj b/framework/src/Volo.Abp.Imaging.ImageSharp/Volo.Abp.Imaging.ImageSharp.csproj index 6c6688cc89..0987bdd2d3 100644 --- a/framework/src/Volo.Abp.Imaging.ImageSharp/Volo.Abp.Imaging.ImageSharp.csproj +++ b/framework/src/Volo.Abp.Imaging.ImageSharp/Volo.Abp.Imaging.ImageSharp.csproj @@ -4,7 +4,7 @@ - netstandard2.0; + net8.0 enable Nullable Volo.Abp.Imaging.ImageSharp diff --git a/framework/src/Volo.Abp.Imaging.ImageSharp/Volo/Abp/Imaging/ImageSharpCompressOptions.cs b/framework/src/Volo.Abp.Imaging.ImageSharp/Volo/Abp/Imaging/ImageSharpCompressOptions.cs index 3fc291da6f..b7c097324d 100644 --- a/framework/src/Volo.Abp.Imaging.ImageSharp/Volo/Abp/Imaging/ImageSharpCompressOptions.cs +++ b/framework/src/Volo.Abp.Imaging.ImageSharp/Volo/Abp/Imaging/ImageSharpCompressOptions.cs @@ -22,7 +22,7 @@ public class ImageSharpCompressOptions PngEncoder = new PngEncoder { CompressionLevel = PngCompressionLevel.BestCompression, - IgnoreMetadata = true + SkipMetadata = true }; WebpEncoder = new WebpEncoder { diff --git a/framework/src/Volo.Abp.Imaging.ImageSharp/Volo/Abp/Imaging/ImageSharpImageCompressorContributor.cs b/framework/src/Volo.Abp.Imaging.ImageSharp/Volo/Abp/Imaging/ImageSharpImageCompressorContributor.cs index 8d2f29dd02..83988c8c26 100644 --- a/framework/src/Volo.Abp.Imaging.ImageSharp/Volo/Abp/Imaging/ImageSharpImageCompressorContributor.cs +++ b/framework/src/Volo.Abp.Imaging.ImageSharp/Volo/Abp/Imaging/ImageSharpImageCompressorContributor.cs @@ -34,14 +34,14 @@ public class ImageSharpImageCompressorContributor : IImageCompressorContributor, return new ImageCompressResult(stream, ImageProcessState.Unsupported); } - var (image, format) = await Image.LoadWithFormatAsync(stream, cancellationToken); + var image = await Image.LoadAsync(stream, cancellationToken); - if (!CanCompress(format.DefaultMimeType)) + if (!CanCompress(image.Metadata.DecodedImageFormat!.DefaultMimeType)) { return new ImageCompressResult(stream, ImageProcessState.Unsupported); } - var memoryStream = await GetStreamFromImageAsync(image, format, cancellationToken); + var memoryStream = await GetStreamFromImageAsync(image, image.Metadata.DecodedImageFormat, cancellationToken); if (memoryStream.Length < stream.Length) { diff --git a/framework/src/Volo.Abp.Imaging.ImageSharp/Volo/Abp/Imaging/ImageSharpImageResizerContributor.cs b/framework/src/Volo.Abp.Imaging.ImageSharp/Volo/Abp/Imaging/ImageSharpImageResizerContributor.cs index 92dbc25034..df93258f72 100644 --- a/framework/src/Volo.Abp.Imaging.ImageSharp/Volo/Abp/Imaging/ImageSharpImageResizerContributor.cs +++ b/framework/src/Volo.Abp.Imaging.ImageSharp/Volo/Abp/Imaging/ImageSharpImageResizerContributor.cs @@ -24,9 +24,9 @@ public class ImageSharpImageResizerContributor : IImageResizerContributor, ITran return new ImageResizeResult(stream, ImageProcessState.Unsupported); } - var (image, format) = await Image.LoadWithFormatAsync(stream, cancellationToken); + var image = await Image.LoadAsync(stream, cancellationToken); - if (!CanResize(format.DefaultMimeType)) + if (!CanResize(image.Metadata.DecodedImageFormat!.DefaultMimeType)) { return new ImageResizeResult(stream, ImageProcessState.Unsupported); } @@ -44,7 +44,7 @@ public class ImageSharpImageResizerContributor : IImageResizerContributor, ITran try { - await image.SaveAsync(memoryStream, format, cancellationToken: cancellationToken); + await image.SaveAsync(memoryStream, image.Metadata.DecodedImageFormat, cancellationToken: cancellationToken); memoryStream.Position = 0; return new ImageResizeResult(memoryStream, ImageProcessState.Done); } diff --git a/framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/StandardMenus.cs b/framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/StandardMenus.cs index c22645e33a..83f7f70cc9 100644 --- a/framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/StandardMenus.cs +++ b/framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/StandardMenus.cs @@ -2,12 +2,6 @@ namespace Volo.Abp.UI.Navigation; public static class StandardMenus { - /* TODO: Consider to create nested class like - * StandardMenus.Application.Main - * StandardMenus.Application.User - * StandardMenus.Application.Shortcut - */ - public const string Main = "Main"; public const string User = "User"; public const string Shortcut = "Shortcut"; diff --git a/framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/Urls/AppUrlProvider.cs b/framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/Urls/AppUrlProvider.cs index a258d3f8ab..b8bebd95a5 100644 --- a/framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/Urls/AppUrlProvider.cs +++ b/framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/Urls/AppUrlProvider.cs @@ -53,6 +53,16 @@ public class AppUrlProvider : IAppUrlProvider, ITransientDependency return allow; } + public virtual async Task NormalizeUrlAsync(string? url) + { + if (string.IsNullOrWhiteSpace(url)) + { + return url; + } + + return await ReplacePlaceHoldersAsync(url!); + } + protected virtual async Task GetConfiguredUrl(string appName, string? urlName) { var url = await GetUrlOrNullAsync(appName, urlName); diff --git a/framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/Urls/IAppUrlProvider.cs b/framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/Urls/IAppUrlProvider.cs index 9241c5f428..4e800a524e 100644 --- a/framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/Urls/IAppUrlProvider.cs +++ b/framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/Urls/IAppUrlProvider.cs @@ -10,4 +10,6 @@ public interface IAppUrlProvider Task GetUrlOrNullAsync([NotNull] string appName, string? urlName = null); bool IsRedirectAllowedUrl(string url); + + Task NormalizeUrlAsync(string? url); } diff --git a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/ar.json b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/ar.json index bcbab76211..a7de87d5ef 100644 --- a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/ar.json +++ b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/ar.json @@ -49,6 +49,8 @@ "ItemWillBeDeletedMessageWithFormat": "سيتم حذف {0}!", "ItemWillBeDeletedMessage": "سوف يتم حذف هذا البند!", "ManageYourAccount": "إدارة حسابك", - "OthersGroup": "آخرون" + "OthersGroup": "آخرون", + "Today": "اليوم", + "Apply": "يتقدم" } } diff --git a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/cs.json b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/cs.json index 5dc41952a6..a1f1856c9e 100644 --- a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/cs.json +++ b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/cs.json @@ -49,6 +49,8 @@ "ItemWillBeDeletedMessageWithFormat": "{0} bude smazáno!", "ItemWillBeDeletedMessage": "Tato položka bude smazána!", "ManageYourAccount": "Spravujte svůj účet", - "OthersGroup": "Jiný" + "OthersGroup": "Jiný", + "Today": "Dnes", + "Apply": "Aplikovat" } } diff --git a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/de.json b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/de.json index dc99f75586..22fddc3e27 100644 --- a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/de.json +++ b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/de.json @@ -49,6 +49,8 @@ "ItemWillBeDeletedMessageWithFormat": "{0} wird gelöscht!", "ItemWillBeDeletedMessage": "Dieses Element wird gelöscht!", "ManageYourAccount": "Verwalten Sie Ihr Benutzerkonto", - "OthersGroup":"Andere" + "OthersGroup":"Andere", + "Today": "Heute", + "Apply": "Anwenden" } } \ No newline at end of file diff --git a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/el.json b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/el.json index 24a7642eb0..8cb7b4c0dc 100644 --- a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/el.json +++ b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/el.json @@ -49,6 +49,8 @@ "ItemWillBeDeletedMessageWithFormat": "Το {0} θα διαγραφεί", "ItemWillBeDeletedMessage": "Αυτό το στοιχείο θα διαγραφεί!", "ManageYourAccount": "Διαχείριση Λογαριασμού", - "OthersGroup":"άλλος" + "OthersGroup":"άλλος", + "Today": "Σήμερα", + "Apply": "Ισχύουν" } } \ No newline at end of file diff --git a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/en-GB.json b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/en-GB.json index c6ea44f1f3..68ad3dda07 100644 --- a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/en-GB.json +++ b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/en-GB.json @@ -50,6 +50,8 @@ "ItemWillBeDeletedMessage": "This item will be deleted!", "ManageYourAccount": "Manage your account", "OthersGroup": "Other", - "NotAssigned": "Not Assigned" + "NotAssigned": "Not Assigned", + "Today": "Today", + "Apply": "Apply" } } \ No newline at end of file diff --git a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/es.json b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/es.json index c28e8049bc..abf136d87b 100644 --- a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/es.json +++ b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/es.json @@ -49,6 +49,8 @@ "ItemWillBeDeletedMessageWithFormat": "{0} serán borrados!", "ItemWillBeDeletedMessage": "Este elemento será borrado", "ManageYourAccount": "Administrar cuenta", - "OthersGroup": "Otra" + "OthersGroup": "Otra", + "Today": "Hoy", + "Apply": "Aplicar" } } diff --git a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/fa.json b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/fa.json index 4fd179573b..bcc6250656 100644 --- a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/fa.json +++ b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/fa.json @@ -49,6 +49,8 @@ "ItemWillBeDeletedMessageWithFormat": "{0} حذف خواهد شد!", "ItemWillBeDeletedMessage": "این مورد حذف خواهد شد!", "ManageYourAccount": "حساب خود را مدیریت کنید", - "OthersGroup": "دیگر" + "OthersGroup": "دیگر", + "Today": "امروز", + "Apply": "درخواست دادن" } } diff --git a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/fi.json b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/fi.json index 25811c92eb..25ab3ee59a 100644 --- a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/fi.json +++ b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/fi.json @@ -49,6 +49,8 @@ "ItemWillBeDeletedMessageWithFormat": "{0} poistetaan!", "ItemWillBeDeletedMessage": "Tämä kohde poistetaan!", "ManageYourAccount": "Hallitse tiliäsi", - "OthersGroup": "Muut" + "OthersGroup": "Muut", + "Today": "Tänään", + "Apply": "Käytä" } } diff --git a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/fr.json b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/fr.json index b850315dfe..6e5c67d2d6 100644 --- a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/fr.json +++ b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/fr.json @@ -49,6 +49,8 @@ "ItemWillBeDeletedMessageWithFormat": "{0} sera supprimé!", "ItemWillBeDeletedMessage": "Cet objet va être supprimé!", "ManageYourAccount": "Gérer votre compte", - "OthersGroup": "Autre" + "OthersGroup": "Autre", + "Today": "Aujourd'hui", + "Apply": "Appliquer" } } diff --git a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/hi.json b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/hi.json index 0a20f1dcbb..96b73848f5 100644 --- a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/hi.json +++ b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/hi.json @@ -49,6 +49,8 @@ "ItemWillBeDeletedMessageWithFormat": "{0} हटा दिया जाएगा!", "ItemWillBeDeletedMessage": "यह आइटम हटा दिया जाएगा!", "ManageYourAccount": "अपने खाते का प्रबंधन", - "OthersGroup": "अन्य" + "OthersGroup": "अन्य", + "Today": "आज", + "Apply": "आवेदन करना" } } diff --git a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/hr.json b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/hr.json index a6285a4cee..3126f17bbf 100644 --- a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/hr.json +++ b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/hr.json @@ -49,6 +49,8 @@ "ItemWillBeDeletedMessageWithFormat": "{0} zapis će biti obrisan!", "ItemWillBeDeletedMessage": "Ovaj zapis će biti obrisan!", "ManageYourAccount": "Upravljaj korisničkim računom", - "OthersGroup": "Drugi" + "OthersGroup": "Drugi", + "Today": "Danas", + "Apply": "primijeniti" } } diff --git a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/hu.json b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/hu.json index 98c0c46f54..f3e6454b5b 100644 --- a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/hu.json +++ b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/hu.json @@ -49,6 +49,8 @@ "ItemWillBeDeletedMessageWithFormat": "{0} törlésre kerül!", "ItemWillBeDeletedMessage": "Ez az elem törlődik!", "ManageYourAccount": "Kezelje fiókját", - "OthersGroup": "Egyéb" + "OthersGroup": "Egyéb", + "Today": "Ma", + "Apply": "Alkalmaz" } } diff --git a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/is.json b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/is.json index 12b1565c2e..5a9d9eab54 100644 --- a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/is.json +++ b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/is.json @@ -49,6 +49,8 @@ "ItemWillBeDeletedMessageWithFormat": "{0} verður eytt!", "ItemWillBeDeletedMessage": "Þessum lið verður eytt!", "ManageYourAccount": "Stillingar notandaaðgangs", - "OthersGroup": "Annað" + "OthersGroup": "Annað", + "Today": "Í dag", + "Apply": "Sækja um" } } diff --git a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/it.json b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/it.json index f07bf67e2d..171681980d 100644 --- a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/it.json +++ b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/it.json @@ -49,6 +49,8 @@ "ItemWillBeDeletedMessageWithFormat": "{0} sarà eliminato!", "ItemWillBeDeletedMessage": "Questo elemento sarà eliminato!", "ManageYourAccount": "Gestisci il tuo account", - "OthersGroup": "Altra" + "OthersGroup": "Altra", + "Today": "Oggi", + "Apply": "Fare domanda a" } } diff --git a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/nl.json b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/nl.json index 5875fe07b9..42d48d5900 100644 --- a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/nl.json +++ b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/nl.json @@ -49,6 +49,8 @@ "ItemWillBeDeletedMessageWithFormat": "{0} wordt verwijderd!", "ItemWillBeDeletedMessage": "Dit item wordt verwijderd!", "ManageYourAccount": "Beheer uw account", - "OthersGroup": "Ander" + "OthersGroup": "Ander", + "Today": "Vandaag", + "Apply": "Toepassen" } } diff --git a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/pl-PL.json b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/pl-PL.json index f2b8227137..bd7a6d5818 100644 --- a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/pl-PL.json +++ b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/pl-PL.json @@ -49,6 +49,8 @@ "ItemWillBeDeletedMessageWithFormat": "{0} zostanie usunięty!", "ItemWillBeDeletedMessage": "Ten element zostanie usunięty!", "ManageYourAccount": "Zarządzaj kontem", - "OthersGroup": "Inny" + "OthersGroup": "Inny", + "Today": "Dzisiaj", + "Apply": "Stosować" } } diff --git a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/pt-BR.json b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/pt-BR.json index 928c9299fb..a205b9442a 100644 --- a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/pt-BR.json +++ b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/pt-BR.json @@ -49,6 +49,8 @@ "ItemWillBeDeletedMessageWithFormat": "{0} será excluído!", "ItemWillBeDeletedMessage": "Este item será excluído!", "ManageYourAccount": "Gerenciar sua conta", - "OthersGroup": "Outra" + "OthersGroup": "Outra", + "Today": "Hoje", + "Apply": "Aplicar" } } diff --git a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/ro-RO.json b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/ro-RO.json index 544b893c39..0edf60e833 100644 --- a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/ro-RO.json +++ b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/ro-RO.json @@ -49,6 +49,8 @@ "ItemWillBeDeletedMessageWithFormat": "{0} va fi şters!", "ItemWillBeDeletedMessage": "Acest articol va fi şters!", "ManageYourAccount": "Administraţi-vă contul", - "OthersGroup": "Alte" + "OthersGroup": "Alte", + "Today": "Astăzi", + "Apply": "aplica" } } diff --git a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/ru.json b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/ru.json index 66f24ca65d..53104c18f4 100644 --- a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/ru.json +++ b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/ru.json @@ -49,6 +49,8 @@ "ItemWillBeDeletedMessageWithFormat": "{0} будет удален!", "ItemWillBeDeletedMessage": "Этот предмет будет удален!", "ManageYourAccount": "Настройте свой аккаунт", - "OthersGroup": "Другой" + "OthersGroup": "Другой", + "Today": "Сегодня", + "Apply": "Применять" } } diff --git a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/sk.json b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/sk.json index 28278f04f2..313ce021de 100644 --- a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/sk.json +++ b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/sk.json @@ -49,6 +49,8 @@ "ItemWillBeDeletedMessageWithFormat": "{0} sa vymaže!", "ItemWillBeDeletedMessage": "Táto položka bude vymazaná!", "ManageYourAccount": "Spravovať svoje konto", - "OthersGroup": "Iné" + "OthersGroup": "Iné", + "Today": "Dnes", + "Apply": "Použiť" } } diff --git a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/sl.json b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/sl.json index c05c1dc202..e7ff5ddc66 100644 --- a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/sl.json +++ b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/sl.json @@ -49,6 +49,8 @@ "ItemWillBeDeletedMessageWithFormat": "{0} bo izbrisan!", "ItemWillBeDeletedMessage": "Ta element bo izbrisan!", "ManageYourAccount": "Upravljajte svoj račun", - "OthersGroup": "Ostalo" + "OthersGroup": "Ostalo", + "Today": "Danes", + "Apply": "Prijavite se" } } diff --git a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/vi.json b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/vi.json index 1b8bc5fb5b..581964a9b8 100644 --- a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/vi.json +++ b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/vi.json @@ -49,6 +49,8 @@ "ItemWillBeDeletedMessageWithFormat": "{0} sẽ bị xóa!", "ItemWillBeDeletedMessage": "Vật phẩm này sẽ bị xoá!", "ManageYourAccount": "Quản lý tài khoản của bạn", - "OthersGroup": "Khác" + "OthersGroup": "Khác", + "Today": "Hôm nay", + "Apply": "Áp dụng" } } diff --git a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/zh-Hans.json b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/zh-Hans.json index bcf68dbcaa..51d5865924 100644 --- a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/zh-Hans.json +++ b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/zh-Hans.json @@ -51,6 +51,8 @@ "ManageYourAccount": "管理你的账户", "OthersGroup": "其他", "CopiedToTheClipboard": "已复制到剪贴板", - "NotAssigned": "未分配" + "NotAssigned": "未分配", + "Today": "今天", + "Apply": "应用" } } diff --git a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/zh-Hant.json b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/zh-Hant.json index 1c2719b954..dac062d1cd 100644 --- a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/zh-Hant.json +++ b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/zh-Hant.json @@ -51,6 +51,8 @@ "ManageYourAccount": "管理個人帳號", "OthersGroup": "其他", "CopiedToTheClipboard": "已复制到剪贴板", - "NotAssigned": "未分配" + "NotAssigned": "未分配", + "Today": "今天", + "Apply": "應用" } } diff --git a/framework/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/App/Entities/AppEntityWithNavigations.cs b/framework/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/App/Entities/AppEntityWithNavigations.cs new file mode 100644 index 0000000000..e68d9d94b8 --- /dev/null +++ b/framework/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/App/Entities/AppEntityWithNavigations.cs @@ -0,0 +1,51 @@ +using System; +using System.Collections.Generic; +using Volo.Abp.Domain.Entities; + +namespace Volo.Abp.Auditing.App.Entities; + +[Audited] +public class AppEntityWithNavigations : AggregateRoot +{ + protected AppEntityWithNavigations() + { + + } + + public AppEntityWithNavigations(Guid id, string name) + : base(id) + { + Name = name; + FullName = name; + } + + public string Name { get; set; } + + public string FullName { get; set; } + + public virtual AppEntityWithNavigationChildOneToOne OneToOne { get; set; } + + public virtual List OneToMany { get; set; } + + public virtual List ManyToMany { get; set; } +} + +[Audited] +public class AppEntityWithNavigationChildOneToOne : Entity +{ + public string ChildName { get; set; } +} + +[Audited] +public class AppEntityWithNavigationChildOneToMany : Entity +{ + public Guid AppEntityWithNavigationId { get; set; } + + public string ChildName { get; set; } +} + +[Audited] +public class AppEntityWithNavigationChildManyToMany : Entity +{ + public string ChildName { get; set; } +} diff --git a/framework/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/App/EntityFrameworkCore/AbpAuditingTestDbContext.cs b/framework/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/App/EntityFrameworkCore/AbpAuditingTestDbContext.cs index 8a0a798598..f6d4bf49ef 100644 --- a/framework/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/App/EntityFrameworkCore/AbpAuditingTestDbContext.cs +++ b/framework/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/App/EntityFrameworkCore/AbpAuditingTestDbContext.cs @@ -27,6 +27,8 @@ public class AbpAuditingTestDbContext : AbpDbContext public DbSet AppEntityWithValueObject { get; set; } + public DbSet AppEntityWithNavigations { get; set; } + public AbpAuditingTestDbContext(DbContextOptions options) : base(options) { @@ -42,5 +44,14 @@ public class AbpAuditingTestDbContext : AbpDbContext b.ConfigureByConvention(); b.OwnsOne(v => v.AppEntityWithValueObjectAddress); }); + + modelBuilder.Entity(b => + { + b.ConfigureByConvention(); + b.HasOne(x => x.OneToOne).WithOne().HasForeignKey(x => x.Id); + b.HasMany(x => x.OneToMany).WithOne().HasForeignKey(x => x.AppEntityWithNavigationId); + b.HasMany(x => x.ManyToMany).WithMany(); + }); + } } diff --git a/framework/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/Auditing_Tests.cs b/framework/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/Auditing_Tests.cs index 3aa0da5a9b..7154fd805c 100644 --- a/framework/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/Auditing_Tests.cs +++ b/framework/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/Auditing_Tests.cs @@ -411,14 +411,172 @@ public class Auditing_Tests : AbpAuditingTestBase #pragma warning disable 4014 AuditingStore.Received().SaveAsync(Arg.Is(x => x.EntityChanges.Count == 2 && x.EntityChanges[0].ChangeType == EntityChangeType.Updated && - x.EntityChanges[0].EntityTypeFullName == typeof(AppEntityWithValueObject).FullName && + x.EntityChanges[0].EntityTypeFullName == typeof(AppEntityWithValueObjectAddress).FullName && + x.EntityChanges[0].PropertyChanges.Count == 1 && + x.EntityChanges[0].PropertyChanges[0].PropertyName == nameof(AppEntityWithValueObjectAddress.Country) && + x.EntityChanges[0].PropertyChanges[0].OriginalValue == "\"England\"" && + x.EntityChanges[0].PropertyChanges[0].NewValue == "\"Germany\"" && + + x.EntityChanges[1].ChangeType == EntityChangeType.Updated && + x.EntityChanges[1].EntityTypeFullName == typeof(AppEntityWithValueObject).FullName && + x.EntityChanges[1].PropertyChanges.Count == 1 && + x.EntityChanges[1].PropertyChanges[0].PropertyName == nameof(AppEntityWithValueObject.AppEntityWithValueObjectAddress))); + +#pragma warning restore 4014 + + using (var scope = _auditingManager.BeginScope()) + { + using (var uow = _unitOfWorkManager.Begin()) + { + var entity = await repository.GetAsync(entityId); + + entity.AppEntityWithValueObjectAddress = null; + + await repository.UpdateAsync(entity); + await uow.CompleteAsync(); + await scope.SaveAsync(); + } + } + +#pragma warning disable 4014 + AuditingStore.Received().SaveAsync(Arg.Is(x => x.EntityChanges.Count == 2 && + x.EntityChanges[0].ChangeType == EntityChangeType.Updated && + x.EntityChanges[0].EntityTypeFullName == typeof(AppEntityWithValueObjectAddress).FullName && + x.EntityChanges[0].PropertyChanges.Count == 1 && + x.EntityChanges[0].PropertyChanges[0].PropertyName == nameof(AppEntityWithValueObjectAddress.Country) && + x.EntityChanges[0].PropertyChanges[0].OriginalValue == "\"England\"" && + x.EntityChanges[0].PropertyChanges[0].NewValue == "\"Germany\"" && + + x.EntityChanges[1].ChangeType == EntityChangeType.Updated && + x.EntityChanges[1].EntityTypeFullName == typeof(AppEntityWithValueObject).FullName)); + +#pragma warning restore 4014 + } + + [Fact] + public virtual async Task Should_Write_AuditLog_For_Navigations_Changes() + { + var entityId = Guid.NewGuid(); + var repository = ServiceProvider.GetRequiredService>(); + await repository.InsertAsync(new AppEntityWithNavigations(entityId, "test name")); + + using (var scope = _auditingManager.BeginScope()) + { + using (var uow = _unitOfWorkManager.Begin()) + { + var entity = await repository.GetAsync(entityId); + + entity.FullName = "test full name"; + + await repository.UpdateAsync(entity); + + await uow.CompleteAsync(); + await scope.SaveAsync(); + } + } + +#pragma warning disable 4014 + AuditingStore.Received().SaveAsync(Arg.Is(x => x.EntityChanges.Count == 1 && + x.EntityChanges[0].ChangeType == EntityChangeType.Updated && + x.EntityChanges[0].EntityTypeFullName == typeof(AppEntityWithNavigations).FullName && + x.EntityChanges[0].PropertyChanges.Count == 1 && + x.EntityChanges[0].PropertyChanges[0].OriginalValue == "\"test name\"" && + x.EntityChanges[0].PropertyChanges[0].NewValue == "\"test full name\"" && + x.EntityChanges[0].PropertyChanges[0].PropertyName == nameof(AppEntityWithNavigations.FullName) && + x.EntityChanges[0].PropertyChanges[0].PropertyTypeFullName == typeof(string).FullName)); +#pragma warning restore 4014 + using (var scope = _auditingManager.BeginScope()) + { + using (var uow = _unitOfWorkManager.Begin()) + { + var entity = await repository.GetAsync(entityId); + + entity.OneToOne = new AppEntityWithNavigationChildOneToOne + { + ChildName = "ChildName" + }; + + await repository.UpdateAsync(entity); + + await uow.CompleteAsync(); + await scope.SaveAsync(); + } + } + +#pragma warning disable 4014 + AuditingStore.Received().SaveAsync(Arg.Is(x => x.EntityChanges.Count == 2 && + x.EntityChanges[0].ChangeType == EntityChangeType.Created && + x.EntityChanges[0].EntityTypeFullName == typeof(AppEntityWithNavigationChildOneToOne).FullName && + x.EntityChanges[1].ChangeType == EntityChangeType.Updated && + x.EntityChanges[1].EntityTypeFullName == typeof(AppEntityWithNavigations).FullName && + x.EntityChanges[1].PropertyChanges.Count == 1 && + x.EntityChanges[1].PropertyChanges[0].PropertyName == nameof(AppEntityWithNavigations.OneToOne) && + x.EntityChanges[1].PropertyChanges[0].PropertyTypeFullName == typeof(AppEntityWithNavigationChildOneToOne).FullName)); +#pragma warning restore 4014 + + using (var scope = _auditingManager.BeginScope()) + { + using (var uow = _unitOfWorkManager.Begin()) + { + var entity = await repository.GetAsync(entityId); + + entity.OneToMany = new List() + { + new AppEntityWithNavigationChildOneToMany + { + AppEntityWithNavigationId = entity.Id, + ChildName = "ChildName1" + } + }; + + await repository.UpdateAsync(entity); + await uow.CompleteAsync(); + await scope.SaveAsync(); + } + } + +#pragma warning disable 4014 + AuditingStore.Received().SaveAsync(Arg.Is(x => x.EntityChanges.Count == 2 && + x.EntityChanges[0].ChangeType == EntityChangeType.Created && + x.EntityChanges[0].EntityTypeFullName == typeof(AppEntityWithNavigationChildOneToMany).FullName && + x.EntityChanges[1].ChangeType == EntityChangeType.Updated && + x.EntityChanges[1].EntityTypeFullName == typeof(AppEntityWithNavigations).FullName && + x.EntityChanges[1].PropertyChanges.Count == 1 && + x.EntityChanges[1].PropertyChanges[0].PropertyName == nameof(AppEntityWithNavigations.OneToMany) && + x.EntityChanges[1].PropertyChanges[0].PropertyTypeFullName == typeof(List).FullName)); + +#pragma warning restore 4014 + + using (var scope = _auditingManager.BeginScope()) + { + using (var uow = _unitOfWorkManager.Begin()) + { + var entity = await repository.GetAsync(entityId); + + entity.ManyToMany = new List() + { + new AppEntityWithNavigationChildManyToMany + { + ChildName = "ChildName1" + } + }; + + await repository.UpdateAsync(entity); + await uow.CompleteAsync(); + await scope.SaveAsync(); + } + } + +#pragma warning disable 4014 + AuditingStore.Received().SaveAsync(Arg.Is(x => x.EntityChanges.Count == 2 && + x.EntityChanges[0].ChangeType == EntityChangeType.Created && + x.EntityChanges[0].EntityTypeFullName == typeof(AppEntityWithNavigationChildManyToMany).FullName && x.EntityChanges[1].ChangeType == EntityChangeType.Updated && - x.EntityChanges[1].EntityTypeFullName == typeof(AppEntityWithValueObjectAddress).FullName && + x.EntityChanges[1].EntityTypeFullName == typeof(AppEntityWithNavigations).FullName && x.EntityChanges[1].PropertyChanges.Count == 1 && - x.EntityChanges[1].PropertyChanges[0].PropertyName == nameof(AppEntityWithValueObjectAddress.Country) && - x.EntityChanges[1].PropertyChanges[0].OriginalValue == "\"England\"" && - x.EntityChanges[1].PropertyChanges[0].NewValue == "\"Germany\"")); + x.EntityChanges[1].PropertyChanges[0].PropertyName == nameof(AppEntityWithNavigations.ManyToMany) && + x.EntityChanges[1].PropertyChanges[0].PropertyTypeFullName == typeof(List).FullName)); #pragma warning restore 4014 } diff --git a/latest-versions.json b/latest-versions.json index 7823e6af9d..e2911011e7 100644 --- a/latest-versions.json +++ b/latest-versions.json @@ -1,6 +1,6 @@ [ { - "version": "7.4.0", + "version": "7.4.1", "releaseDate": "", "type": "stable", "message": "" diff --git a/modules/account/src/Volo.Abp.Account.Web/Pages/Account/Login.cshtml.cs b/modules/account/src/Volo.Abp.Account.Web/Pages/Account/Login.cshtml.cs index ab5e2819cb..d4bb0dbc5e 100644 --- a/modules/account/src/Volo.Abp.Account.Web/Pages/Account/Login.cshtml.cs +++ b/modules/account/src/Volo.Abp.Account.Web/Pages/Account/Login.cshtml.cs @@ -242,14 +242,16 @@ public class LoginModel : AccountPageModel var user = await UserManager.FindByEmailAsync(email); if (user == null) { - user = await CreateExternalUserAsync(loginInfo); + return RedirectToPage("./Register", new { + IsExternalLogin = true, + ExternalLoginAuthSchema = loginInfo.LoginProvider, + ReturnUrl = returnUrl + }); } - else + + if (await UserManager.FindByLoginAsync(loginInfo.LoginProvider, loginInfo.ProviderKey) == null) { - if (await UserManager.FindByLoginAsync(loginInfo.LoginProvider, loginInfo.ProviderKey) == null) - { - CheckIdentityErrors(await UserManager.AddLoginAsync(user, loginInfo)); - } + CheckIdentityErrors(await UserManager.AddLoginAsync(user, loginInfo)); } await SignInManager.SignInAsync(user, false); @@ -264,35 +266,6 @@ public class LoginModel : AccountPageModel return RedirectSafely(returnUrl, returnUrlHash); } - protected virtual async Task CreateExternalUserAsync(ExternalLoginInfo info) - { - await IdentityOptions.SetAsync(); - - var emailAddress = info.Principal.FindFirstValue(AbpClaimTypes.Email) ?? info.Principal.FindFirstValue(ClaimTypes.Email); - var userName = await GetUserNameFromEmail(emailAddress); - - var user = new IdentityUser(GuidGenerator.Create(), userName, emailAddress, CurrentTenant.Id); - - CheckIdentityErrors(await UserManager.CreateAsync(user)); - CheckIdentityErrors(await UserManager.SetEmailAsync(user, emailAddress)); - CheckIdentityErrors(await UserManager.AddLoginAsync(user, info)); - CheckIdentityErrors(await UserManager.AddDefaultRolesAsync(user)); - - user.Name = info.Principal.FindFirstValue(AbpClaimTypes.Name); - user.Surname = info.Principal.FindFirstValue(AbpClaimTypes.SurName); - - var phoneNumber = info.Principal.FindFirstValue(AbpClaimTypes.PhoneNumber); - if (!phoneNumber.IsNullOrWhiteSpace()) - { - var phoneNumberConfirmed = string.Equals(info.Principal.FindFirstValue(AbpClaimTypes.PhoneNumberVerified), "true", StringComparison.InvariantCultureIgnoreCase); - user.SetPhoneNumber(phoneNumber, phoneNumberConfirmed); - } - - await UserManager.UpdateAsync(user); - - return user; - } - protected virtual async Task ReplaceEmailToUsernameOfInputIfNeeds() { if (!ValidationHelper.IsValidEmailAddress(LoginInput.UserNameOrEmailAddress)) diff --git a/modules/account/src/Volo.Abp.Account.Web/Pages/Account/Register.cshtml b/modules/account/src/Volo.Abp.Account.Web/Pages/Account/Register.cshtml index fabe41ae6f..745368402c 100644 --- a/modules/account/src/Volo.Abp.Account.Web/Pages/Account/Register.cshtml +++ b/modules/account/src/Volo.Abp.Account.Web/Pages/Account/Register.cshtml @@ -12,7 +12,7 @@ @L["Login"]
- @if ((!Model.IsExternalLogin || Model.UserNameExtracted) && Model.EnableLocalRegister) + @if (Model.EnableLocalRegister || Model.IsExternalLogin) { } diff --git a/modules/account/src/Volo.Abp.Account.Web/Pages/Account/Register.cshtml.cs b/modules/account/src/Volo.Abp.Account.Web/Pages/Account/Register.cshtml.cs index 722eca26b7..322a17e82f 100644 --- a/modules/account/src/Volo.Abp.Account.Web/Pages/Account/Register.cshtml.cs +++ b/modules/account/src/Volo.Abp.Account.Web/Pages/Account/Register.cshtml.cs @@ -37,7 +37,6 @@ public class RegisterModel : AccountPageModel [BindProperty(SupportsGet = true)] public string ExternalLoginAuthSchema { get; set; } - public bool UserNameExtracted { get; set; } public IEnumerable ExternalProviders { get; set; } public IEnumerable VisibleExternalProviders => ExternalProviders.Where(x => !string.IsNullOrWhiteSpace(x.DisplayName)); public bool EnableLocalRegister { get; set; } @@ -128,7 +127,6 @@ public class RegisterModel : AccountPageModel { Input.UserName = await GetUserNameFromEmail(Input.EmailAddress); } - UserNameExtracted = true; await RegisterExternalUserAsync(externalLoginInfo, Input.UserName, Input.EmailAddress); } else diff --git a/modules/audit-logging/src/Volo.Abp.AuditLogging.EntityFrameworkCore/Volo/Abp/AuditLogging/EntityFrameworkCore/AbpAuditLoggingDbContextModelBuilderExtensions.cs b/modules/audit-logging/src/Volo.Abp.AuditLogging.EntityFrameworkCore/Volo/Abp/AuditLogging/EntityFrameworkCore/AbpAuditLoggingDbContextModelBuilderExtensions.cs index 8a3cd7de23..e63d806993 100644 --- a/modules/audit-logging/src/Volo.Abp.AuditLogging.EntityFrameworkCore/Volo/Abp/AuditLogging/EntityFrameworkCore/AbpAuditLoggingDbContextModelBuilderExtensions.cs +++ b/modules/audit-logging/src/Volo.Abp.AuditLogging.EntityFrameworkCore/Volo/Abp/AuditLogging/EntityFrameworkCore/AbpAuditLoggingDbContextModelBuilderExtensions.cs @@ -73,7 +73,7 @@ public static class AbpAuditLoggingDbContextModelBuilderExtensions b.ConfigureByConvention(); b.Property(x => x.EntityTypeFullName).HasMaxLength(EntityChangeConsts.MaxEntityTypeFullNameLength).IsRequired().HasColumnName(nameof(EntityChange.EntityTypeFullName)); - b.Property(x => x.EntityId).HasMaxLength(EntityChangeConsts.MaxEntityIdLength).IsRequired().HasColumnName(nameof(EntityChange.EntityId)); + b.Property(x => x.EntityId).HasMaxLength(EntityChangeConsts.MaxEntityIdLength).HasColumnName(nameof(EntityChange.EntityId)); b.Property(x => x.AuditLogId).IsRequired().HasColumnName(nameof(EntityChange.AuditLogId)); b.Property(x => x.ChangeTime).IsRequired().HasColumnName(nameof(EntityChange.ChangeTime)); b.Property(x => x.ChangeType).IsRequired().HasColumnName(nameof(EntityChange.ChangeType)); 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 dd83d4934a..dd3cc1b622 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,7 +3,7 @@ "name": "asp.net", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.shared": "~7.4.0", + "@abp/aspnetcore.mvc.ui.theme.shared": "~7.4.1", "@abp/prismjs": "^~7.3.2", "@abp/highlight.js": "^~7.3.2" }, 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 80700852b3..715a290a18 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": "~7.4.0", - "@abp/prismjs": "~7.4.0" + "@abp/aspnetcore.mvc.ui.theme.basic": "~7.4.1", + "@abp/prismjs": "~7.4.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 a61b076582..ec4f519955 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,39 +2,39 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.basic@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-7.4.0.tgz#5088dd82ce343e1123e025848f09b51df988b225" - integrity sha512-teT7I0kgjek/lHzpTg5VOVCQ3IL26nFB43Aa/45fuaSwh9FJd3IJNXGL6xwp85oKaptDYSBXIF4GbrUfp2Ugqg== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~7.4.0" - -"@abp/aspnetcore.mvc.ui.theme.shared@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-7.4.0.tgz#e676444a46214e850b0d916daeeb912774ac381d" - integrity sha512-X+dgdgHGUTyf0zaSPsqQp2ZZWu2+9gIRT4r4/LDgxchHgfNvcKRF8jH/JICcVgGD1adJvZzzDpTefL8CuAIRJA== - dependencies: - "@abp/aspnetcore.mvc.ui" "~7.4.0" - "@abp/bootstrap" "~7.4.0" - "@abp/bootstrap-datepicker" "~7.4.0" - "@abp/bootstrap-daterangepicker" "~7.4.0" - "@abp/datatables.net-bs5" "~7.4.0" - "@abp/font-awesome" "~7.4.0" - "@abp/jquery-form" "~7.4.0" - "@abp/jquery-validation-unobtrusive" "~7.4.0" - "@abp/lodash" "~7.4.0" - "@abp/luxon" "~7.4.0" - "@abp/malihu-custom-scrollbar-plugin" "~7.4.0" - "@abp/moment" "~7.4.0" - "@abp/select2" "~7.4.0" - "@abp/sweetalert2" "~7.4.0" - "@abp/timeago" "~7.4.0" - "@abp/toastr" "~7.4.0" - -"@abp/aspnetcore.mvc.ui@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-7.4.0.tgz#61e1b52d2a940e02242f57007bd3f0fcb583c09a" - integrity sha512-gdoxOBo10DWDYhUq1GVfguC0Ot8PYhoA3VLf88/RatL88BNUUlt0e71uMFcx/gk72fuAE+o9zXn/6nq1wtpSwQ== +"@abp/aspnetcore.mvc.ui.theme.basic@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-7.4.1.tgz#62df78aab8a0b374817fdbab6c6363529b43f925" + integrity sha512-KaPmBlwNjOl1+vwLj5O8J11YHBSRg4y0IIxtgZiculXQNFPHbYAXm8sfTw6Wcsx00STrhvUVJQxYMePNnOTCTg== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~7.4.1" + +"@abp/aspnetcore.mvc.ui.theme.shared@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-7.4.1.tgz#8f8679f5cf80137324ddbec9fcaa67332783e708" + integrity sha512-0uUKuTsi/ikLFUUNEqvrn7KimgsvuK+7m1yZD4o47FQlgGxTyt1zQY9w3K6YyhyC3lsT6qCwiAPIoFOzPkIg/Q== + dependencies: + "@abp/aspnetcore.mvc.ui" "~7.4.1" + "@abp/bootstrap" "~7.4.1" + "@abp/bootstrap-datepicker" "~7.4.1" + "@abp/bootstrap-daterangepicker" "~7.4.1" + "@abp/datatables.net-bs5" "~7.4.1" + "@abp/font-awesome" "~7.4.1" + "@abp/jquery-form" "~7.4.1" + "@abp/jquery-validation-unobtrusive" "~7.4.1" + "@abp/lodash" "~7.4.1" + "@abp/luxon" "~7.4.1" + "@abp/malihu-custom-scrollbar-plugin" "~7.4.1" + "@abp/moment" "~7.4.1" + "@abp/select2" "~7.4.1" + "@abp/sweetalert2" "~7.4.1" + "@abp/timeago" "~7.4.1" + "@abp/toastr" "~7.4.1" + +"@abp/aspnetcore.mvc.ui@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-7.4.1.tgz#49c13718a17569f97b71f978b50f367dff67b8f7" + integrity sha512-EvYrfk0mpSt1jAMZmfFcHoNWEJskzResKp0bflOYsYPsZPuJ5WraKsk4IEEpesYHCyHW5AAb5HBJHeoSbVLh4Q== dependencies: ansi-colors "^4.1.1" extend-object "^1.0.0" @@ -43,175 +43,175 @@ merge-stream "^2.0.0" micromatch "^4.0.2" -"@abp/bootstrap-datepicker@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-7.4.0.tgz#75edc2127ca26d86bfefaa6e37579b06e32de5de" - integrity sha512-HXUa+kLjKu8sKr+kCZeNye9Pv/swRfKGAt/uJ2WUEvCJ4IVIMM1p6iMnOEEk/+3OGE64/PWu3cdE9dLP6izOaA== +"@abp/bootstrap-datepicker@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-7.4.1.tgz#f8f35d0edf71368faaae4e40a72fa846b0084f9b" + integrity sha512-hsu8ty6c2oOevsNoyFTQ4yJAu27qnz82MgRNVS8MRfdzo05/LhBhy/tKFm+PFYJqZULYlpQ1GXUF2+uGyazIeg== dependencies: bootstrap-datepicker "^1.9.0" -"@abp/bootstrap-daterangepicker@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-7.4.0.tgz#5058fc2a9354f0a71ac5393658e362779a3bdc46" - integrity sha512-EK0wzZUY9H3XPb9U3DvYVqh48fU+6IneNGYOk7dcda8CUYObd4Dl1nXligStCqgn2uePtwxDHRx40eV0GXmU/Q== +"@abp/bootstrap-daterangepicker@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-7.4.1.tgz#b133cefdbed0fa1b8f1bda916a9d46952237238a" + integrity sha512-NpmbsO4Xg48Zmr8OOlf1fxuNMnFIqmRrkHiKp9lP5c8am64+7rRzCwATw2UY0Ud+4n8/ws+Iki1dwPQF6db1zw== dependencies: bootstrap-daterangepicker "^3.1.0" -"@abp/bootstrap@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-7.4.0.tgz#71be70660643d8f60d13d355b8c80b16e4854870" - integrity sha512-3Fa+fL5NH+0H2KK4MAaqNsiz0PYwK0+Oxjmd0NgKwcqV2vJzRrzS3WG5kITYjNz9QGdBV+FrhNX/NSRU8LDx3Q== +"@abp/bootstrap@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-7.4.1.tgz#b34a2fcc80e04212865652ee7f4f5498a6a61f6d" + integrity sha512-/qCgfrtNWZ2jui2iL6wd6MLrcxALSEFVBypaz1JK3WjEe7DvFAYvKLl7DugIv039/Sx3mbx/PJiQhx8CVZMsEA== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" bootstrap "^5.1.3" -"@abp/clipboard@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-7.4.0.tgz#f1d147df94ddf3ab53eeeb05aec3d5556064c5d6" - integrity sha512-z/nB1RQN/tmShSRwc9Fv1DsJSNM7+Zg4GnAtvZNpOHJp8LTVmsJWxLoUM7hF896W9E0JKr8tRuCVqulyh3IqKg== +"@abp/clipboard@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-7.4.1.tgz#31329ad4565b5075b486e9ca63fb0ff8a070ff9e" + integrity sha512-/+ylBPs/TEZdwywSSTnj96WoRJPwQnR6vlI+sX7h9wDfSDbMwuSSdETSnDVT21lkl8gonPONFZTL8D1u/KKAhg== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" clipboard "^2.0.8" -"@abp/core@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-7.4.0.tgz#8505d446a3b4d80ce476bd3352c1639c7dc486ec" - integrity sha512-yxrnw6eAEIj/CcX5jAwb4xmCsdqWaG+KRcBA8GFvqXbsK94IjqLDiJ3flo+QhGn2DXo40ISxofZop0CgSbP7Ew== +"@abp/core@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-7.4.1.tgz#1d14899ad16aac038806504eb0a5be9318cdcc0c" + integrity sha512-p0BAe2kCtgZmq8pilahmuxmye8DeRXt2KmnFRbmYE3j4d0uComFZpC72QOD1iro8bkmbsHfsHJpiVg4Sp4licw== dependencies: - "@abp/utils" "~7.4.0" + "@abp/utils" "~7.4.1" -"@abp/datatables.net-bs5@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-7.4.0.tgz#52d22e12a2420b402e03148793707d063db0088d" - integrity sha512-VvQv5w0cUpdDD9jX8aUEaLxFrc4A95JlmFnhCYIV1etL8HNOdZvmOThxorsImk31JfpyVYrY/Ze/rnWi2uhVvQ== +"@abp/datatables.net-bs5@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-7.4.1.tgz#821ee4c5db116f9810d65184855cea1fa7d47360" + integrity sha512-jpUzb65lCGYAxs/1qV3pRP8agHwIgZA9gDrudvR8S/3X3kNQWtmeKoFDZ93mhnl3aWPjWFKVrT2LeQeJw5XO5A== dependencies: - "@abp/datatables.net" "~7.4.0" + "@abp/datatables.net" "~7.4.1" datatables.net-bs5 "^1.11.4" -"@abp/datatables.net@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-7.4.0.tgz#9f12a1bb2abd05cd753b5d937d8a0350b2ff74ae" - integrity sha512-StOkMmIkcBUWzD9ToZ5J/hISRWdxbAWjwn7RuFXsoHXcY03mmD86g2oztjrWC5UFnRdpFnsfspTpbNqXFB9Vag== +"@abp/datatables.net@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-7.4.1.tgz#a4501e92e9995da0759b9ce55756fe92c4e8db59" + integrity sha512-BZOOZLH7XrGlX3aFK97cwV9+npsTzALSBo87OgwO2U6UpeFq7yAOvmC0+L9dmIUDISeORn5IFc/zTsSSIQnpHQ== dependencies: - "@abp/jquery" "~7.4.0" + "@abp/jquery" "~7.4.1" datatables.net "^1.11.4" -"@abp/font-awesome@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-7.4.0.tgz#50059083b88706a0f71f55118472b378e4c66163" - integrity sha512-hKoPyM41HHCK6dg+8pQvjYJWzKABBCXrYQAIneMPQZUZqa4JLObKCva9TR7pu6pUp+9OVzg4fQOBM+nwpHtw4g== +"@abp/font-awesome@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-7.4.1.tgz#f6175a989aa64367830723f1dd9c607906716296" + integrity sha512-/ybaz4KROwFdG4Xv0yMTUMXOreDmKy1lKQuntqHEUnIorhXmkgcd5AQQ5AolJ4NmNdPNt1VYrRcTEmdz3nw+FA== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" "@fortawesome/fontawesome-free" "^5.15.4" -"@abp/jquery-form@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-7.4.0.tgz#7ab3be241ee09f1e2843bd1b4d0b0b86d4446e30" - integrity sha512-OmTRuZ7QK1oe2ayNLqEpRJk4Ogk0wt/hIFtJHwQkCtDuCggoR5sQz4vn1vgrD19MxGq07dow5IgjbbhHv1vtEg== +"@abp/jquery-form@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-7.4.1.tgz#67978c41cda204b4c2027d81fc66844379313fa6" + integrity sha512-JZ1D47s/kpTlfMcpD4Jrlh98bhEDsIlWJauvAYaS0EBPIU9V2zHGQ+h9GPFbSPrXe4sYxPSREcsc8KUVMhT5MQ== dependencies: - "@abp/jquery" "~7.4.0" + "@abp/jquery" "~7.4.1" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-7.4.0.tgz#0c564e39c4997dd9b8af7d2023615a06d6fd9834" - integrity sha512-vFB3RKkDlDXbHlDJ64uo3jWW1IRXwiCaPf+mcB77Wpt5+0Dn7eWqjBT7KyHBrsV08ghIqY/Q4nXntFJrmLcuEA== +"@abp/jquery-validation-unobtrusive@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-7.4.1.tgz#fe5c90ade419e83505884dd50dd5988d766f177b" + integrity sha512-oHHV/ukap+vDvQ8CnEWnOrrsLkHXIcMk+SjNKe/dyK5VzOVLDpMatRFmloLs2igYVXTqDGjmDlTswTFdJUarcQ== dependencies: - "@abp/jquery-validation" "~7.4.0" + "@abp/jquery-validation" "~7.4.1" jquery-validation-unobtrusive "^3.2.12" -"@abp/jquery-validation@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-7.4.0.tgz#f2aaba8f4c023e93f0051cc9a05c6d82fa5c7254" - integrity sha512-vN4srLT5UXAKXpKHbZgySWT+N2DjRYivgtifpZHMTGFLMW14W+tfi5zhR4H4JvqJpuO6ZKNiz15zA1zwEBK0Tw== +"@abp/jquery-validation@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-7.4.1.tgz#c2c06bc28770832a9ad73eac000586faed3bdbe3" + integrity sha512-A5iFT2EWfGHXrBb/ov5f0grZ2o2xkDaYtps/FnDUwBYdIdD8E7bbJsWp6ytvZDciO0XmEqAoVOxmiij7ue/SOg== dependencies: - "@abp/jquery" "~7.4.0" + "@abp/jquery" "~7.4.1" jquery-validation "^1.19.3" -"@abp/jquery@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-7.4.0.tgz#206891b20f250537d05d907d2b6cd682fec76496" - integrity sha512-DeYo02T6WVhdpLloSPb6ooqtpksu1HtcbbQhIP9E1P7jHSzZoNiJvoKXHiFUcj5PYiGKl9d/o89hM/apWzyreQ== +"@abp/jquery@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-7.4.1.tgz#b5e16834e6c7871ad6392612ac8e2de8617eb353" + integrity sha512-X3RcovvRYISHcsb6W3U3iVsofw6yomoiouoB1tSIy2/tvUbu9n7N/3MM0CUujFm/xib7s3z1tVxFssS9smT7sw== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" jquery "~3.6.0" -"@abp/lodash@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-7.4.0.tgz#93f20abee776dbfa7aa45e2e710f2768f262fda5" - integrity sha512-h4Fnjm+VLwp1F3r57B9MrHhwyOYMo5oP285a85zzAYLkhwcDy7f1nbHKHMQ3ZTaeJVmiRnVaH+3sdUdslCRt5g== +"@abp/lodash@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-7.4.1.tgz#d0f84b7b9cbd989d59ebde594ed7acb8bc720b61" + integrity sha512-RFjZCyAPZnpvT0SJbxXzzmMYbuocSWBlezvjAVA8MiTrOXdZO4VyaTFjIuQcAdSrZhtpFGeYWxAjHshVplxMbw== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" lodash "^4.17.21" -"@abp/luxon@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-7.4.0.tgz#2ba7ff307c8f7c24d818a9c33635b86fd6810db9" - integrity sha512-ROCx7aihM+agdYy7Tkz+GiScx68KY5qwGTnj8P7QabGFChzVUic6RuBG+2Obmfonc6uT7Rq0c8JDGrsGNe/w8A== +"@abp/luxon@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-7.4.1.tgz#e0c0947d2b77f98b9cdaf7d1143025879361c3c9" + integrity sha512-k1wh8tT1529MtNC2gSXEIKdimBXBwubXeLisgpIPx6lkJo1Op6pAz2ERwFXeyktqGdYyuFcnewJIxmS7EPtWhg== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" luxon "^2.3.0" -"@abp/malihu-custom-scrollbar-plugin@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-7.4.0.tgz#aba68877481f4339e048f2ae3cfbe93197145a0a" - integrity sha512-Ntodhi4k0HFQmImYTP5SYf/WDm7aUGJLaGsfePm77HJ6DhGgalIGqtM8NiFXzo/3GmMY0XSo8Wxrs1mSCdtsOA== +"@abp/malihu-custom-scrollbar-plugin@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-7.4.1.tgz#aa7ec247197a258277549052780b38fd9e748c6c" + integrity sha512-pm/wIaiRSgGxelOf8AiL4JKFNZOQ6s2WbR6pULiP2HSNCgCpWYJ2s8fvj7VP3lAHIa98v3m8PSMSUhqaANxZ/Q== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/moment@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-7.4.0.tgz#2490d9c7cdcaeca8d0ba9ebef5e7298caf0c9e09" - integrity sha512-ftsUEgO17GbVawA1GplGFzEeIM4NX004AmS6/fPI3o5isX7o1buF9q9TXdnwUuFEJKZxS4KpveRqzTL5t9k0BQ== +"@abp/moment@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-7.4.1.tgz#1c28ccb13eecdd13695edf8641ca9867b318e37d" + integrity sha512-7vRJyAK5ER9z+LV1xUSAAtWlPlhv8yhM/nHjhC+IQSP/+V1D7VLA6EKxAEexGw7wX6HY8oMOWP9HxDHMb5hKQA== dependencies: moment "^2.9.0" -"@abp/prismjs@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-7.4.0.tgz#8572f36f853c7054d77d02f3098cd844ee321ed7" - integrity sha512-y/Iy6pddQeVazEITktPot8JOPdAEOVAfmYkTBP3DIIPvoYr3kf6rwfzBUalMw5CEjWZ9BaIszDgFCk5ucNHHwQ== +"@abp/prismjs@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-7.4.1.tgz#df4387dbc2f0c77ddb9b6bd0ade9a5db29b9cee2" + integrity sha512-bI7pEKWy32aRYSb2ZziiH6Teebyd8km+1TXADy1yks9i9G5eLWe4/CSdwWpI4M+8ggM8CsdhrZ6/U+55BpXPQA== dependencies: - "@abp/clipboard" "~7.4.0" - "@abp/core" "~7.4.0" + "@abp/clipboard" "~7.4.1" + "@abp/core" "~7.4.1" prismjs "^1.26.0" -"@abp/select2@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-7.4.0.tgz#2f455cc991b7bb4df9ed426097bc2996cac12697" - integrity sha512-DwprX4MIoqMzSdh7eFg7EjGIz4ftYZub6jG9Sk3r+sxabbhpbFTxKOpXnhBWYi7L7uTQ8YDFk/5NeXO+Rm50Ww== +"@abp/select2@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-7.4.1.tgz#d7ea53cfec285a06278db362131b7510d5b73900" + integrity sha512-0S66iy7HuB74qqOSDraoF7UvXqz2PrnOKy+3EYMTMskOn4pWaq03JMR8xxEgZ8CtmsrqlE1a4wt1Yt9b3FIc0w== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" select2 "^4.0.13" -"@abp/sweetalert2@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-7.4.0.tgz#db1b4bd45cbabd61172591abc8ce223b5f607c4e" - integrity sha512-XqHPRnTASaRtbJIZYKW1KSKIJ8tynL8DuPCSMjcp4iyUlk+gnzxvbqXeNVjc2ojxj78T/42M/vITNoiiTYuKUw== +"@abp/sweetalert2@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-7.4.1.tgz#6722a40e5115cc341b7543aa0fa3b5a7ae9515b2" + integrity sha512-9jAHrYqCp5qykYfNNbqgESL6egixofVwonjZlb+lLWHAkIX+gQ2ApUNDFSXPtKUh2n9sXhSfF8SSg+BHP/bkCA== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" sweetalert2 "^11.3.6" -"@abp/timeago@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-7.4.0.tgz#245fe09370f38311a67a594c8a3c884aea59cc90" - integrity sha512-khxK6EICUaGCUM1HkACw/8rlPQNssoQvCK64bNqEHBCXgPUmTcqSj5MEGiNOYbgGyWeH2IAMtJEYPqX1g1wqSA== +"@abp/timeago@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-7.4.1.tgz#243d342ba131878ae7f892909c9cae07cf54902b" + integrity sha512-a0Vl2NFwTxzRmH5akWo8BRUxa6sK72z8OoXwUFkZOUqMWBCHK7ffNiN1/fbSgA+7HpSZdDvIthjYwBt57DxLdQ== dependencies: - "@abp/jquery" "~7.4.0" + "@abp/jquery" "~7.4.1" timeago "^1.6.7" -"@abp/toastr@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-7.4.0.tgz#16ba0414a27c9a21bc7556a078b175445edcf608" - integrity sha512-oM4HT2m95cK/9sB4AEQAKUMSGBep6wZTgM/46+o2IvvMdMPrGR2mPu9V9wi3y817FRgY+/qQTfy5TZWyTuIpVQ== +"@abp/toastr@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-7.4.1.tgz#345545a41b6145e54477c6c376193a6dbd62bdda" + integrity sha512-OLCvPJYSrcT2spcq9nO838Q22VhJ63Kdzasz1HugdVNqgcFCCSsqaoXrJGUcf5GrZx7PNloz7uf1I3txYMeZtA== dependencies: - "@abp/jquery" "~7.4.0" + "@abp/jquery" "~7.4.1" toastr "^2.1.4" -"@abp/utils@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-7.4.0.tgz#b31fb6e5dff07463535479a6bb62dc733d7119c8" - integrity sha512-CcR3tfuEsVM60DYL1A0cH6BkUTsasOoBDv/b63uLCoEOq/g8ntelD/SpRSgfDXK74P9M8OE5ZFxlXWDiYuzAFg== +"@abp/utils@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-7.4.1.tgz#2ce4c4d659c2ae9bc23b71b79fa3c6e120eaecaf" + integrity sha512-eFeoOXcz9cVkDKpOfd2VWmpAojASfsqfvACZqi1UmF16OcjsFIkxmIvhh1fpbT4A+eQLbaFFLIsf6gYb//tXhg== 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 1c94891ca1..1239d9b938 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": "~7.4.0", - "@abp/blogging": "~7.4.0" + "@abp/aspnetcore.mvc.ui.theme.basic": "~7.4.1", + "@abp/blogging": "~7.4.1" } } diff --git a/modules/blogging/app/Volo.BloggingTestApp/yarn.lock b/modules/blogging/app/Volo.BloggingTestApp/yarn.lock index 4469115786..db39937c38 100644 --- a/modules/blogging/app/Volo.BloggingTestApp/yarn.lock +++ b/modules/blogging/app/Volo.BloggingTestApp/yarn.lock @@ -2,39 +2,39 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.basic@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-7.4.0.tgz#5088dd82ce343e1123e025848f09b51df988b225" - integrity sha512-teT7I0kgjek/lHzpTg5VOVCQ3IL26nFB43Aa/45fuaSwh9FJd3IJNXGL6xwp85oKaptDYSBXIF4GbrUfp2Ugqg== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~7.4.0" - -"@abp/aspnetcore.mvc.ui.theme.shared@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-7.4.0.tgz#e676444a46214e850b0d916daeeb912774ac381d" - integrity sha512-X+dgdgHGUTyf0zaSPsqQp2ZZWu2+9gIRT4r4/LDgxchHgfNvcKRF8jH/JICcVgGD1adJvZzzDpTefL8CuAIRJA== - dependencies: - "@abp/aspnetcore.mvc.ui" "~7.4.0" - "@abp/bootstrap" "~7.4.0" - "@abp/bootstrap-datepicker" "~7.4.0" - "@abp/bootstrap-daterangepicker" "~7.4.0" - "@abp/datatables.net-bs5" "~7.4.0" - "@abp/font-awesome" "~7.4.0" - "@abp/jquery-form" "~7.4.0" - "@abp/jquery-validation-unobtrusive" "~7.4.0" - "@abp/lodash" "~7.4.0" - "@abp/luxon" "~7.4.0" - "@abp/malihu-custom-scrollbar-plugin" "~7.4.0" - "@abp/moment" "~7.4.0" - "@abp/select2" "~7.4.0" - "@abp/sweetalert2" "~7.4.0" - "@abp/timeago" "~7.4.0" - "@abp/toastr" "~7.4.0" - -"@abp/aspnetcore.mvc.ui@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-7.4.0.tgz#61e1b52d2a940e02242f57007bd3f0fcb583c09a" - integrity sha512-gdoxOBo10DWDYhUq1GVfguC0Ot8PYhoA3VLf88/RatL88BNUUlt0e71uMFcx/gk72fuAE+o9zXn/6nq1wtpSwQ== +"@abp/aspnetcore.mvc.ui.theme.basic@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-7.4.1.tgz#62df78aab8a0b374817fdbab6c6363529b43f925" + integrity sha512-KaPmBlwNjOl1+vwLj5O8J11YHBSRg4y0IIxtgZiculXQNFPHbYAXm8sfTw6Wcsx00STrhvUVJQxYMePNnOTCTg== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~7.4.1" + +"@abp/aspnetcore.mvc.ui.theme.shared@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-7.4.1.tgz#8f8679f5cf80137324ddbec9fcaa67332783e708" + integrity sha512-0uUKuTsi/ikLFUUNEqvrn7KimgsvuK+7m1yZD4o47FQlgGxTyt1zQY9w3K6YyhyC3lsT6qCwiAPIoFOzPkIg/Q== + dependencies: + "@abp/aspnetcore.mvc.ui" "~7.4.1" + "@abp/bootstrap" "~7.4.1" + "@abp/bootstrap-datepicker" "~7.4.1" + "@abp/bootstrap-daterangepicker" "~7.4.1" + "@abp/datatables.net-bs5" "~7.4.1" + "@abp/font-awesome" "~7.4.1" + "@abp/jquery-form" "~7.4.1" + "@abp/jquery-validation-unobtrusive" "~7.4.1" + "@abp/lodash" "~7.4.1" + "@abp/luxon" "~7.4.1" + "@abp/malihu-custom-scrollbar-plugin" "~7.4.1" + "@abp/moment" "~7.4.1" + "@abp/select2" "~7.4.1" + "@abp/sweetalert2" "~7.4.1" + "@abp/timeago" "~7.4.1" + "@abp/toastr" "~7.4.1" + +"@abp/aspnetcore.mvc.ui@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-7.4.1.tgz#49c13718a17569f97b71f978b50f367dff67b8f7" + integrity sha512-EvYrfk0mpSt1jAMZmfFcHoNWEJskzResKp0bflOYsYPsZPuJ5WraKsk4IEEpesYHCyHW5AAb5HBJHeoSbVLh4Q== dependencies: ansi-colors "^4.1.1" extend-object "^1.0.0" @@ -43,201 +43,201 @@ merge-stream "^2.0.0" micromatch "^4.0.2" -"@abp/blogging@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/blogging/-/blogging-7.4.0.tgz#9d674d055df1124d2624959472f9790d24d5c9e5" - integrity sha512-yqPFwSCzKTyJ6kZAj0TO/OH+bYFmro6PbnT+C/L7+FlaqSXM2VTzLUVuFQFoudNAanlobadF/Rm9RxE+LE1oWg== +"@abp/blogging@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/blogging/-/blogging-7.4.1.tgz#b2a781f154c98fe69ce2c2948b422f2aaca6fd12" + integrity sha512-OHEw0tiQsJb6y1S3YbRSnw438sZx/msu4vxsJPYKeigyxubyyN8Ndl0NKP6BukrslmtLbnYwh/e/7Kpi+/Bs1g== dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~7.4.0" - "@abp/owl.carousel" "~7.4.0" - "@abp/prismjs" "~7.4.0" - "@abp/tui-editor" "~7.4.0" + "@abp/aspnetcore.mvc.ui.theme.shared" "~7.4.1" + "@abp/owl.carousel" "~7.4.1" + "@abp/prismjs" "~7.4.1" + "@abp/tui-editor" "~7.4.1" -"@abp/bootstrap-datepicker@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-7.4.0.tgz#75edc2127ca26d86bfefaa6e37579b06e32de5de" - integrity sha512-HXUa+kLjKu8sKr+kCZeNye9Pv/swRfKGAt/uJ2WUEvCJ4IVIMM1p6iMnOEEk/+3OGE64/PWu3cdE9dLP6izOaA== +"@abp/bootstrap-datepicker@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-7.4.1.tgz#f8f35d0edf71368faaae4e40a72fa846b0084f9b" + integrity sha512-hsu8ty6c2oOevsNoyFTQ4yJAu27qnz82MgRNVS8MRfdzo05/LhBhy/tKFm+PFYJqZULYlpQ1GXUF2+uGyazIeg== dependencies: bootstrap-datepicker "^1.9.0" -"@abp/bootstrap-daterangepicker@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-7.4.0.tgz#5058fc2a9354f0a71ac5393658e362779a3bdc46" - integrity sha512-EK0wzZUY9H3XPb9U3DvYVqh48fU+6IneNGYOk7dcda8CUYObd4Dl1nXligStCqgn2uePtwxDHRx40eV0GXmU/Q== +"@abp/bootstrap-daterangepicker@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-7.4.1.tgz#b133cefdbed0fa1b8f1bda916a9d46952237238a" + integrity sha512-NpmbsO4Xg48Zmr8OOlf1fxuNMnFIqmRrkHiKp9lP5c8am64+7rRzCwATw2UY0Ud+4n8/ws+Iki1dwPQF6db1zw== dependencies: bootstrap-daterangepicker "^3.1.0" -"@abp/bootstrap@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-7.4.0.tgz#71be70660643d8f60d13d355b8c80b16e4854870" - integrity sha512-3Fa+fL5NH+0H2KK4MAaqNsiz0PYwK0+Oxjmd0NgKwcqV2vJzRrzS3WG5kITYjNz9QGdBV+FrhNX/NSRU8LDx3Q== +"@abp/bootstrap@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-7.4.1.tgz#b34a2fcc80e04212865652ee7f4f5498a6a61f6d" + integrity sha512-/qCgfrtNWZ2jui2iL6wd6MLrcxALSEFVBypaz1JK3WjEe7DvFAYvKLl7DugIv039/Sx3mbx/PJiQhx8CVZMsEA== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" bootstrap "^5.1.3" -"@abp/clipboard@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-7.4.0.tgz#f1d147df94ddf3ab53eeeb05aec3d5556064c5d6" - integrity sha512-z/nB1RQN/tmShSRwc9Fv1DsJSNM7+Zg4GnAtvZNpOHJp8LTVmsJWxLoUM7hF896W9E0JKr8tRuCVqulyh3IqKg== +"@abp/clipboard@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-7.4.1.tgz#31329ad4565b5075b486e9ca63fb0ff8a070ff9e" + integrity sha512-/+ylBPs/TEZdwywSSTnj96WoRJPwQnR6vlI+sX7h9wDfSDbMwuSSdETSnDVT21lkl8gonPONFZTL8D1u/KKAhg== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" clipboard "^2.0.8" -"@abp/core@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-7.4.0.tgz#8505d446a3b4d80ce476bd3352c1639c7dc486ec" - integrity sha512-yxrnw6eAEIj/CcX5jAwb4xmCsdqWaG+KRcBA8GFvqXbsK94IjqLDiJ3flo+QhGn2DXo40ISxofZop0CgSbP7Ew== +"@abp/core@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-7.4.1.tgz#1d14899ad16aac038806504eb0a5be9318cdcc0c" + integrity sha512-p0BAe2kCtgZmq8pilahmuxmye8DeRXt2KmnFRbmYE3j4d0uComFZpC72QOD1iro8bkmbsHfsHJpiVg4Sp4licw== dependencies: - "@abp/utils" "~7.4.0" + "@abp/utils" "~7.4.1" -"@abp/datatables.net-bs5@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-7.4.0.tgz#52d22e12a2420b402e03148793707d063db0088d" - integrity sha512-VvQv5w0cUpdDD9jX8aUEaLxFrc4A95JlmFnhCYIV1etL8HNOdZvmOThxorsImk31JfpyVYrY/Ze/rnWi2uhVvQ== +"@abp/datatables.net-bs5@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-7.4.1.tgz#821ee4c5db116f9810d65184855cea1fa7d47360" + integrity sha512-jpUzb65lCGYAxs/1qV3pRP8agHwIgZA9gDrudvR8S/3X3kNQWtmeKoFDZ93mhnl3aWPjWFKVrT2LeQeJw5XO5A== dependencies: - "@abp/datatables.net" "~7.4.0" + "@abp/datatables.net" "~7.4.1" datatables.net-bs5 "^1.11.4" -"@abp/datatables.net@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-7.4.0.tgz#9f12a1bb2abd05cd753b5d937d8a0350b2ff74ae" - integrity sha512-StOkMmIkcBUWzD9ToZ5J/hISRWdxbAWjwn7RuFXsoHXcY03mmD86g2oztjrWC5UFnRdpFnsfspTpbNqXFB9Vag== +"@abp/datatables.net@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-7.4.1.tgz#a4501e92e9995da0759b9ce55756fe92c4e8db59" + integrity sha512-BZOOZLH7XrGlX3aFK97cwV9+npsTzALSBo87OgwO2U6UpeFq7yAOvmC0+L9dmIUDISeORn5IFc/zTsSSIQnpHQ== dependencies: - "@abp/jquery" "~7.4.0" + "@abp/jquery" "~7.4.1" datatables.net "^1.11.4" -"@abp/font-awesome@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-7.4.0.tgz#50059083b88706a0f71f55118472b378e4c66163" - integrity sha512-hKoPyM41HHCK6dg+8pQvjYJWzKABBCXrYQAIneMPQZUZqa4JLObKCva9TR7pu6pUp+9OVzg4fQOBM+nwpHtw4g== +"@abp/font-awesome@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-7.4.1.tgz#f6175a989aa64367830723f1dd9c607906716296" + integrity sha512-/ybaz4KROwFdG4Xv0yMTUMXOreDmKy1lKQuntqHEUnIorhXmkgcd5AQQ5AolJ4NmNdPNt1VYrRcTEmdz3nw+FA== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" "@fortawesome/fontawesome-free" "^5.15.4" -"@abp/jquery-form@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-7.4.0.tgz#7ab3be241ee09f1e2843bd1b4d0b0b86d4446e30" - integrity sha512-OmTRuZ7QK1oe2ayNLqEpRJk4Ogk0wt/hIFtJHwQkCtDuCggoR5sQz4vn1vgrD19MxGq07dow5IgjbbhHv1vtEg== +"@abp/jquery-form@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-7.4.1.tgz#67978c41cda204b4c2027d81fc66844379313fa6" + integrity sha512-JZ1D47s/kpTlfMcpD4Jrlh98bhEDsIlWJauvAYaS0EBPIU9V2zHGQ+h9GPFbSPrXe4sYxPSREcsc8KUVMhT5MQ== dependencies: - "@abp/jquery" "~7.4.0" + "@abp/jquery" "~7.4.1" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-7.4.0.tgz#0c564e39c4997dd9b8af7d2023615a06d6fd9834" - integrity sha512-vFB3RKkDlDXbHlDJ64uo3jWW1IRXwiCaPf+mcB77Wpt5+0Dn7eWqjBT7KyHBrsV08ghIqY/Q4nXntFJrmLcuEA== +"@abp/jquery-validation-unobtrusive@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-7.4.1.tgz#fe5c90ade419e83505884dd50dd5988d766f177b" + integrity sha512-oHHV/ukap+vDvQ8CnEWnOrrsLkHXIcMk+SjNKe/dyK5VzOVLDpMatRFmloLs2igYVXTqDGjmDlTswTFdJUarcQ== dependencies: - "@abp/jquery-validation" "~7.4.0" + "@abp/jquery-validation" "~7.4.1" jquery-validation-unobtrusive "^3.2.12" -"@abp/jquery-validation@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-7.4.0.tgz#f2aaba8f4c023e93f0051cc9a05c6d82fa5c7254" - integrity sha512-vN4srLT5UXAKXpKHbZgySWT+N2DjRYivgtifpZHMTGFLMW14W+tfi5zhR4H4JvqJpuO6ZKNiz15zA1zwEBK0Tw== +"@abp/jquery-validation@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-7.4.1.tgz#c2c06bc28770832a9ad73eac000586faed3bdbe3" + integrity sha512-A5iFT2EWfGHXrBb/ov5f0grZ2o2xkDaYtps/FnDUwBYdIdD8E7bbJsWp6ytvZDciO0XmEqAoVOxmiij7ue/SOg== dependencies: - "@abp/jquery" "~7.4.0" + "@abp/jquery" "~7.4.1" jquery-validation "^1.19.3" -"@abp/jquery@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-7.4.0.tgz#206891b20f250537d05d907d2b6cd682fec76496" - integrity sha512-DeYo02T6WVhdpLloSPb6ooqtpksu1HtcbbQhIP9E1P7jHSzZoNiJvoKXHiFUcj5PYiGKl9d/o89hM/apWzyreQ== +"@abp/jquery@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-7.4.1.tgz#b5e16834e6c7871ad6392612ac8e2de8617eb353" + integrity sha512-X3RcovvRYISHcsb6W3U3iVsofw6yomoiouoB1tSIy2/tvUbu9n7N/3MM0CUujFm/xib7s3z1tVxFssS9smT7sw== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" jquery "~3.6.0" -"@abp/lodash@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-7.4.0.tgz#93f20abee776dbfa7aa45e2e710f2768f262fda5" - integrity sha512-h4Fnjm+VLwp1F3r57B9MrHhwyOYMo5oP285a85zzAYLkhwcDy7f1nbHKHMQ3ZTaeJVmiRnVaH+3sdUdslCRt5g== +"@abp/lodash@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-7.4.1.tgz#d0f84b7b9cbd989d59ebde594ed7acb8bc720b61" + integrity sha512-RFjZCyAPZnpvT0SJbxXzzmMYbuocSWBlezvjAVA8MiTrOXdZO4VyaTFjIuQcAdSrZhtpFGeYWxAjHshVplxMbw== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" lodash "^4.17.21" -"@abp/luxon@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-7.4.0.tgz#2ba7ff307c8f7c24d818a9c33635b86fd6810db9" - integrity sha512-ROCx7aihM+agdYy7Tkz+GiScx68KY5qwGTnj8P7QabGFChzVUic6RuBG+2Obmfonc6uT7Rq0c8JDGrsGNe/w8A== +"@abp/luxon@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-7.4.1.tgz#e0c0947d2b77f98b9cdaf7d1143025879361c3c9" + integrity sha512-k1wh8tT1529MtNC2gSXEIKdimBXBwubXeLisgpIPx6lkJo1Op6pAz2ERwFXeyktqGdYyuFcnewJIxmS7EPtWhg== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" luxon "^2.3.0" -"@abp/malihu-custom-scrollbar-plugin@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-7.4.0.tgz#aba68877481f4339e048f2ae3cfbe93197145a0a" - integrity sha512-Ntodhi4k0HFQmImYTP5SYf/WDm7aUGJLaGsfePm77HJ6DhGgalIGqtM8NiFXzo/3GmMY0XSo8Wxrs1mSCdtsOA== +"@abp/malihu-custom-scrollbar-plugin@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-7.4.1.tgz#aa7ec247197a258277549052780b38fd9e748c6c" + integrity sha512-pm/wIaiRSgGxelOf8AiL4JKFNZOQ6s2WbR6pULiP2HSNCgCpWYJ2s8fvj7VP3lAHIa98v3m8PSMSUhqaANxZ/Q== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/moment@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-7.4.0.tgz#2490d9c7cdcaeca8d0ba9ebef5e7298caf0c9e09" - integrity sha512-ftsUEgO17GbVawA1GplGFzEeIM4NX004AmS6/fPI3o5isX7o1buF9q9TXdnwUuFEJKZxS4KpveRqzTL5t9k0BQ== +"@abp/moment@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-7.4.1.tgz#1c28ccb13eecdd13695edf8641ca9867b318e37d" + integrity sha512-7vRJyAK5ER9z+LV1xUSAAtWlPlhv8yhM/nHjhC+IQSP/+V1D7VLA6EKxAEexGw7wX6HY8oMOWP9HxDHMb5hKQA== dependencies: moment "^2.9.0" -"@abp/owl.carousel@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/owl.carousel/-/owl.carousel-7.4.0.tgz#5b70c90659d9e5951780e2c7204cfb6884b808f9" - integrity sha512-qddfSyXJweA7eV+REtMKeghlviIME20pplW+cz9RxetZpwe4g0bhWjUkfA/7F7c20YNIBkAVO8yfeBzip19wqw== +"@abp/owl.carousel@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/owl.carousel/-/owl.carousel-7.4.1.tgz#9db15032e4639a1b50e08aa7eaaf779f2cf30f6c" + integrity sha512-GNktio3GJqWsu4CrynbTkLucOG97W2rB8LnDxhvINcGow6hrDP3RzcExCqeh+miU6I44VvtC4uySyIYaXJoQ3A== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" owl.carousel "^2.3.4" -"@abp/prismjs@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-7.4.0.tgz#8572f36f853c7054d77d02f3098cd844ee321ed7" - integrity sha512-y/Iy6pddQeVazEITktPot8JOPdAEOVAfmYkTBP3DIIPvoYr3kf6rwfzBUalMw5CEjWZ9BaIszDgFCk5ucNHHwQ== +"@abp/prismjs@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-7.4.1.tgz#df4387dbc2f0c77ddb9b6bd0ade9a5db29b9cee2" + integrity sha512-bI7pEKWy32aRYSb2ZziiH6Teebyd8km+1TXADy1yks9i9G5eLWe4/CSdwWpI4M+8ggM8CsdhrZ6/U+55BpXPQA== dependencies: - "@abp/clipboard" "~7.4.0" - "@abp/core" "~7.4.0" + "@abp/clipboard" "~7.4.1" + "@abp/core" "~7.4.1" prismjs "^1.26.0" -"@abp/select2@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-7.4.0.tgz#2f455cc991b7bb4df9ed426097bc2996cac12697" - integrity sha512-DwprX4MIoqMzSdh7eFg7EjGIz4ftYZub6jG9Sk3r+sxabbhpbFTxKOpXnhBWYi7L7uTQ8YDFk/5NeXO+Rm50Ww== +"@abp/select2@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-7.4.1.tgz#d7ea53cfec285a06278db362131b7510d5b73900" + integrity sha512-0S66iy7HuB74qqOSDraoF7UvXqz2PrnOKy+3EYMTMskOn4pWaq03JMR8xxEgZ8CtmsrqlE1a4wt1Yt9b3FIc0w== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" select2 "^4.0.13" -"@abp/sweetalert2@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-7.4.0.tgz#db1b4bd45cbabd61172591abc8ce223b5f607c4e" - integrity sha512-XqHPRnTASaRtbJIZYKW1KSKIJ8tynL8DuPCSMjcp4iyUlk+gnzxvbqXeNVjc2ojxj78T/42M/vITNoiiTYuKUw== +"@abp/sweetalert2@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-7.4.1.tgz#6722a40e5115cc341b7543aa0fa3b5a7ae9515b2" + integrity sha512-9jAHrYqCp5qykYfNNbqgESL6egixofVwonjZlb+lLWHAkIX+gQ2ApUNDFSXPtKUh2n9sXhSfF8SSg+BHP/bkCA== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" sweetalert2 "^11.3.6" -"@abp/timeago@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-7.4.0.tgz#245fe09370f38311a67a594c8a3c884aea59cc90" - integrity sha512-khxK6EICUaGCUM1HkACw/8rlPQNssoQvCK64bNqEHBCXgPUmTcqSj5MEGiNOYbgGyWeH2IAMtJEYPqX1g1wqSA== +"@abp/timeago@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-7.4.1.tgz#243d342ba131878ae7f892909c9cae07cf54902b" + integrity sha512-a0Vl2NFwTxzRmH5akWo8BRUxa6sK72z8OoXwUFkZOUqMWBCHK7ffNiN1/fbSgA+7HpSZdDvIthjYwBt57DxLdQ== dependencies: - "@abp/jquery" "~7.4.0" + "@abp/jquery" "~7.4.1" timeago "^1.6.7" -"@abp/toastr@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-7.4.0.tgz#16ba0414a27c9a21bc7556a078b175445edcf608" - integrity sha512-oM4HT2m95cK/9sB4AEQAKUMSGBep6wZTgM/46+o2IvvMdMPrGR2mPu9V9wi3y817FRgY+/qQTfy5TZWyTuIpVQ== +"@abp/toastr@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-7.4.1.tgz#345545a41b6145e54477c6c376193a6dbd62bdda" + integrity sha512-OLCvPJYSrcT2spcq9nO838Q22VhJ63Kdzasz1HugdVNqgcFCCSsqaoXrJGUcf5GrZx7PNloz7uf1I3txYMeZtA== dependencies: - "@abp/jquery" "~7.4.0" + "@abp/jquery" "~7.4.1" toastr "^2.1.4" -"@abp/tui-editor@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/tui-editor/-/tui-editor-7.4.0.tgz#831efd947b5a255d73365248e443d43f834c5a75" - integrity sha512-G/aCeG0lrFjEdE/YRbpFWuhuaGDFDqO5+/otIQSOxcR/bkjE1kLrdH5KDYGIa9QUaq7GbKn7yFnjrv9s5ajxzQ== +"@abp/tui-editor@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/tui-editor/-/tui-editor-7.4.1.tgz#4adaffcc3d62c7f2159d6acbca71e14780270277" + integrity sha512-0wiLq03+EB6or9uBbz1ZEWnOAoUjJqqFDONVEv2LtuqWlaiDwzILrSMxihTyFsLGrSAUdezfk2L83DoJT6SsVg== dependencies: - "@abp/jquery" "~7.4.0" - "@abp/prismjs" "~7.4.0" + "@abp/jquery" "~7.4.1" + "@abp/prismjs" "~7.4.1" -"@abp/utils@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-7.4.0.tgz#b31fb6e5dff07463535479a6bb62dc733d7119c8" - integrity sha512-CcR3tfuEsVM60DYL1A0cH6BkUTsasOoBDv/b63uLCoEOq/g8ntelD/SpRSgfDXK74P9M8OE5ZFxlXWDiYuzAFg== +"@abp/utils@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-7.4.1.tgz#2ce4c4d659c2ae9bc23b71b79fa3c6e120eaecaf" + integrity sha512-eFeoOXcz9cVkDKpOfd2VWmpAojASfsqfvACZqi1UmF16OcjsFIkxmIvhh1fpbT4A+eQLbaFFLIsf6gYb//tXhg== dependencies: just-compare "^2.3.0" diff --git a/modules/blogging/src/Volo.Blogging.Application/Volo/Blogging/Files/ImageFormatHelper.cs b/modules/blogging/src/Volo.Blogging.Application/Volo/Blogging/Files/ImageFormatHelper.cs index 9fccb1e03a..32060bf501 100644 --- a/modules/blogging/src/Volo.Blogging.Application/Volo/Blogging/Files/ImageFormatHelper.cs +++ b/modules/blogging/src/Volo.Blogging.Application/Volo/Blogging/Files/ImageFormatHelper.cs @@ -10,9 +10,9 @@ namespace Volo.Blogging.Areas.Blog.Helpers { public static IImageFormat GetImageRawFormat(Stream stream) { - using (var image = Image.Load(stream, out var imageFormat)) + using (var image = Image.Load(stream)) { - return imageFormat; + return image.Metadata.DecodedImageFormat; } } diff --git a/modules/client-simulation/demo/Volo.ClientSimulation.Demo/package.json b/modules/client-simulation/demo/Volo.ClientSimulation.Demo/package.json index 93e2ccb7f5..9e72809edd 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": "~7.4.0" + "@abp/aspnetcore.mvc.ui.theme.basic": "~7.4.1" } } diff --git a/modules/client-simulation/demo/Volo.ClientSimulation.Demo/yarn.lock b/modules/client-simulation/demo/Volo.ClientSimulation.Demo/yarn.lock index 9c4c145174..8c3619aab1 100644 --- a/modules/client-simulation/demo/Volo.ClientSimulation.Demo/yarn.lock +++ b/modules/client-simulation/demo/Volo.ClientSimulation.Demo/yarn.lock @@ -2,39 +2,39 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.basic@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-7.4.0.tgz#5088dd82ce343e1123e025848f09b51df988b225" - integrity sha512-teT7I0kgjek/lHzpTg5VOVCQ3IL26nFB43Aa/45fuaSwh9FJd3IJNXGL6xwp85oKaptDYSBXIF4GbrUfp2Ugqg== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~7.4.0" - -"@abp/aspnetcore.mvc.ui.theme.shared@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-7.4.0.tgz#e676444a46214e850b0d916daeeb912774ac381d" - integrity sha512-X+dgdgHGUTyf0zaSPsqQp2ZZWu2+9gIRT4r4/LDgxchHgfNvcKRF8jH/JICcVgGD1adJvZzzDpTefL8CuAIRJA== - dependencies: - "@abp/aspnetcore.mvc.ui" "~7.4.0" - "@abp/bootstrap" "~7.4.0" - "@abp/bootstrap-datepicker" "~7.4.0" - "@abp/bootstrap-daterangepicker" "~7.4.0" - "@abp/datatables.net-bs5" "~7.4.0" - "@abp/font-awesome" "~7.4.0" - "@abp/jquery-form" "~7.4.0" - "@abp/jquery-validation-unobtrusive" "~7.4.0" - "@abp/lodash" "~7.4.0" - "@abp/luxon" "~7.4.0" - "@abp/malihu-custom-scrollbar-plugin" "~7.4.0" - "@abp/moment" "~7.4.0" - "@abp/select2" "~7.4.0" - "@abp/sweetalert2" "~7.4.0" - "@abp/timeago" "~7.4.0" - "@abp/toastr" "~7.4.0" - -"@abp/aspnetcore.mvc.ui@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-7.4.0.tgz#61e1b52d2a940e02242f57007bd3f0fcb583c09a" - integrity sha512-gdoxOBo10DWDYhUq1GVfguC0Ot8PYhoA3VLf88/RatL88BNUUlt0e71uMFcx/gk72fuAE+o9zXn/6nq1wtpSwQ== +"@abp/aspnetcore.mvc.ui.theme.basic@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-7.4.1.tgz#62df78aab8a0b374817fdbab6c6363529b43f925" + integrity sha512-KaPmBlwNjOl1+vwLj5O8J11YHBSRg4y0IIxtgZiculXQNFPHbYAXm8sfTw6Wcsx00STrhvUVJQxYMePNnOTCTg== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~7.4.1" + +"@abp/aspnetcore.mvc.ui.theme.shared@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-7.4.1.tgz#8f8679f5cf80137324ddbec9fcaa67332783e708" + integrity sha512-0uUKuTsi/ikLFUUNEqvrn7KimgsvuK+7m1yZD4o47FQlgGxTyt1zQY9w3K6YyhyC3lsT6qCwiAPIoFOzPkIg/Q== + dependencies: + "@abp/aspnetcore.mvc.ui" "~7.4.1" + "@abp/bootstrap" "~7.4.1" + "@abp/bootstrap-datepicker" "~7.4.1" + "@abp/bootstrap-daterangepicker" "~7.4.1" + "@abp/datatables.net-bs5" "~7.4.1" + "@abp/font-awesome" "~7.4.1" + "@abp/jquery-form" "~7.4.1" + "@abp/jquery-validation-unobtrusive" "~7.4.1" + "@abp/lodash" "~7.4.1" + "@abp/luxon" "~7.4.1" + "@abp/malihu-custom-scrollbar-plugin" "~7.4.1" + "@abp/moment" "~7.4.1" + "@abp/select2" "~7.4.1" + "@abp/sweetalert2" "~7.4.1" + "@abp/timeago" "~7.4.1" + "@abp/toastr" "~7.4.1" + +"@abp/aspnetcore.mvc.ui@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-7.4.1.tgz#49c13718a17569f97b71f978b50f367dff67b8f7" + integrity sha512-EvYrfk0mpSt1jAMZmfFcHoNWEJskzResKp0bflOYsYPsZPuJ5WraKsk4IEEpesYHCyHW5AAb5HBJHeoSbVLh4Q== dependencies: ansi-colors "^4.1.1" extend-object "^1.0.0" @@ -43,158 +43,158 @@ merge-stream "^2.0.0" micromatch "^4.0.2" -"@abp/bootstrap-datepicker@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-7.4.0.tgz#75edc2127ca26d86bfefaa6e37579b06e32de5de" - integrity sha512-HXUa+kLjKu8sKr+kCZeNye9Pv/swRfKGAt/uJ2WUEvCJ4IVIMM1p6iMnOEEk/+3OGE64/PWu3cdE9dLP6izOaA== +"@abp/bootstrap-datepicker@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-7.4.1.tgz#f8f35d0edf71368faaae4e40a72fa846b0084f9b" + integrity sha512-hsu8ty6c2oOevsNoyFTQ4yJAu27qnz82MgRNVS8MRfdzo05/LhBhy/tKFm+PFYJqZULYlpQ1GXUF2+uGyazIeg== dependencies: bootstrap-datepicker "^1.9.0" -"@abp/bootstrap-daterangepicker@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-7.4.0.tgz#5058fc2a9354f0a71ac5393658e362779a3bdc46" - integrity sha512-EK0wzZUY9H3XPb9U3DvYVqh48fU+6IneNGYOk7dcda8CUYObd4Dl1nXligStCqgn2uePtwxDHRx40eV0GXmU/Q== +"@abp/bootstrap-daterangepicker@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-7.4.1.tgz#b133cefdbed0fa1b8f1bda916a9d46952237238a" + integrity sha512-NpmbsO4Xg48Zmr8OOlf1fxuNMnFIqmRrkHiKp9lP5c8am64+7rRzCwATw2UY0Ud+4n8/ws+Iki1dwPQF6db1zw== dependencies: bootstrap-daterangepicker "^3.1.0" -"@abp/bootstrap@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-7.4.0.tgz#71be70660643d8f60d13d355b8c80b16e4854870" - integrity sha512-3Fa+fL5NH+0H2KK4MAaqNsiz0PYwK0+Oxjmd0NgKwcqV2vJzRrzS3WG5kITYjNz9QGdBV+FrhNX/NSRU8LDx3Q== +"@abp/bootstrap@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-7.4.1.tgz#b34a2fcc80e04212865652ee7f4f5498a6a61f6d" + integrity sha512-/qCgfrtNWZ2jui2iL6wd6MLrcxALSEFVBypaz1JK3WjEe7DvFAYvKLl7DugIv039/Sx3mbx/PJiQhx8CVZMsEA== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" bootstrap "^5.1.3" -"@abp/core@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-7.4.0.tgz#8505d446a3b4d80ce476bd3352c1639c7dc486ec" - integrity sha512-yxrnw6eAEIj/CcX5jAwb4xmCsdqWaG+KRcBA8GFvqXbsK94IjqLDiJ3flo+QhGn2DXo40ISxofZop0CgSbP7Ew== +"@abp/core@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-7.4.1.tgz#1d14899ad16aac038806504eb0a5be9318cdcc0c" + integrity sha512-p0BAe2kCtgZmq8pilahmuxmye8DeRXt2KmnFRbmYE3j4d0uComFZpC72QOD1iro8bkmbsHfsHJpiVg4Sp4licw== dependencies: - "@abp/utils" "~7.4.0" + "@abp/utils" "~7.4.1" -"@abp/datatables.net-bs5@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-7.4.0.tgz#52d22e12a2420b402e03148793707d063db0088d" - integrity sha512-VvQv5w0cUpdDD9jX8aUEaLxFrc4A95JlmFnhCYIV1etL8HNOdZvmOThxorsImk31JfpyVYrY/Ze/rnWi2uhVvQ== +"@abp/datatables.net-bs5@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-7.4.1.tgz#821ee4c5db116f9810d65184855cea1fa7d47360" + integrity sha512-jpUzb65lCGYAxs/1qV3pRP8agHwIgZA9gDrudvR8S/3X3kNQWtmeKoFDZ93mhnl3aWPjWFKVrT2LeQeJw5XO5A== dependencies: - "@abp/datatables.net" "~7.4.0" + "@abp/datatables.net" "~7.4.1" datatables.net-bs5 "^1.11.4" -"@abp/datatables.net@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-7.4.0.tgz#9f12a1bb2abd05cd753b5d937d8a0350b2ff74ae" - integrity sha512-StOkMmIkcBUWzD9ToZ5J/hISRWdxbAWjwn7RuFXsoHXcY03mmD86g2oztjrWC5UFnRdpFnsfspTpbNqXFB9Vag== +"@abp/datatables.net@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-7.4.1.tgz#a4501e92e9995da0759b9ce55756fe92c4e8db59" + integrity sha512-BZOOZLH7XrGlX3aFK97cwV9+npsTzALSBo87OgwO2U6UpeFq7yAOvmC0+L9dmIUDISeORn5IFc/zTsSSIQnpHQ== dependencies: - "@abp/jquery" "~7.4.0" + "@abp/jquery" "~7.4.1" datatables.net "^1.11.4" -"@abp/font-awesome@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-7.4.0.tgz#50059083b88706a0f71f55118472b378e4c66163" - integrity sha512-hKoPyM41HHCK6dg+8pQvjYJWzKABBCXrYQAIneMPQZUZqa4JLObKCva9TR7pu6pUp+9OVzg4fQOBM+nwpHtw4g== +"@abp/font-awesome@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-7.4.1.tgz#f6175a989aa64367830723f1dd9c607906716296" + integrity sha512-/ybaz4KROwFdG4Xv0yMTUMXOreDmKy1lKQuntqHEUnIorhXmkgcd5AQQ5AolJ4NmNdPNt1VYrRcTEmdz3nw+FA== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" "@fortawesome/fontawesome-free" "^5.15.4" -"@abp/jquery-form@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-7.4.0.tgz#7ab3be241ee09f1e2843bd1b4d0b0b86d4446e30" - integrity sha512-OmTRuZ7QK1oe2ayNLqEpRJk4Ogk0wt/hIFtJHwQkCtDuCggoR5sQz4vn1vgrD19MxGq07dow5IgjbbhHv1vtEg== +"@abp/jquery-form@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-7.4.1.tgz#67978c41cda204b4c2027d81fc66844379313fa6" + integrity sha512-JZ1D47s/kpTlfMcpD4Jrlh98bhEDsIlWJauvAYaS0EBPIU9V2zHGQ+h9GPFbSPrXe4sYxPSREcsc8KUVMhT5MQ== dependencies: - "@abp/jquery" "~7.4.0" + "@abp/jquery" "~7.4.1" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-7.4.0.tgz#0c564e39c4997dd9b8af7d2023615a06d6fd9834" - integrity sha512-vFB3RKkDlDXbHlDJ64uo3jWW1IRXwiCaPf+mcB77Wpt5+0Dn7eWqjBT7KyHBrsV08ghIqY/Q4nXntFJrmLcuEA== +"@abp/jquery-validation-unobtrusive@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-7.4.1.tgz#fe5c90ade419e83505884dd50dd5988d766f177b" + integrity sha512-oHHV/ukap+vDvQ8CnEWnOrrsLkHXIcMk+SjNKe/dyK5VzOVLDpMatRFmloLs2igYVXTqDGjmDlTswTFdJUarcQ== dependencies: - "@abp/jquery-validation" "~7.4.0" + "@abp/jquery-validation" "~7.4.1" jquery-validation-unobtrusive "^3.2.12" -"@abp/jquery-validation@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-7.4.0.tgz#f2aaba8f4c023e93f0051cc9a05c6d82fa5c7254" - integrity sha512-vN4srLT5UXAKXpKHbZgySWT+N2DjRYivgtifpZHMTGFLMW14W+tfi5zhR4H4JvqJpuO6ZKNiz15zA1zwEBK0Tw== +"@abp/jquery-validation@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-7.4.1.tgz#c2c06bc28770832a9ad73eac000586faed3bdbe3" + integrity sha512-A5iFT2EWfGHXrBb/ov5f0grZ2o2xkDaYtps/FnDUwBYdIdD8E7bbJsWp6ytvZDciO0XmEqAoVOxmiij7ue/SOg== dependencies: - "@abp/jquery" "~7.4.0" + "@abp/jquery" "~7.4.1" jquery-validation "^1.19.3" -"@abp/jquery@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-7.4.0.tgz#206891b20f250537d05d907d2b6cd682fec76496" - integrity sha512-DeYo02T6WVhdpLloSPb6ooqtpksu1HtcbbQhIP9E1P7jHSzZoNiJvoKXHiFUcj5PYiGKl9d/o89hM/apWzyreQ== +"@abp/jquery@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-7.4.1.tgz#b5e16834e6c7871ad6392612ac8e2de8617eb353" + integrity sha512-X3RcovvRYISHcsb6W3U3iVsofw6yomoiouoB1tSIy2/tvUbu9n7N/3MM0CUujFm/xib7s3z1tVxFssS9smT7sw== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" jquery "~3.6.0" -"@abp/lodash@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-7.4.0.tgz#93f20abee776dbfa7aa45e2e710f2768f262fda5" - integrity sha512-h4Fnjm+VLwp1F3r57B9MrHhwyOYMo5oP285a85zzAYLkhwcDy7f1nbHKHMQ3ZTaeJVmiRnVaH+3sdUdslCRt5g== +"@abp/lodash@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-7.4.1.tgz#d0f84b7b9cbd989d59ebde594ed7acb8bc720b61" + integrity sha512-RFjZCyAPZnpvT0SJbxXzzmMYbuocSWBlezvjAVA8MiTrOXdZO4VyaTFjIuQcAdSrZhtpFGeYWxAjHshVplxMbw== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" lodash "^4.17.21" -"@abp/luxon@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-7.4.0.tgz#2ba7ff307c8f7c24d818a9c33635b86fd6810db9" - integrity sha512-ROCx7aihM+agdYy7Tkz+GiScx68KY5qwGTnj8P7QabGFChzVUic6RuBG+2Obmfonc6uT7Rq0c8JDGrsGNe/w8A== +"@abp/luxon@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-7.4.1.tgz#e0c0947d2b77f98b9cdaf7d1143025879361c3c9" + integrity sha512-k1wh8tT1529MtNC2gSXEIKdimBXBwubXeLisgpIPx6lkJo1Op6pAz2ERwFXeyktqGdYyuFcnewJIxmS7EPtWhg== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" luxon "^2.3.0" -"@abp/malihu-custom-scrollbar-plugin@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-7.4.0.tgz#aba68877481f4339e048f2ae3cfbe93197145a0a" - integrity sha512-Ntodhi4k0HFQmImYTP5SYf/WDm7aUGJLaGsfePm77HJ6DhGgalIGqtM8NiFXzo/3GmMY0XSo8Wxrs1mSCdtsOA== +"@abp/malihu-custom-scrollbar-plugin@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-7.4.1.tgz#aa7ec247197a258277549052780b38fd9e748c6c" + integrity sha512-pm/wIaiRSgGxelOf8AiL4JKFNZOQ6s2WbR6pULiP2HSNCgCpWYJ2s8fvj7VP3lAHIa98v3m8PSMSUhqaANxZ/Q== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/moment@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-7.4.0.tgz#2490d9c7cdcaeca8d0ba9ebef5e7298caf0c9e09" - integrity sha512-ftsUEgO17GbVawA1GplGFzEeIM4NX004AmS6/fPI3o5isX7o1buF9q9TXdnwUuFEJKZxS4KpveRqzTL5t9k0BQ== +"@abp/moment@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-7.4.1.tgz#1c28ccb13eecdd13695edf8641ca9867b318e37d" + integrity sha512-7vRJyAK5ER9z+LV1xUSAAtWlPlhv8yhM/nHjhC+IQSP/+V1D7VLA6EKxAEexGw7wX6HY8oMOWP9HxDHMb5hKQA== dependencies: moment "^2.9.0" -"@abp/select2@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-7.4.0.tgz#2f455cc991b7bb4df9ed426097bc2996cac12697" - integrity sha512-DwprX4MIoqMzSdh7eFg7EjGIz4ftYZub6jG9Sk3r+sxabbhpbFTxKOpXnhBWYi7L7uTQ8YDFk/5NeXO+Rm50Ww== +"@abp/select2@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-7.4.1.tgz#d7ea53cfec285a06278db362131b7510d5b73900" + integrity sha512-0S66iy7HuB74qqOSDraoF7UvXqz2PrnOKy+3EYMTMskOn4pWaq03JMR8xxEgZ8CtmsrqlE1a4wt1Yt9b3FIc0w== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" select2 "^4.0.13" -"@abp/sweetalert2@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-7.4.0.tgz#db1b4bd45cbabd61172591abc8ce223b5f607c4e" - integrity sha512-XqHPRnTASaRtbJIZYKW1KSKIJ8tynL8DuPCSMjcp4iyUlk+gnzxvbqXeNVjc2ojxj78T/42M/vITNoiiTYuKUw== +"@abp/sweetalert2@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-7.4.1.tgz#6722a40e5115cc341b7543aa0fa3b5a7ae9515b2" + integrity sha512-9jAHrYqCp5qykYfNNbqgESL6egixofVwonjZlb+lLWHAkIX+gQ2ApUNDFSXPtKUh2n9sXhSfF8SSg+BHP/bkCA== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" sweetalert2 "^11.3.6" -"@abp/timeago@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-7.4.0.tgz#245fe09370f38311a67a594c8a3c884aea59cc90" - integrity sha512-khxK6EICUaGCUM1HkACw/8rlPQNssoQvCK64bNqEHBCXgPUmTcqSj5MEGiNOYbgGyWeH2IAMtJEYPqX1g1wqSA== +"@abp/timeago@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-7.4.1.tgz#243d342ba131878ae7f892909c9cae07cf54902b" + integrity sha512-a0Vl2NFwTxzRmH5akWo8BRUxa6sK72z8OoXwUFkZOUqMWBCHK7ffNiN1/fbSgA+7HpSZdDvIthjYwBt57DxLdQ== dependencies: - "@abp/jquery" "~7.4.0" + "@abp/jquery" "~7.4.1" timeago "^1.6.7" -"@abp/toastr@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-7.4.0.tgz#16ba0414a27c9a21bc7556a078b175445edcf608" - integrity sha512-oM4HT2m95cK/9sB4AEQAKUMSGBep6wZTgM/46+o2IvvMdMPrGR2mPu9V9wi3y817FRgY+/qQTfy5TZWyTuIpVQ== +"@abp/toastr@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-7.4.1.tgz#345545a41b6145e54477c6c376193a6dbd62bdda" + integrity sha512-OLCvPJYSrcT2spcq9nO838Q22VhJ63Kdzasz1HugdVNqgcFCCSsqaoXrJGUcf5GrZx7PNloz7uf1I3txYMeZtA== dependencies: - "@abp/jquery" "~7.4.0" + "@abp/jquery" "~7.4.1" toastr "^2.1.4" -"@abp/utils@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-7.4.0.tgz#b31fb6e5dff07463535479a6bb62dc733d7119c8" - integrity sha512-CcR3tfuEsVM60DYL1A0cH6BkUTsasOoBDv/b63uLCoEOq/g8ntelD/SpRSgfDXK74P9M8OE5ZFxlXWDiYuzAFg== +"@abp/utils@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-7.4.1.tgz#2ce4c4d659c2ae9bc23b71b79fa3c6e120eaecaf" + integrity sha512-eFeoOXcz9cVkDKpOfd2VWmpAojASfsqfvACZqi1UmF16OcjsFIkxmIvhh1fpbT4A+eQLbaFFLIsf6gYb//tXhg== dependencies: just-compare "^2.3.0" diff --git a/modules/cms-kit/README.md b/modules/cms-kit/README.md new file mode 100644 index 0000000000..0f04a38ab8 --- /dev/null +++ b/modules/cms-kit/README.md @@ -0,0 +1,24 @@ +# CMS Kit + +## Updating Client Proxies + +This project have 3 types of client proxies. Before updating client proxies, make sure `Volo.CmsKit.Web.Unified` project is running. +Then you can update Client proxies in 3 different projects. Execute the following commands in the directory of the each project. + +- CMS Kit Public (**Volo.CmsKit.Public.HttpApi.Client**) + ```bash + abp generate-proxy -t csharp -url https://localhost:44349 -m cms-kit --without-contracts + ``` + +- CMS Kit Common (**Volo.CmsKit.Common.HttpApi.Client**) + + ```bash + abp generate-proxy -t csharp -url https://localhost:44349 -m cms-kit-common --without-contracts + ``` + +- CMS Kit Admin (**Volo.CmsKit.Admin.HttpApi.Client**) + + ```bash + abp generate-proxy -t csharp -url https://localhost:44349 -m cms-kit-admin --without-contracts + ``` + diff --git a/modules/cms-kit/angular/package.json b/modules/cms-kit/angular/package.json index 616089d5d9..ac8ba74119 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": "~7.4.0", - "@abp/ng.identity": "~7.4.0", - "@abp/ng.setting-management": "~7.4.0", - "@abp/ng.tenant-management": "~7.4.0", - "@abp/ng.theme.basic": "~7.4.0", + "@abp/ng.account": "~7.4.1", + "@abp/ng.identity": "~7.4.1", + "@abp/ng.setting-management": "~7.4.1", + "@abp/ng.tenant-management": "~7.4.1", + "@abp/ng.theme.basic": "~7.4.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 16e2158730..384a49000e 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": ">=7.4.0", - "@abp/ng.theme.shared": ">=7.4.0" + "@abp/ng.core": ">=7.4.1", + "@abp/ng.theme.shared": ">=7.4.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 c98ab25773..afc96007fd 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": "~7.4.0" + "@abp/aspnetcore.mvc.ui.theme.basic": "~7.4.1" } } diff --git a/modules/cms-kit/host/Volo.CmsKit.IdentityServer/yarn.lock b/modules/cms-kit/host/Volo.CmsKit.IdentityServer/yarn.lock index 9c4c145174..8c3619aab1 100644 --- a/modules/cms-kit/host/Volo.CmsKit.IdentityServer/yarn.lock +++ b/modules/cms-kit/host/Volo.CmsKit.IdentityServer/yarn.lock @@ -2,39 +2,39 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.basic@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-7.4.0.tgz#5088dd82ce343e1123e025848f09b51df988b225" - integrity sha512-teT7I0kgjek/lHzpTg5VOVCQ3IL26nFB43Aa/45fuaSwh9FJd3IJNXGL6xwp85oKaptDYSBXIF4GbrUfp2Ugqg== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~7.4.0" - -"@abp/aspnetcore.mvc.ui.theme.shared@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-7.4.0.tgz#e676444a46214e850b0d916daeeb912774ac381d" - integrity sha512-X+dgdgHGUTyf0zaSPsqQp2ZZWu2+9gIRT4r4/LDgxchHgfNvcKRF8jH/JICcVgGD1adJvZzzDpTefL8CuAIRJA== - dependencies: - "@abp/aspnetcore.mvc.ui" "~7.4.0" - "@abp/bootstrap" "~7.4.0" - "@abp/bootstrap-datepicker" "~7.4.0" - "@abp/bootstrap-daterangepicker" "~7.4.0" - "@abp/datatables.net-bs5" "~7.4.0" - "@abp/font-awesome" "~7.4.0" - "@abp/jquery-form" "~7.4.0" - "@abp/jquery-validation-unobtrusive" "~7.4.0" - "@abp/lodash" "~7.4.0" - "@abp/luxon" "~7.4.0" - "@abp/malihu-custom-scrollbar-plugin" "~7.4.0" - "@abp/moment" "~7.4.0" - "@abp/select2" "~7.4.0" - "@abp/sweetalert2" "~7.4.0" - "@abp/timeago" "~7.4.0" - "@abp/toastr" "~7.4.0" - -"@abp/aspnetcore.mvc.ui@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-7.4.0.tgz#61e1b52d2a940e02242f57007bd3f0fcb583c09a" - integrity sha512-gdoxOBo10DWDYhUq1GVfguC0Ot8PYhoA3VLf88/RatL88BNUUlt0e71uMFcx/gk72fuAE+o9zXn/6nq1wtpSwQ== +"@abp/aspnetcore.mvc.ui.theme.basic@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-7.4.1.tgz#62df78aab8a0b374817fdbab6c6363529b43f925" + integrity sha512-KaPmBlwNjOl1+vwLj5O8J11YHBSRg4y0IIxtgZiculXQNFPHbYAXm8sfTw6Wcsx00STrhvUVJQxYMePNnOTCTg== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~7.4.1" + +"@abp/aspnetcore.mvc.ui.theme.shared@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-7.4.1.tgz#8f8679f5cf80137324ddbec9fcaa67332783e708" + integrity sha512-0uUKuTsi/ikLFUUNEqvrn7KimgsvuK+7m1yZD4o47FQlgGxTyt1zQY9w3K6YyhyC3lsT6qCwiAPIoFOzPkIg/Q== + dependencies: + "@abp/aspnetcore.mvc.ui" "~7.4.1" + "@abp/bootstrap" "~7.4.1" + "@abp/bootstrap-datepicker" "~7.4.1" + "@abp/bootstrap-daterangepicker" "~7.4.1" + "@abp/datatables.net-bs5" "~7.4.1" + "@abp/font-awesome" "~7.4.1" + "@abp/jquery-form" "~7.4.1" + "@abp/jquery-validation-unobtrusive" "~7.4.1" + "@abp/lodash" "~7.4.1" + "@abp/luxon" "~7.4.1" + "@abp/malihu-custom-scrollbar-plugin" "~7.4.1" + "@abp/moment" "~7.4.1" + "@abp/select2" "~7.4.1" + "@abp/sweetalert2" "~7.4.1" + "@abp/timeago" "~7.4.1" + "@abp/toastr" "~7.4.1" + +"@abp/aspnetcore.mvc.ui@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-7.4.1.tgz#49c13718a17569f97b71f978b50f367dff67b8f7" + integrity sha512-EvYrfk0mpSt1jAMZmfFcHoNWEJskzResKp0bflOYsYPsZPuJ5WraKsk4IEEpesYHCyHW5AAb5HBJHeoSbVLh4Q== dependencies: ansi-colors "^4.1.1" extend-object "^1.0.0" @@ -43,158 +43,158 @@ merge-stream "^2.0.0" micromatch "^4.0.2" -"@abp/bootstrap-datepicker@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-7.4.0.tgz#75edc2127ca26d86bfefaa6e37579b06e32de5de" - integrity sha512-HXUa+kLjKu8sKr+kCZeNye9Pv/swRfKGAt/uJ2WUEvCJ4IVIMM1p6iMnOEEk/+3OGE64/PWu3cdE9dLP6izOaA== +"@abp/bootstrap-datepicker@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-7.4.1.tgz#f8f35d0edf71368faaae4e40a72fa846b0084f9b" + integrity sha512-hsu8ty6c2oOevsNoyFTQ4yJAu27qnz82MgRNVS8MRfdzo05/LhBhy/tKFm+PFYJqZULYlpQ1GXUF2+uGyazIeg== dependencies: bootstrap-datepicker "^1.9.0" -"@abp/bootstrap-daterangepicker@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-7.4.0.tgz#5058fc2a9354f0a71ac5393658e362779a3bdc46" - integrity sha512-EK0wzZUY9H3XPb9U3DvYVqh48fU+6IneNGYOk7dcda8CUYObd4Dl1nXligStCqgn2uePtwxDHRx40eV0GXmU/Q== +"@abp/bootstrap-daterangepicker@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-7.4.1.tgz#b133cefdbed0fa1b8f1bda916a9d46952237238a" + integrity sha512-NpmbsO4Xg48Zmr8OOlf1fxuNMnFIqmRrkHiKp9lP5c8am64+7rRzCwATw2UY0Ud+4n8/ws+Iki1dwPQF6db1zw== dependencies: bootstrap-daterangepicker "^3.1.0" -"@abp/bootstrap@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-7.4.0.tgz#71be70660643d8f60d13d355b8c80b16e4854870" - integrity sha512-3Fa+fL5NH+0H2KK4MAaqNsiz0PYwK0+Oxjmd0NgKwcqV2vJzRrzS3WG5kITYjNz9QGdBV+FrhNX/NSRU8LDx3Q== +"@abp/bootstrap@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-7.4.1.tgz#b34a2fcc80e04212865652ee7f4f5498a6a61f6d" + integrity sha512-/qCgfrtNWZ2jui2iL6wd6MLrcxALSEFVBypaz1JK3WjEe7DvFAYvKLl7DugIv039/Sx3mbx/PJiQhx8CVZMsEA== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" bootstrap "^5.1.3" -"@abp/core@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-7.4.0.tgz#8505d446a3b4d80ce476bd3352c1639c7dc486ec" - integrity sha512-yxrnw6eAEIj/CcX5jAwb4xmCsdqWaG+KRcBA8GFvqXbsK94IjqLDiJ3flo+QhGn2DXo40ISxofZop0CgSbP7Ew== +"@abp/core@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-7.4.1.tgz#1d14899ad16aac038806504eb0a5be9318cdcc0c" + integrity sha512-p0BAe2kCtgZmq8pilahmuxmye8DeRXt2KmnFRbmYE3j4d0uComFZpC72QOD1iro8bkmbsHfsHJpiVg4Sp4licw== dependencies: - "@abp/utils" "~7.4.0" + "@abp/utils" "~7.4.1" -"@abp/datatables.net-bs5@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-7.4.0.tgz#52d22e12a2420b402e03148793707d063db0088d" - integrity sha512-VvQv5w0cUpdDD9jX8aUEaLxFrc4A95JlmFnhCYIV1etL8HNOdZvmOThxorsImk31JfpyVYrY/Ze/rnWi2uhVvQ== +"@abp/datatables.net-bs5@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-7.4.1.tgz#821ee4c5db116f9810d65184855cea1fa7d47360" + integrity sha512-jpUzb65lCGYAxs/1qV3pRP8agHwIgZA9gDrudvR8S/3X3kNQWtmeKoFDZ93mhnl3aWPjWFKVrT2LeQeJw5XO5A== dependencies: - "@abp/datatables.net" "~7.4.0" + "@abp/datatables.net" "~7.4.1" datatables.net-bs5 "^1.11.4" -"@abp/datatables.net@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-7.4.0.tgz#9f12a1bb2abd05cd753b5d937d8a0350b2ff74ae" - integrity sha512-StOkMmIkcBUWzD9ToZ5J/hISRWdxbAWjwn7RuFXsoHXcY03mmD86g2oztjrWC5UFnRdpFnsfspTpbNqXFB9Vag== +"@abp/datatables.net@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-7.4.1.tgz#a4501e92e9995da0759b9ce55756fe92c4e8db59" + integrity sha512-BZOOZLH7XrGlX3aFK97cwV9+npsTzALSBo87OgwO2U6UpeFq7yAOvmC0+L9dmIUDISeORn5IFc/zTsSSIQnpHQ== dependencies: - "@abp/jquery" "~7.4.0" + "@abp/jquery" "~7.4.1" datatables.net "^1.11.4" -"@abp/font-awesome@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-7.4.0.tgz#50059083b88706a0f71f55118472b378e4c66163" - integrity sha512-hKoPyM41HHCK6dg+8pQvjYJWzKABBCXrYQAIneMPQZUZqa4JLObKCva9TR7pu6pUp+9OVzg4fQOBM+nwpHtw4g== +"@abp/font-awesome@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-7.4.1.tgz#f6175a989aa64367830723f1dd9c607906716296" + integrity sha512-/ybaz4KROwFdG4Xv0yMTUMXOreDmKy1lKQuntqHEUnIorhXmkgcd5AQQ5AolJ4NmNdPNt1VYrRcTEmdz3nw+FA== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" "@fortawesome/fontawesome-free" "^5.15.4" -"@abp/jquery-form@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-7.4.0.tgz#7ab3be241ee09f1e2843bd1b4d0b0b86d4446e30" - integrity sha512-OmTRuZ7QK1oe2ayNLqEpRJk4Ogk0wt/hIFtJHwQkCtDuCggoR5sQz4vn1vgrD19MxGq07dow5IgjbbhHv1vtEg== +"@abp/jquery-form@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-7.4.1.tgz#67978c41cda204b4c2027d81fc66844379313fa6" + integrity sha512-JZ1D47s/kpTlfMcpD4Jrlh98bhEDsIlWJauvAYaS0EBPIU9V2zHGQ+h9GPFbSPrXe4sYxPSREcsc8KUVMhT5MQ== dependencies: - "@abp/jquery" "~7.4.0" + "@abp/jquery" "~7.4.1" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-7.4.0.tgz#0c564e39c4997dd9b8af7d2023615a06d6fd9834" - integrity sha512-vFB3RKkDlDXbHlDJ64uo3jWW1IRXwiCaPf+mcB77Wpt5+0Dn7eWqjBT7KyHBrsV08ghIqY/Q4nXntFJrmLcuEA== +"@abp/jquery-validation-unobtrusive@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-7.4.1.tgz#fe5c90ade419e83505884dd50dd5988d766f177b" + integrity sha512-oHHV/ukap+vDvQ8CnEWnOrrsLkHXIcMk+SjNKe/dyK5VzOVLDpMatRFmloLs2igYVXTqDGjmDlTswTFdJUarcQ== dependencies: - "@abp/jquery-validation" "~7.4.0" + "@abp/jquery-validation" "~7.4.1" jquery-validation-unobtrusive "^3.2.12" -"@abp/jquery-validation@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-7.4.0.tgz#f2aaba8f4c023e93f0051cc9a05c6d82fa5c7254" - integrity sha512-vN4srLT5UXAKXpKHbZgySWT+N2DjRYivgtifpZHMTGFLMW14W+tfi5zhR4H4JvqJpuO6ZKNiz15zA1zwEBK0Tw== +"@abp/jquery-validation@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-7.4.1.tgz#c2c06bc28770832a9ad73eac000586faed3bdbe3" + integrity sha512-A5iFT2EWfGHXrBb/ov5f0grZ2o2xkDaYtps/FnDUwBYdIdD8E7bbJsWp6ytvZDciO0XmEqAoVOxmiij7ue/SOg== dependencies: - "@abp/jquery" "~7.4.0" + "@abp/jquery" "~7.4.1" jquery-validation "^1.19.3" -"@abp/jquery@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-7.4.0.tgz#206891b20f250537d05d907d2b6cd682fec76496" - integrity sha512-DeYo02T6WVhdpLloSPb6ooqtpksu1HtcbbQhIP9E1P7jHSzZoNiJvoKXHiFUcj5PYiGKl9d/o89hM/apWzyreQ== +"@abp/jquery@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-7.4.1.tgz#b5e16834e6c7871ad6392612ac8e2de8617eb353" + integrity sha512-X3RcovvRYISHcsb6W3U3iVsofw6yomoiouoB1tSIy2/tvUbu9n7N/3MM0CUujFm/xib7s3z1tVxFssS9smT7sw== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" jquery "~3.6.0" -"@abp/lodash@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-7.4.0.tgz#93f20abee776dbfa7aa45e2e710f2768f262fda5" - integrity sha512-h4Fnjm+VLwp1F3r57B9MrHhwyOYMo5oP285a85zzAYLkhwcDy7f1nbHKHMQ3ZTaeJVmiRnVaH+3sdUdslCRt5g== +"@abp/lodash@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-7.4.1.tgz#d0f84b7b9cbd989d59ebde594ed7acb8bc720b61" + integrity sha512-RFjZCyAPZnpvT0SJbxXzzmMYbuocSWBlezvjAVA8MiTrOXdZO4VyaTFjIuQcAdSrZhtpFGeYWxAjHshVplxMbw== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" lodash "^4.17.21" -"@abp/luxon@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-7.4.0.tgz#2ba7ff307c8f7c24d818a9c33635b86fd6810db9" - integrity sha512-ROCx7aihM+agdYy7Tkz+GiScx68KY5qwGTnj8P7QabGFChzVUic6RuBG+2Obmfonc6uT7Rq0c8JDGrsGNe/w8A== +"@abp/luxon@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-7.4.1.tgz#e0c0947d2b77f98b9cdaf7d1143025879361c3c9" + integrity sha512-k1wh8tT1529MtNC2gSXEIKdimBXBwubXeLisgpIPx6lkJo1Op6pAz2ERwFXeyktqGdYyuFcnewJIxmS7EPtWhg== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" luxon "^2.3.0" -"@abp/malihu-custom-scrollbar-plugin@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-7.4.0.tgz#aba68877481f4339e048f2ae3cfbe93197145a0a" - integrity sha512-Ntodhi4k0HFQmImYTP5SYf/WDm7aUGJLaGsfePm77HJ6DhGgalIGqtM8NiFXzo/3GmMY0XSo8Wxrs1mSCdtsOA== +"@abp/malihu-custom-scrollbar-plugin@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-7.4.1.tgz#aa7ec247197a258277549052780b38fd9e748c6c" + integrity sha512-pm/wIaiRSgGxelOf8AiL4JKFNZOQ6s2WbR6pULiP2HSNCgCpWYJ2s8fvj7VP3lAHIa98v3m8PSMSUhqaANxZ/Q== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/moment@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-7.4.0.tgz#2490d9c7cdcaeca8d0ba9ebef5e7298caf0c9e09" - integrity sha512-ftsUEgO17GbVawA1GplGFzEeIM4NX004AmS6/fPI3o5isX7o1buF9q9TXdnwUuFEJKZxS4KpveRqzTL5t9k0BQ== +"@abp/moment@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-7.4.1.tgz#1c28ccb13eecdd13695edf8641ca9867b318e37d" + integrity sha512-7vRJyAK5ER9z+LV1xUSAAtWlPlhv8yhM/nHjhC+IQSP/+V1D7VLA6EKxAEexGw7wX6HY8oMOWP9HxDHMb5hKQA== dependencies: moment "^2.9.0" -"@abp/select2@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-7.4.0.tgz#2f455cc991b7bb4df9ed426097bc2996cac12697" - integrity sha512-DwprX4MIoqMzSdh7eFg7EjGIz4ftYZub6jG9Sk3r+sxabbhpbFTxKOpXnhBWYi7L7uTQ8YDFk/5NeXO+Rm50Ww== +"@abp/select2@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-7.4.1.tgz#d7ea53cfec285a06278db362131b7510d5b73900" + integrity sha512-0S66iy7HuB74qqOSDraoF7UvXqz2PrnOKy+3EYMTMskOn4pWaq03JMR8xxEgZ8CtmsrqlE1a4wt1Yt9b3FIc0w== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" select2 "^4.0.13" -"@abp/sweetalert2@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-7.4.0.tgz#db1b4bd45cbabd61172591abc8ce223b5f607c4e" - integrity sha512-XqHPRnTASaRtbJIZYKW1KSKIJ8tynL8DuPCSMjcp4iyUlk+gnzxvbqXeNVjc2ojxj78T/42M/vITNoiiTYuKUw== +"@abp/sweetalert2@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-7.4.1.tgz#6722a40e5115cc341b7543aa0fa3b5a7ae9515b2" + integrity sha512-9jAHrYqCp5qykYfNNbqgESL6egixofVwonjZlb+lLWHAkIX+gQ2ApUNDFSXPtKUh2n9sXhSfF8SSg+BHP/bkCA== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" sweetalert2 "^11.3.6" -"@abp/timeago@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-7.4.0.tgz#245fe09370f38311a67a594c8a3c884aea59cc90" - integrity sha512-khxK6EICUaGCUM1HkACw/8rlPQNssoQvCK64bNqEHBCXgPUmTcqSj5MEGiNOYbgGyWeH2IAMtJEYPqX1g1wqSA== +"@abp/timeago@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-7.4.1.tgz#243d342ba131878ae7f892909c9cae07cf54902b" + integrity sha512-a0Vl2NFwTxzRmH5akWo8BRUxa6sK72z8OoXwUFkZOUqMWBCHK7ffNiN1/fbSgA+7HpSZdDvIthjYwBt57DxLdQ== dependencies: - "@abp/jquery" "~7.4.0" + "@abp/jquery" "~7.4.1" timeago "^1.6.7" -"@abp/toastr@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-7.4.0.tgz#16ba0414a27c9a21bc7556a078b175445edcf608" - integrity sha512-oM4HT2m95cK/9sB4AEQAKUMSGBep6wZTgM/46+o2IvvMdMPrGR2mPu9V9wi3y817FRgY+/qQTfy5TZWyTuIpVQ== +"@abp/toastr@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-7.4.1.tgz#345545a41b6145e54477c6c376193a6dbd62bdda" + integrity sha512-OLCvPJYSrcT2spcq9nO838Q22VhJ63Kdzasz1HugdVNqgcFCCSsqaoXrJGUcf5GrZx7PNloz7uf1I3txYMeZtA== dependencies: - "@abp/jquery" "~7.4.0" + "@abp/jquery" "~7.4.1" toastr "^2.1.4" -"@abp/utils@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-7.4.0.tgz#b31fb6e5dff07463535479a6bb62dc733d7119c8" - integrity sha512-CcR3tfuEsVM60DYL1A0cH6BkUTsasOoBDv/b63uLCoEOq/g8ntelD/SpRSgfDXK74P9M8OE5ZFxlXWDiYuzAFg== +"@abp/utils@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-7.4.1.tgz#2ce4c4d659c2ae9bc23b71b79fa3c6e120eaecaf" + integrity sha512-eFeoOXcz9cVkDKpOfd2VWmpAojASfsqfvACZqi1UmF16OcjsFIkxmIvhh1fpbT4A+eQLbaFFLIsf6gYb//tXhg== 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 7fbc0569f6..212b67b1c1 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": "~7.4.0" + "@abp/aspnetcore.mvc.ui.theme.basic": "~7.4.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 9c4c145174..8c3619aab1 100644 --- a/modules/cms-kit/host/Volo.CmsKit.Web.Host/yarn.lock +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Host/yarn.lock @@ -2,39 +2,39 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.basic@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-7.4.0.tgz#5088dd82ce343e1123e025848f09b51df988b225" - integrity sha512-teT7I0kgjek/lHzpTg5VOVCQ3IL26nFB43Aa/45fuaSwh9FJd3IJNXGL6xwp85oKaptDYSBXIF4GbrUfp2Ugqg== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~7.4.0" - -"@abp/aspnetcore.mvc.ui.theme.shared@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-7.4.0.tgz#e676444a46214e850b0d916daeeb912774ac381d" - integrity sha512-X+dgdgHGUTyf0zaSPsqQp2ZZWu2+9gIRT4r4/LDgxchHgfNvcKRF8jH/JICcVgGD1adJvZzzDpTefL8CuAIRJA== - dependencies: - "@abp/aspnetcore.mvc.ui" "~7.4.0" - "@abp/bootstrap" "~7.4.0" - "@abp/bootstrap-datepicker" "~7.4.0" - "@abp/bootstrap-daterangepicker" "~7.4.0" - "@abp/datatables.net-bs5" "~7.4.0" - "@abp/font-awesome" "~7.4.0" - "@abp/jquery-form" "~7.4.0" - "@abp/jquery-validation-unobtrusive" "~7.4.0" - "@abp/lodash" "~7.4.0" - "@abp/luxon" "~7.4.0" - "@abp/malihu-custom-scrollbar-plugin" "~7.4.0" - "@abp/moment" "~7.4.0" - "@abp/select2" "~7.4.0" - "@abp/sweetalert2" "~7.4.0" - "@abp/timeago" "~7.4.0" - "@abp/toastr" "~7.4.0" - -"@abp/aspnetcore.mvc.ui@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-7.4.0.tgz#61e1b52d2a940e02242f57007bd3f0fcb583c09a" - integrity sha512-gdoxOBo10DWDYhUq1GVfguC0Ot8PYhoA3VLf88/RatL88BNUUlt0e71uMFcx/gk72fuAE+o9zXn/6nq1wtpSwQ== +"@abp/aspnetcore.mvc.ui.theme.basic@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-7.4.1.tgz#62df78aab8a0b374817fdbab6c6363529b43f925" + integrity sha512-KaPmBlwNjOl1+vwLj5O8J11YHBSRg4y0IIxtgZiculXQNFPHbYAXm8sfTw6Wcsx00STrhvUVJQxYMePNnOTCTg== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~7.4.1" + +"@abp/aspnetcore.mvc.ui.theme.shared@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-7.4.1.tgz#8f8679f5cf80137324ddbec9fcaa67332783e708" + integrity sha512-0uUKuTsi/ikLFUUNEqvrn7KimgsvuK+7m1yZD4o47FQlgGxTyt1zQY9w3K6YyhyC3lsT6qCwiAPIoFOzPkIg/Q== + dependencies: + "@abp/aspnetcore.mvc.ui" "~7.4.1" + "@abp/bootstrap" "~7.4.1" + "@abp/bootstrap-datepicker" "~7.4.1" + "@abp/bootstrap-daterangepicker" "~7.4.1" + "@abp/datatables.net-bs5" "~7.4.1" + "@abp/font-awesome" "~7.4.1" + "@abp/jquery-form" "~7.4.1" + "@abp/jquery-validation-unobtrusive" "~7.4.1" + "@abp/lodash" "~7.4.1" + "@abp/luxon" "~7.4.1" + "@abp/malihu-custom-scrollbar-plugin" "~7.4.1" + "@abp/moment" "~7.4.1" + "@abp/select2" "~7.4.1" + "@abp/sweetalert2" "~7.4.1" + "@abp/timeago" "~7.4.1" + "@abp/toastr" "~7.4.1" + +"@abp/aspnetcore.mvc.ui@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-7.4.1.tgz#49c13718a17569f97b71f978b50f367dff67b8f7" + integrity sha512-EvYrfk0mpSt1jAMZmfFcHoNWEJskzResKp0bflOYsYPsZPuJ5WraKsk4IEEpesYHCyHW5AAb5HBJHeoSbVLh4Q== dependencies: ansi-colors "^4.1.1" extend-object "^1.0.0" @@ -43,158 +43,158 @@ merge-stream "^2.0.0" micromatch "^4.0.2" -"@abp/bootstrap-datepicker@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-7.4.0.tgz#75edc2127ca26d86bfefaa6e37579b06e32de5de" - integrity sha512-HXUa+kLjKu8sKr+kCZeNye9Pv/swRfKGAt/uJ2WUEvCJ4IVIMM1p6iMnOEEk/+3OGE64/PWu3cdE9dLP6izOaA== +"@abp/bootstrap-datepicker@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-7.4.1.tgz#f8f35d0edf71368faaae4e40a72fa846b0084f9b" + integrity sha512-hsu8ty6c2oOevsNoyFTQ4yJAu27qnz82MgRNVS8MRfdzo05/LhBhy/tKFm+PFYJqZULYlpQ1GXUF2+uGyazIeg== dependencies: bootstrap-datepicker "^1.9.0" -"@abp/bootstrap-daterangepicker@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-7.4.0.tgz#5058fc2a9354f0a71ac5393658e362779a3bdc46" - integrity sha512-EK0wzZUY9H3XPb9U3DvYVqh48fU+6IneNGYOk7dcda8CUYObd4Dl1nXligStCqgn2uePtwxDHRx40eV0GXmU/Q== +"@abp/bootstrap-daterangepicker@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-7.4.1.tgz#b133cefdbed0fa1b8f1bda916a9d46952237238a" + integrity sha512-NpmbsO4Xg48Zmr8OOlf1fxuNMnFIqmRrkHiKp9lP5c8am64+7rRzCwATw2UY0Ud+4n8/ws+Iki1dwPQF6db1zw== dependencies: bootstrap-daterangepicker "^3.1.0" -"@abp/bootstrap@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-7.4.0.tgz#71be70660643d8f60d13d355b8c80b16e4854870" - integrity sha512-3Fa+fL5NH+0H2KK4MAaqNsiz0PYwK0+Oxjmd0NgKwcqV2vJzRrzS3WG5kITYjNz9QGdBV+FrhNX/NSRU8LDx3Q== +"@abp/bootstrap@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-7.4.1.tgz#b34a2fcc80e04212865652ee7f4f5498a6a61f6d" + integrity sha512-/qCgfrtNWZ2jui2iL6wd6MLrcxALSEFVBypaz1JK3WjEe7DvFAYvKLl7DugIv039/Sx3mbx/PJiQhx8CVZMsEA== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" bootstrap "^5.1.3" -"@abp/core@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-7.4.0.tgz#8505d446a3b4d80ce476bd3352c1639c7dc486ec" - integrity sha512-yxrnw6eAEIj/CcX5jAwb4xmCsdqWaG+KRcBA8GFvqXbsK94IjqLDiJ3flo+QhGn2DXo40ISxofZop0CgSbP7Ew== +"@abp/core@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-7.4.1.tgz#1d14899ad16aac038806504eb0a5be9318cdcc0c" + integrity sha512-p0BAe2kCtgZmq8pilahmuxmye8DeRXt2KmnFRbmYE3j4d0uComFZpC72QOD1iro8bkmbsHfsHJpiVg4Sp4licw== dependencies: - "@abp/utils" "~7.4.0" + "@abp/utils" "~7.4.1" -"@abp/datatables.net-bs5@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-7.4.0.tgz#52d22e12a2420b402e03148793707d063db0088d" - integrity sha512-VvQv5w0cUpdDD9jX8aUEaLxFrc4A95JlmFnhCYIV1etL8HNOdZvmOThxorsImk31JfpyVYrY/Ze/rnWi2uhVvQ== +"@abp/datatables.net-bs5@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-7.4.1.tgz#821ee4c5db116f9810d65184855cea1fa7d47360" + integrity sha512-jpUzb65lCGYAxs/1qV3pRP8agHwIgZA9gDrudvR8S/3X3kNQWtmeKoFDZ93mhnl3aWPjWFKVrT2LeQeJw5XO5A== dependencies: - "@abp/datatables.net" "~7.4.0" + "@abp/datatables.net" "~7.4.1" datatables.net-bs5 "^1.11.4" -"@abp/datatables.net@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-7.4.0.tgz#9f12a1bb2abd05cd753b5d937d8a0350b2ff74ae" - integrity sha512-StOkMmIkcBUWzD9ToZ5J/hISRWdxbAWjwn7RuFXsoHXcY03mmD86g2oztjrWC5UFnRdpFnsfspTpbNqXFB9Vag== +"@abp/datatables.net@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-7.4.1.tgz#a4501e92e9995da0759b9ce55756fe92c4e8db59" + integrity sha512-BZOOZLH7XrGlX3aFK97cwV9+npsTzALSBo87OgwO2U6UpeFq7yAOvmC0+L9dmIUDISeORn5IFc/zTsSSIQnpHQ== dependencies: - "@abp/jquery" "~7.4.0" + "@abp/jquery" "~7.4.1" datatables.net "^1.11.4" -"@abp/font-awesome@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-7.4.0.tgz#50059083b88706a0f71f55118472b378e4c66163" - integrity sha512-hKoPyM41HHCK6dg+8pQvjYJWzKABBCXrYQAIneMPQZUZqa4JLObKCva9TR7pu6pUp+9OVzg4fQOBM+nwpHtw4g== +"@abp/font-awesome@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-7.4.1.tgz#f6175a989aa64367830723f1dd9c607906716296" + integrity sha512-/ybaz4KROwFdG4Xv0yMTUMXOreDmKy1lKQuntqHEUnIorhXmkgcd5AQQ5AolJ4NmNdPNt1VYrRcTEmdz3nw+FA== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" "@fortawesome/fontawesome-free" "^5.15.4" -"@abp/jquery-form@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-7.4.0.tgz#7ab3be241ee09f1e2843bd1b4d0b0b86d4446e30" - integrity sha512-OmTRuZ7QK1oe2ayNLqEpRJk4Ogk0wt/hIFtJHwQkCtDuCggoR5sQz4vn1vgrD19MxGq07dow5IgjbbhHv1vtEg== +"@abp/jquery-form@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-7.4.1.tgz#67978c41cda204b4c2027d81fc66844379313fa6" + integrity sha512-JZ1D47s/kpTlfMcpD4Jrlh98bhEDsIlWJauvAYaS0EBPIU9V2zHGQ+h9GPFbSPrXe4sYxPSREcsc8KUVMhT5MQ== dependencies: - "@abp/jquery" "~7.4.0" + "@abp/jquery" "~7.4.1" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-7.4.0.tgz#0c564e39c4997dd9b8af7d2023615a06d6fd9834" - integrity sha512-vFB3RKkDlDXbHlDJ64uo3jWW1IRXwiCaPf+mcB77Wpt5+0Dn7eWqjBT7KyHBrsV08ghIqY/Q4nXntFJrmLcuEA== +"@abp/jquery-validation-unobtrusive@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-7.4.1.tgz#fe5c90ade419e83505884dd50dd5988d766f177b" + integrity sha512-oHHV/ukap+vDvQ8CnEWnOrrsLkHXIcMk+SjNKe/dyK5VzOVLDpMatRFmloLs2igYVXTqDGjmDlTswTFdJUarcQ== dependencies: - "@abp/jquery-validation" "~7.4.0" + "@abp/jquery-validation" "~7.4.1" jquery-validation-unobtrusive "^3.2.12" -"@abp/jquery-validation@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-7.4.0.tgz#f2aaba8f4c023e93f0051cc9a05c6d82fa5c7254" - integrity sha512-vN4srLT5UXAKXpKHbZgySWT+N2DjRYivgtifpZHMTGFLMW14W+tfi5zhR4H4JvqJpuO6ZKNiz15zA1zwEBK0Tw== +"@abp/jquery-validation@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-7.4.1.tgz#c2c06bc28770832a9ad73eac000586faed3bdbe3" + integrity sha512-A5iFT2EWfGHXrBb/ov5f0grZ2o2xkDaYtps/FnDUwBYdIdD8E7bbJsWp6ytvZDciO0XmEqAoVOxmiij7ue/SOg== dependencies: - "@abp/jquery" "~7.4.0" + "@abp/jquery" "~7.4.1" jquery-validation "^1.19.3" -"@abp/jquery@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-7.4.0.tgz#206891b20f250537d05d907d2b6cd682fec76496" - integrity sha512-DeYo02T6WVhdpLloSPb6ooqtpksu1HtcbbQhIP9E1P7jHSzZoNiJvoKXHiFUcj5PYiGKl9d/o89hM/apWzyreQ== +"@abp/jquery@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-7.4.1.tgz#b5e16834e6c7871ad6392612ac8e2de8617eb353" + integrity sha512-X3RcovvRYISHcsb6W3U3iVsofw6yomoiouoB1tSIy2/tvUbu9n7N/3MM0CUujFm/xib7s3z1tVxFssS9smT7sw== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" jquery "~3.6.0" -"@abp/lodash@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-7.4.0.tgz#93f20abee776dbfa7aa45e2e710f2768f262fda5" - integrity sha512-h4Fnjm+VLwp1F3r57B9MrHhwyOYMo5oP285a85zzAYLkhwcDy7f1nbHKHMQ3ZTaeJVmiRnVaH+3sdUdslCRt5g== +"@abp/lodash@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-7.4.1.tgz#d0f84b7b9cbd989d59ebde594ed7acb8bc720b61" + integrity sha512-RFjZCyAPZnpvT0SJbxXzzmMYbuocSWBlezvjAVA8MiTrOXdZO4VyaTFjIuQcAdSrZhtpFGeYWxAjHshVplxMbw== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" lodash "^4.17.21" -"@abp/luxon@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-7.4.0.tgz#2ba7ff307c8f7c24d818a9c33635b86fd6810db9" - integrity sha512-ROCx7aihM+agdYy7Tkz+GiScx68KY5qwGTnj8P7QabGFChzVUic6RuBG+2Obmfonc6uT7Rq0c8JDGrsGNe/w8A== +"@abp/luxon@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-7.4.1.tgz#e0c0947d2b77f98b9cdaf7d1143025879361c3c9" + integrity sha512-k1wh8tT1529MtNC2gSXEIKdimBXBwubXeLisgpIPx6lkJo1Op6pAz2ERwFXeyktqGdYyuFcnewJIxmS7EPtWhg== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" luxon "^2.3.0" -"@abp/malihu-custom-scrollbar-plugin@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-7.4.0.tgz#aba68877481f4339e048f2ae3cfbe93197145a0a" - integrity sha512-Ntodhi4k0HFQmImYTP5SYf/WDm7aUGJLaGsfePm77HJ6DhGgalIGqtM8NiFXzo/3GmMY0XSo8Wxrs1mSCdtsOA== +"@abp/malihu-custom-scrollbar-plugin@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-7.4.1.tgz#aa7ec247197a258277549052780b38fd9e748c6c" + integrity sha512-pm/wIaiRSgGxelOf8AiL4JKFNZOQ6s2WbR6pULiP2HSNCgCpWYJ2s8fvj7VP3lAHIa98v3m8PSMSUhqaANxZ/Q== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/moment@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-7.4.0.tgz#2490d9c7cdcaeca8d0ba9ebef5e7298caf0c9e09" - integrity sha512-ftsUEgO17GbVawA1GplGFzEeIM4NX004AmS6/fPI3o5isX7o1buF9q9TXdnwUuFEJKZxS4KpveRqzTL5t9k0BQ== +"@abp/moment@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-7.4.1.tgz#1c28ccb13eecdd13695edf8641ca9867b318e37d" + integrity sha512-7vRJyAK5ER9z+LV1xUSAAtWlPlhv8yhM/nHjhC+IQSP/+V1D7VLA6EKxAEexGw7wX6HY8oMOWP9HxDHMb5hKQA== dependencies: moment "^2.9.0" -"@abp/select2@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-7.4.0.tgz#2f455cc991b7bb4df9ed426097bc2996cac12697" - integrity sha512-DwprX4MIoqMzSdh7eFg7EjGIz4ftYZub6jG9Sk3r+sxabbhpbFTxKOpXnhBWYi7L7uTQ8YDFk/5NeXO+Rm50Ww== +"@abp/select2@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-7.4.1.tgz#d7ea53cfec285a06278db362131b7510d5b73900" + integrity sha512-0S66iy7HuB74qqOSDraoF7UvXqz2PrnOKy+3EYMTMskOn4pWaq03JMR8xxEgZ8CtmsrqlE1a4wt1Yt9b3FIc0w== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" select2 "^4.0.13" -"@abp/sweetalert2@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-7.4.0.tgz#db1b4bd45cbabd61172591abc8ce223b5f607c4e" - integrity sha512-XqHPRnTASaRtbJIZYKW1KSKIJ8tynL8DuPCSMjcp4iyUlk+gnzxvbqXeNVjc2ojxj78T/42M/vITNoiiTYuKUw== +"@abp/sweetalert2@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-7.4.1.tgz#6722a40e5115cc341b7543aa0fa3b5a7ae9515b2" + integrity sha512-9jAHrYqCp5qykYfNNbqgESL6egixofVwonjZlb+lLWHAkIX+gQ2ApUNDFSXPtKUh2n9sXhSfF8SSg+BHP/bkCA== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" sweetalert2 "^11.3.6" -"@abp/timeago@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-7.4.0.tgz#245fe09370f38311a67a594c8a3c884aea59cc90" - integrity sha512-khxK6EICUaGCUM1HkACw/8rlPQNssoQvCK64bNqEHBCXgPUmTcqSj5MEGiNOYbgGyWeH2IAMtJEYPqX1g1wqSA== +"@abp/timeago@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-7.4.1.tgz#243d342ba131878ae7f892909c9cae07cf54902b" + integrity sha512-a0Vl2NFwTxzRmH5akWo8BRUxa6sK72z8OoXwUFkZOUqMWBCHK7ffNiN1/fbSgA+7HpSZdDvIthjYwBt57DxLdQ== dependencies: - "@abp/jquery" "~7.4.0" + "@abp/jquery" "~7.4.1" timeago "^1.6.7" -"@abp/toastr@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-7.4.0.tgz#16ba0414a27c9a21bc7556a078b175445edcf608" - integrity sha512-oM4HT2m95cK/9sB4AEQAKUMSGBep6wZTgM/46+o2IvvMdMPrGR2mPu9V9wi3y817FRgY+/qQTfy5TZWyTuIpVQ== +"@abp/toastr@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-7.4.1.tgz#345545a41b6145e54477c6c376193a6dbd62bdda" + integrity sha512-OLCvPJYSrcT2spcq9nO838Q22VhJ63Kdzasz1HugdVNqgcFCCSsqaoXrJGUcf5GrZx7PNloz7uf1I3txYMeZtA== dependencies: - "@abp/jquery" "~7.4.0" + "@abp/jquery" "~7.4.1" toastr "^2.1.4" -"@abp/utils@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-7.4.0.tgz#b31fb6e5dff07463535479a6bb62dc733d7119c8" - integrity sha512-CcR3tfuEsVM60DYL1A0cH6BkUTsasOoBDv/b63uLCoEOq/g8ntelD/SpRSgfDXK74P9M8OE5ZFxlXWDiYuzAFg== +"@abp/utils@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-7.4.1.tgz#2ce4c4d659c2ae9bc23b71b79fa3c6e120eaecaf" + integrity sha512-eFeoOXcz9cVkDKpOfd2VWmpAojASfsqfvACZqi1UmF16OcjsFIkxmIvhh1fpbT4A+eQLbaFFLIsf6gYb//tXhg== dependencies: just-compare "^2.3.0" diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Pages/Index.cshtml b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Pages/Index.cshtml index 1b3f3ff94c..5302289fb3 100644 --- a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Pages/Index.cshtml +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Pages/Index.cshtml @@ -48,7 +48,12 @@ @if (GlobalFeatureManager.Instance.IsEnabled()) { - @await Component.InvokeAsync(typeof(RatingViewComponent), new {entityType = "quote", entityId = "1"}) + @await Component.InvokeAsync(typeof(RatingViewComponent), new + { + entityType = "quote", + entityId = "1", + isReadOnly = false + }) } @@ -60,7 +65,13 @@ @if (GlobalFeatureManager.Instance.IsEnabled()) { - @await Component.InvokeAsync(typeof(CommentingViewComponent), new {entityType = "quote", entityId = "1", referralLinks = new [] {"nofollow"}}) + @await Component.InvokeAsync(typeof(CommentingViewComponent), new + { + entityType = "quote", + entityId = "1", + isReadOnly = false, + referralLinks = new [] {"nofollow"} + }) } 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 a4a8e6fff1..6d059608f6 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": "~7.4.0", - "@abp/cms-kit": "7.4.0" + "@abp/aspnetcore.mvc.ui.theme.basic": "~7.4.1", + "@abp/cms-kit": "7.4.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 87286d8e3c..8e20f36041 100644 --- a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/yarn.lock +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/yarn.lock @@ -2,39 +2,39 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.basic@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-7.4.0.tgz#5088dd82ce343e1123e025848f09b51df988b225" - integrity sha512-teT7I0kgjek/lHzpTg5VOVCQ3IL26nFB43Aa/45fuaSwh9FJd3IJNXGL6xwp85oKaptDYSBXIF4GbrUfp2Ugqg== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~7.4.0" - -"@abp/aspnetcore.mvc.ui.theme.shared@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-7.4.0.tgz#e676444a46214e850b0d916daeeb912774ac381d" - integrity sha512-X+dgdgHGUTyf0zaSPsqQp2ZZWu2+9gIRT4r4/LDgxchHgfNvcKRF8jH/JICcVgGD1adJvZzzDpTefL8CuAIRJA== - dependencies: - "@abp/aspnetcore.mvc.ui" "~7.4.0" - "@abp/bootstrap" "~7.4.0" - "@abp/bootstrap-datepicker" "~7.4.0" - "@abp/bootstrap-daterangepicker" "~7.4.0" - "@abp/datatables.net-bs5" "~7.4.0" - "@abp/font-awesome" "~7.4.0" - "@abp/jquery-form" "~7.4.0" - "@abp/jquery-validation-unobtrusive" "~7.4.0" - "@abp/lodash" "~7.4.0" - "@abp/luxon" "~7.4.0" - "@abp/malihu-custom-scrollbar-plugin" "~7.4.0" - "@abp/moment" "~7.4.0" - "@abp/select2" "~7.4.0" - "@abp/sweetalert2" "~7.4.0" - "@abp/timeago" "~7.4.0" - "@abp/toastr" "~7.4.0" - -"@abp/aspnetcore.mvc.ui@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-7.4.0.tgz#61e1b52d2a940e02242f57007bd3f0fcb583c09a" - integrity sha512-gdoxOBo10DWDYhUq1GVfguC0Ot8PYhoA3VLf88/RatL88BNUUlt0e71uMFcx/gk72fuAE+o9zXn/6nq1wtpSwQ== +"@abp/aspnetcore.mvc.ui.theme.basic@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-7.4.1.tgz#62df78aab8a0b374817fdbab6c6363529b43f925" + integrity sha512-KaPmBlwNjOl1+vwLj5O8J11YHBSRg4y0IIxtgZiculXQNFPHbYAXm8sfTw6Wcsx00STrhvUVJQxYMePNnOTCTg== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~7.4.1" + +"@abp/aspnetcore.mvc.ui.theme.shared@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-7.4.1.tgz#8f8679f5cf80137324ddbec9fcaa67332783e708" + integrity sha512-0uUKuTsi/ikLFUUNEqvrn7KimgsvuK+7m1yZD4o47FQlgGxTyt1zQY9w3K6YyhyC3lsT6qCwiAPIoFOzPkIg/Q== + dependencies: + "@abp/aspnetcore.mvc.ui" "~7.4.1" + "@abp/bootstrap" "~7.4.1" + "@abp/bootstrap-datepicker" "~7.4.1" + "@abp/bootstrap-daterangepicker" "~7.4.1" + "@abp/datatables.net-bs5" "~7.4.1" + "@abp/font-awesome" "~7.4.1" + "@abp/jquery-form" "~7.4.1" + "@abp/jquery-validation-unobtrusive" "~7.4.1" + "@abp/lodash" "~7.4.1" + "@abp/luxon" "~7.4.1" + "@abp/malihu-custom-scrollbar-plugin" "~7.4.1" + "@abp/moment" "~7.4.1" + "@abp/select2" "~7.4.1" + "@abp/sweetalert2" "~7.4.1" + "@abp/timeago" "~7.4.1" + "@abp/toastr" "~7.4.1" + +"@abp/aspnetcore.mvc.ui@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-7.4.1.tgz#49c13718a17569f97b71f978b50f367dff67b8f7" + integrity sha512-EvYrfk0mpSt1jAMZmfFcHoNWEJskzResKp0bflOYsYPsZPuJ5WraKsk4IEEpesYHCyHW5AAb5HBJHeoSbVLh4Q== dependencies: ansi-colors "^4.1.1" extend-object "^1.0.0" @@ -43,257 +43,257 @@ merge-stream "^2.0.0" micromatch "^4.0.2" -"@abp/bootstrap-datepicker@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-7.4.0.tgz#75edc2127ca26d86bfefaa6e37579b06e32de5de" - integrity sha512-HXUa+kLjKu8sKr+kCZeNye9Pv/swRfKGAt/uJ2WUEvCJ4IVIMM1p6iMnOEEk/+3OGE64/PWu3cdE9dLP6izOaA== +"@abp/bootstrap-datepicker@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-7.4.1.tgz#f8f35d0edf71368faaae4e40a72fa846b0084f9b" + integrity sha512-hsu8ty6c2oOevsNoyFTQ4yJAu27qnz82MgRNVS8MRfdzo05/LhBhy/tKFm+PFYJqZULYlpQ1GXUF2+uGyazIeg== dependencies: bootstrap-datepicker "^1.9.0" -"@abp/bootstrap-daterangepicker@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-7.4.0.tgz#5058fc2a9354f0a71ac5393658e362779a3bdc46" - integrity sha512-EK0wzZUY9H3XPb9U3DvYVqh48fU+6IneNGYOk7dcda8CUYObd4Dl1nXligStCqgn2uePtwxDHRx40eV0GXmU/Q== +"@abp/bootstrap-daterangepicker@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-7.4.1.tgz#b133cefdbed0fa1b8f1bda916a9d46952237238a" + integrity sha512-NpmbsO4Xg48Zmr8OOlf1fxuNMnFIqmRrkHiKp9lP5c8am64+7rRzCwATw2UY0Ud+4n8/ws+Iki1dwPQF6db1zw== dependencies: bootstrap-daterangepicker "^3.1.0" -"@abp/bootstrap@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-7.4.0.tgz#71be70660643d8f60d13d355b8c80b16e4854870" - integrity sha512-3Fa+fL5NH+0H2KK4MAaqNsiz0PYwK0+Oxjmd0NgKwcqV2vJzRrzS3WG5kITYjNz9QGdBV+FrhNX/NSRU8LDx3Q== +"@abp/bootstrap@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-7.4.1.tgz#b34a2fcc80e04212865652ee7f4f5498a6a61f6d" + integrity sha512-/qCgfrtNWZ2jui2iL6wd6MLrcxALSEFVBypaz1JK3WjEe7DvFAYvKLl7DugIv039/Sx3mbx/PJiQhx8CVZMsEA== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" bootstrap "^5.1.3" -"@abp/clipboard@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-7.4.0.tgz#f1d147df94ddf3ab53eeeb05aec3d5556064c5d6" - integrity sha512-z/nB1RQN/tmShSRwc9Fv1DsJSNM7+Zg4GnAtvZNpOHJp8LTVmsJWxLoUM7hF896W9E0JKr8tRuCVqulyh3IqKg== +"@abp/clipboard@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-7.4.1.tgz#31329ad4565b5075b486e9ca63fb0ff8a070ff9e" + integrity sha512-/+ylBPs/TEZdwywSSTnj96WoRJPwQnR6vlI+sX7h9wDfSDbMwuSSdETSnDVT21lkl8gonPONFZTL8D1u/KKAhg== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" clipboard "^2.0.8" -"@abp/cms-kit.admin@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/cms-kit.admin/-/cms-kit.admin-7.4.0.tgz#89465edaf6ccb44d517ca999dff68a9382bb3b36" - integrity sha512-QnCJF9YgzpS76cX1CXgeKGX41a5tltqf5tX/zryWaXyQxGgc/2gmVIT5NBsOABLNePmtAYGnF2GtwOygikOJCw== +"@abp/cms-kit.admin@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/cms-kit.admin/-/cms-kit.admin-7.4.1.tgz#aab06e7741b5cd5717ca2d1b4966a3ac1882646e" + integrity sha512-6mNdNp1m8dt/LK6HBDbaLs0DUnrAgWZVYWGGAc/ajrQPoZhw0gptqf4raAYnt0yDx+/30/Lw2cwsQQl5uAr5mw== dependencies: - "@abp/codemirror" "~7.4.0" - "@abp/jstree" "~7.4.0" - "@abp/slugify" "~7.4.0" - "@abp/tui-editor" "~7.4.0" - "@abp/uppy" "~7.4.0" + "@abp/codemirror" "~7.4.1" + "@abp/jstree" "~7.4.1" + "@abp/slugify" "~7.4.1" + "@abp/tui-editor" "~7.4.1" + "@abp/uppy" "~7.4.1" -"@abp/cms-kit.public@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/cms-kit.public/-/cms-kit.public-7.4.0.tgz#c13c7e7f155a76f699d6a32f918e74d83ebcdff9" - integrity sha512-5+RJRAH2AK+Do2iNo0KDEqgqt+UwtMpCzIn/Rpcgn+WtiqyJ9XNqn9A8mISasPtXzXvrZplQrSmCAjAUSm1AeA== +"@abp/cms-kit.public@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/cms-kit.public/-/cms-kit.public-7.4.1.tgz#b140eb556985f18e2482cd9422b262fdcad5e6d1" + integrity sha512-5sPirQw6dtnKYTdZuMV9+rH1/W4ZUu3Apo3DwzCLs+VDw6KyaA3TlgYBmtwzXzaAU/e1MDMDjtTumMZos7DeeQ== dependencies: - "@abp/highlight.js" "~7.4.0" - "@abp/star-rating-svg" "~7.4.0" + "@abp/highlight.js" "~7.4.1" + "@abp/star-rating-svg" "~7.4.1" -"@abp/cms-kit@7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/cms-kit/-/cms-kit-7.4.0.tgz#a385f344d08fb95ec163d132f10dbb6e1cc6643d" - integrity sha512-TPWR5vB3p/Ki3iXgM+jk+cdGNhnyzpkziDb4hIL5pOkNFWL7npNNCjlZvppGMzuq/lo31KW5VTBoL4Qf369S6Q== +"@abp/cms-kit@7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/cms-kit/-/cms-kit-7.4.1.tgz#d04ceb79c8593dcd478df0c7293e4f31076250c6" + integrity sha512-VfInnERSq2o5nTvX6VRaFlWIx/tkz31ObRe1XRUU2tafK2W3CWgT85OXft9X0+CeSTyg3LTId9Gy8vtJ2yHm8w== dependencies: - "@abp/cms-kit.admin" "~7.4.0" - "@abp/cms-kit.public" "~7.4.0" + "@abp/cms-kit.admin" "~7.4.1" + "@abp/cms-kit.public" "~7.4.1" -"@abp/codemirror@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/codemirror/-/codemirror-7.4.0.tgz#a7b0805b6db3ed011bed044cc986bf6d48c7a969" - integrity sha512-4+c8jVKFK0O3XZTCh07AcUQCqQhKKEMdvS1KwYbMWD8ZMA9LGAL4Dj+uhkLDrYkwHvtmcQtbw7q37Xlb+uTKJA== +"@abp/codemirror@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/codemirror/-/codemirror-7.4.1.tgz#ed501eaa95ad81bc83336eaff244fc2f70e8b133" + integrity sha512-EyxMJb3puv9jA4xMfQjRe6ZfsupZgQRg7+gxNXWEM8HyTbvrCPgRgrxlbN0KM9jeSAO8GiKgrOPhGpAeZks7sw== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" codemirror "^5.65.1" -"@abp/core@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-7.4.0.tgz#8505d446a3b4d80ce476bd3352c1639c7dc486ec" - integrity sha512-yxrnw6eAEIj/CcX5jAwb4xmCsdqWaG+KRcBA8GFvqXbsK94IjqLDiJ3flo+QhGn2DXo40ISxofZop0CgSbP7Ew== +"@abp/core@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-7.4.1.tgz#1d14899ad16aac038806504eb0a5be9318cdcc0c" + integrity sha512-p0BAe2kCtgZmq8pilahmuxmye8DeRXt2KmnFRbmYE3j4d0uComFZpC72QOD1iro8bkmbsHfsHJpiVg4Sp4licw== dependencies: - "@abp/utils" "~7.4.0" + "@abp/utils" "~7.4.1" -"@abp/datatables.net-bs5@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-7.4.0.tgz#52d22e12a2420b402e03148793707d063db0088d" - integrity sha512-VvQv5w0cUpdDD9jX8aUEaLxFrc4A95JlmFnhCYIV1etL8HNOdZvmOThxorsImk31JfpyVYrY/Ze/rnWi2uhVvQ== +"@abp/datatables.net-bs5@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-7.4.1.tgz#821ee4c5db116f9810d65184855cea1fa7d47360" + integrity sha512-jpUzb65lCGYAxs/1qV3pRP8agHwIgZA9gDrudvR8S/3X3kNQWtmeKoFDZ93mhnl3aWPjWFKVrT2LeQeJw5XO5A== dependencies: - "@abp/datatables.net" "~7.4.0" + "@abp/datatables.net" "~7.4.1" datatables.net-bs5 "^1.11.4" -"@abp/datatables.net@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-7.4.0.tgz#9f12a1bb2abd05cd753b5d937d8a0350b2ff74ae" - integrity sha512-StOkMmIkcBUWzD9ToZ5J/hISRWdxbAWjwn7RuFXsoHXcY03mmD86g2oztjrWC5UFnRdpFnsfspTpbNqXFB9Vag== +"@abp/datatables.net@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-7.4.1.tgz#a4501e92e9995da0759b9ce55756fe92c4e8db59" + integrity sha512-BZOOZLH7XrGlX3aFK97cwV9+npsTzALSBo87OgwO2U6UpeFq7yAOvmC0+L9dmIUDISeORn5IFc/zTsSSIQnpHQ== dependencies: - "@abp/jquery" "~7.4.0" + "@abp/jquery" "~7.4.1" datatables.net "^1.11.4" -"@abp/font-awesome@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-7.4.0.tgz#50059083b88706a0f71f55118472b378e4c66163" - integrity sha512-hKoPyM41HHCK6dg+8pQvjYJWzKABBCXrYQAIneMPQZUZqa4JLObKCva9TR7pu6pUp+9OVzg4fQOBM+nwpHtw4g== +"@abp/font-awesome@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-7.4.1.tgz#f6175a989aa64367830723f1dd9c607906716296" + integrity sha512-/ybaz4KROwFdG4Xv0yMTUMXOreDmKy1lKQuntqHEUnIorhXmkgcd5AQQ5AolJ4NmNdPNt1VYrRcTEmdz3nw+FA== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" "@fortawesome/fontawesome-free" "^5.15.4" -"@abp/highlight.js@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/highlight.js/-/highlight.js-7.4.0.tgz#5e0e0a4ac26463450a8ac4453721fe7432f63fb5" - integrity sha512-AbFgsqRHcJUhjCPpYxJaM+cTNZCMCq7A8UAHfrVFH3bWqQAodYNqO4/qt9B2s0EDrG4QCD82ksX23cmdGk4O3g== +"@abp/highlight.js@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/highlight.js/-/highlight.js-7.4.1.tgz#33417a919b2bb1e5d0e001cade3441ef956a29a0" + integrity sha512-pCU6zORLDzOv4GS7+SMyXYR0yUaZXwkioBnLim5+FLGYoeXn4/Jus4wAGMTiMd0kq+oimMPzHlelUPqSzx92ZQ== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" "@highlightjs/cdn-assets" "~11.4.0" -"@abp/jquery-form@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-7.4.0.tgz#7ab3be241ee09f1e2843bd1b4d0b0b86d4446e30" - integrity sha512-OmTRuZ7QK1oe2ayNLqEpRJk4Ogk0wt/hIFtJHwQkCtDuCggoR5sQz4vn1vgrD19MxGq07dow5IgjbbhHv1vtEg== +"@abp/jquery-form@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-7.4.1.tgz#67978c41cda204b4c2027d81fc66844379313fa6" + integrity sha512-JZ1D47s/kpTlfMcpD4Jrlh98bhEDsIlWJauvAYaS0EBPIU9V2zHGQ+h9GPFbSPrXe4sYxPSREcsc8KUVMhT5MQ== dependencies: - "@abp/jquery" "~7.4.0" + "@abp/jquery" "~7.4.1" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-7.4.0.tgz#0c564e39c4997dd9b8af7d2023615a06d6fd9834" - integrity sha512-vFB3RKkDlDXbHlDJ64uo3jWW1IRXwiCaPf+mcB77Wpt5+0Dn7eWqjBT7KyHBrsV08ghIqY/Q4nXntFJrmLcuEA== +"@abp/jquery-validation-unobtrusive@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-7.4.1.tgz#fe5c90ade419e83505884dd50dd5988d766f177b" + integrity sha512-oHHV/ukap+vDvQ8CnEWnOrrsLkHXIcMk+SjNKe/dyK5VzOVLDpMatRFmloLs2igYVXTqDGjmDlTswTFdJUarcQ== dependencies: - "@abp/jquery-validation" "~7.4.0" + "@abp/jquery-validation" "~7.4.1" jquery-validation-unobtrusive "^3.2.12" -"@abp/jquery-validation@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-7.4.0.tgz#f2aaba8f4c023e93f0051cc9a05c6d82fa5c7254" - integrity sha512-vN4srLT5UXAKXpKHbZgySWT+N2DjRYivgtifpZHMTGFLMW14W+tfi5zhR4H4JvqJpuO6ZKNiz15zA1zwEBK0Tw== +"@abp/jquery-validation@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-7.4.1.tgz#c2c06bc28770832a9ad73eac000586faed3bdbe3" + integrity sha512-A5iFT2EWfGHXrBb/ov5f0grZ2o2xkDaYtps/FnDUwBYdIdD8E7bbJsWp6ytvZDciO0XmEqAoVOxmiij7ue/SOg== dependencies: - "@abp/jquery" "~7.4.0" + "@abp/jquery" "~7.4.1" jquery-validation "^1.19.3" -"@abp/jquery@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-7.4.0.tgz#206891b20f250537d05d907d2b6cd682fec76496" - integrity sha512-DeYo02T6WVhdpLloSPb6ooqtpksu1HtcbbQhIP9E1P7jHSzZoNiJvoKXHiFUcj5PYiGKl9d/o89hM/apWzyreQ== +"@abp/jquery@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-7.4.1.tgz#b5e16834e6c7871ad6392612ac8e2de8617eb353" + integrity sha512-X3RcovvRYISHcsb6W3U3iVsofw6yomoiouoB1tSIy2/tvUbu9n7N/3MM0CUujFm/xib7s3z1tVxFssS9smT7sw== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" jquery "~3.6.0" -"@abp/jstree@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/jstree/-/jstree-7.4.0.tgz#67fa92c9f043c422fe87bb97dcc64ae597901f91" - integrity sha512-vDC+ZdK9OCSthbmw9P8+ezNtRG1KM3+t1S/0t50La24Wo37QVJuA4IeIPbhYxvZ8Urh9ZYphUqsNXylcXDWuZQ== +"@abp/jstree@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/jstree/-/jstree-7.4.1.tgz#43dea84e32c07a29e4a7d770fedf03b2e6d0b07d" + integrity sha512-yf1r5vUF2bDl3MBW8ONY1COFYsLk0NMVS3XJzwVsaT99I+BfQ6Ll3EjWGYaieKNwWqzJfG2d8cJH/6Psn+MB0w== dependencies: - "@abp/jquery" "~7.4.0" + "@abp/jquery" "~7.4.1" jstree "^3.3.12" -"@abp/lodash@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-7.4.0.tgz#93f20abee776dbfa7aa45e2e710f2768f262fda5" - integrity sha512-h4Fnjm+VLwp1F3r57B9MrHhwyOYMo5oP285a85zzAYLkhwcDy7f1nbHKHMQ3ZTaeJVmiRnVaH+3sdUdslCRt5g== +"@abp/lodash@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-7.4.1.tgz#d0f84b7b9cbd989d59ebde594ed7acb8bc720b61" + integrity sha512-RFjZCyAPZnpvT0SJbxXzzmMYbuocSWBlezvjAVA8MiTrOXdZO4VyaTFjIuQcAdSrZhtpFGeYWxAjHshVplxMbw== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" lodash "^4.17.21" -"@abp/luxon@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-7.4.0.tgz#2ba7ff307c8f7c24d818a9c33635b86fd6810db9" - integrity sha512-ROCx7aihM+agdYy7Tkz+GiScx68KY5qwGTnj8P7QabGFChzVUic6RuBG+2Obmfonc6uT7Rq0c8JDGrsGNe/w8A== +"@abp/luxon@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-7.4.1.tgz#e0c0947d2b77f98b9cdaf7d1143025879361c3c9" + integrity sha512-k1wh8tT1529MtNC2gSXEIKdimBXBwubXeLisgpIPx6lkJo1Op6pAz2ERwFXeyktqGdYyuFcnewJIxmS7EPtWhg== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" luxon "^2.3.0" -"@abp/malihu-custom-scrollbar-plugin@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-7.4.0.tgz#aba68877481f4339e048f2ae3cfbe93197145a0a" - integrity sha512-Ntodhi4k0HFQmImYTP5SYf/WDm7aUGJLaGsfePm77HJ6DhGgalIGqtM8NiFXzo/3GmMY0XSo8Wxrs1mSCdtsOA== +"@abp/malihu-custom-scrollbar-plugin@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-7.4.1.tgz#aa7ec247197a258277549052780b38fd9e748c6c" + integrity sha512-pm/wIaiRSgGxelOf8AiL4JKFNZOQ6s2WbR6pULiP2HSNCgCpWYJ2s8fvj7VP3lAHIa98v3m8PSMSUhqaANxZ/Q== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/moment@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-7.4.0.tgz#2490d9c7cdcaeca8d0ba9ebef5e7298caf0c9e09" - integrity sha512-ftsUEgO17GbVawA1GplGFzEeIM4NX004AmS6/fPI3o5isX7o1buF9q9TXdnwUuFEJKZxS4KpveRqzTL5t9k0BQ== +"@abp/moment@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-7.4.1.tgz#1c28ccb13eecdd13695edf8641ca9867b318e37d" + integrity sha512-7vRJyAK5ER9z+LV1xUSAAtWlPlhv8yhM/nHjhC+IQSP/+V1D7VLA6EKxAEexGw7wX6HY8oMOWP9HxDHMb5hKQA== dependencies: moment "^2.9.0" -"@abp/prismjs@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-7.4.0.tgz#8572f36f853c7054d77d02f3098cd844ee321ed7" - integrity sha512-y/Iy6pddQeVazEITktPot8JOPdAEOVAfmYkTBP3DIIPvoYr3kf6rwfzBUalMw5CEjWZ9BaIszDgFCk5ucNHHwQ== +"@abp/prismjs@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-7.4.1.tgz#df4387dbc2f0c77ddb9b6bd0ade9a5db29b9cee2" + integrity sha512-bI7pEKWy32aRYSb2ZziiH6Teebyd8km+1TXADy1yks9i9G5eLWe4/CSdwWpI4M+8ggM8CsdhrZ6/U+55BpXPQA== dependencies: - "@abp/clipboard" "~7.4.0" - "@abp/core" "~7.4.0" + "@abp/clipboard" "~7.4.1" + "@abp/core" "~7.4.1" prismjs "^1.26.0" -"@abp/select2@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-7.4.0.tgz#2f455cc991b7bb4df9ed426097bc2996cac12697" - integrity sha512-DwprX4MIoqMzSdh7eFg7EjGIz4ftYZub6jG9Sk3r+sxabbhpbFTxKOpXnhBWYi7L7uTQ8YDFk/5NeXO+Rm50Ww== +"@abp/select2@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-7.4.1.tgz#d7ea53cfec285a06278db362131b7510d5b73900" + integrity sha512-0S66iy7HuB74qqOSDraoF7UvXqz2PrnOKy+3EYMTMskOn4pWaq03JMR8xxEgZ8CtmsrqlE1a4wt1Yt9b3FIc0w== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" select2 "^4.0.13" -"@abp/slugify@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/slugify/-/slugify-7.4.0.tgz#7a174b6b526bbfa4f4916ad9350ea373ab2aa95c" - integrity sha512-F1XEkEJbgVv044CdYJi0msiqtu0Om+SwQuuTC3pt3x52eLFeJHhoKnoc1+kNijsh291boP3fJc53Jkkfx7nLhA== +"@abp/slugify@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/slugify/-/slugify-7.4.1.tgz#6d3d64cb84cd9d9d2e2a9846aa5ea057df631630" + integrity sha512-aXB+N7TfqdJlTWYO79UmowCohB4k02QK0BWB0XUHyoBjqMDs2+776+ETNxGdvmPg+Xql48+YT9GS8dSwA+VBkg== dependencies: slugify "^1.6.5" -"@abp/star-rating-svg@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/star-rating-svg/-/star-rating-svg-7.4.0.tgz#6c43454f60b259b4dd243ccc260d01b3cfe881a7" - integrity sha512-UJ/DgF1rK0hj4gjaGV+F9wOd2htkWNyb83RBbob23sTByLuFcibF/TJTLBErYbvZ05+KOU3+7pTq46EBw5mdtg== +"@abp/star-rating-svg@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/star-rating-svg/-/star-rating-svg-7.4.1.tgz#ac8fe734e5395fd2fb0079ca4ad1170a5e345a3c" + integrity sha512-avIu/3wTIHCkJiWBBA1Mfr70PuSu9ebnrp9igWdm3PdR6vlM8OI9Nfk+3YKuAAiHyDkL9WniQL0f50tY1ToI0Q== dependencies: - "@abp/jquery" "~7.4.0" + "@abp/jquery" "~7.4.1" star-rating-svg "^3.5.0" -"@abp/sweetalert2@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-7.4.0.tgz#db1b4bd45cbabd61172591abc8ce223b5f607c4e" - integrity sha512-XqHPRnTASaRtbJIZYKW1KSKIJ8tynL8DuPCSMjcp4iyUlk+gnzxvbqXeNVjc2ojxj78T/42M/vITNoiiTYuKUw== +"@abp/sweetalert2@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-7.4.1.tgz#6722a40e5115cc341b7543aa0fa3b5a7ae9515b2" + integrity sha512-9jAHrYqCp5qykYfNNbqgESL6egixofVwonjZlb+lLWHAkIX+gQ2ApUNDFSXPtKUh2n9sXhSfF8SSg+BHP/bkCA== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" sweetalert2 "^11.3.6" -"@abp/timeago@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-7.4.0.tgz#245fe09370f38311a67a594c8a3c884aea59cc90" - integrity sha512-khxK6EICUaGCUM1HkACw/8rlPQNssoQvCK64bNqEHBCXgPUmTcqSj5MEGiNOYbgGyWeH2IAMtJEYPqX1g1wqSA== +"@abp/timeago@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-7.4.1.tgz#243d342ba131878ae7f892909c9cae07cf54902b" + integrity sha512-a0Vl2NFwTxzRmH5akWo8BRUxa6sK72z8OoXwUFkZOUqMWBCHK7ffNiN1/fbSgA+7HpSZdDvIthjYwBt57DxLdQ== dependencies: - "@abp/jquery" "~7.4.0" + "@abp/jquery" "~7.4.1" timeago "^1.6.7" -"@abp/toastr@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-7.4.0.tgz#16ba0414a27c9a21bc7556a078b175445edcf608" - integrity sha512-oM4HT2m95cK/9sB4AEQAKUMSGBep6wZTgM/46+o2IvvMdMPrGR2mPu9V9wi3y817FRgY+/qQTfy5TZWyTuIpVQ== +"@abp/toastr@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-7.4.1.tgz#345545a41b6145e54477c6c376193a6dbd62bdda" + integrity sha512-OLCvPJYSrcT2spcq9nO838Q22VhJ63Kdzasz1HugdVNqgcFCCSsqaoXrJGUcf5GrZx7PNloz7uf1I3txYMeZtA== dependencies: - "@abp/jquery" "~7.4.0" + "@abp/jquery" "~7.4.1" toastr "^2.1.4" -"@abp/tui-editor@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/tui-editor/-/tui-editor-7.4.0.tgz#831efd947b5a255d73365248e443d43f834c5a75" - integrity sha512-G/aCeG0lrFjEdE/YRbpFWuhuaGDFDqO5+/otIQSOxcR/bkjE1kLrdH5KDYGIa9QUaq7GbKn7yFnjrv9s5ajxzQ== +"@abp/tui-editor@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/tui-editor/-/tui-editor-7.4.1.tgz#4adaffcc3d62c7f2159d6acbca71e14780270277" + integrity sha512-0wiLq03+EB6or9uBbz1ZEWnOAoUjJqqFDONVEv2LtuqWlaiDwzILrSMxihTyFsLGrSAUdezfk2L83DoJT6SsVg== dependencies: - "@abp/jquery" "~7.4.0" - "@abp/prismjs" "~7.4.0" + "@abp/jquery" "~7.4.1" + "@abp/prismjs" "~7.4.1" -"@abp/uppy@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/uppy/-/uppy-7.4.0.tgz#015fc9966c2f6fa6ee77ecdf73a3e1a80cb625d3" - integrity sha512-/Hj5kCv+gRkylCvBlb3OHfI2cfLuI5+1o2C4L4HhoYmggrCuFf7L6vZGNaDa7LYOtENliLx3wAqpByv6Vd/onA== +"@abp/uppy@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/uppy/-/uppy-7.4.1.tgz#84f906e48711f28552f430239a5735184e589275" + integrity sha512-oCOxAzdYpc1QkwL2h+jBxL9xGF0aAYxcrmvzzYqHCyXC8NG/xEtLFCJvek6cCnSGS5W+v62ZuuyzM03N9ucGNg== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" uppy "^1.16.1" -"@abp/utils@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-7.4.0.tgz#b31fb6e5dff07463535479a6bb62dc733d7119c8" - integrity sha512-CcR3tfuEsVM60DYL1A0cH6BkUTsasOoBDv/b63uLCoEOq/g8ntelD/SpRSgfDXK74P9M8OE5ZFxlXWDiYuzAFg== +"@abp/utils@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-7.4.1.tgz#2ce4c4d659c2ae9bc23b71b79fa3c6e120eaecaf" + integrity sha512-eFeoOXcz9cVkDKpOfd2VWmpAojASfsqfvACZqi1UmF16OcjsFIkxmIvhh1fpbT4A+eQLbaFFLIsf6gYb//tXhg== dependencies: just-compare "^2.3.0" 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 73b1e7dfd4..cbb5992ebd 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 @@ -2873,8 +2873,8 @@ "nameOnMethod": "input", "name": "Status", "jsonName": null, - "type": "Volo.CmsKit.Blogs.BlogPostStatus?", - "typeSimple": "Volo.CmsKit.Blogs.BlogPostStatus?", + "type": "System.String", + "typeSimple": "string", "isOptional": false, "defaultValue": null, "constraintTypes": null, diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Blogs/CreateModal.cshtml b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Blogs/CreateModal.cshtml index 5aba4f2431..b348a63115 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Blogs/CreateModal.cshtml +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Blogs/CreateModal.cshtml @@ -9,6 +9,7 @@ @using Volo.Abp.Data @using Volo.Abp.Localization @using Volo.Abp.ObjectExtending +@using Volo.CmsKit.Web @inject IStringLocalizerFactory StringLocalizerFactory @inherits CmsKitAdminPageBase @@ -25,7 +26,7 @@ - + @foreach (var propertyInfo in ObjectExtensionManager.Instance.GetProperties()) { diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Blogs/UpdateModal.cshtml b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Blogs/UpdateModal.cshtml index 65eccddef5..e3385e929b 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Blogs/UpdateModal.cshtml +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Blogs/UpdateModal.cshtml @@ -8,6 +8,7 @@ @using Volo.Abp.Data @using Volo.Abp.Localization @using Volo.Abp.ObjectExtending +@using Volo.CmsKit.Web @inject IStringLocalizerFactory StringLocalizerFactory @inherits CmsKitAdminPageBase @@ -26,7 +27,7 @@ - + @foreach (var propertyInfo in ObjectExtensionManager.Instance.GetProperties()) { diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/Create.cshtml b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/Create.cshtml index e674c08600..afef4bdad5 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/Create.cshtml +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/Create.cshtml @@ -59,7 +59,7 @@ - + diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/Update.cshtml b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/Update.cshtml index f1bd33d212..08fc064226 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/Update.cshtml +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/Update.cshtml @@ -64,7 +64,7 @@ - + diff --git a/modules/cms-kit/src/Volo.CmsKit.Common.HttpApi.Client/ClientProxies/Volo/CmsKit/Blogs/BlogFeatureClientProxy.Generated.cs b/modules/cms-kit/src/Volo.CmsKit.Common.HttpApi.Client/ClientProxies/Volo/CmsKit/Blogs/BlogFeatureClientProxy.Generated.cs new file mode 100644 index 0000000000..77485c92db --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Common.HttpApi.Client/ClientProxies/Volo/CmsKit/Blogs/BlogFeatureClientProxy.Generated.cs @@ -0,0 +1,28 @@ +// This file is automatically generated by ABP framework to use MVC Controllers from CSharp +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Volo.Abp; +using Volo.Abp.Application.Dtos; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Http.Client; +using Volo.Abp.Http.Client.ClientProxying; +using Volo.Abp.Http.Modeling; +using Volo.CmsKit.Blogs; + +// ReSharper disable once CheckNamespace +namespace Volo.CmsKit.Blogs; + +[Dependency(ReplaceServices = true)] +[ExposeServices(typeof(IBlogFeatureAppService), typeof(BlogFeatureClientProxy))] +public partial class BlogFeatureClientProxy : ClientProxyBase, IBlogFeatureAppService +{ + public virtual async Task GetOrDefaultAsync(Guid blogId, string featureName) + { + return await RequestAsync(nameof(GetOrDefaultAsync), new ClientProxyRequestTypeValue + { + { typeof(Guid), blogId }, + { typeof(string), featureName } + }); + } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Common.HttpApi.Client/ClientProxies/Volo/CmsKit/Blogs/BlogFeatureClientProxy.cs b/modules/cms-kit/src/Volo.CmsKit.Common.HttpApi.Client/ClientProxies/Volo/CmsKit/Blogs/BlogFeatureClientProxy.cs new file mode 100644 index 0000000000..e9752dfcc9 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Common.HttpApi.Client/ClientProxies/Volo/CmsKit/Blogs/BlogFeatureClientProxy.cs @@ -0,0 +1,7 @@ +// This file is part of BlogFeatureClientProxy, you can customize it here +// ReSharper disable once CheckNamespace +namespace Volo.CmsKit.Blogs; + +public partial class BlogFeatureClientProxy +{ +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Common.HttpApi.Client/ClientProxies/Volo/CmsKit/MediaDescriptors/MediaDescriptorClientProxy.Generated.cs b/modules/cms-kit/src/Volo.CmsKit.Common.HttpApi.Client/ClientProxies/Volo/CmsKit/MediaDescriptors/MediaDescriptorClientProxy.Generated.cs new file mode 100644 index 0000000000..67eaa76785 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Common.HttpApi.Client/ClientProxies/Volo/CmsKit/MediaDescriptors/MediaDescriptorClientProxy.Generated.cs @@ -0,0 +1,28 @@ +// This file is automatically generated by ABP framework to use MVC Controllers from CSharp +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Volo.Abp; +using Volo.Abp.Application.Dtos; +using Volo.Abp.Content; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Http.Client; +using Volo.Abp.Http.Client.ClientProxying; +using Volo.Abp.Http.Modeling; +using Volo.CmsKit.MediaDescriptors; + +// ReSharper disable once CheckNamespace +namespace Volo.CmsKit.MediaDescriptors; + +[Dependency(ReplaceServices = true)] +[ExposeServices(typeof(IMediaDescriptorAppService), typeof(MediaDescriptorClientProxy))] +public partial class MediaDescriptorClientProxy : ClientProxyBase, IMediaDescriptorAppService +{ + public virtual async Task DownloadAsync(Guid id) + { + return await RequestAsync(nameof(DownloadAsync), new ClientProxyRequestTypeValue + { + { typeof(Guid), id } + }); + } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Common.HttpApi.Client/ClientProxies/Volo/CmsKit/MediaDescriptors/MediaDescriptorClientProxy.cs b/modules/cms-kit/src/Volo.CmsKit.Common.HttpApi.Client/ClientProxies/Volo/CmsKit/MediaDescriptors/MediaDescriptorClientProxy.cs new file mode 100644 index 0000000000..028ccff1a2 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Common.HttpApi.Client/ClientProxies/Volo/CmsKit/MediaDescriptors/MediaDescriptorClientProxy.cs @@ -0,0 +1,7 @@ +// This file is part of MediaDescriptorClientProxy, you can customize it here +// ReSharper disable once CheckNamespace +namespace Volo.CmsKit.MediaDescriptors; + +public partial class MediaDescriptorClientProxy +{ +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Common.HttpApi.Client/ClientProxies/cms-kit-common-generate-proxy.json b/modules/cms-kit/src/Volo.CmsKit.Common.HttpApi.Client/ClientProxies/cms-kit-common-generate-proxy.json index 6b7b45220a..07e4bf762c 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Common.HttpApi.Client/ClientProxies/cms-kit-common-generate-proxy.json +++ b/modules/cms-kit/src/Volo.CmsKit.Common.HttpApi.Client/ClientProxies/cms-kit-common-generate-proxy.json @@ -8,11 +8,32 @@ "controllerName": "MediaDescriptor", "controllerGroupName": "MediaDescriptor", "isRemoteService": true, + "isIntegrationService": false, "apiVersion": null, "type": "Volo.CmsKit.MediaDescriptors.MediaDescriptorController", "interfaces": [ { - "type": "Volo.CmsKit.MediaDescriptors.IMediaDescriptorAppService" + "type": "Volo.CmsKit.MediaDescriptors.IMediaDescriptorAppService", + "name": "IMediaDescriptorAppService", + "methods": [ + { + "name": "DownloadAsync", + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.Content.RemoteStreamContent", + "typeSimple": "Volo.Abp.Content.RemoteStreamContent" + } + } + ] } ], "actions": { @@ -59,11 +80,40 @@ "controllerName": "BlogFeature", "controllerGroupName": "BlogFeature", "isRemoteService": true, + "isIntegrationService": false, "apiVersion": null, "type": "Volo.CmsKit.Blogs.BlogFeatureController", "interfaces": [ { - "type": "Volo.CmsKit.Blogs.IBlogFeatureAppService" + "type": "Volo.CmsKit.Blogs.IBlogFeatureAppService", + "name": "IBlogFeatureAppService", + "methods": [ + { + "name": "GetOrDefaultAsync", + "parametersOnMethod": [ + { + "name": "blogId", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "featureName", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.CmsKit.Blogs.BlogFeatureDto", + "typeSimple": "Volo.CmsKit.Blogs.BlogFeatureDto" + } + } + ] } ], "actions": { diff --git a/modules/cms-kit/src/Volo.CmsKit.Common.Web/CmsBlogsWebConsts.cs b/modules/cms-kit/src/Volo.CmsKit.Common.Web/CmsBlogsWebConsts.cs new file mode 100644 index 0000000000..7793856414 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Common.Web/CmsBlogsWebConsts.cs @@ -0,0 +1,6 @@ +namespace Volo.CmsKit.Web; + +public static class CmsBlogsWebConsts +{ + public static string BlogsRoutePrefix { get; set; } = "blogs"; +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Comments/CommentConsts.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Comments/CommentConsts.cs index aa253c9593..59afde6a45 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Comments/CommentConsts.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Comments/CommentConsts.cs @@ -12,4 +12,6 @@ public static class CommentConsts public static int MaxTextLength { get; set; } = 512; public static int MaxUrlLength { get; set; } = 512; + + public static int MaxIdempotencyTokenLength { get; set; } = 32; } 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 b26a1fe2a8..9ef0948c80 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 @@ -77,6 +77,7 @@ "PageId": "صفحة", "Pages": "الصفحات", "PageSlugInformation": "سبيكة تستخدم على url. سيكون عنوان url الخاص بك هو \"/{slug}}\".", + "BlogSlugInformation": "سبيكة تستخدم على url. سيكون عنوان url الخاص بك هو \"/{0}/{slug}}\".", "Permission:BlogManagement": "إدارة المدونة", "Permission:BlogManagement.Create": "إنشاء", "Permission:BlogManagement.Delete": "حذف", 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 8344a53ee2..383ba53bfc 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 @@ -77,6 +77,7 @@ "PageId": "Strana", "Pages": "stránky", "PageSlugInformation": "Na adrese URL je použit Slug. Vaše adresa URL bude '/{{slug}}'.", + "BlogSlugInformation": "Na adrese URL je použit Slug. Vaše adresa URL bude '/{0}/{{slug}}'.", "Permission:BlogManagement": "Správa blogu", "Permission:BlogManagement.Create": "Vytvořit", "Permission:BlogManagement.Delete": "Vymazat", 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 3a4b0a5569..8a34408bab 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 @@ -77,6 +77,7 @@ "PageId": "Buchseite", "Pages": "Seiten", "PageSlugInformation": "Slug wird auf URL verwendet. Ihre URL lautet '/{{slug}}'.", + "BlogSlugInformation": "Slug wird auf URL verwendet. Ihre URL lautet '/{0}/{{slug}}'.", "Permission:BlogManagement": "Blog-Verwaltung", "Permission:BlogManagement.Create": "Schaffen", "Permission:BlogManagement.Delete": "Löschen", 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 c686723d33..7155c127a3 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 @@ -77,6 +77,7 @@ "PageId": "Σελίδα", "Pages": "Σελίδες", "PageSlugInformation": "Το Slug χρησιμοποιείται στο url. Το url σας θα είναι '/{{slug}}'.", + "BlogSlugInformation": "Το Slug χρησιμοποιείται στο url. Το url σας θα είναι '/{0}/{{slug}}'.", "Permission:BlogManagement": "Διαχείριση ιστολογίου", "Permission:BlogManagement.Create": "Δημιουργώ", "Permission:BlogManagement.Delete": "Διαγράφω", 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 40639fc46a..0169f42b7e 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 @@ -76,6 +76,7 @@ "PageId": "Page", "Pages": "Pages", "PageSlugInformation": "Slug is used on url. Your url will be '/{{slug}}'.", + "BlogSlugInformation": "Slug is used on url. Your url will be '/{0}/{{slug}}'.", "Permission:BlogManagement": "Blog Management", "Permission:BlogManagement.Create": "Create", "Permission:BlogManagement.Delete": "Delete", @@ -225,6 +226,7 @@ "RemoveCoverImage": "Remove cover image", "CssClass": "CSS Class", "TagsHelpText": "Tags should be comma-separated (e.g.: tag1, tag2, tag3)", - "ThisPartOfContentCouldntBeLoaded": "This part of content couldn't be loaded." + "ThisPartOfContentCouldntBeLoaded": "This part of content couldn't be loaded.", + "DuplicateCommentAttemptMessage": "Duplicate comment post attempt detected. Your comment has already been submitted." } } \ 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 ea9b318b93..fb8e963115 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 @@ -77,6 +77,7 @@ "PageId": "Página", "Pages": "Paginas", "PageSlugInformation": "Slug se usa en la URL. Su URL será '/{{slug}}'.", + "BlogSlugInformation": "Slug se usa en la URL. Su URL será '/{0}/{{slug}}'.", "Permission:BlogManagement": "Gestión de blogs", "Permission:BlogManagement.Create": "Crear", "Permission:BlogManagement.Delete": "Borrar", 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 1ead360d61..54a0ea97a4 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 @@ -76,6 +76,7 @@ "PageId": "Sivu", "Pages": "Sivut", "PageSlugInformation": "Etanaa käytetään URL-osoitteessa. URL-osoitteesi on '/{{slug}}'.", + "BlogSlugInformation": "Etanaa käytetään URL-osoitteessa. URL-osoitteesi on '/{0}/{{slug}}'.", "Permission:BlogManagement": "Blogin hallinta", "Permission:BlogManagement.Create": "Luonti", "Permission:BlogManagement.Delete": "Poisto", 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 445c7b3578..bbd4f67955 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 @@ -77,6 +77,7 @@ "PageId": "Page", "Pages": "Pages", "PageSlugInformation": "Slug est utilisé sur l'url. Votre URL sera '/{{slug}}'.", + "BlogSlugInformation": "Slug est utilisé sur l'url. Votre URL sera '/{0}/{{slug}}'.", "Permission:BlogManagement": "Gestion de blog", "Permission:BlogManagement.Create": "Créer", "Permission:BlogManagement.Delete": "Effacer", 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 fffe151260..b251ac8c18 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 @@ -77,6 +77,7 @@ "PageId": "पृष्ठ", "Pages": "पृष्ठों", "PageSlugInformation": "स्लग का उपयोग url पर किया जाता है। आपका url '/{{slug}}' होगा।", + "BlogSlugInformation": "स्लग का उपयोग url पर किया जाता है। आपका url '/{0}/{{slug}}' होगा।", "Permission:BlogManagement": "ब्लॉग प्रबंधन", "Permission:BlogManagement.Create": "सृजन करना", "Permission:BlogManagement.Delete": "हटाएं", 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 4c1047e178..43afc9575c 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 @@ -76,6 +76,7 @@ "PageId": "oldal", "Pages": "Oldalak", "PageSlugInformation": "A Slug az url-en használatos. Az Ön URL-je a következő lesz: '/{{slug}}'.", + "BlogSlugInformation": "A Slug az url-en használatos. Az Ön URL-je a következő lesz: '/{0}/{{slug}}'.", "Permission:BlogManagement": "Blogkezelés", "Permission:BlogManagement.Create": "Teremt", "Permission:BlogManagement.Delete": "Töröl", 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 43c98adcc2..8b7bebc1ea 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 @@ -76,7 +76,8 @@ "PageDeletionConfirmationMessage": "Ertu viss um að eyða þessari síðu?", "PageId": "Síða", "Pages": "Síður", - "PageSlugInformation": "Snigill er notaður á slóð. Slóðin þín verður '/síður/{{slug}}'.", + "PageSlugInformation": "Snigill er notaður á slóð. Slóðin þín verður '/{{slug}}'.", + "BlogSlugInformation": "Snigill er notaður á slóð. Slóðin þín verður '/{0}/{{slug}}'.", "Permission:BlogManagement": "Bloggstjórnun", "Permission:BlogManagement.Create": "Búa til", "Permission:BlogManagement.Delete": "Eyða", 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 bddf4affc2..3575754a8c 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 @@ -77,6 +77,7 @@ "PageId": "Pagina", "Pages": "Pagine", "PageSlugInformation": "Lo slug viene utilizzato sull'URL. Il tuo URL sarà '/{{slug}}'.", + "BlogSlugInformation": "Lo slug viene utilizzato sull'URL. Il tuo URL sarà '/{0}/{{slug}}'.", "Permission:BlogManagement": "Gestione del blog", "Permission:BlogManagement.Create": "Crea", "Permission:BlogManagement.Delete": "Elimina", 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 d06ba78bf4..ef370edf26 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 @@ -77,6 +77,7 @@ "PageId": "Bladzijde", "Pages": "Pagina's", "PageSlugInformation": "Slug wordt gebruikt voor de url. Uw url wordt '/{{slug}}'.", + "BlogSlugInformation": "Slug wordt gebruikt voor de url. Uw url wordt '/{0}/{{slug}}'.", "Permission:BlogManagement": "Blogbeheer", "Permission:BlogManagement.Create": "Toevoegen", "Permission:BlogManagement.Delete": "Verwijderen", 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 a775020f7a..0bdef5d26b 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 @@ -77,6 +77,7 @@ "PageId": "Strona", "Pages": "Strony", "PageSlugInformation": "Slug jest używany na adresie URL. Twój adres URL to „/{{slug}}”.", + "BlogSlugInformation": "Slug jest używany na adresie URL. Twój adres URL to „/{0}/{{slug}}”.", "Permission:BlogManagement": "Zarządzanie blogiem", "Permission:BlogManagement.Create": "Tworzyć", "Permission:BlogManagement.Delete": "Kasować", 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 c306e6f58c..9510e2a67d 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 @@ -77,6 +77,7 @@ "PageId": "Página", "Pages": "Páginas", "PageSlugInformation": "Slug é usado na url. Sua url será '/{{slug}}'.", + "BlogSlugInformation": "Slug é usado na url. Sua url será '/{0}/{{slug}}'.", "Permission:BlogManagement": "Gerenciamento de blogs", "Permission:BlogManagement.Create": "Criar", "Permission:BlogManagement.Delete": "Excluir", 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 7712530ee7..21b9ac5a24 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 @@ -77,6 +77,7 @@ "PageId": "Pagina", "Pages": "Pagini", "PageSlugInformation": "Slug este folosit pe url. Url-ul dumneavoastră va fi '/{{slug}}'.", + "BlogSlugInformation": "Slug este folosit pe url. Url-ul dumneavoastră va fi '/{0}/{{slug}}'.", "Permission:BlogManagement": "Administrare Blog", "Permission:BlogManagement.Create": "Creează", "Permission:BlogManagement.Delete": "Şterge", 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 e30641ce50..a1a809f9fa 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 @@ -77,6 +77,7 @@ "PageId": "Страница", "Pages": "Страницы", "PageSlugInformation": "Слаг используется для URL. Ваш URL-адрес будет '/{{slug}}'.", + "BlogSlugInformation": "Слаг используется для URL. Ваш URL-адрес будет '/{0}/{{slug}}'.", "Permission:BlogManagement": "Управление блогом", "Permission:BlogManagement.Create": "Создавать", "Permission:BlogManagement.Delete": "Удалить", 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 7fc0e7c254..af320c8a19 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 @@ -77,6 +77,7 @@ "PageId": "Stránka", "Pages": "Stránky", "PageSlugInformation": "Slug sa používa v URL. Vaša URL bude '/{{slug}}'.", + "BlogSlugInformation": "Slug sa používa v URL. Vaša URL bude '/{0}/{{slug}}'.", "Permission:BlogManagement": "Správa blogov", "Permission:BlogManagement.Create": "Vytvoriť", "Permission:BlogManagement.Delete": "Zmazať", 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 0e0d12e2e6..972b7da430 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 @@ -77,6 +77,7 @@ "PageId": "stran", "Pages": "strani", "PageSlugInformation": "Slug se uporablja na url-ju. Vaš url bo '/{{slug}}'.", + "BlogSlugInformation": "Slug se uporablja na url-ju. Vaš url bo '/{0}/{{slug}}'.", "Permission:BlogManagement": "Upravljanje blogov", "Permission:BlogManagement.Create": "Ustvari", "Permission:BlogManagement.Delete": "Izbriši", 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 c84cdc6312..78c5f9341e 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 @@ -76,6 +76,7 @@ "PageId": "Sayfa", "Pages": "Sayfalar", "PageSlugInformation": "Etiket URL'de kullanılır. Url şöyle görünür: '/{{slug}}'.", + "BlogSlugInformation": "Etiket URL'de kullanılır. Url şöyle görünür: '/{0}/{{slug}}'.", "Permission:BlogManagement": "Blog Yönetimi", "Permission:BlogManagement.Create": "Oluşturma", "Permission:BlogManagement.Delete": "Silme", 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 3e0f36578d..09ae8f3a9c 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 @@ -77,6 +77,7 @@ "PageId": "Trang", "Pages": "Các trang", "PageSlugInformation": "Slug được sử dụng trên url. Url của bạn sẽ là '/{{slug}}'.", + "BlogSlugInformation": "Slug được sử dụng trên url. Url của bạn sẽ là '/{0}/{{slug}}'.", "Permission:BlogManagement": "Quản lý blog", "Permission:BlogManagement.Create": "Tạo ra", "Permission:BlogManagement.Delete": "Xóa bỏ", 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 7e9089d426..516c57eefd 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 @@ -76,6 +76,7 @@ "PageId": "页", "Pages": "页面", "PageSlugInformation": "Slug用于url. 你的url将是 '/{{slug}}'.", + "BlogSlugInformation": "Slug用于url. 你的url将是 '/{0}/{{slug}}'.", "Permission:BlogManagement": "博客管理", "Permission:BlogManagement.Create": "创建", "Permission:BlogManagement.Delete": "删除", 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 e6dd053052..5d3d2621fb 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 @@ -77,6 +77,7 @@ "PageId": "頁", "Pages": "頁面", "PageSlugInformation": "Slug用於網址. 你的網址將是 '/{{slug}}'.", + "BlogSlugInformation": "Slug用於網址. 你的網址將是 '/{0}/{{slug}}'.", "Permission:BlogManagement": "部落格管理", "Permission:BlogManagement.Create": "創建", "Permission:BlogManagement.Delete": "刪除", diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Comments/Comment.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Comments/Comment.cs index 7a620b8655..7a09b18b63 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Comments/Comment.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Comments/Comment.cs @@ -25,9 +25,11 @@ public class Comment : AggregateRoot, IHasCreationTime, IMustHaveCreator, public virtual string Url { get; set; } + public virtual string IdempotencyToken { get; set; } + protected Comment() { - + } internal Comment( diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Comments/ICommentRepository.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Comments/ICommentRepository.cs index 30541c2230..b054f11037 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Comments/ICommentRepository.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Comments/ICommentRepository.cs @@ -44,4 +44,6 @@ public interface ICommentRepository : IBasicRepository Comment comment, CancellationToken cancellationToken = default ); + + Task ExistsAsync(string idempotencyToken, CancellationToken cancellationToken = default); } diff --git a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Comments/EfCoreCommentRepository.cs b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Comments/EfCoreCommentRepository.cs index 3102bcc40b..2f626a5cd7 100644 --- a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Comments/EfCoreCommentRepository.cs +++ b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Comments/EfCoreCommentRepository.cs @@ -141,6 +141,11 @@ public class EfCoreCommentRepository : EfCoreRepository ExistsAsync(string idempotencyToken, CancellationToken cancellationToken = default) + { + return await (await GetDbSetAsync()).AnyAsync(x => x.IdempotencyToken == idempotencyToken, GetCancellationToken(cancellationToken)); + } + protected virtual async Task> GetListQueryAsync( string filter = null, string entityType = null, diff --git a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContextModelCreatingExtensions.cs b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContextModelCreatingExtensions.cs index a6a92cced4..b81eb4f31d 100644 --- a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContextModelCreatingExtensions.cs +++ b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContextModelCreatingExtensions.cs @@ -80,6 +80,7 @@ public static class CmsKitDbContextModelCreatingExtensions b.Property(x => x.Text).IsRequired().HasMaxLength(CommentConsts.MaxTextLength); b.Property(x => x.RepliedCommentId); b.Property(x => x.Url).HasMaxLength(CommentConsts.MaxUrlLength); + b.Property(x => x.IdempotencyToken).HasMaxLength(CommentConsts.MaxIdempotencyTokenLength); b.HasIndex(x => new { x.TenantId, x.EntityType, x.EntityId }); b.HasIndex(x => new { x.TenantId, x.RepliedCommentId }); diff --git a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Comments/MongoCommentRepository.cs b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Comments/MongoCommentRepository.cs index 089b86cc4f..698c533b4e 100644 --- a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Comments/MongoCommentRepository.cs +++ b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Comments/MongoCommentRepository.cs @@ -159,6 +159,12 @@ public class MongoCommentRepository : MongoDbRepository ExistsAsync(string idempotencyToken, CancellationToken cancellationToken = default) + { + return await (await GetMongoQueryableAsync(cancellationToken)) + .AnyAsync(x => x.IdempotencyToken == idempotencyToken, GetCancellationToken(cancellationToken)); + } + protected virtual async Task> GetListQueryAsync( string filter = null, string entityType = null, diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/IBlogPostPublicAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/IBlogPostPublicAppService.cs index dd21e2c903..c679420902 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/IBlogPostPublicAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/IBlogPostPublicAppService.cs @@ -17,5 +17,8 @@ public interface IBlogPostPublicAppService : IApplicationService Task> GetAuthorsHasBlogPostsAsync(BlogPostFilteredPagedAndSortedResultRequestDto input); Task GetAuthorHasBlogPostAsync(Guid id); + Task DeleteAsync(Guid id); + + Task GetTagNameAsync([NotNull] Guid tagId); } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Comments/CreateCommentInput.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Comments/CreateCommentInput.cs index 316ffe2737..d17e8c9deb 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Comments/CreateCommentInput.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Comments/CreateCommentInput.cs @@ -7,7 +7,7 @@ using Volo.CmsKit.Comments; namespace Volo.CmsKit.Public.Comments; [Serializable] -public class CreateCommentInput: ExtensibleObject +public class CreateCommentInput : ExtensibleObject { [Required] [DynamicStringLength(typeof(CommentConsts), nameof(CommentConsts.MaxTextLength))] @@ -20,4 +20,7 @@ public class CreateCommentInput: ExtensibleObject public int CaptchaAnswer { get; set; } public string Url { get; set; } + + [Required] + public string IdempotencyToken { get; set; } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Comments/CreateCommentWithParametersInput.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Comments/CreateCommentWithParametersInput.cs index 53f993cf2b..fda4856ffb 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Comments/CreateCommentWithParametersInput.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Comments/CreateCommentWithParametersInput.cs @@ -25,4 +25,7 @@ public class CreateCommentWithParametersInput public int CaptchaAnswer { get; set; } public string Url { get; set; } + + [Required] + public string IdempotencyToken { get; set; } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Blogs/BlogPostPublicAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Blogs/BlogPostPublicAppService.cs index cd346f9a21..4a9875990d 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Blogs/BlogPostPublicAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Blogs/BlogPostPublicAppService.cs @@ -12,6 +12,7 @@ using Volo.CmsKit.Blogs; using Volo.CmsKit.Contents; using Volo.CmsKit.Features; using Volo.CmsKit.GlobalFeatures; +using Volo.CmsKit.Tags; using Volo.CmsKit.Users; namespace Volo.CmsKit.Public.Blogs; @@ -24,12 +25,16 @@ public class BlogPostPublicAppService : CmsKitPublicAppServiceBase, IBlogPostPub protected IBlogPostRepository BlogPostRepository { get; } + protected ITagRepository TagRepository { get; } + public BlogPostPublicAppService( IBlogRepository blogRepository, - IBlogPostRepository blogPostRepository) + IBlogPostRepository blogPostRepository, + ITagRepository tagRepository) { BlogRepository = blogRepository; BlogPostRepository = blogPostRepository; + TagRepository = tagRepository; } public virtual async Task GetAsync( @@ -85,4 +90,11 @@ public class BlogPostPublicAppService : CmsKitPublicAppServiceBase, IBlogPostPub await BlogPostRepository.DeleteAsync(id); } + + public async Task GetTagNameAsync([NotNull] Guid tagId) + { + var tag = await TagRepository.GetAsync(tagId); + + return tag.Name; + } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Comments/CommentPublicAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Comments/CommentPublicAppService.cs index c1b5e736ec..cda077bde7 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Comments/CommentPublicAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Comments/CommentPublicAppService.cs @@ -63,14 +63,15 @@ public class CommentPublicAppService : CmsKitPublicAppServiceBase, ICommentPubli public virtual async Task CreateAsync(string entityType, string entityId, CreateCommentInput input) { CheckExternalUrls(entityType, input.Text); - - var user = await CmsUserLookupService.GetByIdAsync(CurrentUser.GetId()); if (input.RepliedCommentId.HasValue) { await CommentRepository.GetAsync(input.RepliedCommentId.Value); } + await CheckIdempotencyTokenUniquenessAsync(input.IdempotencyToken); + + var user = await CmsUserLookupService.GetByIdAsync(CurrentUser.GetId()); var comment = await CommentRepository.InsertAsync( await CommentManager.CreateAsync( user, @@ -192,4 +193,14 @@ public class CommentPublicAppService : CmsKitPublicAppServiceBase, ICommentPubli { return ObjectMapper.Map(comments.Single(c => c.Comment.Id == commentId).Author); } + + private async Task CheckIdempotencyTokenUniquenessAsync(string idempotencyToken) + { + if(!await CommentRepository.ExistsAsync(idempotencyToken)) + { + return; + } + + throw new UserFriendlyException(L["DuplicateCommentAttemptMessage"]); + } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/Blogs/BlogPostPublicClientProxy.Generated.cs b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/Blogs/BlogPostPublicClientProxy.Generated.cs index f269125676..d185f22a27 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/Blogs/BlogPostPublicClientProxy.Generated.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/Blogs/BlogPostPublicClientProxy.Generated.cs @@ -60,4 +60,12 @@ public partial class BlogPostPublicClientProxy : ClientProxyBase GetTagNameAsync(Guid tagId) + { + return await RequestAsync(nameof(GetTagNameAsync), new ClientProxyRequestTypeValue + { + { typeof(Guid), tagId } + }); + } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/cms-kit-generate-proxy.json b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/cms-kit-generate-proxy.json index 477938b6de..31e3fb52f8 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/cms-kit-generate-proxy.json +++ b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/cms-kit-generate-proxy.json @@ -1512,6 +1512,23 @@ "type": "System.Void", "typeSimple": "System.Void" } + }, + { + "name": "GetTagNameAsync", + "parametersOnMethod": [ + { + "name": "tagId", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.String", + "typeSimple": "string" + } } ] } @@ -1825,6 +1842,55 @@ }, "allowAnonymous": null, "implementFrom": "Volo.CmsKit.Public.Blogs.IBlogPostPublicAppService" + }, + "GetTagNameAsyncByTagId": { + "uniqueName": "GetTagNameAsyncByTagId", + "name": "GetTagNameAsync", + "httpMethod": "GET", + "url": "api/cms-kit-public/blog-posts/tags/{id}", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "tagId", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "tagId", + "name": "tagId", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "" + }, + { + "nameOnMethod": "id", + "name": "id", + "jsonName": null, + "type": null, + "typeSimple": null, + "isOptional": false, + "defaultValue": null, + "constraintTypes": [], + "bindingSourceId": "Path", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.String", + "typeSimple": "string" + }, + "allowAnonymous": null, + "implementFrom": "Volo.CmsKit.Public.Blogs.IBlogPostPublicAppService" } } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Blogs/BlogPostPublicController.cs b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Blogs/BlogPostPublicController.cs index 4d2a336fca..d5b5768d34 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Blogs/BlogPostPublicController.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Blogs/BlogPostPublicController.cs @@ -1,5 +1,6 @@ using System; using System.Threading.Tasks; +using JetBrains.Annotations; using Microsoft.AspNetCore.Mvc; using Volo.Abp; using Volo.Abp.Application.Dtos; @@ -60,4 +61,11 @@ public class BlogPostPublicController : CmsKitPublicControllerBase, IBlogPostPub { return BlogPostPublicAppService.DeleteAsync(id); } + + [HttpGet] + [Route("tags/{id}")] + public Task GetTagNameAsync([NotNull] Guid tagId) + { + return BlogPostPublicAppService.GetTagNameAsync(tagId); + } } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/CmsKitPublicWebModule.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Web/CmsKitPublicWebModule.cs index 93a61efe2f..c7078acd98 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/CmsKitPublicWebModule.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/CmsKitPublicWebModule.cs @@ -1,4 +1,5 @@ -using Microsoft.AspNetCore.Mvc.RazorPages; +using System; +using Microsoft.AspNetCore.Mvc.RazorPages; using Microsoft.AspNetCore.Routing; using Microsoft.Extensions.DependencyInjection; using Volo.Abp.AspNetCore.Mvc.Localization; @@ -91,8 +92,13 @@ public class CmsKitPublicWebModule : AbpModule { Configure(options => { - options.Conventions.AddPageRoute("/Public/CmsKit/Blogs/Index", @"/blogs/{blogSlug:minlength(1)}"); - options.Conventions.AddPageRoute("/Public/CmsKit/Blogs/BlogPost", @"/blogs/{blogSlug}/{blogPostSlug:minlength(1)}"); + options.Conventions.AddPageRoute( + "/Public/CmsKit/Blogs/Index", + CmsBlogsWebConsts.BlogsRoutePrefix.EnsureStartsWith('/') + @"/{blogSlug:minlength(1)}"); + + options.Conventions.AddPageRoute( + "/Public/CmsKit/Blogs/BlogPost", + CmsBlogsWebConsts.BlogsRoutePrefix.EnsureStartsWith('/') + @"/{blogSlug}/{blogPostSlug:minlength(1)}"); }); } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Commenting/CommentingViewComponent.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Commenting/CommentingViewComponent.cs index 5810103ea9..32503ceab7 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Commenting/CommentingViewComponent.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Commenting/CommentingViewComponent.cs @@ -60,6 +60,7 @@ public class CommentingViewComponent : AbpViewComponent public virtual async Task InvokeAsync( string entityType, string entityId, + bool isReadOnly, IEnumerable referralLinks = null) { referralLinks ??= Enumerable.Empty(); @@ -74,7 +75,8 @@ public class CommentingViewComponent : AbpViewComponent EntityType = entityType, ReferralLinks = referralLinks, LoginUrl = loginUrl, - Comments = comments.OrderByDescending(i => i.CreationTime).ToList() + IsReadOnly = isReadOnly, + Comments = comments.OrderByDescending(i => i.CreationTime).ToList(), }; await ConvertMarkdownTextsToHtml(viewModel); @@ -144,6 +146,8 @@ public class CommentingViewComponent : AbpViewComponent public string Captcha { get; set; } public string CaptchaImageBase64 { get; set; } + + public bool IsReadOnly { get; set; } } } 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 8829df73c5..1b86ade0a8 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 @@ -20,17 +20,18 @@ @ @((string.IsNullOrWhiteSpace(author.Name) - ? author.UserName - : author.Name + " " + author.Surname).Trim()) + ? author.UserName + : author.Name + " " + author.Surname).Trim()) @creationTime.ToString() ; } @{ Func GetCommentArea(Guid? repliedCommentId, bool cancelButton = false) => @
+ data-reply-id="@(repliedCommentId?.ToString() ?? "")" + style="@(string.IsNullOrEmpty(repliedCommentId?.ToString() ?? "") ? "" : "display:none")"> +
@@ -43,31 +44,31 @@
@if (CmsKitCommentOptions.Value.IsRecaptchaEnabled) - { -
- -
-
- -
-
- -
- + { +
+ +
+
+ +
+
+
+
- } +
+ }
@L["Send"] @if (cancelButton) - { - - @L["Cancel"] - - } + { + + @L["Cancel"] + + }
@@ -86,32 +87,32 @@ Func GetCommentActionArea(Guid id, Guid authorId, bool isReply) => @
@if (!isReply) - { - @if (CurrentUser.IsAuthenticated) - { - - @L["Reply"] - + { + @if (CurrentUser.IsAuthenticated) + { + + @L["Reply"] + + + + @L["Delete"] + + } + else + { + + @L["LoginToReply"] + + } + } + - - @L["Delete"] - - } - else - { - - @L["LoginToReply"] - - } - } - - @if (authorId == CurrentUser.Id) - { - - @L["Edit"] - - } + { + + @L["Edit"] + + }
; } @{ @@ -128,26 +129,26 @@
- @L["MarkdownSupported"] + @L["MarkdownSupported"]
@if (CmsKitCommentOptions.Value.IsRecaptchaEnabled) - { - var output = await Model.GenerateCaptchaAsync(); + { + var output = await Model.GenerateCaptchaAsync(); -
- -
-
- -
-
- -
- +
+ +
+
+ +
+
+
+
- } +
+ }
@L["Update"] @@ -183,22 +184,25 @@ @GetCommentContentArea(comment.Id, comment.Text).Invoke(null) -
-
-
- @GetCommentActionArea(comment.Id, comment.Author.Id, false).Invoke(null) + @if (!Model.Input.IsReadOnly) + { +
+
+
+ @GetCommentActionArea(comment.Id, comment.Author.Id, false).Invoke(null) +
-
-
-
- @if (cmsKitUiOptions.Value.CommentsOptions.IsReactionsEnabled && GlobalFeatureManager.Instance.IsEnabled()) - { - @await Component.InvokeAsync(typeof(ReactionSelectionViewComponent), new { entityType = "comment", entityId = comment.Id.ToString() }) - } +
+
+ @if (cmsKitUiOptions.Value.CommentsOptions.IsReactionsEnabled && GlobalFeatureManager.Instance.IsEnabled()) + { + @await Component.InvokeAsync(typeof(ReactionSelectionViewComponent), new { entityType = "comment", entityId = comment.Id.ToString() }) + } +
-
- @GetEditArea(comment.Id, Model.Input.RawCommentTexts[comment.Id], comment.ConcurrencyStamp).Invoke(null) + @GetEditArea(comment.Id, Model.Input.RawCommentTexts[comment.Id], comment.ConcurrencyStamp).Invoke(null) + } @if (comment.Replies.Any()) { @@ -212,23 +216,26 @@ @GetCommentContentArea(reply.Id, reply.Text).Invoke(null) -
-
-
- @GetCommentActionArea(reply.Id, reply.Author.Id, true).Invoke(null) + @if (!Model.Input.IsReadOnly) + { +
+
+
+ @GetCommentActionArea(reply.Id, reply.Author.Id, true).Invoke(null) +
-
-
-
- @if (cmsKitUiOptions.Value.CommentsOptions.IsReactionsEnabled && GlobalFeatureManager.Instance.IsEnabled()) - { - @await Component.InvokeAsync(typeof(ReactionSelectionViewComponent), new { entityType = "comment", entityId = reply.Id.ToString() }) - } +
+
+ @if (cmsKitUiOptions.Value.CommentsOptions.IsReactionsEnabled && GlobalFeatureManager.Instance.IsEnabled()) + { + @await Component.InvokeAsync(typeof(ReactionSelectionViewComponent), new { entityType = "comment", entityId = reply.Id.ToString() }) + } +
-
- @GetEditArea(reply.Id, Model.Input.RawCommentTexts[reply.Id], reply.ConcurrencyStamp).Invoke(null) + @GetEditArea(reply.Id, Model.Input.RawCommentTexts[reply.Id], reply.ConcurrencyStamp).Invoke(null) + }
} diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Commenting/default.js b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Commenting/default.js index 75f3288982..0d4616fe51 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Commenting/default.js +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Commenting/default.js @@ -107,10 +107,15 @@ function registerUpdateOfNewComment($container) { $container.find('.cms-comment-update-form').each(function () { - let $form = $(this); + var $form = $(this); + $form.submit(function (e) { e.preventDefault(); + + abp.ui.setBusy($form.find("button[type='submit']")); + let formAsObject = $form.serializeFormToObject(); + $.ajax({ type: 'POST', url: '/CmsKitPublicComments/Update/' + formAsObject.id, @@ -124,9 +129,11 @@ }), success: function () { widgetManager.refresh($widget); + abp.ui.clearBusy(); }, error: function (data) { abp.message.error(data.responseJSON.error.message); + abp.ui.clearBusy(); } }); }); @@ -135,10 +142,14 @@ function registerSubmissionOfNewComment($container) { $container.find('.cms-comment-form').each(function () { - let $form = $(this); + var $form = $(this); + $form.submit(function (e) { e.preventDefault(); - let formAsObject = $form.serializeFormToObject(); + + abp.ui.setBusy("button[type='submit']"); + + var formAsObject = $form.serializeFormToObject(); if (formAsObject.repliedCommentId == '') { formAsObject.repliedCommentId = null; @@ -146,6 +157,7 @@ if (formAsObject.commentText == '') { abp.message.error(l("CommentTextRequired")); + abp.ui.clearBusy(); return; } @@ -161,13 +173,16 @@ text: formAsObject.commentText, url: window.location.href, captchaToken: formAsObject.captchaId, - captchaAnswer: formAsObject.input?.captcha + captchaAnswer: formAsObject.input?.captcha, + idempotencyToken: formAsObject.idempotencyToken }), success: function () { widgetManager.refresh($widget); + abp.ui.clearBusy(); }, error: function (data) { abp.message.error(data.responseJSON.error.message); + abp.ui.clearBusy(); } }); }); diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/Default.cshtml b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/Default.cshtml index 9b7f6e24f7..95879128a7 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/Default.cshtml +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/Default.cshtml @@ -6,58 +6,59 @@ @inject IHtmlLocalizer L
-
-
- @if (CurrentUser.IsAuthenticated) +
+
+ + @if (CurrentUser.IsAuthenticated) + { + @if (!Model.IsReadOnly && Model.CurrentRating != null) { - @if (Model.CurrentRating != null) - { - - @L["Undo"] - - } - if (Model.Ratings != null) - { - - - + + @L["Undo"] + + } + if (Model.Ratings != null) + { + + + - "> + + }
-
\ No newline at end of file +
+
\ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/RatingViewComponent.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/RatingViewComponent.cs index b928f7e2af..7ab1df47b8 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/RatingViewComponent.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/RatingViewComponent.cs @@ -31,7 +31,7 @@ public class RatingViewComponent : AbpViewComponent CurrentUser = currentUser; } - public virtual async Task InvokeAsync(string entityType, string entityId) + public virtual async Task InvokeAsync(string entityType, string entityId, bool isReadOnly = false) { var ratings = await RatingPublicAppService.GetGroupedStarCountsAsync(entityType, entityId); var totalRating = ratings.Sum(x => x.Count); @@ -52,7 +52,8 @@ public class RatingViewComponent : AbpViewComponent LoginUrl = loginUrl, Ratings = ratings, CurrentRating = currentUserRating, - TotalRating = totalRating + TotalRating = totalRating, + IsReadOnly = isReadOnly }; return View("~/Pages/CmsKit/Shared/Components/Rating/Default.cshtml", viewModel); @@ -72,4 +73,6 @@ public class RatingViewModel public short? CurrentRating { get; set; } public int TotalRating { get; set; } + + public bool IsReadOnly { get; set; } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/default.js b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/default.js index 22531b47f3..69bb1bac4f 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/default.js +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/default.js @@ -15,6 +15,7 @@ function registerCreateOfNewRating() { $widget.find(".my-rating").each(function () { var authenticated = $(this).attr("data-authenticated"); + var readonly = $(this).attr("data-readonly"); $(this).starRating({ initialRating: 0, @@ -26,7 +27,7 @@ strokeWidth: 0, disableAfterRate: true, useFullStars: true, - readOnly: authenticated === "True", + readOnly: authenticated === "True" || readonly === "True", onHover: function (currentIndex, currentRating, $el) { $widget.find(".live-rating").text(currentIndex); }, diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Tags/Default.cshtml b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Tags/Default.cshtml index e9567b8b3e..baa68ff0f4 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Tags/Default.cshtml +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Tags/Default.cshtml @@ -10,14 +10,14 @@ { if (Model.UrlFormat.IsNullOrWhiteSpace()) { - + @tag.Name } else { var formattedUrl = Model.UrlFormat.Replace("{TagId}", tag.Id.ToString()).Replace("{TagName}", tag.Name); - @tag.Name + @tag.Name } } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/BlogPost.cshtml b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/BlogPost.cshtml index 319d6ad2f2..da11b0e9a7 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/BlogPost.cshtml +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/BlogPost.cshtml @@ -10,6 +10,7 @@ @using Volo.CmsKit.Public.Web.Pages.CmsKit.Shared.Components.Tags @using Volo.Abp.AspNetCore.Mvc.UI.Packages.HighlightJs @using Volo.CmsKit.Contents +@using Volo.CmsKit.Web @using Volo.CmsKit.Web.Pages.CmsKit.Components.Contents @inherits CmsKitPublicPageBase @@ -62,7 +63,7 @@

@Model.ViewModel.Title

- + @@@Model.ViewModel.Author?.UserName @Model.ViewModel.CreationTime @@ -89,7 +90,7 @@ { entityType = Volo.CmsKit.Blogs.BlogPostConsts.EntityType, entityId = Model.ViewModel.Id.ToString(), - urlFormat = $"/blogs/{Model.BlogSlug}?tagId={{TagId}}" + urlFormat = $"/{CmsBlogsWebConsts.BlogsRoutePrefix}/{Model.BlogSlug}?tagId={{TagId}}" }) } } @@ -133,9 +134,11 @@ { + +


} @if (isScrollIndexEnabled) { diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/Index.cshtml b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/Index.cshtml index 060f0c5c95..6f2a82e220 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/Index.cshtml +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/Index.cshtml @@ -2,18 +2,19 @@ @using Volo.CmsKit.Public.Web.Pages @using Volo.CmsKit.Public.Web.Pages.Public.CmsKit.Blogs +@using Volo.CmsKit.Web @inherits CmsKitPublicPageBase @model IndexModel -@section styles{ - +@section styles { + } @section scripts { - + } @@ -21,29 +22,43 @@ const string dummyImageSource = "https://dummyimage.com/320x180/a3a3a3/fff.png"; } - - -
- +@if (Model.AuthorId.HasValue) +{ + + +
+ - + + @if (Model.SelectedAuthor != null) + { + + } + +
+
+
+
+} + +@if (Model.TagId.HasValue) +{ +

@L["Tags"]

+ @Model.FilteredTagName + + +
+} - @if(Model.SelectedAuthor != null) - { - - } - -
-
-
@foreach (var blog in Model.Blogs.Items) { @@ -51,11 +66,11 @@ @if (blog.CoverImageMediaId != null) { - + } else { - + }
@blog.Title
@@ -65,7 +80,7 @@

@blog.ShortDescription

@@ -76,6 +91,6 @@
- + diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/Index.cshtml.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/Index.cshtml.cs index 7feab76946..e47dd40816 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/Index.cshtml.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/Index.cshtml.cs @@ -31,6 +31,8 @@ public class IndexModel : CmsKitPublicPageModelBase public CmsUserDto SelectedAuthor { get; protected set; } + public string FilteredTagName { get; protected set; } + protected IBlogPostPublicAppService BlogPostPublicAppService { get; } public IndexModel(IBlogPostPublicAppService blogPostPublicAppService) @@ -54,7 +56,12 @@ public class IndexModel : CmsKitPublicPageModelBase { SelectedAuthor = await BlogPostPublicAppService.GetAuthorHasBlogPostAsync(AuthorId.Value); } - + + if (TagId is not null) + { + FilteredTagName = await BlogPostPublicAppService.GetTagNameAsync(TagId.Value); + } + return Page(); } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/bootstrap-toc.css b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/bootstrap-toc.css index b15e18ee85..8599b9146d 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/bootstrap-toc.css +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/bootstrap-toc.css @@ -20,15 +20,17 @@ nav[data-toggle='toc'] .nav > li > a:focus { text-decoration: none; background-color: transparent; border-left: 1px solid #563d7c; + border-radius: 0; } nav[data-toggle='toc'] .nav-link.active, nav[data-toggle='toc'] .nav-link.active:hover, nav[data-toggle='toc'] .nav-link.active:focus { - padding-left: 18px; + padding-left: 8px; font-weight: bold; color: #563d7c; background-color: transparent; border-left: 2px solid #563d7c; + border-radius: 0; } /* Nav: second level (shown on .active) */ @@ -40,18 +42,16 @@ nav[data-toggle='toc'] .nav-link + ul { nav[data-toggle='toc'] .nav .nav > li > a { padding-top: 1px; padding-bottom: 1px; - padding-left: 30px; + padding-left: 8px; + margin-left: 8px; font-size: 12px; font-weight: normal; } -nav[data-toggle='toc'] .nav .nav > li > a:hover, -nav[data-toggle='toc'] .nav .nav > li > a:focus { - padding-left: 29px; -} + nav[data-toggle='toc'] .nav .nav > li > .active, nav[data-toggle='toc'] .nav .nav > li > .active:hover, nav[data-toggle='toc'] .nav .nav > li > .active:focus { - padding-left: 28px; + padding-left: 8px; font-weight: 500; } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Security/Captcha/SimpleMathsCaptchaGenerator.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Security/Captcha/SimpleMathsCaptchaGenerator.cs index bd7f9f0371..f8f1c3d071 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Security/Captcha/SimpleMathsCaptchaGenerator.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Security/Captcha/SimpleMathsCaptchaGenerator.cs @@ -116,7 +116,11 @@ public class SimpleMathsCaptchaGenerator : ITransientDependency var random = new Random(); var startWith = (byte)random.Next(5, 10); image.Mutate(ctx => ctx.BackgroundColor(Color.Transparent)); - var fontFamily = SystemFonts.Families.FirstOrDefault(x => x.IsStyleAvailable(options.FontStyle))?.Name ?? SystemFonts.Families.First().Name; + + var fontFamily = SystemFonts.Families + .FirstOrDefault(x => x.GetAvailableStyles().Contains(options.FontStyle), SystemFonts.Families.First()) + .Name; + var font = SystemFonts.CreateFont(fontFamily, options.FontSize, options.FontStyle); foreach (var character in stringText) @@ -125,7 +129,10 @@ public class SimpleMathsCaptchaGenerator : ITransientDependency var color = options.TextColor[random.Next(0, options.TextColor.Length)]; var location = new PointF(startWith + position, random.Next(6, 13)); image.Mutate(ctx => ctx.DrawText(text, font, color, location)); - position += TextMeasurer.Measure(character.ToString(), new RendererOptions(font, location)).Width; + position += TextMeasurer.MeasureSize(character.ToString(), new TextOptions (font) + { + Origin = location + }).Width; } //add rotation @@ -133,7 +140,7 @@ public class SimpleMathsCaptchaGenerator : ITransientDependency image.Mutate(ctx => ctx.Transform(rotation)); // add the dynamic image to original image - var size = (ushort)TextMeasurer.Measure(stringText, new RendererOptions(font)).Width; + var size = (ushort)TextMeasurer.MeasureSize(stringText, new TextOptions(font)).Width; var img = new Image(size + 15, options.Height); img.Mutate(ctx => ctx.BackgroundColor(Color.White)); @@ -146,7 +153,7 @@ public class SimpleMathsCaptchaGenerator : ITransientDependency var y1 = random.Next(0, img.Height); img.Mutate(ctx => - ctx.DrawLines(options.TextColor[random.Next(0, options.TextColor.Length)], + ctx.DrawLine(options.TextColor[random.Next(0, options.TextColor.Length)], RandomTextGenerator.GenerateNextFloat(options.MinLineThickness, options.MaxLineThickness), new PointF[] { new PointF(x0, y0), new PointF(x1, y1) }) ); @@ -154,15 +161,16 @@ public class SimpleMathsCaptchaGenerator : ITransientDependency img.Mutate(ctx => ctx.DrawImage(image, 0.80f)); - Parallel.For(0, options.NoiseRate, i => + Parallel.For(0, options.NoiseRate, _ => { - var x0 = random.Next(0, img.Width); - var y0 = random.Next(0, img.Height); + var x0 = random.Next(0, img.Width - 1); + var y0 = random.Next(0, img.Height - 1); img.Mutate( - ctx => ctx - .DrawLines(options.NoiseRateColor[random.Next(0, options.NoiseRateColor.Length)], - RandomTextGenerator.GenerateNextFloat(0.5, 1.5), new PointF[] { new Vector2(x0, y0), new Vector2(x0, y0) }) - ); + ctx => ctx + .DrawLine(options.NoiseRateColor[random.Next(0, options.NoiseRateColor.Length)], + RandomTextGenerator.GenerateNextFloat(0.5, 1.5), + new PointF[] { new Vector2(x0, y0), new Vector2(x0 + 0.005f, y0 + 0.005f) }) + ); }); img.Mutate(x => diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Volo.CmsKit.Public.Web.csproj b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Volo.CmsKit.Public.Web.csproj index ac6f26aa08..81177e2462 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Volo.CmsKit.Public.Web.csproj +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Volo.CmsKit.Public.Web.csproj @@ -14,11 +14,11 @@ - + - + diff --git a/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Blogs/BlogPostPublicAppService_Tests.cs b/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Blogs/BlogPostPublicAppService_Tests.cs index 677e1ac086..edbbe3e8de 100644 --- a/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Blogs/BlogPostPublicAppService_Tests.cs +++ b/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Blogs/BlogPostPublicAppService_Tests.cs @@ -179,4 +179,19 @@ public class BlogPostPublicAppService_Tests : CmsKitApplicationTestBase allItemsFromRepository.Any(x => x.Id == draftBlogPost2.Id).ShouldBeTrue(); allItemsFromRepository.Any(x => x.Id == publishedBlogPost1.Id).ShouldBeTrue(); } + + [Fact] + public async Task GetTagNameAsync_ShouldReturnCorrectName() + { + var tagName = await blogPostAppService.GetTagNameAsync(cmsKitTestData.TagId_1); + + tagName.ShouldBe(cmsKitTestData.TagName_1); + } + + [Fact] + public async Task GetTagNameAsync_WithNonExistingIdShouldReturnCorrectName() + { + await Should.ThrowAsync( + blogPostAppService.GetTagNameAsync(Guid.NewGuid())); + } } diff --git a/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Comments/CommentPublicAppService_Tests.cs b/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Comments/CommentPublicAppService_Tests.cs index cbb165c1cd..d01fc295cf 100644 --- a/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Comments/CommentPublicAppService_Tests.cs +++ b/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Comments/CommentPublicAppService_Tests.cs @@ -1,4 +1,5 @@ -using System.Linq; +using System; +using System.Linq; using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; using NSubstitute; @@ -48,7 +49,8 @@ public class CommentPublicAppService_Tests : CmsKitApplicationTestBase new CreateCommentInput { RepliedCommentId = null, - Text = "newComment" + Text = "newComment", + IdempotencyToken = Guid.NewGuid().ToString("N") } ); @@ -75,7 +77,8 @@ public class CommentPublicAppService_Tests : CmsKitApplicationTestBase new CreateCommentInput { RepliedCommentId = null, - Text = text + Text = text, + IdempotencyToken = Guid.NewGuid().ToString("N") } ); } @@ -95,6 +98,25 @@ public class CommentPublicAppService_Tests : CmsKitApplicationTestBase { RepliedCommentId = null, Text = text, //not allowed URL + IdempotencyToken = Guid.NewGuid().ToString("N") + } + )); + } + + [Fact] + public async Task CreateAsync_ShouldThrowUserFriendlyException_If_IdempotencyToken_Not_Unique() + { + _currentUser.Id.Returns(_cmsKitTestData.User2Id); + + await Should.ThrowAsync(async () => + await _commentAppService.CreateAsync( + _cmsKitTestData.EntityType1, + _cmsKitTestData.EntityId1, + new CreateCommentInput + { + RepliedCommentId = null, + Text = "", + IdempotencyToken = _cmsKitTestData.IdempotencyToken_1 } )); } diff --git a/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitDataSeedContributor.cs b/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitDataSeedContributor.cs index af5ee0754a..f17a95ddba 100644 --- a/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitDataSeedContributor.cs +++ b/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitDataSeedContributor.cs @@ -194,7 +194,7 @@ public class CmsKitDataSeedContributor : IDataSeedContributor, ITransientDepende "comment", null, _cmsKitTestData.User1Id - )); + ){ IdempotencyToken = _cmsKitTestData.IdempotencyToken_1 }); await _commentRepository.InsertAsync(new Comment(_guidGenerator.Create(), _cmsKitTestData.EntityType1, diff --git a/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitTestData.cs b/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitTestData.cs index cfa54d2e55..8c4c07e283 100644 --- a/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitTestData.cs +++ b/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitTestData.cs @@ -131,4 +131,6 @@ public class CmsKitTestData : ISingletonDependency public string PollName { get; } = "Poll"; public string WidgetName { get; } = "CmsPollByCode"; + + public string IdempotencyToken_1 { get; } = Guid.NewGuid().ToString("N"); } diff --git a/modules/docs/app/VoloDocs.Web/package.json b/modules/docs/app/VoloDocs.Web/package.json index c4e7f90755..9e3818c9b6 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": "~7.4.0", - "@abp/docs": "~7.4.0" + "@abp/aspnetcore.mvc.ui.theme.basic": "~7.4.1", + "@abp/docs": "~7.4.1" } } diff --git a/modules/docs/app/VoloDocs.Web/yarn.lock b/modules/docs/app/VoloDocs.Web/yarn.lock index dbd2162f5c..7c29d5a62d 100644 --- a/modules/docs/app/VoloDocs.Web/yarn.lock +++ b/modules/docs/app/VoloDocs.Web/yarn.lock @@ -2,47 +2,47 @@ # yarn lockfile v1 -"@abp/anchor-js@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/anchor-js/-/anchor-js-7.4.0.tgz#062faa10d670b70d16c8f6d208a24c63b4185489" - integrity sha512-Fmt97KeuzM8/QPaTdVGcgyBtNQc2oJT8ZoGbrZ9E0uTUUnzBSiIqEH2u2Voz5WaqfOrlAzpILHRjnVfwCMlErQ== +"@abp/anchor-js@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/anchor-js/-/anchor-js-7.4.1.tgz#d9323f8c943e6f02268b55daa0072294ef54b96d" + integrity sha512-72tE6OmE8aUeERGtgktF9bdZ6CFMc33obX8KMU5WL8FynzsJYCbLsggTUc8WCfi/AxuFAtqqxKU1TTjypWs2SQ== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" anchor-js "^4.3.1" -"@abp/aspnetcore.mvc.ui.theme.basic@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-7.4.0.tgz#5088dd82ce343e1123e025848f09b51df988b225" - integrity sha512-teT7I0kgjek/lHzpTg5VOVCQ3IL26nFB43Aa/45fuaSwh9FJd3IJNXGL6xwp85oKaptDYSBXIF4GbrUfp2Ugqg== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~7.4.0" - -"@abp/aspnetcore.mvc.ui.theme.shared@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-7.4.0.tgz#e676444a46214e850b0d916daeeb912774ac381d" - integrity sha512-X+dgdgHGUTyf0zaSPsqQp2ZZWu2+9gIRT4r4/LDgxchHgfNvcKRF8jH/JICcVgGD1adJvZzzDpTefL8CuAIRJA== - dependencies: - "@abp/aspnetcore.mvc.ui" "~7.4.0" - "@abp/bootstrap" "~7.4.0" - "@abp/bootstrap-datepicker" "~7.4.0" - "@abp/bootstrap-daterangepicker" "~7.4.0" - "@abp/datatables.net-bs5" "~7.4.0" - "@abp/font-awesome" "~7.4.0" - "@abp/jquery-form" "~7.4.0" - "@abp/jquery-validation-unobtrusive" "~7.4.0" - "@abp/lodash" "~7.4.0" - "@abp/luxon" "~7.4.0" - "@abp/malihu-custom-scrollbar-plugin" "~7.4.0" - "@abp/moment" "~7.4.0" - "@abp/select2" "~7.4.0" - "@abp/sweetalert2" "~7.4.0" - "@abp/timeago" "~7.4.0" - "@abp/toastr" "~7.4.0" - -"@abp/aspnetcore.mvc.ui@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-7.4.0.tgz#61e1b52d2a940e02242f57007bd3f0fcb583c09a" - integrity sha512-gdoxOBo10DWDYhUq1GVfguC0Ot8PYhoA3VLf88/RatL88BNUUlt0e71uMFcx/gk72fuAE+o9zXn/6nq1wtpSwQ== +"@abp/aspnetcore.mvc.ui.theme.basic@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-7.4.1.tgz#62df78aab8a0b374817fdbab6c6363529b43f925" + integrity sha512-KaPmBlwNjOl1+vwLj5O8J11YHBSRg4y0IIxtgZiculXQNFPHbYAXm8sfTw6Wcsx00STrhvUVJQxYMePNnOTCTg== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~7.4.1" + +"@abp/aspnetcore.mvc.ui.theme.shared@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-7.4.1.tgz#8f8679f5cf80137324ddbec9fcaa67332783e708" + integrity sha512-0uUKuTsi/ikLFUUNEqvrn7KimgsvuK+7m1yZD4o47FQlgGxTyt1zQY9w3K6YyhyC3lsT6qCwiAPIoFOzPkIg/Q== + dependencies: + "@abp/aspnetcore.mvc.ui" "~7.4.1" + "@abp/bootstrap" "~7.4.1" + "@abp/bootstrap-datepicker" "~7.4.1" + "@abp/bootstrap-daterangepicker" "~7.4.1" + "@abp/datatables.net-bs5" "~7.4.1" + "@abp/font-awesome" "~7.4.1" + "@abp/jquery-form" "~7.4.1" + "@abp/jquery-validation-unobtrusive" "~7.4.1" + "@abp/lodash" "~7.4.1" + "@abp/luxon" "~7.4.1" + "@abp/malihu-custom-scrollbar-plugin" "~7.4.1" + "@abp/moment" "~7.4.1" + "@abp/select2" "~7.4.1" + "@abp/sweetalert2" "~7.4.1" + "@abp/timeago" "~7.4.1" + "@abp/toastr" "~7.4.1" + +"@abp/aspnetcore.mvc.ui@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-7.4.1.tgz#49c13718a17569f97b71f978b50f367dff67b8f7" + integrity sha512-EvYrfk0mpSt1jAMZmfFcHoNWEJskzResKp0bflOYsYPsZPuJ5WraKsk4IEEpesYHCyHW5AAb5HBJHeoSbVLh4Q== dependencies: ansi-colors "^4.1.1" extend-object "^1.0.0" @@ -51,194 +51,194 @@ merge-stream "^2.0.0" micromatch "^4.0.2" -"@abp/bootstrap-datepicker@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-7.4.0.tgz#75edc2127ca26d86bfefaa6e37579b06e32de5de" - integrity sha512-HXUa+kLjKu8sKr+kCZeNye9Pv/swRfKGAt/uJ2WUEvCJ4IVIMM1p6iMnOEEk/+3OGE64/PWu3cdE9dLP6izOaA== +"@abp/bootstrap-datepicker@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-7.4.1.tgz#f8f35d0edf71368faaae4e40a72fa846b0084f9b" + integrity sha512-hsu8ty6c2oOevsNoyFTQ4yJAu27qnz82MgRNVS8MRfdzo05/LhBhy/tKFm+PFYJqZULYlpQ1GXUF2+uGyazIeg== dependencies: bootstrap-datepicker "^1.9.0" -"@abp/bootstrap-daterangepicker@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-7.4.0.tgz#5058fc2a9354f0a71ac5393658e362779a3bdc46" - integrity sha512-EK0wzZUY9H3XPb9U3DvYVqh48fU+6IneNGYOk7dcda8CUYObd4Dl1nXligStCqgn2uePtwxDHRx40eV0GXmU/Q== +"@abp/bootstrap-daterangepicker@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-7.4.1.tgz#b133cefdbed0fa1b8f1bda916a9d46952237238a" + integrity sha512-NpmbsO4Xg48Zmr8OOlf1fxuNMnFIqmRrkHiKp9lP5c8am64+7rRzCwATw2UY0Ud+4n8/ws+Iki1dwPQF6db1zw== dependencies: bootstrap-daterangepicker "^3.1.0" -"@abp/bootstrap@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-7.4.0.tgz#71be70660643d8f60d13d355b8c80b16e4854870" - integrity sha512-3Fa+fL5NH+0H2KK4MAaqNsiz0PYwK0+Oxjmd0NgKwcqV2vJzRrzS3WG5kITYjNz9QGdBV+FrhNX/NSRU8LDx3Q== +"@abp/bootstrap@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-7.4.1.tgz#b34a2fcc80e04212865652ee7f4f5498a6a61f6d" + integrity sha512-/qCgfrtNWZ2jui2iL6wd6MLrcxALSEFVBypaz1JK3WjEe7DvFAYvKLl7DugIv039/Sx3mbx/PJiQhx8CVZMsEA== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" bootstrap "^5.1.3" -"@abp/clipboard@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-7.4.0.tgz#f1d147df94ddf3ab53eeeb05aec3d5556064c5d6" - integrity sha512-z/nB1RQN/tmShSRwc9Fv1DsJSNM7+Zg4GnAtvZNpOHJp8LTVmsJWxLoUM7hF896W9E0JKr8tRuCVqulyh3IqKg== +"@abp/clipboard@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-7.4.1.tgz#31329ad4565b5075b486e9ca63fb0ff8a070ff9e" + integrity sha512-/+ylBPs/TEZdwywSSTnj96WoRJPwQnR6vlI+sX7h9wDfSDbMwuSSdETSnDVT21lkl8gonPONFZTL8D1u/KKAhg== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" clipboard "^2.0.8" -"@abp/core@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-7.4.0.tgz#8505d446a3b4d80ce476bd3352c1639c7dc486ec" - integrity sha512-yxrnw6eAEIj/CcX5jAwb4xmCsdqWaG+KRcBA8GFvqXbsK94IjqLDiJ3flo+QhGn2DXo40ISxofZop0CgSbP7Ew== +"@abp/core@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-7.4.1.tgz#1d14899ad16aac038806504eb0a5be9318cdcc0c" + integrity sha512-p0BAe2kCtgZmq8pilahmuxmye8DeRXt2KmnFRbmYE3j4d0uComFZpC72QOD1iro8bkmbsHfsHJpiVg4Sp4licw== dependencies: - "@abp/utils" "~7.4.0" + "@abp/utils" "~7.4.1" -"@abp/datatables.net-bs5@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-7.4.0.tgz#52d22e12a2420b402e03148793707d063db0088d" - integrity sha512-VvQv5w0cUpdDD9jX8aUEaLxFrc4A95JlmFnhCYIV1etL8HNOdZvmOThxorsImk31JfpyVYrY/Ze/rnWi2uhVvQ== +"@abp/datatables.net-bs5@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-7.4.1.tgz#821ee4c5db116f9810d65184855cea1fa7d47360" + integrity sha512-jpUzb65lCGYAxs/1qV3pRP8agHwIgZA9gDrudvR8S/3X3kNQWtmeKoFDZ93mhnl3aWPjWFKVrT2LeQeJw5XO5A== dependencies: - "@abp/datatables.net" "~7.4.0" + "@abp/datatables.net" "~7.4.1" datatables.net-bs5 "^1.11.4" -"@abp/datatables.net@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-7.4.0.tgz#9f12a1bb2abd05cd753b5d937d8a0350b2ff74ae" - integrity sha512-StOkMmIkcBUWzD9ToZ5J/hISRWdxbAWjwn7RuFXsoHXcY03mmD86g2oztjrWC5UFnRdpFnsfspTpbNqXFB9Vag== +"@abp/datatables.net@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-7.4.1.tgz#a4501e92e9995da0759b9ce55756fe92c4e8db59" + integrity sha512-BZOOZLH7XrGlX3aFK97cwV9+npsTzALSBo87OgwO2U6UpeFq7yAOvmC0+L9dmIUDISeORn5IFc/zTsSSIQnpHQ== dependencies: - "@abp/jquery" "~7.4.0" + "@abp/jquery" "~7.4.1" datatables.net "^1.11.4" -"@abp/docs@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/docs/-/docs-7.4.0.tgz#62a9c23a0d961838515cd30bcee22f16fd40e0a2" - integrity sha512-BfgB51s8qZuzeXydI+CJxC8ogTAmfI3OADN89LWUL5OPCyZa9YAtgaFOEKhYRZ+unY3Rn6wV+v67bMeMhFb5mw== +"@abp/docs@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/docs/-/docs-7.4.1.tgz#3dc2d04612baa7b414e9927853b8c50b5757553f" + integrity sha512-qaGvzmxiS0d1S9OOsCTK6qHeC+umKgCWS58F877eUHGOZWnnE7+ifChB27W1Y79Y87sQkqBYTOFIkq8iAXxwXg== dependencies: - "@abp/anchor-js" "~7.4.0" - "@abp/clipboard" "~7.4.0" - "@abp/malihu-custom-scrollbar-plugin" "~7.4.0" - "@abp/popper.js" "~7.4.0" - "@abp/prismjs" "~7.4.0" + "@abp/anchor-js" "~7.4.1" + "@abp/clipboard" "~7.4.1" + "@abp/malihu-custom-scrollbar-plugin" "~7.4.1" + "@abp/popper.js" "~7.4.1" + "@abp/prismjs" "~7.4.1" -"@abp/font-awesome@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-7.4.0.tgz#50059083b88706a0f71f55118472b378e4c66163" - integrity sha512-hKoPyM41HHCK6dg+8pQvjYJWzKABBCXrYQAIneMPQZUZqa4JLObKCva9TR7pu6pUp+9OVzg4fQOBM+nwpHtw4g== +"@abp/font-awesome@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-7.4.1.tgz#f6175a989aa64367830723f1dd9c607906716296" + integrity sha512-/ybaz4KROwFdG4Xv0yMTUMXOreDmKy1lKQuntqHEUnIorhXmkgcd5AQQ5AolJ4NmNdPNt1VYrRcTEmdz3nw+FA== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" "@fortawesome/fontawesome-free" "^5.15.4" -"@abp/jquery-form@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-7.4.0.tgz#7ab3be241ee09f1e2843bd1b4d0b0b86d4446e30" - integrity sha512-OmTRuZ7QK1oe2ayNLqEpRJk4Ogk0wt/hIFtJHwQkCtDuCggoR5sQz4vn1vgrD19MxGq07dow5IgjbbhHv1vtEg== +"@abp/jquery-form@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-7.4.1.tgz#67978c41cda204b4c2027d81fc66844379313fa6" + integrity sha512-JZ1D47s/kpTlfMcpD4Jrlh98bhEDsIlWJauvAYaS0EBPIU9V2zHGQ+h9GPFbSPrXe4sYxPSREcsc8KUVMhT5MQ== dependencies: - "@abp/jquery" "~7.4.0" + "@abp/jquery" "~7.4.1" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-7.4.0.tgz#0c564e39c4997dd9b8af7d2023615a06d6fd9834" - integrity sha512-vFB3RKkDlDXbHlDJ64uo3jWW1IRXwiCaPf+mcB77Wpt5+0Dn7eWqjBT7KyHBrsV08ghIqY/Q4nXntFJrmLcuEA== +"@abp/jquery-validation-unobtrusive@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-7.4.1.tgz#fe5c90ade419e83505884dd50dd5988d766f177b" + integrity sha512-oHHV/ukap+vDvQ8CnEWnOrrsLkHXIcMk+SjNKe/dyK5VzOVLDpMatRFmloLs2igYVXTqDGjmDlTswTFdJUarcQ== dependencies: - "@abp/jquery-validation" "~7.4.0" + "@abp/jquery-validation" "~7.4.1" jquery-validation-unobtrusive "^3.2.12" -"@abp/jquery-validation@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-7.4.0.tgz#f2aaba8f4c023e93f0051cc9a05c6d82fa5c7254" - integrity sha512-vN4srLT5UXAKXpKHbZgySWT+N2DjRYivgtifpZHMTGFLMW14W+tfi5zhR4H4JvqJpuO6ZKNiz15zA1zwEBK0Tw== +"@abp/jquery-validation@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-7.4.1.tgz#c2c06bc28770832a9ad73eac000586faed3bdbe3" + integrity sha512-A5iFT2EWfGHXrBb/ov5f0grZ2o2xkDaYtps/FnDUwBYdIdD8E7bbJsWp6ytvZDciO0XmEqAoVOxmiij7ue/SOg== dependencies: - "@abp/jquery" "~7.4.0" + "@abp/jquery" "~7.4.1" jquery-validation "^1.19.3" -"@abp/jquery@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-7.4.0.tgz#206891b20f250537d05d907d2b6cd682fec76496" - integrity sha512-DeYo02T6WVhdpLloSPb6ooqtpksu1HtcbbQhIP9E1P7jHSzZoNiJvoKXHiFUcj5PYiGKl9d/o89hM/apWzyreQ== +"@abp/jquery@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-7.4.1.tgz#b5e16834e6c7871ad6392612ac8e2de8617eb353" + integrity sha512-X3RcovvRYISHcsb6W3U3iVsofw6yomoiouoB1tSIy2/tvUbu9n7N/3MM0CUujFm/xib7s3z1tVxFssS9smT7sw== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" jquery "~3.6.0" -"@abp/lodash@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-7.4.0.tgz#93f20abee776dbfa7aa45e2e710f2768f262fda5" - integrity sha512-h4Fnjm+VLwp1F3r57B9MrHhwyOYMo5oP285a85zzAYLkhwcDy7f1nbHKHMQ3ZTaeJVmiRnVaH+3sdUdslCRt5g== +"@abp/lodash@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-7.4.1.tgz#d0f84b7b9cbd989d59ebde594ed7acb8bc720b61" + integrity sha512-RFjZCyAPZnpvT0SJbxXzzmMYbuocSWBlezvjAVA8MiTrOXdZO4VyaTFjIuQcAdSrZhtpFGeYWxAjHshVplxMbw== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" lodash "^4.17.21" -"@abp/luxon@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-7.4.0.tgz#2ba7ff307c8f7c24d818a9c33635b86fd6810db9" - integrity sha512-ROCx7aihM+agdYy7Tkz+GiScx68KY5qwGTnj8P7QabGFChzVUic6RuBG+2Obmfonc6uT7Rq0c8JDGrsGNe/w8A== +"@abp/luxon@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-7.4.1.tgz#e0c0947d2b77f98b9cdaf7d1143025879361c3c9" + integrity sha512-k1wh8tT1529MtNC2gSXEIKdimBXBwubXeLisgpIPx6lkJo1Op6pAz2ERwFXeyktqGdYyuFcnewJIxmS7EPtWhg== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" luxon "^2.3.0" -"@abp/malihu-custom-scrollbar-plugin@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-7.4.0.tgz#aba68877481f4339e048f2ae3cfbe93197145a0a" - integrity sha512-Ntodhi4k0HFQmImYTP5SYf/WDm7aUGJLaGsfePm77HJ6DhGgalIGqtM8NiFXzo/3GmMY0XSo8Wxrs1mSCdtsOA== +"@abp/malihu-custom-scrollbar-plugin@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-7.4.1.tgz#aa7ec247197a258277549052780b38fd9e748c6c" + integrity sha512-pm/wIaiRSgGxelOf8AiL4JKFNZOQ6s2WbR6pULiP2HSNCgCpWYJ2s8fvj7VP3lAHIa98v3m8PSMSUhqaANxZ/Q== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/moment@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-7.4.0.tgz#2490d9c7cdcaeca8d0ba9ebef5e7298caf0c9e09" - integrity sha512-ftsUEgO17GbVawA1GplGFzEeIM4NX004AmS6/fPI3o5isX7o1buF9q9TXdnwUuFEJKZxS4KpveRqzTL5t9k0BQ== +"@abp/moment@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-7.4.1.tgz#1c28ccb13eecdd13695edf8641ca9867b318e37d" + integrity sha512-7vRJyAK5ER9z+LV1xUSAAtWlPlhv8yhM/nHjhC+IQSP/+V1D7VLA6EKxAEexGw7wX6HY8oMOWP9HxDHMb5hKQA== dependencies: moment "^2.9.0" -"@abp/popper.js@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/popper.js/-/popper.js-7.4.0.tgz#523ec0341544947b8914bab1c9fdfbca1709cc16" - integrity sha512-A/d5SEbspqd5ixJe2dZELqSqMS/5K/WQ9orY5//mz3L0WS9YDqiRjJdyep9pR8jskD9q6Wg+q/rrdipG+LEgMQ== +"@abp/popper.js@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/popper.js/-/popper.js-7.4.1.tgz#db9ae010e87b0f2eb39cd277487100ffd4d08fd1" + integrity sha512-/tcVasfC5Tr0o2yBge7jxP2hfVcVYZoHjNnGAuIsFCvP4zpq65HkVam181QOoJXWMS6ibHJO6tRbYtIZ4ye4lQ== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" "@popperjs/core" "^2.11.2" -"@abp/prismjs@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-7.4.0.tgz#8572f36f853c7054d77d02f3098cd844ee321ed7" - integrity sha512-y/Iy6pddQeVazEITktPot8JOPdAEOVAfmYkTBP3DIIPvoYr3kf6rwfzBUalMw5CEjWZ9BaIszDgFCk5ucNHHwQ== +"@abp/prismjs@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-7.4.1.tgz#df4387dbc2f0c77ddb9b6bd0ade9a5db29b9cee2" + integrity sha512-bI7pEKWy32aRYSb2ZziiH6Teebyd8km+1TXADy1yks9i9G5eLWe4/CSdwWpI4M+8ggM8CsdhrZ6/U+55BpXPQA== dependencies: - "@abp/clipboard" "~7.4.0" - "@abp/core" "~7.4.0" + "@abp/clipboard" "~7.4.1" + "@abp/core" "~7.4.1" prismjs "^1.26.0" -"@abp/select2@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-7.4.0.tgz#2f455cc991b7bb4df9ed426097bc2996cac12697" - integrity sha512-DwprX4MIoqMzSdh7eFg7EjGIz4ftYZub6jG9Sk3r+sxabbhpbFTxKOpXnhBWYi7L7uTQ8YDFk/5NeXO+Rm50Ww== +"@abp/select2@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-7.4.1.tgz#d7ea53cfec285a06278db362131b7510d5b73900" + integrity sha512-0S66iy7HuB74qqOSDraoF7UvXqz2PrnOKy+3EYMTMskOn4pWaq03JMR8xxEgZ8CtmsrqlE1a4wt1Yt9b3FIc0w== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" select2 "^4.0.13" -"@abp/sweetalert2@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-7.4.0.tgz#db1b4bd45cbabd61172591abc8ce223b5f607c4e" - integrity sha512-XqHPRnTASaRtbJIZYKW1KSKIJ8tynL8DuPCSMjcp4iyUlk+gnzxvbqXeNVjc2ojxj78T/42M/vITNoiiTYuKUw== +"@abp/sweetalert2@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-7.4.1.tgz#6722a40e5115cc341b7543aa0fa3b5a7ae9515b2" + integrity sha512-9jAHrYqCp5qykYfNNbqgESL6egixofVwonjZlb+lLWHAkIX+gQ2ApUNDFSXPtKUh2n9sXhSfF8SSg+BHP/bkCA== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" sweetalert2 "^11.3.6" -"@abp/timeago@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-7.4.0.tgz#245fe09370f38311a67a594c8a3c884aea59cc90" - integrity sha512-khxK6EICUaGCUM1HkACw/8rlPQNssoQvCK64bNqEHBCXgPUmTcqSj5MEGiNOYbgGyWeH2IAMtJEYPqX1g1wqSA== +"@abp/timeago@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-7.4.1.tgz#243d342ba131878ae7f892909c9cae07cf54902b" + integrity sha512-a0Vl2NFwTxzRmH5akWo8BRUxa6sK72z8OoXwUFkZOUqMWBCHK7ffNiN1/fbSgA+7HpSZdDvIthjYwBt57DxLdQ== dependencies: - "@abp/jquery" "~7.4.0" + "@abp/jquery" "~7.4.1" timeago "^1.6.7" -"@abp/toastr@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-7.4.0.tgz#16ba0414a27c9a21bc7556a078b175445edcf608" - integrity sha512-oM4HT2m95cK/9sB4AEQAKUMSGBep6wZTgM/46+o2IvvMdMPrGR2mPu9V9wi3y817FRgY+/qQTfy5TZWyTuIpVQ== +"@abp/toastr@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-7.4.1.tgz#345545a41b6145e54477c6c376193a6dbd62bdda" + integrity sha512-OLCvPJYSrcT2spcq9nO838Q22VhJ63Kdzasz1HugdVNqgcFCCSsqaoXrJGUcf5GrZx7PNloz7uf1I3txYMeZtA== dependencies: - "@abp/jquery" "~7.4.0" + "@abp/jquery" "~7.4.1" toastr "^2.1.4" -"@abp/utils@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-7.4.0.tgz#b31fb6e5dff07463535479a6bb62dc733d7119c8" - integrity sha512-CcR3tfuEsVM60DYL1A0cH6BkUTsasOoBDv/b63uLCoEOq/g8ntelD/SpRSgfDXK74P9M8OE5ZFxlXWDiYuzAFg== +"@abp/utils@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-7.4.1.tgz#2ce4c4d659c2ae9bc23b71b79fa3c6e120eaecaf" + integrity sha512-eFeoOXcz9cVkDKpOfd2VWmpAojASfsqfvACZqi1UmF16OcjsFIkxmIvhh1fpbT4A+eQLbaFFLIsf6gYb//tXhg== dependencies: just-compare "^2.3.0" diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityUserEmailChangedEto.cs b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityUserEmailChangedEto.cs new file mode 100644 index 0000000000..c0b1dea34f --- /dev/null +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityUserEmailChangedEto.cs @@ -0,0 +1,16 @@ +using System; +using Volo.Abp.MultiTenancy; + +namespace Volo.Abp.Identity; + +[Serializable] +public class IdentityUserEmailChangedEto : IMultiTenant +{ + public Guid Id { get; set; } + + public Guid? TenantId { get; set; } + + public string Email { get; set; } + + public string OldEmail { get; set; } +} \ No newline at end of file diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityUserUserNameChangedEto.cs b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityUserUserNameChangedEto.cs new file mode 100644 index 0000000000..7745b3cc4f --- /dev/null +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityUserUserNameChangedEto.cs @@ -0,0 +1,16 @@ +using System; +using Volo.Abp.MultiTenancy; + +namespace Volo.Abp.Identity; + +[Serializable] +public class IdentityUserUserNameChangedEto : IMultiTenant +{ + public Guid Id { get; set; } + + public Guid? TenantId { get; set; } + + public string UserName { get; set; } + + public string OldUserName { get; set; } +} diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/zh-Hans.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/zh-Hans.json index 165ba09b41..eaab0eb3ea 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/zh-Hans.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/zh-Hans.json @@ -114,6 +114,13 @@ "Description:Abp.Identity.SignIn.EnablePhoneNumberConfirmation": "用户是否可以确认电话号码", "Description:Abp.Identity.SignIn.RequireConfirmedPhoneNumber": "登录时是否需要验证的手机号码.", "Description:Abp.Identity.User.IsUserNameUpdateEnabled": "是否允许用户更新用户名.", - "Description:Abp.Identity.User.IsEmailUpdateEnabled": "是否允许用户更新电子邮箱." + "Description:Abp.Identity.User.IsEmailUpdateEnabled": "是否允许用户更新电子邮箱.", + "Details": "详情", + "CreatedBy": "创建者", + "ModifiedBy": "修改者", + "ModificationTime": "修改时间", + "PasswordUpdateTime": "密码更新时间", + "LockoutEndTime": "锁定结束时间", + "FailedAccessCount": "访问失败次数" } } diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/zh-Hant.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/zh-Hant.json index d12c44890a..eddabe3446 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/zh-Hant.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/zh-Hant.json @@ -114,6 +114,13 @@ "Description:Abp.Identity.SignIn.EnablePhoneNumberConfirmation": "是否啟用電話認證.", "Description:Abp.Identity.SignIn.RequireConfirmedPhoneNumber": "決定使用者是否需電話認證後才能登入.", "Description:Abp.Identity.User.IsUserNameUpdateEnabled": "決定使用者是否能更新帳號.", - "Description:Abp.Identity.User.IsEmailUpdateEnabled": "決定使用者是否能更新信箱." + "Description:Abp.Identity.User.IsEmailUpdateEnabled": "決定使用者是否能更新信箱.", + "Details": "詳情", + "CreatedBy": "創建者", + "ModifiedBy": "修改者", + "ModificationTime": "修改時間", + "PasswordUpdateTime": "密碼更新時間", + "LockoutEndTime": "鎖定結束時間", + "FailedAccessCount": "訪問失敗次數" } } diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityLinkUserInfo.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityLinkUserInfo.cs index 250f6f88d6..d2f5bdbff3 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityLinkUserInfo.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityLinkUserInfo.cs @@ -8,7 +8,7 @@ public class IdentityLinkUserInfo public virtual Guid? TenantId { get; set; } - public IdentityLinkUserInfo(Guid userId, Guid? tenantId) + public IdentityLinkUserInfo(Guid userId, Guid? tenantId = null) { UserId = userId; TenantId = tenantId; diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserManager.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserManager.cs index cdbb289597..57b97bfcd7 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserManager.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserManager.cs @@ -10,10 +10,11 @@ using Microsoft.Extensions.Options; using Volo.Abp.Domain.Entities; using Volo.Abp.Domain.Repositories; using Volo.Abp.Domain.Services; +using Volo.Abp.EventBus.Distributed; +using Volo.Abp.EventBus.Local; using Volo.Abp.Identity.Settings; using Volo.Abp.Settings; using Volo.Abp.Threading; -using Volo.Abp.Timing; using Volo.Abp.Uow; namespace Volo.Abp.Identity; @@ -25,7 +26,8 @@ public class IdentityUserManager : UserManager, IDomainService protected IOrganizationUnitRepository OrganizationUnitRepository { get; } protected ISettingProvider SettingProvider { get; } protected ICancellationTokenProvider CancellationTokenProvider { get; } - + protected IDistributedEventBus DistributedEventBus { get; } + protected IIdentityLinkUserRepository IdentityLinkUserRepository { get; } protected override CancellationToken CancellationToken => CancellationTokenProvider.Token; public IdentityUserManager( @@ -42,7 +44,9 @@ public class IdentityUserManager : UserManager, IDomainService ILogger logger, ICancellationTokenProvider cancellationTokenProvider, IOrganizationUnitRepository organizationUnitRepository, - ISettingProvider settingProvider) + ISettingProvider settingProvider, + IDistributedEventBus distributedEventBus, + IIdentityLinkUserRepository identityLinkUserRepository) : base( store, optionsAccessor, @@ -56,8 +60,10 @@ public class IdentityUserManager : UserManager, IDomainService { OrganizationUnitRepository = organizationUnitRepository; SettingProvider = settingProvider; + DistributedEventBus = distributedEventBus; RoleRepository = roleRepository; UserRepository = userRepository; + IdentityLinkUserRepository = identityLinkUserRepository; CancellationTokenProvider = cancellationTokenProvider; } @@ -72,6 +78,19 @@ public class IdentityUserManager : UserManager, IDomainService return await CreateAsync(user); } + public async override Task DeleteAsync(IdentityUser user) + { + user.Claims.Clear(); + user.Roles.Clear(); + user.Tokens.Clear(); + user.Logins.Clear(); + user.OrganizationUnits.Clear(); + await IdentityLinkUserRepository.DeleteAsync(new IdentityLinkUserInfo(user.Id, user.TenantId), CancellationToken); + await UpdateAsync(user); + + return await base.DeleteAsync(user); + } + public virtual async Task GetByIdAsync(Guid id) { var user = await Store.FindByIdAsync(id.ToString(), CancellationToken); @@ -285,4 +304,50 @@ public class IdentityUserManager : UserManager, IDomainService await identityUserStore.SetTokenAsync(user, await identityUserStore.GetInternalLoginProviderAsync(), await identityUserStore.GetRecoveryCodeTokenNameAsync(), string.Empty, CancellationToken); } + + public async override Task SetEmailAsync(IdentityUser user, string email) + { + var oldMail = user.Email; + + var result = await base.SetEmailAsync(user, email); + + result.CheckErrors(); + + if (!string.IsNullOrEmpty(oldMail) && !oldMail.Equals(email, StringComparison.OrdinalIgnoreCase)) + { + await DistributedEventBus.PublishAsync( + new IdentityUserEmailChangedEto + { + Id = user.Id, + TenantId = user.TenantId, + Email = email, + OldEmail = oldMail + }); + } + + return result; + } + + public async override Task SetUserNameAsync(IdentityUser user, string userName) + { + var oldUserName = user.UserName; + + var result = await base.SetUserNameAsync(user, userName); + + result.CheckErrors(); + + if (!string.IsNullOrEmpty(oldUserName) && oldUserName != userName) + { + await DistributedEventBus.PublishAsync( + new IdentityUserUserNameChangedEto + { + Id = user.Id, + TenantId = user.TenantId, + UserName = userName, + OldUserName = oldUserName + }); + } + + return result; + } } diff --git a/modules/identity/src/Volo.Abp.PermissionManagement.Domain.Identity/Volo.Abp.PermissionManagement.Domain.Identity.csproj b/modules/identity/src/Volo.Abp.PermissionManagement.Domain.Identity/Volo.Abp.PermissionManagement.Domain.Identity.csproj index 30018df86e..35ce121c09 100644 --- a/modules/identity/src/Volo.Abp.PermissionManagement.Domain.Identity/Volo.Abp.PermissionManagement.Domain.Identity.csproj +++ b/modules/identity/src/Volo.Abp.PermissionManagement.Domain.Identity/Volo.Abp.PermissionManagement.Domain.Identity.csproj @@ -16,6 +16,7 @@ + diff --git a/modules/identity/src/Volo.Abp.PermissionManagement.Domain.Identity/Volo/Abp/PermissionManagement/Identity/AbpPermissionManagementDomainIdentityModule.cs b/modules/identity/src/Volo.Abp.PermissionManagement.Domain.Identity/Volo/Abp/PermissionManagement/Identity/AbpPermissionManagementDomainIdentityModule.cs index e710d5b165..973577ccff 100644 --- a/modules/identity/src/Volo.Abp.PermissionManagement.Domain.Identity/Volo/Abp/PermissionManagement/Identity/AbpPermissionManagementDomainIdentityModule.cs +++ b/modules/identity/src/Volo.Abp.PermissionManagement.Domain.Identity/Volo/Abp/PermissionManagement/Identity/AbpPermissionManagementDomainIdentityModule.cs @@ -1,13 +1,15 @@ using Volo.Abp.Authorization.Permissions; using Volo.Abp.Identity; using Volo.Abp.Modularity; +using Volo.Abp.Users; namespace Volo.Abp.PermissionManagement.Identity; [DependsOn( typeof(AbpIdentityDomainSharedModule), - typeof(AbpPermissionManagementDomainModule) - )] + typeof(AbpPermissionManagementDomainModule), + typeof(AbpUsersAbstractionModule) +)] public class AbpPermissionManagementDomainIdentityModule : AbpModule { public override void ConfigureServices(ServiceConfigurationContext context) diff --git a/modules/identity/src/Volo.Abp.PermissionManagement.Domain.Identity/Volo/Abp/PermissionManagement/Identity/RoleDeletedEventHandler.cs b/modules/identity/src/Volo.Abp.PermissionManagement.Domain.Identity/Volo/Abp/PermissionManagement/Identity/RoleDeletedEventHandler.cs index 38a9578c9d..cb63b2681a 100644 --- a/modules/identity/src/Volo.Abp.PermissionManagement.Domain.Identity/Volo/Abp/PermissionManagement/Identity/RoleDeletedEventHandler.cs +++ b/modules/identity/src/Volo.Abp.PermissionManagement.Domain.Identity/Volo/Abp/PermissionManagement/Identity/RoleDeletedEventHandler.cs @@ -5,6 +5,7 @@ using Volo.Abp.Domain.Entities.Events.Distributed; using Volo.Abp.EventBus; using Volo.Abp.EventBus.Distributed; using Volo.Abp.Identity; +using Volo.Abp.Uow; namespace Volo.Abp.PermissionManagement.Identity; @@ -19,7 +20,8 @@ public class RoleDeletedEventHandler : PermissionManager = permissionManager; } - public async Task HandleEventAsync(EntityDeletedEto eventData) + [UnitOfWork] + public virtual async Task HandleEventAsync(EntityDeletedEto eventData) { await PermissionManager.DeleteAsync(RolePermissionValueProvider.ProviderName, eventData.Entity.Name); } diff --git a/modules/identity/src/Volo.Abp.PermissionManagement.Domain.Identity/Volo/Abp/PermissionManagement/Identity/UserDeletedEventHandler.cs b/modules/identity/src/Volo.Abp.PermissionManagement.Domain.Identity/Volo/Abp/PermissionManagement/Identity/UserDeletedEventHandler.cs new file mode 100644 index 0000000000..35aaba29ae --- /dev/null +++ b/modules/identity/src/Volo.Abp.PermissionManagement.Domain.Identity/Volo/Abp/PermissionManagement/Identity/UserDeletedEventHandler.cs @@ -0,0 +1,27 @@ +using System.Threading.Tasks; +using Volo.Abp.Authorization.Permissions; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Domain.Entities.Events.Distributed; +using Volo.Abp.EventBus.Distributed; +using Volo.Abp.Uow; +using Volo.Abp.Users; + +namespace Volo.Abp.PermissionManagement.Identity; + +public class UserDeletedEventHandler : + IDistributedEventHandler>, + ITransientDependency +{ + protected IPermissionManager PermissionManager { get; } + + public UserDeletedEventHandler(IPermissionManager permissionManager) + { + PermissionManager = permissionManager; + } + + [UnitOfWork] + public virtual async Task HandleEventAsync(EntityDeletedEto eventData) + { + await PermissionManager.DeleteAsync(UserPermissionValueProvider.ProviderName, eventData.Entity.Id.ToString()); + } +} diff --git a/modules/identity/test/Volo.Abp.Identity.Application.Tests/Volo/Abp/Identity/IdentityRoleAppService_Tests.cs b/modules/identity/test/Volo.Abp.Identity.Application.Tests/Volo/Abp/Identity/IdentityRoleAppService_Tests.cs index d9f6d17523..e413add30c 100644 --- a/modules/identity/test/Volo.Abp.Identity.Application.Tests/Volo/Abp/Identity/IdentityRoleAppService_Tests.cs +++ b/modules/identity/test/Volo.Abp.Identity.Application.Tests/Volo/Abp/Identity/IdentityRoleAppService_Tests.cs @@ -4,6 +4,9 @@ using System.Threading.Tasks; using Xunit; using Shouldly; using Volo.Abp.Application.Dtos; +using Volo.Abp.Authorization.Permissions; +using Volo.Abp.PermissionManagement; +using Volo.Abp.PermissionManagement.Identity; namespace Volo.Abp.Identity; @@ -11,11 +14,14 @@ public class IdentityRoleAppService_Tests : AbpIdentityApplicationTestBase { private readonly IIdentityRoleAppService _roleAppService; private readonly IIdentityRoleRepository _roleRepository; - + private readonly IPermissionManager _permissionManager; + private readonly RolePermissionManagementProvider _rolePermissionManagementProvider; public IdentityRoleAppService_Tests() { _roleAppService = GetRequiredService(); _roleRepository = GetRequiredService(); + _permissionManager = GetRequiredService(); + _rolePermissionManagementProvider = GetRequiredService(); } [Fact] @@ -125,6 +131,20 @@ public class IdentityRoleAppService_Tests : AbpIdentityApplicationTestBase (await FindRoleAsync("moderator")).ShouldBeNull(); } + + [Fact] + public async Task Role_Permissions_Should_Deleted_If_Role_Deleted() + { + var moderator = await GetRoleAsync("moderator"); + + (await _rolePermissionManagementProvider.CheckAsync(IdentityPermissions.Users.Create, RolePermissionValueProvider.ProviderName, moderator.Name)).IsGranted.ShouldBeFalse(); + await _permissionManager.SetForRoleAsync(moderator.Name, IdentityPermissions.Users.Create, true); + (await _rolePermissionManagementProvider.CheckAsync(IdentityPermissions.Users.Create, RolePermissionValueProvider.ProviderName, moderator.Name)).IsGranted.ShouldBeTrue(); + + await _roleAppService.DeleteAsync(moderator.Id); + (await _rolePermissionManagementProvider.CheckAsync(IdentityPermissions.Users.Create, RolePermissionValueProvider.ProviderName, moderator.Name)).IsGranted.ShouldBeFalse(); + } + private async Task GetRoleAsync(string roleName) { return (await _roleRepository.GetListAsync()).First(u => u.Name == roleName); diff --git a/modules/identity/test/Volo.Abp.Identity.Application.Tests/Volo/Abp/Identity/IdentityUserAppService_Tests.cs b/modules/identity/test/Volo.Abp.Identity.Application.Tests/Volo/Abp/Identity/IdentityUserAppService_Tests.cs index 591cefba3c..3272929c3e 100644 --- a/modules/identity/test/Volo.Abp.Identity.Application.Tests/Volo/Abp/Identity/IdentityUserAppService_Tests.cs +++ b/modules/identity/test/Volo.Abp.Identity.Application.Tests/Volo/Abp/Identity/IdentityUserAppService_Tests.cs @@ -1,7 +1,10 @@ using System; using System.Threading.Tasks; using Shouldly; +using Volo.Abp.Authorization.Permissions; using Volo.Abp.Data; +using Volo.Abp.PermissionManagement; +using Volo.Abp.PermissionManagement.Identity; using Xunit; namespace Volo.Abp.Identity; @@ -10,12 +13,16 @@ public class IdentityUserAppService_Tests : AbpIdentityApplicationTestBase { private readonly IIdentityUserAppService _userAppService; private readonly IIdentityUserRepository _userRepository; + private readonly IPermissionManager _permissionManager; + private readonly UserPermissionManagementProvider _userPermissionManagementProvider; private readonly IdentityTestData _testData; public IdentityUserAppService_Tests() { _userAppService = GetRequiredService(); _userRepository = GetRequiredService(); + _permissionManager = GetRequiredService(); + _userPermissionManagementProvider = GetRequiredService(); _testData = GetRequiredService(); } @@ -174,6 +181,19 @@ public class IdentityUserAppService_Tests : AbpIdentityApplicationTestBase FindUser("john.nash").ShouldBeNull(); } + [Fact] + public async Task User_Permissions_Should_Deleted_If_User_Deleted() + { + var johnNash = GetUser("john.nash"); + + (await _userPermissionManagementProvider.CheckAsync(IdentityPermissions.Users.Create, UserPermissionValueProvider.ProviderName, johnNash.Id.ToString())).IsGranted.ShouldBeFalse(); + await _permissionManager.SetForUserAsync(johnNash.Id, IdentityPermissions.Users.Create, true); + (await _userPermissionManagementProvider.CheckAsync(IdentityPermissions.Users.Create, UserPermissionValueProvider.ProviderName, johnNash.Id.ToString())).IsGranted.ShouldBeTrue(); + + await _userAppService.DeleteAsync(johnNash.Id); + (await _userPermissionManagementProvider.CheckAsync(IdentityPermissions.Users.Create, UserPermissionValueProvider.ProviderName, johnNash.Id.ToString())).IsGranted.ShouldBeFalse(); + } + [Fact] public async Task GetRolesAsync() { diff --git a/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/IdentityUserManager_Tests.cs b/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/IdentityUserManager_Tests.cs index 517313abcd..ec29d3d29a 100644 --- a/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/IdentityUserManager_Tests.cs +++ b/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/IdentityUserManager_Tests.cs @@ -1,11 +1,17 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Security.Claims; using System.Threading.Tasks; using Microsoft.AspNetCore.Identity; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.Options; +using NSubstitute; using Shouldly; +using Volo.Abp.EventBus.Distributed; using Volo.Abp.Identity.Settings; +using Volo.Abp.MultiTenancy; using Volo.Abp.Uow; using Xunit; @@ -20,7 +26,11 @@ public class IdentityUserManager_Tests : AbpIdentityDomainTestBase private readonly ILookupNormalizer _lookupNormalizer; private readonly IUnitOfWorkManager _unitOfWorkManager; private readonly IdentityTestData _testData; - protected IOptions _identityOptions { get; } + private readonly ICurrentTenant _currentTenant; + private readonly IOptions _identityOptions; + private readonly IdentityLinkUserManager _identityLinkUserManager; + + private IDistributedEventBus _distributedEventBus { get; set; } public IdentityUserManager_Tests() { @@ -31,7 +41,15 @@ public class IdentityUserManager_Tests : AbpIdentityDomainTestBase _lookupNormalizer = GetRequiredService(); _testData = GetRequiredService(); _unitOfWorkManager = GetRequiredService(); + _currentTenant = GetRequiredService(); _identityOptions = GetRequiredService>(); + _identityLinkUserManager = GetRequiredService(); + } + + protected override void AfterAddApplication(IServiceCollection services) + { + _distributedEventBus = Substitute.For(); + services.Replace(ServiceDescriptor.Singleton(_distributedEventBus)); } [Fact] @@ -249,6 +267,117 @@ public class IdentityUserManager_Tests : AbpIdentityDomainTestBase (await _identityUserManager.ShouldPeriodicallyChangePasswordAsync(user)).ShouldBeTrue(); } + [Fact] + public async Task IdentityUserUserNameChangedEto_Test() + { + var user = CreateRandomUser(); + + (await _identityUserManager.CreateAsync(user)).CheckErrors(); + + await _distributedEventBus.DidNotReceive() + .PublishAsync(Arg.Any(), Arg.Any(), Arg.Any()); + + var newUser = await _identityUserManager.FindByIdAsync(user.Id.ToString()); + newUser.ShouldNotBeNull(); + + using (_currentTenant.Change(Guid.NewGuid())) + { + var oldUsername = newUser.UserName; + await _identityUserManager.SetUserNameAsync(newUser, "newUserName"); + await _distributedEventBus.Received() + .PublishAsync( + Arg.Is(x => + x.Id == newUser.Id && x.TenantId == newUser.TenantId && x.OldUserName == oldUsername && x.UserName == "newUserName"), + Arg.Any(), Arg.Any()); + } + + _distributedEventBus.ClearReceivedCalls(); + await _identityUserManager.SetUserNameAsync(newUser, newUser.UserName); + await _distributedEventBus.DidNotReceive() + .PublishAsync(Arg.Any(), Arg.Any(), Arg.Any()); + } + + [Fact] + public async Task IdentityUserEmailChangedEto_Test() + { + var user = CreateRandomUser(); + + (await _identityUserManager.CreateAsync(user)).CheckErrors(); + + await _distributedEventBus.DidNotReceive() + .PublishAsync(Arg.Any(), Arg.Any(), Arg.Any()); + + var newUser = await _identityUserManager.FindByIdAsync(user.Id.ToString()); + newUser.ShouldNotBeNull(); + + using (_currentTenant.Change(Guid.NewGuid())) + { + var oldEmail = newUser.Email; + await _identityUserManager.SetEmailAsync(newUser, "newEmail@abp.io"); + await _distributedEventBus.Received() + .PublishAsync( + Arg.Is(x => + x.Id == newUser.Id && x.TenantId == newUser.TenantId && x.OldEmail == oldEmail && x.Email == "newEmail@abp.io"), + Arg.Any(), Arg.Any()); + } + + _distributedEventBus.ClearReceivedCalls(); + await _identityUserManager.SetEmailAsync(newUser, newUser.Email); + await _distributedEventBus.DidNotReceive() + .PublishAsync(Arg.Any(), Arg.Any(), Arg.Any()); + } + + [Fact] + public async Task DeleteAsync() + { + await CreateRandomDefaultRoleAsync(); + var user = CreateRandomUser(); + (await _identityUserManager.CreateAsync(user)).CheckErrors(); + + var user2 = CreateRandomUser(); + (await _identityUserManager.CreateAsync(user2)).CheckErrors(); + + using (var uow = _unitOfWorkManager.Begin()) + { + user = await _identityUserManager.FindByIdAsync(user.Id.ToString()); + user.ShouldNotBeNull(); + + await _identityUserManager.AddClaimAsync(user, new Claim("test", "test")); + await _identityUserManager.AddLoginAsync(user, new UserLoginInfo("test", "test", "test")); + await _identityUserManager.AddDefaultRolesAsync(user); + user.SetToken("test", "test", "test"); + var ou = await _organizationUnitRepository.GetAsync(_lookupNormalizer.NormalizeName("OU11")); + await _identityUserManager.AddToOrganizationUnitAsync(user, ou); + await _identityLinkUserManager.LinkAsync(new IdentityLinkUserInfo(user.Id), new IdentityLinkUserInfo(user2.Id)); + + await uow.CompleteAsync(); + } + + using (var uow = _unitOfWorkManager.Begin()) + { + user = await _identityUserManager.FindByIdAsync(user.Id.ToString()); + user.ShouldNotBeNull(); + + user.Claims.Count.ShouldBeGreaterThan(0); + user.Logins.Count.ShouldBeGreaterThan(0); + user.Roles.Count.ShouldBeGreaterThan(0); + user.Tokens.Count.ShouldBeGreaterThan(0); + user.OrganizationUnits.Count.ShouldBeGreaterThan(0); + (await _identityLinkUserManager.IsLinkedAsync(new IdentityLinkUserInfo(user.Id), new IdentityLinkUserInfo(user2.Id))).ShouldBeTrue(); + + await _identityUserManager.DeleteAsync(user); + + user.Claims.Count.ShouldBe(0); + user.Logins.Count.ShouldBe(0); + user.Roles.Count.ShouldBe(0); + user.Tokens.Count.ShouldBe(0); + user.OrganizationUnits.Count.ShouldBe(0); + (await _identityLinkUserManager.IsLinkedAsync(new IdentityLinkUserInfo(user.Id), new IdentityLinkUserInfo(user2.Id))).ShouldBeFalse(); + + await uow.CompleteAsync(); + } + } + private async Task CreateRandomDefaultRoleAsync() { await _identityRoleRepository.InsertAsync( diff --git a/modules/openiddict/app/OpenIddict.Demo.Server/package.json b/modules/openiddict/app/OpenIddict.Demo.Server/package.json index 7fbc0569f6..212b67b1c1 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": "~7.4.0" + "@abp/aspnetcore.mvc.ui.theme.basic": "~7.4.1" } } diff --git a/modules/openiddict/app/angular/package.json b/modules/openiddict/app/angular/package.json index edbd2b95e3..67fe60fb32 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": "~7.4.0", - "@abp/ng.components": "~7.4.0", - "@abp/ng.core": "~7.4.0", - "@abp/ng.oauth": "~7.4.0", - "@abp/ng.identity": "~7.4.0", - "@abp/ng.setting-management": "~7.4.0", - "@abp/ng.tenant-management": "~7.4.0", - "@abp/ng.theme.shared": "~7.4.0", - "@abp/ng.theme.lepton-x": "~2.4.0-rc.4", + "@abp/ng.account": "~7.4.1", + "@abp/ng.components": "~7.4.1", + "@abp/ng.core": "~7.4.1", + "@abp/ng.oauth": "~7.4.1", + "@abp/ng.identity": "~7.4.1", + "@abp/ng.setting-management": "~7.4.1", + "@abp/ng.tenant-management": "~7.4.1", + "@abp/ng.theme.shared": "~7.4.1", + "@abp/ng.theme.lepton-x": "~2.4.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": "~7.4.0", + "@abp/ng.schematics": "~7.4.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/setting-management/app/Volo.Abp.SettingManagement.DemoApp/package.json b/modules/setting-management/app/Volo.Abp.SettingManagement.DemoApp/package.json index 90b3b47088..c8343aff2a 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": "~7.4.0" + "@abp/aspnetcore.mvc.ui.theme.basic": "~7.4.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 9c4c145174..8c3619aab1 100644 --- a/modules/setting-management/app/Volo.Abp.SettingManagement.DemoApp/yarn.lock +++ b/modules/setting-management/app/Volo.Abp.SettingManagement.DemoApp/yarn.lock @@ -2,39 +2,39 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.basic@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-7.4.0.tgz#5088dd82ce343e1123e025848f09b51df988b225" - integrity sha512-teT7I0kgjek/lHzpTg5VOVCQ3IL26nFB43Aa/45fuaSwh9FJd3IJNXGL6xwp85oKaptDYSBXIF4GbrUfp2Ugqg== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~7.4.0" - -"@abp/aspnetcore.mvc.ui.theme.shared@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-7.4.0.tgz#e676444a46214e850b0d916daeeb912774ac381d" - integrity sha512-X+dgdgHGUTyf0zaSPsqQp2ZZWu2+9gIRT4r4/LDgxchHgfNvcKRF8jH/JICcVgGD1adJvZzzDpTefL8CuAIRJA== - dependencies: - "@abp/aspnetcore.mvc.ui" "~7.4.0" - "@abp/bootstrap" "~7.4.0" - "@abp/bootstrap-datepicker" "~7.4.0" - "@abp/bootstrap-daterangepicker" "~7.4.0" - "@abp/datatables.net-bs5" "~7.4.0" - "@abp/font-awesome" "~7.4.0" - "@abp/jquery-form" "~7.4.0" - "@abp/jquery-validation-unobtrusive" "~7.4.0" - "@abp/lodash" "~7.4.0" - "@abp/luxon" "~7.4.0" - "@abp/malihu-custom-scrollbar-plugin" "~7.4.0" - "@abp/moment" "~7.4.0" - "@abp/select2" "~7.4.0" - "@abp/sweetalert2" "~7.4.0" - "@abp/timeago" "~7.4.0" - "@abp/toastr" "~7.4.0" - -"@abp/aspnetcore.mvc.ui@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-7.4.0.tgz#61e1b52d2a940e02242f57007bd3f0fcb583c09a" - integrity sha512-gdoxOBo10DWDYhUq1GVfguC0Ot8PYhoA3VLf88/RatL88BNUUlt0e71uMFcx/gk72fuAE+o9zXn/6nq1wtpSwQ== +"@abp/aspnetcore.mvc.ui.theme.basic@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-7.4.1.tgz#62df78aab8a0b374817fdbab6c6363529b43f925" + integrity sha512-KaPmBlwNjOl1+vwLj5O8J11YHBSRg4y0IIxtgZiculXQNFPHbYAXm8sfTw6Wcsx00STrhvUVJQxYMePNnOTCTg== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~7.4.1" + +"@abp/aspnetcore.mvc.ui.theme.shared@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-7.4.1.tgz#8f8679f5cf80137324ddbec9fcaa67332783e708" + integrity sha512-0uUKuTsi/ikLFUUNEqvrn7KimgsvuK+7m1yZD4o47FQlgGxTyt1zQY9w3K6YyhyC3lsT6qCwiAPIoFOzPkIg/Q== + dependencies: + "@abp/aspnetcore.mvc.ui" "~7.4.1" + "@abp/bootstrap" "~7.4.1" + "@abp/bootstrap-datepicker" "~7.4.1" + "@abp/bootstrap-daterangepicker" "~7.4.1" + "@abp/datatables.net-bs5" "~7.4.1" + "@abp/font-awesome" "~7.4.1" + "@abp/jquery-form" "~7.4.1" + "@abp/jquery-validation-unobtrusive" "~7.4.1" + "@abp/lodash" "~7.4.1" + "@abp/luxon" "~7.4.1" + "@abp/malihu-custom-scrollbar-plugin" "~7.4.1" + "@abp/moment" "~7.4.1" + "@abp/select2" "~7.4.1" + "@abp/sweetalert2" "~7.4.1" + "@abp/timeago" "~7.4.1" + "@abp/toastr" "~7.4.1" + +"@abp/aspnetcore.mvc.ui@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-7.4.1.tgz#49c13718a17569f97b71f978b50f367dff67b8f7" + integrity sha512-EvYrfk0mpSt1jAMZmfFcHoNWEJskzResKp0bflOYsYPsZPuJ5WraKsk4IEEpesYHCyHW5AAb5HBJHeoSbVLh4Q== dependencies: ansi-colors "^4.1.1" extend-object "^1.0.0" @@ -43,158 +43,158 @@ merge-stream "^2.0.0" micromatch "^4.0.2" -"@abp/bootstrap-datepicker@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-7.4.0.tgz#75edc2127ca26d86bfefaa6e37579b06e32de5de" - integrity sha512-HXUa+kLjKu8sKr+kCZeNye9Pv/swRfKGAt/uJ2WUEvCJ4IVIMM1p6iMnOEEk/+3OGE64/PWu3cdE9dLP6izOaA== +"@abp/bootstrap-datepicker@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-7.4.1.tgz#f8f35d0edf71368faaae4e40a72fa846b0084f9b" + integrity sha512-hsu8ty6c2oOevsNoyFTQ4yJAu27qnz82MgRNVS8MRfdzo05/LhBhy/tKFm+PFYJqZULYlpQ1GXUF2+uGyazIeg== dependencies: bootstrap-datepicker "^1.9.0" -"@abp/bootstrap-daterangepicker@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-7.4.0.tgz#5058fc2a9354f0a71ac5393658e362779a3bdc46" - integrity sha512-EK0wzZUY9H3XPb9U3DvYVqh48fU+6IneNGYOk7dcda8CUYObd4Dl1nXligStCqgn2uePtwxDHRx40eV0GXmU/Q== +"@abp/bootstrap-daterangepicker@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-7.4.1.tgz#b133cefdbed0fa1b8f1bda916a9d46952237238a" + integrity sha512-NpmbsO4Xg48Zmr8OOlf1fxuNMnFIqmRrkHiKp9lP5c8am64+7rRzCwATw2UY0Ud+4n8/ws+Iki1dwPQF6db1zw== dependencies: bootstrap-daterangepicker "^3.1.0" -"@abp/bootstrap@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-7.4.0.tgz#71be70660643d8f60d13d355b8c80b16e4854870" - integrity sha512-3Fa+fL5NH+0H2KK4MAaqNsiz0PYwK0+Oxjmd0NgKwcqV2vJzRrzS3WG5kITYjNz9QGdBV+FrhNX/NSRU8LDx3Q== +"@abp/bootstrap@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-7.4.1.tgz#b34a2fcc80e04212865652ee7f4f5498a6a61f6d" + integrity sha512-/qCgfrtNWZ2jui2iL6wd6MLrcxALSEFVBypaz1JK3WjEe7DvFAYvKLl7DugIv039/Sx3mbx/PJiQhx8CVZMsEA== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" bootstrap "^5.1.3" -"@abp/core@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-7.4.0.tgz#8505d446a3b4d80ce476bd3352c1639c7dc486ec" - integrity sha512-yxrnw6eAEIj/CcX5jAwb4xmCsdqWaG+KRcBA8GFvqXbsK94IjqLDiJ3flo+QhGn2DXo40ISxofZop0CgSbP7Ew== +"@abp/core@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-7.4.1.tgz#1d14899ad16aac038806504eb0a5be9318cdcc0c" + integrity sha512-p0BAe2kCtgZmq8pilahmuxmye8DeRXt2KmnFRbmYE3j4d0uComFZpC72QOD1iro8bkmbsHfsHJpiVg4Sp4licw== dependencies: - "@abp/utils" "~7.4.0" + "@abp/utils" "~7.4.1" -"@abp/datatables.net-bs5@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-7.4.0.tgz#52d22e12a2420b402e03148793707d063db0088d" - integrity sha512-VvQv5w0cUpdDD9jX8aUEaLxFrc4A95JlmFnhCYIV1etL8HNOdZvmOThxorsImk31JfpyVYrY/Ze/rnWi2uhVvQ== +"@abp/datatables.net-bs5@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-7.4.1.tgz#821ee4c5db116f9810d65184855cea1fa7d47360" + integrity sha512-jpUzb65lCGYAxs/1qV3pRP8agHwIgZA9gDrudvR8S/3X3kNQWtmeKoFDZ93mhnl3aWPjWFKVrT2LeQeJw5XO5A== dependencies: - "@abp/datatables.net" "~7.4.0" + "@abp/datatables.net" "~7.4.1" datatables.net-bs5 "^1.11.4" -"@abp/datatables.net@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-7.4.0.tgz#9f12a1bb2abd05cd753b5d937d8a0350b2ff74ae" - integrity sha512-StOkMmIkcBUWzD9ToZ5J/hISRWdxbAWjwn7RuFXsoHXcY03mmD86g2oztjrWC5UFnRdpFnsfspTpbNqXFB9Vag== +"@abp/datatables.net@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-7.4.1.tgz#a4501e92e9995da0759b9ce55756fe92c4e8db59" + integrity sha512-BZOOZLH7XrGlX3aFK97cwV9+npsTzALSBo87OgwO2U6UpeFq7yAOvmC0+L9dmIUDISeORn5IFc/zTsSSIQnpHQ== dependencies: - "@abp/jquery" "~7.4.0" + "@abp/jquery" "~7.4.1" datatables.net "^1.11.4" -"@abp/font-awesome@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-7.4.0.tgz#50059083b88706a0f71f55118472b378e4c66163" - integrity sha512-hKoPyM41HHCK6dg+8pQvjYJWzKABBCXrYQAIneMPQZUZqa4JLObKCva9TR7pu6pUp+9OVzg4fQOBM+nwpHtw4g== +"@abp/font-awesome@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-7.4.1.tgz#f6175a989aa64367830723f1dd9c607906716296" + integrity sha512-/ybaz4KROwFdG4Xv0yMTUMXOreDmKy1lKQuntqHEUnIorhXmkgcd5AQQ5AolJ4NmNdPNt1VYrRcTEmdz3nw+FA== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" "@fortawesome/fontawesome-free" "^5.15.4" -"@abp/jquery-form@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-7.4.0.tgz#7ab3be241ee09f1e2843bd1b4d0b0b86d4446e30" - integrity sha512-OmTRuZ7QK1oe2ayNLqEpRJk4Ogk0wt/hIFtJHwQkCtDuCggoR5sQz4vn1vgrD19MxGq07dow5IgjbbhHv1vtEg== +"@abp/jquery-form@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-7.4.1.tgz#67978c41cda204b4c2027d81fc66844379313fa6" + integrity sha512-JZ1D47s/kpTlfMcpD4Jrlh98bhEDsIlWJauvAYaS0EBPIU9V2zHGQ+h9GPFbSPrXe4sYxPSREcsc8KUVMhT5MQ== dependencies: - "@abp/jquery" "~7.4.0" + "@abp/jquery" "~7.4.1" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-7.4.0.tgz#0c564e39c4997dd9b8af7d2023615a06d6fd9834" - integrity sha512-vFB3RKkDlDXbHlDJ64uo3jWW1IRXwiCaPf+mcB77Wpt5+0Dn7eWqjBT7KyHBrsV08ghIqY/Q4nXntFJrmLcuEA== +"@abp/jquery-validation-unobtrusive@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-7.4.1.tgz#fe5c90ade419e83505884dd50dd5988d766f177b" + integrity sha512-oHHV/ukap+vDvQ8CnEWnOrrsLkHXIcMk+SjNKe/dyK5VzOVLDpMatRFmloLs2igYVXTqDGjmDlTswTFdJUarcQ== dependencies: - "@abp/jquery-validation" "~7.4.0" + "@abp/jquery-validation" "~7.4.1" jquery-validation-unobtrusive "^3.2.12" -"@abp/jquery-validation@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-7.4.0.tgz#f2aaba8f4c023e93f0051cc9a05c6d82fa5c7254" - integrity sha512-vN4srLT5UXAKXpKHbZgySWT+N2DjRYivgtifpZHMTGFLMW14W+tfi5zhR4H4JvqJpuO6ZKNiz15zA1zwEBK0Tw== +"@abp/jquery-validation@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-7.4.1.tgz#c2c06bc28770832a9ad73eac000586faed3bdbe3" + integrity sha512-A5iFT2EWfGHXrBb/ov5f0grZ2o2xkDaYtps/FnDUwBYdIdD8E7bbJsWp6ytvZDciO0XmEqAoVOxmiij7ue/SOg== dependencies: - "@abp/jquery" "~7.4.0" + "@abp/jquery" "~7.4.1" jquery-validation "^1.19.3" -"@abp/jquery@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-7.4.0.tgz#206891b20f250537d05d907d2b6cd682fec76496" - integrity sha512-DeYo02T6WVhdpLloSPb6ooqtpksu1HtcbbQhIP9E1P7jHSzZoNiJvoKXHiFUcj5PYiGKl9d/o89hM/apWzyreQ== +"@abp/jquery@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-7.4.1.tgz#b5e16834e6c7871ad6392612ac8e2de8617eb353" + integrity sha512-X3RcovvRYISHcsb6W3U3iVsofw6yomoiouoB1tSIy2/tvUbu9n7N/3MM0CUujFm/xib7s3z1tVxFssS9smT7sw== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" jquery "~3.6.0" -"@abp/lodash@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-7.4.0.tgz#93f20abee776dbfa7aa45e2e710f2768f262fda5" - integrity sha512-h4Fnjm+VLwp1F3r57B9MrHhwyOYMo5oP285a85zzAYLkhwcDy7f1nbHKHMQ3ZTaeJVmiRnVaH+3sdUdslCRt5g== +"@abp/lodash@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-7.4.1.tgz#d0f84b7b9cbd989d59ebde594ed7acb8bc720b61" + integrity sha512-RFjZCyAPZnpvT0SJbxXzzmMYbuocSWBlezvjAVA8MiTrOXdZO4VyaTFjIuQcAdSrZhtpFGeYWxAjHshVplxMbw== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" lodash "^4.17.21" -"@abp/luxon@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-7.4.0.tgz#2ba7ff307c8f7c24d818a9c33635b86fd6810db9" - integrity sha512-ROCx7aihM+agdYy7Tkz+GiScx68KY5qwGTnj8P7QabGFChzVUic6RuBG+2Obmfonc6uT7Rq0c8JDGrsGNe/w8A== +"@abp/luxon@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-7.4.1.tgz#e0c0947d2b77f98b9cdaf7d1143025879361c3c9" + integrity sha512-k1wh8tT1529MtNC2gSXEIKdimBXBwubXeLisgpIPx6lkJo1Op6pAz2ERwFXeyktqGdYyuFcnewJIxmS7EPtWhg== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" luxon "^2.3.0" -"@abp/malihu-custom-scrollbar-plugin@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-7.4.0.tgz#aba68877481f4339e048f2ae3cfbe93197145a0a" - integrity sha512-Ntodhi4k0HFQmImYTP5SYf/WDm7aUGJLaGsfePm77HJ6DhGgalIGqtM8NiFXzo/3GmMY0XSo8Wxrs1mSCdtsOA== +"@abp/malihu-custom-scrollbar-plugin@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-7.4.1.tgz#aa7ec247197a258277549052780b38fd9e748c6c" + integrity sha512-pm/wIaiRSgGxelOf8AiL4JKFNZOQ6s2WbR6pULiP2HSNCgCpWYJ2s8fvj7VP3lAHIa98v3m8PSMSUhqaANxZ/Q== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/moment@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-7.4.0.tgz#2490d9c7cdcaeca8d0ba9ebef5e7298caf0c9e09" - integrity sha512-ftsUEgO17GbVawA1GplGFzEeIM4NX004AmS6/fPI3o5isX7o1buF9q9TXdnwUuFEJKZxS4KpveRqzTL5t9k0BQ== +"@abp/moment@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-7.4.1.tgz#1c28ccb13eecdd13695edf8641ca9867b318e37d" + integrity sha512-7vRJyAK5ER9z+LV1xUSAAtWlPlhv8yhM/nHjhC+IQSP/+V1D7VLA6EKxAEexGw7wX6HY8oMOWP9HxDHMb5hKQA== dependencies: moment "^2.9.0" -"@abp/select2@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-7.4.0.tgz#2f455cc991b7bb4df9ed426097bc2996cac12697" - integrity sha512-DwprX4MIoqMzSdh7eFg7EjGIz4ftYZub6jG9Sk3r+sxabbhpbFTxKOpXnhBWYi7L7uTQ8YDFk/5NeXO+Rm50Ww== +"@abp/select2@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-7.4.1.tgz#d7ea53cfec285a06278db362131b7510d5b73900" + integrity sha512-0S66iy7HuB74qqOSDraoF7UvXqz2PrnOKy+3EYMTMskOn4pWaq03JMR8xxEgZ8CtmsrqlE1a4wt1Yt9b3FIc0w== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" select2 "^4.0.13" -"@abp/sweetalert2@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-7.4.0.tgz#db1b4bd45cbabd61172591abc8ce223b5f607c4e" - integrity sha512-XqHPRnTASaRtbJIZYKW1KSKIJ8tynL8DuPCSMjcp4iyUlk+gnzxvbqXeNVjc2ojxj78T/42M/vITNoiiTYuKUw== +"@abp/sweetalert2@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-7.4.1.tgz#6722a40e5115cc341b7543aa0fa3b5a7ae9515b2" + integrity sha512-9jAHrYqCp5qykYfNNbqgESL6egixofVwonjZlb+lLWHAkIX+gQ2ApUNDFSXPtKUh2n9sXhSfF8SSg+BHP/bkCA== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" sweetalert2 "^11.3.6" -"@abp/timeago@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-7.4.0.tgz#245fe09370f38311a67a594c8a3c884aea59cc90" - integrity sha512-khxK6EICUaGCUM1HkACw/8rlPQNssoQvCK64bNqEHBCXgPUmTcqSj5MEGiNOYbgGyWeH2IAMtJEYPqX1g1wqSA== +"@abp/timeago@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-7.4.1.tgz#243d342ba131878ae7f892909c9cae07cf54902b" + integrity sha512-a0Vl2NFwTxzRmH5akWo8BRUxa6sK72z8OoXwUFkZOUqMWBCHK7ffNiN1/fbSgA+7HpSZdDvIthjYwBt57DxLdQ== dependencies: - "@abp/jquery" "~7.4.0" + "@abp/jquery" "~7.4.1" timeago "^1.6.7" -"@abp/toastr@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-7.4.0.tgz#16ba0414a27c9a21bc7556a078b175445edcf608" - integrity sha512-oM4HT2m95cK/9sB4AEQAKUMSGBep6wZTgM/46+o2IvvMdMPrGR2mPu9V9wi3y817FRgY+/qQTfy5TZWyTuIpVQ== +"@abp/toastr@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-7.4.1.tgz#345545a41b6145e54477c6c376193a6dbd62bdda" + integrity sha512-OLCvPJYSrcT2spcq9nO838Q22VhJ63Kdzasz1HugdVNqgcFCCSsqaoXrJGUcf5GrZx7PNloz7uf1I3txYMeZtA== dependencies: - "@abp/jquery" "~7.4.0" + "@abp/jquery" "~7.4.1" toastr "^2.1.4" -"@abp/utils@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-7.4.0.tgz#b31fb6e5dff07463535479a6bb62dc733d7119c8" - integrity sha512-CcR3tfuEsVM60DYL1A0cH6BkUTsasOoBDv/b63uLCoEOq/g8ntelD/SpRSgfDXK74P9M8OE5ZFxlXWDiYuzAFg== +"@abp/utils@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-7.4.1.tgz#2ce4c4d659c2ae9bc23b71b79fa3c6e120eaecaf" + integrity sha512-eFeoOXcz9cVkDKpOfd2VWmpAojASfsqfvACZqi1UmF16OcjsFIkxmIvhh1fpbT4A+eQLbaFFLIsf6gYb//tXhg== dependencies: just-compare "^2.3.0" diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Application/Volo.Abp.SettingManagement.Application.csproj b/modules/setting-management/src/Volo.Abp.SettingManagement.Application/Volo.Abp.SettingManagement.Application.csproj index 2f911062df..cf94e76ffd 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Application/Volo.Abp.SettingManagement.Application.csproj +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Application/Volo.Abp.SettingManagement.Application.csproj @@ -13,6 +13,7 @@ + diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Application/Volo/Abp/SettingManagement/AbpSettingManagementApplicationModule.cs b/modules/setting-management/src/Volo.Abp.SettingManagement.Application/Volo/Abp/SettingManagement/AbpSettingManagementApplicationModule.cs index 6e9c5704de..47a13dfd23 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Application/Volo/Abp/SettingManagement/AbpSettingManagementApplicationModule.cs +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Application/Volo/Abp/SettingManagement/AbpSettingManagementApplicationModule.cs @@ -2,6 +2,7 @@ using Volo.Abp.Emailing; using Volo.Abp.Modularity; using Volo.Abp.Timing; +using Volo.Abp.Users; namespace Volo.Abp.SettingManagement; @@ -10,7 +11,8 @@ namespace Volo.Abp.SettingManagement; typeof(AbpSettingManagementDomainModule), typeof(AbpSettingManagementApplicationContractsModule), typeof(AbpEmailingModule), - typeof(AbpTimingModule) + typeof(AbpTimingModule), + typeof(AbpUsersAbstractionModule) )] public class AbpSettingManagementApplicationModule : AbpModule { diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Application/Volo/Abp/SettingManagement/UserDeletedEventHandler.cs b/modules/setting-management/src/Volo.Abp.SettingManagement.Application/Volo/Abp/SettingManagement/UserDeletedEventHandler.cs new file mode 100644 index 0000000000..d54b94d8da --- /dev/null +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Application/Volo/Abp/SettingManagement/UserDeletedEventHandler.cs @@ -0,0 +1,27 @@ +using System.Threading.Tasks; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Domain.Entities.Events.Distributed; +using Volo.Abp.EventBus.Distributed; +using Volo.Abp.Settings; +using Volo.Abp.Uow; +using Volo.Abp.Users; + +namespace Volo.Abp.SettingManagement; + +public class UserDeletedEventHandler : + IDistributedEventHandler>, + ITransientDependency +{ + protected ISettingManager SettingManager { get; } + + public UserDeletedEventHandler(ISettingManager settingManager) + { + SettingManager = settingManager; + } + + [UnitOfWork] + public virtual async Task HandleEventAsync(EntityDeletedEto eventData) + { + await SettingManager.DeleteAsync(UserSettingValueProvider.ProviderName, eventData.Entity.Id.ToString()); + } +} diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/zh-Hans.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/zh-Hans.json index d229235563..0d1b0226ab 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/zh-Hans.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/zh-Hans.json @@ -25,7 +25,7 @@ "SmtpPassword": "密码", "SmtpDomain": "域", "SmtpEnableSsl": "启用ssl", - "SmtpUseDefaultCredentials": "使用默认证书", + "SmtpUseDefaultCredentials": "使用默认凭据", "DefaultFromAddress": "默认发件人", "DefaultFromDisplayName": "默认显示名称", "Feature:SettingManagementGroup": "设置管理", diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/ISettingManager.cs b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/ISettingManager.cs index a907ca2d66..9b718b01c1 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/ISettingManager.cs +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/ISettingManager.cs @@ -12,4 +12,6 @@ public interface ISettingManager Task> GetAllAsync([NotNull] string providerName, [CanBeNull] string providerKey, bool fallback = true); Task SetAsync([NotNull] string name, [CanBeNull] string value, [NotNull] string providerName, [CanBeNull] string providerKey, bool forceToSet = false); + + Task DeleteAsync(string providerName, string providerKey); } diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/SettingManager.cs b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/SettingManager.cs index 800f2140f5..5439c1213a 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/SettingManager.cs +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/SettingManager.cs @@ -13,6 +13,7 @@ public class SettingManager : ISettingManager, ISingletonDependency { protected ISettingDefinitionManager SettingDefinitionManager { get; } protected ISettingEncryptionService SettingEncryptionService { get; } + protected ISettingManagementStore SettingManagementStore { get; } protected List Providers => _lazyProviders.Value; protected SettingManagementOptions Options { get; } private readonly Lazy> _lazyProviders; @@ -21,10 +22,12 @@ public class SettingManager : ISettingManager, ISingletonDependency IOptions options, IServiceProvider serviceProvider, ISettingDefinitionManager settingDefinitionManager, - ISettingEncryptionService settingEncryptionService) + ISettingEncryptionService settingEncryptionService, + ISettingManagementStore settingManagementStore) { SettingDefinitionManager = settingDefinitionManager; SettingEncryptionService = settingEncryptionService; + SettingManagementStore = settingManagementStore; Options = options.Value; //TODO: Instead, use IServiceScopeFactory and create a scope..? @@ -160,6 +163,15 @@ public class SettingManager : ISettingManager, ISingletonDependency } } + public virtual async Task DeleteAsync(string providerName, string providerKey) + { + var settings = await SettingManagementStore.GetListAsync(providerName, providerKey); + foreach (var setting in settings) + { + await SettingManagementStore.DeleteAsync(setting.Name, providerName, providerKey); + } + } + protected virtual async Task GetOrNullInternalAsync(string name, string providerName, string providerKey, bool fallback = true) { var setting = await SettingDefinitionManager.GetAsync(name); diff --git a/modules/setting-management/test/Volo.Abp.SettingManagement.Tests/Volo/Abp/SettingManagement/SettingManager_User_Tests.cs b/modules/setting-management/test/Volo.Abp.SettingManagement.Tests/Volo/Abp/SettingManagement/SettingManager_User_Tests.cs index c99ff97ac1..b3f97688b1 100644 --- a/modules/setting-management/test/Volo.Abp.SettingManagement.Tests/Volo/Abp/SettingManagement/SettingManager_User_Tests.cs +++ b/modules/setting-management/test/Volo.Abp.SettingManagement.Tests/Volo/Abp/SettingManagement/SettingManager_User_Tests.cs @@ -186,4 +186,16 @@ public class SettingManager_User_Tests : SettingsTestBase (await _settingManager.GetOrNullForUserAsync("MySettingWithoutInherit", _testData.User2Id)).ShouldBeNull(); //Does not inherit! (await _settingManager.GetOrNullGlobalAsync("MySettingWithoutInherit")).ShouldBe("default-store-value"); } + + [Fact] + public async Task DeleteAsync() + { + (await _settingManager.GetOrNullForUserAsync("MySetting2", _testData.User1Id)).ShouldBe("user1-store-value"); + (await _settingManager.GetOrNullForUserAsync("MySettingWithoutInherit", _testData.User1Id)).ShouldBe("user1-store-value"); + + await _settingManager.DeleteAsync(UserSettingValueProvider.ProviderName, _testData.User1Id.ToString()); + + (await _settingManager.GetOrNullForUserAsync("MySetting2", _testData.User1Id)).ShouldNotBe("user1-store-value"); + (await _settingManager.GetOrNullForUserAsync("MySettingWithoutInherit", _testData.User1Id)).ShouldNotBe("user1-store-value"); + } } 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 27a4565870..f051a7f998 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": "~7.4.0", - "@abp/virtual-file-explorer": "~7.4.0" + "@abp/aspnetcore.mvc.ui.theme.basic": "~7.4.1", + "@abp/virtual-file-explorer": "~7.4.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 7f768e6d3a..bb5e53de55 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,39 +2,39 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.basic@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-7.4.0.tgz#5088dd82ce343e1123e025848f09b51df988b225" - integrity sha512-teT7I0kgjek/lHzpTg5VOVCQ3IL26nFB43Aa/45fuaSwh9FJd3IJNXGL6xwp85oKaptDYSBXIF4GbrUfp2Ugqg== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~7.4.0" - -"@abp/aspnetcore.mvc.ui.theme.shared@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-7.4.0.tgz#e676444a46214e850b0d916daeeb912774ac381d" - integrity sha512-X+dgdgHGUTyf0zaSPsqQp2ZZWu2+9gIRT4r4/LDgxchHgfNvcKRF8jH/JICcVgGD1adJvZzzDpTefL8CuAIRJA== - dependencies: - "@abp/aspnetcore.mvc.ui" "~7.4.0" - "@abp/bootstrap" "~7.4.0" - "@abp/bootstrap-datepicker" "~7.4.0" - "@abp/bootstrap-daterangepicker" "~7.4.0" - "@abp/datatables.net-bs5" "~7.4.0" - "@abp/font-awesome" "~7.4.0" - "@abp/jquery-form" "~7.4.0" - "@abp/jquery-validation-unobtrusive" "~7.4.0" - "@abp/lodash" "~7.4.0" - "@abp/luxon" "~7.4.0" - "@abp/malihu-custom-scrollbar-plugin" "~7.4.0" - "@abp/moment" "~7.4.0" - "@abp/select2" "~7.4.0" - "@abp/sweetalert2" "~7.4.0" - "@abp/timeago" "~7.4.0" - "@abp/toastr" "~7.4.0" - -"@abp/aspnetcore.mvc.ui@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-7.4.0.tgz#61e1b52d2a940e02242f57007bd3f0fcb583c09a" - integrity sha512-gdoxOBo10DWDYhUq1GVfguC0Ot8PYhoA3VLf88/RatL88BNUUlt0e71uMFcx/gk72fuAE+o9zXn/6nq1wtpSwQ== +"@abp/aspnetcore.mvc.ui.theme.basic@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-7.4.1.tgz#62df78aab8a0b374817fdbab6c6363529b43f925" + integrity sha512-KaPmBlwNjOl1+vwLj5O8J11YHBSRg4y0IIxtgZiculXQNFPHbYAXm8sfTw6Wcsx00STrhvUVJQxYMePNnOTCTg== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~7.4.1" + +"@abp/aspnetcore.mvc.ui.theme.shared@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-7.4.1.tgz#8f8679f5cf80137324ddbec9fcaa67332783e708" + integrity sha512-0uUKuTsi/ikLFUUNEqvrn7KimgsvuK+7m1yZD4o47FQlgGxTyt1zQY9w3K6YyhyC3lsT6qCwiAPIoFOzPkIg/Q== + dependencies: + "@abp/aspnetcore.mvc.ui" "~7.4.1" + "@abp/bootstrap" "~7.4.1" + "@abp/bootstrap-datepicker" "~7.4.1" + "@abp/bootstrap-daterangepicker" "~7.4.1" + "@abp/datatables.net-bs5" "~7.4.1" + "@abp/font-awesome" "~7.4.1" + "@abp/jquery-form" "~7.4.1" + "@abp/jquery-validation-unobtrusive" "~7.4.1" + "@abp/lodash" "~7.4.1" + "@abp/luxon" "~7.4.1" + "@abp/malihu-custom-scrollbar-plugin" "~7.4.1" + "@abp/moment" "~7.4.1" + "@abp/select2" "~7.4.1" + "@abp/sweetalert2" "~7.4.1" + "@abp/timeago" "~7.4.1" + "@abp/toastr" "~7.4.1" + +"@abp/aspnetcore.mvc.ui@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-7.4.1.tgz#49c13718a17569f97b71f978b50f367dff67b8f7" + integrity sha512-EvYrfk0mpSt1jAMZmfFcHoNWEJskzResKp0bflOYsYPsZPuJ5WraKsk4IEEpesYHCyHW5AAb5HBJHeoSbVLh4Q== dependencies: ansi-colors "^4.1.1" extend-object "^1.0.0" @@ -43,185 +43,185 @@ merge-stream "^2.0.0" micromatch "^4.0.2" -"@abp/bootstrap-datepicker@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-7.4.0.tgz#75edc2127ca26d86bfefaa6e37579b06e32de5de" - integrity sha512-HXUa+kLjKu8sKr+kCZeNye9Pv/swRfKGAt/uJ2WUEvCJ4IVIMM1p6iMnOEEk/+3OGE64/PWu3cdE9dLP6izOaA== +"@abp/bootstrap-datepicker@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-7.4.1.tgz#f8f35d0edf71368faaae4e40a72fa846b0084f9b" + integrity sha512-hsu8ty6c2oOevsNoyFTQ4yJAu27qnz82MgRNVS8MRfdzo05/LhBhy/tKFm+PFYJqZULYlpQ1GXUF2+uGyazIeg== dependencies: bootstrap-datepicker "^1.9.0" -"@abp/bootstrap-daterangepicker@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-7.4.0.tgz#5058fc2a9354f0a71ac5393658e362779a3bdc46" - integrity sha512-EK0wzZUY9H3XPb9U3DvYVqh48fU+6IneNGYOk7dcda8CUYObd4Dl1nXligStCqgn2uePtwxDHRx40eV0GXmU/Q== +"@abp/bootstrap-daterangepicker@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-7.4.1.tgz#b133cefdbed0fa1b8f1bda916a9d46952237238a" + integrity sha512-NpmbsO4Xg48Zmr8OOlf1fxuNMnFIqmRrkHiKp9lP5c8am64+7rRzCwATw2UY0Ud+4n8/ws+Iki1dwPQF6db1zw== dependencies: bootstrap-daterangepicker "^3.1.0" -"@abp/bootstrap@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-7.4.0.tgz#71be70660643d8f60d13d355b8c80b16e4854870" - integrity sha512-3Fa+fL5NH+0H2KK4MAaqNsiz0PYwK0+Oxjmd0NgKwcqV2vJzRrzS3WG5kITYjNz9QGdBV+FrhNX/NSRU8LDx3Q== +"@abp/bootstrap@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-7.4.1.tgz#b34a2fcc80e04212865652ee7f4f5498a6a61f6d" + integrity sha512-/qCgfrtNWZ2jui2iL6wd6MLrcxALSEFVBypaz1JK3WjEe7DvFAYvKLl7DugIv039/Sx3mbx/PJiQhx8CVZMsEA== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" bootstrap "^5.1.3" -"@abp/clipboard@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-7.4.0.tgz#f1d147df94ddf3ab53eeeb05aec3d5556064c5d6" - integrity sha512-z/nB1RQN/tmShSRwc9Fv1DsJSNM7+Zg4GnAtvZNpOHJp8LTVmsJWxLoUM7hF896W9E0JKr8tRuCVqulyh3IqKg== +"@abp/clipboard@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-7.4.1.tgz#31329ad4565b5075b486e9ca63fb0ff8a070ff9e" + integrity sha512-/+ylBPs/TEZdwywSSTnj96WoRJPwQnR6vlI+sX7h9wDfSDbMwuSSdETSnDVT21lkl8gonPONFZTL8D1u/KKAhg== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" clipboard "^2.0.8" -"@abp/core@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-7.4.0.tgz#8505d446a3b4d80ce476bd3352c1639c7dc486ec" - integrity sha512-yxrnw6eAEIj/CcX5jAwb4xmCsdqWaG+KRcBA8GFvqXbsK94IjqLDiJ3flo+QhGn2DXo40ISxofZop0CgSbP7Ew== +"@abp/core@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-7.4.1.tgz#1d14899ad16aac038806504eb0a5be9318cdcc0c" + integrity sha512-p0BAe2kCtgZmq8pilahmuxmye8DeRXt2KmnFRbmYE3j4d0uComFZpC72QOD1iro8bkmbsHfsHJpiVg4Sp4licw== dependencies: - "@abp/utils" "~7.4.0" + "@abp/utils" "~7.4.1" -"@abp/datatables.net-bs5@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-7.4.0.tgz#52d22e12a2420b402e03148793707d063db0088d" - integrity sha512-VvQv5w0cUpdDD9jX8aUEaLxFrc4A95JlmFnhCYIV1etL8HNOdZvmOThxorsImk31JfpyVYrY/Ze/rnWi2uhVvQ== +"@abp/datatables.net-bs5@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-7.4.1.tgz#821ee4c5db116f9810d65184855cea1fa7d47360" + integrity sha512-jpUzb65lCGYAxs/1qV3pRP8agHwIgZA9gDrudvR8S/3X3kNQWtmeKoFDZ93mhnl3aWPjWFKVrT2LeQeJw5XO5A== dependencies: - "@abp/datatables.net" "~7.4.0" + "@abp/datatables.net" "~7.4.1" datatables.net-bs5 "^1.11.4" -"@abp/datatables.net@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-7.4.0.tgz#9f12a1bb2abd05cd753b5d937d8a0350b2ff74ae" - integrity sha512-StOkMmIkcBUWzD9ToZ5J/hISRWdxbAWjwn7RuFXsoHXcY03mmD86g2oztjrWC5UFnRdpFnsfspTpbNqXFB9Vag== +"@abp/datatables.net@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-7.4.1.tgz#a4501e92e9995da0759b9ce55756fe92c4e8db59" + integrity sha512-BZOOZLH7XrGlX3aFK97cwV9+npsTzALSBo87OgwO2U6UpeFq7yAOvmC0+L9dmIUDISeORn5IFc/zTsSSIQnpHQ== dependencies: - "@abp/jquery" "~7.4.0" + "@abp/jquery" "~7.4.1" datatables.net "^1.11.4" -"@abp/font-awesome@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-7.4.0.tgz#50059083b88706a0f71f55118472b378e4c66163" - integrity sha512-hKoPyM41HHCK6dg+8pQvjYJWzKABBCXrYQAIneMPQZUZqa4JLObKCva9TR7pu6pUp+9OVzg4fQOBM+nwpHtw4g== +"@abp/font-awesome@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-7.4.1.tgz#f6175a989aa64367830723f1dd9c607906716296" + integrity sha512-/ybaz4KROwFdG4Xv0yMTUMXOreDmKy1lKQuntqHEUnIorhXmkgcd5AQQ5AolJ4NmNdPNt1VYrRcTEmdz3nw+FA== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" "@fortawesome/fontawesome-free" "^5.15.4" -"@abp/jquery-form@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-7.4.0.tgz#7ab3be241ee09f1e2843bd1b4d0b0b86d4446e30" - integrity sha512-OmTRuZ7QK1oe2ayNLqEpRJk4Ogk0wt/hIFtJHwQkCtDuCggoR5sQz4vn1vgrD19MxGq07dow5IgjbbhHv1vtEg== +"@abp/jquery-form@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-7.4.1.tgz#67978c41cda204b4c2027d81fc66844379313fa6" + integrity sha512-JZ1D47s/kpTlfMcpD4Jrlh98bhEDsIlWJauvAYaS0EBPIU9V2zHGQ+h9GPFbSPrXe4sYxPSREcsc8KUVMhT5MQ== dependencies: - "@abp/jquery" "~7.4.0" + "@abp/jquery" "~7.4.1" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-7.4.0.tgz#0c564e39c4997dd9b8af7d2023615a06d6fd9834" - integrity sha512-vFB3RKkDlDXbHlDJ64uo3jWW1IRXwiCaPf+mcB77Wpt5+0Dn7eWqjBT7KyHBrsV08ghIqY/Q4nXntFJrmLcuEA== +"@abp/jquery-validation-unobtrusive@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-7.4.1.tgz#fe5c90ade419e83505884dd50dd5988d766f177b" + integrity sha512-oHHV/ukap+vDvQ8CnEWnOrrsLkHXIcMk+SjNKe/dyK5VzOVLDpMatRFmloLs2igYVXTqDGjmDlTswTFdJUarcQ== dependencies: - "@abp/jquery-validation" "~7.4.0" + "@abp/jquery-validation" "~7.4.1" jquery-validation-unobtrusive "^3.2.12" -"@abp/jquery-validation@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-7.4.0.tgz#f2aaba8f4c023e93f0051cc9a05c6d82fa5c7254" - integrity sha512-vN4srLT5UXAKXpKHbZgySWT+N2DjRYivgtifpZHMTGFLMW14W+tfi5zhR4H4JvqJpuO6ZKNiz15zA1zwEBK0Tw== +"@abp/jquery-validation@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-7.4.1.tgz#c2c06bc28770832a9ad73eac000586faed3bdbe3" + integrity sha512-A5iFT2EWfGHXrBb/ov5f0grZ2o2xkDaYtps/FnDUwBYdIdD8E7bbJsWp6ytvZDciO0XmEqAoVOxmiij7ue/SOg== dependencies: - "@abp/jquery" "~7.4.0" + "@abp/jquery" "~7.4.1" jquery-validation "^1.19.3" -"@abp/jquery@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-7.4.0.tgz#206891b20f250537d05d907d2b6cd682fec76496" - integrity sha512-DeYo02T6WVhdpLloSPb6ooqtpksu1HtcbbQhIP9E1P7jHSzZoNiJvoKXHiFUcj5PYiGKl9d/o89hM/apWzyreQ== +"@abp/jquery@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-7.4.1.tgz#b5e16834e6c7871ad6392612ac8e2de8617eb353" + integrity sha512-X3RcovvRYISHcsb6W3U3iVsofw6yomoiouoB1tSIy2/tvUbu9n7N/3MM0CUujFm/xib7s3z1tVxFssS9smT7sw== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" jquery "~3.6.0" -"@abp/lodash@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-7.4.0.tgz#93f20abee776dbfa7aa45e2e710f2768f262fda5" - integrity sha512-h4Fnjm+VLwp1F3r57B9MrHhwyOYMo5oP285a85zzAYLkhwcDy7f1nbHKHMQ3ZTaeJVmiRnVaH+3sdUdslCRt5g== +"@abp/lodash@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-7.4.1.tgz#d0f84b7b9cbd989d59ebde594ed7acb8bc720b61" + integrity sha512-RFjZCyAPZnpvT0SJbxXzzmMYbuocSWBlezvjAVA8MiTrOXdZO4VyaTFjIuQcAdSrZhtpFGeYWxAjHshVplxMbw== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" lodash "^4.17.21" -"@abp/luxon@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-7.4.0.tgz#2ba7ff307c8f7c24d818a9c33635b86fd6810db9" - integrity sha512-ROCx7aihM+agdYy7Tkz+GiScx68KY5qwGTnj8P7QabGFChzVUic6RuBG+2Obmfonc6uT7Rq0c8JDGrsGNe/w8A== +"@abp/luxon@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-7.4.1.tgz#e0c0947d2b77f98b9cdaf7d1143025879361c3c9" + integrity sha512-k1wh8tT1529MtNC2gSXEIKdimBXBwubXeLisgpIPx6lkJo1Op6pAz2ERwFXeyktqGdYyuFcnewJIxmS7EPtWhg== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" luxon "^2.3.0" -"@abp/malihu-custom-scrollbar-plugin@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-7.4.0.tgz#aba68877481f4339e048f2ae3cfbe93197145a0a" - integrity sha512-Ntodhi4k0HFQmImYTP5SYf/WDm7aUGJLaGsfePm77HJ6DhGgalIGqtM8NiFXzo/3GmMY0XSo8Wxrs1mSCdtsOA== +"@abp/malihu-custom-scrollbar-plugin@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-7.4.1.tgz#aa7ec247197a258277549052780b38fd9e748c6c" + integrity sha512-pm/wIaiRSgGxelOf8AiL4JKFNZOQ6s2WbR6pULiP2HSNCgCpWYJ2s8fvj7VP3lAHIa98v3m8PSMSUhqaANxZ/Q== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/moment@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-7.4.0.tgz#2490d9c7cdcaeca8d0ba9ebef5e7298caf0c9e09" - integrity sha512-ftsUEgO17GbVawA1GplGFzEeIM4NX004AmS6/fPI3o5isX7o1buF9q9TXdnwUuFEJKZxS4KpveRqzTL5t9k0BQ== +"@abp/moment@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-7.4.1.tgz#1c28ccb13eecdd13695edf8641ca9867b318e37d" + integrity sha512-7vRJyAK5ER9z+LV1xUSAAtWlPlhv8yhM/nHjhC+IQSP/+V1D7VLA6EKxAEexGw7wX6HY8oMOWP9HxDHMb5hKQA== dependencies: moment "^2.9.0" -"@abp/prismjs@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-7.4.0.tgz#8572f36f853c7054d77d02f3098cd844ee321ed7" - integrity sha512-y/Iy6pddQeVazEITktPot8JOPdAEOVAfmYkTBP3DIIPvoYr3kf6rwfzBUalMw5CEjWZ9BaIszDgFCk5ucNHHwQ== +"@abp/prismjs@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-7.4.1.tgz#df4387dbc2f0c77ddb9b6bd0ade9a5db29b9cee2" + integrity sha512-bI7pEKWy32aRYSb2ZziiH6Teebyd8km+1TXADy1yks9i9G5eLWe4/CSdwWpI4M+8ggM8CsdhrZ6/U+55BpXPQA== dependencies: - "@abp/clipboard" "~7.4.0" - "@abp/core" "~7.4.0" + "@abp/clipboard" "~7.4.1" + "@abp/core" "~7.4.1" prismjs "^1.26.0" -"@abp/select2@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-7.4.0.tgz#2f455cc991b7bb4df9ed426097bc2996cac12697" - integrity sha512-DwprX4MIoqMzSdh7eFg7EjGIz4ftYZub6jG9Sk3r+sxabbhpbFTxKOpXnhBWYi7L7uTQ8YDFk/5NeXO+Rm50Ww== +"@abp/select2@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-7.4.1.tgz#d7ea53cfec285a06278db362131b7510d5b73900" + integrity sha512-0S66iy7HuB74qqOSDraoF7UvXqz2PrnOKy+3EYMTMskOn4pWaq03JMR8xxEgZ8CtmsrqlE1a4wt1Yt9b3FIc0w== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" select2 "^4.0.13" -"@abp/sweetalert2@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-7.4.0.tgz#db1b4bd45cbabd61172591abc8ce223b5f607c4e" - integrity sha512-XqHPRnTASaRtbJIZYKW1KSKIJ8tynL8DuPCSMjcp4iyUlk+gnzxvbqXeNVjc2ojxj78T/42M/vITNoiiTYuKUw== +"@abp/sweetalert2@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-7.4.1.tgz#6722a40e5115cc341b7543aa0fa3b5a7ae9515b2" + integrity sha512-9jAHrYqCp5qykYfNNbqgESL6egixofVwonjZlb+lLWHAkIX+gQ2ApUNDFSXPtKUh2n9sXhSfF8SSg+BHP/bkCA== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" sweetalert2 "^11.3.6" -"@abp/timeago@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-7.4.0.tgz#245fe09370f38311a67a594c8a3c884aea59cc90" - integrity sha512-khxK6EICUaGCUM1HkACw/8rlPQNssoQvCK64bNqEHBCXgPUmTcqSj5MEGiNOYbgGyWeH2IAMtJEYPqX1g1wqSA== +"@abp/timeago@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-7.4.1.tgz#243d342ba131878ae7f892909c9cae07cf54902b" + integrity sha512-a0Vl2NFwTxzRmH5akWo8BRUxa6sK72z8OoXwUFkZOUqMWBCHK7ffNiN1/fbSgA+7HpSZdDvIthjYwBt57DxLdQ== dependencies: - "@abp/jquery" "~7.4.0" + "@abp/jquery" "~7.4.1" timeago "^1.6.7" -"@abp/toastr@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-7.4.0.tgz#16ba0414a27c9a21bc7556a078b175445edcf608" - integrity sha512-oM4HT2m95cK/9sB4AEQAKUMSGBep6wZTgM/46+o2IvvMdMPrGR2mPu9V9wi3y817FRgY+/qQTfy5TZWyTuIpVQ== +"@abp/toastr@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-7.4.1.tgz#345545a41b6145e54477c6c376193a6dbd62bdda" + integrity sha512-OLCvPJYSrcT2spcq9nO838Q22VhJ63Kdzasz1HugdVNqgcFCCSsqaoXrJGUcf5GrZx7PNloz7uf1I3txYMeZtA== dependencies: - "@abp/jquery" "~7.4.0" + "@abp/jquery" "~7.4.1" toastr "^2.1.4" -"@abp/utils@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-7.4.0.tgz#b31fb6e5dff07463535479a6bb62dc733d7119c8" - integrity sha512-CcR3tfuEsVM60DYL1A0cH6BkUTsasOoBDv/b63uLCoEOq/g8ntelD/SpRSgfDXK74P9M8OE5ZFxlXWDiYuzAFg== +"@abp/utils@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-7.4.1.tgz#2ce4c4d659c2ae9bc23b71b79fa3c6e120eaecaf" + integrity sha512-eFeoOXcz9cVkDKpOfd2VWmpAojASfsqfvACZqi1UmF16OcjsFIkxmIvhh1fpbT4A+eQLbaFFLIsf6gYb//tXhg== dependencies: just-compare "^2.3.0" -"@abp/virtual-file-explorer@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/virtual-file-explorer/-/virtual-file-explorer-7.4.0.tgz#c118e86b4dd31c590d59f11239687d1108c555c3" - integrity sha512-DcNKiqfXR/VzUzfZSSZlUwxOOQyEIKJZNNCb9bUR021XxUK3tmPQTjFU+6ptq1ebRxByz8239zPcXYIjW4im+A== +"@abp/virtual-file-explorer@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/virtual-file-explorer/-/virtual-file-explorer-7.4.1.tgz#f08e4d397749c44c0d7e2cbfd6e26641a9c77904" + integrity sha512-Rx10rm9cBtqP7VWWFhIeYO0/gZED6XphxUoN58OLZzKpTHrkNW4gf1P0emVVuxWD/j7M933rXjzSV8CT0Vtt+Q== dependencies: - "@abp/clipboard" "~7.4.0" - "@abp/prismjs" "~7.4.0" + "@abp/clipboard" "~7.4.1" + "@abp/prismjs" "~7.4.1" "@fortawesome/fontawesome-free@^5.15.4": version "5.15.4" diff --git a/npm/lerna.json b/npm/lerna.json index 9b754ccca7..b5395f7a89 100644 --- a/npm/lerna.json +++ b/npm/lerna.json @@ -1,5 +1,5 @@ { - "version": "7.4.0", + "version": "7.4.1", "packages": [ "packs/*" ], diff --git a/npm/ng-packs/.eslintrc.json b/npm/ng-packs/.eslintrc.json index 3a15786c57..8649f90b2d 100644 --- a/npm/ng-packs/.eslintrc.json +++ b/npm/ng-packs/.eslintrc.json @@ -2,6 +2,9 @@ "root": true, "ignorePatterns": ["**/*"], "plugins": ["@nx"], + "rules": { + "@typescript-eslint/no-explicit-any": "off" + }, "overrides": [ { "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], @@ -25,9 +28,11 @@ "files": ["*.ts", "*.tsx"], "extends": ["plugin:@nx/typescript"], "rules": { + "@typescript-eslint/no-explicit-any": "off", "@typescript-eslint/no-namespace": "off", "@typescript-eslint/no-empty-function": ["warn"], "@typescript-eslint/no-empty-interface": ["warn"] + } }, { diff --git a/npm/ng-packs/migrations.json b/npm/ng-packs/migrations.json index a0b431b16a..0e2ed93d08 100644 --- a/npm/ng-packs/migrations.json +++ b/npm/ng-packs/migrations.json @@ -2,19 +2,115 @@ "migrations": [ { "cli": "nx", - "version": "16.2.0-beta.0", - "description": "Remove outputPath from run commands", - "implementation": "./src/migrations/update-16-2-0/remove-run-commands-output-path", + "version": "16.6.0-beta.6", + "description": "Prefix outputs with {workspaceRoot}/{projectRoot} if needed", + "implementation": "./src/migrations/update-15-0-0/prefix-outputs", "package": "nx", - "name": "16.2.0-remove-output-path-from-run-commands" + "name": "16.6.0-prefix-outputs" }, { "cli": "nx", - "version": "16.2.0-beta.0", - "description": "Normalize tsconfig.cy.json files to be located at '/cypress/tsconfig.json'", - "implementation": "./src/migrations/update-16-2-0/update-cy-tsconfig", + "version": "16.8.0-beta.3", + "description": "Escape $ in env variables", + "implementation": "./src/migrations/update-16-8-0/escape-dollar-sign-env-variables", + "package": "nx", + "name": "16.8.0-escape-dollar-sign-env" + }, + { + "version": "16.8.0", + "description": "update-16-8-0-add-ignored-files", + "implementation": "./src/migrations/update-16-8-0-add-ignored-files/update-16-8-0-add-ignored-files", + "package": "@nx/linter", + "name": "update-16-8-0-add-ignored-files" + }, + { + "cli": "nx", + "version": "16.9.0-beta.1", + "description": "Replace imports of Module Federation utils frm @nx/devkit to @nx/webpack", + "implementation": "./src/migrations/update-16-9-0/migrate-mf-util-usage", + "package": "@nx/devkit", + "name": "update-16-9-0-migrate-mf-usage-to-webpack" + }, + { + "cli": "nx", + "version": "16.4.0-beta.6", + "requires": { + "@angular-eslint/eslint-plugin-template": ">=16.0.0" + }, + "description": "Remove the 'accessibility-' prefix from '@angular-eslint/eslint-plugin-template' rules.", + "factory": "./src/migrations/update-16-4-0/rename-angular-eslint-accesibility-rules", + "package": "@nx/angular", + "name": "rename-angular-eslint-accesibility-rules" + }, + { + "cli": "nx", + "version": "16.4.0-beta.11", + "requires": { + "@angular/core": ">=16.1.0" + }, + "description": "Update the @angular/cli package version to ~16.1.0.", + "factory": "./src/migrations/update-16-4-0/update-angular-cli", + "package": "@nx/angular", + "name": "update-angular-cli-version-16-1-0" + }, + { + "cli": "nx", + "version": "16.6.0-beta.0", + "description": "Explicitly set 'updateBuildableProjectDepsInPackageJson' to 'true' in targets that rely on that value as the default.", + "factory": "./src/migrations/update-16-6-0/explicitly-set-projects-to-update-buildable-deps", + "package": "@nx/angular", + "name": "explicitly-set-projects-to-update-buildable-deps" + }, + { + "cli": "nx", + "version": "16.7.0-beta.6", + "requires": { + "@angular/core": ">=16.2.0" + }, + "description": "Update the @angular/cli package version to ~16.2.0.", + "factory": "./src/migrations/update-16-7-0/update-angular-cli", + "package": "@nx/angular", + "name": "update-angular-cli-version-16-2-0" + }, + { + "cli": "nx", + "version": "16.4.0-beta.10", + "description": "Remove tsconfig.e2e.json and add settings to project tsconfig.json. tsConfigs executor option is now deprecated. The project level tsconfig.json file should be used instead.", + "implementation": "./src/migrations/update-16-4-0/tsconfig-sourcemaps", "package": "@nx/cypress", - "name": "update-16-2-0-normalize-tsconfigs" + "name": "update-16-3-0-remove-old-tsconfigs" + }, + { + "cli": "nx", + "version": "16.8.0-beta.4", + "description": "Update to Cypress v13. Most noteable change is video recording is off by default. This migration will only update if the workspace is already on Cypress v12. https://docs.cypress.io/guides/references/migration-guide#Migrating-to-Cypress-130", + "implementation": "./src/migrations/update-16-8-0/cypress-13", + "package": "@nx/cypress", + "name": "update-16-8-0-cypress-13" + }, + { + "cli": "nx", + "version": "16.5.0-beta.2", + "description": "Add test-setup.ts to ignored files in production input", + "implementation": "./src/migrations/update-16-5-0/add-test-setup-to-inputs-ignore", + "package": "@nx/jest", + "name": "add-test-setup-to-inputs-ignore" + }, + { + "cli": "nx", + "version": "16.6.0-beta.0", + "description": "Explicitly set 'updateBuildableProjectDepsInPackageJson' to 'true' in targets that rely on that value as the default.", + "factory": "./src/migrations/update-16-6-0/explicitly-set-projects-to-update-buildable-deps", + "package": "@nx/js", + "name": "explicitly-set-projects-to-update-buildable-deps" + }, + { + "cli": "nx", + "version": "16.8.2-beta.0", + "description": "Remove invalid options (strict, noInterop) for ES6 type modules.", + "factory": "./src/migrations/update-16-8-2/update-swcrc", + "package": "@nx/js", + "name": "16-8-2-update-swcrc" } ] } diff --git a/npm/ng-packs/package.json b/npm/ng-packs/package.json index 1060c486a5..e9e2105e1b 100644 --- a/npm/ng-packs/package.json +++ b/npm/ng-packs/package.json @@ -44,85 +44,74 @@ }, "private": true, "devDependencies": { - "@abp/ng.account": "~7.4.0", - "@abp/ng.account.core": "~7.4.0", - "@abp/ng.core": "~7.4.0", - "@abp/ng.feature-management": "~7.4.0", - "@abp/ng.identity": "~7.4.0", - "@abp/ng.oauth": "~7.4.0", - "@abp/ng.permission-management": "~7.4.0", - "@abp/ng.schematics": "~7.4.0", - "@abp/ng.setting-management": "~7.4.0", - "@abp/ng.tenant-management": "~7.4.0", - "@abp/ng.theme.basic": "~7.4.0", - "@abp/ng.theme.lepton-x": "~2.4.0", - "@abp/ng.theme.shared": "~7.4.0", - "@abp/utils": "~7.4.0", - "@angular-devkit/build-angular": "~16.0.0", - "@angular-devkit/core": "~16.0.0", - "@angular-devkit/schematics": "~16.0.0", - "@angular-devkit/schematics-cli": "~16.0.0", - "@angular-eslint/eslint-plugin": "~16.0.0", - "@angular-eslint/eslint-plugin-template": "~16.0.0", - "@angular-eslint/template-parser": "~16.0.0", - "@angular/animations": "~16.0.0", - "@angular/cli": "~16.0.0", - "@angular/common": "~16.0.0", - "@angular/compiler": "~16.0.0", - "@angular/compiler-cli": "~16.0.0", - "@angular/core": "~16.0.0", - "@angular/forms": "~16.0.0", - "@angular/language-service": "~16.0.0", - "@angular/localize": "~16.0.0", - "@angular/platform-browser": "~16.0.0", - "@angular/platform-browser-dynamic": "~16.0.0", - "@angular/router": "~16.0.0", - "@fortawesome/fontawesome-free": "^5.15.4", + "@abp/ng.theme.lepton-x": "~2.4.1", + "@abp/utils": "~7.4.1", + "@angular-devkit/build-angular": "~16.2.0", + "@angular-devkit/core": "~16.2.0", + "@angular-devkit/schematics": "~16.2.0", + "@angular-devkit/schematics-cli": "~16.2.0", + "@angular-eslint/eslint-plugin": "~16.2.0", + "@angular-eslint/eslint-plugin-template": "~16.2.0", + "@angular-eslint/template-parser": "~16.2.0", + "@angular/animations": "~16.2.0", + "@angular/cli": "~16.2.0", + "@angular/common": "~16.2.0", + "@angular/compiler": "~16.2.0", + "@angular/compiler-cli": "~16.2.0", + "@angular/core": "~16.2.0", + "@angular/forms": "~16.2.0", + "@angular/language-service": "~16.2.0", + "@angular/localize": "~16.2.0", + "@angular/platform-browser": "~16.2.0", + "@angular/platform-browser-dynamic": "~16.2.0", + "@angular/router": "~16.2.0", + "@fortawesome/fontawesome-free": "^5.0.0", "@ng-bootstrap/ng-bootstrap": "^15.0.0", "@ngneat/spectator": "^10.0.0", "@ngx-validate/core": "^0.2.0", - "@nx/angular": "16.2.2", - "@nx/cypress": "16.2.2", - "@nx/eslint-plugin": "16.2.2", - "@nx/jest": "16.2.2", - "@nx/js": "16.2.2", - "@nx/linter": "16.2.2", - "@nx/workspace": "16.2.2", - "@popperjs/core": "~2.11.2", - "@schematics/angular": "~16.0.0", - "@swc-node/register": "~1.4.2", - "@swc/cli": "~0.1.62", - "@swc/core": "~1.3.51", + "@nx/angular": "16.9.0", + "@nx/cypress": "16.9.0", + "@nx/eslint-plugin": "16.9.0", + "@nx/jest": "16.9.0", + "@nx/js": "16.9.0", + "@nx/linter": "16.9.0", + "@nx/workspace": "16.9.0", + "@popperjs/core": "~2.11.0", + "@schematics/angular": "~16.2.0", + "@swc-node/register": "~1.4.0", + "@swc/cli": "~0.1.0", + "@swc/core": "1.3.94", "@swimlane/ngx-datatable": "^20.0.0", "@types/jest": "29.4.4", "@types/node": "20.2.5", - "@typescript-eslint/eslint-plugin": "5.59.5", - "@typescript-eslint/parser": "5.59.5", - "angular-oauth2-oidc": "^15.0.1", - "bootstrap": "^5.1.1", - "bootstrap-icons": "^1.10.3", - "chart.js": "^3.5.1", - "cypress": "^7.3.0", + "@typescript-eslint/eslint-plugin": "5.62.0", + "@typescript-eslint/parser": "5.62.0", + "angular-oauth2-oidc": "^15.0.0", + "bootstrap": "^5.0.0", + "bootstrap-icons": "^1.0.0", + "chart.js": "^3.0.0", + "cypress": "^7.0.0", "dotenv": "10.0.0", - "eslint": "8.15.0", + "eslint": "8.46.0", "eslint-config-prettier": "8.1.0", + "eslint-plugin-cypress": "2.15.1", + "got": "^11.0.0", "eslint-plugin-cypress": "^2.10.3", - "got": "^11.5.2", - "jest": "^29.0.0", - "jest-canvas-mock": "^2.3.1", + "jest": "^29.0.0", + "jest-canvas-mock": "^2.0.0", "jest-environment-jsdom": "^29.0.0", "jest-preset-angular": "13.1.0", - "jsonc-eslint-parser": "^2.1.0", - "jsonc-parser": "^2.3.0", - "just-clone": "^6.1.1", - "just-compare": "^2.3.0", + "jsonc-eslint-parser": "^2.0.0", + "jsonc-parser": "^2.0.0", + "just-clone": "^6.0.0", + "just-compare": "^2.0.0", "lerna": "^4.0.0", - "lint-staged": "^13.0.3", - "ng-packagr": "~16.0.0", + "lint-staged": "^13.0.0", + "ng-packagr": "~16.2.0", "ng-zorro-antd": "^16.0.0", - "nx": "16.2.2", - "perfect-scrollbar": "^1.5.5", - "postcss": "^8.3.9", + "nx": "16.9.0", + "perfect-scrollbar": "^1.0.0", + "postcss": "^8.0.0", "postcss-import": "14.1.0", "postcss-preset-env": "7.5.0", "postcss-url": "10.1.3", @@ -133,13 +122,13 @@ "ts-jest": "29.1.0", "ts-node": "10.9.1", "ts-toolbelt": "6.15.4", - "tslib": "^2.3.0", + "tslib": "^2.0.0", "tslint": "~6.1.0", - "typescript": "5.0.4", + "typescript": "5.1.6", "zone.js": "~0.13.0", - "@nx/devkit": "16.2.2", - "@nx/plugin": "^16.2.2", - "@swc/helpers": "~0.5.0" + "@nx/devkit": "16.9.0", + "@nx/plugin": "16.9.0", + "@swc/helpers": "0.5.3" }, "lint-staged": { "**/*.{js,jsx,ts,tsx,html,css,scss}": [ diff --git a/npm/ng-packs/packages/account-core/package.json b/npm/ng-packs/packages/account-core/package.json index 9f2cba366f..b4bf728796 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": "7.4.0", + "version": "7.4.1", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "peerDependencies": { - "@abp/ng.core": "~7.4.0", - "@abp/ng.theme.shared": "~7.4.0", + "@abp/ng.core": "~7.4.1", + "@abp/ng.theme.shared": "~7.4.1", "@angular/common": ">=12.0.0", "@angular/core": ">=12.0.0" }, diff --git a/npm/ng-packs/packages/account/package.json b/npm/ng-packs/packages/account/package.json index 3f33e750fb..b3b2528d23 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": "7.4.0", + "version": "7.4.1", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.account.core": "~7.4.0", - "@abp/ng.theme.shared": "~7.4.0", + "@abp/ng.account.core": "~7.4.1", + "@abp/ng.theme.shared": "~7.4.1", "tslib": "^2.0.0" }, "publishConfig": { diff --git a/npm/ng-packs/packages/account/src/lib/account-routing.module.ts b/npm/ng-packs/packages/account/src/lib/account-routing.module.ts index 0b188f3751..a10bde7009 100644 --- a/npm/ng-packs/packages/account/src/lib/account-routing.module.ts +++ b/npm/ng-packs/packages/account/src/lib/account-routing.module.ts @@ -1,8 +1,8 @@ import { NgModule } from '@angular/core'; -import { RouterModule, Routes, mapToCanActivate } from '@angular/router'; +import { RouterModule, Routes } from '@angular/router'; import { - AuthGuard, + authGuard, ReplaceableComponents, ReplaceableRouteContainerComponent, RouterOutletComponent, @@ -14,9 +14,10 @@ import { ManageProfileComponent } from './components/manage-profile/manage-profi import { RegisterComponent } from './components/register/register.component'; import { ResetPasswordComponent } from './components/reset-password/reset-password.component'; import { eAccountComponents } from './enums/components'; -import { AccountExtensionsGuard, AuthenticationFlowGuard } from './guards'; +import { authenticationFlowGuard } from './guards'; +import { accountExtensionsResolver } from './resolvers'; -const canActivate = mapToCanActivate([AuthenticationFlowGuard]); +const canActivate = [authenticationFlowGuard]; const routes: Routes = [ { path: '', pathMatch: 'full', redirectTo: 'login' }, @@ -73,7 +74,8 @@ const routes: Routes = [ { path: 'manage', component: ReplaceableRouteContainerComponent, - canActivate: mapToCanActivate([AuthGuard, AccountExtensionsGuard]), + canActivate: [authGuard], + resolve: [accountExtensionsResolver], data: { replaceableComponent: { key: eAccountComponents.ManageProfile, diff --git a/npm/ng-packs/packages/account/src/lib/account.module.ts b/npm/ng-packs/packages/account/src/lib/account.module.ts index 304cc31242..58df433232 100644 --- a/npm/ng-packs/packages/account/src/lib/account.module.ts +++ b/npm/ng-packs/packages/account/src/lib/account.module.ts @@ -16,10 +16,11 @@ import { AuthenticationFlowGuard } from './guards/authentication-flow.guard'; import { ForgotPasswordComponent } from './components/forgot-password/forgot-password.component'; import { ResetPasswordComponent } from './components/reset-password/reset-password.component'; import { RE_LOGIN_CONFIRMATION_TOKEN } from './tokens'; -import { UiExtensionsModule } from '@abp/ng.theme.shared/extensions'; + import { ACCOUNT_EDIT_FORM_PROP_CONTRIBUTORS } from './tokens/extensions.token'; import { AccountExtensionsGuard } from './guards/extensions.guard'; import { PersonalSettingsHalfRowComponent } from './components/personal-settings/personal-settings-half-row.component'; +import { ExtensibleModule } from "@abp/ng.components/extensible"; const declarations = [ LoginComponent, @@ -40,7 +41,7 @@ const declarations = [ ThemeSharedModule, NgbDropdownModule, NgxValidateCoreModule, - UiExtensionsModule, + ExtensibleModule, ], exports: [...declarations], }) diff --git a/npm/ng-packs/packages/account/src/lib/components/personal-settings/personal-settings-half-row.component.ts b/npm/ng-packs/packages/account/src/lib/components/personal-settings/personal-settings-half-row.component.ts index d7920984ce..2515983e48 100644 --- a/npm/ng-packs/packages/account/src/lib/components/personal-settings/personal-settings-half-row.component.ts +++ b/npm/ng-packs/packages/account/src/lib/components/personal-settings/personal-settings-half-row.component.ts @@ -3,7 +3,7 @@ import { EXTENSIONS_FORM_PROP, FormProp, EXTENSIBLE_FORM_VIEW_PROVIDER, -} from '@abp/ng.theme.shared/extensions'; +} from '@abp/ng.components/extensible'; import { UntypedFormGroup } from '@angular/forms'; @Component({ diff --git a/npm/ng-packs/packages/account/src/lib/components/personal-settings/personal-settings.component.ts b/npm/ng-packs/packages/account/src/lib/components/personal-settings/personal-settings.component.ts index f41058d06c..a40041551a 100644 --- a/npm/ng-packs/packages/account/src/lib/components/personal-settings/personal-settings.component.ts +++ b/npm/ng-packs/packages/account/src/lib/components/personal-settings/personal-settings.component.ts @@ -11,7 +11,7 @@ import { EXTENSIONS_IDENTIFIER, FormPropData, generateFormFromProps, -} from '@abp/ng.theme.shared/extensions'; +} from '@abp/ng.components/extensible'; import { eAccountComponents } from '../../enums'; @Component({ diff --git a/npm/ng-packs/packages/account/src/lib/defaults/default-personal-settings-form-props.ts b/npm/ng-packs/packages/account/src/lib/defaults/default-personal-settings-form-props.ts index 59c196f2bd..b9463ae336 100644 --- a/npm/ng-packs/packages/account/src/lib/defaults/default-personal-settings-form-props.ts +++ b/npm/ng-packs/packages/account/src/lib/defaults/default-personal-settings-form-props.ts @@ -1,4 +1,4 @@ -import { ePropType, FormProp } from '@abp/ng.theme.shared/extensions'; +import { ePropType, FormProp } from '@abp/ng.components/extensible'; import { UpdateProfileDto } from '@abp/ng.account.core/proxy'; import { Validators } from '@angular/forms'; import { PersonalSettingsHalfRowComponent } from '../components/personal-settings/personal-settings-half-row.component'; diff --git a/npm/ng-packs/packages/account/src/lib/guards/authentication-flow.guard.ts b/npm/ng-packs/packages/account/src/lib/guards/authentication-flow.guard.ts index c00cee3156..23c6d8c7e3 100644 --- a/npm/ng-packs/packages/account/src/lib/guards/authentication-flow.guard.ts +++ b/npm/ng-packs/packages/account/src/lib/guards/authentication-flow.guard.ts @@ -1,6 +1,10 @@ import { AuthService, IAbpGuard } from '@abp/ng.core'; import { Injectable, inject } from '@angular/core'; +import { CanActivateFn } from '@angular/router'; +/** + * @deprecated Use `authenticationFlowGuard` *function* instead. + */ @Injectable() export class AuthenticationFlowGuard implements IAbpGuard { protected readonly authService = inject(AuthService); @@ -12,3 +16,12 @@ export class AuthenticationFlowGuard implements IAbpGuard { return false; } } + +export const authenticationFlowGuard: CanActivateFn = () => { + const authService = inject(AuthService); + + if (authService.isInternalAuth) return true; + + authService.navigateToLogin(); + return false; +}; diff --git a/npm/ng-packs/packages/account/src/lib/guards/extensions.guard.ts b/npm/ng-packs/packages/account/src/lib/guards/extensions.guard.ts index 8df8aede51..ebeae81a67 100644 --- a/npm/ng-packs/packages/account/src/lib/guards/extensions.guard.ts +++ b/npm/ng-packs/packages/account/src/lib/guards/extensions.guard.ts @@ -9,7 +9,7 @@ import { getObjectExtensionEntitiesFromStore, mapEntitiesToContributors, mergeWithDefaultProps, -} from '@abp/ng.theme.shared/extensions'; +} from '@abp/ng.components/extensible'; import { ACCOUNT_EDIT_FORM_PROP_CONTRIBUTORS, @@ -17,6 +17,9 @@ import { } from '../tokens/extensions.token'; import { eAccountComponents } from '../enums/components'; +/** + * @deprecated Use `accountExtensionsResolver` *function* instead. + */ @Injectable() export class AccountExtensionsGuard implements IAbpGuard { protected readonly configState = inject(ConfigStateService); diff --git a/npm/ng-packs/packages/account/src/lib/models/config-options.ts b/npm/ng-packs/packages/account/src/lib/models/config-options.ts index c45389492f..11964f8da8 100644 --- a/npm/ng-packs/packages/account/src/lib/models/config-options.ts +++ b/npm/ng-packs/packages/account/src/lib/models/config-options.ts @@ -1,5 +1,5 @@ import { eAccountComponents } from '../enums'; -import { EditFormPropContributorCallback } from '@abp/ng.theme.shared/extensions'; +import { EditFormPropContributorCallback } from '@abp/ng.components/extensible'; import { UpdateProfileDto } from '@abp/ng.account.core/proxy'; export interface AccountConfigOptions { @@ -9,4 +9,4 @@ export interface AccountConfigOptions { } export type AccountEditFormPropContributors = Partial<{ [eAccountComponents.PersonalSettings]: EditFormPropContributorCallback[]; -}>; \ No newline at end of file +}>; diff --git a/npm/ng-packs/packages/account/src/lib/resolvers/extensions.resolver.ts b/npm/ng-packs/packages/account/src/lib/resolvers/extensions.resolver.ts new file mode 100644 index 0000000000..b3aec858b8 --- /dev/null +++ b/npm/ng-packs/packages/account/src/lib/resolvers/extensions.resolver.ts @@ -0,0 +1,36 @@ +import { inject } from '@angular/core'; +import { ConfigStateService } from '@abp/ng.core'; +import { map, tap } from 'rxjs'; +import { + ExtensionsService, + getObjectExtensionEntitiesFromStore, + mapEntitiesToContributors, + mergeWithDefaultProps, +} from '@abp/ng.components/extensible'; +import { eAccountComponents } from '../enums'; +import { ACCOUNT_EDIT_FORM_PROP_CONTRIBUTORS, DEFAULT_ACCOUNT_FORM_PROPS } from '../tokens'; +import { ResolveFn } from '@angular/router'; + +export const accountExtensionsResolver: ResolveFn = () => { + const configState = inject(ConfigStateService); + const extensions = inject(ExtensionsService); + + const config = { optional: true }; + + const editFormContributors = inject(ACCOUNT_EDIT_FORM_PROP_CONTRIBUTORS, config) || {}; + + return getObjectExtensionEntitiesFromStore(configState, 'Identity').pipe( + map(entities => ({ + [eAccountComponents.PersonalSettings]: entities.User, + })), + mapEntitiesToContributors(configState, 'AbpIdentity'), + tap(objectExtensionContributors => { + mergeWithDefaultProps( + extensions.editFormProps, + DEFAULT_ACCOUNT_FORM_PROPS, + objectExtensionContributors.editForm, + editFormContributors, + ); + }), + ); +}; diff --git a/npm/ng-packs/packages/account/src/lib/resolvers/index.ts b/npm/ng-packs/packages/account/src/lib/resolvers/index.ts new file mode 100644 index 0000000000..754a8ccf12 --- /dev/null +++ b/npm/ng-packs/packages/account/src/lib/resolvers/index.ts @@ -0,0 +1 @@ +export * from './extensions.resolver' \ No newline at end of file diff --git a/npm/ng-packs/packages/account/src/lib/tokens/extensions.token.ts b/npm/ng-packs/packages/account/src/lib/tokens/extensions.token.ts index 78acb7feaa..d8baf6f623 100644 --- a/npm/ng-packs/packages/account/src/lib/tokens/extensions.token.ts +++ b/npm/ng-packs/packages/account/src/lib/tokens/extensions.token.ts @@ -1,7 +1,7 @@ import { eAccountComponents } from '../enums'; import { DEFAULT_PERSONAL_SETTINGS_UPDATE_FORM_PROPS } from '../defaults/default-personal-settings-form-props'; import { InjectionToken } from '@angular/core'; -import { EditFormPropContributorCallback } from '@abp/ng.theme.shared/extensions'; +import { EditFormPropContributorCallback } from '@abp/ng.components/extensible'; import { UpdateProfileDto } from '@abp/ng.account.core/proxy'; export const DEFAULT_ACCOUNT_FORM_PROPS = { diff --git a/npm/ng-packs/packages/account/src/public-api.ts b/npm/ng-packs/packages/account/src/public-api.ts index a383562c15..f9df16ebc7 100644 --- a/npm/ng-packs/packages/account/src/public-api.ts +++ b/npm/ng-packs/packages/account/src/public-api.ts @@ -6,3 +6,4 @@ export * from './lib/models'; export * from './lib/services'; export * from './lib/tokens'; export * from './lib/utils'; +export * from './lib/resolvers'; diff --git a/npm/ng-packs/packages/components/extensible/README.md b/npm/ng-packs/packages/components/extensible/README.md new file mode 100644 index 0000000000..7a14a85f7c --- /dev/null +++ b/npm/ng-packs/packages/components/extensible/README.md @@ -0,0 +1,3 @@ +# @abp/ng.components/extensible + +Secondary entry point of `@abp/ng.components`. It can be used by importing from `@abp/ng.components/extensible`. diff --git a/npm/ng-packs/packages/components/extensible/ng-package.json b/npm/ng-packs/packages/components/extensible/ng-package.json new file mode 100644 index 0000000000..fbafcc4448 --- /dev/null +++ b/npm/ng-packs/packages/components/extensible/ng-package.json @@ -0,0 +1,5 @@ +{ + "lib": { + "entryFile": "src/public-api.ts" + } +} diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/lib/components/abstract-actions/abstract-actions.component.ts b/npm/ng-packs/packages/components/extensible/src/lib/components/abstract-actions/abstract-actions.component.ts similarity index 95% rename from npm/ng-packs/packages/theme-shared/extensions/src/lib/components/abstract-actions/abstract-actions.component.ts rename to npm/ng-packs/packages/components/extensible/src/lib/components/abstract-actions/abstract-actions.component.ts index a7710d16a0..394e125798 100644 --- a/npm/ng-packs/packages/theme-shared/extensions/src/lib/components/abstract-actions/abstract-actions.component.ts +++ b/npm/ng-packs/packages/components/extensible/src/lib/components/abstract-actions/abstract-actions.component.ts @@ -16,9 +16,8 @@ export abstract class AbstractActionsComponent< @Input() record!: InferredData['record']; - constructor(injector: Injector) { + protected constructor(injector: Injector) { super(); - this.getInjected = injector.get.bind(injector); const extensions = injector.get(ExtensionsService); const name = injector.get(EXTENSIONS_IDENTIFIER); diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/lib/components/date-time-picker/date-time-picker.component.ts b/npm/ng-packs/packages/components/extensible/src/lib/components/date-time-picker/extensible-date-time-picker.component.ts similarity index 82% rename from npm/ng-packs/packages/theme-shared/extensions/src/lib/components/date-time-picker/date-time-picker.component.ts rename to npm/ng-packs/packages/components/extensible/src/lib/components/date-time-picker/extensible-date-time-picker.component.ts index 60a2d16f34..55b73581c9 100644 --- a/npm/ng-packs/packages/theme-shared/extensions/src/lib/components/date-time-picker/date-time-picker.component.ts +++ b/npm/ng-packs/packages/components/extensible/src/lib/components/date-time-picker/extensible-date-time-picker.component.ts @@ -14,13 +14,13 @@ import { NgbTimeAdapter, NgbTimepicker, } from '@ng-bootstrap/ng-bootstrap'; -import { DateTimeAdapter } from '../../adapters/date-time.adapter'; import { FormProp } from '../../models/form-props'; import { selfFactory } from '../../utils/factory.util'; +import { DateTimeAdapter } from '@abp/ng.theme.shared'; @Component({ - exportAs: 'abpDateTimePicker', - selector: 'abp-date-time-picker', + exportAs: 'abpExtensibleDateTimePicker', + selector: 'abp-extensible-date-time-picker', template: ` - + diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/lib/components/extensible-form/extensible-form-prop.component.ts b/npm/ng-packs/packages/components/extensible/src/lib/components/extensible-form/extensible-form-prop.component.ts similarity index 97% rename from npm/ng-packs/packages/theme-shared/extensions/src/lib/components/extensible-form/extensible-form-prop.component.ts rename to npm/ng-packs/packages/components/extensible/src/lib/components/extensible-form/extensible-form-prop.component.ts index 679afe3b04..2689e09a33 100644 --- a/npm/ng-packs/packages/theme-shared/extensions/src/lib/components/extensible-form/extensible-form-prop.component.ts +++ b/npm/ng-packs/packages/components/extensible/src/lib/components/extensible-form/extensible-form-prop.component.ts @@ -24,15 +24,14 @@ import { import { NgbDateAdapter, NgbTimeAdapter } from '@ng-bootstrap/ng-bootstrap'; import { Observable, of } from 'rxjs'; import { debounceTime, distinctUntilChanged, switchMap } from 'rxjs/operators'; -import { DateAdapter } from '../../adapters/date.adapter'; -import { TimeAdapter } from '../../adapters/time.adapter'; +import { DateAdapter, TimeAdapter } from '@abp/ng.theme.shared'; import { EXTRA_PROPERTIES_KEY } from '../../constants/extra-properties'; import { ePropType } from '../../enums/props.enum'; import { FormProp } from '../../models/form-props'; import { PropData } from '../../models/props'; import { selfFactory } from '../../utils/factory.util'; import { addTypeaheadTextSuffix } from '../../utils/typeahead.util'; -import { eThemeSharedComponents } from '../../enums/components'; +import { eThemeSharedComponents } from "../../enums/components"; @Component({ selector: 'abp-extensible-form-prop', diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/lib/components/extensible-form/extensible-form.component.html b/npm/ng-packs/packages/components/extensible/src/lib/components/extensible-form/extensible-form.component.html similarity index 100% rename from npm/ng-packs/packages/theme-shared/extensions/src/lib/components/extensible-form/extensible-form.component.html rename to npm/ng-packs/packages/components/extensible/src/lib/components/extensible-form/extensible-form.component.html diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/lib/components/extensible-form/extensible-form.component.ts b/npm/ng-packs/packages/components/extensible/src/lib/components/extensible-form/extensible-form.component.ts similarity index 100% rename from npm/ng-packs/packages/theme-shared/extensions/src/lib/components/extensible-form/extensible-form.component.ts rename to npm/ng-packs/packages/components/extensible/src/lib/components/extensible-form/extensible-form.component.ts diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/lib/components/extensible-table/extensible-table.component.html b/npm/ng-packs/packages/components/extensible/src/lib/components/extensible-table/extensible-table.component.html similarity index 80% rename from npm/ng-packs/packages/theme-shared/extensions/src/lib/components/extensible-table/extensible-table.component.html rename to npm/ng-packs/packages/components/extensible/src/lib/components/extensible-table/extensible-table.component.html index 2d7105ae52..0d3aa9dd16 100644 --- a/npm/ng-packs/packages/theme-shared/extensions/src/lib/components/extensible-table/extensible-table.component.html +++ b/npm/ng-packs/packages/components/extensible/src/lib/components/extensible-table/extensible-table.component.html @@ -24,23 +24,24 @@ - - - {{column.name}} - - - {{column.name}} + + + {{ column.name }} + + + {{ column.name }} + - diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/lib/components/extensible-table/extensible-table.component.ts b/npm/ng-packs/packages/components/extensible/src/lib/components/extensible-table/extensible-table.component.ts similarity index 95% rename from npm/ng-packs/packages/theme-shared/extensions/src/lib/components/extensible-table/extensible-table.component.ts rename to npm/ng-packs/packages/components/extensible/src/lib/components/extensible-table/extensible-table.component.ts index aa264385be..af146e2367 100644 --- a/npm/ng-packs/packages/theme-shared/extensions/src/lib/components/extensible-table/extensible-table.component.ts +++ b/npm/ng-packs/packages/components/extensible/src/lib/components/extensible-table/extensible-table.component.ts @@ -13,8 +13,6 @@ import { Component, EventEmitter, Inject, - InjectFlags, - InjectionToken, Injector, Input, LOCALE_ID, @@ -23,7 +21,6 @@ import { SimpleChanges, TemplateRef, TrackByFunction, - Type, } from '@angular/core'; import { Observable } from 'rxjs'; import { map } from 'rxjs/operators'; @@ -41,7 +38,7 @@ import { const DEFAULT_ACTIONS_COLUMN_WIDTH = 150; -@Component({ + @Component({ exportAs: 'abpExtensibleTable', selector: 'abp-extensible-table', templateUrl: './extensible-table.component.html', @@ -67,7 +64,7 @@ export class ExtensibleTableComponent implements OnChanges { @Output() tableActivate = new EventEmitter(); - getInjected: (token: Type | InjectionToken, notFoundValue?: T, flags?: InjectFlags) => T; + getInjected: typeof this.injector.get hasAtLeastOnePermittedAction: boolean; @@ -150,7 +147,7 @@ export class ExtensibleTableComponent implements OnChanges { ngOnChanges({ data }: SimpleChanges) { if (!data?.currentValue) return; - + if (data.currentValue.length < 1) { this.list.totalCount = this.recordsTotal } @@ -166,7 +163,7 @@ export class ExtensibleTableComponent implements OnChanges { value, }; if (prop.value.component) { - const injector = Injector.create({ + record[propKey].injector = Injector.create({ providers: [ { provide: PROP_DATA_STREAM, @@ -175,7 +172,6 @@ export class ExtensibleTableComponent implements OnChanges { ], parent: this.injector, }); - record[propKey].injector = injector; record[propKey].component = prop.value.component; } }); diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/lib/components/grid-actions/grid-actions.component.html b/npm/ng-packs/packages/components/extensible/src/lib/components/grid-actions/grid-actions.component.html similarity index 100% rename from npm/ng-packs/packages/theme-shared/extensions/src/lib/components/grid-actions/grid-actions.component.html rename to npm/ng-packs/packages/components/extensible/src/lib/components/grid-actions/grid-actions.component.html diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/lib/components/grid-actions/grid-actions.component.ts b/npm/ng-packs/packages/components/extensible/src/lib/components/grid-actions/grid-actions.component.ts similarity index 100% rename from npm/ng-packs/packages/theme-shared/extensions/src/lib/components/grid-actions/grid-actions.component.ts rename to npm/ng-packs/packages/components/extensible/src/lib/components/grid-actions/grid-actions.component.ts diff --git a/npm/ng-packs/packages/components/extensible/src/lib/components/index.ts b/npm/ng-packs/packages/components/extensible/src/lib/components/index.ts new file mode 100644 index 0000000000..17f1c380d1 --- /dev/null +++ b/npm/ng-packs/packages/components/extensible/src/lib/components/index.ts @@ -0,0 +1,7 @@ +export * from './abstract-actions/abstract-actions.component'; +export * from './extensible-form/extensible-form.component'; +export * from './extensible-form/extensible-form-prop.component'; +export * from './extensible-table/extensible-table.component'; +export * from './date-time-picker/extensible-date-time-picker.component'; +export * from './grid-actions/grid-actions.component'; +export * from './page-toolbar/page-toolbar.component'; diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/lib/components/page-toolbar/page-toolbar.component.html b/npm/ng-packs/packages/components/extensible/src/lib/components/page-toolbar/page-toolbar.component.html similarity index 100% rename from npm/ng-packs/packages/theme-shared/extensions/src/lib/components/page-toolbar/page-toolbar.component.html rename to npm/ng-packs/packages/components/extensible/src/lib/components/page-toolbar/page-toolbar.component.html diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/lib/components/page-toolbar/page-toolbar.component.ts b/npm/ng-packs/packages/components/extensible/src/lib/components/page-toolbar/page-toolbar.component.ts similarity index 100% rename from npm/ng-packs/packages/theme-shared/extensions/src/lib/components/page-toolbar/page-toolbar.component.ts rename to npm/ng-packs/packages/components/extensible/src/lib/components/page-toolbar/page-toolbar.component.ts diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/lib/constants/extra-properties.ts b/npm/ng-packs/packages/components/extensible/src/lib/constants/extra-properties.ts similarity index 100% rename from npm/ng-packs/packages/theme-shared/extensions/src/lib/constants/extra-properties.ts rename to npm/ng-packs/packages/components/extensible/src/lib/constants/extra-properties.ts diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/lib/directives/prop-data.directive.ts b/npm/ng-packs/packages/components/extensible/src/lib/directives/prop-data.directive.ts similarity index 100% rename from npm/ng-packs/packages/theme-shared/extensions/src/lib/directives/prop-data.directive.ts rename to npm/ng-packs/packages/components/extensible/src/lib/directives/prop-data.directive.ts diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/lib/enums/components.ts b/npm/ng-packs/packages/components/extensible/src/lib/enums/components.ts similarity index 100% rename from npm/ng-packs/packages/theme-shared/extensions/src/lib/enums/components.ts rename to npm/ng-packs/packages/components/extensible/src/lib/enums/components.ts diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/lib/enums/props.enum.ts b/npm/ng-packs/packages/components/extensible/src/lib/enums/props.enum.ts similarity index 100% rename from npm/ng-packs/packages/theme-shared/extensions/src/lib/enums/props.enum.ts rename to npm/ng-packs/packages/components/extensible/src/lib/enums/props.enum.ts diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/lib/ui-extensions.module.ts b/npm/ng-packs/packages/components/extensible/src/lib/extensible.module.ts similarity index 54% rename from npm/ng-packs/packages/theme-shared/extensions/src/lib/ui-extensions.module.ts rename to npm/ng-packs/packages/components/extensible/src/lib/extensible.module.ts index 33882fbd43..334909a7e2 100644 --- a/npm/ng-packs/packages/theme-shared/extensions/src/lib/ui-extensions.module.ts +++ b/npm/ng-packs/packages/components/extensible/src/lib/extensible.module.ts @@ -1,6 +1,7 @@ +import { NgModule } from '@angular/core'; import { CoreModule } from '@abp/ng.core'; import { ThemeSharedModule } from '@abp/ng.theme.shared'; -import { NgModule } from '@angular/core'; +import { NgxValidateCoreModule } from '@ngx-validate/core'; import { NgbDatepickerModule, NgbDropdownModule, @@ -8,37 +9,27 @@ import { NgbTooltipModule, NgbTypeaheadModule, } from '@ng-bootstrap/ng-bootstrap'; -import { NgxValidateCoreModule } from '@ngx-validate/core'; -import { DateTimePickerComponent } from './components/date-time-picker/date-time-picker.component'; -import { ExtensibleFormPropComponent } from './components/extensible-form/extensible-form-prop.component'; -import { ExtensibleFormComponent } from './components/extensible-form/extensible-form.component'; -import { ExtensibleTableComponent } from './components/extensible-table/extensible-table.component'; -import { GridActionsComponent } from './components/grid-actions/grid-actions.component'; -import { PageToolbarComponent } from './components/page-toolbar/page-toolbar.component'; -import { DisabledDirective } from './directives/disabled.directive'; +import { + ExtensibleFormComponent, + ExtensibleFormPropComponent, + ExtensibleTableComponent, + GridActionsComponent, + PageToolbarComponent, + ExtensibleDateTimePickerComponent +} from './components'; import { PropDataDirective } from './directives/prop-data.directive'; import { CreateInjectorPipe } from './pipes/create-injector.pipe'; +import { DisabledDirective } from '@abp/ng.theme.shared'; @NgModule({ - exports: [ - DateTimePickerComponent, - PageToolbarComponent, - GridActionsComponent, - ExtensibleFormComponent, - ExtensibleTableComponent, - PropDataDirective, - DisabledDirective, - CreateInjectorPipe, - ], declarations: [ - DateTimePickerComponent, + ExtensibleDateTimePickerComponent, PageToolbarComponent, GridActionsComponent, ExtensibleFormPropComponent, ExtensibleFormComponent, ExtensibleTableComponent, PropDataDirective, - DisabledDirective, CreateInjectorPipe, ], imports: [ @@ -49,13 +40,16 @@ import { CreateInjectorPipe } from './pipes/create-injector.pipe'; NgbDropdownModule, NgbTimepickerModule, NgbTypeaheadModule, - NgbTooltipModule + NgbTooltipModule, + DisabledDirective, + ], + exports: [ + PageToolbarComponent, + GridActionsComponent, + ExtensibleFormComponent, + ExtensibleTableComponent, + PropDataDirective, + CreateInjectorPipe, ], }) -export class BaseUiExtensionsModule {} - -@NgModule({ - exports: [BaseUiExtensionsModule], - imports: [BaseUiExtensionsModule], -}) -export class UiExtensionsModule {} +export class ExtensibleModule {} diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/lib/models/actions.ts b/npm/ng-packs/packages/components/extensible/src/lib/models/actions.ts similarity index 100% rename from npm/ng-packs/packages/theme-shared/extensions/src/lib/models/actions.ts rename to npm/ng-packs/packages/components/extensible/src/lib/models/actions.ts diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/lib/models/entity-actions.ts b/npm/ng-packs/packages/components/extensible/src/lib/models/entity-actions.ts similarity index 100% rename from npm/ng-packs/packages/theme-shared/extensions/src/lib/models/entity-actions.ts rename to npm/ng-packs/packages/components/extensible/src/lib/models/entity-actions.ts diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/lib/models/entity-props.ts b/npm/ng-packs/packages/components/extensible/src/lib/models/entity-props.ts similarity index 85% rename from npm/ng-packs/packages/theme-shared/extensions/src/lib/models/entity-props.ts rename to npm/ng-packs/packages/components/extensible/src/lib/models/entity-props.ts index e376fe44df..e86e3ae34e 100644 --- a/npm/ng-packs/packages/theme-shared/extensions/src/lib/models/entity-props.ts +++ b/npm/ng-packs/packages/components/extensible/src/lib/models/entity-props.ts @@ -1,5 +1,5 @@ import { ABP, escapeHtmlChars } from '@abp/ng.core'; -import { Type } from '@angular/core'; +import { InjectFlags, InjectOptions, InjectionToken, Type } from '@angular/core'; import { Observable, of } from 'rxjs'; import { O } from 'ts-toolbelt'; import { ActionCallback } from './actions'; @@ -31,6 +31,7 @@ export class EntityProp extends Prop { readonly component?: Type; readonly enumList?: Array>; readonly tooltip?: string; + readonly columnVisible: ColumnPredicate; constructor(options: EntityPropOptions) { super( @@ -41,7 +42,8 @@ export class EntityProp extends Prop { options.visible, options.isExtra, ); - + + this.columnVisible = options.columnVisible || (() => true); this.columnWidth = options.columnWidth; this.sortable = options.sortable || false; this.valueResolver = @@ -72,6 +74,7 @@ export type EntityPropOptions = O.Optional< O.Writable>, | 'permission' | 'visible' + | 'columnVisible' | 'displayName' | 'isExtra' | 'columnWidth' @@ -85,4 +88,10 @@ export type EntityPropOptions = O.Optional< export type EntityPropDefaults = Record[]>; export type EntityPropContributorCallback = PropContributorCallback>; export type EntityPropContributorCallbacks = PropContributorCallbacks>; +export type ColumnPredicate = (getInjected: GetInjected, auxData?: any) => boolean; +export type GetInjected = ( + token: Type | InjectionToken, + notFoundValue?: T, + options?: InjectOptions | InjectFlags, +) => T; type PropDataObject = { [key: string]: any }; diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/lib/models/form-props.ts b/npm/ng-packs/packages/components/extensible/src/lib/models/form-props.ts similarity index 100% rename from npm/ng-packs/packages/theme-shared/extensions/src/lib/models/form-props.ts rename to npm/ng-packs/packages/components/extensible/src/lib/models/form-props.ts diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/lib/models/internal/object-extensions.ts b/npm/ng-packs/packages/components/extensible/src/lib/models/internal/object-extensions.ts similarity index 100% rename from npm/ng-packs/packages/theme-shared/extensions/src/lib/models/internal/object-extensions.ts rename to npm/ng-packs/packages/components/extensible/src/lib/models/internal/object-extensions.ts diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/lib/models/object-extensions.ts b/npm/ng-packs/packages/components/extensible/src/lib/models/object-extensions.ts similarity index 100% rename from npm/ng-packs/packages/theme-shared/extensions/src/lib/models/object-extensions.ts rename to npm/ng-packs/packages/components/extensible/src/lib/models/object-extensions.ts diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/lib/models/props.ts b/npm/ng-packs/packages/components/extensible/src/lib/models/props.ts similarity index 100% rename from npm/ng-packs/packages/theme-shared/extensions/src/lib/models/props.ts rename to npm/ng-packs/packages/components/extensible/src/lib/models/props.ts diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/lib/models/toolbar-actions.ts b/npm/ng-packs/packages/components/extensible/src/lib/models/toolbar-actions.ts similarity index 100% rename from npm/ng-packs/packages/theme-shared/extensions/src/lib/models/toolbar-actions.ts rename to npm/ng-packs/packages/components/extensible/src/lib/models/toolbar-actions.ts diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/lib/pipes/create-injector.pipe.ts b/npm/ng-packs/packages/components/extensible/src/lib/pipes/create-injector.pipe.ts similarity index 100% rename from npm/ng-packs/packages/theme-shared/extensions/src/lib/pipes/create-injector.pipe.ts rename to npm/ng-packs/packages/components/extensible/src/lib/pipes/create-injector.pipe.ts diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/lib/services/extensions.service.ts b/npm/ng-packs/packages/components/extensible/src/lib/services/extensions.service.ts similarity index 100% rename from npm/ng-packs/packages/theme-shared/extensions/src/lib/services/extensions.service.ts rename to npm/ng-packs/packages/components/extensible/src/lib/services/extensions.service.ts diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/lib/tokens/extensible-form-view-provider.token.ts b/npm/ng-packs/packages/components/extensible/src/lib/tokens/extensible-form-view-provider.token.ts similarity index 100% rename from npm/ng-packs/packages/theme-shared/extensions/src/lib/tokens/extensible-form-view-provider.token.ts rename to npm/ng-packs/packages/components/extensible/src/lib/tokens/extensible-form-view-provider.token.ts diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/lib/tokens/extensions.token.ts b/npm/ng-packs/packages/components/extensible/src/lib/tokens/extensions.token.ts similarity index 100% rename from npm/ng-packs/packages/theme-shared/extensions/src/lib/tokens/extensions.token.ts rename to npm/ng-packs/packages/components/extensible/src/lib/tokens/extensions.token.ts diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/lib/utils/actions.util.ts b/npm/ng-packs/packages/components/extensible/src/lib/utils/actions.util.ts similarity index 100% rename from npm/ng-packs/packages/theme-shared/extensions/src/lib/utils/actions.util.ts rename to npm/ng-packs/packages/components/extensible/src/lib/utils/actions.util.ts diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/lib/utils/enum.util.ts b/npm/ng-packs/packages/components/extensible/src/lib/utils/enum.util.ts similarity index 100% rename from npm/ng-packs/packages/theme-shared/extensions/src/lib/utils/enum.util.ts rename to npm/ng-packs/packages/components/extensible/src/lib/utils/enum.util.ts diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/lib/utils/factory.util.ts b/npm/ng-packs/packages/components/extensible/src/lib/utils/factory.util.ts similarity index 100% rename from npm/ng-packs/packages/theme-shared/extensions/src/lib/utils/factory.util.ts rename to npm/ng-packs/packages/components/extensible/src/lib/utils/factory.util.ts diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/lib/utils/form-props.util.ts b/npm/ng-packs/packages/components/extensible/src/lib/utils/form-props.util.ts similarity index 87% rename from npm/ng-packs/packages/theme-shared/extensions/src/lib/utils/form-props.util.ts rename to npm/ng-packs/packages/components/extensible/src/lib/utils/form-props.util.ts index c1295f21fa..ab7c669d47 100644 --- a/npm/ng-packs/packages/theme-shared/extensions/src/lib/utils/form-props.util.ts +++ b/npm/ng-packs/packages/components/extensible/src/lib/utils/form-props.util.ts @@ -1,11 +1,10 @@ import { UntypedFormControl, UntypedFormGroup } from '@angular/forms'; -import { DateTimeAdapter } from '../adapters/date-time.adapter'; -import { DateAdapter } from '../adapters/date.adapter'; -import { TimeAdapter } from '../adapters/time.adapter'; +import { DateTimeAdapter,DateAdapter,TimeAdapter } from '@abp/ng.theme.shared'; + import { EXTRA_PROPERTIES_KEY } from '../constants/extra-properties'; import { ePropType } from '../enums/props.enum'; -import { FormProp, FormPropList } from "../models/form-props"; -import { InferredProp, PropData } from "../models/props"; +import { FormPropList } from "../models/form-props"; +import { PropData } from "../models/props"; import { ExtensionsService } from '../services/extensions.service'; import { EXTENSIONS_IDENTIFIER } from '../tokens/extensions.token'; diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/lib/utils/localization.util.ts b/npm/ng-packs/packages/components/extensible/src/lib/utils/localization.util.ts similarity index 100% rename from npm/ng-packs/packages/theme-shared/extensions/src/lib/utils/localization.util.ts rename to npm/ng-packs/packages/components/extensible/src/lib/utils/localization.util.ts diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/lib/utils/props.util.ts b/npm/ng-packs/packages/components/extensible/src/lib/utils/props.util.ts similarity index 100% rename from npm/ng-packs/packages/theme-shared/extensions/src/lib/utils/props.util.ts rename to npm/ng-packs/packages/components/extensible/src/lib/utils/props.util.ts diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/lib/utils/state.util.ts b/npm/ng-packs/packages/components/extensible/src/lib/utils/state.util.ts similarity index 100% rename from npm/ng-packs/packages/theme-shared/extensions/src/lib/utils/state.util.ts rename to npm/ng-packs/packages/components/extensible/src/lib/utils/state.util.ts diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/lib/utils/typeahead.util.ts b/npm/ng-packs/packages/components/extensible/src/lib/utils/typeahead.util.ts similarity index 93% rename from npm/ng-packs/packages/theme-shared/extensions/src/lib/utils/typeahead.util.ts rename to npm/ng-packs/packages/components/extensible/src/lib/utils/typeahead.util.ts index b8038b7a69..eec592ad0c 100644 --- a/npm/ng-packs/packages/theme-shared/extensions/src/lib/utils/typeahead.util.ts +++ b/npm/ng-packs/packages/components/extensible/src/lib/utils/typeahead.util.ts @@ -39,11 +39,11 @@ export function createTypeaheadOptions( } export function getTypeaheadType(lookup: ExtensionPropertyUiLookupDto, name: string) { - return Boolean(lookup.url) - ? ePropType.Typeahead - : name.endsWith(TYPEAHEAD_TEXT_SUFFIX) - ? ePropType.Hidden - : undefined; + if (!!lookup.url) { + return ePropType.Typeahead; + } else { + return name.endsWith(TYPEAHEAD_TEXT_SUFFIX) ? ePropType.Hidden : undefined; + } } export function createTypeaheadDisplayNameGenerator( diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/lib/utils/validation.util.ts b/npm/ng-packs/packages/components/extensible/src/lib/utils/validation.util.ts similarity index 100% rename from npm/ng-packs/packages/theme-shared/extensions/src/lib/utils/validation.util.ts rename to npm/ng-packs/packages/components/extensible/src/lib/utils/validation.util.ts diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/public-api.ts b/npm/ng-packs/packages/components/extensible/src/public-api.ts similarity index 84% rename from npm/ng-packs/packages/theme-shared/extensions/src/public-api.ts rename to npm/ng-packs/packages/components/extensible/src/public-api.ts index 7268be4395..abcc3a1a0c 100644 --- a/npm/ng-packs/packages/theme-shared/extensions/src/public-api.ts +++ b/npm/ng-packs/packages/components/extensible/src/public-api.ts @@ -1,14 +1,10 @@ -export * from './lib/adapters/date-time.adapter'; -export * from './lib/adapters/date.adapter'; -export * from './lib/adapters/time.adapter'; -export * from './lib/components/date-time-picker/date-time-picker.component'; +export * from './lib/components/date-time-picker/extensible-date-time-picker.component'; export * from './lib/components/extensible-form/extensible-form-prop.component'; export * from './lib/components/extensible-form/extensible-form.component'; export * from './lib/components/extensible-table/extensible-table.component'; export * from './lib/components/grid-actions/grid-actions.component'; export * from './lib/components/page-toolbar/page-toolbar.component'; export * from './lib/constants/extra-properties'; -export * from './lib/directives/disabled.directive'; export * from './lib/directives/prop-data.directive'; export * from './lib/enums/props.enum'; export * from './lib/enums/components'; @@ -66,8 +62,8 @@ export * from './lib/pipes/create-injector.pipe'; export * from './lib/services/extensions.service'; export * from './lib/tokens/extensions.token'; export * from './lib/tokens/extensible-form-view-provider.token'; -export * from './lib/ui-extensions.module'; -export * from './lib/utils/actions.util'; + export * from './lib/utils/actions.util'; export * from './lib/utils/form-props.util'; export * from './lib/utils/props.util'; export * from './lib/utils/state.util'; +export * from './lib/extensible.module'; diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/tests/actions.spec.ts b/npm/ng-packs/packages/components/extensible/src/tests/actions.spec.ts similarity index 100% rename from npm/ng-packs/packages/theme-shared/extensions/src/tests/actions.spec.ts rename to npm/ng-packs/packages/components/extensible/src/tests/actions.spec.ts diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/tests/actions.util.spec.ts b/npm/ng-packs/packages/components/extensible/src/tests/actions.util.spec.ts similarity index 100% rename from npm/ng-packs/packages/theme-shared/extensions/src/tests/actions.util.spec.ts rename to npm/ng-packs/packages/components/extensible/src/tests/actions.util.spec.ts diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/tests/date-time.adapter.spec.ts b/npm/ng-packs/packages/components/extensible/src/tests/date-time.adapter.spec.ts similarity index 100% rename from npm/ng-packs/packages/theme-shared/extensions/src/tests/date-time.adapter.spec.ts rename to npm/ng-packs/packages/components/extensible/src/tests/date-time.adapter.spec.ts diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/tests/date.adapter.spec.ts b/npm/ng-packs/packages/components/extensible/src/tests/date.adapter.spec.ts similarity index 100% rename from npm/ng-packs/packages/theme-shared/extensions/src/tests/date.adapter.spec.ts rename to npm/ng-packs/packages/components/extensible/src/tests/date.adapter.spec.ts diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/tests/entity-actions.spec.ts b/npm/ng-packs/packages/components/extensible/src/tests/entity-actions.spec.ts similarity index 100% rename from npm/ng-packs/packages/theme-shared/extensions/src/tests/entity-actions.spec.ts rename to npm/ng-packs/packages/components/extensible/src/tests/entity-actions.spec.ts diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/tests/entity-props.spec.ts b/npm/ng-packs/packages/components/extensible/src/tests/entity-props.spec.ts similarity index 100% rename from npm/ng-packs/packages/theme-shared/extensions/src/tests/entity-props.spec.ts rename to npm/ng-packs/packages/components/extensible/src/tests/entity-props.spec.ts diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/tests/enum.util.spec.ts b/npm/ng-packs/packages/components/extensible/src/tests/enum.util.spec.ts similarity index 100% rename from npm/ng-packs/packages/theme-shared/extensions/src/tests/enum.util.spec.ts rename to npm/ng-packs/packages/components/extensible/src/tests/enum.util.spec.ts diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/tests/extensions.service.spec.ts b/npm/ng-packs/packages/components/extensible/src/tests/extensions.service.spec.ts similarity index 100% rename from npm/ng-packs/packages/theme-shared/extensions/src/tests/extensions.service.spec.ts rename to npm/ng-packs/packages/components/extensible/src/tests/extensions.service.spec.ts diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/tests/factory.util.spec.ts b/npm/ng-packs/packages/components/extensible/src/tests/factory.util.spec.ts similarity index 100% rename from npm/ng-packs/packages/theme-shared/extensions/src/tests/factory.util.spec.ts rename to npm/ng-packs/packages/components/extensible/src/tests/factory.util.spec.ts diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/tests/form-props.spec.ts b/npm/ng-packs/packages/components/extensible/src/tests/form-props.spec.ts similarity index 100% rename from npm/ng-packs/packages/theme-shared/extensions/src/tests/form-props.spec.ts rename to npm/ng-packs/packages/components/extensible/src/tests/form-props.spec.ts diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/tests/form-props.util.spec.ts b/npm/ng-packs/packages/components/extensible/src/tests/form-props.util.spec.ts similarity index 100% rename from npm/ng-packs/packages/theme-shared/extensions/src/tests/form-props.util.spec.ts rename to npm/ng-packs/packages/components/extensible/src/tests/form-props.util.spec.ts diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/tests/localization.util.spec.ts b/npm/ng-packs/packages/components/extensible/src/tests/localization.util.spec.ts similarity index 100% rename from npm/ng-packs/packages/theme-shared/extensions/src/tests/localization.util.spec.ts rename to npm/ng-packs/packages/components/extensible/src/tests/localization.util.spec.ts diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/tests/props.spec.ts b/npm/ng-packs/packages/components/extensible/src/tests/props.spec.ts similarity index 100% rename from npm/ng-packs/packages/theme-shared/extensions/src/tests/props.spec.ts rename to npm/ng-packs/packages/components/extensible/src/tests/props.spec.ts diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/tests/props.util.spec.ts b/npm/ng-packs/packages/components/extensible/src/tests/props.util.spec.ts similarity index 100% rename from npm/ng-packs/packages/theme-shared/extensions/src/tests/props.util.spec.ts rename to npm/ng-packs/packages/components/extensible/src/tests/props.util.spec.ts diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/tests/state.util.spec.ts b/npm/ng-packs/packages/components/extensible/src/tests/state.util.spec.ts similarity index 100% rename from npm/ng-packs/packages/theme-shared/extensions/src/tests/state.util.spec.ts rename to npm/ng-packs/packages/components/extensible/src/tests/state.util.spec.ts diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/tests/time.adapter.spec.ts b/npm/ng-packs/packages/components/extensible/src/tests/time.adapter.spec.ts similarity index 100% rename from npm/ng-packs/packages/theme-shared/extensions/src/tests/time.adapter.spec.ts rename to npm/ng-packs/packages/components/extensible/src/tests/time.adapter.spec.ts diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/tests/toolbar-actions.spec.ts b/npm/ng-packs/packages/components/extensible/src/tests/toolbar-actions.spec.ts similarity index 100% rename from npm/ng-packs/packages/theme-shared/extensions/src/tests/toolbar-actions.spec.ts rename to npm/ng-packs/packages/components/extensible/src/tests/toolbar-actions.spec.ts diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/tests/typeahead.util.spec.ts b/npm/ng-packs/packages/components/extensible/src/tests/typeahead.util.spec.ts similarity index 100% rename from npm/ng-packs/packages/theme-shared/extensions/src/tests/typeahead.util.spec.ts rename to npm/ng-packs/packages/components/extensible/src/tests/typeahead.util.spec.ts diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/tests/validation.util.spec.ts b/npm/ng-packs/packages/components/extensible/src/tests/validation.util.spec.ts similarity index 100% rename from npm/ng-packs/packages/theme-shared/extensions/src/tests/validation.util.spec.ts rename to npm/ng-packs/packages/components/extensible/src/tests/validation.util.spec.ts diff --git a/npm/ng-packs/packages/components/package.json b/npm/ng-packs/packages/components/package.json index 1dab4b4b6e..e9084eb9c0 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": "7.4.0", + "version": "7.4.1", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "peerDependencies": { - "@abp/ng.core": ">=7.4.0", - "@abp/ng.theme.shared": ">=7.4.0" + "@abp/ng.core": ">=7.4.1", + "@abp/ng.theme.shared": ">=7.4.1" }, "dependencies": { "chart.js": "^3.5.1", diff --git a/npm/ng-packs/packages/components/page/src/page.module.ts b/npm/ng-packs/packages/components/page/src/page.module.ts index d9d237cbdb..5bb27fbc66 100644 --- a/npm/ng-packs/packages/components/page/src/page.module.ts +++ b/npm/ng-packs/packages/components/page/src/page.module.ts @@ -1,7 +1,6 @@ import { CoreModule } from '@abp/ng.core'; import { ThemeSharedModule } from '@abp/ng.theme.shared'; -import { UiExtensionsModule } from '@abp/ng.theme.shared/extensions'; -import { CommonModule } from '@angular/common'; + import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; import { PagePartDirective } from './page-part.directive'; import { @@ -10,6 +9,7 @@ import { PageToolbarContainerComponent, } from './page-parts.component'; import { PageComponent } from './page.component'; +import {ExtensibleModule} from "@abp/ng.components/extensible"; const exportedDeclarations = [ PageComponent, @@ -21,7 +21,7 @@ const exportedDeclarations = [ @NgModule({ declarations: [...exportedDeclarations], - imports: [CommonModule, UiExtensionsModule, CoreModule, ThemeSharedModule], - exports: [...exportedDeclarations, UiExtensionsModule], + imports: [CommonModule, CoreModule, ThemeSharedModule, ExtensibleModule], + exports: [...exportedDeclarations], }) export class PageModule {} diff --git a/npm/ng-packs/packages/components/project.json b/npm/ng-packs/packages/components/project.json index 12a03b4ad1..fc73649c65 100644 --- a/npm/ng-packs/packages/components/project.json +++ b/npm/ng-packs/packages/components/project.json @@ -32,7 +32,12 @@ "lint": { "executor": "@nx/linter:eslint", "options": { - "lintFilePatterns": ["packages/components/src/**/*.ts", "packages/components/src/**/*.html"] + "lintFilePatterns": [ + "packages/components/src/**/*.ts", + "packages/components/src/**/*.html", + "packages/components/extensible/**/*.ts", + "packages/components/extensible/**/*.html" + ] }, "outputs": ["{options.outputFile}"] } diff --git a/npm/ng-packs/packages/core/package.json b/npm/ng-packs/packages/core/package.json index 1261fe6ee8..214e672d8f 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": "7.4.0", + "version": "7.4.1", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/utils": "~7.4.0", + "@abp/utils": "~7.4.1", "angular-oauth2-oidc": "^15.0.1", "just-clone": "^6.1.1", "just-compare": "^2.3.0", diff --git a/npm/ng-packs/packages/core/src/lib/abstracts/auth.guard.ts b/npm/ng-packs/packages/core/src/lib/abstracts/auth.guard.ts index 8fb4f4dc25..50473e4df1 100644 --- a/npm/ng-packs/packages/core/src/lib/abstracts/auth.guard.ts +++ b/npm/ng-packs/packages/core/src/lib/abstracts/auth.guard.ts @@ -2,7 +2,11 @@ import { Injectable } from '@angular/core'; import { UrlTree } from '@angular/router'; import { Observable } from 'rxjs'; import { IAbpGuard } from './abstract-guard'; +import { CanActivateFn } from '@angular/router'; +/** + * @deprecated Use `authGuard` *function* instead. + */ @Injectable({ providedIn: 'root', }) @@ -12,3 +16,8 @@ export class AuthGuard implements IAbpGuard { return false; } } + +export const authGuard: CanActivateFn = () => { + console.error('You should add @abp/ng-oauth packages or create your own auth packages.'); + return false; +}; diff --git a/npm/ng-packs/packages/core/src/lib/directives/caps-lock.directive.ts b/npm/ng-packs/packages/core/src/lib/directives/caps-lock.directive.ts index 16b3c40757..4d66a77b50 100644 --- a/npm/ng-packs/packages/core/src/lib/directives/caps-lock.directive.ts +++ b/npm/ng-packs/packages/core/src/lib/directives/caps-lock.directive.ts @@ -21,7 +21,7 @@ export class TrackCapsLockDirective { if ( (s.toUpperCase() === s && s.toLowerCase() !== s && e.shiftKey) || (s.toUpperCase() !== s && s.toLowerCase() === s && e.shiftKey) || - e.getModifierState('CapsLock') + (e.getModifierState && e.getModifierState('CapsLock')) ) { return true; } diff --git a/npm/ng-packs/packages/core/src/lib/guards/permission.guard.ts b/npm/ng-packs/packages/core/src/lib/guards/permission.guard.ts index ae3fdb6e37..342c73b572 100644 --- a/npm/ng-packs/packages/core/src/lib/guards/permission.guard.ts +++ b/npm/ng-packs/packages/core/src/lib/guards/permission.guard.ts @@ -1,23 +1,26 @@ import { Injectable, inject } from '@angular/core'; -import { ActivatedRouteSnapshot, Router, RouterStateSnapshot } from '@angular/router'; +import { + ActivatedRouteSnapshot, + CanActivateFn, + Router, + RouterStateSnapshot, +} from '@angular/router'; import { HttpErrorResponse } from '@angular/common/http'; - import { Observable, of } from 'rxjs'; import { tap } from 'rxjs/operators'; - -import { OAuthService } from 'angular-oauth2-oidc'; - -import { IAbpGuard } from '../abstracts'; +import { AuthService, IAbpGuard } from '../abstracts'; import { findRoute, getRoutePath } from '../utils/route-utils'; import { RoutesService, PermissionService, HttpErrorReporterService } from '../services'; - +/** + * @deprecated Use `permissionGuard` *function* instead. + */ @Injectable({ providedIn: 'root', }) export class PermissionGuard implements IAbpGuard { protected readonly router = inject(Router); protected readonly routesService = inject(RoutesService); - protected readonly oAuthService = inject(OAuthService); + protected readonly authService = inject(AuthService); protected readonly permissionService = inject(PermissionService); protected readonly httpErrorReporter = inject(HttpErrorReporterService); @@ -33,10 +36,38 @@ export class PermissionGuard implements IAbpGuard { return this.permissionService.getGrantedPolicy$(requiredPolicy).pipe( tap(access => { - if (!access && this.oAuthService.hasValidAccessToken()) { + if (!access && this.authService.isAuthenticated) { this.httpErrorReporter.reportError({ status: 403 } as HttpErrorResponse); } }), ); } } + +export const permissionGuard: CanActivateFn = ( + route: ActivatedRouteSnapshot, + state: RouterStateSnapshot, +) => { + const router = inject(Router); + const routesService = inject(RoutesService); + const authService = inject(AuthService); + const permissionService = inject(PermissionService); + const httpErrorReporter = inject(HttpErrorReporterService); + + let { requiredPolicy } = route.data || {}; + + if (!requiredPolicy) { + const routeFound = findRoute(routesService, getRoutePath(router, state.url)); + requiredPolicy = routeFound?.requiredPolicy; + } + + if (!requiredPolicy) return of(true); + + return permissionService.getGrantedPolicy$(requiredPolicy).pipe( + tap(access => { + if (!access && authService.isAuthenticated) { + httpErrorReporter.reportError({ status: 403 } as HttpErrorResponse); + } + }), + ); +}; diff --git a/npm/ng-packs/packages/core/src/lib/models/dtos.ts b/npm/ng-packs/packages/core/src/lib/models/dtos.ts index ee1f03fab3..9715a24859 100644 --- a/npm/ng-packs/packages/core/src/lib/models/dtos.ts +++ b/npm/ng-packs/packages/core/src/lib/models/dtos.ts @@ -114,14 +114,14 @@ export class CreationAuditedEntityDto extends EntityDto extends CreationAuditedEntityDto { creator?: TUserDto; constructor( - initialValues: Partial> = {}, + initialValues: Partial> = {}, ) { super(initialValues); } @@ -136,14 +136,15 @@ export class AuditedEntityDto extends CreationAuditedEntit } } +/** @deprecated the class signature will change in v8.0 */ export class AuditedEntityWithUserDto< - TUserDto, TPrimaryKey = string, + TUserDto = any, > extends AuditedEntityDto { creator?: TUserDto; lastModifier?: TUserDto; - constructor(initialValues: Partial> = {}) { + constructor(initialValues: Partial> = {}) { super(initialValues); } } @@ -157,16 +158,16 @@ export class FullAuditedEntityDto extends AuditedEntityDto super(initialValues); } } - +/** @deprecated the class signature will change in v8.0 */ export class FullAuditedEntityWithUserDto< - TUserDto, TPrimaryKey = string, + TUserDto = any > extends FullAuditedEntityDto { creator?: TUserDto; lastModifier?: TUserDto; deleter?: TUserDto; - constructor(initialValues: Partial> = {}) { + constructor(initialValues: Partial> = {}) { super(initialValues); } } diff --git a/npm/ng-packs/packages/core/src/lib/services/http-error-reporter.service.ts b/npm/ng-packs/packages/core/src/lib/services/http-error-reporter.service.ts index 65d063f82d..f43c114c8b 100644 --- a/npm/ng-packs/packages/core/src/lib/services/http-error-reporter.service.ts +++ b/npm/ng-packs/packages/core/src/lib/services/http-error-reporter.service.ts @@ -19,8 +19,8 @@ export class HttpErrorReporterService { return this._errors$.value; } - reportError = (error: HttpErrorResponse) => { + reportError(error: HttpErrorResponse) { this._reporter$.next(error); this._errors$.next([...this.errors, error]); - }; + } } diff --git a/npm/ng-packs/packages/core/src/lib/tests/permission.guard.spec.ts b/npm/ng-packs/packages/core/src/lib/tests/permission.guard.spec.ts index 372f3434f3..8b2a99476a 100644 --- a/npm/ng-packs/packages/core/src/lib/tests/permission.guard.spec.ts +++ b/npm/ng-packs/packages/core/src/lib/tests/permission.guard.spec.ts @@ -1,15 +1,26 @@ import { APP_BASE_HREF } from '@angular/common'; import { HttpClientTestingModule } from '@angular/common/http/testing'; import { Component } from '@angular/core'; -import { RouterModule } from '@angular/router'; -import { createServiceFactory, SpectatorService, SpyObject } from '@ngneat/spectator/jest'; +import { provideRouter, Route, Router, RouterModule } from '@angular/router'; +import { + createServiceFactory, + createSpyObject, + SpectatorService, + SpyObject, +} from '@ngneat/spectator/jest'; import { of } from 'rxjs'; -import { PermissionGuard } from '../guards/permission.guard'; +import { permissionGuard, PermissionGuard } from '../guards/permission.guard'; import { HttpErrorReporterService } from '../services/http-error-reporter.service'; import { PermissionService } from '../services/permission.service'; import { RoutesService } from '../services/routes.service'; import { CORE_OPTIONS } from '../tokens/options.token'; import { IncludeLocalizationResourcesProvider } from '../providers'; +import { TestBed } from '@angular/core/testing'; +import { RouterTestingHarness } from '@angular/router/testing'; +import { OTHERS_GROUP } from '../tokens'; +import { SORT_COMPARE_FUNC, compareFuncFactory } from '../tokens/compare-func.token'; +import { CoreModule } from '../core.module'; +import { AuthService } from '../abstracts'; describe('PermissionGuard', () => { let spectator: SpectatorService; @@ -18,6 +29,10 @@ describe('PermissionGuard', () => { let httpErrorReporter: SpyObject; let permissionService: SpyObject; + const mockOAuthService = { + isAuthenticated: true, + }; + @Component({ template: '' }) class DummyComponent {} @@ -27,25 +42,25 @@ describe('PermissionGuard', () => { declarations: [DummyComponent], imports: [ HttpClientTestingModule, - RouterModule.forRoot( - [ - { - path: 'test', - component: DummyComponent, - data: { - requiredPolicy: 'TestPolicy', - }, + RouterModule.forRoot([ + { + path: 'test', + component: DummyComponent, + data: { + requiredPolicy: 'TestPolicy', }, - ], - {}, - ), + }, + ]), ], providers: [ { provide: APP_BASE_HREF, useValue: '/', }, + { provide: AuthService, useValue: mockOAuthService }, { provide: CORE_OPTIONS, useValue: { skipGetAppConfiguration: true } }, + { provide: OTHERS_GROUP, useValue: 'AbpUi::OthersGroup' }, + { provide: SORT_COMPARE_FUNC, useValue: compareFuncFactory }, IncludeLocalizationResourcesProvider, ], }); @@ -108,3 +123,77 @@ describe('PermissionGuard', () => { }); }); }); + +@Component({ standalone: true, template: '' }) +class DummyComponent {} +describe('authGuard', () => { + let permissionService: SpyObject; + let httpErrorReporter: SpyObject; + + const mockOAuthService = { + isAuthenticated: true, + }; + + const routes: Route[] = [ + { + path: 'dummy', + component: DummyComponent, + canActivate: [permissionGuard], + data: { + requiredPolicy: 'TestPolicy', + }, + }, + { + path: 'zibzib', + component: DummyComponent, + canActivate: [permissionGuard], + }, + ]; + + beforeEach(() => { + httpErrorReporter = createSpyObject(HttpErrorReporterService); + permissionService = createSpyObject(PermissionService); + + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule, CoreModule.forRoot()], + providers: [ + { provide: AuthService, useValue: mockOAuthService }, + { provide: PermissionService, useValue: permissionService }, + { provide: HttpErrorReporterService, useValue: httpErrorReporter }, + provideRouter(routes), + ], + }); + }); + + it('should return true when the grantedPolicy is true', async () => { + permissionService.getGrantedPolicy$.andReturn(of(true)); + await RouterTestingHarness.create('/dummy'); + + expect(TestBed.inject(Router).url).toEqual('/dummy'); + expect(httpErrorReporter.reportError).not.toHaveBeenCalled(); + }); + + it('should return false and report an error when the grantedPolicy is false', async () => { + permissionService.getGrantedPolicy$.andReturn(of(false)); + await RouterTestingHarness.create('/dummy'); + + expect(TestBed.inject(Router).url).not.toEqual('/dummy'); + expect(httpErrorReporter.reportError).toHaveBeenCalled(); + expect(httpErrorReporter.reportError).toBeCalledWith({ status: 403 }); + }); + + it('should check the requiredPolicy from RoutesService', async () => { + permissionService.getGrantedPolicy$.mockImplementation(policy => { + return of(policy === 'TestPolicy'); + }); + await RouterTestingHarness.create('/dummy'); + + expect(TestBed.inject(Router).url).toEqual('/dummy'); + expect(httpErrorReporter.reportError).not.toHaveBeenCalled(); + }); + + it('should return Observable if RoutesService does not have requiredPolicy for given URL', async () => { + await RouterTestingHarness.create('/zibzib'); + expect(TestBed.inject(Router).url).toEqual('/zibzib'); + }); +}); diff --git a/npm/ng-packs/packages/core/src/lib/utils/file-utils.ts b/npm/ng-packs/packages/core/src/lib/utils/file-utils.ts index b5241ec096..71bbdd9600 100644 --- a/npm/ng-packs/packages/core/src/lib/utils/file-utils.ts +++ b/npm/ng-packs/packages/core/src/lib/utils/file-utils.ts @@ -1,3 +1,4 @@ +/** @deprecated the method will change in v8.0 */ export function downloadBlob(blob: Blob, filename: string) { const blobUrl = URL.createObjectURL(blob); diff --git a/npm/ng-packs/packages/feature-management/package.json b/npm/ng-packs/packages/feature-management/package.json index b07018c81e..de497ea449 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": "7.4.0", + "version": "7.4.1", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.theme.shared": "~7.4.0", + "@abp/ng.theme.shared": "~7.4.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 0a6721043d..eefbafd941 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": "7.4.0", + "version": "7.4.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 8b00379187..8df039e253 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": "7.4.0", + "version": "7.4.1", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.components": "~7.4.0", - "@abp/ng.permission-management": "~7.4.0", - "@abp/ng.theme.shared": "~7.4.0", + "@abp/ng.components": "~7.4.1", + "@abp/ng.permission-management": "~7.4.1", + "@abp/ng.theme.shared": "~7.4.1", "tslib": "^2.0.0" }, "publishConfig": { diff --git a/npm/ng-packs/packages/identity/src/lib/components/roles/roles.component.ts b/npm/ng-packs/packages/identity/src/lib/components/roles/roles.component.ts index 5e2a0e866a..fd8b3670f8 100644 --- a/npm/ng-packs/packages/identity/src/lib/components/roles/roles.component.ts +++ b/npm/ng-packs/packages/identity/src/lib/components/roles/roles.component.ts @@ -6,7 +6,7 @@ import { EXTENSIONS_IDENTIFIER, FormPropData, generateFormFromProps, -} from '@abp/ng.theme.shared/extensions'; +} from '@abp/ng.components/extensible'; import { Component, Injector, OnInit } from '@angular/core'; import { UntypedFormGroup } from '@angular/forms'; import { finalize } from 'rxjs/operators'; diff --git a/npm/ng-packs/packages/identity/src/lib/components/users/users.component.ts b/npm/ng-packs/packages/identity/src/lib/components/users/users.component.ts index 6dd1ab9f17..f8802de304 100644 --- a/npm/ng-packs/packages/identity/src/lib/components/users/users.component.ts +++ b/npm/ng-packs/packages/identity/src/lib/components/users/users.component.ts @@ -11,7 +11,7 @@ import { EXTENSIONS_IDENTIFIER, FormPropData, generateFormFromProps, -} from '@abp/ng.theme.shared/extensions'; +} from '@abp/ng.components/extensible'; import { Component, Injector, @@ -60,7 +60,7 @@ export class UsersComponent implements OnInit { permissionManagementKey = ePermissionManagementComponents.PermissionManagement; entityDisplayName: string; - + inputKey=eFormComponets.FormCheckboxComponent trackByFn: TrackByFunction = (index, item) => Object.keys(item)[0] || index; diff --git a/npm/ng-packs/packages/identity/src/lib/defaults/default-roles-entity-actions.ts b/npm/ng-packs/packages/identity/src/lib/defaults/default-roles-entity-actions.ts index fe6e0661d5..11a1b967e0 100644 --- a/npm/ng-packs/packages/identity/src/lib/defaults/default-roles-entity-actions.ts +++ b/npm/ng-packs/packages/identity/src/lib/defaults/default-roles-entity-actions.ts @@ -1,5 +1,5 @@ import { IdentityRoleDto } from '@abp/ng.identity/proxy'; -import { EntityAction } from '@abp/ng.theme.shared/extensions'; +import { EntityAction } from '@abp/ng.components/extensible'; import { RolesComponent } from '../components/roles/roles.component'; export const DEFAULT_ROLES_ENTITY_ACTIONS = EntityAction.createMany([ diff --git a/npm/ng-packs/packages/identity/src/lib/defaults/default-roles-entity-props.ts b/npm/ng-packs/packages/identity/src/lib/defaults/default-roles-entity-props.ts index c26124c531..6c3e473ae9 100644 --- a/npm/ng-packs/packages/identity/src/lib/defaults/default-roles-entity-props.ts +++ b/npm/ng-packs/packages/identity/src/lib/defaults/default-roles-entity-props.ts @@ -1,6 +1,6 @@ import { escapeHtmlChars, LocalizationService } from '@abp/ng.core'; import { IdentityRoleDto } from '@abp/ng.identity/proxy'; -import { EntityProp, ePropType } from '@abp/ng.theme.shared/extensions'; +import { EntityProp, ePropType } from '@abp/ng.components/extensible'; import { of } from 'rxjs'; export const DEFAULT_ROLES_ENTITY_PROPS = EntityProp.createMany([ diff --git a/npm/ng-packs/packages/identity/src/lib/defaults/default-roles-form-props.ts b/npm/ng-packs/packages/identity/src/lib/defaults/default-roles-form-props.ts index 129a095a02..d09b8755f2 100644 --- a/npm/ng-packs/packages/identity/src/lib/defaults/default-roles-form-props.ts +++ b/npm/ng-packs/packages/identity/src/lib/defaults/default-roles-form-props.ts @@ -1,5 +1,5 @@ import { IdentityRoleDto } from '@abp/ng.identity/proxy'; -import { ePropType, FormProp, PropData, PropPredicate } from "@abp/ng.theme.shared/extensions"; +import { ePropType, FormProp, PropData, PropPredicate } from "@abp/ng.components/extensible"; import { Validators } from '@angular/forms'; export const DEFAULT_ROLES_CREATE_FORM_PROPS = FormProp.createMany([ diff --git a/npm/ng-packs/packages/identity/src/lib/defaults/default-roles-toolbar-actions.ts b/npm/ng-packs/packages/identity/src/lib/defaults/default-roles-toolbar-actions.ts index e31e444669..e938342d8f 100644 --- a/npm/ng-packs/packages/identity/src/lib/defaults/default-roles-toolbar-actions.ts +++ b/npm/ng-packs/packages/identity/src/lib/defaults/default-roles-toolbar-actions.ts @@ -1,5 +1,5 @@ import { IdentityRoleDto } from '@abp/ng.identity/proxy'; -import { ToolbarAction } from '@abp/ng.theme.shared/extensions'; +import { ToolbarAction } from '@abp/ng.components/extensible'; import { RolesComponent } from '../components/roles/roles.component'; export const DEFAULT_ROLES_TOOLBAR_ACTIONS = ToolbarAction.createMany([ diff --git a/npm/ng-packs/packages/identity/src/lib/defaults/default-users-entity-actions.ts b/npm/ng-packs/packages/identity/src/lib/defaults/default-users-entity-actions.ts index ca0a2edcad..bc7c2dd8e6 100644 --- a/npm/ng-packs/packages/identity/src/lib/defaults/default-users-entity-actions.ts +++ b/npm/ng-packs/packages/identity/src/lib/defaults/default-users-entity-actions.ts @@ -1,5 +1,5 @@ import { IdentityUserDto } from '@abp/ng.identity/proxy'; -import { EntityAction } from '@abp/ng.theme.shared/extensions'; +import { EntityAction } from '@abp/ng.components/extensible'; import { UsersComponent } from '../components/users/users.component'; import { ConfigStateService, CurrentUserDto } from '@abp/ng.core'; diff --git a/npm/ng-packs/packages/identity/src/lib/defaults/default-users-entity-props.ts b/npm/ng-packs/packages/identity/src/lib/defaults/default-users-entity-props.ts index da277acd6c..a90a0d7458 100644 --- a/npm/ng-packs/packages/identity/src/lib/defaults/default-users-entity-props.ts +++ b/npm/ng-packs/packages/identity/src/lib/defaults/default-users-entity-props.ts @@ -1,6 +1,6 @@ import { escapeHtmlChars, LocalizationService } from '@abp/ng.core'; import { IdentityUserDto } from '@abp/ng.identity/proxy'; -import { EntityProp, ePropType } from '@abp/ng.theme.shared/extensions'; +import { EntityProp, ePropType } from '@abp/ng.components/extensible'; import { of } from 'rxjs'; export const DEFAULT_USERS_ENTITY_PROPS = EntityProp.createMany([ diff --git a/npm/ng-packs/packages/identity/src/lib/defaults/default-users-form-props.ts b/npm/ng-packs/packages/identity/src/lib/defaults/default-users-form-props.ts index 3c1a3e4c82..9f802c8283 100644 --- a/npm/ng-packs/packages/identity/src/lib/defaults/default-users-form-props.ts +++ b/npm/ng-packs/packages/identity/src/lib/defaults/default-users-form-props.ts @@ -1,7 +1,7 @@ import { Validators } from '@angular/forms'; import { ConfigStateService, CurrentUserDto } from '@abp/ng.core'; import { getPasswordValidators } from '@abp/ng.theme.shared'; -import { ePropType, FormProp } from '@abp/ng.theme.shared/extensions'; +import { ePropType, FormProp } from '@abp/ng.components/extensible'; import { IdentityUserDto } from '@abp/ng.identity/proxy'; export const DEFAULT_USERS_CREATE_FORM_PROPS = FormProp.createMany([ diff --git a/npm/ng-packs/packages/identity/src/lib/defaults/default-users-toolbar-actions.ts b/npm/ng-packs/packages/identity/src/lib/defaults/default-users-toolbar-actions.ts index 72092cbb1a..75053fcaa9 100644 --- a/npm/ng-packs/packages/identity/src/lib/defaults/default-users-toolbar-actions.ts +++ b/npm/ng-packs/packages/identity/src/lib/defaults/default-users-toolbar-actions.ts @@ -1,5 +1,5 @@ import { IdentityUserDto } from '@abp/ng.identity/proxy'; -import { ToolbarAction } from '@abp/ng.theme.shared/extensions'; +import { ToolbarAction } from '@abp/ng.components/extensible'; import { UsersComponent } from '../components/users/users.component'; export const DEFAULT_USERS_TOOLBAR_ACTIONS = ToolbarAction.createMany([ diff --git a/npm/ng-packs/packages/identity/src/lib/guards/extensions.guard.ts b/npm/ng-packs/packages/identity/src/lib/guards/extensions.guard.ts index 172b599f91..c78e03b6af 100644 --- a/npm/ng-packs/packages/identity/src/lib/guards/extensions.guard.ts +++ b/npm/ng-packs/packages/identity/src/lib/guards/extensions.guard.ts @@ -10,7 +10,7 @@ import { mapEntitiesToContributors, mergeWithDefaultActions, mergeWithDefaultProps, -} from '@abp/ng.theme.shared/extensions'; +} from '@abp/ng.components/extensible'; import { eIdentityComponents } from '../enums/components'; import { @@ -26,6 +26,9 @@ import { IDENTITY_TOOLBAR_ACTION_CONTRIBUTORS, } from '../tokens/extensions.token'; +/** + * @deprecated Use `identityExtensionsResolver` *function* instead. + */ @Injectable() export class IdentityExtensionsGuard implements IAbpGuard { protected readonly configState = inject(ConfigStateService); diff --git a/npm/ng-packs/packages/identity/src/lib/identity-routing.module.ts b/npm/ng-packs/packages/identity/src/lib/identity-routing.module.ts index 33c8f53d5a..93ac912d97 100644 --- a/npm/ng-packs/packages/identity/src/lib/identity-routing.module.ts +++ b/npm/ng-packs/packages/identity/src/lib/identity-routing.module.ts @@ -1,9 +1,9 @@ import { NgModule } from '@angular/core'; -import { RouterModule, Routes, mapToCanActivate } from '@angular/router'; +import { RouterModule, Routes } from '@angular/router'; import { - AuthGuard, - PermissionGuard, + authGuard, + permissionGuard, ReplaceableComponents, ReplaceableRouteContainerComponent, RouterOutletComponent, @@ -12,14 +12,15 @@ import { import { RolesComponent } from './components/roles/roles.component'; import { UsersComponent } from './components/users/users.component'; import { eIdentityComponents } from './enums/components'; -import { IdentityExtensionsGuard } from './guards'; +import { identityExtensionsResolver } from './resolvers'; const routes: Routes = [ { path: '', redirectTo: 'roles', pathMatch: 'full' }, { path: '', component: RouterOutletComponent, - canActivate: mapToCanActivate([AuthGuard, PermissionGuard, IdentityExtensionsGuard]), + canActivate: [authGuard, permissionGuard], + resolve: [identityExtensionsResolver], children: [ { path: 'roles', diff --git a/npm/ng-packs/packages/identity/src/lib/identity.module.ts b/npm/ng-packs/packages/identity/src/lib/identity.module.ts index e6c11d195e..ea07602f7c 100644 --- a/npm/ng-packs/packages/identity/src/lib/identity.module.ts +++ b/npm/ng-packs/packages/identity/src/lib/identity.module.ts @@ -1,7 +1,7 @@ import { CoreModule, LazyModuleFactory } from '@abp/ng.core'; import { PermissionManagementModule } from '@abp/ng.permission-management'; import { ThemeSharedModule } from '@abp/ng.theme.shared'; -import { UiExtensionsModule } from '@abp/ng.theme.shared/extensions'; +import { ExtensibleModule } from '@abp/ng.components/extensible'; import { ModuleWithProviders, NgModule, NgModuleFactory } from '@angular/core'; import { NgbDropdownModule, NgbNavModule } from '@ng-bootstrap/ng-bootstrap'; import { NgxValidateCoreModule } from '@ngx-validate/core'; @@ -27,7 +27,7 @@ import { PageModule } from '@abp/ng.components/page'; IdentityRoutingModule, NgbNavModule, ThemeSharedModule, - UiExtensionsModule, + ExtensibleModule, NgbDropdownModule, PermissionManagementModule, NgxValidateCoreModule, diff --git a/npm/ng-packs/packages/identity/src/lib/models/config-options.ts b/npm/ng-packs/packages/identity/src/lib/models/config-options.ts index b244a1a51a..56abbd11e6 100644 --- a/npm/ng-packs/packages/identity/src/lib/models/config-options.ts +++ b/npm/ng-packs/packages/identity/src/lib/models/config-options.ts @@ -5,7 +5,7 @@ import { EntityActionContributorCallback, EntityPropContributorCallback, ToolbarActionContributorCallback, -} from '@abp/ng.theme.shared/extensions'; +} from '@abp/ng.components/extensible'; import { eIdentityComponents } from '../enums/components'; export type IdentityEntityActionContributors = Partial<{ diff --git a/npm/ng-packs/packages/identity/src/lib/resolvers/extensions.resolver.ts b/npm/ng-packs/packages/identity/src/lib/resolvers/extensions.resolver.ts new file mode 100644 index 0000000000..45856046d8 --- /dev/null +++ b/npm/ng-packs/packages/identity/src/lib/resolvers/extensions.resolver.ts @@ -0,0 +1,75 @@ +import { inject } from '@angular/core'; +import { map, tap } from 'rxjs'; +import { ConfigStateService } from '@abp/ng.core'; +import { + ExtensionsService, + getObjectExtensionEntitiesFromStore, + mapEntitiesToContributors, + mergeWithDefaultActions, + mergeWithDefaultProps, +} from '@abp/ng.components/extensible'; +import { eIdentityComponents } from '../enums'; +import { + IDENTITY_ENTITY_ACTION_CONTRIBUTORS, + IDENTITY_TOOLBAR_ACTION_CONTRIBUTORS, + IDENTITY_ENTITY_PROP_CONTRIBUTORS, + IDENTITY_CREATE_FORM_PROP_CONTRIBUTORS, + IDENTITY_EDIT_FORM_PROP_CONTRIBUTORS, + DEFAULT_IDENTITY_ENTITY_ACTIONS, + DEFAULT_IDENTITY_TOOLBAR_ACTIONS, + DEFAULT_IDENTITY_ENTITY_PROPS, + DEFAULT_IDENTITY_CREATE_FORM_PROPS, + DEFAULT_IDENTITY_EDIT_FORM_PROPS, +} from '../tokens'; +import { ResolveFn } from '@angular/router'; + +export const identityExtensionsResolver: ResolveFn = () => { + const configState = inject(ConfigStateService); + const extensions = inject(ExtensionsService); + + const config = { optional: true }; + + const actionContributors = inject(IDENTITY_ENTITY_ACTION_CONTRIBUTORS, config) || {}; + const toolbarContributors = inject(IDENTITY_TOOLBAR_ACTION_CONTRIBUTORS, config) || {}; + const propContributors = inject(IDENTITY_ENTITY_PROP_CONTRIBUTORS, config) || {}; + const createFormContributors = inject(IDENTITY_CREATE_FORM_PROP_CONTRIBUTORS, config) || {}; + const editFormContributors = inject(IDENTITY_EDIT_FORM_PROP_CONTRIBUTORS, config) || {}; + + return getObjectExtensionEntitiesFromStore(configState, 'Identity').pipe( + map(entities => ({ + [eIdentityComponents.Roles]: entities.Role, + [eIdentityComponents.Users]: entities.User, + })), + mapEntitiesToContributors(configState, 'AbpIdentity'), + tap(objectExtensionContributors => { + mergeWithDefaultActions( + extensions.entityActions, + DEFAULT_IDENTITY_ENTITY_ACTIONS, + actionContributors, + ); + mergeWithDefaultActions( + extensions.toolbarActions, + DEFAULT_IDENTITY_TOOLBAR_ACTIONS, + toolbarContributors, + ); + mergeWithDefaultProps( + extensions.entityProps, + DEFAULT_IDENTITY_ENTITY_PROPS, + objectExtensionContributors.prop, + propContributors, + ); + mergeWithDefaultProps( + extensions.createFormProps, + DEFAULT_IDENTITY_CREATE_FORM_PROPS, + objectExtensionContributors.createForm, + createFormContributors, + ); + mergeWithDefaultProps( + extensions.editFormProps, + DEFAULT_IDENTITY_EDIT_FORM_PROPS, + objectExtensionContributors.editForm, + editFormContributors, + ); + }), + ); +}; diff --git a/npm/ng-packs/packages/identity/src/lib/resolvers/index.ts b/npm/ng-packs/packages/identity/src/lib/resolvers/index.ts new file mode 100644 index 0000000000..754a8ccf12 --- /dev/null +++ b/npm/ng-packs/packages/identity/src/lib/resolvers/index.ts @@ -0,0 +1 @@ +export * from './extensions.resolver' \ No newline at end of file diff --git a/npm/ng-packs/packages/identity/src/lib/tokens/extensions.token.ts b/npm/ng-packs/packages/identity/src/lib/tokens/extensions.token.ts index 3a91d38c27..ec3af0649d 100644 --- a/npm/ng-packs/packages/identity/src/lib/tokens/extensions.token.ts +++ b/npm/ng-packs/packages/identity/src/lib/tokens/extensions.token.ts @@ -5,7 +5,7 @@ import { EntityActionContributorCallback, EntityPropContributorCallback, ToolbarActionContributorCallback, -} from '@abp/ng.theme.shared/extensions'; +} from '@abp/ng.components/extensible'; import { InjectionToken } from '@angular/core'; import { DEFAULT_ROLES_ENTITY_ACTIONS } from '../defaults/default-roles-entity-actions'; import { DEFAULT_ROLES_ENTITY_PROPS } from '../defaults/default-roles-entity-props'; diff --git a/npm/ng-packs/packages/identity/src/public-api.ts b/npm/ng-packs/packages/identity/src/public-api.ts index 7e85188004..4c4913f7eb 100644 --- a/npm/ng-packs/packages/identity/src/public-api.ts +++ b/npm/ng-packs/packages/identity/src/public-api.ts @@ -4,3 +4,4 @@ export * from './lib/guards'; export * from './lib/identity.module'; export * from './lib/models'; export * from './lib/tokens'; +export * from './lib/resolvers'; diff --git a/npm/ng-packs/packages/oauth/package.json b/npm/ng-packs/packages/oauth/package.json index 04580b0c1e..b9dda531bb 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": "7.4.0", + "version": "7.4.1", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.core": "~7.4.0", - "@abp/utils": "~7.4.0", + "@abp/ng.core": "~7.4.1", + "@abp/utils": "~7.4.1", "angular-oauth2-oidc": "^15.0.1", "just-clone": "^6.1.1", "just-compare": "^2.3.0", diff --git a/npm/ng-packs/packages/oauth/src/lib/guards/oauth.guard.ts b/npm/ng-packs/packages/oauth/src/lib/guards/oauth.guard.ts index 2571a1756c..6f751804cd 100644 --- a/npm/ng-packs/packages/oauth/src/lib/guards/oauth.guard.ts +++ b/npm/ng-packs/packages/oauth/src/lib/guards/oauth.guard.ts @@ -1,11 +1,19 @@ import { Injectable, inject } from '@angular/core'; -import { UrlTree, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router'; +import { + UrlTree, + ActivatedRouteSnapshot, + RouterStateSnapshot, + CanActivateFn, +} from '@angular/router'; import { Observable } from 'rxjs'; import { OAuthService } from 'angular-oauth2-oidc'; import { AuthService, IAbpGuard } from '@abp/ng.core'; +/** + * @deprecated Use `abpOAuthGuard` *function* instead. + */ @Injectable({ providedIn: 'root', }) @@ -27,3 +35,21 @@ export class AbpOAuthGuard implements IAbpGuard { return false; } } + +export const abpOAuthGuard: CanActivateFn = ( + route: ActivatedRouteSnapshot, + state: RouterStateSnapshot, +) => { + const oAuthService = inject(OAuthService); + const authService = inject(AuthService); + + const hasValidAccessToken = oAuthService.hasValidAccessToken(); + + if (hasValidAccessToken) { + return true; + } + + const params = { returnUrl: state.url }; + authService.navigateToLogin(params); + return false; +}; diff --git a/npm/ng-packs/packages/oauth/src/lib/oauth.module.ts b/npm/ng-packs/packages/oauth/src/lib/oauth.module.ts index ac800e7c8f..3ee3741d04 100644 --- a/npm/ng-packs/packages/oauth/src/lib/oauth.module.ts +++ b/npm/ng-packs/packages/oauth/src/lib/oauth.module.ts @@ -5,6 +5,7 @@ import { AbpLocalStorageService, ApiInterceptor, AuthGuard, + authGuard, AuthService, CHECK_AUTHENTICATION_STATE_FN_KEY, noop, @@ -14,7 +15,7 @@ import { AbpOAuthService } from './services'; import { OAuthConfigurationHandler } from './handlers/oauth-configuration.handler'; import { HTTP_INTERCEPTORS } from '@angular/common/http'; import { OAuthApiInterceptor } from './interceptors/api.interceptor'; -import { AbpOAuthGuard } from './guards/oauth.guard'; +import { AbpOAuthGuard, abpOAuthGuard } from './guards/oauth.guard'; import { NavigateToManageProfileProvider } from './providers'; import { checkAccessToken, pipeToLogin } from './utils'; @@ -34,6 +35,10 @@ export class AbpOAuthModule { provide: AuthGuard, useClass: AbpOAuthGuard, }, + { + provide: authGuard, + useValue: abpOAuthGuard, + }, { provide: ApiInterceptor, useClass: OAuthApiInterceptor, diff --git a/npm/ng-packs/packages/oauth/src/lib/tests/auth.guard.spec.ts b/npm/ng-packs/packages/oauth/src/lib/tests/auth.guard.spec.ts index feca76666e..e8a0f2dbf0 100644 --- a/npm/ng-packs/packages/oauth/src/lib/tests/auth.guard.spec.ts +++ b/npm/ng-packs/packages/oauth/src/lib/tests/auth.guard.spec.ts @@ -1,14 +1,25 @@ import { createServiceFactory, SpectatorService, createSpyObject } from '@ngneat/spectator/jest'; import { OAuthService } from 'angular-oauth2-oidc'; -import { AbpOAuthGuard } from '../guards/oauth.guard'; +import { AbpOAuthGuard, abpOAuthGuard } from '../guards/oauth.guard'; import { AuthService } from '@abp/ng.core'; -import { ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router'; +import { + ActivatedRouteSnapshot, + Route, + Router, + RouterStateSnapshot, + provideRouter, +} from '@angular/router'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { Component } from '@angular/core'; +import { TestBed } from '@angular/core/testing'; +import { RouterTestingHarness } from '@angular/router/testing'; +import { SpyObject } from '@ngneat/spectator'; describe('AuthGuard', () => { let spectator: SpectatorService; - let guard : AbpOAuthGuard; - const route = createSpyObject(ActivatedRouteSnapshot) - const state = createSpyObject(RouterStateSnapshot) + let guard: AbpOAuthGuard; + const route = createSpyObject(ActivatedRouteSnapshot); + const state = createSpyObject(RouterStateSnapshot); const createService = createServiceFactory({ service: AbpOAuthGuard, @@ -34,3 +45,47 @@ describe('AuthGuard', () => { expect(navigateToLoginSpy).toHaveBeenCalled(); }); }); + +@Component({ standalone: true, template: '' }) +class DummyComponent {} +describe('authGuard', () => { + let oAuthService: SpyObject; + let authService: SpyObject; + const routes: Route[] = [ + { + path: 'dummy', + canActivate: [abpOAuthGuard], + component: DummyComponent, + }, + ]; + + beforeEach(() => { + authService = createSpyObject(AuthService); + oAuthService = createSpyObject(OAuthService); + + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + providers: [ + { provide: AuthService, useValue: authService }, + { provide: OAuthService, useValue: oAuthService }, + provideRouter(routes), + ], + }); + }); + + it('should move to the dummy route', async () => { + oAuthService.hasValidAccessToken.andReturn(true); + await RouterTestingHarness.create('/dummy'); + + expect(TestBed.inject(Router).url).toEqual('/dummy'); + }); + + it("should'nt move to the dummy route", async () => { + oAuthService.hasValidAccessToken.andReturn(false); + await RouterTestingHarness.create('/dummy'); + + expect(authService.navigateToLogin).toHaveBeenCalled(); + expect(TestBed.inject(Router).url).not.toEqual('/dummy'); + expect(TestBed.inject(Router).url).toEqual('/'); + }); +}); diff --git a/npm/ng-packs/packages/oauth/src/lib/utils/auth-utils.ts b/npm/ng-packs/packages/oauth/src/lib/utils/auth-utils.ts index f1dc5b6106..bd50e97ee7 100644 --- a/npm/ng-packs/packages/oauth/src/lib/utils/auth-utils.ts +++ b/npm/ng-packs/packages/oauth/src/lib/utils/auth-utils.ts @@ -1,6 +1,5 @@ -import { inject, Injector } from '@angular/core'; +import { Injector } from '@angular/core'; import { Router } from '@angular/router'; -import { OAuthStorage, TokenResponse } from 'angular-oauth2-oidc'; import { pipe } from 'rxjs'; import { switchMap, tap } from 'rxjs/operators'; import { diff --git a/npm/ng-packs/packages/permission-management/package.json b/npm/ng-packs/packages/permission-management/package.json index 692bb6c2be..ee9c2ebfaa 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": "7.4.0", + "version": "7.4.1", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.theme.shared": "~7.4.0", + "@abp/ng.theme.shared": "~7.4.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 2389ce3f45..7d613dee16 100644 --- a/npm/ng-packs/packages/schematics/package.json +++ b/npm/ng-packs/packages/schematics/package.json @@ -1,19 +1,19 @@ { "name": "@abp/ng.schematics", - "version": "7.4.0", + "version": "7.4.1", "author": "", "schematics": "./collection.json", "dependencies": { - "@angular-devkit/core": "~16.0.0", - "@angular-devkit/schematics": "~16.0.0", - "@angular/cli": "~16.0.0", + "@angular-devkit/core": "~16.2.0", + "@angular-devkit/schematics": "~16.2.0", + "@angular/cli": "~16.2.0", "got": "^11.5.2", "jsonc-parser": "^2.3.0", "should-quote": "^1.0.0", "typescript": "5.0.4" }, "devDependencies": { - "@schematics/angular": "~16.0.0", + "@schematics/angular": "~16.2.0", "@types/jest": "29.4.4", "@types/node": "20.2.5", "jest": "29.4.3", diff --git a/npm/ng-packs/packages/schematics/src/constants/system-types.ts b/npm/ng-packs/packages/schematics/src/constants/system-types.ts index 19a8eee259..d64c36d1b8 100644 --- a/npm/ng-packs/packages/schematics/src/constants/system-types.ts +++ b/npm/ng-packs/packages/schematics/src/constants/system-types.ts @@ -5,6 +5,8 @@ export const SYSTEM_TYPES = new Map([ ['Collections.Generic.Dictionary', 'Record'], ['DateTime', 'string'], ['DateTimeOffset', 'string'], + ['DateOnly', 'string'], + ['TimeOnly', 'string'], ['Decimal', 'number'], ['Double', 'number'], ['Guid', 'string'], diff --git a/npm/ng-packs/packages/schematics/src/index.ts b/npm/ng-packs/packages/schematics/src/index.ts index cb0ff5c3b5..64f4e4cb7a 100644 --- a/npm/ng-packs/packages/schematics/src/index.ts +++ b/npm/ng-packs/packages/schematics/src/index.ts @@ -1 +1,3 @@ -export {}; +export * from './enums'; +export * from './models'; +export * from './constants'; diff --git a/npm/ng-packs/packages/schematics/src/tests/parse-generic-type.spec.ts b/npm/ng-packs/packages/schematics/src/tests/parse-generic-type.spec.ts new file mode 100644 index 0000000000..400fcdf6eb --- /dev/null +++ b/npm/ng-packs/packages/schematics/src/tests/parse-generic-type.spec.ts @@ -0,0 +1,129 @@ +import { parseBaseTypeWithGenericTypes } from '../utils/model'; +import { parseGenerics } from '../utils/tree'; + +import {test} from '@jest/globals'; + +const cases: Array<[string, string[]]> = [ + [ + 'Volo.Abp.Application.Dtos.AuditedEntityWithUserDto', + ['Volo.Abp.Application.Dtos.AuditedEntityWithUserDto'], + ], + [ + 'Volo.Abp.Application.Dtos.AuditedEntityWithUserDto', + ['Volo.Abp.Application.Dtos.AuditedEntityWithUserDto', 'Volo.Abp.Identity.IdentityUserDto'], + ], + [ + 'Volo.Abp.Application.Dtos.AuditedEntityWithUserDto', + [ + 'Volo.Abp.Application.Dtos.AuditedEntityWithUserDto', + 'string', + 'Volo.Abp.Identity.IdentityUserDto' + ], + ], + [ + 'Volo.Abp.Application.Dtos.AuditedEntityWithUserDto>', + [ + 'Volo.Abp.Application.Dtos.AuditedEntityWithUserDto', + 'string', + 'Volo.Abp.Identity.IdentityUserDto', + 'number', + ], + ], + [ + 'Volo.Abp.Application.Dtos.AuditedEntityWithUserDto>>', + [ + 'Volo.Abp.Application.Dtos.AuditedEntityWithUserDto', + 'string', + 'Volo.Abp.Identity.IdentityUserDto', + 'Volo.Abp.Core.Dummy', + 'System.String', + ], + ], + [ + 'AuditedEntityWithUserDto', + ['AuditedEntityWithUserDto'], + ], +]; + +test.each(cases)('should parse %s', (inputStr, expected) => { + const parsed = parseBaseTypeWithGenericTypes(inputStr); + expect(parsed).toEqual(expected); +}) + +describe('parseGenerics', () => { + + it('should work with simple type', function() { + const node = parseGenerics('System.String'); + expect(node.data).toEqual('System.String'); + expect(node.index).toBe(0); + expect(node.parent).toBe(null); + }); + it('should work with simple Array type', function() { + const node = parseGenerics('System.String[]'); + expect(node.data).toEqual('System.String[]'); + expect(node.index).toBe(0); + expect(node.parent).toBe(null); + }); + + it('should work with simple', function() { + const node = parseGenerics('Volo.Abp.Application.Dtos.AuditedEntityWithUserDto'); + expect(node.data).toEqual('Volo.Abp.Application.Dtos.AuditedEntityWithUserDto'); + expect(node.index).toBe(0); + expect(node.parent).toBe(null); + }); + + it('should work with `Volo.Abp.Application.Dtos.AuditedEntityWithUserDto`', function() { + const type = 'Volo.Abp.Application.Dtos.AuditedEntityWithUserDto'; + const node = parseGenerics(type); + + expect(node.data).toEqual('Volo.Abp.Application.Dtos.AuditedEntityWithUserDto'); + expect(node.children.length).toBe(1); + const child = node.children[0]; + expect(node.children[0].data).toEqual('Volo.Abp.Identity.IdentityUserDto'); + expect(child.parent).toBe(node); + }); + + + it('should work with `Volo.Abp.Application.Dtos.AuditedEntityWithUserDto`', function() { + const type = 'Volo.Abp.Application.Dtos.AuditedEntityWithUserDto'; + const node = parseGenerics(type); + + expect(node.data).toEqual('Volo.Abp.Application.Dtos.AuditedEntityWithUserDto'); + expect(node.children.length).toBe(2); + expect(node.children[0].data).toEqual('System.string'); + expect(node.children[0].index).toBe(0) + expect(node.children[1].data).toEqual('Volo.Abp.Identity.IdentityUserDto'); + expect(node.children[1].index).toBe(1); + + }); + it('should Volo.Abp.Application.Dtos.AuditedEntityWithUserDto>', function() { + const type = 'Volo.Abp.Application.Dtos.AuditedEntityWithUserDto>'; + const node = parseGenerics(type); + expect(node.data).toEqual('Volo.Abp.Application.Dtos.AuditedEntityWithUserDto'); + expect(node.children.length).toBe(2); + expect(node.children[0].data).toEqual('System.string'); + expect((node.children[0]).parent).toBe(node); + + expect(node.children[1].data).toEqual('Volo.Abp.Identity.IdentityUserDto'); + expect(node.children[1].children.length).toBe(1); + expect(node.children[1].children[0].data).toEqual('System.Int'); + expect(node.children[1].children[0].parent).toBe(node.children[1]) + expect(node.children[1].children[0].index).toBe(0) + + }); + + it('should Volo.Abp.Application.Dtos.AuditedEntityWithUserDto,System.string>', function() { + const type = 'Volo.Abp.Application.Dtos.AuditedEntityWithUserDto,System.string>'; + const node = parseGenerics(type); + expect(node.data).toEqual('Volo.Abp.Application.Dtos.AuditedEntityWithUserDto'); + expect(node.children.length).toBe(2); + expect(node.children[0].data).toEqual('Volo.Abp.Identity.IdentityUserDto'); + expect(node.children[0].children.length).toBe(1); + expect(node.children[0].children[0].data).toEqual('System.Int'); + expect(node.children[1].data).toEqual('System.string'); + + }); +}); + + + diff --git a/npm/ng-packs/packages/schematics/src/utils/model.ts b/npm/ng-packs/packages/schematics/src/utils/model.ts index 4ef8a4cb97..11ff88d15a 100644 --- a/npm/ng-packs/packages/schematics/src/utils/model.ts +++ b/npm/ng-packs/packages/schematics/src/utils/model.ts @@ -9,7 +9,7 @@ import { import { parseNamespace } from './namespace'; import { relativePathToModel } from './path'; import { camel } from './text'; -import { parseGenerics } from './tree'; +import { parseGenerics, TypeNode } from './tree'; import { createTypeParser, createTypeSimplifier, @@ -71,12 +71,16 @@ export function createImportRefsToModelReducer(params: ModelGeneratorParams) { model.interfaces.forEach(_interface => { const { baseType } = types[_interface.ref]; - if (baseType && parseNamespace(solution, baseType) !== model.namespace) - toBeImported.push({ - type: baseType.split('<')[0], - isEnum: false, - }); + if (baseType && parseNamespace(solution, baseType) !== model.namespace){ + const baseTypeWithGenericParams = parseBaseTypeWithGenericTypes(baseType); + baseTypeWithGenericParams.forEach(t => { + toBeImported.push({ + type: t, + isEnum: false, + }); + }) +} [..._interface.properties, ..._interface.generics].forEach(prop => { prop.refs.forEach(ref => { const propType = types[ref]; @@ -172,7 +176,20 @@ export function createRefToImportReducerCreator(params: ModelGeneratorParams) { } function isOptionalProperty(prop: PropertyDef) { - return ( - prop.typeSimple.endsWith('?') || (prop.typeSimple === 'string' && prop.isRequired === false) - ); + return (prop.typeSimple.endsWith('?') || (prop.typeSimple === 'string' && !prop.isRequired)); +} + +export function parseBaseTypeWithGenericTypes(type: string): string[] { + const parsedTypeNode = parseGenerics(type); + const nodeToText = (node: TypeNode,acc:string[] = []): string[] => { + + acc.push(node.data); + if(node.children && node.children.length > 0){ + node.children.forEach(child => { + nodeToText(child,acc); + }) + } + return acc; + } + return nodeToText(parsedTypeNode); } diff --git a/npm/ng-packs/packages/schematics/src/utils/tree.ts b/npm/ng-packs/packages/schematics/src/utils/tree.ts index 5fd8414f0c..489e0229fc 100644 --- a/npm/ng-packs/packages/schematics/src/utils/tree.ts +++ b/npm/ng-packs/packages/schematics/src/utils/tree.ts @@ -39,7 +39,7 @@ export class TypeNode { } } -export function parseGenerics(type: string, mapperFn?: TypeNodeMapperFn) { +export function parseGenericsOld(type: string, mapperFn?: TypeNodeMapperFn) { const [rootType, ...types] = type.split('<'); const root = new TypeNode(rootType, null, mapperFn); @@ -68,4 +68,33 @@ export function parseGenerics(type: string, mapperFn?: TypeNodeMapperFn) { return root; } +export function parseGenerics(type: string, mapperFn?: TypeNodeMapperFn, parent?: TypeNode | null): TypeNode { + const regex = /(?[\w.]+)<(?.*)>/; + + const match = type.match(regex); + if (!match) { + return new TypeNode(type, null, mapperFn); + } + + const mainType = match.groups?.MainType || ''; + const genericType = match.groups?.GenericType || ''; + const root = new TypeNode(mainType, parent ?? null, mapperFn); + if (genericType.includes(',')) { + const genericTypes = genericType.split(','); + genericTypes.forEach((genericType, index) => { + const child = parseGenerics(genericType, mapperFn, root); + child.index = index; + root.children.push(child); + child.parent = root; + }); + } else { + const child = parseGenerics(genericType, mapperFn, root); + child.index = root.children.length; + root.children.push(child); + child.parent = root; + } + return root; +} + + export type TypeNodeMapperFn = (node: TypeNode) => string; diff --git a/npm/ng-packs/packages/setting-management/package.json b/npm/ng-packs/packages/setting-management/package.json index 47658075b7..919d96f13d 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": "7.4.0", + "version": "7.4.1", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.components": "~7.4.0", - "@abp/ng.theme.shared": "~7.4.0", + "@abp/ng.components": "~7.4.1", + "@abp/ng.theme.shared": "~7.4.1", "tslib": "^2.0.0" }, "publishConfig": { diff --git a/npm/ng-packs/packages/setting-management/src/lib/setting-management-routing.module.ts b/npm/ng-packs/packages/setting-management/src/lib/setting-management-routing.module.ts index 1fc5fd7c7b..b642bc176e 100644 --- a/npm/ng-packs/packages/setting-management/src/lib/setting-management-routing.module.ts +++ b/npm/ng-packs/packages/setting-management/src/lib/setting-management-routing.module.ts @@ -1,7 +1,7 @@ import { NgModule } from '@angular/core'; -import { RouterModule, Routes, mapToCanActivate } from '@angular/router'; +import { RouterModule, Routes } from '@angular/router'; import { - AuthGuard, + authGuard, ReplaceableComponents, ReplaceableRouteContainerComponent, RouterOutletComponent, @@ -13,7 +13,7 @@ const routes: Routes = [ { path: '', component: RouterOutletComponent, - canActivate: mapToCanActivate([AuthGuard]), + canActivate: [authGuard], children: [ { path: '', diff --git a/npm/ng-packs/packages/tenant-management/package.json b/npm/ng-packs/packages/tenant-management/package.json index 6e3035220f..7b98e6c2af 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": "7.4.0", + "version": "7.4.1", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.feature-management": "~7.4.0", - "@abp/ng.theme.shared": "~7.4.0", + "@abp/ng.feature-management": "~7.4.1", + "@abp/ng.theme.shared": "~7.4.1", "tslib": "^2.0.0" }, "publishConfig": { diff --git a/npm/ng-packs/packages/tenant-management/src/lib/components/tenants/tenants.component.ts b/npm/ng-packs/packages/tenant-management/src/lib/components/tenants/tenants.component.ts index 51c98a53e2..b759947b32 100644 --- a/npm/ng-packs/packages/tenant-management/src/lib/components/tenants/tenants.component.ts +++ b/npm/ng-packs/packages/tenant-management/src/lib/components/tenants/tenants.component.ts @@ -6,7 +6,7 @@ import { EXTENSIONS_IDENTIFIER, FormPropData, generateFormFromProps, -} from '@abp/ng.theme.shared/extensions'; +} from '@abp/ng.components/extensible'; import { Component, Injector, OnInit } from '@angular/core'; import { UntypedFormBuilder, UntypedFormGroup } from '@angular/forms'; import { finalize } from 'rxjs/operators'; diff --git a/npm/ng-packs/packages/tenant-management/src/lib/defaults/default-tenants-entity-actions.ts b/npm/ng-packs/packages/tenant-management/src/lib/defaults/default-tenants-entity-actions.ts index 6cb5fe7d26..23848b8582 100644 --- a/npm/ng-packs/packages/tenant-management/src/lib/defaults/default-tenants-entity-actions.ts +++ b/npm/ng-packs/packages/tenant-management/src/lib/defaults/default-tenants-entity-actions.ts @@ -1,5 +1,5 @@ import { TenantDto } from '@abp/ng.tenant-management/proxy'; -import { EntityAction } from '@abp/ng.theme.shared/extensions'; +import { EntityAction } from '@abp/ng.components/extensible'; import { TenantsComponent } from '../components/tenants/tenants.component'; export const DEFAULT_TENANTS_ENTITY_ACTIONS = EntityAction.createMany([ diff --git a/npm/ng-packs/packages/tenant-management/src/lib/defaults/default-tenants-entity-props.ts b/npm/ng-packs/packages/tenant-management/src/lib/defaults/default-tenants-entity-props.ts index 8eacec5623..a893453e71 100644 --- a/npm/ng-packs/packages/tenant-management/src/lib/defaults/default-tenants-entity-props.ts +++ b/npm/ng-packs/packages/tenant-management/src/lib/defaults/default-tenants-entity-props.ts @@ -1,5 +1,5 @@ import { TenantDto } from '@abp/ng.tenant-management/proxy'; -import { EntityProp, ePropType } from '@abp/ng.theme.shared/extensions'; +import { EntityProp, ePropType } from '@abp/ng.components/extensible'; export const DEFAULT_TENANTS_ENTITY_PROPS = EntityProp.createMany([ { diff --git a/npm/ng-packs/packages/tenant-management/src/lib/defaults/default-tenants-form-props.ts b/npm/ng-packs/packages/tenant-management/src/lib/defaults/default-tenants-form-props.ts index a3956e87d5..2c6482f78f 100644 --- a/npm/ng-packs/packages/tenant-management/src/lib/defaults/default-tenants-form-props.ts +++ b/npm/ng-packs/packages/tenant-management/src/lib/defaults/default-tenants-form-props.ts @@ -1,6 +1,6 @@ import { TenantCreateDto, TenantUpdateDto } from '@abp/ng.tenant-management/proxy'; import { getPasswordValidators } from '@abp/ng.theme.shared'; -import { ePropType, FormProp } from '@abp/ng.theme.shared/extensions'; +import { ePropType, FormProp } from '@abp/ng.components/extensible'; import { Validators } from '@angular/forms'; export const DEFAULT_TENANTS_CREATE_FORM_PROPS = FormProp.createMany< diff --git a/npm/ng-packs/packages/tenant-management/src/lib/defaults/default-tenants-toolbar-actions.ts b/npm/ng-packs/packages/tenant-management/src/lib/defaults/default-tenants-toolbar-actions.ts index 5621a81aac..f1b3bce9d5 100644 --- a/npm/ng-packs/packages/tenant-management/src/lib/defaults/default-tenants-toolbar-actions.ts +++ b/npm/ng-packs/packages/tenant-management/src/lib/defaults/default-tenants-toolbar-actions.ts @@ -1,5 +1,5 @@ import { TenantDto } from '@abp/ng.tenant-management/proxy'; -import { ToolbarAction } from '@abp/ng.theme.shared/extensions'; +import { ToolbarAction } from '@abp/ng.components/extensible'; import { TenantsComponent } from '../components/tenants/tenants.component'; export const DEFAULT_TENANTS_TOOLBAR_ACTIONS = ToolbarAction.createMany([ diff --git a/npm/ng-packs/packages/tenant-management/src/lib/guards/extensions.guard.ts b/npm/ng-packs/packages/tenant-management/src/lib/guards/extensions.guard.ts index bdadb7e78a..d37d735453 100644 --- a/npm/ng-packs/packages/tenant-management/src/lib/guards/extensions.guard.ts +++ b/npm/ng-packs/packages/tenant-management/src/lib/guards/extensions.guard.ts @@ -10,7 +10,7 @@ import { mapEntitiesToContributors, mergeWithDefaultActions, mergeWithDefaultProps, -} from '@abp/ng.theme.shared/extensions'; +} from '@abp/ng.components/extensible'; import { eTenantManagementComponents } from '../enums/components'; import { @@ -26,6 +26,9 @@ import { TENANT_MANAGEMENT_TOOLBAR_ACTION_CONTRIBUTORS, } from '../tokens/extensions.token'; +/** + * @deprecated Use `tenantManagementExtensionsResolver` *function* instead. + */ @Injectable() export class TenantManagementExtensionsGuard implements IAbpGuard { protected readonly configState = inject(ConfigStateService); @@ -81,3 +84,5 @@ export class TenantManagementExtensionsGuard implements IAbpGuard { ); } } + + diff --git a/npm/ng-packs/packages/tenant-management/src/lib/models/config-options.ts b/npm/ng-packs/packages/tenant-management/src/lib/models/config-options.ts index 684d7c49ea..c9f4d62e44 100644 --- a/npm/ng-packs/packages/tenant-management/src/lib/models/config-options.ts +++ b/npm/ng-packs/packages/tenant-management/src/lib/models/config-options.ts @@ -5,7 +5,7 @@ import { EntityActionContributorCallback, EntityPropContributorCallback, ToolbarActionContributorCallback, -} from '@abp/ng.theme.shared/extensions'; +} from '@abp/ng.components/extensible'; import { eTenantManagementComponents } from '../enums/components'; export type TenantManagementEntityActionContributors = Partial<{ diff --git a/npm/ng-packs/packages/tenant-management/src/lib/resolvers/extensions.resolver.ts b/npm/ng-packs/packages/tenant-management/src/lib/resolvers/extensions.resolver.ts new file mode 100644 index 0000000000..d3c224aba2 --- /dev/null +++ b/npm/ng-packs/packages/tenant-management/src/lib/resolvers/extensions.resolver.ts @@ -0,0 +1,75 @@ +import { inject } from '@angular/core'; +import { map, tap } from 'rxjs'; +import { ConfigStateService } from '@abp/ng.core'; +import { + ExtensionsService, + getObjectExtensionEntitiesFromStore, + mapEntitiesToContributors, + mergeWithDefaultActions, + mergeWithDefaultProps, +} from '@abp/ng.components/extensible'; +import { eTenantManagementComponents } from '../enums'; +import { + TENANT_MANAGEMENT_ENTITY_ACTION_CONTRIBUTORS, + TENANT_MANAGEMENT_TOOLBAR_ACTION_CONTRIBUTORS, + TENANT_MANAGEMENT_ENTITY_PROP_CONTRIBUTORS, + TENANT_MANAGEMENT_CREATE_FORM_PROP_CONTRIBUTORS, + TENANT_MANAGEMENT_EDIT_FORM_PROP_CONTRIBUTORS, + DEFAULT_TENANT_MANAGEMENT_ENTITY_ACTIONS, + DEFAULT_TENANT_MANAGEMENT_TOOLBAR_ACTIONS, + DEFAULT_TENANT_MANAGEMENT_ENTITY_PROPS, + DEFAULT_TENANT_MANAGEMENT_CREATE_FORM_PROPS, + DEFAULT_TENANT_MANAGEMENT_EDIT_FORM_PROPS, +} from '../tokens'; +import { ResolveFn } from '@angular/router'; + +export const tenantManagementExtensionsResolver: ResolveFn = () => { + const configState = inject(ConfigStateService); + const extensions = inject(ExtensionsService); + + const config = { optional: true }; + + const actionContributors = inject(TENANT_MANAGEMENT_ENTITY_ACTION_CONTRIBUTORS, config) || {}; + const toolbarContributors = inject(TENANT_MANAGEMENT_TOOLBAR_ACTION_CONTRIBUTORS, config) || {}; + const propContributors = inject(TENANT_MANAGEMENT_ENTITY_PROP_CONTRIBUTORS, config) || {}; + const createFormContributors = + inject(TENANT_MANAGEMENT_CREATE_FORM_PROP_CONTRIBUTORS, config) || {}; + const editFormContributors = inject(TENANT_MANAGEMENT_EDIT_FORM_PROP_CONTRIBUTORS, config) || {}; + + return getObjectExtensionEntitiesFromStore(configState, 'TenantManagement').pipe( + map(entities => ({ + [eTenantManagementComponents.Tenants]: entities.Tenant, + })), + mapEntitiesToContributors(configState, 'TenantManagement'), + tap(objectExtensionContributors => { + mergeWithDefaultActions( + extensions.entityActions, + DEFAULT_TENANT_MANAGEMENT_ENTITY_ACTIONS, + actionContributors, + ); + mergeWithDefaultActions( + extensions.toolbarActions, + DEFAULT_TENANT_MANAGEMENT_TOOLBAR_ACTIONS, + toolbarContributors, + ); + mergeWithDefaultProps( + extensions.entityProps, + DEFAULT_TENANT_MANAGEMENT_ENTITY_PROPS, + objectExtensionContributors.prop, + propContributors, + ); + mergeWithDefaultProps( + extensions.createFormProps, + DEFAULT_TENANT_MANAGEMENT_CREATE_FORM_PROPS, + objectExtensionContributors.createForm, + createFormContributors, + ); + mergeWithDefaultProps( + extensions.editFormProps, + DEFAULT_TENANT_MANAGEMENT_EDIT_FORM_PROPS, + objectExtensionContributors.editForm, + editFormContributors, + ); + }), + ); +}; diff --git a/npm/ng-packs/packages/tenant-management/src/lib/resolvers/index.ts b/npm/ng-packs/packages/tenant-management/src/lib/resolvers/index.ts new file mode 100644 index 0000000000..754a8ccf12 --- /dev/null +++ b/npm/ng-packs/packages/tenant-management/src/lib/resolvers/index.ts @@ -0,0 +1 @@ +export * from './extensions.resolver' \ No newline at end of file diff --git a/npm/ng-packs/packages/tenant-management/src/lib/tenant-management-routing.module.ts b/npm/ng-packs/packages/tenant-management/src/lib/tenant-management-routing.module.ts index 06e2f0369e..2fcce5e108 100644 --- a/npm/ng-packs/packages/tenant-management/src/lib/tenant-management-routing.module.ts +++ b/npm/ng-packs/packages/tenant-management/src/lib/tenant-management-routing.module.ts @@ -1,9 +1,9 @@ import { NgModule } from '@angular/core'; -import { RouterModule, Routes, mapToCanActivate } from '@angular/router'; +import { RouterModule, Routes } from '@angular/router'; import { - AuthGuard, - PermissionGuard, + authGuard, + permissionGuard, ReplaceableComponents, ReplaceableRouteContainerComponent, RouterOutletComponent, @@ -11,14 +11,15 @@ import { import { TenantsComponent } from './components/tenants/tenants.component'; import { eTenantManagementComponents } from './enums/components'; -import { TenantManagementExtensionsGuard } from './guards'; +import { tenantManagementExtensionsResolver } from './resolvers'; const routes: Routes = [ { path: '', redirectTo: 'tenants', pathMatch: 'full' }, { path: '', component: RouterOutletComponent, - canActivate: mapToCanActivate([AuthGuard, PermissionGuard, TenantManagementExtensionsGuard]), + canActivate: [authGuard, permissionGuard], + resolve: [tenantManagementExtensionsResolver], children: [ { path: 'tenants', diff --git a/npm/ng-packs/packages/tenant-management/src/lib/tenant-management.module.ts b/npm/ng-packs/packages/tenant-management/src/lib/tenant-management.module.ts index 535ee38aaa..4b44814bce 100644 --- a/npm/ng-packs/packages/tenant-management/src/lib/tenant-management.module.ts +++ b/npm/ng-packs/packages/tenant-management/src/lib/tenant-management.module.ts @@ -1,7 +1,7 @@ import { CoreModule, LazyModuleFactory } from '@abp/ng.core'; import { FeatureManagementModule } from '@abp/ng.feature-management'; import { ThemeSharedModule } from '@abp/ng.theme.shared'; -import { UiExtensionsModule } from '@abp/ng.theme.shared/extensions'; +import { ExtensibleModule } from '@abp/ng.components/extensible'; import { ModuleWithProviders, NgModule, NgModuleFactory } from '@angular/core'; import { NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap'; import { NgxValidateCoreModule } from '@ngx-validate/core'; @@ -28,7 +28,7 @@ import { PageModule } from '@abp/ng.components/page'; ThemeSharedModule, NgbDropdownModule, FeatureManagementModule, - UiExtensionsModule, + ExtensibleModule, PageModule, ], }) diff --git a/npm/ng-packs/packages/tenant-management/src/lib/tokens/extensions.token.ts b/npm/ng-packs/packages/tenant-management/src/lib/tokens/extensions.token.ts index 666183fbaa..8215a0cc8f 100644 --- a/npm/ng-packs/packages/tenant-management/src/lib/tokens/extensions.token.ts +++ b/npm/ng-packs/packages/tenant-management/src/lib/tokens/extensions.token.ts @@ -5,7 +5,7 @@ import { EntityActionContributorCallback, EntityPropContributorCallback, ToolbarActionContributorCallback, -} from '@abp/ng.theme.shared/extensions'; +} from '@abp/ng.components/extensible'; import { InjectionToken } from '@angular/core'; import { DEFAULT_TENANTS_ENTITY_ACTIONS } from '../defaults/default-tenants-entity-actions'; import { DEFAULT_TENANTS_ENTITY_PROPS } from '../defaults/default-tenants-entity-props'; diff --git a/npm/ng-packs/packages/tenant-management/src/public-api.ts b/npm/ng-packs/packages/tenant-management/src/public-api.ts index 6321ce8fae..f39c438435 100644 --- a/npm/ng-packs/packages/tenant-management/src/public-api.ts +++ b/npm/ng-packs/packages/tenant-management/src/public-api.ts @@ -4,3 +4,4 @@ export * from './lib/guards'; export * from './lib/models'; export * from './lib/tenant-management.module'; export * from './lib/tokens'; +export * from './lib/resolvers'; diff --git a/npm/ng-packs/packages/theme-basic/package.json b/npm/ng-packs/packages/theme-basic/package.json index 09644b6e90..66fb3a6686 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": "7.4.0", + "version": "7.4.1", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.account.core": "~7.4.0", - "@abp/ng.theme.shared": "~7.4.0", + "@abp/ng.account.core": "~7.4.1", + "@abp/ng.theme.shared": "~7.4.1", "tslib": "^2.0.0" }, "publishConfig": { diff --git a/npm/ng-packs/packages/theme-basic/src/lib/components/empty-layout/empty-layout.component.ts b/npm/ng-packs/packages/theme-basic/src/lib/components/empty-layout/empty-layout.component.ts index f961ecc321..b9a78ba06d 100644 --- a/npm/ng-packs/packages/theme-basic/src/lib/components/empty-layout/empty-layout.component.ts +++ b/npm/ng-packs/packages/theme-basic/src/lib/components/empty-layout/empty-layout.component.ts @@ -5,7 +5,6 @@ import { eLayoutType } from '@abp/ng.core'; selector: 'abp-layout-empty', template: ` - `, }) export class EmptyLayoutComponent { diff --git a/npm/ng-packs/packages/theme-shared/extensions/ng-package.json b/npm/ng-packs/packages/theme-shared/extensions/ng-package.json deleted file mode 100644 index 3244b2e39b..0000000000 --- a/npm/ng-packs/packages/theme-shared/extensions/ng-package.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "$schema": "../../../node_modules/ng-packagr/ng-package.schema.json", - "dest": "../../../dist/packages/theme-shared/extensions", - "lib": { - "entryFile": "src/public-api.ts" - } -} diff --git a/npm/ng-packs/packages/theme-shared/extensions/testing/src/lib/ui-extensions-testing.module.ts b/npm/ng-packs/packages/theme-shared/extensions/testing/src/lib/ui-extensions-testing.module.ts deleted file mode 100644 index 593cce3733..0000000000 --- a/npm/ng-packs/packages/theme-shared/extensions/testing/src/lib/ui-extensions-testing.module.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { BaseUiExtensionsModule } from '@abp/ng.theme.shared/extensions'; -import { NgModule } from '@angular/core'; - -@NgModule({ - exports: [BaseUiExtensionsModule], - imports: [BaseUiExtensionsModule], -}) -export class UiExtensionsTestingModule {} diff --git a/npm/ng-packs/packages/theme-shared/extensions/testing/src/public-api.ts b/npm/ng-packs/packages/theme-shared/extensions/testing/src/public-api.ts deleted file mode 100644 index d524c9cd0c..0000000000 --- a/npm/ng-packs/packages/theme-shared/extensions/testing/src/public-api.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './lib/ui-extensions-testing.module'; diff --git a/npm/ng-packs/packages/theme-shared/extensions/testing/ssng-package.json b/npm/ng-packs/packages/theme-shared/extensions/testing/ssng-package.json deleted file mode 100644 index 10757e7f04..0000000000 --- a/npm/ng-packs/packages/theme-shared/extensions/testing/ssng-package.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "$schema": "../../../../node_modules/ng-packagr/ng-package.schema.json", - "dest": "../../dist/theme-shared/extensions/testing", - "lib": { - "entryFile": "src/public-api.ts" - } -} diff --git a/npm/ng-packs/packages/theme-shared/package.json b/npm/ng-packs/packages/theme-shared/package.json index 5c0fc9610d..b3118175e5 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": "7.4.0", + "version": "7.4.1", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.core": "~7.4.0", + "@abp/ng.core": "~7.4.1", "@fortawesome/fontawesome-free": "^5.15.4", "@ng-bootstrap/ng-bootstrap": "^15.0.0", "@ngx-validate/core": "^0.2.0", diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/lib/adapters/date-time.adapter.ts b/npm/ng-packs/packages/theme-shared/src/lib/adapters/date-time.adapter.ts similarity index 100% rename from npm/ng-packs/packages/theme-shared/extensions/src/lib/adapters/date-time.adapter.ts rename to npm/ng-packs/packages/theme-shared/src/lib/adapters/date-time.adapter.ts diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/lib/adapters/date.adapter.ts b/npm/ng-packs/packages/theme-shared/src/lib/adapters/date.adapter.ts similarity index 100% rename from npm/ng-packs/packages/theme-shared/extensions/src/lib/adapters/date.adapter.ts rename to npm/ng-packs/packages/theme-shared/src/lib/adapters/date.adapter.ts diff --git a/npm/ng-packs/packages/theme-shared/src/lib/adapters/index.ts b/npm/ng-packs/packages/theme-shared/src/lib/adapters/index.ts new file mode 100644 index 0000000000..a8e37ee1d3 --- /dev/null +++ b/npm/ng-packs/packages/theme-shared/src/lib/adapters/index.ts @@ -0,0 +1,3 @@ +export * from './date-time.adapter'; +export * from './date.adapter'; +export * from './time.adapter'; diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/lib/adapters/time.adapter.ts b/npm/ng-packs/packages/theme-shared/src/lib/adapters/time.adapter.ts similarity index 92% rename from npm/ng-packs/packages/theme-shared/extensions/src/lib/adapters/time.adapter.ts rename to npm/ng-packs/packages/theme-shared/src/lib/adapters/time.adapter.ts index c51650b8dd..de2c47b349 100644 --- a/npm/ng-packs/packages/theme-shared/extensions/src/lib/adapters/time.adapter.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/adapters/time.adapter.ts @@ -31,5 +31,5 @@ export class TimeAdapter extends NgbTimeAdapter { } function isTimeStr(value: string | Date): value is string { - return /^((2[123])|[01][0-9])(\:[0-5][0-9]){1,2}$/.test(String(value)); + return /^((2[123])|[01][0-9])(:[0-5][0-9]){1,2}$/.test(String(value)); } diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/lib/directives/disabled.directive.ts b/npm/ng-packs/packages/theme-shared/src/lib/directives/disabled.directive.ts similarity index 96% rename from npm/ng-packs/packages/theme-shared/extensions/src/lib/directives/disabled.directive.ts rename to npm/ng-packs/packages/theme-shared/src/lib/directives/disabled.directive.ts index c0a1a74995..8832280dee 100644 --- a/npm/ng-packs/packages/theme-shared/extensions/src/lib/directives/disabled.directive.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/directives/disabled.directive.ts @@ -3,6 +3,7 @@ import { NgControl } from '@angular/forms'; @Directive({ selector: '[abpDisabled]', + standalone:true, }) export class DisabledDirective implements OnChanges { @Input() diff --git a/npm/ng-packs/packages/theme-shared/src/lib/directives/index.ts b/npm/ng-packs/packages/theme-shared/src/lib/directives/index.ts index 3f22a36f1b..1047bc67e6 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/directives/index.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/directives/index.ts @@ -3,3 +3,4 @@ export * from './loading.directive'; export * from './ngx-datatable-default.directive'; export * from './ngx-datatable-list.directive'; export * from './visible.directive'; +export * from './disabled.directive'; diff --git a/npm/ng-packs/packages/theme-shared/src/lib/models/nav-item.ts b/npm/ng-packs/packages/theme-shared/src/lib/models/nav-item.ts index 3afce94a0c..dc98726624 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/models/nav-item.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/models/nav-item.ts @@ -1,5 +1,5 @@ import { Injector, Type } from '@angular/core'; -import { Observable, of } from 'rxjs'; +import { Observable } from 'rxjs'; export interface Badge { count?: number | Observable; diff --git a/npm/ng-packs/packages/theme-shared/src/lib/services/page-alert.service.ts b/npm/ng-packs/packages/theme-shared/src/lib/services/page-alert.service.ts index c66d02c004..22346ab78c 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/services/page-alert.service.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/services/page-alert.service.ts @@ -16,8 +16,6 @@ export class PageAlertService { alerts$ = this.alerts.sliceState(state => state); - constructor() {} - show(alert: PageAlert) { const newAlert: PageAlert = { ...alert, diff --git a/npm/ng-packs/packages/theme-shared/src/lib/services/status-code-error-handler.service.ts b/npm/ng-packs/packages/theme-shared/src/lib/services/status-code-error-handler.service.ts index 35239819bf..976bb11702 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/services/status-code-error-handler.service.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/services/status-code-error-handler.service.ts @@ -57,9 +57,9 @@ export class StatusCodeErrorHandlerService implements CustomHttpErrorHandlerServ this.createErrorComponentService.execute(instance); } - canHandle({ status }): boolean { - this.status = status || 0; - return this.handledStatusCodes.indexOf(status) > -1; + canHandle(error): boolean { + this.status = error?.status || 0; + return this.handledStatusCodes.indexOf(this.status) > -1; } execute(): void { diff --git a/npm/ng-packs/packages/theme-shared/src/lib/tests/form-input.component.spec.ts b/npm/ng-packs/packages/theme-shared/src/lib/tests/form-input.component.spec.ts index 660cb72165..cf4eb4aac3 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/tests/form-input.component.spec.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/tests/form-input.component.spec.ts @@ -1,4 +1,3 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; import { createHostFactory, SpectatorHost } from '@ngneat/spectator/jest'; import { FormInputComponent } from '../components/form-input/form-input.component'; diff --git a/npm/ng-packs/packages/theme-shared/src/lib/tests/loader-bar.component.spec.ts b/npm/ng-packs/packages/theme-shared/src/lib/tests/loader-bar.component.spec.ts index 60b9130ece..db468c4a6d 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/tests/loader-bar.component.spec.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/tests/loader-bar.component.spec.ts @@ -7,7 +7,6 @@ import { LoaderBarComponent } from '../components/loader-bar/loader-bar.componen describe('LoaderBarComponent', () => { let spectator: Spectator; - let router: SpyObject; const events$ = new Subject(); const createComponent = createComponentFactory({ diff --git a/npm/ng-packs/packages/theme-shared/src/lib/theme-shared.module.ts b/npm/ng-packs/packages/theme-shared/src/lib/theme-shared.module.ts index ce1d5b40fe..71c081c9b2 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/theme-shared.module.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/theme-shared.module.ts @@ -37,7 +37,7 @@ import { DateParserFormatter } from './utils/date-parser-formatter'; import { CONFIRMATION_ICONS, DEFAULT_CONFIRMATION_ICONS } from './tokens/confirmation-icons.token'; import { PasswordComponent } from './components/password/password.component'; import { CardModule } from './components/card/card.module'; -import { AbpVisibleDirective } from './directives'; +import { AbpVisibleDirective, DisabledDirective } from './directives'; import { FormInputComponent } from './components/form-input/form-input.component'; import { FormCheckboxComponent } from './components/checkbox/checkbox.component'; import { tenantNotFoundProvider } from './providers/tenant-not-found.provider'; @@ -70,6 +70,7 @@ const declarationsWithExports = [ NgbPaginationModule, EllipsisModule, CardModule, + DisabledDirective ], declarations: [...declarationsWithExports, HttpErrorWrapperComponent], exports: [ @@ -77,6 +78,9 @@ const declarationsWithExports = [ EllipsisModule, NgxValidateCoreModule, CardModule, + DisabledDirective, + NgxDatatableListDirective, + NgxDatatableDefaultDirective, ...declarationsWithExports, ], providers: [DatePipe], diff --git a/npm/ng-packs/packages/theme-shared/src/public-api.ts b/npm/ng-packs/packages/theme-shared/src/public-api.ts index 22661e3855..659e59e490 100644 --- a/npm/ng-packs/packages/theme-shared/src/public-api.ts +++ b/npm/ng-packs/packages/theme-shared/src/public-api.ts @@ -2,6 +2,7 @@ * Public API Surface of theme-shared */ +export * from './lib/adapters' export * from './lib/animations'; export * from './lib/components'; export * from './lib/constants/validation'; diff --git a/npm/ng-packs/tsconfig.base.json b/npm/ng-packs/tsconfig.base.json index 3b4de4eb67..d24de94706 100644 --- a/npm/ng-packs/tsconfig.base.json +++ b/npm/ng-packs/tsconfig.base.json @@ -20,6 +20,7 @@ "@abp/ng.account/config": ["packages/account/config/src/public-api.ts"], "@abp/ng.components": ["packages/components/src/public-api.ts"], "@abp/ng.components/chart.js": ["packages/components/chart.js/src/public-api.ts"], + "@abp/ng.components/extensible": ["packages/components/extensible/src/public-api.ts"], "@abp/ng.components/page": ["packages/components/page/src/public-api.ts"], "@abp/ng.components/tree": ["packages/components/tree/src/public-api.ts"], "@abp/ng.core": ["packages/core/src/public-api.ts"], @@ -44,7 +45,6 @@ "@abp/ng.theme.basic": ["packages/theme-basic/src/public-api.ts"], "@abp/ng.theme.basic/testing": ["packages/theme-basic/testing/src/public-api.ts"], "@abp/ng.theme.shared": ["packages/theme-shared/src/public-api.ts"], - "@abp/ng.theme.shared/extensions": ["packages/theme-shared/extensions/src/public-api.ts"], "@abp/ng.theme.shared/testing": ["packages/theme-shared/testing/src/public-api.ts"], "@abp/nx.generators": ["packages/generators/src/index.ts"] } diff --git a/npm/packs/anchor-js/package.json b/npm/packs/anchor-js/package.json index 8b3542378a..1784f53c7a 100644 --- a/npm/packs/anchor-js/package.json +++ b/npm/packs/anchor-js/package.json @@ -1,11 +1,11 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/anchor-js", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~7.4.0", + "@abp/core": "~7.4.1", "anchor-js": "^4.3.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/aspnetcore.components.server.basictheme/package.json b/npm/packs/aspnetcore.components.server.basictheme/package.json index ee04c0e990..13bac6c467 100644 --- a/npm/packs/aspnetcore.components.server.basictheme/package.json +++ b/npm/packs/aspnetcore.components.server.basictheme/package.json @@ -1,11 +1,11 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/aspnetcore.components.server.basictheme", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/aspnetcore.components.server.theming": "~7.4.0" + "@abp/aspnetcore.components.server.theming": "~7.4.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 a55a897a9c..4086c1969b 100644 --- a/npm/packs/aspnetcore.components.server.theming/package.json +++ b/npm/packs/aspnetcore.components.server.theming/package.json @@ -1,12 +1,12 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/aspnetcore.components.server.theming", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/bootstrap": "~7.4.0", - "@abp/font-awesome": "~7.4.0" + "@abp/bootstrap": "~7.4.1", + "@abp/font-awesome": "~7.4.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 69a53526b2..00cb45e009 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": "7.4.0", + "version": "7.4.1", "name": "@abp/aspnetcore.mvc.ui.theme.basic", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.shared": "~7.4.0" + "@abp/aspnetcore.mvc.ui.theme.shared": "~7.4.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 86a227a968..6cf45992d6 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": "7.4.0", + "version": "7.4.1", "name": "@abp/aspnetcore.mvc.ui.theme.shared", "repository": { "type": "git", @@ -10,22 +10,22 @@ "access": "public" }, "dependencies": { - "@abp/aspnetcore.mvc.ui": "~7.4.0", - "@abp/bootstrap": "~7.4.0", - "@abp/bootstrap-datepicker": "~7.4.0", - "@abp/bootstrap-daterangepicker": "~7.4.0", - "@abp/datatables.net-bs5": "~7.4.0", - "@abp/font-awesome": "~7.4.0", - "@abp/jquery-form": "~7.4.0", - "@abp/jquery-validation-unobtrusive": "~7.4.0", - "@abp/lodash": "~7.4.0", - "@abp/luxon": "~7.4.0", - "@abp/malihu-custom-scrollbar-plugin": "~7.4.0", - "@abp/moment": "~7.4.0", - "@abp/select2": "~7.4.0", - "@abp/sweetalert2": "~7.4.0", - "@abp/timeago": "~7.4.0", - "@abp/toastr": "~7.4.0" + "@abp/aspnetcore.mvc.ui": "~7.4.1", + "@abp/bootstrap": "~7.4.1", + "@abp/bootstrap-datepicker": "~7.4.1", + "@abp/bootstrap-daterangepicker": "~7.4.1", + "@abp/datatables.net-bs5": "~7.4.1", + "@abp/font-awesome": "~7.4.1", + "@abp/jquery-form": "~7.4.1", + "@abp/jquery-validation-unobtrusive": "~7.4.1", + "@abp/lodash": "~7.4.1", + "@abp/luxon": "~7.4.1", + "@abp/malihu-custom-scrollbar-plugin": "~7.4.1", + "@abp/moment": "~7.4.1", + "@abp/select2": "~7.4.1", + "@abp/sweetalert2": "~7.4.1", + "@abp/timeago": "~7.4.1", + "@abp/toastr": "~7.4.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 74d3620b9c..ea60b590ab 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": "7.4.0", + "version": "7.4.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/npm/packs/aspnetcore.mvc.ui/package.json b/npm/packs/aspnetcore.mvc.ui/package.json index 9d89144d7e..00113c20bb 100644 --- a/npm/packs/aspnetcore.mvc.ui/package.json +++ b/npm/packs/aspnetcore.mvc.ui/package.json @@ -1,5 +1,5 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/aspnetcore.mvc.ui", "repository": { "type": "git", diff --git a/npm/packs/blogging/package.json b/npm/packs/blogging/package.json index b09ebe3751..237ebc11c3 100644 --- a/npm/packs/blogging/package.json +++ b/npm/packs/blogging/package.json @@ -1,14 +1,14 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/blogging", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.shared": "~7.4.0", - "@abp/owl.carousel": "~7.4.0", - "@abp/prismjs": "~7.4.0", - "@abp/tui-editor": "~7.4.0" + "@abp/aspnetcore.mvc.ui.theme.shared": "~7.4.1", + "@abp/owl.carousel": "~7.4.1", + "@abp/prismjs": "~7.4.1", + "@abp/tui-editor": "~7.4.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", "homepage": "https://abp.io", diff --git a/npm/packs/bootstrap-datepicker/package.json b/npm/packs/bootstrap-datepicker/package.json index 58865a1ac5..7d29b8b0a3 100644 --- a/npm/packs/bootstrap-datepicker/package.json +++ b/npm/packs/bootstrap-datepicker/package.json @@ -1,5 +1,5 @@ { - "version": "7.4.0", + "version": "7.4.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 4eafb5a8a0..d92025f1bd 100644 --- a/npm/packs/bootstrap-daterangepicker/package.json +++ b/npm/packs/bootstrap-daterangepicker/package.json @@ -1,5 +1,5 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/bootstrap-daterangepicker", "repository": { "type": "git", diff --git a/npm/packs/bootstrap/package.json b/npm/packs/bootstrap/package.json index 7ff316b0ac..09787d790b 100644 --- a/npm/packs/bootstrap/package.json +++ b/npm/packs/bootstrap/package.json @@ -1,5 +1,5 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/bootstrap", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/core": "~7.4.0", + "@abp/core": "~7.4.1", "bootstrap": "^5.1.3" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/chart.js/package.json b/npm/packs/chart.js/package.json index b54cbd56c4..39a4844efd 100644 --- a/npm/packs/chart.js/package.json +++ b/npm/packs/chart.js/package.json @@ -1,5 +1,5 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/chart.js", "publishConfig": { "access": "public" diff --git a/npm/packs/clipboard/package.json b/npm/packs/clipboard/package.json index c762093a23..069870a9f9 100644 --- a/npm/packs/clipboard/package.json +++ b/npm/packs/clipboard/package.json @@ -1,11 +1,11 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/clipboard", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~7.4.0", + "@abp/core": "~7.4.1", "clipboard": "^2.0.8" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/cms-kit.admin/package.json b/npm/packs/cms-kit.admin/package.json index e61d6cb878..316d70c1e2 100644 --- a/npm/packs/cms-kit.admin/package.json +++ b/npm/packs/cms-kit.admin/package.json @@ -1,15 +1,15 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/cms-kit.admin", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/codemirror": "~7.4.0", - "@abp/jstree": "~7.4.0", - "@abp/slugify": "~7.4.0", - "@abp/tui-editor": "~7.4.0", - "@abp/uppy": "~7.4.0" + "@abp/codemirror": "~7.4.1", + "@abp/jstree": "~7.4.1", + "@abp/slugify": "~7.4.1", + "@abp/tui-editor": "~7.4.1", + "@abp/uppy": "~7.4.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 cd298f3501..2a37ba8b99 100644 --- a/npm/packs/cms-kit.public/package.json +++ b/npm/packs/cms-kit.public/package.json @@ -1,12 +1,12 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/cms-kit.public", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/highlight.js": "~7.4.0", - "@abp/star-rating-svg": "~7.4.0" + "@abp/highlight.js": "~7.4.1", + "@abp/star-rating-svg": "~7.4.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", "homepage": "https://abp.io", diff --git a/npm/packs/cms-kit/package.json b/npm/packs/cms-kit/package.json index efaeabf662..91d48ce1f8 100644 --- a/npm/packs/cms-kit/package.json +++ b/npm/packs/cms-kit/package.json @@ -1,12 +1,12 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/cms-kit", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/cms-kit.admin": "~7.4.0", - "@abp/cms-kit.public": "~7.4.0" + "@abp/cms-kit.admin": "~7.4.1", + "@abp/cms-kit.public": "~7.4.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", "homepage": "https://abp.io", diff --git a/npm/packs/codemirror/package.json b/npm/packs/codemirror/package.json index f29943e59d..0ecb2d825f 100644 --- a/npm/packs/codemirror/package.json +++ b/npm/packs/codemirror/package.json @@ -1,11 +1,11 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/codemirror", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~7.4.0", + "@abp/core": "~7.4.1", "codemirror": "^5.65.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/core/package.json b/npm/packs/core/package.json index de7df5edeb..db2a5f8eba 100644 --- a/npm/packs/core/package.json +++ b/npm/packs/core/package.json @@ -1,5 +1,5 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/core", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/utils": "~7.4.0" + "@abp/utils": "~7.4.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", "homepage": "https://abp.io", diff --git a/npm/packs/cropperjs/package.json b/npm/packs/cropperjs/package.json index 07b45d4d4b..1c3adff63b 100644 --- a/npm/packs/cropperjs/package.json +++ b/npm/packs/cropperjs/package.json @@ -1,11 +1,11 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/cropperjs", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~7.4.0", + "@abp/core": "~7.4.1", "cropperjs": "^1.5.12" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/datatables.net-bs4/package.json b/npm/packs/datatables.net-bs4/package.json index 4b821168e7..6139027d97 100644 --- a/npm/packs/datatables.net-bs4/package.json +++ b/npm/packs/datatables.net-bs4/package.json @@ -1,5 +1,5 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/datatables.net-bs4", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/datatables.net": "~7.4.0", + "@abp/datatables.net": "~7.4.1", "datatables.net-bs4": "^1.11.4" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/datatables.net-bs5/package.json b/npm/packs/datatables.net-bs5/package.json index 108be39b57..4ef0aa47c9 100644 --- a/npm/packs/datatables.net-bs5/package.json +++ b/npm/packs/datatables.net-bs5/package.json @@ -1,11 +1,11 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/datatables.net-bs5", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/datatables.net": "~7.4.0", + "@abp/datatables.net": "~7.4.1", "datatables.net-bs5": "^1.11.4" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/datatables.net/package.json b/npm/packs/datatables.net/package.json index 160b0117c1..c40a7549cb 100644 --- a/npm/packs/datatables.net/package.json +++ b/npm/packs/datatables.net/package.json @@ -1,5 +1,5 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/datatables.net", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/jquery": "~7.4.0", + "@abp/jquery": "~7.4.1", "datatables.net": "^1.11.4" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/docs/package.json b/npm/packs/docs/package.json index 2e50895ed0..c6b03d5474 100644 --- a/npm/packs/docs/package.json +++ b/npm/packs/docs/package.json @@ -1,15 +1,15 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/docs", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/anchor-js": "~7.4.0", - "@abp/clipboard": "~7.4.0", - "@abp/malihu-custom-scrollbar-plugin": "~7.4.0", - "@abp/popper.js": "~7.4.0", - "@abp/prismjs": "~7.4.0" + "@abp/anchor-js": "~7.4.1", + "@abp/clipboard": "~7.4.1", + "@abp/malihu-custom-scrollbar-plugin": "~7.4.1", + "@abp/popper.js": "~7.4.1", + "@abp/prismjs": "~7.4.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 9f3b32c495..904fa65c97 100644 --- a/npm/packs/flag-icon-css/package.json +++ b/npm/packs/flag-icon-css/package.json @@ -1,5 +1,5 @@ { - "version": "7.4.0", + "version": "7.4.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 9a0463a798..026485667e 100644 --- a/npm/packs/flag-icons/package.json +++ b/npm/packs/flag-icons/package.json @@ -1,5 +1,5 @@ { - "version": "7.4.0", + "version": "7.4.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 f8c2507180..770e319e26 100644 --- a/npm/packs/font-awesome/package.json +++ b/npm/packs/font-awesome/package.json @@ -1,5 +1,5 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/font-awesome", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/core": "~7.4.0", + "@abp/core": "~7.4.1", "@fortawesome/fontawesome-free": "^5.15.4" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/highlight.js/package.json b/npm/packs/highlight.js/package.json index 13e2c741f5..acc04e595a 100644 --- a/npm/packs/highlight.js/package.json +++ b/npm/packs/highlight.js/package.json @@ -1,11 +1,11 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/highlight.js", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~7.4.0", + "@abp/core": "~7.4.1", "@highlightjs/cdn-assets": "~11.4.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/jquery-form/package.json b/npm/packs/jquery-form/package.json index c1eaadedfa..910dda8881 100644 --- a/npm/packs/jquery-form/package.json +++ b/npm/packs/jquery-form/package.json @@ -1,5 +1,5 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/jquery-form", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/jquery": "~7.4.0", + "@abp/jquery": "~7.4.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 d07bc08406..795087d7dd 100644 --- a/npm/packs/jquery-validation-unobtrusive/package.json +++ b/npm/packs/jquery-validation-unobtrusive/package.json @@ -1,5 +1,5 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/jquery-validation-unobtrusive", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/jquery-validation": "~7.4.0", + "@abp/jquery-validation": "~7.4.1", "jquery-validation-unobtrusive": "^3.2.12" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/jquery-validation/package.json b/npm/packs/jquery-validation/package.json index 803d556ce5..5178919e18 100644 --- a/npm/packs/jquery-validation/package.json +++ b/npm/packs/jquery-validation/package.json @@ -1,5 +1,5 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/jquery-validation", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/jquery": "~7.4.0", + "@abp/jquery": "~7.4.1", "jquery-validation": "^1.19.3" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/jquery/package.json b/npm/packs/jquery/package.json index ed35001c5b..631e7c0cb4 100644 --- a/npm/packs/jquery/package.json +++ b/npm/packs/jquery/package.json @@ -1,5 +1,5 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/jquery", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/core": "~7.4.0", + "@abp/core": "~7.4.1", "jquery": "~3.6.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/jstree/package.json b/npm/packs/jstree/package.json index c6794062ae..2d94ce38b8 100644 --- a/npm/packs/jstree/package.json +++ b/npm/packs/jstree/package.json @@ -1,11 +1,11 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/jstree", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/jquery": "~7.4.0", + "@abp/jquery": "~7.4.1", "jstree": "^3.3.12" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/lodash/package.json b/npm/packs/lodash/package.json index cbaa5a3f4c..e253bf5026 100644 --- a/npm/packs/lodash/package.json +++ b/npm/packs/lodash/package.json @@ -1,5 +1,5 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/lodash", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/core": "~7.4.0", + "@abp/core": "~7.4.1", "lodash": "^4.17.21" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/luxon/package.json b/npm/packs/luxon/package.json index 07d9393f9d..3cc35bc828 100644 --- a/npm/packs/luxon/package.json +++ b/npm/packs/luxon/package.json @@ -1,5 +1,5 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/luxon", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/core": "~7.4.0", + "@abp/core": "~7.4.1", "luxon": "^2.3.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/malihu-custom-scrollbar-plugin/package.json b/npm/packs/malihu-custom-scrollbar-plugin/package.json index da0d25f81e..72b953d34b 100644 --- a/npm/packs/malihu-custom-scrollbar-plugin/package.json +++ b/npm/packs/malihu-custom-scrollbar-plugin/package.json @@ -1,5 +1,5 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/malihu-custom-scrollbar-plugin", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/core": "~7.4.0", + "@abp/core": "~7.4.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 911e9a83fc..21409a9704 100644 --- a/npm/packs/markdown-it/package.json +++ b/npm/packs/markdown-it/package.json @@ -1,11 +1,11 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/markdown-it", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~7.4.0", + "@abp/core": "~7.4.1", "markdown-it": "^12.3.2" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/moment/package.json b/npm/packs/moment/package.json index 91c919eabe..56d5123a88 100644 --- a/npm/packs/moment/package.json +++ b/npm/packs/moment/package.json @@ -1,5 +1,5 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/moment", "repository": { "type": "git", diff --git a/npm/packs/owl.carousel/package.json b/npm/packs/owl.carousel/package.json index ed5825da6c..cbba8f8c5b 100644 --- a/npm/packs/owl.carousel/package.json +++ b/npm/packs/owl.carousel/package.json @@ -1,11 +1,11 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/owl.carousel", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~7.4.0", + "@abp/core": "~7.4.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 38c9f317a7..5aa46044ea 100644 --- a/npm/packs/popper.js/package.json +++ b/npm/packs/popper.js/package.json @@ -1,11 +1,11 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/popper.js", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~7.4.0", + "@abp/core": "~7.4.1", "@popperjs/core": "^2.11.2" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/prismjs/package.json b/npm/packs/prismjs/package.json index 7f70f7f662..a76d8b4d48 100644 --- a/npm/packs/prismjs/package.json +++ b/npm/packs/prismjs/package.json @@ -1,12 +1,12 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/prismjs", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/clipboard": "~7.4.0", - "@abp/core": "~7.4.0", + "@abp/clipboard": "~7.4.1", + "@abp/core": "~7.4.1", "prismjs": "^1.26.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/qrcode/package.json b/npm/packs/qrcode/package.json index b342e54584..83cdc72c28 100644 --- a/npm/packs/qrcode/package.json +++ b/npm/packs/qrcode/package.json @@ -1,5 +1,5 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/qrcode", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/core": "~7.4.0" + "@abp/core": "~7.4.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", "homepage": "https://abp.io", diff --git a/npm/packs/select2/package.json b/npm/packs/select2/package.json index 138587f583..da628403c1 100644 --- a/npm/packs/select2/package.json +++ b/npm/packs/select2/package.json @@ -1,5 +1,5 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/select2", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/core": "~7.4.0", + "@abp/core": "~7.4.1", "select2": "^4.0.13" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/signalr/package.json b/npm/packs/signalr/package.json index 4630102fab..7934a12406 100644 --- a/npm/packs/signalr/package.json +++ b/npm/packs/signalr/package.json @@ -1,11 +1,11 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/signalr", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~7.4.0", + "@abp/core": "~7.4.1", "@microsoft/signalr": "~6.0.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/slugify/package.json b/npm/packs/slugify/package.json index 8d106275b1..5a66ee22f5 100644 --- a/npm/packs/slugify/package.json +++ b/npm/packs/slugify/package.json @@ -1,5 +1,5 @@ { - "version": "7.4.0", + "version": "7.4.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 49484a3cf3..a7923aadc7 100644 --- a/npm/packs/star-rating-svg/package.json +++ b/npm/packs/star-rating-svg/package.json @@ -1,11 +1,11 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/star-rating-svg", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/jquery": "~7.4.0", + "@abp/jquery": "~7.4.1", "star-rating-svg": "^3.5.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/sweetalert2/package.json b/npm/packs/sweetalert2/package.json index bdae361897..7508409375 100644 --- a/npm/packs/sweetalert2/package.json +++ b/npm/packs/sweetalert2/package.json @@ -1,5 +1,5 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/sweetalert2", "publishConfig": { "access": "public" @@ -10,7 +10,7 @@ "directory": "npm/packs/sweetalert2" }, "dependencies": { - "@abp/core": "~7.4.0", + "@abp/core": "~7.4.1", "sweetalert2": "^11.3.6" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/timeago/package.json b/npm/packs/timeago/package.json index f361de4194..828a8a2ba4 100644 --- a/npm/packs/timeago/package.json +++ b/npm/packs/timeago/package.json @@ -1,5 +1,5 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/timeago", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/jquery": "~7.4.0", + "@abp/jquery": "~7.4.1", "timeago": "^1.6.7" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/toastr/package.json b/npm/packs/toastr/package.json index 758df70b38..7a9fb784cd 100644 --- a/npm/packs/toastr/package.json +++ b/npm/packs/toastr/package.json @@ -1,5 +1,5 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/toastr", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/jquery": "~7.4.0", + "@abp/jquery": "~7.4.1", "toastr": "^2.1.4" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/tui-editor/package.json b/npm/packs/tui-editor/package.json index cda42125cc..ea66914086 100644 --- a/npm/packs/tui-editor/package.json +++ b/npm/packs/tui-editor/package.json @@ -1,12 +1,12 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/tui-editor", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/jquery": "~7.4.0", - "@abp/prismjs": "~7.4.0" + "@abp/jquery": "~7.4.1", + "@abp/prismjs": "~7.4.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", "homepage": "https://abp.io", diff --git a/npm/packs/uppy/package.json b/npm/packs/uppy/package.json index 16e3e9d676..0a914395c4 100644 --- a/npm/packs/uppy/package.json +++ b/npm/packs/uppy/package.json @@ -1,11 +1,11 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/uppy", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~7.4.0", + "@abp/core": "~7.4.1", "uppy": "^1.16.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/utils/package.json b/npm/packs/utils/package.json index 5976e26e37..fa6dbe0af0 100644 --- a/npm/packs/utils/package.json +++ b/npm/packs/utils/package.json @@ -1,6 +1,6 @@ { "name": "@abp/utils", - "version": "7.4.0", + "version": "7.4.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 a4a716df49..acc479df3f 100644 --- a/npm/packs/vee-validate/package.json +++ b/npm/packs/vee-validate/package.json @@ -1,11 +1,11 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/vee-validate", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/vue": "~7.4.0", + "@abp/vue": "~7.4.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 87e42e5fd2..4c33fd06e8 100644 --- a/npm/packs/virtual-file-explorer/package.json +++ b/npm/packs/virtual-file-explorer/package.json @@ -1,12 +1,12 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/virtual-file-explorer", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/clipboard": "~7.4.0", - "@abp/prismjs": "~7.4.0" + "@abp/clipboard": "~7.4.1", + "@abp/prismjs": "~7.4.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", "homepage": "https://abp.io", diff --git a/npm/packs/vue/package.json b/npm/packs/vue/package.json index 310f4eb33f..3c5fcad26f 100644 --- a/npm/packs/vue/package.json +++ b/npm/packs/vue/package.json @@ -1,5 +1,5 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/vue", "publishConfig": { "access": "public" 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 f4ae508c1b..84f047a17c 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 3212963ba9..159c8e04fd 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 3f3a3196f8..26fe756069 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 3051a256ab..686fb5c846 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 cc71d6ef10..60734e8888 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 75058c62c3..1ea50e7aa1 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 96f29fb17c..4696702f16 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 3bed90bb00..a5d9f48350 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 fea0d4869e..4125cac8d0 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 ad4015d1d5..d18a3564ee 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 38c4943d4b..13949f7303 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 38290ded7f..3d1896d0cd 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 1614ff3249..d2243f5801 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 8d8c5bae05..90d2bec64d 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 9b08f5daff..d4c4197c66 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 11e3ed60fc..7394ec46af 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 d3b885fc16..84f49c284b 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 a34bf2afec..904849dd0b 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 de32293bb3..16bf83b581 100644 --- a/templates/app-nolayers/angular/package.json +++ b/templates/app-nolayers/angular/package.json @@ -12,40 +12,40 @@ }, "private": true, "dependencies": { - "@abp/ng.account": "~7.4.0", - "@abp/ng.components": "~7.4.0", - "@abp/ng.core": "~7.4.0", - "@abp/ng.oauth": "~7.4.0", - "@abp/ng.identity": "~7.4.0", - "@abp/ng.setting-management": "~7.4.0", - "@abp/ng.tenant-management": "~7.4.0", - "@abp/ng.theme.shared": "~7.4.0", - "@abp/ng.theme.lepton-x": "~2.4.0", - "@angular/animations": "~16.0.0", - "@angular/common": "~16.0.0", - "@angular/compiler": "~16.0.0", - "@angular/core": "~16.0.0", - "@angular/forms": "~16.0.0", - "@angular/localize": "~16.0.0", - "@angular/platform-browser": "~16.0.0", - "@angular/platform-browser-dynamic": "~16.0.0", - "@angular/router": "~16.0.0", - "rxjs": "7.8.1", + "@abp/ng.account": "~7.4.1", + "@abp/ng.components": "~7.4.1", + "@abp/ng.core": "~7.4.1", + "@abp/ng.oauth": "~7.4.1", + "@abp/ng.identity": "~7.4.1", + "@abp/ng.setting-management": "~7.4.1", + "@abp/ng.tenant-management": "~7.4.1", + "@abp/ng.theme.shared": "~7.4.1", + "@abp/ng.theme.lepton-x": "~2.4.1", + "@angular/animations": "~16.2.0", + "@angular/common": "~16.2.0", + "@angular/compiler": "~16.2.0", + "@angular/core": "~16.2.0", + "@angular/forms": "~16.2.0", + "@angular/localize": "~16.2.0", + "@angular/platform-browser": "~16.2.0", + "@angular/platform-browser-dynamic": "~16.2.0", + "@angular/router": "~16.2.0", + "rxjs": "~7.4.0", "tslib": "^2.1.0", "bootstrap-icons": "~1.8.3", "zone.js": "~0.13.0" }, "devDependencies": { - "@abp/ng.schematics": "~7.4.0", - "@angular-devkit/build-angular": "~16.0.0", - "@angular-eslint/builder": "~16.0.0", - "@angular-eslint/eslint-plugin": "~16.0.0", - "@angular-eslint/eslint-plugin-template": "~16.0.0", - "@angular-eslint/schematics": "~16.0.0", - "@angular-eslint/template-parser": "~16.0.0", - "@angular/cli": "~16.0.0", - "@angular/compiler-cli": "~16.0.0", - "@angular/language-service": "~16.0.0", + "@angular-devkit/build-angular": "~16.2.0", + "@angular-eslint/builder": "~16.2.0", + "@angular-eslint/eslint-plugin": "~16.2.0", + "@angular-eslint/eslint-plugin-template": "~16.2.0", + "@angular-eslint/schematics": "~16.2.0", + "@angular-eslint/template-parser": "~16.2.0", + "@abp/ng.schematics": "~7.4.1", + "@angular/cli": "~16.2.0", + "@angular/compiler-cli": "~16.2.0", + "@angular/language-service": "~16.2.0", "@types/jasmine": "~3.6.0", "@types/node": "^12.11.1", "@typescript-eslint/eslint-plugin": "^5.36.2", @@ -57,7 +57,7 @@ "karma-coverage": "~2.1.0", "karma-jasmine": "~4.0.0", "karma-jasmine-html-reporter": "^1.7.0", - "ng-packagr": "^16.0.0", + "ng-packagr": "~16.2.0", "typescript": "~5.0.4" } -} \ No newline at end of file +} diff --git a/templates/app-nolayers/angular/src/environments/environment.prod.ts b/templates/app-nolayers/angular/src/environments/environment.prod.ts index e6cc007d52..7702e6fc43 100644 --- a/templates/app-nolayers/angular/src/environments/environment.prod.ts +++ b/templates/app-nolayers/angular/src/environments/environment.prod.ts @@ -10,7 +10,7 @@ export const environment = { logoUrl: '', }, oAuthConfig: { - issuer: 'https://localhost:44305/', + issuer: 'https://localhost:44300/', redirectUri: baseUrl, clientId: 'MyProjectName_App', responseType: 'code', @@ -19,7 +19,7 @@ export const environment = { }, apis: { default: { - url: 'https://localhost:44305', + url: 'https://localhost:44300', rootNamespace: 'MyCompanyName.MyProjectName', }, }, diff --git a/templates/app-nolayers/angular/src/environments/environment.ts b/templates/app-nolayers/angular/src/environments/environment.ts index 04dc6e89f3..f12e925ee9 100644 --- a/templates/app-nolayers/angular/src/environments/environment.ts +++ b/templates/app-nolayers/angular/src/environments/environment.ts @@ -10,7 +10,7 @@ export const environment = { logoUrl: '', }, oAuthConfig: { - issuer: 'https://localhost:44305/', + issuer: 'https://localhost:44300/', redirectUri: baseUrl, clientId: 'MyProjectName_App', responseType: 'code', @@ -19,7 +19,7 @@ export const environment = { }, apis: { default: { - url: 'https://localhost:44305', + url: 'https://localhost:44300', rootNamespace: 'MyCompanyName.MyProjectName', }, }, 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 b9beae2ef2..a7d01f336a 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": "~2.4.0-rc.4", - "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~2.4.0-rc.4" + "@abp/aspnetcore.components.server.leptonxlitetheme": "~2.4.1", + "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~2.4.1" } } diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20231003031426_Initial.Designer.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20231026071039_Initial.Designer.cs similarity index 99% rename from templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20231003031426_Initial.Designer.cs rename to templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20231026071039_Initial.Designer.cs index e73ffc0d1d..f6131569e7 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20231003031426_Initial.Designer.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20231026071039_Initial.Designer.cs @@ -13,7 +13,7 @@ using Volo.Abp.EntityFrameworkCore; namespace MyCompanyName.MyProjectName.Blazor.Server.Migrations { [DbContext(typeof(MyProjectNameDbContext))] - [Migration("20231003031426_Initial")] + [Migration("20231026071039_Initial")] partial class Initial { /// @@ -22,7 +22,7 @@ namespace MyCompanyName.MyProjectName.Blazor.Server.Migrations #pragma warning disable 612, 618 modelBuilder .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) - .HasAnnotation("ProductVersion", "8.0.0-rc.1.23419.6") + .HasAnnotation("ProductVersion", "8.0.0-rc.2.23480.1") .HasAnnotation("Relational:MaxIdentifierLength", 128); SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); @@ -218,7 +218,6 @@ namespace MyCompanyName.MyProjectName.Blazor.Server.Migrations .HasColumnName("ChangeType"); b.Property("EntityId") - .IsRequired() .HasMaxLength(128) .HasColumnType("nvarchar(128)") .HasColumnName("EntityId"); diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20231003031426_Initial.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20231026071039_Initial.cs similarity index 99% rename from templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20231003031426_Initial.cs rename to templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20231026071039_Initial.cs index 8b6e1b81cf..10e01ba747 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20231003031426_Initial.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20231026071039_Initial.cs @@ -464,7 +464,7 @@ namespace MyCompanyName.MyProjectName.Blazor.Server.Migrations ChangeTime = table.Column(type: "datetime2", nullable: false), ChangeType = table.Column(type: "tinyint", nullable: false), EntityTenantId = table.Column(type: "uniqueidentifier", nullable: true), - EntityId = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + EntityId = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true), EntityTypeFullName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true) }, diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/MyProjectNameDbContextModelSnapshot.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/MyProjectNameDbContextModelSnapshot.cs index cdb1b5bacf..97625b9411 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/MyProjectNameDbContextModelSnapshot.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/MyProjectNameDbContextModelSnapshot.cs @@ -19,7 +19,7 @@ namespace MyCompanyName.MyProjectName.Blazor.Server.Migrations #pragma warning disable 612, 618 modelBuilder .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) - .HasAnnotation("ProductVersion", "8.0.0-rc.1.23419.6") + .HasAnnotation("ProductVersion", "8.0.0-rc.2.23480.1") .HasAnnotation("Relational:MaxIdentifierLength", 128); SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); @@ -215,7 +215,6 @@ namespace MyCompanyName.MyProjectName.Blazor.Server.Migrations .HasColumnName("ChangeType"); b.Property("EntityId") - .IsRequired() .HasMaxLength(128) .HasColumnType("nvarchar(128)") .HasColumnName("EntityId"); 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 cd5f25b790..9122625971 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": "~2.4.0-rc.4", - "@abp/aspnetcore.components.server.leptonxlitetheme": "~2.4.0-rc.4" + "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~2.4.1", + "@abp/aspnetcore.components.server.leptonxlitetheme": "~2.4.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 df64c1f21d..5d98265162 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": "~2.4.0-rc.4" + "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~2.4.1" } } diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/20231003031450_Initial.Designer.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/20231026071041_Initial.Designer.cs similarity index 99% rename from templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/20231003031450_Initial.Designer.cs rename to templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/20231026071041_Initial.Designer.cs index f2ed06d4cd..222393bd82 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/20231003031450_Initial.Designer.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/20231026071041_Initial.Designer.cs @@ -13,7 +13,7 @@ using Volo.Abp.EntityFrameworkCore; namespace MyCompanyName.MyProjectName.Migrations { [DbContext(typeof(MyProjectNameDbContext))] - [Migration("20231003031450_Initial")] + [Migration("20231026071041_Initial")] partial class Initial { /// @@ -22,7 +22,7 @@ namespace MyCompanyName.MyProjectName.Migrations #pragma warning disable 612, 618 modelBuilder .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) - .HasAnnotation("ProductVersion", "8.0.0-rc.1.23419.6") + .HasAnnotation("ProductVersion", "8.0.0-rc.2.23480.1") .HasAnnotation("Relational:MaxIdentifierLength", 128); SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); @@ -218,7 +218,6 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnName("ChangeType"); b.Property("EntityId") - .IsRequired() .HasMaxLength(128) .HasColumnType("nvarchar(128)") .HasColumnName("EntityId"); diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20231003031621_Initial.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/20231026071041_Initial.cs similarity index 99% rename from templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20231003031621_Initial.cs rename to templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/20231026071041_Initial.cs index d79d7169cb..193fa0b299 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20231003031621_Initial.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/20231026071041_Initial.cs @@ -464,7 +464,7 @@ namespace MyCompanyName.MyProjectName.Migrations ChangeTime = table.Column(type: "datetime2", nullable: false), ChangeType = table.Column(type: "tinyint", nullable: false), EntityTenantId = table.Column(type: "uniqueidentifier", nullable: true), - EntityId = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + EntityId = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true), EntityTypeFullName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true) }, diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/MyProjectNameDbContextModelSnapshot.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/MyProjectNameDbContextModelSnapshot.cs index 5697b4d5ef..2ab818fa36 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/MyProjectNameDbContextModelSnapshot.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/MyProjectNameDbContextModelSnapshot.cs @@ -19,7 +19,7 @@ namespace MyCompanyName.MyProjectName.Migrations #pragma warning disable 612, 618 modelBuilder .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) - .HasAnnotation("ProductVersion", "8.0.0-rc.1.23419.6") + .HasAnnotation("ProductVersion", "8.0.0-rc.2.23480.1") .HasAnnotation("Relational:MaxIdentifierLength", 128); SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); @@ -215,7 +215,6 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnName("ChangeType"); b.Property("EntityId") - .IsRequired() .HasMaxLength(128) .HasColumnType("nvarchar(128)") .HasColumnName("EntityId"); 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 df64c1f21d..5d98265162 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": "~2.4.0-rc.4" + "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~2.4.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 df64c1f21d..5d98265162 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": "~2.4.0-rc.4" + "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~2.4.1" } } diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20231003031446_Initial.Designer.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20231026071035_Initial.Designer.cs similarity index 99% rename from templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20231003031446_Initial.Designer.cs rename to templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20231026071035_Initial.Designer.cs index cdefb06e34..e25c062a5d 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20231003031446_Initial.Designer.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20231026071035_Initial.Designer.cs @@ -13,7 +13,7 @@ using Volo.Abp.EntityFrameworkCore; namespace MyCompanyName.MyProjectName.Host.Migrations { [DbContext(typeof(MyProjectNameDbContext))] - [Migration("20231003031446_Initial")] + [Migration("20231026071035_Initial")] partial class Initial { /// @@ -22,7 +22,7 @@ namespace MyCompanyName.MyProjectName.Host.Migrations #pragma warning disable 612, 618 modelBuilder .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) - .HasAnnotation("ProductVersion", "8.0.0-rc.1.23419.6") + .HasAnnotation("ProductVersion", "8.0.0-rc.2.23480.1") .HasAnnotation("Relational:MaxIdentifierLength", 128); SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); @@ -218,7 +218,6 @@ namespace MyCompanyName.MyProjectName.Host.Migrations .HasColumnName("ChangeType"); b.Property("EntityId") - .IsRequired() .HasMaxLength(128) .HasColumnType("nvarchar(128)") .HasColumnName("EntityId"); diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20231003031446_Initial.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20231026071035_Initial.cs similarity index 99% rename from templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20231003031446_Initial.cs rename to templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20231026071035_Initial.cs index 9eaa158d4b..3b285fc029 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20231003031446_Initial.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20231026071035_Initial.cs @@ -464,7 +464,7 @@ namespace MyCompanyName.MyProjectName.Host.Migrations ChangeTime = table.Column(type: "datetime2", nullable: false), ChangeType = table.Column(type: "tinyint", nullable: false), EntityTenantId = table.Column(type: "uniqueidentifier", nullable: true), - EntityId = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + EntityId = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true), EntityTypeFullName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true) }, diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/MyProjectNameDbContextModelSnapshot.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/MyProjectNameDbContextModelSnapshot.cs index 04ad8a488a..a38be819e5 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/MyProjectNameDbContextModelSnapshot.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/MyProjectNameDbContextModelSnapshot.cs @@ -19,7 +19,7 @@ namespace MyCompanyName.MyProjectName.Host.Migrations #pragma warning disable 612, 618 modelBuilder .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) - .HasAnnotation("ProductVersion", "8.0.0-rc.1.23419.6") + .HasAnnotation("ProductVersion", "8.0.0-rc.2.23480.1") .HasAnnotation("Relational:MaxIdentifierLength", 128); SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); @@ -215,7 +215,6 @@ namespace MyCompanyName.MyProjectName.Host.Migrations .HasColumnName("ChangeType"); b.Property("EntityId") - .IsRequired() .HasMaxLength(128) .HasColumnType("nvarchar(128)") .HasColumnName("EntityId"); 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 df64c1f21d..5d98265162 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": "~2.4.0-rc.4" + "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~2.4.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 df64c1f21d..5d98265162 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": "~2.4.0-rc.4" + "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~2.4.1" } } diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20231003031451_Initial.Designer.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20231026071042_Initial.Designer.cs similarity index 99% rename from templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20231003031451_Initial.Designer.cs rename to templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20231026071042_Initial.Designer.cs index a3684f655c..cce37bd3dd 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20231003031451_Initial.Designer.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20231026071042_Initial.Designer.cs @@ -13,7 +13,7 @@ using Volo.Abp.EntityFrameworkCore; namespace MyCompanyName.MyProjectName.Mvc.Migrations { [DbContext(typeof(MyProjectNameDbContext))] - [Migration("20231003031451_Initial")] + [Migration("20231026071042_Initial")] partial class Initial { /// @@ -22,7 +22,7 @@ namespace MyCompanyName.MyProjectName.Mvc.Migrations #pragma warning disable 612, 618 modelBuilder .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) - .HasAnnotation("ProductVersion", "8.0.0-rc.1.23419.6") + .HasAnnotation("ProductVersion", "8.0.0-rc.2.23480.1") .HasAnnotation("Relational:MaxIdentifierLength", 128); SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); @@ -218,7 +218,6 @@ namespace MyCompanyName.MyProjectName.Mvc.Migrations .HasColumnName("ChangeType"); b.Property("EntityId") - .IsRequired() .HasMaxLength(128) .HasColumnType("nvarchar(128)") .HasColumnName("EntityId"); diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20231003031451_Initial.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20231026071042_Initial.cs similarity index 99% rename from templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20231003031451_Initial.cs rename to templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20231026071042_Initial.cs index 03261fb7bd..2263582b8a 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20231003031451_Initial.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20231026071042_Initial.cs @@ -464,7 +464,7 @@ namespace MyCompanyName.MyProjectName.Mvc.Migrations ChangeTime = table.Column(type: "datetime2", nullable: false), ChangeType = table.Column(type: "tinyint", nullable: false), EntityTenantId = table.Column(type: "uniqueidentifier", nullable: true), - EntityId = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + EntityId = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true), EntityTypeFullName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true) }, diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/MyProjectNameDbContextModelSnapshot.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/MyProjectNameDbContextModelSnapshot.cs index b28dbf62b4..9e899c6051 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/MyProjectNameDbContextModelSnapshot.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/MyProjectNameDbContextModelSnapshot.cs @@ -19,7 +19,7 @@ namespace MyCompanyName.MyProjectName.Mvc.Migrations #pragma warning disable 612, 618 modelBuilder .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) - .HasAnnotation("ProductVersion", "8.0.0-rc.1.23419.6") + .HasAnnotation("ProductVersion", "8.0.0-rc.2.23480.1") .HasAnnotation("Relational:MaxIdentifierLength", 128); SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); @@ -215,7 +215,6 @@ namespace MyCompanyName.MyProjectName.Mvc.Migrations .HasColumnName("ChangeType"); b.Property("EntityId") - .IsRequired() .HasMaxLength(128) .HasColumnType("nvarchar(128)") .HasColumnName("EntityId"); 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 df64c1f21d..5d98265162 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": "~2.4.0-rc.4" + "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~2.4.1" } } diff --git a/templates/app/angular/package.json b/templates/app/angular/package.json index 5a84ede9f5..eb41b2624f 100644 --- a/templates/app/angular/package.json +++ b/templates/app/angular/package.json @@ -12,40 +12,40 @@ }, "private": true, "dependencies": { - "@abp/ng.account": "~7.4.0", - "@abp/ng.components": "~7.4.0", - "@abp/ng.core": "~7.4.0", - "@abp/ng.oauth": "~7.4.0", - "@abp/ng.identity": "~7.4.0", - "@abp/ng.setting-management": "~7.4.0", - "@abp/ng.tenant-management": "~7.4.0", - "@abp/ng.theme.shared": "~7.4.0", - "@abp/ng.theme.lepton-x": "~2.4.0", - "@angular/animations": "~16.0.0", - "@angular/common": "~16.0.0", - "@angular/compiler": "~16.0.0", - "@angular/core": "~16.0.0", - "@angular/forms": "~16.0.0", - "@angular/localize": "~16.0.0", - "@angular/platform-browser": "~16.0.0", - "@angular/platform-browser-dynamic": "~16.0.0", - "@angular/router": "~16.0.0", + "@abp/ng.account": "~7.4.1", + "@abp/ng.components": "~7.4.1", + "@abp/ng.core": "~7.4.1", + "@abp/ng.oauth": "~7.4.1", + "@abp/ng.identity": "~7.4.1", + "@abp/ng.setting-management": "~7.4.1", + "@abp/ng.tenant-management": "~7.4.1", + "@abp/ng.theme.shared": "~7.4.1", + "@abp/ng.theme.lepton-x": "~2.4.1", + "@angular/animations": "~16.2.0", + "@angular/common": "~16.2.0", + "@angular/compiler": "~16.2.0", + "@angular/core": "~16.2.0", + "@angular/forms": "~16.2.0", + "@angular/localize": "~16.2.0", + "@angular/platform-browser": "~16.2.0", + "@angular/platform-browser-dynamic": "~16.2.0", + "@angular/router": "~16.2.0", "bootstrap-icons": "~1.8.3", - "rxjs": "7.8.1", + "rxjs": "~7.4.0", "tslib": "^2.1.0", "zone.js": "~0.13.0" }, "devDependencies": { - "@angular-devkit/build-angular": "~16.0.0", - "@angular-eslint/builder": "~16.0.0", - "@angular-eslint/eslint-plugin": "~16.0.0", - "@angular-eslint/eslint-plugin-template": "~16.0.0", - "@angular-eslint/schematics": "~16.0.0", - "@angular-eslint/template-parser": "~16.0.0", - "@abp/ng.schematics": "~7.4.0", - "@angular/cli": "~16.0.0", - "@angular/compiler-cli": "~16.0.0", - "@angular/language-service": "~16.0.0", + "@angular-devkit/build-angular": "~16.2.0", + "@angular-eslint/builder": "~16.2.0", + "@angular-eslint/eslint-plugin": "~16.2.0", + "@angular-eslint/eslint-plugin-template": "~16.2.0", + "@angular-eslint/schematics": "~16.2.0", + "@angular-eslint/template-parser": "~16.2.0", + "@abp/ng.schematics": "~7.4.1", + "@angular/cli": "~16.2.0", + "@angular/compiler-cli": "~16.2.0", + "@angular/language-service": "~16.2.0", "@types/jasmine": "~3.6.0", "@types/node": "^12.11.1", "@typescript-eslint/eslint-plugin": "^5.36.2", @@ -59,4 +59,4 @@ "karma-jasmine-html-reporter": "^1.7.0", "typescript": "~5.0.4" } -} \ No newline at end of file +} 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 15e9058aeb..3d5139e4f3 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": "~2.4.0-rc.4" + "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~2.4.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 cd5f25b790..9122625971 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": "~2.4.0-rc.4", - "@abp/aspnetcore.components.server.leptonxlitetheme": "~2.4.0-rc.4" + "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~2.4.1", + "@abp/aspnetcore.components.server.leptonxlitetheme": "~2.4.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 cd5f25b790..9122625971 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": "~2.4.0-rc.4", - "@abp/aspnetcore.components.server.leptonxlitetheme": "~2.4.0-rc.4" + "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~2.4.1", + "@abp/aspnetcore.components.server.leptonxlitetheme": "~2.4.1" } } diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/20231003030048_Initial.Designer.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/20231026070402_Initial.Designer.cs similarity index 99% rename from templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/20231003030048_Initial.Designer.cs rename to templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/20231026070402_Initial.Designer.cs index d80788a40e..6ed09621a7 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/20231003030048_Initial.Designer.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/20231026070402_Initial.Designer.cs @@ -13,7 +13,7 @@ using Volo.Abp.EntityFrameworkCore; namespace MyCompanyName.MyProjectName.Migrations { [DbContext(typeof(MyProjectNameDbContext))] - [Migration("20231003030048_Initial")] + [Migration("20231026070402_Initial")] partial class Initial { /// @@ -22,7 +22,7 @@ namespace MyCompanyName.MyProjectName.Migrations #pragma warning disable 612, 618 modelBuilder .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) - .HasAnnotation("ProductVersion", "8.0.0-rc.1.23419.6") + .HasAnnotation("ProductVersion", "8.0.0-rc.2.23480.1") .HasAnnotation("Relational:MaxIdentifierLength", 128); SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); @@ -218,7 +218,6 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnName("ChangeType"); b.Property("EntityId") - .IsRequired() .HasMaxLength(128) .HasColumnType("nvarchar(128)") .HasColumnName("EntityId"); diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/20231003030048_Initial.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/20231026070402_Initial.cs similarity index 99% rename from templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/20231003030048_Initial.cs rename to templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/20231026070402_Initial.cs index 00c66b2800..bef0c6b97d 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/20231003030048_Initial.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/20231026070402_Initial.cs @@ -485,7 +485,7 @@ namespace MyCompanyName.MyProjectName.Migrations ChangeTime = table.Column(type: "datetime2", nullable: false), ChangeType = table.Column(type: "tinyint", nullable: false), EntityTenantId = table.Column(type: "uniqueidentifier", nullable: true), - EntityId = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + EntityId = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true), EntityTypeFullName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true) }, diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/MyProjectNameDbContextModelSnapshot.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/MyProjectNameDbContextModelSnapshot.cs index 1198a563d4..f44d13227d 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/MyProjectNameDbContextModelSnapshot.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/MyProjectNameDbContextModelSnapshot.cs @@ -19,7 +19,7 @@ namespace MyCompanyName.MyProjectName.Migrations #pragma warning disable 612, 618 modelBuilder .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) - .HasAnnotation("ProductVersion", "8.0.0-rc.1.23419.6") + .HasAnnotation("ProductVersion", "8.0.0-rc.2.23480.1") .HasAnnotation("Relational:MaxIdentifierLength", 128); SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); @@ -215,7 +215,6 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnName("ChangeType"); b.Property("EntityId") - .IsRequired() .HasMaxLength(128) .HasColumnType("nvarchar(128)") .HasColumnName("EntityId"); 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 df64c1f21d..5d98265162 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": "~2.4.0-rc.4" + "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~2.4.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 df64c1f21d..5d98265162 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": "~2.4.0-rc.4" + "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~2.4.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 df64c1f21d..5d98265162 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": "~2.4.0-rc.4" + "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~2.4.1" } } diff --git a/templates/module/angular/package.json b/templates/module/angular/package.json index 531a13de51..42e13a9dc5 100644 --- a/templates/module/angular/package.json +++ b/templates/module/angular/package.json @@ -6,48 +6,45 @@ "start": "ng serve dev-app --open", "build": "ng build my-project-name --configuration production", "build:app": "npm run symlink:copy -- --no-watch && ng build dev-app --configuration production", - "symlink:copy": "symlink copy --angular --packages @my-company-name/my-project-name --configuration production", "test": "ng test", "lint": "ng lint", - "e2e": "ng e2e", - "compile:ivy": "yarn ngcc --properties es2015 browser module main --first-only --create-ivy-entry-points --tsconfig './tsconfig.prod.json' --source node_modules --async false", - "postinstall": "npm run compile:ivy" + "e2e": "ng e2e" }, "private": true, "dependencies": { - "@abp/ng.account": "~7.4.0", - "@abp/ng.components": "~7.4.0", - "@abp/ng.core": "~7.4.0", - "@abp/ng.oauth": "~7.4.0", - "@abp/ng.identity": "~7.4.0", - "@abp/ng.setting-management": "~7.4.0", - "@abp/ng.tenant-management": "~7.4.0", - "@abp/ng.theme.basic": "~7.4.0", - "@abp/ng.theme.shared": "~7.4.0", - "@angular/animations": "~16.0.0", - "@angular/common": "~16.0.0", - "@angular/compiler": "~16.0.0", - "@angular/core": "~16.0.0", - "@angular/forms": "~16.0.0", - "@angular/localize": "~16.0.0", - "@angular/platform-browser": "~16.0.0", - "@angular/platform-browser-dynamic": "~16.0.0", - "@angular/router": "~16.0.0", - "rxjs": "7.8.1", + "@abp/ng.account": "~7.4.1", + "@abp/ng.components": "~7.4.1", + "@abp/ng.core": "~7.4.1", + "@abp/ng.oauth": "~7.4.1", + "@abp/ng.identity": "~7.4.1", + "@abp/ng.setting-management": "~7.4.1", + "@abp/ng.tenant-management": "~7.4.1", + "@abp/ng.theme.basic": "~7.4.1", + "@abp/ng.theme.shared": "~7.4.1", + "@angular/animations": "~16.2.0", + "@angular/common": "~16.2.0", + "@angular/compiler": "~16.2.0", + "@angular/core": "~16.2.0", + "@angular/forms": "~16.2.0", + "@angular/localize": "~16.2.0", + "@angular/platform-browser": "~16.2.0", + "@angular/platform-browser-dynamic": "~16.2.0", + "@angular/router": "~16.2.0", + "rxjs": "~7.4.0", "tslib": "^2.1.0", "zone.js": "~0.13.0" }, "devDependencies": { - "@abp/ng.schematics": "~7.4.0", - "@angular-devkit/build-angular": "~16.0.0", - "@angular-eslint/builder": "~16.0.0", - "@angular-eslint/eslint-plugin": "~16.0.0", - "@angular-eslint/eslint-plugin-template": "~16.0.0", - "@angular-eslint/schematics": "~16.0.0", - "@angular-eslint/template-parser": "~16.0.0", - "@angular/cli": "~16.0.0", - "@angular/compiler-cli": "~16.0.0", - "@angular/language-service": "~16.0.0", + "@angular-devkit/build-angular": "~16.2.0", + "@angular-eslint/builder": "~16.2.0", + "@angular-eslint/eslint-plugin": "~16.2.0", + "@angular-eslint/eslint-plugin-template": "~16.2.0", + "@angular-eslint/schematics": "~16.2.0", + "@angular-eslint/template-parser": "~16.2.0", + "@abp/ng.schematics": "~7.4.1", + "@angular/cli": "~16.2.0", + "@angular/compiler-cli": "~16.2.0", + "@angular/language-service": "~16.2.0", "@types/jasmine": "~3.6.0", "@types/node": "^12.11.1", "@typescript-eslint/eslint-plugin": "^5.36.2", @@ -59,7 +56,6 @@ "karma-coverage": "~2.1.0", "karma-jasmine": "~4.0.0", "karma-jasmine-html-reporter": "^1.7.0", - "symlink-manager": "^1.5.0", "typescript": "~5.0.4" } -} \ No newline at end of file +} diff --git a/templates/module/angular/projects/my-project-name/package.json b/templates/module/angular/projects/my-project-name/package.json index 24701083c8..c8f403d461 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": ">=14", "@angular/core": ">=14", - "@abp/ng.core": ">=7.4.0", - "@abp/ng.theme.shared": ">=7.4.0" + "@abp/ng.core": ">=7.4.1", + "@abp/ng.theme.shared": ">=7.4.1" }, "dependencies": { "tslib": "^2.1.0" diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20231003031621_Initial.Designer.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20231026071058_Initial.Designer.cs similarity index 99% rename from templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20231003031621_Initial.Designer.cs rename to templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20231026071058_Initial.Designer.cs index e9ad539254..b6947fded4 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20231003031621_Initial.Designer.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20231026071058_Initial.Designer.cs @@ -13,7 +13,7 @@ using Volo.Abp.EntityFrameworkCore; namespace MyCompanyName.MyProjectName.Migrations { [DbContext(typeof(AuthServerDbContext))] - [Migration("20231003031621_Initial")] + [Migration("20231026071058_Initial")] partial class Initial { /// @@ -22,7 +22,7 @@ namespace MyCompanyName.MyProjectName.Migrations #pragma warning disable 612, 618 modelBuilder .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) - .HasAnnotation("ProductVersion", "8.0.0-rc.1.23419.6") + .HasAnnotation("ProductVersion", "8.0.0-rc.2.23480.1") .HasAnnotation("Relational:MaxIdentifierLength", 128); SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); @@ -218,7 +218,6 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnName("ChangeType"); b.Property("EntityId") - .IsRequired() .HasMaxLength(128) .HasColumnType("nvarchar(128)") .HasColumnName("EntityId"); diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/20231003031450_Initial.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20231026071058_Initial.cs similarity index 99% rename from templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/20231003031450_Initial.cs rename to templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20231026071058_Initial.cs index d79d7169cb..193fa0b299 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/20231003031450_Initial.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20231026071058_Initial.cs @@ -464,7 +464,7 @@ namespace MyCompanyName.MyProjectName.Migrations ChangeTime = table.Column(type: "datetime2", nullable: false), ChangeType = table.Column(type: "tinyint", nullable: false), EntityTenantId = table.Column(type: "uniqueidentifier", nullable: true), - EntityId = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + EntityId = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true), EntityTypeFullName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true) }, diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/AuthServerDbContextModelSnapshot.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/AuthServerDbContextModelSnapshot.cs index b60bca4607..849e6894c2 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/AuthServerDbContextModelSnapshot.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/AuthServerDbContextModelSnapshot.cs @@ -19,7 +19,7 @@ namespace MyCompanyName.MyProjectName.Migrations #pragma warning disable 612, 618 modelBuilder .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) - .HasAnnotation("ProductVersion", "8.0.0-rc.1.23419.6") + .HasAnnotation("ProductVersion", "8.0.0-rc.2.23480.1") .HasAnnotation("Relational:MaxIdentifierLength", 128); SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); @@ -215,7 +215,6 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnName("ChangeType"); b.Property("EntityId") - .IsRequired() .HasMaxLength(128) .HasColumnType("nvarchar(128)") .HasColumnName("EntityId"); 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 a674d1b123..55e0a1cc09 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": "~7.4.0" + "@abp/aspnetcore.mvc.ui.theme.basic": "~7.4.1" } } diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/20231003031642_Initial.Designer.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/20231026071107_Initial.Designer.cs similarity index 99% rename from templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/20231003031642_Initial.Designer.cs rename to templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/20231026071107_Initial.Designer.cs index c4d7e314c4..34883896f8 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/20231003031642_Initial.Designer.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/20231026071107_Initial.Designer.cs @@ -13,7 +13,7 @@ using Volo.Abp.EntityFrameworkCore; namespace MyCompanyName.MyProjectName.Blazor.Server.Host.Migrations { [DbContext(typeof(UnifiedDbContext))] - [Migration("20231003031642_Initial")] + [Migration("20231026071107_Initial")] partial class Initial { /// @@ -22,7 +22,7 @@ namespace MyCompanyName.MyProjectName.Blazor.Server.Host.Migrations #pragma warning disable 612, 618 modelBuilder .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) - .HasAnnotation("ProductVersion", "8.0.0-rc.1.23419.6") + .HasAnnotation("ProductVersion", "8.0.0-rc.2.23480.1") .HasAnnotation("Relational:MaxIdentifierLength", 128); SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); @@ -218,7 +218,6 @@ namespace MyCompanyName.MyProjectName.Blazor.Server.Host.Migrations .HasColumnName("ChangeType"); b.Property("EntityId") - .IsRequired() .HasMaxLength(128) .HasColumnType("nvarchar(128)") .HasColumnName("EntityId"); diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/20231003031642_Initial.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/20231026071107_Initial.cs similarity index 99% rename from templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/20231003031642_Initial.cs rename to templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/20231026071107_Initial.cs index c75c765e1a..b21456cc73 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/20231003031642_Initial.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/20231026071107_Initial.cs @@ -404,7 +404,7 @@ namespace MyCompanyName.MyProjectName.Blazor.Server.Host.Migrations ChangeTime = table.Column(type: "datetime2", nullable: false), ChangeType = table.Column(type: "tinyint", nullable: false), EntityTenantId = table.Column(type: "uniqueidentifier", nullable: true), - EntityId = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + EntityId = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true), EntityTypeFullName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true) }, diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/UnifiedDbContextModelSnapshot.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/UnifiedDbContextModelSnapshot.cs index 6172cec5c5..102de849e7 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/UnifiedDbContextModelSnapshot.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/UnifiedDbContextModelSnapshot.cs @@ -19,7 +19,7 @@ namespace MyCompanyName.MyProjectName.Blazor.Server.Host.Migrations #pragma warning disable 612, 618 modelBuilder .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) - .HasAnnotation("ProductVersion", "8.0.0-rc.1.23419.6") + .HasAnnotation("ProductVersion", "8.0.0-rc.2.23480.1") .HasAnnotation("Relational:MaxIdentifierLength", 128); SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); @@ -215,7 +215,6 @@ namespace MyCompanyName.MyProjectName.Blazor.Server.Host.Migrations .HasColumnName("ChangeType"); b.Property("EntityId") - .IsRequired() .HasMaxLength(128) .HasColumnType("nvarchar(128)") .HasColumnName("EntityId"); 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 b62c2b2ae9..43b26f8e4e 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": "~7.4.0", - "@abp/aspnetcore.components.server.basictheme": "~7.4.0" + "@abp/aspnetcore.mvc.ui.theme.basic": "~7.4.1", + "@abp/aspnetcore.components.server.basictheme": "~7.4.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 7fbc0569f6..212b67b1c1 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": "~7.4.0" + "@abp/aspnetcore.mvc.ui.theme.basic": "~7.4.1" } } diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20231003031645_Initial.Designer.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20231026071207_Initial.Designer.cs similarity index 99% rename from templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20231003031645_Initial.Designer.cs rename to templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20231026071207_Initial.Designer.cs index cb4ee3216d..db13e9c657 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20231003031645_Initial.Designer.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20231026071207_Initial.Designer.cs @@ -13,7 +13,7 @@ using Volo.Abp.EntityFrameworkCore; namespace MyCompanyName.MyProjectName.Migrations { [DbContext(typeof(UnifiedDbContext))] - [Migration("20231003031645_Initial")] + [Migration("20231026071207_Initial")] partial class Initial { /// @@ -22,7 +22,7 @@ namespace MyCompanyName.MyProjectName.Migrations #pragma warning disable 612, 618 modelBuilder .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) - .HasAnnotation("ProductVersion", "8.0.0-rc.1.23419.6") + .HasAnnotation("ProductVersion", "8.0.0-rc.2.23480.1") .HasAnnotation("Relational:MaxIdentifierLength", 128); SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); @@ -218,7 +218,6 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnName("ChangeType"); b.Property("EntityId") - .IsRequired() .HasMaxLength(128) .HasColumnType("nvarchar(128)") .HasColumnName("EntityId"); diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20231003031645_Initial.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20231026071207_Initial.cs similarity index 99% rename from templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20231003031645_Initial.cs rename to templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20231026071207_Initial.cs index ddeb81c91f..d19146cde5 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20231003031645_Initial.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20231026071207_Initial.cs @@ -404,7 +404,7 @@ namespace MyCompanyName.MyProjectName.Migrations ChangeTime = table.Column(type: "datetime2", nullable: false), ChangeType = table.Column(type: "tinyint", nullable: false), EntityTenantId = table.Column(type: "uniqueidentifier", nullable: true), - EntityId = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + EntityId = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true), EntityTypeFullName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true) }, diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/UnifiedDbContextModelSnapshot.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/UnifiedDbContextModelSnapshot.cs index bfffc80e3d..a8942a8d84 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/UnifiedDbContextModelSnapshot.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/UnifiedDbContextModelSnapshot.cs @@ -19,7 +19,7 @@ namespace MyCompanyName.MyProjectName.Migrations #pragma warning disable 612, 618 modelBuilder .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) - .HasAnnotation("ProductVersion", "8.0.0-rc.1.23419.6") + .HasAnnotation("ProductVersion", "8.0.0-rc.2.23480.1") .HasAnnotation("Relational:MaxIdentifierLength", 128); SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); @@ -215,7 +215,6 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnName("ChangeType"); b.Property("EntityId") - .IsRequired() .HasMaxLength(128) .HasColumnType("nvarchar(128)") .HasColumnName("EntityId"); 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 7fbc0569f6..212b67b1c1 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": "~7.4.0" + "@abp/aspnetcore.mvc.ui.theme.basic": "~7.4.1" } }