From 83bea6eaf2d7b04a5a0e0a74fba1f2d74bf2cbb0 Mon Sep 17 00:00:00 2001 From: Musa Demir Date: Tue, 10 May 2022 12:35:55 +0300 Subject: [PATCH 01/59] add filter by tag option --- .../Admin/Blogs/BlogPostGetListInput.cs | 2 ++ .../Admin/Blogs/BlogPostAdminAppService.cs | 4 +-- .../Volo/CmsKit/Blogs/IBlogPostRepository.cs | 2 ++ .../Volo/CmsKit/Tags/EntityTagManager.cs | 10 ++++++- .../Volo/CmsKit/Tags/IEntityTagRepository.cs | 6 ++++ .../CmsKit/Blogs/EfCoreBlogPostRepository.cs | 28 +++++++++++++++++-- .../CmsKit/Tags/EfCoreEntityTagRepository.cs | 15 +++++++++- .../MongoDB/Blogs/MongoBlogPostRepository.cs | 23 +++++++++++++-- .../MongoDB/Tags/MongoEntityTagRepository.cs | 13 +++++++++ .../Public/Blogs/BlogPostGetListInput.cs | 4 ++- .../Public/Blogs/BlogPostPublicAppService.cs | 6 ++-- .../Shared/Components/Tags/Default.cshtml | 25 +++++++++++++---- .../Components/Tags/TagViewComponent.cs | 7 +++-- .../Pages/Public/CmsKit/Blogs/BlogPost.cshtml | 3 +- .../Pages/Public/CmsKit/Blogs/Index.cshtml.cs | 6 +++- 15 files changed, 132 insertions(+), 22 deletions(-) diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/BlogPostGetListInput.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/BlogPostGetListInput.cs index f136fe6562..ddb8ebcbcb 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/BlogPostGetListInput.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/BlogPostGetListInput.cs @@ -11,6 +11,8 @@ public class BlogPostGetListInput : PagedAndSortedResultRequestDto public Guid? BlogId { get; set; } public Guid? AuthorId { get; set; } + + public Guid? TagId { get; set; } public BlogPostStatus? Status { get; set; } } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogPostAdminAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogPostAdminAppService.cs index f09a2e4565..9d8fcfd917 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogPostAdminAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogPostAdminAppService.cs @@ -101,11 +101,11 @@ public class BlogPostAdminAppService : CmsKitAppServiceBase, IBlogPostAdminAppSe { var blogs = (await BlogRepository.GetListAsync()).ToDictionary(x => x.Id); - var blogPosts = await BlogPostRepository.GetListAsync(input.Filter, input.BlogId, input.AuthorId, + var blogPosts = await BlogPostRepository.GetListAsync(input.Filter, input.BlogId, input.AuthorId, input.TagId, statusFilter: input.Status, input.MaxResultCount, input.SkipCount, input.Sorting); - var count = await BlogPostRepository.GetCountAsync(input.Filter, input.BlogId, input.AuthorId); + var count = await BlogPostRepository.GetCountAsync(input.Filter, input.BlogId, input.AuthorId, tagId: input.TagId); var dtoList = blogPosts.Select(x => { diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/IBlogPostRepository.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/IBlogPostRepository.cs index 2af1036162..404d21dc83 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/IBlogPostRepository.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/IBlogPostRepository.cs @@ -13,6 +13,7 @@ public interface IBlogPostRepository : IBasicRepository string filter = null, Guid? blogId = null, Guid? authorId = null, + Guid? tagId = null, BlogPostStatus? statusFilter = null, CancellationToken cancellationToken = default); @@ -20,6 +21,7 @@ public interface IBlogPostRepository : IBasicRepository string filter = null, Guid? blogId = null, Guid? authorId = null, + Guid? tagId = null, BlogPostStatus? statusFilter = null, int maxResultCount = int.MaxValue, int skipCount = 0, diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Tags/EntityTagManager.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Tags/EntityTagManager.cs index 4000cc8aec..b33d337a06 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Tags/EntityTagManager.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Tags/EntityTagManager.cs @@ -71,4 +71,12 @@ public class EntityTagManager : DomainService await AddTagToEntityAsync(tag.Id, entityType, entityId, CurrentTenant?.Id); } } -} + + public async Task> GetEntityIdsFilteredByTagAsync( + [NotNull] Guid tagId, + [CanBeNull] Guid? tenantId, + CancellationToken cancellationToken = default) + { + return await EntityTagRepository.GetEntityIdsFilteredByTagAsync(tagId, tenantId, cancellationToken); + } +} \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Tags/IEntityTagRepository.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Tags/IEntityTagRepository.cs index 15efdcd433..a96402267d 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Tags/IEntityTagRepository.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Tags/IEntityTagRepository.cs @@ -1,5 +1,6 @@ using JetBrains.Annotations; using System; +using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; using Volo.Abp.Domain.Repositories; @@ -15,4 +16,9 @@ public interface IEntityTagRepository : IBasicRepository CancellationToken cancellationToken = default); Task DeleteManyAsync(Guid[] tagIds, CancellationToken cancellationToken = default); + + Task> GetEntityIdsFilteredByTagAsync( + [NotNull] Guid tagId, + [CanBeNull] Guid? tenantId, + CancellationToken cancellationToken = default); } diff --git a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Blogs/EfCoreBlogPostRepository.cs b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Blogs/EfCoreBlogPostRepository.cs index 0c359debcc..dfe2c6fa19 100644 --- a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Blogs/EfCoreBlogPostRepository.cs +++ b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Blogs/EfCoreBlogPostRepository.cs @@ -11,14 +11,20 @@ using Volo.Abp.Domain.Entities; using Volo.Abp.Domain.Repositories.EntityFrameworkCore; using Volo.Abp.EntityFrameworkCore; using Volo.CmsKit.EntityFrameworkCore; +using Volo.CmsKit.Tags; using Volo.CmsKit.Users; namespace Volo.CmsKit.Blogs; public class EfCoreBlogPostRepository : EfCoreRepository, IBlogPostRepository { - public EfCoreBlogPostRepository(IDbContextProvider dbContextProvider) : base(dbContextProvider) + private EntityTagManager _entityTagManager; + + public EfCoreBlogPostRepository( + IDbContextProvider dbContextProvider, + EntityTagManager entityTagManager) : base(dbContextProvider) { + _entityTagManager = entityTagManager; } public async Task GetBySlugAsync( @@ -43,10 +49,18 @@ public class EfCoreBlogPostRepository : EfCoreRepository entityIdFilters = null; + if (tagId.HasValue) + { + entityIdFilters = await _entityTagManager.GetEntityIdsFilteredByTagAsync(tagId.Value, CurrentTenant.Id, cancellationToken); + } + var queryable = (await GetDbSetAsync()) + .WhereIf(entityIdFilters != null, x => entityIdFilters.Contains(x.Id.ToString())) .WhereIf(blogId.HasValue, x => x.BlogId == blogId) .WhereIf(authorId.HasValue, x => x.AuthorId == authorId) .WhereIf(statusFilter.HasValue, x => x.Status == statusFilter) @@ -60,6 +74,7 @@ public class EfCoreBlogPostRepository : EfCoreRepository(); var usersDbSet = dbContext.Set(); - var queryable = blogPostsDbSet + List entityIdFilters = null; + if (tagId.HasValue) + { + entityIdFilters = await _entityTagManager.GetEntityIdsFilteredByTagAsync(tagId.Value, CurrentTenant.Id, cancellationToken); + } + + var queryable = (await GetDbSetAsync()) + .WhereIf(entityIdFilters != null, x => entityIdFilters.Contains(x.Id.ToString())) .WhereIf(blogId.HasValue, x => x.BlogId == blogId) .WhereIf(!string.IsNullOrWhiteSpace(filter), x => x.Title.Contains(filter) || x.Slug.Contains(filter)) .WhereIf(authorId.HasValue, x => x.AuthorId == authorId) @@ -138,4 +160,4 @@ public class EfCoreBlogPostRepository : EfCoreRepository x.Status == BlogPostStatus.WaitingForReview, GetCancellationToken(cancellationToken)); } -} +} \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Tags/EfCoreEntityTagRepository.cs b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Tags/EfCoreEntityTagRepository.cs index 16d648ca61..fe7e622841 100644 --- a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Tags/EfCoreEntityTagRepository.cs +++ b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Tags/EfCoreEntityTagRepository.cs @@ -1,8 +1,10 @@ using JetBrains.Annotations; using System; +using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; +using Microsoft.EntityFrameworkCore; using Volo.Abp; using Volo.Abp.Domain.Repositories.EntityFrameworkCore; using Volo.Abp.EntityFrameworkCore; @@ -39,4 +41,15 @@ public class EfCoreEntityTagRepository : EfCoreRepository> GetEntityIdsFilteredByTagAsync( + [NotNull] Guid tagId, + [CanBeNull] Guid? tenantId, + CancellationToken cancellationToken = default) + { + return await (await GetDbContextAsync()).Set() + .Where(q => q.TagId == tagId && q.TenantId == tenantId) + .Select(q => q.EntityId) + .ToListAsync(cancellationToken: GetCancellationToken(cancellationToken)); + } +} \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Blogs/MongoBlogPostRepository.cs b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Blogs/MongoBlogPostRepository.cs index 129c5e10b7..9358635f5c 100644 --- a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Blogs/MongoBlogPostRepository.cs +++ b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Blogs/MongoBlogPostRepository.cs @@ -12,15 +12,18 @@ using Volo.Abp.Domain.Entities; using Volo.Abp.Domain.Repositories.MongoDB; using Volo.Abp.MongoDB; using Volo.CmsKit.Blogs; +using Volo.CmsKit.Tags; using Volo.CmsKit.Users; namespace Volo.CmsKit.MongoDB.Blogs; public class MongoBlogPostRepository : MongoDbRepository, IBlogPostRepository { - public MongoBlogPostRepository(IMongoDbContextProvider dbContextProvider) : base( + private EntityTagManager _entityTagManager; + public MongoBlogPostRepository(IMongoDbContextProvider dbContextProvider, EntityTagManager entityTagManager) : base( dbContextProvider) { + _entityTagManager = entityTagManager; } public virtual async Task GetBySlugAsync(Guid blogId, [NotNull] string slug, @@ -44,12 +47,20 @@ public class MongoBlogPostRepository : MongoDbRepository entityIdFilters = null; + if (tagId.HasValue) + { + entityIdFilters = await _entityTagManager.GetEntityIdsFilteredByTagAsync(tagId.Value, CurrentTenant.Id, cancellationToken); + } + return await (await GetMongoQueryableAsync(cancellationToken)) + .WhereIf>(entityIdFilters != null, x => entityIdFilters.Contains(x.Id.ToString())) .WhereIf>(!string.IsNullOrWhiteSpace(filter), x => x.Title.Contains(filter) || x.Slug.Contains(filter)) .WhereIf>(blogId.HasValue, x => x.BlogId == blogId) .WhereIf>(authorId.HasValue, x => x.AuthorId == authorId) @@ -61,6 +72,7 @@ public class MongoBlogPostRepository : MongoDbRepository entityIdFilters = null; + if (tagId.HasValue) + { + entityIdFilters = await _entityTagManager.GetEntityIdsFilteredByTagAsync(tagId.Value, CurrentTenant.Id, cancellationToken); + } + var usersQueryable = dbContext.Collection().AsQueryable(); var queryable = blogPostQueryable + .WhereIf(entityIdFilters != null, x => entityIdFilters.Contains(x.Id.ToString())) .WhereIf(blogId.HasValue, x => x.BlogId == blogId) .WhereIf(!string.IsNullOrWhiteSpace(filter), x => x.Title.Contains(filter) || x.Slug.Contains(filter)) .WhereIf(authorId.HasValue, x => x.AuthorId == authorId) diff --git a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Tags/MongoEntityTagRepository.cs b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Tags/MongoEntityTagRepository.cs index e4d6143996..82952c9bf5 100644 --- a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Tags/MongoEntityTagRepository.cs +++ b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Tags/MongoEntityTagRepository.cs @@ -2,6 +2,7 @@ using MongoDB.Driver; using System; using System.Collections.Generic; +using System.Linq; using System.Threading; using System.Threading.Tasks; using Volo.Abp; @@ -39,4 +40,16 @@ public class MongoEntityTagRepository : MongoDbRepository> GetEntityIdsFilteredByTagAsync( + [NotNull] Guid tagId, + [CanBeNull] Guid? tenantId, + CancellationToken cancellationToken = default) + { + var blogPostQueryable = (await GetQueryableAsync()) + .Where(q => q.TagId == tagId && q.TenantId == tenantId) + .Select(q => q.EntityId); + + return await AsyncExecuter.ToListAsync(blogPostQueryable, GetCancellationToken(cancellationToken)); + } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/BlogPostGetListInput.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/BlogPostGetListInput.cs index b471171f3b..5e3ffe9311 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/BlogPostGetListInput.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/BlogPostGetListInput.cs @@ -5,5 +5,7 @@ namespace Volo.CmsKit.Public.Blogs; public class BlogPostGetListInput : PagedAndSortedResultRequestDto { - public Guid? AuthorId { get; set; } + public Guid? AuthorId { get; set; } + + public Guid? TagId { get; set; } } \ No newline at end of file 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 94847fba11..65e6c6fa20 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 @@ -38,11 +38,13 @@ public class BlogPostPublicAppService : CmsKitPublicAppServiceBase, IBlogPostPub { var blog = await BlogRepository.GetBySlugAsync(blogSlug); - var blogPosts = await BlogPostRepository.GetListAsync(null, blog.Id, input.AuthorId, BlogPostStatus.Published, input.MaxResultCount, + var blogPosts = await BlogPostRepository.GetListAsync(null, blog.Id, input.AuthorId, input.TagId, + BlogPostStatus.Published, input.MaxResultCount, input.SkipCount, input.Sorting); return new PagedResultDto( - await BlogPostRepository.GetCountAsync(blogId: blog.Id, statusFilter: BlogPostStatus.Published, authorId: input.AuthorId), + await BlogPostRepository.GetCountAsync(blogId: blog.Id, tagId: input.TagId, + statusFilter: BlogPostStatus.Published, authorId: input.AuthorId), ObjectMapper.Map, List>(blogPosts)); } 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 f86ba0998e..85113c8688 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 @@ -2,16 +2,29 @@ @model TagViewComponent.TagViewModel -
-
- @if (Model.Tags != null) +
+
+ @if (Model.Tags != null) + { + foreach (var tag in Model.Tags) { - foreach (var tag in Model.Tags) + if (Model.UrlFormat.IsNullOrWhiteSpace()) { + @tag.Name } + else + { + var formattedUrl = Model.UrlFormat.Replace("{TagId}", tag.Id.ToString()); + + + @tag.Name + + + } } -
-
\ 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/Tags/TagViewComponent.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Tags/TagViewComponent.cs index 43fb6ea8cc..a3dc23c61a 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Tags/TagViewComponent.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Tags/TagViewComponent.cs @@ -26,7 +26,8 @@ public class TagViewComponent : AbpViewComponent public virtual async Task InvokeAsync( string entityType, - string entityId) + string entityId, + string urlFormat) { var tagDtos = await TagAppService.GetAllRelatedTagsAsync(entityType, entityId); @@ -34,7 +35,8 @@ public class TagViewComponent : AbpViewComponent { EntityId = entityId, EntityType = entityType, - Tags = tagDtos + Tags = tagDtos, + UrlFormat = urlFormat }; return View("~/Pages/CmsKit/Shared/Components/Tags/Default.cshtml", viewModel); @@ -45,5 +47,6 @@ public class TagViewComponent : AbpViewComponent public List Tags { get; set; } public string EntityId { get; set; } public string EntityType { get; set; } + public string UrlFormat { get; set; } } } 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 62670a742d..9d8680e96c 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 @@ -85,7 +85,8 @@ @await Component.InvokeAsync(typeof(TagViewComponent), new { entityType = Volo.CmsKit.Blogs.BlogPostConsts.EntityType, - entityId = Model.BlogPost.Id.ToString() + entityId = Model.BlogPost.Id.ToString(), + urlFormat = $"/blogs/{Model.BlogSlug}?tagId={{TagId}}" }) } } 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 c7f667382b..f5f2cc2f7a 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 @@ -24,6 +24,9 @@ public class IndexModel : CmsKitPublicPageModelBase [BindProperty(SupportsGet = true)] public Guid? AuthorId { get; set; } + [BindProperty(SupportsGet = true)] + public Guid? TagId { get; set; } + public PagedResultDto Blogs { get; private set; } public PagerModel PagerModel => new PagerModel(Blogs.TotalCount, Blogs.Items.Count, CurrentPage, PageSize, Request.Path.ToString()); @@ -45,7 +48,8 @@ public class IndexModel : CmsKitPublicPageModelBase { SkipCount = PageSize * (CurrentPage - 1), MaxResultCount = PageSize, - AuthorId = AuthorId + AuthorId = AuthorId, + TagId = TagId }); if (AuthorId != null) From c4ce990f37e952cb159fff072c12bd5b13bb012d Mon Sep 17 00:00:00 2001 From: Engincan VESKE Date: Mon, 16 May 2022 09:46:08 +0300 Subject: [PATCH 02/59] Create app-nolayers documentation --- .../Application-Single-Layer.md | 68 +++++++++++++++++++ docs/en/docs-nav.json | 4 ++ 2 files changed, 72 insertions(+) create mode 100644 docs/en/Startup-Templates/Application-Single-Layer.md diff --git a/docs/en/Startup-Templates/Application-Single-Layer.md b/docs/en/Startup-Templates/Application-Single-Layer.md new file mode 100644 index 0000000000..d9674b0fd6 --- /dev/null +++ b/docs/en/Startup-Templates/Application-Single-Layer.md @@ -0,0 +1,68 @@ +# Application (Single Layer) Startup Template + +## Introduction + +This template provides a single-layered application for quick start with ABP Framework. + +This document explains the **solution structure** and project in details. If you want to start quickly, you can follow the guides below: + + + +### What is the Difference Between the Application Startup Template? + +ABP's [Application Startup Template](Application.md) provides a well-organized and layered solution to create maintainable business applications based on the [Domain Driven Design](../Domain-Driven-Design.md) (DDD) practises. However, some developers find this template little bit complex (or unneccessary) for simple and short-time applications. + +In that point, for such applications a single-layered application template is created. Time template has the same functionality, features and modules on runtime with the [Application Startup Template](Application.md) but the development model is minimal and everything is in the single project (`.csproj`). + +## How to Start with? + +You can use the [ABP CLI](../CLI.md) to create a new project using this startup template. Alternatively, you can directly create & download from the [Get Started](https://abp.io/get-started) page. How to download via CLI is explained in this section. + +First, install the ABP CLI if you haven't installed before: + +```bash +dotnet tool install -g Volo.Abp.Cli +``` + +Then, use the `abp new` command in an empty folder to create a new solution: + +```bash +abp new Acme.BookStore -t app-nolayers +``` + +* `Acme.BookStore` is the solution name, like *YourCompany.YourProduct*. You can use single level, two-levels or three-levels naming. +* This example specifies the template name (`-t` or `--template` option). + +### Specify the UI Framework + +This template provides multiple UI frameworks: + +* `mvc`: ASP.NET Core MVC UI with Razor Pages +* `blazor-server`: Blazor Server UI +* `angular`: Angular UI +* `none`: Without UI + +If you choose `Angular` as the UI framework, the solution is being separated into two folders: + +* `angular` folder contains the Angular UI application, the client-side code. +* `aspnet-core` folder contains the ASP.NET Core solution, the server-side code. \ No newline at end of file diff --git a/docs/en/images/bookstore-single-layer-solution-structure.png b/docs/en/images/bookstore-single-layer-solution-structure.png new file mode 100644 index 0000000000000000000000000000000000000000..edc495d909ac14d7560b8a83e9ddfeb038cc5941 GIT binary patch literal 23834 zcma%iby!qw_wFF2q_i~BjYvsLcXtWW-Q9v9ozmSflynIrAdPg_(A_BvaklUKo$tKA zyv`q7%m!xWna#8Ab;o+bl@+DXQHW4LAP~BYw74n=1g8&twLC`xe$tf_MGAa_b5WHN z1yzlZ>;V@D79t8FAW%&#>itJV;QEE5w2li1gwg%y3$D+h)D#5Lua*%PQTP0C)Q;|} zKArXSr173g2rdXqhBg|Gq!ZaPK$b?bz^rZGGN7^&Qg8K(9NDHk)O|7O*uF2l*shdo zIlzi|)}Cd&*lZ5h{YXiszRjqwxARNmbD^=d*F6KD>GGb_V^Qv&_>KyCY_Fv8b9m6E zWn^q#Y`Ynzxg59b2z~b5_JQmy!Fcy6=0hQ-+R48(Yz{jYpYCjS%2oX>`%ZaVRg#c%F7~pY?(hXqUsSrT%^tJo z)M+DmW6Y%9*z~-wep-!tct_|}!O&;npw~w2&olohjCSmQkr(μunD;R&@nSR~pp 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 Oq^YK>T72L7`F{bF#X9)_ literal 0 HcmV?d00001 diff --git a/docs/en/images/single-layer-folder-structure.png b/docs/en/images/single-layer-folder-structure.png new file mode 100644 index 0000000000000000000000000000000000000000..06aa77049c1238e3403a09511f2a5344f37fc35b GIT binary patch literal 4485 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 bK=HExPO~rp&hKh%L4_$S^5cB}JixyI@2h!m literal 0 HcmV?d00001 From 79e57e86d53df6a67c76f36cd1b9925aeb96ef4f Mon Sep 17 00:00:00 2001 From: Engincan VESKE Date: Mon, 16 May 2022 15:17:20 +0300 Subject: [PATCH 05/59] Update the Application-Single-Layer.md --- .../Application-Single-Layer.md | 53 ++++++++++-------- .../single-layer-angular-folder-structure.png | Bin 0 -> 16705 bytes 2 files changed, 30 insertions(+), 23 deletions(-) create mode 100644 docs/en/images/single-layer-angular-folder-structure.png diff --git a/docs/en/Startup-Templates/Application-Single-Layer.md b/docs/en/Startup-Templates/Application-Single-Layer.md index 651988dcac..245ef435c1 100644 --- a/docs/en/Startup-Templates/Application-Single-Layer.md +++ b/docs/en/Startup-Templates/Application-Single-Layer.md @@ -2,23 +2,21 @@ ## Introduction -This template provides a single-layered application for quick start with ABP Framework. +This template provides a single-layered application for a quick start with ABP Framework. -This document explains the **solution structure** and project in details. If you want to start quickly, you can follow the guides below: - - +This document explains the **solution structure** and project in detail. ### What is the Difference Between the Application Startup Template? -ABP's [Application Startup Template](Application.md) provides a well-organized and layered solution to create maintainable business applications based on the [Domain Driven Design](../Domain-Driven-Design.md) (DDD) practises. However, some developers find this template little bit complex (or unneccessary) for simple and short-time applications. +ABP's [Application Startup Template](Application.md) provides a well-organized and layered solution to create maintainable business applications based on the [Domain Driven Design](../Domain-Driven-Design.md) (DDD) practices. However, some developers find this template a little bit complex (or unnecessary) for simple and short-time applications. -In that point, for such applications a single-layered application template is created. This template has the same functionality, features and modules on runtime with the [Application Startup Template](Application.md) and ABP modules are already installed but the development model is minimal and everything is in the single project (`.csproj`). +At this point, a single-layer application template has been created for such applications. This template has the same functionality, features and modules on runtime with the [Application Startup Template](Application.md) but the development model is minimal and everything is in a single project (`.csproj`). ## How to Start with? -You can use the [ABP CLI](../CLI.md) to create a new project using this startup template. Alternatively, you can directly create & download from the [Get Started](https://abp.io/get-started) page. How to download via CLI is explained in this section. +You can use the [ABP CLI](../CLI.md) to create a new project using this startup template. Alternatively, you can directly create & download this startup template from the [Get Started](https://abp.io/get-started) page. How to download via CLI is explained in this section. -First, install the ABP CLI if you haven't installed before: +Firstly, install the ABP CLI if you haven't installed it before: ```bash dotnet tool install -g Volo.Abp.Cli @@ -30,9 +28,9 @@ Then, use the `abp new` command in an empty folder to create a new solution: abp new Acme.BookStore -t app-nolayers ``` -* `Acme.BookStore` is the solution name, like *YourCompany.YourProduct*. You can use single level, two-levels or three-levels naming. -* This example specifies the template name (`-t` or `--template` option). - +* `Acme.BookStore` is the solution name, like *YourCompany.YourProduct*. You can use single-level, two-level or three-level naming. +* In this example, the `-t` option (or `--template` option) specifies the template name. + ### Specify the UI Framework This template provides multiple UI frameworks: @@ -42,15 +40,15 @@ This template provides multiple UI frameworks: * `angular`: Angular UI * `none`: Without UI -> Currently, this template doesn't have Blazor WASM UI, because it requries 3 projects at least (server-side, UI and shared library between these two projects). We'll consider to add Blazor WASM UI support based on your feedback. +> Currently, this template doesn't have Blazor WASM UI, because it requires 3 projects at least (server-side, UI and shared library between these two projects). -Use the `-u` or `--ui` option to specify the UI framework, while creating the solution: +Use the `-u` or `--ui` option to specify the UI framework while creating the solution: ```bash abp new Acme.BookStore -t app-nolayers -u angular ``` -* This example specifies the UI type (`-u` option) as `angular`, you can also specify the `mvc` or `blazor-server` for UI type. +* This example specifies the UI type (`-u` option) as `angular`, you can also specify `mvc` or `blazor-server` for UI type. ### Specify the Database Provider @@ -62,26 +60,27 @@ This template supports the following database providers: Use the `-d` (or `--database-provider`) option to specify the database provider while creating the solution: ```bash -abp new Acme.BookStore -d mongodb +abp new Acme.BookStore -t app-nolayers -d mongodb ``` ## Solution Structure -If you don't specify any additional option while creating an `app-nolayers` template, you will have a solution like shown below: +If you don't specify any additional options while creating an `app-nolayers` template, you will have a solution like shown below: ![](../images/bookstore-single-layer-solution-structure.png) -As you can see, it's a single layer template rather than a layered-architecture solution (like `Application Startup Template`). +As you can see, it's a single-layer template rather than a layered-architecture solution (like the `Application Startup Template`). ### Folder Structure -Since this template provides single layer solution, we've seperated concerns into folders instead of layers and you can see the pre-defined folders like shown below: +Since this template provides single-layer solution, we've separated concerns into folders instead of layers and you can see the pre-defined folders like shown below: ![](../images/single-layer-folder-structure.png) -* You can define your `entities`, `application services`, `DTOs` etc. in this single project (in the related folders). +* You can define your `entities`, `application services`, `DTOs`, etc. in this single project (in the related folders). +* For example, you can define your `application services` and `DTOs` under the **Services** folder. -## How to Run? +### How to Run? Before running the application, you need to create the database and seed the initial data. To do that, you can run the following command in the directory of your project: @@ -89,13 +88,21 @@ Before running the application, you need to create the database and seed the ini dotnet run --migrate-database ``` -* This command will create the database and seed the initial data for you. Then you can run the application with any IDE that supports .NET or by running the `dotnet run` CLI command in the directory of your project. Default username is `admin` and password is `1q2w3E*`. +* This command will create the database and seed the initial data for you. Then you can run the application with any IDE that supports .NET or by running the `dotnet run` CLI command in the directory of your project. The default username is `admin` and the password is `1q2w3E*`. + +> While creating a database & applying migrations seem only necessary for relational databases, this project comes even if you choose a NoSQL database provider (like MongoDB). In that case, it still seeds the initial data which is necessary for the application. > If you create an `app-nolayers` template with **Angular UI** you also need to run the angular project to see the UI. -### Angular UI +### Angular UI If you choose `Angular` as the UI framework, the solution is being separated into two folders: * `angular` folder contains the Angular UI application, the client-side code. -* `aspnet-core` folder contains the ASP.NET Core solution, the server-side code. \ No newline at end of file +* `aspnet-core` folder contains the ASP.NET Core solution (a single project), the server-side code. + +The server-side is similar to the solution described in the [Solution Structure](#solution-structure) section above. This project serves the API, so the `Angular` application can consume it. + +Angular application folder structure looks like below: + +![](../images/single-layer-angular-folder-structure.png) \ No newline at end of file diff --git a/docs/en/images/single-layer-angular-folder-structure.png b/docs/en/images/single-layer-angular-folder-structure.png new file mode 100644 index 0000000000000000000000000000000000000000..91fe09d61e2af7db8fd2a9e79247f349314c6041 GIT binary patch literal 16705 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 Date: Tue, 17 May 2022 10:51:31 +0300 Subject: [PATCH 06/59] Update Application-Single-Layer.md --- docs/en/Startup-Templates/Application-Single-Layer.md | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/docs/en/Startup-Templates/Application-Single-Layer.md b/docs/en/Startup-Templates/Application-Single-Layer.md index 245ef435c1..81f9e169df 100644 --- a/docs/en/Startup-Templates/Application-Single-Layer.md +++ b/docs/en/Startup-Templates/Application-Single-Layer.md @@ -69,7 +69,7 @@ If you don't specify any additional options while creating an `app-nolayers` tem ![](../images/bookstore-single-layer-solution-structure.png) -As you can see, it's a single-layer template rather than a layered-architecture solution (like the `Application Startup Template`). +It's a single-layer template rather than a layered-architecture solution (like the `Application Startup Template`). It's helpful to create a running application quickly without considering the layered architecture. ### Folder Structure @@ -92,8 +92,6 @@ dotnet run --migrate-database > While creating a database & applying migrations seem only necessary for relational databases, this project comes even if you choose a NoSQL database provider (like MongoDB). In that case, it still seeds the initial data which is necessary for the application. -> If you create an `app-nolayers` template with **Angular UI** you also need to run the angular project to see the UI. - ### Angular UI If you choose `Angular` as the UI framework, the solution is being separated into two folders: @@ -103,6 +101,6 @@ If you choose `Angular` as the UI framework, the solution is being separated int The server-side is similar to the solution described in the [Solution Structure](#solution-structure) section above. This project serves the API, so the `Angular` application can consume it. -Angular application folder structure looks like below: +The client-side application consumes the HTTP APIs as mentioned. You can see the folder structure of the Angular project shown below: -![](../images/single-layer-angular-folder-structure.png) \ No newline at end of file +![](../images/single-layer-angular-folder-structure.png) From e3eea317af29fd0811ae251e45cc20369c7dce33 Mon Sep 17 00:00:00 2001 From: Engincan VESKE Date: Tue, 17 May 2022 13:41:10 +0300 Subject: [PATCH 07/59] Create Quick Start Documentation for `app-nolayers` template --- docs/en/Tutorials/Todo/Single-Layer/Index.md | 347 +++++++++++++++++++ 1 file changed, 347 insertions(+) create mode 100644 docs/en/Tutorials/Todo/Single-Layer/Index.md diff --git a/docs/en/Tutorials/Todo/Single-Layer/Index.md b/docs/en/Tutorials/Todo/Single-Layer/Index.md new file mode 100644 index 0000000000..fe70013e19 --- /dev/null +++ b/docs/en/Tutorials/Todo/Single-Layer/Index.md @@ -0,0 +1,347 @@ +# Quick Start + +````json +//[doc-params] +{ + "UI": ["MVC", "BlazorServer", "NG"], + "DB": ["EF", "Mongo"] +} +```` + +This is a single-part quick-start tutorial to build a simple todo application with the ABP Framework. Here's a screenshot from the final application: + +![todo-list](../todo-list.png) + +You can find the source code of the completed application [here](TODO: sample's url???). + +## Pre-Requirements + +* An IDE (e.g. [Visual Studio](https://visualstudio.microsoft.com/vs/)) that supports [.NET 6.0+](https://dotnet.microsoft.com/download/dotnet) development. + +{{if DB=="Mongo"}} + +* [MongoDB Server 4.0+](https://docs.mongodb.com/manual/administration/install-community/) + +{{end}} + +{{if UI=="NG"}} + +* [Node v14.x](https://nodejs.org/) + +{{end}} + +## Creating a New Solution + +In this tutorial, we will use the [ABP CLI](../../CLI.md) to create the sample application with the ABP Framework. You can run the following command in a command-line terminal to install the **ABP CLI**, if you haven't installed it yet: + +````bash +dotnet tool install -g Volo.Abp.Cli +```` + +Then create an empty folder, open a command-line terminal and execute the following command in the terminal: + +````bash +abp new TodoApp -t app-nolayers{{if UI=="BlazorServer"}} -u blazor-server{{else if UI=="NG"}} -u angular{{end}}{{if DB=="Mongo"}} -d mongodb{{end}} +```` + +{{if UI=="NG"}} + +This will create a new solution with a single-project, named *TodoApp* with `angular` and `aspnet-core` folders. Once the solution is ready, open the solution in your favorite IDE. + +{{else}} + +This will create a new solution with a single-project, named *TodoApp*. Once the solution is ready, open it in your favorite IDE. + +{{end}} + +### Create the Database + +You can run the following command in the directory of your project to create the database and seed the initial data: + +```bash +dotnet run --migrate-database +``` + +This command will create the database and seed the initial data for you. Then you can run the application. + +### Run the Application + +{{if UI=="MVC" || UI=="BlazorServer"}} + +It is good to run the application before starting the development. Running the application is pretty straigth-forward, you can run the application with any IDE that supports .NET or by running the `dotnet run` CLI command in the directory of your project to see the initial UI: + +{{else if UI=="NG"}} + +It is good to run the application before starting the development. The solution has two main applications: + +* `TodoApp` (in the .NET solution) host the server-side HTTP API, so Angular application can consume it. (server-side application) +* `angular` folder contains the Angular application. (client-side application) + +Firstly, run the `TodoApp` project in your favorite IDE (or run the `dotnet run` CLI command on your project directory) to see the server-side HTTP API on the [Swagger UI](https://swagger.io/tools/swagger-ui/): + +![todo-swagger-ui-initial](../todo-swagger-ui-initial.png) + +You can explore and test your HTTP API with this UI. If it works, we can run the Angular client application. + +First, run the following command (or `yarn install`) to restore the NPM packages: + +````bash +npm install +```` + +It will take some time to install all packages. Then you can run the application using the following (or `yarn start`) command: + +````bash +npm start +```` + +This command takes time, but eventually runs and opens the application in your default browser: + +{{end}} + +![todo-ui-initial](../todo-ui-initial.png) + +You can click on the *Login* button, use `admin` as the username and `1q2w3E*` as the password to login to the application. + +All ready. We can start coding! + +## Defining Entities + +This application will have a single [entity](../../../Entities.md) and we can start by creating it. So, create a new `TodoItem` class under the **Entities** folder of the project. + +````csharp +using Volo.Abp.Domain.Entities; + +namespace TodoApp.Entities; + +public class TodoItem : BasicAggregateRoot +{ + public string Text { get; set; } +} +```` + +`BasicAggregateRoot` is the simplest base class to create root entities, and `Guid` is the primary key (`Id`) of the entity here. + +## Database Integration + +{{if DB=="EF"}} + +Next step is to setup the [Entity Framework Core](../../../Entity-Framework-Core.md) configuration. + +### Mapping Configuration + +Open the `TodoAppDbContext` class (it's under the **Data** folder) and add a new `DbSet` property to this class: + +````csharp +public DbSet TodoItems { get; set; } +```` + +Then navigate to the `OnModelCreating` method in the same class and add the mapping code for the `TodoItem ` entity: + +````csharp +protected override void OnModelCreating(ModelBuilder builder) +{ + base.OnModelCreating(builder); + + /* Include modules to your migration db context */ + + builder.ConfigurePermissionManagement(); + ... + + /* Configure your own tables/entities inside here */ + builder.Entity(b => + { + b.ToTable("TodoItems"); + }); +} +```` + +We've mapped the `TodoItem` entity to the `TodoItems` table in the database. The next step is creating a migration and apply the changes to the database. + +### Code First Migrations + +The startup solution is configured to use Entity Framework Core [Code First Migrations](https://docs.microsoft.com/en-us/ef/core/managing-schemas/migrations). Since we've changed the database mapping configuration, we should create a new migration and apply changes to the database. + +Open a command-line terminal in the directory of your project and type the following command: + +````bash +dotnet ef migrations add Added_TodoItem +```` + +This will add a new migration class to the project: + +![todo-efcore-migration](../todo-efcore-migration-single-layer.png) TODO: add this screenshot??? + +You can apply changes to the database using the following command, in the same command-line terminal: + +````bash +dotnet ef database update +```` + +{{else if DB=="Mongo"}} + +Next step is to setup the [MongoDB](../../../MongoDB.md) configuration. Open the `TodoAppMongoDbContext` class (it's under the **Data** folder) in your project and make the following changes: + +1. Add a new property to the class: + +````csharp +public IMongoCollection TodoItems => Collection(); +```` + +2. Add the following code inside the `CreateModel` method: + +````csharp +modelBuilder.Entity(b => +{ + b.CollectionName = "TodoItems"; +}); +```` + +{{end}} + +After the database integrations, now we can start to create application service methods and implement our use-cases. + +## Creating the Application Service Interface + +An [Application Service](../../Application-Services.md) is used to perform the use cases of the application. We need to perform the following use cases in this application: + +* Get the list of the todo items +* Create a new todo item +* Delete an existing todo item + +Let's start with defining an interface for the application service. Create a new `ITodoAppService` interface under the **Services** folder, as shown below: + +```csharp +using TodoApp.Services.Dtos; +using Volo.Abp.Application.Services; + +namespace TodoApp.Services; + +public interface ITodoAppService : IApplicationService +{ + Task> GetListAsync(); + Task CreateAsync(string text); + Task DeleteAsync(Guid id); +} +``` + +## Creating the Data Transfer Object (DTO) + +`GetListAsync` and `CreateAsync` methods return `TodoItemDto`. `ApplicationService` typically gets and returns DTOs ([Data Transfer Objects](../../../Data-Transfer-Objects.md)) instead of entities but we haven't created it yet. So, create a new `TodoItemDto` class under the **Dtos** folder (it's under the **Services** folder): + +```csharp +namespace TodoApp.Services.Dtos; + +public class TodoItemDto +{ + public Guid Id { get; set; } + public string Text { get; set; } +} +``` + +This is a very simple DTO class that have the same properties with our `TodoItem` entity. We are ready to implement the `ITodoAppService`. + +## Application Service Implementation + +Create a `TodoAppService` class under the **Services** folder of your project, as shown below: + +```csharp +using TodoApp.Entities; +using Volo.Abp.Application.Services; +using Volo.Abp.Domain.Repositories; + +namespace TodoApp.Services; + +public class TodoAppService : ApplicationService, ITodoAppService +{ + private readonly IRepository _todoItemRepository; + + public TodoAppService(IRepository todoItemRepository) + { + _todoItemRepository = todoItemRepository; + } + + // TODO: Implement the methods here... +} +``` + +This class inherits from the `ApplicationService` class of the ABP Framework and implements the `ITodoAppService` that created in the [Creating the Application Service Interface](#creating-the-application-service-interface) section. ABP provides default generic [repositories](../../../Repositories.md) for the entities. We can use them to perform the fundamental database operations. This class [injects](../../../Dependency-Injection.md) `IRepository`, which is the default repository for the `TodoItem` entity. We will use it to implement the use cases described before. + +### Getting Todo Items + +Let's start by implementing the `GetListAsync` method: + +````csharp +public async Task> GetListAsync() +{ + var items = await _todoItemRepository.GetListAsync(); + return items + .Select(item => new TodoItemDto + { + Id = item.Id, + Text = item.Text + }).ToList(); +} +```` + +We are simply getting the complete `TodoItem` list from the database, mapping them to `TodoItemDto` objects and returning as the result. + +#### Creating a New Todo Item + +Next method is `CreateAsync` and we can implement it as shown below: + +````csharp +public async Task CreateAsync(string text) +{ + var todoItem = await _todoItemRepository.InsertAsync( + new TodoItem {Text = text} + ); + + return new TodoItemDto + { + Id = todoItem.Id, + Text = todoItem.Text + }; +} +```` + +The repository's `InsertAsync` method inserts the given `TodoItem` to the database and returns the same `TodoItem` object. It also sets the `Id`, so we can use it on the returning object. We are simply returning a `TodoItemDto` by creating from the new `TodoItem` entity. + +#### Deleting a Todo Item + +Finally, we can implement the `DeleteAsync` as the following code block: + +````csharp +public async Task DeleteAsync(Guid id) +{ + await _todoItemRepository.DeleteAsync(id); +} +```` + +The application service is ready to be used from the UI layer. + +## User Interface Layer + +It is time to show the todo items on the UI! Before starting to write the code, it would be good to remember what we are trying to build. Here's a sample screenshot from the final UI: + +![todo-list](../todo-list.png) + +{{if UI=="MVC"}} + +{{else if UI=="BlazorServer"}} + +{{else if UI=="NG"}} + +{{end}} + +## Conclusion + +In this tutorial, we've built a very simple application to warm up with the ABP Framework. + +## Source Code + +You can find source code of the completed application [here](https://github.com/abpframework/abp-samples/tree/master/TodoApp). + +## See Also + +* [Web Application Development Tutorial](../Part-1.md) to see a real-life web application development in a layered architecture. \ No newline at end of file From 2b0e78f367182429686ee464b4af044699c13097 Mon Sep 17 00:00:00 2001 From: Hamza Albreem <94292623+braim23@users.noreply.github.com> Date: Tue, 17 May 2022 14:34:59 +0300 Subject: [PATCH 08/59] Update Application-Single-Layer.md --- .../Startup-Templates/Application-Single-Layer.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/en/Startup-Templates/Application-Single-Layer.md b/docs/en/Startup-Templates/Application-Single-Layer.md index 81f9e169df..ce194d7585 100644 --- a/docs/en/Startup-Templates/Application-Single-Layer.md +++ b/docs/en/Startup-Templates/Application-Single-Layer.md @@ -6,13 +6,13 @@ This template provides a single-layered application for a quick start with ABP F This document explains the **solution structure** and project in detail. -### What is the Difference Between the Application Startup Template? +### What is the Difference Between the Application Startup Templates? ABP's [Application Startup Template](Application.md) provides a well-organized and layered solution to create maintainable business applications based on the [Domain Driven Design](../Domain-Driven-Design.md) (DDD) practices. However, some developers find this template a little bit complex (or unnecessary) for simple and short-time applications. At this point, a single-layer application template has been created for such applications. This template has the same functionality, features and modules on runtime with the [Application Startup Template](Application.md) but the development model is minimal and everything is in a single project (`.csproj`). -## How to Start with? +## How to Start with It? You can use the [ABP CLI](../CLI.md) to create a new project using this startup template. Alternatively, you can directly create & download this startup template from the [Get Started](https://abp.io/get-started) page. How to download via CLI is explained in this section. @@ -65,7 +65,7 @@ abp new Acme.BookStore -t app-nolayers -d mongodb ## Solution Structure -If you don't specify any additional options while creating an `app-nolayers` template, you will have a solution like shown below: +If you don't specify any additional options while creating an `app-nolayers` template, you will have a solution as shown below: ![](../images/bookstore-single-layer-solution-structure.png) @@ -73,7 +73,7 @@ It's a single-layer template rather than a layered-architecture solution (like t ### Folder Structure -Since this template provides single-layer solution, we've separated concerns into folders instead of layers and you can see the pre-defined folders like shown below: +Since this template provides a single-layer solution, we've separated concerns into folders instead of layers and you can see the pre-defined folders as shown below: ![](../images/single-layer-folder-structure.png) @@ -94,10 +94,10 @@ dotnet run --migrate-database ### Angular UI -If you choose `Angular` as the UI framework, the solution is being separated into two folders: +If you choose `Angular` as the UI framework, the solution will be separated into two folders: -* `angular` folder contains the Angular UI application, the client-side code. -* `aspnet-core` folder contains the ASP.NET Core solution (a single project), the server-side code. +* An `angular` folder that contains the Angular UI application, the client-side code. +* An `aspnet-core` folder that contains the ASP.NET Core solution (a single project), the server-side code. The server-side is similar to the solution described in the [Solution Structure](#solution-structure) section above. This project serves the API, so the `Angular` application can consume it. From d7efec5df502926bfc534647a239cacd26618c21 Mon Sep 17 00:00:00 2001 From: Engincan VESKE Date: Tue, 17 May 2022 15:53:15 +0300 Subject: [PATCH 09/59] Update Quick Start documentation for `app-nolayers` --- docs/en/Tutorials/Todo/Single-Layer/Index.md | 205 ++++++++++++++++-- .../todo-efcore-migration-single-layer.png | Bin 0 -> 8866 bytes 2 files changed, 188 insertions(+), 17 deletions(-) create mode 100644 docs/en/Tutorials/Todo/Single-Layer/todo-efcore-migration-single-layer.png diff --git a/docs/en/Tutorials/Todo/Single-Layer/Index.md b/docs/en/Tutorials/Todo/Single-Layer/Index.md index fe70013e19..e902f3108c 100644 --- a/docs/en/Tutorials/Todo/Single-Layer/Index.md +++ b/docs/en/Tutorials/Todo/Single-Layer/Index.md @@ -12,7 +12,7 @@ This is a single-part quick-start tutorial to build a simple todo application wi ![todo-list](../todo-list.png) -You can find the source code of the completed application [here](TODO: sample's url???). +You can find the source code of the completed application [here](https://github.com/abpframework/abp-samples/tree/master/TodoApp). ## Pre-Requirements @@ -46,11 +46,11 @@ abp new TodoApp -t app-nolayers{{if UI=="BlazorServer"}} -u blazor-server{{else {{if UI=="NG"}} -This will create a new solution with a single-project, named *TodoApp* with `angular` and `aspnet-core` folders. Once the solution is ready, open the solution in your favorite IDE. +This will create a new solution with a single project, named *TodoApp* with `angular` and `aspnet-core` folders. Once the solution is ready, open the solution in your favorite IDE. {{else}} -This will create a new solution with a single-project, named *TodoApp*. Once the solution is ready, open it in your favorite IDE. +This will create a new solution with a single project, named *TodoApp*. Once the solution is ready, open it in your favorite IDE. {{end}} @@ -68,13 +68,13 @@ This command will create the database and seed the initial data for you. Then yo {{if UI=="MVC" || UI=="BlazorServer"}} -It is good to run the application before starting the development. Running the application is pretty straigth-forward, you can run the application with any IDE that supports .NET or by running the `dotnet run` CLI command in the directory of your project to see the initial UI: +It is good to run the application before starting the development. Running the application is pretty straight-forward, you can run the application with any IDE that supports .NET or by running the `dotnet run` CLI command in the directory of your project: {{else if UI=="NG"}} It is good to run the application before starting the development. The solution has two main applications: -* `TodoApp` (in the .NET solution) host the server-side HTTP API, so Angular application can consume it. (server-side application) +* `TodoApp` (in the .NET solution) hosts the server-side HTTP API, so the Angular application can consume it. (server-side application) * `angular` folder contains the Angular application. (client-side application) Firstly, run the `TodoApp` project in your favorite IDE (or run the `dotnet run` CLI command on your project directory) to see the server-side HTTP API on the [Swagger UI](https://swagger.io/tools/swagger-ui/): @@ -101,9 +101,9 @@ This command takes time, but eventually runs and opens the application in your d ![todo-ui-initial](../todo-ui-initial.png) -You can click on the *Login* button, use `admin` as the username and `1q2w3E*` as the password to login to the application. +You can click on the *Login* button and use `admin` as the username and `1q2w3E*` as the password to login to the application. -All ready. We can start coding! +All right. We can start coding! ## Defining Entities @@ -156,7 +156,7 @@ protected override void OnModelCreating(ModelBuilder builder) } ```` -We've mapped the `TodoItem` entity to the `TodoItems` table in the database. The next step is creating a migration and apply the changes to the database. +We've mapped the `TodoItem` entity to the `TodoItems` table in the database. The next step is to create a migration and apply the changes to the database. ### Code First Migrations @@ -168,11 +168,11 @@ Open a command-line terminal in the directory of your project and type the follo dotnet ef migrations add Added_TodoItem ```` -This will add a new migration class to the project: +This will add a new migration class to the project. You should see the migration in the **Migrations** folder. -![todo-efcore-migration](../todo-efcore-migration-single-layer.png) TODO: add this screenshot??? +![todo-efcore-migration](todo-efcore-migration-single-layer.png) -You can apply changes to the database using the following command, in the same command-line terminal: +Then, you can apply changes to the database using the following command, in the same command-line terminal: ````bash dotnet ef database update @@ -180,7 +180,7 @@ dotnet ef database update {{else if DB=="Mongo"}} -Next step is to setup the [MongoDB](../../../MongoDB.md) configuration. Open the `TodoAppMongoDbContext` class (it's under the **Data** folder) in your project and make the following changes: +The next step is to setup the [MongoDB](../../../MongoDB.md) configuration. Open the `TodoAppMongoDbContext` class (it's under the **Data** folder) in your project and make the following changes: 1. Add a new property to the class: @@ -239,7 +239,7 @@ public class TodoItemDto } ``` -This is a very simple DTO class that have the same properties with our `TodoItem` entity. We are ready to implement the `ITodoAppService`. +This is a very simple DTO class that has the same properties as the `TodoItem` entity. We are ready to implement the `ITodoAppService`. ## Application Service Implementation @@ -284,11 +284,11 @@ public async Task> GetListAsync() } ```` -We are simply getting the complete `TodoItem` list from the database, mapping them to `TodoItemDto` objects and returning as the result. +We are simply getting the `TodoItem` list from the database, mapping them to `TodoItemDto` objects and returning as the result. #### Creating a New Todo Item -Next method is `CreateAsync` and we can implement it as shown below: +The next method is `CreateAsync` and we can implement it as shown below: ````csharp public async Task CreateAsync(string text) @@ -328,8 +328,179 @@ It is time to show the todo items on the UI! Before starting to write the code, {{if UI=="MVC"}} +### Index.cshtml.cs + +Open the `Index.cshtml.cs` file in the `Pages` folder and replace the content with the following code block: + +```csharp +using TodoApp.Services; +using TodoApp.Services.Dtos; +using Volo.Abp.AspNetCore.Mvc.UI.RazorPages; + +namespace TodoApp.Pages; + +public class IndexModel : AbpPageModel +{ + public List TodoItems { get; set; } + + private readonly ITodoAppService _todoAppService; + + public IndexModel(ITodoAppService todoAppService) + { + _todoAppService = todoAppService; + } + + public async Task OnGetAsync() + { + TodoItems = await _todoAppService.GetListAsync(); + } +} +``` + +This class uses the `ITodoAppService` to get the list of todo items and assign the `TodoItems` property. We will use it to render the todo items on the razor page. + +### Index.cshtml + +Open the `Index.cshtml` file in the `Pages` folder and replace it with the following content: + +```xml +@page +@model TodoApp.Pages.IndexModel + +@section styles { + +} +@section scripts { + +} + +
+ + + + TODO LIST + + + + +
+
+
+ +
+
+
+ +
+
+ +
    + @foreach (var todoItem in Model.TodoItems) + { +
  • + @todoItem.Text +
  • + } +
+
+
+
+``` + +We are using ABP's [card tag helper](../../UI/AspNetCore/Tag-Helpers/Cards.md) to create a simple card view. You could directly use the standard bootstrap HTML structure, however the ABP [tag helpers](../../UI/AspNetCore/Tag-Helpers/Index.md) make it much easier and type safe. + +This page imports a CSS and a JavaScript file, so we should also create them. + +### Index.js + +Create an `Index.js` file in the `Pages` folder and add the following content: + +````js +$(function () { + + // DELETING ITEMS ///////////////////////////////////////// + $('#TodoList').on('click', 'li i', function(){ + var $li = $(this).parent(); + var id = $li.attr('data-id'); + + todoApp.services.todo.delete(id).then(function(){ + $li.remove(); + abp.notify.info('Deleted the todo item.'); + }); + }); + + // CREATING NEW ITEMS ///////////////////////////////////// + $('#NewItemForm').submit(function(e){ + e.preventDefault(); + + var todoText = $('#NewItemText').val(); + todoApp.services.todo.create(todoText).then(function(result){ + $('
  • ') + .html(' ' + result.text) + .appendTo($('#TodoList')); + $('#NewItemText').val(''); + }); + }); +}); +```` + +In the first part, we are subscribing to the click events of the trash icons near the todo items, deleting the related item on the server and showing a notification on the UI. Also, we are removing the deleted item from the DOM, so we don't need to refresh the page. + +In the second part, we are creating a new todo item on the server. If it succeeds, we are then manipulating the DOM to insert a new `
  • ` element to the todo list. This way we don't need to refresh the whole page after creating a new todo item. + +The interesting part here is how we communicate with the server. See the [*Dynamic JavaScript Proxies & Auto API Controllers*](#dynamic-javascript-proxies--auto-api-controllers) section to understand how it works. But now, let's continue and complete the application. + +### Index.css + +As the final touch, create the `Index.css` file in the `Pages` folder and add the following content: + +````css +#TodoList{ + list-style: none; + margin: 0; + padding: 0; +} + +#TodoList li { + padding: 5px; + margin: 5px 0px; + border: 1px solid #cccccc; + background-color: #f5f5f5; +} + +#TodoList li i +{ + opacity: 0.5; +} + +#TodoList li i:hover +{ + opacity: 1; + color: #ff0000; + cursor: pointer; +} +```` + +This is a simple styling for the todo page. We believe that you can do much better :) + +Now, you can run the application again and see the result. + +### Dynamic JavaScript Proxies & Auto API Controllers + +In the `Index.js` file, we've used the `todoApp.services.todo.delete(...)` and `todoApp.services.todo.create(...)` functions to communicate with the server. These functions are dynamically created by the ABP Framework, thanks to the [Dynamic JavaScript Client Proxy](../../../UI/AspNetCore/Dynamic-JavaScript-Proxies.md) system. They perform HTTP API calls to the server and return a promise, so you can register a callback to the `then` function as we've done above. + +> **services** keyword comes from the namespace (`namespace TodoApp.Services;`). + +However, you may notice that we haven't created any API Controllers, so how does the server handle these requests? This question brings us to the [Auto API Controller](../../../API/Auto-API-Controllers.md) feature of the ABP Framework. It automatically converts the application services to **API Controllers** by convention. + +If you open the [Swagger UI](https://swagger.io/tools/swagger-ui/) by entering the `/swagger` URL in your application, you can see the Todo API: + +![todo-api](../todo-api.png) + + {{else if UI=="BlazorServer"}} + {{else if UI=="NG"}} {{end}} @@ -340,8 +511,8 @@ In this tutorial, we've built a very simple application to warm up with the ABP ## Source Code -You can find source code of the completed application [here](https://github.com/abpframework/abp-samples/tree/master/TodoApp). +You can find the source code of the completed application [here](https://github.com/abpframework/abp-samples/tree/master/TodoApp). ## See Also -* [Web Application Development Tutorial](../Part-1.md) to see a real-life web application development in a layered architecture. \ No newline at end of file +* Check the [Web Application Development Tutorial](../Part-1.md) to see a real-life web application development in a layered architecture using the [Application Startup Template](../../../Startup-Templates/Application.md). \ No newline at end of file diff --git a/docs/en/Tutorials/Todo/Single-Layer/todo-efcore-migration-single-layer.png b/docs/en/Tutorials/Todo/Single-Layer/todo-efcore-migration-single-layer.png new file mode 100644 index 0000000000000000000000000000000000000000..686d8a5f87be890ca789998d6cbafae931e872da GIT binary patch literal 8866 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 Date: Wed, 18 May 2022 12:25:07 +0300 Subject: [PATCH 10/59] Update Index.md --- docs/en/Tutorials/Todo/Single-Layer/Index.md | 26 ++++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/docs/en/Tutorials/Todo/Single-Layer/Index.md b/docs/en/Tutorials/Todo/Single-Layer/Index.md index e902f3108c..dff251b881 100644 --- a/docs/en/Tutorials/Todo/Single-Layer/Index.md +++ b/docs/en/Tutorials/Todo/Single-Layer/Index.md @@ -77,7 +77,7 @@ It is good to run the application before starting the development. The solution * `TodoApp` (in the .NET solution) hosts the server-side HTTP API, so the Angular application can consume it. (server-side application) * `angular` folder contains the Angular application. (client-side application) -Firstly, run the `TodoApp` project in your favorite IDE (or run the `dotnet run` CLI command on your project directory) to see the server-side HTTP API on the [Swagger UI](https://swagger.io/tools/swagger-ui/): +Firstly, run the `TodoApp` project in your favorite IDE (or run the `dotnet run` CLI command on your project directory) to see the server-side HTTP API on [Swagger UI](https://swagger.io/tools/swagger-ui/): ![todo-swagger-ui-initial](../todo-swagger-ui-initial.png) @@ -89,7 +89,7 @@ First, run the following command (or `yarn install`) to restore the NPM packages npm install ```` -It will take some time to install all packages. Then you can run the application using the following (or `yarn start`) command: +It will take some time to install all the packages. Then you can run the application using the following (or `yarn start`) command: ````bash npm start @@ -130,7 +130,7 @@ Next step is to setup the [Entity Framework Core](../../../Entity-Framework-Core ### Mapping Configuration -Open the `TodoAppDbContext` class (it's under the **Data** folder) and add a new `DbSet` property to this class: +Open the `TodoAppDbContext` class (under the **Data** folder) and add a new `DbSet` property to this class: ````csharp public DbSet TodoItems { get; set; } @@ -158,7 +158,7 @@ protected override void OnModelCreating(ModelBuilder builder) We've mapped the `TodoItem` entity to the `TodoItems` table in the database. The next step is to create a migration and apply the changes to the database. -### Code First Migrations +### Code the First Migrations The startup solution is configured to use Entity Framework Core [Code First Migrations](https://docs.microsoft.com/en-us/ef/core/managing-schemas/migrations). Since we've changed the database mapping configuration, we should create a new migration and apply changes to the database. @@ -265,9 +265,9 @@ public class TodoAppService : ApplicationService, ITodoAppService } ``` -This class inherits from the `ApplicationService` class of the ABP Framework and implements the `ITodoAppService` that created in the [Creating the Application Service Interface](#creating-the-application-service-interface) section. ABP provides default generic [repositories](../../../Repositories.md) for the entities. We can use them to perform the fundamental database operations. This class [injects](../../../Dependency-Injection.md) `IRepository`, which is the default repository for the `TodoItem` entity. We will use it to implement the use cases described before. +This class inherits from the `ApplicationService` class of the ABP Framework and implements the `ITodoAppService` that was created in the [Creating the Application Service Interface](#creating-the-application-service-interface) section. ABP provides default generic [repositories](../../../Repositories.md) for the entities. We can use them to perform the fundamental database operations. This class [injects](../../../Dependency-Injection.md) `IRepository`, which is the default repository for the `TodoItem` entity. We will use it to implement the use cases described before. -### Getting Todo Items +### Getting the Todo Items Let's start by implementing the `GetListAsync` method: @@ -284,7 +284,7 @@ public async Task> GetListAsync() } ```` -We are simply getting the `TodoItem` list from the database, mapping them to `TodoItemDto` objects and returning as the result. +We are simply getting the `TodoItem` list from the database, mapping them to the `TodoItemDto` objects and returning as the result. #### Creating a New Todo Item @@ -357,7 +357,7 @@ public class IndexModel : AbpPageModel } ``` -This class uses the `ITodoAppService` to get the list of todo items and assign the `TodoItems` property. We will use it to render the todo items on the razor page. +This class uses `ITodoAppService` to get the list of todo items and assign the `TodoItems` property. We will use it to render the todo items on the razor page. ### Index.cshtml @@ -444,15 +444,15 @@ $(function () { }); ```` -In the first part, we are subscribing to the click events of the trash icons near the todo items, deleting the related item on the server and showing a notification on the UI. Also, we are removing the deleted item from the DOM, so we don't need to refresh the page. +In the first part, we subscribed to the click events of the trash icons near the todo items, deleted the related item on the server and showed a notification on the UI. Also, we removed the deleted item from the DOM, so we wouldn't need to refresh the page. -In the second part, we are creating a new todo item on the server. If it succeeds, we are then manipulating the DOM to insert a new `
  • ` element to the todo list. This way we don't need to refresh the whole page after creating a new todo item. +In the second part, we created a new todo item on the server. If it succeeded, we would then manipulate the DOM to insert a new `
  • ` element to the todo list. This way, we wouldn't need to refresh the whole page after creating a new todo item. The interesting part here is how we communicate with the server. See the [*Dynamic JavaScript Proxies & Auto API Controllers*](#dynamic-javascript-proxies--auto-api-controllers) section to understand how it works. But now, let's continue and complete the application. ### Index.css -As the final touch, create the `Index.css` file in the `Pages` folder and add the following content: +As for the final touch, create the `Index.css` file in the `Pages` folder and add the following content: ````css #TodoList{ @@ -493,7 +493,7 @@ In the `Index.js` file, we've used the `todoApp.services.todo.delete(...)` and ` However, you may notice that we haven't created any API Controllers, so how does the server handle these requests? This question brings us to the [Auto API Controller](../../../API/Auto-API-Controllers.md) feature of the ABP Framework. It automatically converts the application services to **API Controllers** by convention. -If you open the [Swagger UI](https://swagger.io/tools/swagger-ui/) by entering the `/swagger` URL in your application, you can see the Todo API: +If you open [Swagger UI](https://swagger.io/tools/swagger-ui/) by entering the `/swagger` URL in your application, you can see the Todo API: ![todo-api](../todo-api.png) @@ -515,4 +515,4 @@ You can find the source code of the completed application [here](https://github. ## See Also -* Check the [Web Application Development Tutorial](../Part-1.md) to see a real-life web application development in a layered architecture using the [Application Startup Template](../../../Startup-Templates/Application.md). \ No newline at end of file +* Check the [Web Application Development Tutorial](../Part-1.md) to see a real-life web application development in a layered architecture using the [Application Startup Template](../../../Startup-Templates/Application.md). From d9e01eb6077baafe36ab5693345ec1592971b46e Mon Sep 17 00:00:00 2001 From: Engincan VESKE <43685404+EngincanV@users.noreply.github.com> Date: Wed, 18 May 2022 12:27:48 +0300 Subject: [PATCH 11/59] Update Index.md --- docs/en/Tutorials/Todo/Single-Layer/Index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/Tutorials/Todo/Single-Layer/Index.md b/docs/en/Tutorials/Todo/Single-Layer/Index.md index dff251b881..2ae6b49df7 100644 --- a/docs/en/Tutorials/Todo/Single-Layer/Index.md +++ b/docs/en/Tutorials/Todo/Single-Layer/Index.md @@ -158,7 +158,7 @@ protected override void OnModelCreating(ModelBuilder builder) We've mapped the `TodoItem` entity to the `TodoItems` table in the database. The next step is to create a migration and apply the changes to the database. -### Code the First Migrations +### Code First Migrations The startup solution is configured to use Entity Framework Core [Code First Migrations](https://docs.microsoft.com/en-us/ef/core/managing-schemas/migrations). Since we've changed the database mapping configuration, we should create a new migration and apply changes to the database. From 643d045cc42296f90404d20f74cc836771a5c6ba Mon Sep 17 00:00:00 2001 From: j0nimost Date: Thu, 19 May 2022 15:39:28 +0300 Subject: [PATCH 12/59] fix merge error --- framework/src/Volo.Abp.Core/Volo/Abp/Check.cs | 28 +++++++++++-------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Check.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Check.cs index d4361875ec..01ffc8c55b 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/Check.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/Check.cs @@ -163,18 +163,7 @@ public static class Check return value; } - public static T NotDefault( - T value, - [InvokerParameterName][NotNull] string parameterName) - where T : struct - { - if(value.Equals(default(T))) - { - throw new ArgumentException($"{parameterName} has a default value or is empty!", parameterName); - } - return value; - } public static Int16 Positive( Int16 value, @@ -319,6 +308,10 @@ public static class Check if (value < minimumValue || value > maximumValue) { throw new ArgumentException($"{parameterName} is out of range min: {minimumValue} - max: {maximumValue}"); + } + return value; + } + public static double Range( double value, @@ -349,4 +342,17 @@ public static class Check return value; } + public static T NotDefault( + T value, + [InvokerParameterName][NotNull] string parameterName) + where T : struct + { + if(value.Equals(default(T))) + { + throw new ArgumentException($"{parameterName} has a default value or is empty!", parameterName); + } + + return value; + } + } From 554884e822db655cb4fb87522ed363c143b4f86a Mon Sep 17 00:00:00 2001 From: Engincan VESKE Date: Fri, 20 May 2022 15:29:26 +0300 Subject: [PATCH 13/59] Update Index.md --- docs/en/Tutorials/Todo/Single-Layer/Index.md | 185 ++++++++++++++----- 1 file changed, 142 insertions(+), 43 deletions(-) diff --git a/docs/en/Tutorials/Todo/Single-Layer/Index.md b/docs/en/Tutorials/Todo/Single-Layer/Index.md index 2ae6b49df7..a53ff0a15a 100644 --- a/docs/en/Tutorials/Todo/Single-Layer/Index.md +++ b/docs/en/Tutorials/Todo/Single-Layer/Index.md @@ -12,7 +12,7 @@ This is a single-part quick-start tutorial to build a simple todo application wi ![todo-list](../todo-list.png) -You can find the source code of the completed application [here](https://github.com/abpframework/abp-samples/tree/master/TodoApp). +You can find the source code of the completed application [here](https://github.com/abpframework/abp-samples/tree/master/TodoApp-SingleLayer). ## Pre-Requirements @@ -81,15 +81,9 @@ Firstly, run the `TodoApp` project in your favorite IDE (or run the `dotnet run` ![todo-swagger-ui-initial](../todo-swagger-ui-initial.png) -You can explore and test your HTTP API with this UI. If it works, we can run the Angular client application. +You can explore and test your HTTP API with this UI. If it works, then we can run the Angular client application. -First, run the following command (or `yarn install`) to restore the NPM packages: - -````bash -npm install -```` - -It will take some time to install all the packages. Then you can run the application using the following (or `yarn start`) command: +You can run the application using the following (or `yarn start`) command: ````bash npm start @@ -107,7 +101,7 @@ All right. We can start coding! ## Defining Entities -This application will have a single [entity](../../../Entities.md) and we can start by creating it. So, create a new `TodoItem` class under the **Entities** folder of the project. +This application will have a single [entity](../../../Entities.md) and we can start by creating it. So, create a new `TodoItem` class under the **Entities** folder of the project: ````csharp using Volo.Abp.Domain.Entities; @@ -136,7 +130,7 @@ Open the `TodoAppDbContext` class (under the **Data** folder) and add a new `DbS public DbSet TodoItems { get; set; } ```` -Then navigate to the `OnModelCreating` method in the same class and add the mapping code for the `TodoItem ` entity: +Then navigate to the `OnModelCreating` method in the same class and add the following mapping code for the `TodoItem ` entity: ````csharp protected override void OnModelCreating(ModelBuilder builder) @@ -168,7 +162,7 @@ Open a command-line terminal in the directory of your project and type the follo dotnet ef migrations add Added_TodoItem ```` -This will add a new migration class to the project. You should see the migration in the **Migrations** folder. +This will add a new migration class to the project. You should see the new migration in the **Migrations** folder. ![todo-efcore-migration](todo-efcore-migration-single-layer.png) @@ -180,7 +174,7 @@ dotnet ef database update {{else if DB=="Mongo"}} -The next step is to setup the [MongoDB](../../../MongoDB.md) configuration. Open the `TodoAppMongoDbContext` class (it's under the **Data** folder) in your project and make the following changes: +The next step is to setup the [MongoDB](../../../MongoDB.md) configuration. Open the `TodoAppDbContext` class (under the **Data** folder) in your project and make the following changes: 1. Add a new property to the class: @@ -201,7 +195,7 @@ modelBuilder.Entity(b => After the database integrations, now we can start to create application service methods and implement our use-cases. -## Creating the Application Service Interface +## Creating the Application Service An [Application Service](../../Application-Services.md) is used to perform the use cases of the application. We need to perform the following use cases in this application: @@ -209,25 +203,11 @@ An [Application Service](../../Application-Services.md) is used to perform the u * Create a new todo item * Delete an existing todo item -Let's start with defining an interface for the application service. Create a new `ITodoAppService` interface under the **Services** folder, as shown below: - -```csharp -using TodoApp.Services.Dtos; -using Volo.Abp.Application.Services; - -namespace TodoApp.Services; - -public interface ITodoAppService : IApplicationService -{ - Task> GetListAsync(); - Task CreateAsync(string text); - Task DeleteAsync(Guid id); -} -``` +Before starting to implement these use cases, first we need to create DTOs. -## Creating the Data Transfer Object (DTO) +### Creating the Data Transfer Object (DTO) -`GetListAsync` and `CreateAsync` methods return `TodoItemDto`. `ApplicationService` typically gets and returns DTOs ([Data Transfer Objects](../../../Data-Transfer-Objects.md)) instead of entities but we haven't created it yet. So, create a new `TodoItemDto` class under the **Dtos** folder (it's under the **Services** folder): +`ApplicationService` typically gets and returns DTOs ([Data Transfer Objects](../../../Data-Transfer-Objects.md)) instead of entities. So, create a new `TodoItemDto` class under the **Dtos** folder (under the **Services** folder): ```csharp namespace TodoApp.Services.Dtos; @@ -239,9 +219,9 @@ public class TodoItemDto } ``` -This is a very simple DTO class that has the same properties as the `TodoItem` entity. We are ready to implement the `ITodoAppService`. +* This is a very simple DTO class that has the same properties as the `TodoItem` entity. Now, we are ready to implement our use-cases. -## Application Service Implementation +### Application Service Implementation Create a `TodoAppService` class under the **Services** folder of your project, as shown below: @@ -252,7 +232,7 @@ using Volo.Abp.Domain.Repositories; namespace TodoApp.Services; -public class TodoAppService : ApplicationService, ITodoAppService +public class TodoAppService : ApplicationService { private readonly IRepository _todoItemRepository; @@ -265,9 +245,9 @@ public class TodoAppService : ApplicationService, ITodoAppService } ``` -This class inherits from the `ApplicationService` class of the ABP Framework and implements the `ITodoAppService` that was created in the [Creating the Application Service Interface](#creating-the-application-service-interface) section. ABP provides default generic [repositories](../../../Repositories.md) for the entities. We can use them to perform the fundamental database operations. This class [injects](../../../Dependency-Injection.md) `IRepository`, which is the default repository for the `TodoItem` entity. We will use it to implement the use cases described before. +This class inherits from the `ApplicationService` class of the ABP Framework and implements our use-cases. ABP provides default generic [repositories](../../../Repositories.md) for the entities. We can use them to perform the fundamental database operations. This class [injects](../../../Dependency-Injection.md) `IRepository`, which is the default repository for the `TodoItem` entity. We will use it to implement the use cases (`GetListAsync`, `CreateAsync` and `DeleteAsync`) described before. -### Getting the Todo Items +#### Getting the Todo Items Let's start by implementing the `GetListAsync` method: @@ -318,9 +298,9 @@ public async Task DeleteAsync(Guid id) } ```` -The application service is ready to be used from the UI layer. +The application service is ready to be used from the UI layer. So, let's implement it. -## User Interface Layer +## User Interface It is time to show the todo items on the UI! Before starting to write the code, it would be good to remember what we are trying to build. Here's a sample screenshot from the final UI: @@ -343,9 +323,9 @@ public class IndexModel : AbpPageModel { public List TodoItems { get; set; } - private readonly ITodoAppService _todoAppService; + private readonly TodoAppService _todoAppService; - public IndexModel(ITodoAppService todoAppService) + public IndexModel(TodoAppService todoAppService) { _todoAppService = todoAppService; } @@ -357,7 +337,7 @@ public class IndexModel : AbpPageModel } ``` -This class uses `ITodoAppService` to get the list of todo items and assign the `TodoItems` property. We will use it to render the todo items on the razor page. +This class uses `TodoAppService` to get the list of todo items and assign the `TodoItems` property. We will use it to render the todo items on the razor page. ### Index.cshtml @@ -497,9 +477,128 @@ If you open [Swagger UI](https://swagger.io/tools/swagger-ui/) by entering the ` ![todo-api](../todo-api.png) - {{else if UI=="BlazorServer"}} +### Index.razor.cs + +Open the `Index.razor.cs` file in the `Pages` folder and replace the content with the following code block: + +```csharp +using Microsoft.AspNetCore.Components; +using TodoApp.Services; +using TodoApp.Services.Dtos; + +namespace TodoApp.Pages; + +public partial class Index +{ + [Inject] + private TodoAppService TodoAppService { get; set; } + + private List TodoItems { get; set; } = new List(); + private string NewTodoText { get; set; } + + protected override async Task OnInitializedAsync() + { + TodoItems = await TodoAppService.GetListAsync(); + } + + private async Task Create() + { + var result = await TodoAppService.CreateAsync(NewTodoText); + TodoItems.Add(result); + NewTodoText = null; + } + + private async Task Delete(TodoItemDto todoItem) + { + await TodoAppService.DeleteAsync(todoItem.Id); + await Notify.Info("Deleted the todo item."); + TodoItems.Remove(todoItem); + } +} +``` + +This class uses the `TodoAppService` to get the list of todo items. It manipulates the `TodoItems` list after create and delete operations. This way, we don't need to refresh the whole todo list from the server. + +### Index.razor + +Open the `Index.razor` file in the `Pages` folder and replace the content with the following code block: + +```xml +@page "/" +@inherits TodoAppComponentBase + +
    + + + + TODO LIST + + + + +
    +
    +
    + +
    +
    +
    + +
    +
    + +
      + @foreach (var todoItem in TodoItems) + { +
    • + + @todoItem.Text +
    • + } +
    +
    +
    +
    +``` + +### Index.razor.css + +As the final touch, open the `Index.razor.css` file in the `Pages` folder and replace it with the following content: + +````css +#TodoList{ + list-style: none; + margin: 0; + padding: 0; +} + +#TodoList li { + padding: 5px; + margin: 5px 0px; + border: 1px solid #cccccc; + background-color: #f5f5f5; +} + +#TodoList li i +{ + opacity: 0.5; +} + +#TodoList li i:hover +{ + opacity: 1; + color: #ff0000; + cursor: pointer; +} +```` + +This is a simple styling for the todo page. We believe that you can do much better :) + +Now, you can run the application again to see the result. + {{else if UI=="NG"}} @@ -511,7 +610,7 @@ In this tutorial, we've built a very simple application to warm up with the ABP ## Source Code -You can find the source code of the completed application [here](https://github.com/abpframework/abp-samples/tree/master/TodoApp). +You can find the source code of the completed application [here](https://github.com/abpframework/abp-samples/tree/master/TodoApp-SingleLayer). ## See Also From 946a54b4c57dc948d8cd7c3e2fcd93487b0ba75c Mon Sep 17 00:00:00 2001 From: Engincan VESKE Date: Sat, 21 May 2022 11:43:11 +0300 Subject: [PATCH 14/59] Update Index.md --- docs/en/Tutorials/Todo/Single-Layer/Index.md | 145 ++++++++++++++++++- 1 file changed, 144 insertions(+), 1 deletion(-) diff --git a/docs/en/Tutorials/Todo/Single-Layer/Index.md b/docs/en/Tutorials/Todo/Single-Layer/Index.md index a53ff0a15a..244b30acb9 100644 --- a/docs/en/Tutorials/Todo/Single-Layer/Index.md +++ b/docs/en/Tutorials/Todo/Single-Layer/Index.md @@ -599,9 +599,152 @@ This is a simple styling for the todo page. We believe that you can do much bett Now, you can run the application again to see the result. - {{else if UI=="NG"}} +### Service Proxy Generation + +ABP provides a handy feature to automatically create client-side services to easily consume HTTP APIs provided by the server. + +You first need to run the `TodoApp` project since the proxy generator reads API definitions from the server application. + +Once you run the `TodoApp` project (**Swagger API Definition** will be shown), open a command-line terminal in the directory of `angular` folder and run the following command: + +```bash +abp generate-proxy -t ng +``` + +If everything goes well, it should generate an output as shown below: + +```bash +CREATE src/app/proxy/generate-proxy.json (182755 bytes) +CREATE src/app/proxy/README.md (1000 bytes) +CREATE src/app/proxy/services/todo.service.ts (833 bytes) +CREATE src/app/proxy/services/dtos/models.ts (71 bytes) +CREATE src/app/proxy/services/dtos/index.ts (26 bytes) +CREATE src/app/proxy/services/index.ts (81 bytes) +CREATE src/app/proxy/index.ts (61 bytes) +``` + +Then, we can use the `TodoService` to use the server-side HTTP APIs, as we'll do in the next section. + +### home.component.ts + +Open the `/angular/src/app/home/home.component.ts` file and replace its content with the following code block: + +```ts +import { ToasterService } from "@abp/ng.theme.shared"; +import { Component, OnInit } from '@angular/core'; +import { TodoItemDto } from "@proxy/services/dtos"; +import { TodoService } from "@proxy/services"; + +@Component({ + selector: 'app-home', + templateUrl: './home.component.html', + styleUrls: ['./home.component.scss'], +}) + +export class HomeComponent implements OnInit { + + todoItems: TodoItemDto[]; + newTodoText: string; + + constructor( + private todoService: TodoService, + private toasterService: ToasterService) + { } + + ngOnInit(): void { + this.todoService.getList().subscribe(response => { + this.todoItems = response; + }); + } + + create(): void{ + this.todoService.create(this.newTodoText).subscribe((result) => { + this.todoItems = this.todoItems.concat(result); + this.newTodoText = null; + }); + } + + delete(id: string): void { + this.todoService.delete(id).subscribe(() => { + this.todoItems = this.todoItems.filter(item => item.id !== id); + this.toasterService.info('Deleted the todo item.'); + }); + } +} +``` + +We've used `TodoService` to get the list of todo items and assigned the returning value to the `todoItems` array. We've also added `create` and `delete` methods. These methods will be used on the view side. + +### home.component.html + +Open the `/angular/src/app/home/home.component.html` file and replace its content with the following code block: + +````html +
    +
    +
    +
    TODO LIST
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    + +
      +
    • + {%{{{ todoItem.text }}}%} +
    • +
    +
    +
    +
    +```` + +### home.component.scss + +As the final touch, open the `/angular/src/app/home/home.component.scss` file and replace its content with the following code block: + +````css +#TodoList{ + list-style: none; + margin: 0; + padding: 0; +} + +#TodoList li { + padding: 5px; + margin: 5px 0px; + border: 1px solid #cccccc; + background-color: #f5f5f5; +} + +#TodoList li i +{ + opacity: 0.5; +} + +#TodoList li i:hover +{ + opacity: 1; + color: #ff0000; + cursor: pointer; +} +```` + +This is a simple styling for the todo page. We believe that you can do much better :) + +Now, you can run the application again to see the result. + {{end}} ## Conclusion From 456afa8c3a16c7cba670c214b7865c5eb381df84 Mon Sep 17 00:00:00 2001 From: Engincan VESKE Date: Sat, 21 May 2022 12:14:27 +0300 Subject: [PATCH 15/59] Update Index.md --- docs/en/Tutorials/Todo/Single-Layer/Index.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/en/Tutorials/Todo/Single-Layer/Index.md b/docs/en/Tutorials/Todo/Single-Layer/Index.md index 244b30acb9..9f4927f5e4 100644 --- a/docs/en/Tutorials/Todo/Single-Layer/Index.md +++ b/docs/en/Tutorials/Todo/Single-Layer/Index.md @@ -348,10 +348,10 @@ Open the `Index.cshtml` file in the `Pages` folder and replace it with the follo @model TodoApp.Pages.IndexModel @section styles { - + } @section scripts { - + }
    @@ -391,9 +391,9 @@ We are using ABP's [card tag helper](../../UI/AspNetCore/Tag-Helpers/Cards.md) t This page imports a CSS and a JavaScript file, so we should also create them. -### Index.js +### Index.cshtml.js -Create an `Index.js` file in the `Pages` folder and add the following content: +Open the `Index.cshtml.js` file in the `Pages` folder and replace with the following content: ````js $(function () { @@ -430,9 +430,9 @@ In the second part, we created a new todo item on the server. If it succeeded, w The interesting part here is how we communicate with the server. See the [*Dynamic JavaScript Proxies & Auto API Controllers*](#dynamic-javascript-proxies--auto-api-controllers) section to understand how it works. But now, let's continue and complete the application. -### Index.css +### Index.cshtml.css -As for the final touch, create the `Index.css` file in the `Pages` folder and add the following content: +As for the final touch, open the `Index.cshtml.css` file in the `Pages` folder and replace with the following content: ````css #TodoList{ @@ -467,9 +467,9 @@ Now, you can run the application again and see the result. ### Dynamic JavaScript Proxies & Auto API Controllers -In the `Index.js` file, we've used the `todoApp.services.todo.delete(...)` and `todoApp.services.todo.create(...)` functions to communicate with the server. These functions are dynamically created by the ABP Framework, thanks to the [Dynamic JavaScript Client Proxy](../../../UI/AspNetCore/Dynamic-JavaScript-Proxies.md) system. They perform HTTP API calls to the server and return a promise, so you can register a callback to the `then` function as we've done above. +In the `Index.cshtml.js` file, we've used the `todoApp.services.todo.delete(...)` and `todoApp.services.todo.create(...)` functions to communicate with the server. These functions are dynamically created by the ABP Framework, thanks to the [Dynamic JavaScript Client Proxy](../../../UI/AspNetCore/Dynamic-JavaScript-Proxies.md) system. They perform HTTP API calls to the server and return a promise, so you can register a callback to the `then` function as we've done above. -> **services** keyword comes from the namespace (`namespace TodoApp.Services;`). +> **services** keyword comes from the namespace (`namespace TodoApp.Services;`). It's a naming convention. However, you may notice that we haven't created any API Controllers, so how does the server handle these requests? This question brings us to the [Auto API Controller](../../../API/Auto-API-Controllers.md) feature of the ABP Framework. It automatically converts the application services to **API Controllers** by convention. From 0ae62dcfe98dd73dcc476d18b30bdf2b19579853 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Mon, 23 May 2022 14:55:58 +0800 Subject: [PATCH 16/59] Add CanObtainUserInfoWithoutPassword to IExternalLoginProvider --- .../Identity/AspNetCore/AbpSignInManager.cs | 14 +++++++-- .../Abp/Identity/ExternalLoginProviderBase.cs | 29 +++++++++++++++---- .../Abp/Identity/IExternalLoginProvider.cs | 8 +++-- .../AspNetCore/FakeExternalLoginProvider.cs | 5 ++++ 4 files changed, 46 insertions(+), 10 deletions(-) diff --git a/modules/identity/src/Volo.Abp.Identity.AspNetCore/Volo/Abp/Identity/AspNetCore/AbpSignInManager.cs b/modules/identity/src/Volo.Abp.Identity.AspNetCore/Volo/Abp/Identity/AspNetCore/AbpSignInManager.cs index 313be4ae3f..946435e87c 100644 --- a/modules/identity/src/Volo.Abp.Identity.AspNetCore/Volo/Abp/Identity/AspNetCore/AbpSignInManager.cs +++ b/modules/identity/src/Volo.Abp.Identity.AspNetCore/Volo/Abp/Identity/AspNetCore/AbpSignInManager.cs @@ -49,11 +49,21 @@ public class AbpSignInManager : SignInManager var user = await UserManager.FindByNameAsync(userName); if (user == null) { - user = await externalLoginProvider.CreateUserAsync(userName, externalLoginProviderInfo.Name); + user = externalLoginProvider.CanObtainUserInfoWithoutPassword + ? await externalLoginProvider.CreateUserAsync(userName, externalLoginProviderInfo.Name) + : await externalLoginProvider.CreateUserAsync(userName, externalLoginProviderInfo.Name, password); } else { - await externalLoginProvider.UpdateUserAsync(user, externalLoginProviderInfo.Name); + if (externalLoginProvider.CanObtainUserInfoWithoutPassword) + { + await externalLoginProvider.UpdateUserAsync(user, externalLoginProviderInfo.Name); + } + else + { + await externalLoginProvider.UpdateUserAsync(user, externalLoginProviderInfo.Name, password); + } + } return await SignInOrTwoFactorAsync(user, isPersistent); diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/ExternalLoginProviderBase.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/ExternalLoginProviderBase.cs index cfefad2a95..ba85576ace 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/ExternalLoginProviderBase.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/ExternalLoginProviderBase.cs @@ -16,6 +16,8 @@ public abstract class ExternalLoginProviderBase : IExternalLoginProvider protected IdentityUserManager UserManager { get; } protected IIdentityUserRepository IdentityUserRepository { get; } protected IOptions IdentityOptions { get; } + + public bool CanObtainUserInfoWithoutPassword { get; set; } protected ExternalLoginProviderBase( IGuidGenerator guidGenerator, @@ -29,19 +31,21 @@ public abstract class ExternalLoginProviderBase : IExternalLoginProvider UserManager = userManager; IdentityUserRepository = identityUserRepository; IdentityOptions = identityOptions; + CanObtainUserInfoWithoutPassword = true; } public abstract Task TryAuthenticateAsync(string userName, string plainPassword); - + public abstract Task IsEnabledAsync(); - public virtual async Task CreateUserAsync(string userName, string providerName) + public virtual async Task CreateUserAsync(string userName, string providerName, string plainPassword = null) { await IdentityOptions.SetAsync(); - var externalUser = await GetUserInfoAsync(userName); - NormalizeExternalLoginUserInfo(externalUser, userName); + var externalUser = CanObtainUserInfoWithoutPassword ? await GetUserInfoAsync(userName) : await GetUserInfoAsync(userName, plainPassword); + NormalizeExternalLoginUserInfo(externalUser, userName); + var user = new IdentityUser( GuidGenerator.Create(), userName, @@ -78,11 +82,17 @@ public abstract class ExternalLoginProviderBase : IExternalLoginProvider return user; } - public virtual async Task UpdateUserAsync(IdentityUser user, string providerName) + public virtual async Task UpdateUserAsync(IdentityUser user, string providerName, string plainPassword = null) { await IdentityOptions.SetAsync(); - var externalUser = await GetUserInfoAsync(user); + if (!CanObtainUserInfoWithoutPassword) + { + Check.NotNullOrWhiteSpace(plainPassword, nameof(plainPassword)); + } + + var externalUser = CanObtainUserInfoWithoutPassword ? await GetUserInfoAsync(user) : await GetUserInfoAsync(user, plainPassword); + NormalizeExternalLoginUserInfo(externalUser, user.UserName); if (!externalUser.Name.IsNullOrWhiteSpace()) @@ -147,10 +157,17 @@ public abstract class ExternalLoginProviderBase : IExternalLoginProvider protected abstract Task GetUserInfoAsync(string userName); + protected abstract Task GetUserInfoAsync(string userName, string plainPassword); + protected virtual Task GetUserInfoAsync(IdentityUser user) { return GetUserInfoAsync(user.UserName); } + + protected virtual Task GetUserInfoAsync(IdentityUser user, string plainPassword) + { + return GetUserInfoAsync(user.UserName, plainPassword); + } private static void NormalizeExternalLoginUserInfo( ExternalLoginUserInfo externalUser, diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IExternalLoginProvider.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IExternalLoginProvider.cs index 52d3895d13..7621c54de6 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IExternalLoginProvider.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IExternalLoginProvider.cs @@ -4,6 +4,8 @@ namespace Volo.Abp.Identity; public interface IExternalLoginProvider { + bool CanObtainUserInfoWithoutPassword { get; set; } + /// /// Used to try authenticate a user by this source. /// @@ -18,8 +20,9 @@ public interface IExternalLoginProvider /// /// User name /// The name of this provider + /// Optional, plain password of the user /// Newly created user - Task CreateUserAsync(string userName, string providerName); + Task CreateUserAsync(string userName, string providerName, string plainPassword = null); /// /// This method is called after an existing user is authenticated by this source. @@ -27,7 +30,8 @@ public interface IExternalLoginProvider /// /// The name of this provider /// The user that can be updated - Task UpdateUserAsync(IdentityUser user, string providerName); + /// Optional, plain password of the user + Task UpdateUserAsync(IdentityUser user, string providerName, string plainPassword = null); /// /// Return a value indicating whether this source is enabled. diff --git a/modules/identity/test/Volo.Abp.Identity.AspNetCore.Tests/Volo/Abp/Identity/AspNetCore/FakeExternalLoginProvider.cs b/modules/identity/test/Volo.Abp.Identity.AspNetCore.Tests/Volo/Abp/Identity/AspNetCore/FakeExternalLoginProvider.cs index fbfc0e2ef6..038e8cde0c 100644 --- a/modules/identity/test/Volo.Abp.Identity.AspNetCore.Tests/Volo/Abp/Identity/AspNetCore/FakeExternalLoginProvider.cs +++ b/modules/identity/test/Volo.Abp.Identity.AspNetCore.Tests/Volo/Abp/Identity/AspNetCore/FakeExternalLoginProvider.cs @@ -60,4 +60,9 @@ public class FakeExternalLoginProvider : ExternalLoginProviderBase, ITransientDe } ); } + + protected override Task GetUserInfoAsync(string userName, string plainPassword) + { + return GetUserInfoAsync(userName); + } } From 7486582023e7835313135e81e65ad62730b7ee2a Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Mon, 23 May 2022 15:39:01 +0800 Subject: [PATCH 17/59] Add IExternalLoginProviderWithPassword --- .../Identity/AspNetCore/AbpSignInManager.cs | 20 ++++++--- .../Abp/Identity/ExternalLoginProviderBase.cs | 45 +++++++++++++------ .../Abp/Identity/IExternalLoginProvider.cs | 8 ++-- .../IExternalLoginProviderWithPassword.cs | 26 +++++++++++ .../AspNetCore/FakeExternalLoginProvider.cs | 5 +++ 5 files changed, 79 insertions(+), 25 deletions(-) create mode 100644 modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IExternalLoginProviderWithPassword.cs diff --git a/modules/identity/src/Volo.Abp.Identity.AspNetCore/Volo/Abp/Identity/AspNetCore/AbpSignInManager.cs b/modules/identity/src/Volo.Abp.Identity.AspNetCore/Volo/Abp/Identity/AspNetCore/AbpSignInManager.cs index 946435e87c..49959d930d 100644 --- a/modules/identity/src/Volo.Abp.Identity.AspNetCore/Volo/Abp/Identity/AspNetCore/AbpSignInManager.cs +++ b/modules/identity/src/Volo.Abp.Identity.AspNetCore/Volo/Abp/Identity/AspNetCore/AbpSignInManager.cs @@ -49,21 +49,27 @@ public class AbpSignInManager : SignInManager var user = await UserManager.FindByNameAsync(userName); if (user == null) { - user = externalLoginProvider.CanObtainUserInfoWithoutPassword - ? await externalLoginProvider.CreateUserAsync(userName, externalLoginProviderInfo.Name) - : await externalLoginProvider.CreateUserAsync(userName, externalLoginProviderInfo.Name, password); + if (!externalLoginProvider.CanObtainUserInfoWithoutPassword() && + externalLoginProvider is IExternalLoginProviderWithPassword externalLoginProviderWithPassword) + { + user = await externalLoginProviderWithPassword.CreateUserAsync(userName, externalLoginProviderInfo.Name, password); + } + else + { + user = await externalLoginProvider.CreateUserAsync(userName, externalLoginProviderInfo.Name); + } } else { - if (externalLoginProvider.CanObtainUserInfoWithoutPassword) + if (!externalLoginProvider.CanObtainUserInfoWithoutPassword() && + externalLoginProvider is IExternalLoginProviderWithPassword externalLoginProviderWithPassword) { - await externalLoginProvider.UpdateUserAsync(user, externalLoginProviderInfo.Name); + await externalLoginProviderWithPassword.UpdateUserAsync(user, externalLoginProviderInfo.Name, password); } else { - await externalLoginProvider.UpdateUserAsync(user, externalLoginProviderInfo.Name, password); + await externalLoginProvider.UpdateUserAsync(user, externalLoginProviderInfo.Name); } - } return await SignInOrTwoFactorAsync(user, isPersistent); diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/ExternalLoginProviderBase.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/ExternalLoginProviderBase.cs index ba85576ace..a19b0fb7c8 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/ExternalLoginProviderBase.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/ExternalLoginProviderBase.cs @@ -9,16 +9,13 @@ using Volo.Abp.MultiTenancy; namespace Volo.Abp.Identity; -public abstract class ExternalLoginProviderBase : IExternalLoginProvider +public abstract class ExternalLoginProviderBase : IExternalLoginProvider, IExternalLoginProviderWithPassword { protected IGuidGenerator GuidGenerator { get; } protected ICurrentTenant CurrentTenant { get; } protected IdentityUserManager UserManager { get; } protected IIdentityUserRepository IdentityUserRepository { get; } protected IOptions IdentityOptions { get; } - - public bool CanObtainUserInfoWithoutPassword { get; set; } - protected ExternalLoginProviderBase( IGuidGenerator guidGenerator, ICurrentTenant currentTenant, @@ -31,19 +28,32 @@ public abstract class ExternalLoginProviderBase : IExternalLoginProvider UserManager = userManager; IdentityUserRepository = identityUserRepository; IdentityOptions = identityOptions; - CanObtainUserInfoWithoutPassword = true; } public abstract Task TryAuthenticateAsync(string userName, string plainPassword); public abstract Task IsEnabledAsync(); - public virtual async Task CreateUserAsync(string userName, string providerName, string plainPassword = null) + public virtual async Task CreateUserAsync(string userName, string providerName) { await IdentityOptions.SetAsync(); - var externalUser = CanObtainUserInfoWithoutPassword ? await GetUserInfoAsync(userName) : await GetUserInfoAsync(userName, plainPassword); + var externalUser = await GetUserInfoAsync(userName); + + return await CreateUserAsync(externalUser, userName, providerName); + } + public virtual async Task CreateUserAsync(string userName, string providerName, string plainPassword) + { + await IdentityOptions.SetAsync(); + + var externalUser = await GetUserInfoAsync(userName, plainPassword); + + return await CreateUserAsync(externalUser, userName, providerName); + } + + protected virtual async Task CreateUserAsync(ExternalLoginUserInfo externalUser, string userName, string providerName) + { NormalizeExternalLoginUserInfo(externalUser, userName); var user = new IdentityUser( @@ -82,17 +92,26 @@ public abstract class ExternalLoginProviderBase : IExternalLoginProvider return user; } - public virtual async Task UpdateUserAsync(IdentityUser user, string providerName, string plainPassword = null) + public virtual async Task UpdateUserAsync(IdentityUser user, string providerName) { await IdentityOptions.SetAsync(); + + var externalUser = await GetUserInfoAsync(user); - if (!CanObtainUserInfoWithoutPassword) - { - Check.NotNullOrWhiteSpace(plainPassword, nameof(plainPassword)); - } + await UpdateUserAsync(user, externalUser, providerName); + } + + public virtual async Task UpdateUserAsync(IdentityUser user, string providerName, string plainPassword) + { + await IdentityOptions.SetAsync(); - var externalUser = CanObtainUserInfoWithoutPassword ? await GetUserInfoAsync(user) : await GetUserInfoAsync(user, plainPassword); + var externalUser = await GetUserInfoAsync(user, plainPassword); + await UpdateUserAsync(user, externalUser, providerName); + } + + protected virtual async Task UpdateUserAsync(IdentityUser user, ExternalLoginUserInfo externalUser ,string providerName) + { NormalizeExternalLoginUserInfo(externalUser, user.UserName); if (!externalUser.Name.IsNullOrWhiteSpace()) diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IExternalLoginProvider.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IExternalLoginProvider.cs index 7621c54de6..2b9a267369 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IExternalLoginProvider.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IExternalLoginProvider.cs @@ -4,7 +4,7 @@ namespace Volo.Abp.Identity; public interface IExternalLoginProvider { - bool CanObtainUserInfoWithoutPassword { get; set; } + bool CanObtainUserInfoWithoutPassword(); /// /// Used to try authenticate a user by this source. @@ -20,9 +20,8 @@ public interface IExternalLoginProvider /// /// User name /// The name of this provider - /// Optional, plain password of the user /// Newly created user - Task CreateUserAsync(string userName, string providerName, string plainPassword = null); + Task CreateUserAsync(string userName, string providerName); /// /// This method is called after an existing user is authenticated by this source. @@ -30,8 +29,7 @@ public interface IExternalLoginProvider /// /// The name of this provider /// The user that can be updated - /// Optional, plain password of the user - Task UpdateUserAsync(IdentityUser user, string providerName, string plainPassword = null); + Task UpdateUserAsync(IdentityUser user, string providerName); /// /// Return a value indicating whether this source is enabled. diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IExternalLoginProviderWithPassword.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IExternalLoginProviderWithPassword.cs new file mode 100644 index 0000000000..ae91079a76 --- /dev/null +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IExternalLoginProviderWithPassword.cs @@ -0,0 +1,26 @@ +using System.Threading.Tasks; + +namespace Volo.Abp.Identity +{ + public interface IExternalLoginProviderWithPassword + { + /// + /// This method is called when a user is authenticated by this source but the user does not exists yet. + /// So, the source should create the user and fill the properties. + /// + /// User name + /// The name of this provider + /// The plain password of the user + /// Newly created user + Task CreateUserAsync(string userName, string providerName, string plainPassword); + + /// + /// This method is called after an existing user is authenticated by this source. + /// It can be used to update some properties of the user by the source. + /// + /// The name of this provider + /// The user that can be updated + /// The plain password of the user + Task UpdateUserAsync(IdentityUser user, string providerName, string plainPassword); + } +} \ No newline at end of file diff --git a/modules/identity/test/Volo.Abp.Identity.AspNetCore.Tests/Volo/Abp/Identity/AspNetCore/FakeExternalLoginProvider.cs b/modules/identity/test/Volo.Abp.Identity.AspNetCore.Tests/Volo/Abp/Identity/AspNetCore/FakeExternalLoginProvider.cs index 038e8cde0c..8cfb3df04d 100644 --- a/modules/identity/test/Volo.Abp.Identity.AspNetCore.Tests/Volo/Abp/Identity/AspNetCore/FakeExternalLoginProvider.cs +++ b/modules/identity/test/Volo.Abp.Identity.AspNetCore.Tests/Volo/Abp/Identity/AspNetCore/FakeExternalLoginProvider.cs @@ -28,6 +28,11 @@ public class FakeExternalLoginProvider : ExternalLoginProviderBase, ITransientDe } + public override bool CanObtainUserInfoWithoutPassword() + { + return true; + } + public override Task TryAuthenticateAsync(string userName, string plainPassword) { return Task.FromResult( From a4bc569e155b1b65c92e6e74b6f26cbe33df336d Mon Sep 17 00:00:00 2001 From: j0nimost Date: Mon, 23 May 2022 10:39:53 +0300 Subject: [PATCH 18/59] Implemented a Null or Empty checker for structs --- framework/src/Volo.Abp.Core/Volo/Abp/Check.cs | 27 +++++++++++++------ 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Check.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Check.cs index 01ffc8c55b..7758058e95 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/Check.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/Check.cs @@ -342,17 +342,28 @@ public static class Check return value; } - public static T NotDefault( - T value, - [InvokerParameterName][NotNull] string parameterName) + /// + /// Checks if value of type T (struct) is empty, default or null + /// + /// + /// + /// + /// + /// + public static T NotDefaultorNull( + Nullable value, + string parameterName) where T : struct - { - if(value.Equals(default(T))) + { + if (value.Equals(default(T))) { throw new ArgumentException($"{parameterName} has a default value or is empty!", parameterName); } - - return value; - } + else if (value.HasValue == false) + { + throw new ArgumentException($"{parameterName} is null!", parameterName); + } + return (T)value; + } } From cf0bc4bab702a55b7e706778f9821749bfd6c0a5 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Mon, 23 May 2022 15:41:07 +0800 Subject: [PATCH 19/59] Update ExternalLoginProviderBase --- .../Volo/Abp/Identity/ExternalLoginProviderBase.cs | 5 +++++ .../Abp/Identity/AspNetCore/FakeExternalLoginProvider.cs | 5 ----- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/ExternalLoginProviderBase.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/ExternalLoginProviderBase.cs index a19b0fb7c8..ce1680f5ea 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/ExternalLoginProviderBase.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/ExternalLoginProviderBase.cs @@ -30,6 +30,11 @@ public abstract class ExternalLoginProviderBase : IExternalLoginProvider, IExter IdentityOptions = identityOptions; } + public virtual bool CanObtainUserInfoWithoutPassword() + { + return true; + } + public abstract Task TryAuthenticateAsync(string userName, string plainPassword); public abstract Task IsEnabledAsync(); diff --git a/modules/identity/test/Volo.Abp.Identity.AspNetCore.Tests/Volo/Abp/Identity/AspNetCore/FakeExternalLoginProvider.cs b/modules/identity/test/Volo.Abp.Identity.AspNetCore.Tests/Volo/Abp/Identity/AspNetCore/FakeExternalLoginProvider.cs index 8cfb3df04d..038e8cde0c 100644 --- a/modules/identity/test/Volo.Abp.Identity.AspNetCore.Tests/Volo/Abp/Identity/AspNetCore/FakeExternalLoginProvider.cs +++ b/modules/identity/test/Volo.Abp.Identity.AspNetCore.Tests/Volo/Abp/Identity/AspNetCore/FakeExternalLoginProvider.cs @@ -28,11 +28,6 @@ public class FakeExternalLoginProvider : ExternalLoginProviderBase, ITransientDe } - public override bool CanObtainUserInfoWithoutPassword() - { - return true; - } - public override Task TryAuthenticateAsync(string userName, string plainPassword) { return Task.FromResult( From d2a9d43ea46cc13fb5210b6f03f0c74a23a69a9e Mon Sep 17 00:00:00 2001 From: j0nimost Date: Mon, 23 May 2022 10:41:09 +0300 Subject: [PATCH 20/59] Added parameterName validation --- framework/src/Volo.Abp.Core/Volo/Abp/Check.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Check.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Check.cs index 7758058e95..c31d616518 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/Check.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/Check.cs @@ -352,7 +352,7 @@ public static class Check /// public static T NotDefaultorNull( Nullable value, - string parameterName) + [InvokerParameterName][NotNull] string parameterName) where T : struct { if (value.Equals(default(T))) From 4fbac360755b9ab68c3f1207316c4873255a72f1 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Mon, 23 May 2022 16:18:11 +0800 Subject: [PATCH 21/59] Refactor --- .../Identity/AspNetCore/AbpSignInManager.cs | 6 +-- .../Abp/Identity/ExternalLoginProviderBase.cs | 34 +------------ .../ExternalLoginProviderWithPasswordBase.cs | 49 +++++++++++++++++++ .../Abp/Identity/IExternalLoginProvider.cs | 6 +-- .../AspNetCore/FakeExternalLoginProvider.cs | 5 -- 5 files changed, 55 insertions(+), 45 deletions(-) create mode 100644 modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/ExternalLoginProviderWithPasswordBase.cs diff --git a/modules/identity/src/Volo.Abp.Identity.AspNetCore/Volo/Abp/Identity/AspNetCore/AbpSignInManager.cs b/modules/identity/src/Volo.Abp.Identity.AspNetCore/Volo/Abp/Identity/AspNetCore/AbpSignInManager.cs index 49959d930d..bbba6e63ec 100644 --- a/modules/identity/src/Volo.Abp.Identity.AspNetCore/Volo/Abp/Identity/AspNetCore/AbpSignInManager.cs +++ b/modules/identity/src/Volo.Abp.Identity.AspNetCore/Volo/Abp/Identity/AspNetCore/AbpSignInManager.cs @@ -49,8 +49,7 @@ public class AbpSignInManager : SignInManager var user = await UserManager.FindByNameAsync(userName); if (user == null) { - if (!externalLoginProvider.CanObtainUserInfoWithoutPassword() && - externalLoginProvider is IExternalLoginProviderWithPassword externalLoginProviderWithPassword) + if (externalLoginProvider is IExternalLoginProviderWithPassword externalLoginProviderWithPassword) { user = await externalLoginProviderWithPassword.CreateUserAsync(userName, externalLoginProviderInfo.Name, password); } @@ -61,8 +60,7 @@ public class AbpSignInManager : SignInManager } else { - if (!externalLoginProvider.CanObtainUserInfoWithoutPassword() && - externalLoginProvider is IExternalLoginProviderWithPassword externalLoginProviderWithPassword) + if (externalLoginProvider is IExternalLoginProviderWithPassword externalLoginProviderWithPassword) { await externalLoginProviderWithPassword.UpdateUserAsync(user, externalLoginProviderInfo.Name, password); } diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/ExternalLoginProviderBase.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/ExternalLoginProviderBase.cs index ce1680f5ea..240bf208d8 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/ExternalLoginProviderBase.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/ExternalLoginProviderBase.cs @@ -9,7 +9,7 @@ using Volo.Abp.MultiTenancy; namespace Volo.Abp.Identity; -public abstract class ExternalLoginProviderBase : IExternalLoginProvider, IExternalLoginProviderWithPassword +public abstract class ExternalLoginProviderBase : IExternalLoginProvider { protected IGuidGenerator GuidGenerator { get; } protected ICurrentTenant CurrentTenant { get; } @@ -30,11 +30,6 @@ public abstract class ExternalLoginProviderBase : IExternalLoginProvider, IExter IdentityOptions = identityOptions; } - public virtual bool CanObtainUserInfoWithoutPassword() - { - return true; - } - public abstract Task TryAuthenticateAsync(string userName, string plainPassword); public abstract Task IsEnabledAsync(); @@ -47,15 +42,6 @@ public abstract class ExternalLoginProviderBase : IExternalLoginProvider, IExter return await CreateUserAsync(externalUser, userName, providerName); } - - public virtual async Task CreateUserAsync(string userName, string providerName, string plainPassword) - { - await IdentityOptions.SetAsync(); - - var externalUser = await GetUserInfoAsync(userName, plainPassword); - - return await CreateUserAsync(externalUser, userName, providerName); - } protected virtual async Task CreateUserAsync(ExternalLoginUserInfo externalUser, string userName, string providerName) { @@ -105,16 +91,7 @@ public abstract class ExternalLoginProviderBase : IExternalLoginProvider, IExter await UpdateUserAsync(user, externalUser, providerName); } - - public virtual async Task UpdateUserAsync(IdentityUser user, string providerName, string plainPassword) - { - await IdentityOptions.SetAsync(); - - var externalUser = await GetUserInfoAsync(user, plainPassword); - - await UpdateUserAsync(user, externalUser, providerName); - } - + protected virtual async Task UpdateUserAsync(IdentityUser user, ExternalLoginUserInfo externalUser ,string providerName) { NormalizeExternalLoginUserInfo(externalUser, user.UserName); @@ -181,17 +158,10 @@ public abstract class ExternalLoginProviderBase : IExternalLoginProvider, IExter protected abstract Task GetUserInfoAsync(string userName); - protected abstract Task GetUserInfoAsync(string userName, string plainPassword); - protected virtual Task GetUserInfoAsync(IdentityUser user) { return GetUserInfoAsync(user.UserName); } - - protected virtual Task GetUserInfoAsync(IdentityUser user, string plainPassword) - { - return GetUserInfoAsync(user.UserName, plainPassword); - } private static void NormalizeExternalLoginUserInfo( ExternalLoginUserInfo externalUser, diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/ExternalLoginProviderWithPasswordBase.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/ExternalLoginProviderWithPasswordBase.cs new file mode 100644 index 0000000000..612091f8ea --- /dev/null +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/ExternalLoginProviderWithPasswordBase.cs @@ -0,0 +1,49 @@ +using System.Threading.Tasks; +using Microsoft.AspNetCore.Identity; +using Microsoft.Extensions.Options; +using Volo.Abp.Guids; +using Volo.Abp.MultiTenancy; + +namespace Volo.Abp.Identity; + +public abstract class ExternalLoginProviderWithPasswordBase : ExternalLoginProviderBase, IExternalLoginProviderWithPassword +{ + public ExternalLoginProviderWithPasswordBase( + IGuidGenerator guidGenerator, + ICurrentTenant currentTenant, + IdentityUserManager userManager, + IIdentityUserRepository identityUserRepository, + IOptions identityOptions) : + base(guidGenerator, + currentTenant, + userManager, + identityUserRepository, + identityOptions) + { + } + + public async Task CreateUserAsync(string userName, string providerName, string plainPassword) + { + await IdentityOptions.SetAsync(); + + var externalUser = await GetUserInfoAsync(userName, plainPassword); + + return await CreateUserAsync(externalUser, userName, providerName); + } + + public async Task UpdateUserAsync(IdentityUser user, string providerName, string plainPassword) + { + await IdentityOptions.SetAsync(); + + var externalUser = await GetUserInfoAsync(user, plainPassword); + + await UpdateUserAsync(user, externalUser, providerName); + } + + protected abstract Task GetUserInfoAsync(string userName, string plainPassword); + + protected virtual Task GetUserInfoAsync(IdentityUser user, string plainPassword) + { + return GetUserInfoAsync(user.UserName, plainPassword); + } +} \ No newline at end of file diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IExternalLoginProvider.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IExternalLoginProvider.cs index 2b9a267369..774c5a41db 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IExternalLoginProvider.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IExternalLoginProvider.cs @@ -4,8 +4,6 @@ namespace Volo.Abp.Identity; public interface IExternalLoginProvider { - bool CanObtainUserInfoWithoutPassword(); - /// /// Used to try authenticate a user by this source. /// @@ -30,10 +28,10 @@ public interface IExternalLoginProvider /// The name of this provider /// The user that can be updated Task UpdateUserAsync(IdentityUser user, string providerName); - + /// /// Return a value indicating whether this source is enabled. /// /// Task IsEnabledAsync(); -} +} \ No newline at end of file diff --git a/modules/identity/test/Volo.Abp.Identity.AspNetCore.Tests/Volo/Abp/Identity/AspNetCore/FakeExternalLoginProvider.cs b/modules/identity/test/Volo.Abp.Identity.AspNetCore.Tests/Volo/Abp/Identity/AspNetCore/FakeExternalLoginProvider.cs index 038e8cde0c..fbfc0e2ef6 100644 --- a/modules/identity/test/Volo.Abp.Identity.AspNetCore.Tests/Volo/Abp/Identity/AspNetCore/FakeExternalLoginProvider.cs +++ b/modules/identity/test/Volo.Abp.Identity.AspNetCore.Tests/Volo/Abp/Identity/AspNetCore/FakeExternalLoginProvider.cs @@ -60,9 +60,4 @@ public class FakeExternalLoginProvider : ExternalLoginProviderBase, ITransientDe } ); } - - protected override Task GetUserInfoAsync(string userName, string plainPassword) - { - return GetUserInfoAsync(userName); - } } From 80ea30be0a63e634495314b12433a72201cf2d9b Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Mon, 23 May 2022 18:30:14 +0800 Subject: [PATCH 22/59] Improved --- .../ExternalLoginProviderWithPasswordBase.cs | 27 ++++++++++++++++--- .../IExternalLoginProviderWithPassword.cs | 2 ++ 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/ExternalLoginProviderWithPasswordBase.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/ExternalLoginProviderWithPasswordBase.cs index 612091f8ea..e791004fd0 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/ExternalLoginProviderWithPasswordBase.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/ExternalLoginProviderWithPasswordBase.cs @@ -1,4 +1,5 @@ -using System.Threading.Tasks; +using System; +using System.Threading.Tasks; using Microsoft.AspNetCore.Identity; using Microsoft.Extensions.Options; using Volo.Abp.Guids; @@ -8,22 +9,31 @@ namespace Volo.Abp.Identity; public abstract class ExternalLoginProviderWithPasswordBase : ExternalLoginProviderBase, IExternalLoginProviderWithPassword { + public bool CanObtainUserInfoWithoutPassword { get; } + public ExternalLoginProviderWithPasswordBase( IGuidGenerator guidGenerator, ICurrentTenant currentTenant, IdentityUserManager userManager, IIdentityUserRepository identityUserRepository, - IOptions identityOptions) : + IOptions identityOptions, + bool canObtainUserInfoWithoutPassword = false) : base(guidGenerator, currentTenant, userManager, identityUserRepository, identityOptions) { + CanObtainUserInfoWithoutPassword = canObtainUserInfoWithoutPassword; } public async Task CreateUserAsync(string userName, string providerName, string plainPassword) { + if (CanObtainUserInfoWithoutPassword) + { + return await CreateUserAsync(userName, providerName); + } + await IdentityOptions.SetAsync(); var externalUser = await GetUserInfoAsync(userName, plainPassword); @@ -33,13 +43,24 @@ public abstract class ExternalLoginProviderWithPasswordBase : ExternalLoginProvi public async Task UpdateUserAsync(IdentityUser user, string providerName, string plainPassword) { + if (CanObtainUserInfoWithoutPassword) + { + await UpdateUserAsync(user, providerName); + return; + } + await IdentityOptions.SetAsync(); var externalUser = await GetUserInfoAsync(user, plainPassword); await UpdateUserAsync(user, externalUser, providerName); } - + + protected override Task GetUserInfoAsync(string userName) + { + throw new NotImplementedException($"{nameof(GetUserInfoAsync)} is not implemented default. It should be overriden and implemented by the deriving class!"); + } + protected abstract Task GetUserInfoAsync(string userName, string plainPassword); protected virtual Task GetUserInfoAsync(IdentityUser user, string plainPassword) diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IExternalLoginProviderWithPassword.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IExternalLoginProviderWithPassword.cs index ae91079a76..fa811c852e 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IExternalLoginProviderWithPassword.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IExternalLoginProviderWithPassword.cs @@ -4,6 +4,8 @@ namespace Volo.Abp.Identity { public interface IExternalLoginProviderWithPassword { + bool CanObtainUserInfoWithoutPassword { get; } + /// /// This method is called when a user is authenticated by this source but the user does not exists yet. /// So, the source should create the user and fill the properties. From 20950b576e8623bc81d7f8caf1dbe27d10fdf377 Mon Sep 17 00:00:00 2001 From: maliming Date: Fri, 27 May 2022 08:34:23 +0800 Subject: [PATCH 23/59] Update Check.cs --- framework/src/Volo.Abp.Core/Volo/Abp/Check.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Check.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Check.cs index c31d616518..8979c897a3 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/Check.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/Check.cs @@ -163,8 +163,6 @@ public static class Check return value; } - - public static Int16 Positive( Int16 value, [InvokerParameterName][NotNull] string parameterName) @@ -363,6 +361,7 @@ public static class Check { throw new ArgumentException($"{parameterName} is null!", parameterName); } + return (T)value; } From c3d9f94f7928b3a8e825821346e9ba2ac1ada4b0 Mon Sep 17 00:00:00 2001 From: maliming Date: Fri, 27 May 2022 08:48:25 +0800 Subject: [PATCH 24/59] Update Check.cs --- framework/src/Volo.Abp.Core/Volo/Abp/Check.cs | 26 ++++++------------- 1 file changed, 8 insertions(+), 18 deletions(-) diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Check.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Check.cs index 8979c897a3..a2448190a5 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/Check.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/Check.cs @@ -253,8 +253,6 @@ public static class Check return value; } - - public static Int16 Range( Int16 value, [InvokerParameterName][NotNull] string parameterName, @@ -340,29 +338,21 @@ public static class Check return value; } - /// - /// Checks if value of type T (struct) is empty, default or null - /// - /// - /// - /// - /// - /// - public static T NotDefaultorNull( - Nullable value, + public static T NotDefaultOrNull( + T? value, [InvokerParameterName][NotNull] string parameterName) where T : struct { - if (value.Equals(default(T))) + if (value == null) { - throw new ArgumentException($"{parameterName} has a default value or is empty!", parameterName); + throw new ArgumentException($"{parameterName} is null!", parameterName); } - else if (value.HasValue == false) + + if (value.Value.Equals(default(T))) { - throw new ArgumentException($"{parameterName} is null!", parameterName); + throw new ArgumentException($"{parameterName} has a default value!", parameterName); } - return (T)value; + return value.Value; } - } From b0687639c0bc12122a134772f025fa3de1f4309b Mon Sep 17 00:00:00 2001 From: maliming Date: Fri, 27 May 2022 11:27:37 +0800 Subject: [PATCH 25/59] CLI Compatible `AuthServer` project name. --- ...onmentFilePortChangeForSeparatedAuthServersStep.cs} | 2 +- .../ProjectBuilding/Templates/App/AppTemplateBase.cs | 6 +++--- ...pTemplateChangeConsoleTestClientPortSettingsStep.cs | 10 +++++----- .../App/AppTemplateChangeDbMigratorPortSettingsStep.cs | 10 +++++----- ...ppTemplateSwitchEntityFrameworkCoreToMongoDbStep.cs | 9 +++++++++ ...ttingsFilePortChangeForSeparatedAuthServersStep.cs} | 2 +- ...onmentFilePortChangeForSeparatedAuthServersStep.cs} | 2 +- .../Templates/RemoveUnnecessaryPortsStep.cs | 4 ++-- .../Abp/Cli/ProjectModification/NuGetPackageTarget.cs | 2 +- .../Volo/Abp/Cli/ProjectModification/ProjectFinder.cs | 3 ++- .../ProjectModification/ProjectNugetPackageAdder.cs | 2 +- .../Abp/Cli/ProjectModification/SolutionModuleAdder.cs | 2 +- 12 files changed, 32 insertions(+), 22 deletions(-) rename framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/{AngularEnvironmentFilePortChangeForSeparatedIdentityServersStep.cs => AngularEnvironmentFilePortChangeForSeparatedAuthServersStep.cs} (93%) rename framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/{BlazorAppsettingsFilePortChangeForSeparatedIdentityServersStep.cs => BlazorAppsettingsFilePortChangeForSeparatedAuthServersStep.cs} (92%) rename framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/{ReactEnvironmentFilePortChangeForSeparatedIdentityServersStep.cs => ReactEnvironmentFilePortChangeForSeparatedAuthServersStep.cs} (91%) diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AngularEnvironmentFilePortChangeForSeparatedIdentityServersStep.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AngularEnvironmentFilePortChangeForSeparatedAuthServersStep.cs similarity index 93% rename from framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AngularEnvironmentFilePortChangeForSeparatedIdentityServersStep.cs rename to framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AngularEnvironmentFilePortChangeForSeparatedAuthServersStep.cs index e781accafe..c376397a3d 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AngularEnvironmentFilePortChangeForSeparatedIdentityServersStep.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AngularEnvironmentFilePortChangeForSeparatedAuthServersStep.cs @@ -4,7 +4,7 @@ using Volo.Abp.Cli.ProjectBuilding.Building; namespace Volo.Abp.Cli.ProjectBuilding.Templates.App; -public class AngularEnvironmentFilePortChangeForSeparatedIdentityServersStep : ProjectBuildPipelineStep +public class AngularEnvironmentFilePortChangeForSeparatedAuthServersStep : ProjectBuildPipelineStep { public override void Execute(ProjectBuildContext context) { diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplateBase.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplateBase.cs index 0e268d6705..45a3a228d3 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplateBase.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplateBase.cs @@ -283,7 +283,7 @@ public abstract class AppTemplateBase : TemplateInfo context.BuildArgs.ExtraProperties.ContainsKey("separate-auth-server")) { steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.HttpApi.HostWithIds")); - steps.Add(new BlazorAppsettingsFilePortChangeForSeparatedIdentityServersStep()); + steps.Add(new BlazorAppsettingsFilePortChangeForSeparatedAuthServersStep()); steps.Add(new AppTemplateChangeDbMigratorPortSettingsStep("44300")); } else @@ -368,12 +368,12 @@ public abstract class AppTemplateBase : TemplateInfo context.BuildArgs.ExtraProperties.ContainsKey("separate-auth-server")) { steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.HttpApi.HostWithIds")); - steps.Add(new AngularEnvironmentFilePortChangeForSeparatedIdentityServersStep()); + steps.Add(new AngularEnvironmentFilePortChangeForSeparatedAuthServersStep()); steps.Add(new AppTemplateChangeDbMigratorPortSettingsStep("44300")); if (context.BuildArgs.MobileApp == MobileApp.ReactNative) { - steps.Add(new ReactEnvironmentFilePortChangeForSeparatedIdentityServersStep()); + steps.Add(new ReactEnvironmentFilePortChangeForSeparatedAuthServersStep()); } } else diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplateChangeConsoleTestClientPortSettingsStep.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplateChangeConsoleTestClientPortSettingsStep.cs index 4eb9867117..b37736696f 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplateChangeConsoleTestClientPortSettingsStep.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplateChangeConsoleTestClientPortSettingsStep.cs @@ -6,16 +6,16 @@ namespace Volo.Abp.Cli.ProjectBuilding.Templates.App; public class AppTemplateChangeConsoleTestClientPortSettingsStep : ProjectBuildPipelineStep { public string RemoteServicePort { get; } - public string IdentityServerPort { get; } + public string AuthServerPort { get; } /// - /// Assumed same as the if leaved as null. + /// Assumed same as the if leaved as null. public AppTemplateChangeConsoleTestClientPortSettingsStep( string remoteServicePort, - string identityServerPort = null) + string authServerPort = null) { RemoteServicePort = remoteServicePort; - IdentityServerPort = identityServerPort ?? remoteServicePort; + AuthServerPort = authServerPort ?? remoteServicePort; } public override void Execute(ProjectBuildContext context) @@ -23,6 +23,6 @@ public class AppTemplateChangeConsoleTestClientPortSettingsStep : ProjectBuildPi context .GetFile("/aspnet-core/test/MyCompanyName.MyProjectName.HttpApi.Client.ConsoleTestApp/appsettings.json") .ReplaceText("44300", RemoteServicePort) - .ReplaceText("44301", IdentityServerPort); + .ReplaceText("44301", AuthServerPort); } } diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplateChangeDbMigratorPortSettingsStep.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplateChangeDbMigratorPortSettingsStep.cs index d8665c0d6d..81c4ad3304 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplateChangeDbMigratorPortSettingsStep.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplateChangeDbMigratorPortSettingsStep.cs @@ -5,19 +5,19 @@ namespace Volo.Abp.Cli.ProjectBuilding.Templates.App; public class AppTemplateChangeDbMigratorPortSettingsStep : ProjectBuildPipelineStep { - public string IdentityServerPort { get; } + public string AuthServerPort { get; } - /// + /// public AppTemplateChangeDbMigratorPortSettingsStep( - string identityServerPort) + string authServerPort) { - IdentityServerPort = identityServerPort; + AuthServerPort = authServerPort; } public override void Execute(ProjectBuildContext context) { context .GetFile("/aspnet-core/src/MyCompanyName.MyProjectName.DbMigrator/appsettings.json") - .ReplaceText("44305", IdentityServerPort); + .ReplaceText("44305", AuthServerPort); } } diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplateSwitchEntityFrameworkCoreToMongoDbStep.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplateSwitchEntityFrameworkCoreToMongoDbStep.cs index 58e4e62225..0eadd103e7 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplateSwitchEntityFrameworkCoreToMongoDbStep.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplateSwitchEntityFrameworkCoreToMongoDbStep.cs @@ -55,6 +55,15 @@ public class AppTemplateSwitchEntityFrameworkCoreToMongoDbStep : ProjectBuildPip "MyProjectNameMongoDbModule" ); + ChangeNamespaceAndKeyword( + context, + "/aspnet-core/src/MyCompanyName.MyProjectName.AuthServer/MyProjectNameAuthServerModule.cs", + "MyCompanyName.MyProjectName.EntityFrameworkCore", + "MyCompanyName.MyProjectName.MongoDB", + _hasDbMigrations ? "MyProjectNameEntityFrameworkCoreDbMigrationsModule" : "MyProjectNameEntityFrameworkCoreModule", + "MyProjectNameMongoDbModule" + ); + ChangeConnectionStringToMongoDb( context, "/aspnet-core/src/MyCompanyName.MyProjectName.AuthServer/appsettings.json" diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/BlazorAppsettingsFilePortChangeForSeparatedIdentityServersStep.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/BlazorAppsettingsFilePortChangeForSeparatedAuthServersStep.cs similarity index 92% rename from framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/BlazorAppsettingsFilePortChangeForSeparatedIdentityServersStep.cs rename to framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/BlazorAppsettingsFilePortChangeForSeparatedAuthServersStep.cs index 0a89d41a45..8c96082a60 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/BlazorAppsettingsFilePortChangeForSeparatedIdentityServersStep.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/BlazorAppsettingsFilePortChangeForSeparatedAuthServersStep.cs @@ -4,7 +4,7 @@ using Volo.Abp.Cli.ProjectBuilding.Building; namespace Volo.Abp.Cli.ProjectBuilding.Templates.App; -public class BlazorAppsettingsFilePortChangeForSeparatedIdentityServersStep : ProjectBuildPipelineStep +public class BlazorAppsettingsFilePortChangeForSeparatedAuthServersStep : ProjectBuildPipelineStep { public override void Execute(ProjectBuildContext context) { diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/ReactEnvironmentFilePortChangeForSeparatedIdentityServersStep.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/ReactEnvironmentFilePortChangeForSeparatedAuthServersStep.cs similarity index 91% rename from framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/ReactEnvironmentFilePortChangeForSeparatedIdentityServersStep.cs rename to framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/ReactEnvironmentFilePortChangeForSeparatedAuthServersStep.cs index d0ffe98e34..0750587401 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/ReactEnvironmentFilePortChangeForSeparatedIdentityServersStep.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/ReactEnvironmentFilePortChangeForSeparatedAuthServersStep.cs @@ -4,7 +4,7 @@ using Volo.Abp.Cli.ProjectBuilding.Building; namespace Volo.Abp.Cli.ProjectBuilding.Templates.App; -public class ReactEnvironmentFilePortChangeForSeparatedIdentityServersStep : ProjectBuildPipelineStep +public class ReactEnvironmentFilePortChangeForSeparatedAuthServersStep : ProjectBuildPipelineStep { public override void Execute(ProjectBuildContext context) { diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/RemoveUnnecessaryPortsStep.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/RemoveUnnecessaryPortsStep.cs index e34f41a7a5..e3bc11a7c9 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/RemoveUnnecessaryPortsStep.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/RemoveUnnecessaryPortsStep.cs @@ -58,8 +58,8 @@ public class RemoveUnnecessaryPortsStep : ProjectBuildPipelineStep f.Name.Contains("MyCompanyName.MyProjectName.DbMigrator") && f.Name.EndsWith("appsettings.json")); var appSettingsJsonObject = JObject.Parse(dbMigratorAppSettings.Content); - var identityServerJsonObject = (JObject)appSettingsJsonObject["IdentityServer"]; - var clientsJsonObject = (JObject)identityServerJsonObject["Clients"]; + var authServerJsonObject = (JObject)appSettingsJsonObject["IdentityServer"] ?? (JObject)appSettingsJsonObject["OpenIddict"]; + var clientsJsonObject = (JObject)authServerJsonObject["Clients"] ?? (JObject)authServerJsonObject["Applications"]; if (context.BuildArgs.UiFramework != UiFramework.Blazor) { diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/NuGetPackageTarget.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/NuGetPackageTarget.cs index 4d111cbf73..c9b2473bcb 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/NuGetPackageTarget.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/NuGetPackageTarget.cs @@ -14,7 +14,7 @@ public enum NuGetPackageTarget : byte MongoDB = 9, SignalR = 10, Blazor = 11, - IdentityServer = 12, + IdentityServer = 12, //todo: Rename to AuthServer BlazorServer = 13, BlazorWebAssembly = 14 } diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/ProjectFinder.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/ProjectFinder.cs index f4adfd4cf0..fbd8cdb599 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/ProjectFinder.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/ProjectFinder.cs @@ -23,7 +23,8 @@ public static class ProjectFinder case NuGetPackageTarget.Web: return FindProjectEndsWith(projectFiles, assemblyNames, ".Web"); case NuGetPackageTarget.IdentityServer: - return FindProjectEndsWith(projectFiles, assemblyNames, ".IdentityServer"); + return FindProjectEndsWith(projectFiles, assemblyNames, ".IdentityServer") ?? + FindProjectEndsWith(projectFiles, assemblyNames, ".AuthServer"); case NuGetPackageTarget.EntityFrameworkCore: return FindProjectEndsWith(projectFiles, assemblyNames, ".EntityFrameworkCore"); case NuGetPackageTarget.MongoDB: diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/ProjectNugetPackageAdder.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/ProjectNugetPackageAdder.cs index 4ca0e646e8..165c915c3a 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/ProjectNugetPackageAdder.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/ProjectNugetPackageAdder.cs @@ -396,6 +396,6 @@ public class ProjectNugetPackageAdder : ITransientDependency return projectFiles.Select(ProjectFileNameHelper.GetAssemblyNameFromProjectPath) .Any(p => p.EndsWith(".HttpApi.Host")) && projectFiles.Select(ProjectFileNameHelper.GetAssemblyNameFromProjectPath) - .Any(p => p.EndsWith(".IdentityServer")); + .Any(p => p.EndsWith(".IdentityServer") || p.EndsWith(".AuthServer")); } } diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/SolutionModuleAdder.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/SolutionModuleAdder.cs index 2bfcad2d32..8aa17596a2 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/SolutionModuleAdder.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/SolutionModuleAdder.cs @@ -804,6 +804,6 @@ public class SolutionModuleAdder : ITransientDependency return projectFiles.Select(ProjectFileNameHelper.GetAssemblyNameFromProjectPath) .Any(p => p.EndsWith(".HttpApi.Host")) && projectFiles.Select(ProjectFileNameHelper.GetAssemblyNameFromProjectPath) - .Any(p => p.EndsWith(".IdentityServer")); + .Any(p => p.EndsWith(".IdentityServer") || p.EndsWith(".AuthServer")); } } From 567bf782950537efea8bdcd6184820cc5d7930d7 Mon Sep 17 00:00:00 2001 From: maliming Date: Fri, 27 May 2022 13:21:05 +0800 Subject: [PATCH 26/59] add ` --depth 0` paramter for `npm list` command. --- .../Volo.Abp.Cli.Core/Volo/Abp/Cli/LIbs/InstallLibsService.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/LIbs/InstallLibsService.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/LIbs/InstallLibsService.cs index 3984f0ca08..56fa776904 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/LIbs/InstallLibsService.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/LIbs/InstallLibsService.cs @@ -253,7 +253,7 @@ public class InstallLibsService : IInstallLibsService, ITransientDependency private bool IsYarnAvailable() { - var output = CmdHelper.RunCmdAndGetOutput("npm list yarn -g").Trim(); + var output = CmdHelper.RunCmdAndGetOutput("npm list yarn -g --depth 0").Trim(); if (output.Contains("empty")) { return false; From 81a37772da078d8ce564dbcd13e4624bbf93b942 Mon Sep 17 00:00:00 2001 From: Roc Date: Sat, 28 May 2022 15:36:08 +0800 Subject: [PATCH 27/59] Update Default.cshtml --- .../ProfileManagementGroup/PersonalInfo/Default.cshtml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/account/src/Volo.Abp.Account.Web/Pages/Account/Components/ProfileManagementGroup/PersonalInfo/Default.cshtml b/modules/account/src/Volo.Abp.Account.Web/Pages/Account/Components/ProfileManagementGroup/PersonalInfo/Default.cshtml index ec65f49834..ba695a8557 100644 --- a/modules/account/src/Volo.Abp.Account.Web/Pages/Account/Components/ProfileManagementGroup/PersonalInfo/Default.cshtml +++ b/modules/account/src/Volo.Abp.Account.Web/Pages/Account/Components/ProfileManagementGroup/PersonalInfo/Default.cshtml @@ -20,7 +20,7 @@

    @L["PersonalSettings"]


    - + From 4c209471968934b183cbdb98e6232cb1ccfd321a Mon Sep 17 00:00:00 2001 From: maliming Date: Sat, 28 May 2022 17:22:57 +0800 Subject: [PATCH 28/59] Add `UseAbpOpenIddictValidation` and `DisableAccessTokenEncryption` by default. --- .../app/OpenIddict.Demo.API/Program.cs | 4 -- .../Pages/Index.cshtml | 31 +++++++++++-- .../Controllers/ClaimsController.cs | 16 +++++++ .../OpenIddictServerModule.cs | 45 ++++++++++--------- .../app/OpenIddict.Demo.Server/Program.cs | 15 +------ ...uilderAbpOpenIddictMiddlewareExtension.cs} | 10 ++--- .../AbpOpenIddictAspNetCoreModule.cs | 2 + .../MyProjectNameModule.cs | 21 +-------- .../appsettings.json | 4 -- .../MyProjectNameModule.cs | 21 +-------- .../appsettings.json | 4 -- .../MyProjectNameModule.cs | 21 +-------- .../appsettings.json | 5 --- .../MyProjectNameModule.cs | 21 +-------- .../appsettings.json | 5 --- .../MyProjectNameModule.cs | 21 +-------- .../appsettings.json | 4 -- .../MyProjectNameModule.cs | 21 +-------- .../appsettings.json | 4 -- .../MyProjectNameAuthServerModule.cs | 7 --- .../MyProjectNameBlazorModule.cs | 22 +-------- .../MyProjectNameHttpApiHostModule.cs | 27 +---------- .../MyProjectNameAuthServerModule.cs | 10 +---- .../appsettings.json | 5 --- 24 files changed, 84 insertions(+), 262 deletions(-) create mode 100644 modules/openiddict/app/OpenIddict.Demo.Server/Controllers/ClaimsController.cs rename modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/{Volo/Abp/OpenIddict/Jwt/JwtTokenMiddleware.cs => Microsoft/AspNetCore/Builder/ApplicationBuilderAbpOpenIddictMiddlewareExtension.cs} (58%) diff --git a/modules/openiddict/app/OpenIddict.Demo.API/Program.cs b/modules/openiddict/app/OpenIddict.Demo.API/Program.cs index 6218c5b9f7..9fe034cecf 100644 --- a/modules/openiddict/app/OpenIddict.Demo.API/Program.cs +++ b/modules/openiddict/app/OpenIddict.Demo.API/Program.cs @@ -18,10 +18,6 @@ builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) { options.Authority = "https://localhost:44301"; options.Audience = "AbpAPIResource"; - - // See OpenIddictServerModule`s PreConfigureServices method. - options.TokenValidationParameters.IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("Abp_OpenIddict_Demo_C40DBB176E78")); - options.TokenValidationParameters.TokenDecryptionKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("Abp_OpenIddict_Demo_87E33FC57D80")); }); var app = builder.Build(); diff --git a/modules/openiddict/app/OpenIddict.Demo.Client.Mvc/Pages/Index.cshtml b/modules/openiddict/app/OpenIddict.Demo.Client.Mvc/Pages/Index.cshtml index 1d2feb2a8d..d2f8710862 100644 --- a/modules/openiddict/app/OpenIddict.Demo.Client.Mvc/Pages/Index.cshtml +++ b/modules/openiddict/app/OpenIddict.Demo.Client.Mvc/Pages/Index.cshtml @@ -30,14 +30,37 @@ request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", await HttpContext.GetTokenAsync("access_token")); var response = await client.SendAsync(request); - response.EnsureSuccessStatusCode(); + + + + @{ + var apiResponse = response.StatusCode.ToString(); + if (response.IsSuccessStatusCode) + { + apiResponse = JsonSerializer.Serialize(JsonDocument.Parse(await response.Content.ReadAsStringAsync()), new JsonSerializerOptions + { + WriteIndented = true + }); + } + } + @apiResponse; + + + request = new HttpRequestMessage(HttpMethod.Get, "https://localhost:44301/api/claims"); + request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", await HttpContext.GetTokenAsync("access_token")); + + response = await client.SendAsync(request); @{ - var apiResponse = JsonSerializer.Serialize(JsonDocument.Parse(await response.Content.ReadAsStringAsync()), new JsonSerializerOptions + apiResponse = response.StatusCode.ToString(); + if (response.IsSuccessStatusCode) { - WriteIndented = true - }); + apiResponse = JsonSerializer.Serialize(JsonDocument.Parse(await response.Content.ReadAsStringAsync()), new JsonSerializerOptions + { + WriteIndented = true + }); + } } @apiResponse; diff --git a/modules/openiddict/app/OpenIddict.Demo.Server/Controllers/ClaimsController.cs b/modules/openiddict/app/OpenIddict.Demo.Server/Controllers/ClaimsController.cs new file mode 100644 index 0000000000..49597709b9 --- /dev/null +++ b/modules/openiddict/app/OpenIddict.Demo.Server/Controllers/ClaimsController.cs @@ -0,0 +1,16 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace OpenIddict.Demo.Server.Controllers; + +[ApiController] +[Authorize] +[Route("api/claims")] +public class ClaimsController : Controller +{ + [HttpGet] + public JsonResult Get() + { + return Json(User.Claims.Select(x => new {Type = x.Type, Value = x.Value})); + } +} diff --git a/modules/openiddict/app/OpenIddict.Demo.Server/OpenIddictServerModule.cs b/modules/openiddict/app/OpenIddict.Demo.Server/OpenIddictServerModule.cs index 616b3ef0c7..a2509f8576 100644 --- a/modules/openiddict/app/OpenIddict.Demo.Server/OpenIddictServerModule.cs +++ b/modules/openiddict/app/OpenIddict.Demo.Server/OpenIddictServerModule.cs @@ -1,10 +1,7 @@ -using System.Text; +using System.Security.Cryptography; +using System.Security.Cryptography.X509Certificates; using Microsoft.EntityFrameworkCore; -using Microsoft.IdentityModel.Tokens; -using OpenIddict.Abstractions; using OpenIddict.Demo.Server.EntityFrameworkCore; -using OpenIddict.Server.AspNetCore; -using OpenIddict.Validation.AspNetCore; using Volo.Abp; using Volo.Abp.Account; using Volo.Abp.Account.Web; @@ -81,12 +78,32 @@ public class OpenIddictServerModule : AbpModule { public override void PreConfigureServices(ServiceConfigurationContext context) { + PreConfigure(options => + { + //https://documentation.openiddict.com/configuration/encryption-and-signing-credentials.html + options.AddDevelopmentEncryptionAndSigningCertificate = false; + }); + PreConfigure(builder => { - //https://documentation.openiddict.com/configuration/token-formats.html#disabling-jwt-access-token-encryption //https://documentation.openiddict.com/configuration/encryption-and-signing-credentials.html - builder.AddSigningKey(new SymmetricSecurityKey(Encoding.UTF8.GetBytes("Abp_OpenIddict_Demo_C40DBB176E78"))); - builder.AddEncryptionKey(new SymmetricSecurityKey(Encoding.UTF8.GetBytes("Abp_OpenIddict_Demo_87E33FC57D80"))); + using (var algorithm = RSA.Create(keySizeInBits: 2048)) + { + var subject = new X500DistinguishedName("CN=Fabrikam Encryption Certificate"); + var request = new CertificateRequest(subject, algorithm, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1); + request.CertificateExtensions.Add(new X509KeyUsageExtension(X509KeyUsageFlags.DigitalSignature, critical: true)); + var certificate = request.CreateSelfSigned(DateTimeOffset.UtcNow, DateTimeOffset.UtcNow.AddYears(2)); + builder.AddSigningCertificate(certificate); + } + + using (var algorithm = RSA.Create(keySizeInBits: 2048)) + { + var subject = new X500DistinguishedName("CN=Fabrikam Signing Certificate"); + var request = new CertificateRequest(subject, algorithm, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1); + request.CertificateExtensions.Add(new X509KeyUsageExtension(X509KeyUsageFlags.KeyEncipherment, critical: true)); + var certificate = request.CreateSelfSigned(DateTimeOffset.UtcNow, DateTimeOffset.UtcNow.AddYears(2)); + builder.AddEncryptionCertificate(certificate); + } }); PreConfigure(options => @@ -110,18 +127,6 @@ public class OpenIddictServerModule : AbpModule public override void ConfigureServices(ServiceConfigurationContext context) { - context.Services.ConfigureApplicationCookie(options => - { - options.ForwardDefaultSelector = ctx => ctx.Request.Path.StartsWithSegments("/api") - ? OpenIddictValidationAspNetCoreDefaults.AuthenticationScheme - : null; - }); - - Configure(options => - { - options.AddDevelopmentEncryptionAndSigningCertificate = false; - }); - context.Services.AddAbpDbContext(options => { options.AddDefaultRepositories(includeAllEntities: true); diff --git a/modules/openiddict/app/OpenIddict.Demo.Server/Program.cs b/modules/openiddict/app/OpenIddict.Demo.Server/Program.cs index 3bfc26a9a3..bee5baa950 100644 --- a/modules/openiddict/app/OpenIddict.Demo.Server/Program.cs +++ b/modules/openiddict/app/OpenIddict.Demo.Server/Program.cs @@ -27,20 +27,6 @@ builder.Services.Configure(options => options.Languages.Add(new LanguageInfo("zh-Hant", "zh-Hant", "繁體中文")); }); -// Use Microsoft.AspNetCore.Authentication.JwtBearer instead of OpenIddict.Validation.AspNetCore -// builder.Services.AddAuthentication() -// .AddJwtBearer(options => -// { -// options.Authority = "https://localhost:44301"; -// options.Audience = "AbpAPIResource"; -// -// options.MapInboundClaims = false; -// -// // See OpenIddictServerModule`s PreConfigureServices method. -// options.TokenValidationParameters.IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("Abp_OpenIddict_Demo_C40DBB176E78")); -// options.TokenValidationParameters.TokenDecryptionKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("Abp_OpenIddict_Demo_87E33FC57D80")); -// }); - await builder.AddApplicationAsync(); var app = builder.Build(); @@ -70,6 +56,7 @@ app.UseCors(); //app.UseJwtTokenMiddleware(); app.UseAuthentication(); +app.UseAbpOpenIddictValidation(); app.UseMultiTenancy(); app.UseAuthorization(); diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/Jwt/JwtTokenMiddleware.cs b/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Microsoft/AspNetCore/Builder/ApplicationBuilderAbpOpenIddictMiddlewareExtension.cs similarity index 58% rename from modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/Jwt/JwtTokenMiddleware.cs rename to modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Microsoft/AspNetCore/Builder/ApplicationBuilderAbpOpenIddictMiddlewareExtension.cs index f0f2efb33e..7d8be5570b 100644 --- a/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/Jwt/JwtTokenMiddleware.cs +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Microsoft/AspNetCore/Builder/ApplicationBuilderAbpOpenIddictMiddlewareExtension.cs @@ -1,13 +1,11 @@ using Microsoft.AspNetCore.Authentication; -using Microsoft.AspNetCore.Builder; +using OpenIddict.Validation.AspNetCore; -namespace Volo.Abp.OpenIddict.Jwt; +namespace Microsoft.AspNetCore.Builder; -//TODO: Should we move this to another package..? - -public static class JwtTokenMiddleware +public static class ApplicationBuilderAbpOpenIddictMiddlewareExtension { - public static IApplicationBuilder UseJwtTokenMiddleware(this IApplicationBuilder app, string schema = "Bearer") + public static IApplicationBuilder UseAbpOpenIddictValidation(this IApplicationBuilder app, string schema = OpenIddictValidationAspNetCoreDefaults.AuthenticationScheme) { return app.Use(async (ctx, next) => { diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/AbpOpenIddictAspNetCoreModule.cs b/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/AbpOpenIddictAspNetCoreModule.cs index 8e103f92fa..e8196627ce 100644 --- a/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/AbpOpenIddictAspNetCoreModule.cs +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/AbpOpenIddictAspNetCoreModule.cs @@ -104,6 +104,8 @@ public class AbpOpenIddictAspNetCoreModule : AbpModule .AddDevelopmentSigningCertificate(); } + builder.DisableAccessTokenEncryption(); + var wildcardDomainsOptions = services.ExecutePreConfiguredActions(); if (wildcardDomainsOptions.EnableWildcardDomainSupport) { diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/MyProjectNameModule.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/MyProjectNameModule.cs index c987e5dff6..00e29aff65 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/MyProjectNameModule.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/MyProjectNameModule.cs @@ -117,13 +117,6 @@ public class MyProjectNameModule : AbpModule ); }); - PreConfigure(builder => - { - // https://documentation.openiddict.com/configuration/token-formats.html#disabling-jwt-access-token-encryption - // In production, it is recommended to use two RSA certificates, distinct from the certificate(s) used for HTTPS: one for encryption, one for signing. - builder.DisableAccessTokenEncryption(); - }); - PreConfigure(builder => { builder.AddValidation(options => @@ -150,7 +143,6 @@ public class MyProjectNameModule : AbpModule ConfigureAutoApiControllers(); ConfigureBlazorise(context); ConfigureRouter(context); - ConfigureAuthentication(context, configuration); ConfigureMongoDB(context); } @@ -189,17 +181,6 @@ public class MyProjectNameModule : AbpModule }); } - private void ConfigureAuthentication(ServiceConfigurationContext context, IConfiguration configuration) - { - context.Services.AddAuthentication() - .AddJwtBearer(options => - { - options.Authority = configuration["AuthServer:Authority"]; - options.RequireHttpsMetadata = Convert.ToBoolean(configuration["AuthServer:RequireHttpsMetadata"]); - options.Audience = "MyProjectName"; - }); - } - private void ConfigureLocalizationServices() { Configure(options => @@ -338,7 +319,7 @@ public class MyProjectNameModule : AbpModule app.UseStaticFiles(); app.UseRouting(); app.UseAuthentication(); - app.UseJwtTokenMiddleware(); + app.UseAbpOpenIddictValidation(); if (IsMultiTenant) { diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/appsettings.json b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/appsettings.json index e08d35f224..7872199c7e 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/appsettings.json +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/appsettings.json @@ -6,10 +6,6 @@ "ConnectionStrings": { "Default": "mongodb://localhost:27017/MyProjectName", }, - "AuthServer": { - "Authority": "https://localhost:44300", - "RequireHttpsMetadata": "false" - }, "StringEncryption": { "DefaultPassPhrase": "gsKnGZ041HLL4IM8" } diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/MyProjectNameModule.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/MyProjectNameModule.cs index b9c8dca8f0..5be2bdc2e5 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/MyProjectNameModule.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/MyProjectNameModule.cs @@ -118,13 +118,6 @@ public class MyProjectNameModule : AbpModule ); }); - PreConfigure(builder => - { - // https://documentation.openiddict.com/configuration/token-formats.html#disabling-jwt-access-token-encryption - // In production, it is recommended to use two RSA certificates, distinct from the certificate(s) used for HTTPS: one for encryption, one for signing. - builder.DisableAccessTokenEncryption(); - }); - PreConfigure(builder => { builder.AddValidation(options => @@ -151,7 +144,6 @@ public class MyProjectNameModule : AbpModule ConfigureAutoApiControllers(); ConfigureBlazorise(context); ConfigureRouter(context); - ConfigureAuthentication(context, configuration); ConfigureEfCore(context); } @@ -190,17 +182,6 @@ public class MyProjectNameModule : AbpModule }); } - private void ConfigureAuthentication(ServiceConfigurationContext context, IConfiguration configuration) - { - context.Services.AddAuthentication() - .AddJwtBearer(options => - { - options.Authority = configuration["AuthServer:Authority"]; - options.RequireHttpsMetadata = Convert.ToBoolean(configuration["AuthServer:RequireHttpsMetadata"]); - options.Audience = "MyProjectName"; - }); - } - private void ConfigureLocalizationServices() { Configure(options => @@ -346,7 +327,7 @@ public class MyProjectNameModule : AbpModule app.UseStaticFiles(); app.UseRouting(); app.UseAuthentication(); - app.UseJwtTokenMiddleware(); + app.UseAbpOpenIddictValidation(); if (IsMultiTenant) { diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/appsettings.json b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/appsettings.json index cc9e8226f2..250ecde40e 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/appsettings.json +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/appsettings.json @@ -6,10 +6,6 @@ "ConnectionStrings": { "Default": "Server=(LocalDb)\\MSSQLLocalDB;Database=MyProjectName;Trusted_Connection=True" }, - "AuthServer": { - "Authority": "https://localhost:44300", - "RequireHttpsMetadata": "false" - }, "StringEncryption": { "DefaultPassPhrase": "gsKnGZ041HLL4IM8" } diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/MyProjectNameModule.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/MyProjectNameModule.cs index 6a9474af7b..609432b523 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/MyProjectNameModule.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/MyProjectNameModule.cs @@ -108,13 +108,6 @@ public class MyProjectNameModule : AbpModule ); }); - PreConfigure(builder => - { - // https://documentation.openiddict.com/configuration/token-formats.html#disabling-jwt-access-token-encryption - // In production, it is recommended to use two RSA certificates, distinct from the certificate(s) used for HTTPS: one for encryption, one for signing. - builder.DisableAccessTokenEncryption(); - }); - PreConfigure(builder => { builder.AddValidation(options => @@ -139,7 +132,6 @@ public class MyProjectNameModule : AbpModule ConfigureAutoApiControllers(); ConfigureVirtualFiles(hostingEnvironment); ConfigureLocalization(); - ConfigureAuthentication(context.Services, configuration); ConfigureCors(context, configuration); ConfigureDataProtection(context, configuration, hostingEnvironment); ConfigureMongoDB(context); @@ -176,17 +168,6 @@ public class MyProjectNameModule : AbpModule }); } - private void ConfigureAuthentication(IServiceCollection services, IConfiguration configuration) - { - services.AddAuthentication() - .AddJwtBearer(options => - { - options.Authority = configuration["AuthServer:Authority"]; - options.RequireHttpsMetadata = Convert.ToBoolean(configuration["AuthServer:RequireHttpsMetadata"]); - options.Audience = "MyProjectName"; - }); - } - private void ConfigureLocalization() { Configure(options => @@ -341,7 +322,7 @@ public class MyProjectNameModule : AbpModule app.UseRouting(); app.UseCors(); app.UseAuthentication(); - app.UseJwtTokenMiddleware(); + app.UseAbpOpenIddictValidation(); if (IsMultiTenant) { diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/appsettings.json b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/appsettings.json index a63bc0eeb8..284615a19b 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/appsettings.json +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/appsettings.json @@ -11,11 +11,6 @@ "Redis": { "Configuration": "127.0.0.1" }, - "AuthServer": { - "Authority": "https://localhost:44300", - "RequireHttpsMetadata": "false", - "SwaggerClientId": "MyProjectName_Swagger" - }, "StringEncryption": { "DefaultPassPhrase": "gsKnGZ041HLL4IM8" }, diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/MyProjectNameModule.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/MyProjectNameModule.cs index bc3a0eea8e..59b337a7c0 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/MyProjectNameModule.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/MyProjectNameModule.cs @@ -110,13 +110,6 @@ public class MyProjectNameModule : AbpModule ); }); - PreConfigure(builder => - { - // https://documentation.openiddict.com/configuration/token-formats.html#disabling-jwt-access-token-encryption - // In production, it is recommended to use two RSA certificates, distinct from the certificate(s) used for HTTPS: one for encryption, one for signing. - builder.DisableAccessTokenEncryption(); - }); - PreConfigure(builder => { builder.AddValidation(options => @@ -141,7 +134,6 @@ public class MyProjectNameModule : AbpModule ConfigureAutoApiControllers(); ConfigureVirtualFiles(hostingEnvironment); ConfigureLocalization(); - ConfigureAuthentication(context.Services, configuration); ConfigureCors(context, configuration); ConfigureDataProtection(context, configuration, hostingEnvironment); ConfigureEfCore(context); @@ -178,17 +170,6 @@ public class MyProjectNameModule : AbpModule }); } - private void ConfigureAuthentication(IServiceCollection services, IConfiguration configuration) - { - services.AddAuthentication() - .AddJwtBearer(options => - { - options.Authority = configuration["AuthServer:Authority"]; - options.RequireHttpsMetadata = Convert.ToBoolean(configuration["AuthServer:RequireHttpsMetadata"]); - options.Audience = "MyProjectName"; - }); - } - private void ConfigureLocalization() { Configure(options => @@ -350,7 +331,7 @@ public class MyProjectNameModule : AbpModule app.UseRouting(); app.UseCors(); app.UseAuthentication(); - app.UseJwtTokenMiddleware(); + app.UseAbpOpenIddictValidation(); if (IsMultiTenant) { diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/appsettings.json b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/appsettings.json index 6c9d002cc6..251acbe2ac 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/appsettings.json +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/appsettings.json @@ -11,11 +11,6 @@ "Redis": { "Configuration": "127.0.0.1" }, - "AuthServer": { - "Authority": "https://localhost:44300", - "RequireHttpsMetadata": "false", - "SwaggerClientId": "MyProjectName_Swagger" - }, "StringEncryption": { "DefaultPassPhrase": "gsKnGZ041HLL4IM8" }, diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc.Mongo/MyProjectNameModule.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc.Mongo/MyProjectNameModule.cs index 7a0d97014a..10cef836ae 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc.Mongo/MyProjectNameModule.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc.Mongo/MyProjectNameModule.cs @@ -110,13 +110,6 @@ public class MyProjectNameModule : AbpModule ); }); - PreConfigure(builder => - { - // https://documentation.openiddict.com/configuration/token-formats.html#disabling-jwt-access-token-encryption - // In production, it is recommended to use two RSA certificates, distinct from the certificate(s) used for HTTPS: one for encryption, one for signing. - builder.DisableAccessTokenEncryption(); - }); - PreConfigure(builder => { builder.AddValidation(options => @@ -142,7 +135,6 @@ public class MyProjectNameModule : AbpModule ConfigureAutoApiControllers(); ConfigureVirtualFiles(hostingEnvironment); ConfigureLocalization(); - ConfigureAuthentication(context.Services, configuration); ConfigureMongoDB(context); } @@ -176,17 +168,6 @@ public class MyProjectNameModule : AbpModule }); } - private void ConfigureAuthentication(IServiceCollection services, IConfiguration configuration) - { - services.AddAuthentication() - .AddJwtBearer(options => - { - options.Authority = configuration["AuthServer:Authority"]; - options.RequireHttpsMetadata = Convert.ToBoolean(configuration["AuthServer:RequireHttpsMetadata"]); - options.Audience = "MyProjectName"; - }); - } - private void ConfigureLocalization() { Configure(options => @@ -314,7 +295,7 @@ public class MyProjectNameModule : AbpModule app.UseStaticFiles(); app.UseRouting(); app.UseAuthentication(); - app.UseJwtTokenMiddleware(); + app.UseAbpOpenIddictValidation(); if (IsMultiTenant) { diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc.Mongo/appsettings.json b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc.Mongo/appsettings.json index 97ad461966..f64cfd6c90 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc.Mongo/appsettings.json +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc.Mongo/appsettings.json @@ -5,10 +5,6 @@ "ConnectionStrings": { "Default": "mongodb://localhost:27017/MyProjectName" }, - "AuthServer": { - "Authority": "https://localhost:44300", - "RequireHttpsMetadata": "false" - }, "StringEncryption": { "DefaultPassPhrase": "gsKnGZ041HLL4IM8" } diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/MyProjectNameModule.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/MyProjectNameModule.cs index 7f7a7a4da9..20a52729ed 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/MyProjectNameModule.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/MyProjectNameModule.cs @@ -112,13 +112,6 @@ public class MyProjectNameModule : AbpModule ); }); - PreConfigure(builder => - { - // https://documentation.openiddict.com/configuration/token-formats.html#disabling-jwt-access-token-encryption - // In production, it is recommended to use two RSA certificates, distinct from the certificate(s) used for HTTPS: one for encryption, one for signing. - builder.DisableAccessTokenEncryption(); - }); - PreConfigure(builder => { builder.AddValidation(options => @@ -144,7 +137,6 @@ public class MyProjectNameModule : AbpModule ConfigureAutoApiControllers(); ConfigureVirtualFiles(hostingEnvironment); ConfigureLocalization(); - ConfigureAuthentication(context.Services, configuration); ConfigureEfCore(context); } @@ -179,17 +171,6 @@ public class MyProjectNameModule : AbpModule }); } - private void ConfigureAuthentication(IServiceCollection services, IConfiguration configuration) - { - services.AddAuthentication() - .AddJwtBearer(options => - { - options.Authority = configuration["AuthServer:Authority"]; - options.RequireHttpsMetadata = Convert.ToBoolean(configuration["AuthServer:RequireHttpsMetadata"]); - options.Audience = "MyProjectName"; - }); - } - private void ConfigureLocalization() { Configure(options => @@ -323,7 +304,7 @@ public class MyProjectNameModule : AbpModule app.UseStaticFiles(); app.UseRouting(); app.UseAuthentication(); - app.UseJwtTokenMiddleware(); + app.UseAbpOpenIddictValidation(); if (IsMultiTenant) { diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/appsettings.json b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/appsettings.json index 74bc952883..4d95841d08 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/appsettings.json +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/appsettings.json @@ -5,10 +5,6 @@ "ConnectionStrings": { "Default": "Server=(LocalDb)\\MSSQLLocalDB;Database=MyProjectName;Trusted_Connection=True" }, - "AuthServer": { - "Authority": "https://localhost:44300", - "RequireHttpsMetadata": "false" - }, "StringEncryption": { "DefaultPassPhrase": "gsKnGZ041HLL4IM8" } diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.AuthServer/MyProjectNameAuthServerModule.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.AuthServer/MyProjectNameAuthServerModule.cs index 05ea1c90ea..225033259f 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.AuthServer/MyProjectNameAuthServerModule.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.AuthServer/MyProjectNameAuthServerModule.cs @@ -48,13 +48,6 @@ public class MyProjectNameAuthServerModule : AbpModule { public override void PreConfigureServices(ServiceConfigurationContext context) { - PreConfigure(builder => - { - // https://documentation.openiddict.com/configuration/token-formats.html#disabling-jwt-access-token-encryption - // In production, it is recommended to use two RSA certificates, distinct from the certificate(s) used for HTTPS: one for encryption, one for signing. - builder.DisableAccessTokenEncryption(); - }); - PreConfigure(builder => { builder.AddValidation(options => diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/MyProjectNameBlazorModule.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/MyProjectNameBlazorModule.cs index a01ea41953..4610600956 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/MyProjectNameBlazorModule.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/MyProjectNameBlazorModule.cs @@ -1,4 +1,3 @@ -using System; using System.IO; using Blazorise.Bootstrap5; using Blazorise.Icons.FontAwesome; @@ -74,13 +73,6 @@ public class MyProjectNameBlazorModule : AbpModule ); }); - PreConfigure(builder => - { - // https://documentation.openiddict.com/configuration/token-formats.html#disabling-jwt-access-token-encryption - // In production, it is recommended to use two RSA certificates, distinct from the certificate(s) used for HTTPS: one for encryption, one for signing. - builder.DisableAccessTokenEncryption(); - }); - PreConfigure(builder => { builder.AddValidation(options => @@ -99,7 +91,6 @@ public class MyProjectNameBlazorModule : AbpModule ConfigureUrls(configuration); ConfigureBundles(); - ConfigureAuthentication(context, configuration); ConfigureAutoMapper(); ConfigureVirtualFileSystem(hostingEnvironment); ConfigureLocalizationServices(); @@ -145,17 +136,6 @@ public class MyProjectNameBlazorModule : AbpModule }); } - private void ConfigureAuthentication(ServiceConfigurationContext context, IConfiguration configuration) - { - context.Services.AddAuthentication() - .AddJwtBearer(options => - { - options.Authority = configuration["AuthServer:Authority"]; - options.RequireHttpsMetadata = Convert.ToBoolean(configuration["AuthServer:RequireHttpsMetadata"]); - options.Audience = "MyProjectName"; - }); - } - private void ConfigureVirtualFileSystem(IWebHostEnvironment hostingEnvironment) { if (hostingEnvironment.IsDevelopment()) @@ -283,7 +263,7 @@ public class MyProjectNameBlazorModule : AbpModule app.UseStaticFiles(); app.UseRouting(); app.UseAuthentication(); - app.UseJwtTokenMiddleware(); + app.UseAbpOpenIddictValidation(); if (MultiTenancyConsts.IsEnabled) { diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/MyProjectNameHttpApiHostModule.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/MyProjectNameHttpApiHostModule.cs index fc8211ee43..524a7e24bf 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/MyProjectNameHttpApiHostModule.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/MyProjectNameHttpApiHostModule.cs @@ -50,13 +50,6 @@ public class MyProjectNameHttpApiHostModule : AbpModule { public override void PreConfigureServices(ServiceConfigurationContext context) { - PreConfigure(builder => - { - // https://documentation.openiddict.com/configuration/token-formats.html#disabling-jwt-access-token-encryption - // In production, it is recommended to use two RSA certificates, distinct from the certificate(s) used for HTTPS: one for encryption, one for signing. - builder.DisableAccessTokenEncryption(); - }); - PreConfigure(builder => { builder.AddValidation(options => @@ -76,7 +69,6 @@ public class MyProjectNameHttpApiHostModule : AbpModule ConfigureBundles(); ConfigureUrls(configuration); ConfigureConventionalControllers(); - ConfigureAuthentication(context, configuration); ConfigureLocalization(); ConfigureVirtualFileSystem(context); ConfigureCors(context, configuration); @@ -138,23 +130,6 @@ public class MyProjectNameHttpApiHostModule : AbpModule }); } - private void ConfigureAuthentication(ServiceConfigurationContext context, IConfiguration configuration) - { - context.Services.AddAuthentication() - .AddJwtBearer(options => - { - options.Authority = configuration["AuthServer:Authority"]; - options.RequireHttpsMetadata = Convert.ToBoolean(configuration["AuthServer:RequireHttpsMetadata"]); - options.Audience = "MyProjectName"; - options.BackchannelHttpHandler = new HttpClientHandler - { - ServerCertificateCustomValidationCallback = HttpClientHandler.DangerousAcceptAnyServerCertificateValidator - }; - - options.MapInboundClaims = false; - }); - } - private static void ConfigureSwaggerServices(ServiceConfigurationContext context, IConfiguration configuration) { context.Services.AddAbpSwaggerGenWithOAuth( @@ -241,7 +216,7 @@ public class MyProjectNameHttpApiHostModule : AbpModule app.UseRouting(); app.UseCors(); app.UseAuthentication(); - app.UseJwtTokenMiddleware(); + app.UseAbpOpenIddictValidation(); if (MultiTenancyConsts.IsEnabled) { diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/MyProjectNameAuthServerModule.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/MyProjectNameAuthServerModule.cs index 831eb154bd..a3798432a7 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/MyProjectNameAuthServerModule.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/MyProjectNameAuthServerModule.cs @@ -156,14 +156,6 @@ public class MyProjectNameAuthServerModule : AbpModule options.Applications["MVC"].RootUrl = configuration["App:SelfUrl"]; }); - context.Services.AddAuthentication() - .AddJwtBearer(options => - { - options.Authority = configuration["AuthServer:Authority"]; - options.RequireHttpsMetadata = Convert.ToBoolean(configuration["AuthServer:RequireHttpsMetadata"]); - options.Audience = configuration["AuthServer:ApiName"]; - }); - Configure(options => { options.KeyPrefix = "MyProjectName:"; @@ -226,7 +218,7 @@ public class MyProjectNameAuthServerModule : AbpModule app.UseRouting(); app.UseCors(); app.UseAuthentication(); - app.UseJwtTokenMiddleware(); + app.UseAbpOpenIddictValidation(); if (MultiTenancyConsts.IsEnabled) { diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/appsettings.json b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/appsettings.json index 70b1fa6216..47304e7fc6 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/appsettings.json +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/appsettings.json @@ -10,11 +10,6 @@ "Redis": { "Configuration": "127.0.0.1" }, - "AuthServer": { - "Authority": "https://localhost:44301/", - "RequireHttpsMetadata": "false", - "ApiName": "MyProjectName" - }, "OpenIddict": { "Applications": { "MyProjectName_Web": { From f1e6c542574396e255d1f5f056cabd41f6798ac5 Mon Sep 17 00:00:00 2001 From: maliming Date: Sat, 28 May 2022 17:32:31 +0800 Subject: [PATCH 29/59] Update OpenIddict.md --- docs/en/Modules/OpenIddict.md | 36 ++++++++--------------------------- 1 file changed, 8 insertions(+), 28 deletions(-) diff --git a/docs/en/Modules/OpenIddict.md b/docs/en/Modules/OpenIddict.md index 7d7e898eee..ed25147be2 100644 --- a/docs/en/Modules/OpenIddict.md +++ b/docs/en/Modules/OpenIddict.md @@ -150,42 +150,22 @@ https://documentation.openiddict.com https://github.com/openiddict/openiddict-core#resources -### Token encryption +### Disable AccessToken Encryption -https://documentation.openiddict.com/configuration/encryption-and-signing-credentials.html - -> By default, OpenIddict enforces encryption for all the token types it supports. While this enforcement cannot be disabled for authorization codes, refresh tokens and device codes for security reasons, it can be relaxed for access tokens when integration with third-party APIs/resource servers is desired. Access token encryption can also be disabled if the resource servers receiving the access tokens don't fully support JSON Web Encryption. +ABP disables the `access token encryption` by default for compatibility, you can manually enable it if needed. ```cs -PreConfigure(builder => +public override void PreConfigureServices(ServiceConfigurationContext context) { - builder.DisableAccessTokenEncryption(); -}); -``` - -An example of using `SecurityKey` - -> In production, it is recommended to use two RSA certificates, distinct from the certificate(s) used for HTTPS: one for encryption, one for signing. - -```cs -// In OpenIddict Server -PreConfigure(builder => -{ - builder.AddSigningKey(new SymmetricSecurityKey(Encoding.UTF8.GetBytes("Abp_OpenIddict_Demo_C40DBB176E78"))); - builder.AddEncryptionKey(new SymmetricSecurityKey(Encoding.UTF8.GetBytes("Abp_OpenIddict_Demo_87E33FC57D80"))); -}); - -//In Client AddJwtBearer -builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) - .AddJwtBearer(options => + PreConfigure(builder => { - //Other configuration - - options.TokenValidationParameters.IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("Abp_OpenIddict_Demo_C40DBB176E78")); - options.TokenValidationParameters.TokenDecryptionKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("Abp_OpenIddict_Demo_87E33FC57D80")); + builder.Configure(options => options.DisableAccessTokenEncryption = false); }); +} ``` +https://documentation.openiddict.com/configuration/token-formats.html#disabling-jwt-access-token-encryption + ### PKCE From 0fb006d918cbeaaecab91a3804b0fa77b0d73d2b Mon Sep 17 00:00:00 2001 From: maliming Date: Mon, 30 May 2022 14:58:06 +0800 Subject: [PATCH 30/59] Remove `AbpAspNetCoreAuthenticationJwtBearerModule`. --- ...e.MyProjectName.Blazor.Server.Mongo.csproj | 1 - .../MyProjectNameModule.cs | 3 --- ...anyName.MyProjectName.Blazor.Server.csproj | 1 - .../MyProjectNameModule.cs | 2 -- ...ompanyName.MyProjectName.Host.Mongo.csproj | 1 - .../MyProjectNameModule.cs | 2 -- .../MyCompanyName.MyProjectName.Host.csproj | 1 - .../MyProjectNameModule.cs | 2 -- ...CompanyName.MyProjectName.Mvc.Mongo.csproj | 1 - .../MyProjectNameModule.cs | 2 -- .../MyCompanyName.MyProjectName.Mvc.csproj | 1 - .../MyProjectNameModule.cs | 2 -- ...anyName.MyProjectName.Blazor.Server.csproj | 1 - .../MyProjectNameBlazorModule.cs | 2 -- ...e.MyProjectName.HttpApi.HostWithIds.csproj | 1 - .../MyProjectNameHttpApiHostModule.cs | 6 ------ .../MyCompanyName.MyProjectName.Web.csproj | 1 - .../MyProjectNameWebModule.cs | 15 ------------- .../appsettings.json | 4 ---- ...ompanyName.MyProjectName.AuthServer.csproj | 1 - .../MyProjectNameAuthServerModule.cs | 9 -------- ...me.MyProjectName.Blazor.Server.Host.csproj | 1 - .../MyProjectNameBlazorHostModule.cs | 21 +------------------ .../appsettings.json | 4 ---- 24 files changed, 1 insertion(+), 84 deletions(-) diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/MyCompanyName.MyProjectName.Blazor.Server.Mongo.csproj b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/MyCompanyName.MyProjectName.Blazor.Server.Mongo.csproj index dc5971eb3c..0a7e7306cd 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/MyCompanyName.MyProjectName.Blazor.Server.Mongo.csproj +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/MyCompanyName.MyProjectName.Blazor.Server.Mongo.csproj @@ -18,7 +18,6 @@ - diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/MyProjectNameModule.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/MyProjectNameModule.cs index 00e29aff65..952bdc1818 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/MyProjectNameModule.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/MyProjectNameModule.cs @@ -7,7 +7,6 @@ using MyCompanyName.MyProjectName.Menus; using Volo.Abp; using Volo.Abp.Account; using Volo.Abp.Account.Web; -using Volo.Abp.AspNetCore.Authentication.JwtBearer; using Volo.Abp.AspNetCore.Components.Server.BasicTheme; using Volo.Abp.AspNetCore.Components.Server.BasicTheme.Bundling; using Volo.Abp.AspNetCore.Components.Web.Theming.Routing; @@ -20,7 +19,6 @@ using Volo.Abp.AspNetCore.Serilog; using Volo.Abp.AuditLogging.MongoDB; using Volo.Abp.Autofac; using Volo.Abp.AutoMapper; -using Volo.Abp.MongoDB; using Volo.Abp.FeatureManagement; using Volo.Abp.FeatureManagement.Blazor.Server; using Volo.Abp.FeatureManagement.MongoDB; @@ -57,7 +55,6 @@ namespace MyCompanyName.MyProjectName; typeof(AbpAutofacModule), typeof(AbpAutoMapperModule), typeof(AbpSwashbuckleModule), - typeof(AbpAspNetCoreAuthenticationJwtBearerModule), typeof(AbpAspNetCoreSerilogModule), typeof(AbpAspNetCoreMvcUiBasicThemeModule), typeof(AbpAspNetCoreComponentsServerBasicThemeModule), diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/MyCompanyName.MyProjectName.Blazor.Server.csproj b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/MyCompanyName.MyProjectName.Blazor.Server.csproj index 9c350d2ad2..ee53dbd329 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/MyCompanyName.MyProjectName.Blazor.Server.csproj +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/MyCompanyName.MyProjectName.Blazor.Server.csproj @@ -18,7 +18,6 @@ - diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/MyProjectNameModule.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/MyProjectNameModule.cs index 5be2bdc2e5..bb820f293c 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/MyProjectNameModule.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/MyProjectNameModule.cs @@ -7,7 +7,6 @@ using MyCompanyName.MyProjectName.Menus; using Volo.Abp; using Volo.Abp.Account; using Volo.Abp.Account.Web; -using Volo.Abp.AspNetCore.Authentication.JwtBearer; using Volo.Abp.AspNetCore.Components.Server.BasicTheme; using Volo.Abp.AspNetCore.Components.Server.BasicTheme.Bundling; using Volo.Abp.AspNetCore.Components.Web.Theming.Routing; @@ -58,7 +57,6 @@ namespace MyCompanyName.MyProjectName; typeof(AbpAutoMapperModule), typeof(AbpEntityFrameworkCoreSqlServerModule), typeof(AbpSwashbuckleModule), - typeof(AbpAspNetCoreAuthenticationJwtBearerModule), typeof(AbpAspNetCoreSerilogModule), typeof(AbpAspNetCoreMvcUiBasicThemeModule), typeof(AbpAspNetCoreComponentsServerBasicThemeModule), diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/MyCompanyName.MyProjectName.Host.Mongo.csproj b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/MyCompanyName.MyProjectName.Host.Mongo.csproj index 6262e3f303..5fe0542a78 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/MyCompanyName.MyProjectName.Host.Mongo.csproj +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/MyCompanyName.MyProjectName.Host.Mongo.csproj @@ -17,7 +17,6 @@ - diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/MyProjectNameModule.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/MyProjectNameModule.cs index 609432b523..59e40043af 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/MyProjectNameModule.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/MyProjectNameModule.cs @@ -7,7 +7,6 @@ using StackExchange.Redis; using Volo.Abp; using Volo.Abp.Account; using Volo.Abp.Account.Web; -using Volo.Abp.AspNetCore.Authentication.JwtBearer; using Volo.Abp.AspNetCore.MultiTenancy; using Volo.Abp.AspNetCore.Mvc; using Volo.Abp.AspNetCore.Mvc.Localization; @@ -55,7 +54,6 @@ namespace MyCompanyName.MyProjectName; typeof(AbpCachingStackExchangeRedisModule), typeof(AbpAspNetCoreMvcUiBasicThemeModule), typeof(AbpSwashbuckleModule), - typeof(AbpAspNetCoreAuthenticationJwtBearerModule), typeof(AbpAspNetCoreSerilogModule), // Account module packages diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/MyCompanyName.MyProjectName.Host.csproj b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/MyCompanyName.MyProjectName.Host.csproj index 1d92ee3dcd..16b58578c9 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/MyCompanyName.MyProjectName.Host.csproj +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/MyCompanyName.MyProjectName.Host.csproj @@ -17,7 +17,6 @@ - diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/MyProjectNameModule.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/MyProjectNameModule.cs index 59b337a7c0..d082c05edc 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/MyProjectNameModule.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/MyProjectNameModule.cs @@ -7,7 +7,6 @@ using StackExchange.Redis; using Volo.Abp; using Volo.Abp.Account; using Volo.Abp.Account.Web; -using Volo.Abp.AspNetCore.Authentication.JwtBearer; using Volo.Abp.AspNetCore.MultiTenancy; using Volo.Abp.AspNetCore.Mvc; using Volo.Abp.AspNetCore.Mvc.Localization; @@ -57,7 +56,6 @@ namespace MyCompanyName.MyProjectName; typeof(AbpEntityFrameworkCoreSqlServerModule), typeof(AbpAspNetCoreMvcUiBasicThemeModule), typeof(AbpSwashbuckleModule), - typeof(AbpAspNetCoreAuthenticationJwtBearerModule), typeof(AbpAspNetCoreSerilogModule), // Account module packages diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc.Mongo/MyCompanyName.MyProjectName.Mvc.Mongo.csproj b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc.Mongo/MyCompanyName.MyProjectName.Mvc.Mongo.csproj index 1c770c1fe4..acc37e1b83 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc.Mongo/MyCompanyName.MyProjectName.Mvc.Mongo.csproj +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc.Mongo/MyCompanyName.MyProjectName.Mvc.Mongo.csproj @@ -16,7 +16,6 @@ - diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc.Mongo/MyProjectNameModule.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc.Mongo/MyProjectNameModule.cs index 10cef836ae..d293761f02 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc.Mongo/MyProjectNameModule.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc.Mongo/MyProjectNameModule.cs @@ -5,7 +5,6 @@ using MyCompanyName.MyProjectName.Menus; using Volo.Abp; using Volo.Abp.Account; using Volo.Abp.Account.Web; -using Volo.Abp.AspNetCore.Authentication.JwtBearer; using Volo.Abp.AspNetCore.Mvc; using Volo.Abp.AspNetCore.Mvc.Localization; using Volo.Abp.AspNetCore.Mvc.UI.Bundling; @@ -52,7 +51,6 @@ namespace MyCompanyName.MyProjectName; typeof(AbpAutofacModule), typeof(AbpAutoMapperModule), typeof(AbpSwashbuckleModule), - typeof(AbpAspNetCoreAuthenticationJwtBearerModule), typeof(AbpAspNetCoreSerilogModule), typeof(AbpAspNetCoreMvcUiBasicThemeModule), diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/MyCompanyName.MyProjectName.Mvc.csproj b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/MyCompanyName.MyProjectName.Mvc.csproj index f73e132e84..1d584562a0 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/MyCompanyName.MyProjectName.Mvc.csproj +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/MyCompanyName.MyProjectName.Mvc.csproj @@ -16,7 +16,6 @@ - diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/MyProjectNameModule.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/MyProjectNameModule.cs index 20a52729ed..e4c878921e 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/MyProjectNameModule.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/MyProjectNameModule.cs @@ -5,7 +5,6 @@ using MyCompanyName.MyProjectName.Menus; using Volo.Abp; using Volo.Abp.Account; using Volo.Abp.Account.Web; -using Volo.Abp.AspNetCore.Authentication.JwtBearer; using Volo.Abp.AspNetCore.Mvc; using Volo.Abp.AspNetCore.Mvc.Localization; using Volo.Abp.AspNetCore.Mvc.UI.Bundling; @@ -54,7 +53,6 @@ namespace MyCompanyName.MyProjectName; typeof(AbpAutoMapperModule), typeof(AbpEntityFrameworkCoreSqlServerModule), typeof(AbpSwashbuckleModule), - typeof(AbpAspNetCoreAuthenticationJwtBearerModule), typeof(AbpAspNetCoreSerilogModule), typeof(AbpAspNetCoreMvcUiBasicThemeModule), diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/MyCompanyName.MyProjectName.Blazor.Server.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/MyCompanyName.MyProjectName.Blazor.Server.csproj index e1295a33c7..299bec9d66 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/MyCompanyName.MyProjectName.Blazor.Server.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/MyCompanyName.MyProjectName.Blazor.Server.csproj @@ -26,7 +26,6 @@ - diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/MyProjectNameBlazorModule.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/MyProjectNameBlazorModule.cs index 4610600956..4c4ad943ad 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/MyProjectNameBlazorModule.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/MyProjectNameBlazorModule.cs @@ -13,7 +13,6 @@ using MyCompanyName.MyProjectName.Localization; using MyCompanyName.MyProjectName.MultiTenancy; using Volo.Abp; using Volo.Abp.Account.Web; -using Volo.Abp.AspNetCore.Authentication.JwtBearer; using Volo.Abp.AspNetCore.Components.Server.BasicTheme; using Volo.Abp.AspNetCore.Components.Server.BasicTheme.Bundling; using Volo.Abp.AspNetCore.Components.Web.Theming.Routing; @@ -49,7 +48,6 @@ namespace MyCompanyName.MyProjectName.Blazor.Server; typeof(AbpAspNetCoreMvcUiBasicThemeModule), typeof(AbpAutofacModule), typeof(AbpSwashbuckleModule), - typeof(AbpAspNetCoreAuthenticationJwtBearerModule), typeof(AbpAspNetCoreSerilogModule), typeof(AbpAccountWebOpenIddictModule), typeof(AbpAspNetCoreComponentsServerBasicThemeModule), diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/MyCompanyName.MyProjectName.HttpApi.HostWithIds.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/MyCompanyName.MyProjectName.HttpApi.HostWithIds.csproj index 7dd3166a17..0049c0b35b 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/MyCompanyName.MyProjectName.HttpApi.HostWithIds.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/MyCompanyName.MyProjectName.HttpApi.HostWithIds.csproj @@ -15,7 +15,6 @@ - diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/MyProjectNameHttpApiHostModule.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/MyProjectNameHttpApiHostModule.cs index 524a7e24bf..428290c240 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/MyProjectNameHttpApiHostModule.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/MyProjectNameHttpApiHostModule.cs @@ -2,14 +2,11 @@ using System; using System.Collections.Generic; using System.IO; using System.Linq; -using System.Net.Http; -using System.Text; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Cors; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; -using Microsoft.IdentityModel.Tokens; using MyCompanyName.MyProjectName.EntityFrameworkCore; using MyCompanyName.MyProjectName.MultiTenancy; using Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic; @@ -17,7 +14,6 @@ using Microsoft.OpenApi.Models; using Volo.Abp; using Volo.Abp.Account; using Volo.Abp.Account.Web; -using Volo.Abp.AspNetCore.Authentication.JwtBearer; using Volo.Abp.AspNetCore.MultiTenancy; using Volo.Abp.AspNetCore.Mvc; using Volo.Abp.AspNetCore.Mvc.UI.Bundling; @@ -27,7 +23,6 @@ using Volo.Abp.AspNetCore.Serilog; using Volo.Abp.Autofac; using Volo.Abp.Localization; using Volo.Abp.Modularity; -using Volo.Abp.OpenIddict; using Volo.Abp.Swashbuckle; using Volo.Abp.UI.Navigation.Urls; using Volo.Abp.VirtualFileSystem; @@ -41,7 +36,6 @@ namespace MyCompanyName.MyProjectName; typeof(MyProjectNameApplicationModule), typeof(MyProjectNameEntityFrameworkCoreModule), typeof(AbpAspNetCoreMvcUiBasicThemeModule), - typeof(AbpAspNetCoreAuthenticationJwtBearerModule), typeof(AbpAccountWebOpenIddictModule), typeof(AbpAspNetCoreSerilogModule), typeof(AbpSwashbuckleModule) diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyCompanyName.MyProjectName.Web.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyCompanyName.MyProjectName.Web.csproj index daecf98955..8bedd81ba4 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyCompanyName.MyProjectName.Web.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyCompanyName.MyProjectName.Web.csproj @@ -42,7 +42,6 @@ - diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyProjectNameWebModule.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyProjectNameWebModule.cs index 82e7a4b7bd..22e6446be7 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyProjectNameWebModule.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyProjectNameWebModule.cs @@ -12,7 +12,6 @@ using MyCompanyName.MyProjectName.Web.Menus; using Microsoft.OpenApi.Models; using Volo.Abp; using Volo.Abp.Account.Web; -using Volo.Abp.AspNetCore.Authentication.JwtBearer; using Volo.Abp.AspNetCore.Mvc; using Volo.Abp.AspNetCore.Mvc.Localization; using Volo.Abp.AspNetCore.Mvc.UI; @@ -49,7 +48,6 @@ namespace MyCompanyName.MyProjectName.Web; typeof(AbpSettingManagementWebModule), typeof(AbpAccountWebModule), typeof(AbpAspNetCoreMvcUiBasicThemeModule), - typeof(AbpAspNetCoreAuthenticationJwtBearerModule), typeof(AbpTenantManagementWebModule), typeof(AbpAspNetCoreSerilogModule), typeof(AbpSwashbuckleModule) @@ -78,7 +76,6 @@ public class MyProjectNameWebModule : AbpModule ConfigureUrls(configuration); ConfigureBundles(); - ConfigureAuthentication(context, configuration); ConfigureAutoMapper(); ConfigureVirtualFileSystem(hostingEnvironment); ConfigureLocalizationServices(); @@ -109,17 +106,6 @@ public class MyProjectNameWebModule : AbpModule }); } - private void ConfigureAuthentication(ServiceConfigurationContext context, IConfiguration configuration) - { - context.Services.AddAuthentication() - .AddJwtBearer(options => - { - options.Authority = configuration["AuthServer:Authority"]; - options.RequireHttpsMetadata = Convert.ToBoolean(configuration["AuthServer:RequireHttpsMetadata"]); - options.Audience = "MyProjectName"; - }); - } - private void ConfigureAutoMapper() { Configure(options => @@ -231,7 +217,6 @@ public class MyProjectNameWebModule : AbpModule app.UseStaticFiles(); app.UseRouting(); app.UseAuthentication(); - app.UseJwtTokenMiddleware(); if (MultiTenancyConsts.IsEnabled) { diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/appsettings.json b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/appsettings.json index cf1965742b..aa65a91573 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/appsettings.json +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/appsettings.json @@ -5,10 +5,6 @@ "ConnectionStrings": { "Default": "Server=(LocalDb)\\MSSQLLocalDB;Database=MyProjectName;Trusted_Connection=True" }, - "AuthServer": { - "Authority": "https://localhost:44303", - "RequireHttpsMetadata": "false" - }, "StringEncryption": { "DefaultPassPhrase": "gsKnGZ041HLL4IM8" } diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/MyCompanyName.MyProjectName.AuthServer.csproj b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/MyCompanyName.MyProjectName.AuthServer.csproj index 237ce701f9..d1052473bb 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/MyCompanyName.MyProjectName.AuthServer.csproj +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/MyCompanyName.MyProjectName.AuthServer.csproj @@ -17,7 +17,6 @@ all runtime; build; native; contentfiles; analyzers - diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/MyProjectNameAuthServerModule.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/MyProjectNameAuthServerModule.cs index a3798432a7..520b4b98de 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/MyProjectNameAuthServerModule.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/MyProjectNameAuthServerModule.cs @@ -13,7 +13,6 @@ using Microsoft.OpenApi.Models; using Volo.Abp; using Volo.Abp.Account; using Volo.Abp.Account.Web; -using Volo.Abp.AspNetCore.Authentication.JwtBearer; using Volo.Abp.AspNetCore.Mvc; using Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy; using Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic; @@ -77,7 +76,6 @@ namespace MyCompanyName.MyProjectName; typeof(AbpTenantManagementEntityFrameworkCoreModule), typeof(AbpTenantManagementApplicationModule), typeof(AbpTenantManagementHttpApiModule), - typeof(AbpAspNetCoreAuthenticationJwtBearerModule), typeof(MyProjectNameApplicationContractsModule), typeof(AbpAspNetCoreSerilogModule), typeof(AbpSwashbuckleModule) @@ -86,13 +84,6 @@ public class MyProjectNameAuthServerModule : AbpModule { public override void PreConfigureServices(ServiceConfigurationContext context) { - PreConfigure(builder => - { - // https://documentation.openiddict.com/configuration/token-formats.html#disabling-jwt-access-token-encryption - // In production, it is recommended to use two RSA certificates, distinct from the certificate(s) used for HTTPS: one for encryption, one for signing. - builder.DisableAccessTokenEncryption(); - }); - PreConfigure(builder => { builder.AddValidation(options => diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/MyCompanyName.MyProjectName.Blazor.Server.Host.csproj b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/MyCompanyName.MyProjectName.Blazor.Server.Host.csproj index b7b66f12ca..fcfd56b48b 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/MyCompanyName.MyProjectName.Blazor.Server.Host.csproj +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/MyCompanyName.MyProjectName.Blazor.Server.Host.csproj @@ -25,7 +25,6 @@ - diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/MyProjectNameBlazorHostModule.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/MyProjectNameBlazorHostModule.cs index 7dce65bbdb..97e9dfcae0 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/MyProjectNameBlazorHostModule.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/MyProjectNameBlazorHostModule.cs @@ -1,6 +1,5 @@ using System; using System.IO; -using System.Net.Http; using System.Threading.Tasks; using Blazorise.Bootstrap5; using Blazorise.Icons.FontAwesome; @@ -16,7 +15,6 @@ using MyCompanyName.MyProjectName.MultiTenancy; using Volo.Abp; using Volo.Abp.Account; using Volo.Abp.Account.Web; -using Volo.Abp.AspNetCore.Authentication.JwtBearer; using Volo.Abp.AspNetCore.Components.Server.BasicTheme; using Volo.Abp.AspNetCore.Components.Server.BasicTheme.Bundling; using Volo.Abp.AspNetCore.Components.Web.Theming.Routing; @@ -48,7 +46,6 @@ using Volo.Abp.Swashbuckle; using Volo.Abp.TenantManagement; using Volo.Abp.TenantManagement.Blazor.Server; using Volo.Abp.TenantManagement.EntityFrameworkCore; -using Volo.Abp.Threading; using Volo.Abp.UI.Navigation; using Volo.Abp.UI.Navigation.Urls; using Volo.Abp.VirtualFileSystem; @@ -62,7 +59,6 @@ namespace MyCompanyName.MyProjectName.Blazor.Server.Host; typeof(AbpAspNetCoreMvcUiBasicThemeModule), typeof(AbpAutofacModule), typeof(AbpSwashbuckleModule), - typeof(AbpAspNetCoreAuthenticationJwtBearerModule), typeof(AbpAspNetCoreSerilogModule), typeof(AbpAccountWebOpenIddictModule), typeof(AbpAccountApplicationModule), @@ -100,13 +96,6 @@ public class MyProjectNameBlazorHostModule : AbpModule ); }); - PreConfigure(builder => - { - // https://documentation.openiddict.com/configuration/token-formats.html#disabling-jwt-access-token-encryption - // In production, it is recommended to use two RSA certificates, distinct from the certificate(s) used for HTTPS: one for encryption, one for signing. - builder.DisableAccessTokenEncryption(); - }); - PreConfigure(builder => { builder.AddValidation(options => @@ -151,14 +140,6 @@ public class MyProjectNameBlazorHostModule : AbpModule ); }); - context.Services.AddAuthentication() - .AddJwtBearer(options => - { - options.Authority = configuration["AuthServer:Authority"]; - options.RequireHttpsMetadata = Convert.ToBoolean(configuration["AuthServer:RequireHttpsMetadata"]); - options.Audience = "MyProjectName"; - }); - if (hostingEnvironment.IsDevelopment()) { Configure(options => @@ -253,7 +234,7 @@ public class MyProjectNameBlazorHostModule : AbpModule app.UseStaticFiles(); app.UseRouting(); app.UseAuthentication(); - app.UseJwtTokenMiddleware(); + app.UseAbpOpenIddictValidation(); if (MultiTenancyConsts.IsEnabled) { diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/appsettings.json b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/appsettings.json index 75f6e96512..53f04d8271 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/appsettings.json +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/appsettings.json @@ -5,9 +5,5 @@ }, "ConnectionStrings": { "Default": "Server=(LocalDb)\\MSSQLLocalDB;Database=MyProjectName_Unified;Trusted_Connection=True" - }, - "AuthServer": { - "Authority": "https://localhost:44304", - "RequireHttpsMetadata": "false" } } From 853d82f5ac9deaca07df17d2173dc3195db5ba80 Mon Sep 17 00:00:00 2001 From: Yunus Emre Kalkan Date: Mon, 30 May 2022 10:01:39 +0300 Subject: [PATCH 31/59] Update NpmPackagesUpdater.cs --- .../Volo/Abp/Cli/ProjectModification/NpmPackagesUpdater.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/NpmPackagesUpdater.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/NpmPackagesUpdater.cs index 64517b1900..135c04feaf 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/NpmPackagesUpdater.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/NpmPackagesUpdater.cs @@ -314,13 +314,13 @@ public class NpmPackagesUpdater : ITransientDependency protected virtual void RunYarn(string fileDirectory) { Logger.LogInformation($"Running Yarn on {fileDirectory}"); - CmdHelper.RunCmd($"cd {fileDirectory} && yarn"); + CmdHelper.RunCmd($"yarn", fileDirectory); } protected virtual void RunNpmInstall(string fileDirectory) { Logger.LogInformation($"Running npm install on {fileDirectory}"); - CmdHelper.RunCmd($"cd {fileDirectory} && npm install"); + CmdHelper.RunCmd($"npm install", fileDirectory); } protected virtual List GetPackageVersionList(JProperty package) From d24a9ed3019bad1b53804f06b3a23b8cd1bcaa04 Mon Sep 17 00:00:00 2001 From: Yunus Emre Kalkan Date: Mon, 30 May 2022 10:45:44 +0300 Subject: [PATCH 32/59] Update InstallLibsService.cs --- .../Volo.Abp.Cli.Core/Volo/Abp/Cli/LIbs/InstallLibsService.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/LIbs/InstallLibsService.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/LIbs/InstallLibsService.cs index 56fa776904..71cf789c9c 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/LIbs/InstallLibsService.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/LIbs/InstallLibsService.cs @@ -236,13 +236,13 @@ public class InstallLibsService : IInstallLibsService, ITransientDependency private void RunNpmInstall(string directory) { Logger.LogInformation($"Running npm install on {directory}"); - CmdHelper.RunCmd($"cd {directory} && npm install"); + CmdHelper.RunCmd($"npm install", directory); } private void RunYarn(string directory) { Logger.LogInformation($"Running Yarn on {directory}"); - CmdHelper.RunCmd($"cd {directory} && yarn"); + CmdHelper.RunCmd($"yarn", directory); } private bool IsNpmInstalled() From ba21feccd12d831780bcde15b9ca4a97952dc339 Mon Sep 17 00:00:00 2001 From: maliming Date: Mon, 30 May 2022 16:36:23 +0800 Subject: [PATCH 33/59] Enable Swagger in host projects. --- .../MyProjectNameModule.cs | 14 +++++++++----- .../appsettings.json | 5 +++++ .../MyProjectNameModule.cs | 18 +++++++++++++----- .../appsettings.json | 5 +++++ .../appsettings.json | 2 +- 5 files changed, 33 insertions(+), 11 deletions(-) diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/MyProjectNameModule.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/MyProjectNameModule.cs index 59e40043af..3add01a618 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/MyProjectNameModule.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/MyProjectNameModule.cs @@ -126,7 +126,7 @@ public class MyProjectNameModule : AbpModule ConfigureMultiTenancy(); ConfigureUrls(configuration); ConfigureAutoMapper(context); - ConfigureSwagger(context.Services); + ConfigureSwagger(context.Services, configuration); ConfigureAutoApiControllers(); ConfigureVirtualFiles(hostingEnvironment); ConfigureLocalization(); @@ -225,16 +225,20 @@ public class MyProjectNameModule : AbpModule }); } - private void ConfigureSwagger(IServiceCollection services) + private void ConfigureSwagger(IServiceCollection services, IConfiguration configuration) { - services.AddAbpSwaggerGen( + services.AddAbpSwaggerGenWithOAuth( + configuration["AuthServer:Authority"], + new Dictionary + { + {"MyProjectName", "MyProjectName API"} + }, options => { options.SwaggerDoc("v1", new OpenApiInfo { Title = "MyProjectName API", Version = "v1" }); options.DocInclusionPredicate((docName, description) => true); options.CustomSchemaIds(type => type.FullName); - } - ); + }); } private void ConfigureAutoMapper(ServiceConfigurationContext context) diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/appsettings.json b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/appsettings.json index 284615a19b..b4db7dbf0a 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/appsettings.json +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/appsettings.json @@ -14,6 +14,11 @@ "StringEncryption": { "DefaultPassPhrase": "gsKnGZ041HLL4IM8" }, + "AuthServer": { + "Authority": "https://localhost:44300", + "RequireHttpsMetadata": "true", + "SwaggerClientId": "MyProjectName_Swagger" + }, "OpenIddict": { "Applications": { "MyProjectName_App": { diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/MyProjectNameModule.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/MyProjectNameModule.cs index d082c05edc..6884b712c6 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/MyProjectNameModule.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/MyProjectNameModule.cs @@ -128,7 +128,7 @@ public class MyProjectNameModule : AbpModule ConfigureMultiTenancy(); ConfigureUrls(configuration); ConfigureAutoMapper(context); - ConfigureSwagger(context.Services); + ConfigureSwagger(context.Services, configuration); ConfigureAutoApiControllers(); ConfigureVirtualFiles(hostingEnvironment); ConfigureLocalization(); @@ -227,16 +227,20 @@ public class MyProjectNameModule : AbpModule }); } - private void ConfigureSwagger(IServiceCollection services) + private void ConfigureSwagger(IServiceCollection services, IConfiguration configuration) { - services.AddAbpSwaggerGen( + services.AddAbpSwaggerGenWithOAuth( + configuration["AuthServer:Authority"], + new Dictionary + { + {"MyProjectName", "MyProjectName API"} + }, options => { options.SwaggerDoc("v1", new OpenApiInfo { Title = "MyProjectName API", Version = "v1" }); options.DocInclusionPredicate((docName, description) => true); options.CustomSchemaIds(type => type.FullName); - } - ); + }); } private void ConfigureAutoMapper(ServiceConfigurationContext context) @@ -343,6 +347,10 @@ public class MyProjectNameModule : AbpModule app.UseAbpSwaggerUI(options => { options.SwaggerEndpoint("/swagger/v1/swagger.json", "MyProjectName API"); + + var configuration = context.GetConfiguration(); + options.OAuthClientId(configuration["AuthServer:SwaggerClientId"]); + options.OAuthScopes("MyProjectName"); }); app.UseAuditing(); diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/appsettings.json b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/appsettings.json index 251acbe2ac..c35a5736a1 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/appsettings.json +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/appsettings.json @@ -14,6 +14,11 @@ "StringEncryption": { "DefaultPassPhrase": "gsKnGZ041HLL4IM8" }, + "AuthServer": { + "Authority": "https://localhost:44300", + "RequireHttpsMetadata": "true", + "SwaggerClientId": "MyProjectName_Swagger" + }, "OpenIddict": { "Applications": { "MyProjectName_App": { diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/appsettings.json b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/appsettings.json index 4b7a8f4029..5131851809 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/appsettings.json +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/appsettings.json @@ -12,7 +12,7 @@ "Authority": "https://localhost:44301", "RequireHttpsMetadata": "true", "SwaggerClientId": "MyProjectName_Swagger" -}, + }, "StringEncryption": { "DefaultPassPhrase": "gsKnGZ041HLL4IM8" } From c409e0dd37204dc350fb7ee7577036d2a4f7724e Mon Sep 17 00:00:00 2001 From: Berkan Sasmaz Date: Mon, 30 May 2022 14:25:34 +0300 Subject: [PATCH 34/59] Update en.json --- .../AbpIoLocalization/Commercial/Localization/Resources/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json index f8d5de9688..cc190808c9 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json @@ -536,7 +536,7 @@ "Pricing_Page_Testimonial_3": "We love ABP. We don't have to write everything from scratch. We start from out-of-the-box features and just focus on what we really need to write. Also, ABP is well-architected and the code is high quality with fewer bugs. If we would have to write everything we needed on our own, we might have to spend years. Once more things we like is that the new version, or issue fixing, or improvement come out very soon every other week. We don't wait too long.", "Pricing_Page_Testimonial_4": "ABP Commercial is a fantastic product would recommend. Commercial products to market for our customers in a single configurable platform. The jump start that the framework and tooling provide any team is worth every cent. ABP Commercial was the best fit for our needs.", "AbpBookDownloadArea_ClaimYourEBook": "Claim your Mastering ABP Framework E-Book", - "AddMemberModal_Warning_1": "If the username you are trying to add doesn't exist in the system, please ask your team member to register on {0} and share the username of his/her account with you.", + "AddMemberModal_Warning_1": "If the username you are trying to add doesn't exist in the system, please ask your team member to register on {0} and share the username of his/her account with you.", "MyOrganizations_Detail_WelcomeMessage": "Welcome to your organization, {0}", "MyOrganizations_Detail_OrganizationManagement": "Organization Management", "OrganizationDisplayName": "Organization Display Name", From 71a062b72dda237dacf6ddfbc773b556dd025dcb Mon Sep 17 00:00:00 2001 From: Berkan Sasmaz Date: Mon, 30 May 2022 15:37:10 +0300 Subject: [PATCH 35/59] Update en.json --- .../Commercial/Localization/Resources/en.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json index cc190808c9..4283e64533 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json @@ -562,7 +562,7 @@ "MyOrganizations_Detail_PaymentProviderInfo": "If you have purchased your license through {0} gateway, it sends the PDF invoice to your email address, see {0} invoicing.", "MyOrganizations_Detail_PayUInfo": "If you have purchased through the PayU gateway, click the \"Request Invoice\" button and fill in the billing information.", "MyOrganizations_Detail_ConclusionInfo": "Your invoice request will be concluded within {0} business days.", - "ExtendYourLicense": "Extend Your {0} License", + "ExtendYourLicense": "Extend your {0} license", "Continue": "Continue", "PurchaseLicense": "Purchase {0} license", "DownloadInvoiceModal_DownloadInvoice": "Download Invoice", @@ -628,7 +628,7 @@ "Tools_Page_Description": "ABP Commercial provides rapid application development tooling to increase developer productivity. ABP Suite allows you to create CRUD pages easily.", "DeveloperPrice": "Developer Price", "AdditionalDeveloperPaymentInfoSection_AdditionalDevelopers": "{0} developers", - "AdditionalDeveloperPaymentInfoSection_RemainingYear": "for {1} years", + "LicenseRemainingDays": "for {0} days", "ExtendPaymentInfoSection_Description": "By extending/renewing your license, you will continue to get premium support. You will also be able to get major updates for modules and themes. You will be able to continue creating new projects. And you will still be able to use ABP Suite which speeds up your development.", "LicenseRenewalPrice": "License renewal price", "LicensePrice": "License Price", From 247c0ea12183481548ccc7c996ef49d217b49e99 Mon Sep 17 00:00:00 2001 From: Enis Necipoglu Date: Tue, 31 May 2022 08:32:12 +0300 Subject: [PATCH 36/59] Update saving without any permissions localization --- .../Components/PermissionManagementModal.razor.cs | 2 +- .../Volo/Abp/PermissionManagement/Localization/Domain/en.json | 2 +- .../Volo/Abp/PermissionManagement/Localization/Domain/tr.json | 3 ++- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Blazor/Components/PermissionManagementModal.razor.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.Blazor/Components/PermissionManagementModal.razor.cs index e81eed859d..b477de008d 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Blazor/Components/PermissionManagementModal.razor.cs +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Blazor/Components/PermissionManagementModal.razor.cs @@ -133,7 +133,7 @@ public partial class PermissionManagementModal if (!updateDto.Permissions.Any(x => x.IsGranted)) { - if (!await Message.Confirm(L["RemoveAllPermissionsWarningMessage"].Value)) + if (!await Message.Confirm(L["SaveWithoutAnyPermissionsWarningMessage"].Value)) { return; } diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/en.json b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/en.json index 98f3a60216..8fbe3e9eab 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/en.json +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/en.json @@ -6,6 +6,6 @@ "All": "All", "SelectAllInAllTabs": "Grant all permissions", "SelectAllInThisTab": "Select all", - "RemoveAllPermissionsWarningMessage": "Are you sure you want to remove all permissions?" + "SaveWithoutAnyPermissionsWarningMessage": "Are you sure you want to save without any permissions?" } } \ No newline at end of file diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/tr.json b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/tr.json index e462d91a51..ca6802de1e 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/tr.json +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/tr.json @@ -5,6 +5,7 @@ "OnlyProviderPermissons": "Sadece bu sağlayıcı", "All": "Hepsi", "SelectAllInAllTabs": "Tüm izinleri ver", - "SelectAllInThisTab": "Hepsini seç" + "SelectAllInThisTab": "Hepsini seç", + "SaveWithoutAnyPermissionsWarningMessage": "Hiçbir izin olmadan kaydetmek istediğinize emin misiniz??" } } \ No newline at end of file From 4a7dcf000b6fe8877c11d5ac33c0509ca876da6f Mon Sep 17 00:00:00 2001 From: Enis Necipoglu Date: Tue, 31 May 2022 08:43:34 +0300 Subject: [PATCH 37/59] Update permission-management-modal.js --- .../AbpPermissionManagement/permission-management-modal.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Web/Pages/AbpPermissionManagement/permission-management-modal.js b/modules/permission-management/src/Volo.Abp.PermissionManagement.Web/Pages/AbpPermissionManagement/permission-management-modal.js index 208047314c..9577d38696 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Web/Pages/AbpPermissionManagement/permission-management-modal.js +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Web/Pages/AbpPermissionManagement/permission-management-modal.js @@ -265,7 +265,7 @@ var abp = abp || {}; e.preventDefault(); if(!$form.find("input:checked").length > 0) { - abp.message.confirm(l("RemoveAllPermissionsWarningMessage")) + abp.message.confirm(l("SaveWithoutAnyPermissionsWarningMessage")) .then(function (confirmed) { if(confirmed) { $form.submit(); From 1b8a6eddea5e8c34b3e335b40c8290722960352a Mon Sep 17 00:00:00 2001 From: maliming Date: Tue, 31 May 2022 14:24:36 +0800 Subject: [PATCH 38/59] Upgrade Autofac to latest. Resolve #12758 --- .../DependencyInjection/AutofacRegistration.cs | 13 +++++++++++-- .../src/Volo.Abp.Autofac/Volo.Abp.Autofac.csproj | 4 ++-- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/framework/src/Volo.Abp.Autofac/Autofac/Extensions/DependencyInjection/AutofacRegistration.cs b/framework/src/Volo.Abp.Autofac/Autofac/Extensions/DependencyInjection/AutofacRegistration.cs index 9b6c261392..241c3dd7a8 100644 --- a/framework/src/Volo.Abp.Autofac/Autofac/Extensions/DependencyInjection/AutofacRegistration.cs +++ b/framework/src/Volo.Abp.Autofac/Autofac/Extensions/DependencyInjection/AutofacRegistration.cs @@ -94,13 +94,22 @@ public static class AutofacRegistration throw new ArgumentNullException(nameof(services)); } - builder.RegisterType().As().ExternallyOwned(); + builder.RegisterType() + .As() + .As() + .ExternallyOwned(); + var autofacServiceScopeFactory = typeof(AutofacServiceProvider).Assembly.GetType("Autofac.Extensions.DependencyInjection.AutofacServiceScopeFactory"); if (autofacServiceScopeFactory == null) { throw new AbpException("Unable get type of Autofac.Extensions.DependencyInjection.AutofacServiceScopeFactory!"); } - builder.RegisterType(autofacServiceScopeFactory).As(); + + // Issue #83: IServiceScopeFactory must be a singleton and scopes must be flat, not hierarchical. + builder + .RegisterType(autofacServiceScopeFactory) + .As() + .SingleInstance(); Register(builder, services, lifetimeScopeTagForSingletons); } diff --git a/framework/src/Volo.Abp.Autofac/Volo.Abp.Autofac.csproj b/framework/src/Volo.Abp.Autofac/Volo.Abp.Autofac.csproj index 7ce82c1c9e..d8d2b83e5a 100644 --- a/framework/src/Volo.Abp.Autofac/Volo.Abp.Autofac.csproj +++ b/framework/src/Volo.Abp.Autofac/Volo.Abp.Autofac.csproj @@ -15,8 +15,8 @@ - - + + From 55931dc2a3f91e933f50204850b1cb146c325c76 Mon Sep 17 00:00:00 2001 From: Yunus Emre Kalkan Date: Tue, 31 May 2022 09:32:11 +0300 Subject: [PATCH 39/59] Cli: Log special information on Dll not found exception --- .../Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/SuiteCommand.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/SuiteCommand.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/SuiteCommand.cs index aabd5c6dfd..6ee6a74a47 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/SuiteCommand.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/SuiteCommand.cs @@ -132,6 +132,11 @@ public class SuiteCommand : IConsoleCommand, ITransientDependency if (!response.IsNullOrWhiteSpace()) { Logger.LogError(response); + + if (response.Contains("Commercial.SuiteTemplates.dll")) + { + Logger.LogInformation("The solution should be built before generating an entity! Use `dotnet build` to build your solution."); + } } else { From 5026e93bc5914a0325237a9e7cb3569356a92f09 Mon Sep 17 00:00:00 2001 From: Berkan Sasmaz Date: Tue, 31 May 2022 09:32:43 +0300 Subject: [PATCH 40/59] Update en.json --- .../AbpIoLocalization/Commercial/Localization/Resources/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json index 4283e64533..03d1ad0cba 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json @@ -628,7 +628,7 @@ "Tools_Page_Description": "ABP Commercial provides rapid application development tooling to increase developer productivity. ABP Suite allows you to create CRUD pages easily.", "DeveloperPrice": "Developer Price", "AdditionalDeveloperPaymentInfoSection_AdditionalDevelopers": "{0} developers", - "LicenseRemainingDays": "for {0} days", + "AdditionalDeveloperPaymentInfoSection_RemainingYear": "for {1} years", "ExtendPaymentInfoSection_Description": "By extending/renewing your license, you will continue to get premium support. You will also be able to get major updates for modules and themes. You will be able to continue creating new projects. And you will still be able to use ABP Suite which speeds up your development.", "LicenseRenewalPrice": "License renewal price", "LicensePrice": "License Price", From 97b209ab0a6219e8333e4fa5dead2e3306914ee3 Mon Sep 17 00:00:00 2001 From: Berkan Sasmaz Date: Tue, 31 May 2022 10:56:35 +0300 Subject: [PATCH 41/59] Update en.json --- .../AbpIoLocalization/Commercial/Localization/Resources/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json index 03d1ad0cba..4283e64533 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json @@ -628,7 +628,7 @@ "Tools_Page_Description": "ABP Commercial provides rapid application development tooling to increase developer productivity. ABP Suite allows you to create CRUD pages easily.", "DeveloperPrice": "Developer Price", "AdditionalDeveloperPaymentInfoSection_AdditionalDevelopers": "{0} developers", - "AdditionalDeveloperPaymentInfoSection_RemainingYear": "for {1} years", + "LicenseRemainingDays": "for {0} days", "ExtendPaymentInfoSection_Description": "By extending/renewing your license, you will continue to get premium support. You will also be able to get major updates for modules and themes. You will be able to continue creating new projects. And you will still be able to use ABP Suite which speeds up your development.", "LicenseRenewalPrice": "License renewal price", "LicensePrice": "License Price", From e888bd267d5358a338b0ffc12509a622e63db7cd Mon Sep 17 00:00:00 2001 From: selman koc <64414348+skoc10@users.noreply.github.com> Date: Tue, 31 May 2022 11:57:37 +0300 Subject: [PATCH 42/59] Update common.props --- common.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common.props b/common.props index 9b4b018b94..6be2bd8531 100644 --- a/common.props +++ b/common.props @@ -1,7 +1,7 @@ latest - 5.3.0-rc.2 + 5.3.0-rc.3 $(NoWarn);CS1591;CS0436 https://abp.io/assets/abp_nupkg.png https://abp.io/ From 5d853d37f86fcdd884149fc67dca3dfbf47170b0 Mon Sep 17 00:00:00 2001 From: Engincan VESKE <43685404+EngincanV@users.noreply.github.com> Date: Tue, 31 May 2022 13:26:35 +0300 Subject: [PATCH 43/59] Update tr.json --- .../Volo/Abp/PermissionManagement/Localization/Domain/tr.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/tr.json b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/tr.json index ca6802de1e..dececfcce5 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/tr.json +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/tr.json @@ -6,6 +6,6 @@ "All": "Hepsi", "SelectAllInAllTabs": "Tüm izinleri ver", "SelectAllInThisTab": "Hepsini seç", - "SaveWithoutAnyPermissionsWarningMessage": "Hiçbir izin olmadan kaydetmek istediğinize emin misiniz??" + "SaveWithoutAnyPermissionsWarningMessage": "Hiçbir izin olmadan kaydetmek istediğinize emin misiniz?" } -} \ No newline at end of file +} From b333e8165a086740093a9ca838bb499dd11e284d Mon Sep 17 00:00:00 2001 From: Ebicoglu Date: Tue, 31 May 2022 15:06:20 +0300 Subject: [PATCH 44/59] Update zh-Hans.json --- .../Commercial/Localization/Resources/zh-Hans.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/zh-Hans.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/zh-Hans.json index 3698916679..e516395aef 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/zh-Hans.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/zh-Hans.json @@ -131,7 +131,7 @@ "YourFullName": "你的全名", "EmailField": "E-mail地址", "YourEmailAddress": "你的e-mail地址", - "HowMayWeHelpYou": "我们如何帮助你", + "HowMayWeHelpYou": "需要获得购买帮助?(提供中文服务)", "SendMessage": "发送消息", "Success": "成功", "WeWillReplyYou": "你的消息已经发送! 我们会在短时间内给你答复.", From 8e18aea190312b73aabe50093b2b2918a9d16190 Mon Sep 17 00:00:00 2001 From: Volosoft Agent <43883821+voloagent@users.noreply.github.com> Date: Tue, 31 May 2022 21:33:50 +0300 Subject: [PATCH 45/59] Update_NPM_Packages --- .../package.json | 2 +- .../yarn.lock | 224 +++++------ .../package.json | 4 +- .../yarn.lock | 260 ++++++------ .../app/Volo.BloggingTestApp/package.json | 4 +- .../app/Volo.BloggingTestApp/yarn.lock | 298 +++++++------- .../Volo.ClientSimulation.Demo/package.json | 2 +- .../demo/Volo.ClientSimulation.Demo/yarn.lock | 238 +++++------ modules/cms-kit/angular/package.json | 10 +- .../angular/projects/cms-kit/package.json | 4 +- .../Volo.CmsKit.IdentityServer/package.json | 2 +- .../host/Volo.CmsKit.IdentityServer/yarn.lock | 238 +++++------ .../host/Volo.CmsKit.Web.Host/package.json | 2 +- .../host/Volo.CmsKit.Web.Host/yarn.lock | 238 +++++------ .../host/Volo.CmsKit.Web.Unified/package.json | 4 +- .../host/Volo.CmsKit.Web.Unified/yarn.lock | 372 +++++++++--------- modules/docs/app/VoloDocs.Web/package.json | 4 +- modules/docs/app/VoloDocs.Web/yarn.lock | 298 +++++++------- .../package.json | 2 +- .../yarn.lock | 238 +++++------ .../package.json | 4 +- .../yarn.lock | 272 ++++++------- npm/lerna.json | 2 +- npm/ng-packs/lerna.version.json | 2 +- npm/ng-packs/package.json | 24 +- .../packages/account-core/package.json | 6 +- npm/ng-packs/packages/account/package.json | 6 +- npm/ng-packs/packages/components/package.json | 6 +- npm/ng-packs/packages/core/package.json | 4 +- .../packages/feature-management/package.json | 4 +- npm/ng-packs/packages/identity/package.json | 6 +- .../permission-management/package.json | 4 +- npm/ng-packs/packages/schematics/package.json | 2 +- .../packages/setting-management/package.json | 6 +- .../packages/tenant-management/package.json | 6 +- .../packages/theme-basic/package.json | 6 +- .../packages/theme-shared/package.json | 4 +- npm/ng-packs/yarn.lock | 138 +++---- npm/packs/anchor-js/package.json | 4 +- .../package.json | 4 +- .../package.json | 6 +- .../package.json | 4 +- .../package.json | 30 +- npm/packs/aspnetcore.mvc.ui/package-lock.json | 2 +- npm/packs/aspnetcore.mvc.ui/package.json | 2 +- npm/packs/blogging/package.json | 10 +- npm/packs/bootstrap-datepicker/package.json | 2 +- npm/packs/bootstrap/package.json | 4 +- npm/packs/chart.js/package.json | 2 +- npm/packs/clipboard/package.json | 4 +- npm/packs/cms-kit.admin/package.json | 12 +- npm/packs/cms-kit.public/package.json | 6 +- npm/packs/cms-kit/package.json | 6 +- npm/packs/codemirror/package.json | 4 +- npm/packs/core/package.json | 4 +- npm/packs/cropperjs/package.json | 4 +- npm/packs/datatables.net-bs4/package.json | 4 +- npm/packs/datatables.net-bs5/package.json | 4 +- npm/packs/datatables.net/package.json | 4 +- npm/packs/docs/package.json | 12 +- npm/packs/flag-icon-css/package.json | 2 +- npm/packs/font-awesome/package.json | 4 +- npm/packs/highlight.js/package.json | 4 +- npm/packs/jquery-form/package.json | 4 +- .../package.json | 4 +- npm/packs/jquery-validation/package.json | 4 +- npm/packs/jquery/package.json | 4 +- npm/packs/jstree/package.json | 4 +- npm/packs/lodash/package.json | 4 +- npm/packs/luxon/package.json | 4 +- .../package.json | 4 +- npm/packs/markdown-it/package.json | 4 +- npm/packs/owl.carousel/package.json | 4 +- npm/packs/popper.js/package.json | 4 +- npm/packs/prismjs/package.json | 6 +- npm/packs/select2/package.json | 4 +- npm/packs/signalr/package.json | 4 +- npm/packs/slugify/package.json | 2 +- npm/packs/star-rating-svg/package.json | 4 +- npm/packs/sweetalert2/package.json | 4 +- npm/packs/timeago/package.json | 4 +- npm/packs/toastr/package.json | 4 +- npm/packs/tui-editor/package.json | 6 +- npm/packs/uppy/package.json | 4 +- npm/packs/utils/package.json | 2 +- npm/packs/vee-validate/package.json | 4 +- npm/packs/virtual-file-explorer/package.json | 6 +- npm/packs/vue/package.json | 2 +- templates/app-nolayers/angular/package.json | 18 +- .../package.json | 4 +- .../package.json | 4 +- .../package.json | 2 +- .../package.json | 2 +- .../package.json | 2 +- .../package.json | 2 +- templates/app/angular/package.json | 18 +- .../package.json | 4 +- .../package.json | 4 +- .../package.json | 2 +- .../package.json | 2 +- .../package.json | 2 +- .../package.json | 2 +- templates/module/angular/package.json | 18 +- .../projects/my-project-name/package.json | 4 +- .../package.json | 4 +- .../package.json | 2 +- .../package.json | 2 +- .../package.json | 2 +- 108 files changed, 1645 insertions(+), 1645 deletions(-) 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 626ac29ace..b17e9a62f0 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": "^5.3.0-rc.2", + "@abp/aspnetcore.mvc.ui.theme.shared": "^5.3.0-rc.3", "highlight.js": "^9.13.1" }, "devDependencies": {} diff --git a/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/yarn.lock b/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/yarn.lock index c90be3145f..93f7885ecc 100644 --- a/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/yarn.lock +++ b/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/yarn.lock @@ -2,30 +2,30 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.shared@^5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-5.3.0-rc.2.tgz#a4e6f033ee17fe7196e94047640bc826a69694a6" - integrity sha512-uKyb8by2dqYvCr9TCD0JKg2W+eLNcHanmQDL+aoI9OAExEEI/DYxw2a5++OntJGvmbcA6o1envmvOjqqsZuX0g== - dependencies: - "@abp/aspnetcore.mvc.ui" "~5.3.0-rc.2" - "@abp/bootstrap" "~5.3.0-rc.2" - "@abp/bootstrap-datepicker" "~5.3.0-rc.2" - "@abp/datatables.net-bs5" "~5.3.0-rc.2" - "@abp/font-awesome" "~5.3.0-rc.2" - "@abp/jquery-form" "~5.3.0-rc.2" - "@abp/jquery-validation-unobtrusive" "~5.3.0-rc.2" - "@abp/lodash" "~5.3.0-rc.2" - "@abp/luxon" "~5.3.0-rc.2" - "@abp/malihu-custom-scrollbar-plugin" "~5.3.0-rc.2" - "@abp/select2" "~5.3.0-rc.2" - "@abp/sweetalert2" "~5.3.0-rc.2" - "@abp/timeago" "~5.3.0-rc.2" - "@abp/toastr" "~5.3.0-rc.2" - -"@abp/aspnetcore.mvc.ui@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-5.3.0-rc.2.tgz#93a3c331cc75d2fbdd466a42777040466295f982" - integrity sha512-10RgXgZChbXNtXMblvvEZQctufJlP29RabfIOKWBTBMtU+jUgtDsLUwmF6Oi/65LLImOUogmBCb9MxjNm71iAQ== +"@abp/aspnetcore.mvc.ui.theme.shared@^5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-5.3.0-rc.3.tgz#34a752e71b965e762a81d758965a30d140501bc9" + integrity sha512-GnGhj6Y2DE1mrSWmp1jRnNvCsUiugWPKxlv1ue5dCdPVOw14OdXa6tLJwnZ38w9OOCDzXQyDUFdr19+uwOvEzQ== + dependencies: + "@abp/aspnetcore.mvc.ui" "~5.3.0-rc.3" + "@abp/bootstrap" "~5.3.0-rc.3" + "@abp/bootstrap-datepicker" "~5.3.0-rc.3" + "@abp/datatables.net-bs5" "~5.3.0-rc.3" + "@abp/font-awesome" "~5.3.0-rc.3" + "@abp/jquery-form" "~5.3.0-rc.3" + "@abp/jquery-validation-unobtrusive" "~5.3.0-rc.3" + "@abp/lodash" "~5.3.0-rc.3" + "@abp/luxon" "~5.3.0-rc.3" + "@abp/malihu-custom-scrollbar-plugin" "~5.3.0-rc.3" + "@abp/select2" "~5.3.0-rc.3" + "@abp/sweetalert2" "~5.3.0-rc.3" + "@abp/timeago" "~5.3.0-rc.3" + "@abp/toastr" "~5.3.0-rc.3" + +"@abp/aspnetcore.mvc.ui@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-5.3.0-rc.3.tgz#810821c844f4a1f248182ed9d3a8b54237b83124" + integrity sha512-1yvpDgZpYegL/JiwPdpCm/VjruEymt5VcamMYLPiUpmGTl0b7QFtUIwjSonE3gHEsBDXj9eCw9Kw3Bi+sd7NNQ== dependencies: ansi-colors "^4.1.1" extend-object "^1.0.0" @@ -34,144 +34,144 @@ merge-stream "^2.0.0" micromatch "^4.0.2" -"@abp/bootstrap-datepicker@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-5.3.0-rc.2.tgz#228735714f2baeb42e864c175e0aed3f855249d7" - integrity sha512-jZ7vGvsLjnXwpzvQ6vjKHWBkiptYBnEDVIfQ/zKV8kvkhdu+xxOP/u1LM90NSR2YckjIRj8+mINEcrnWhXgRNw== +"@abp/bootstrap-datepicker@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-5.3.0-rc.3.tgz#f98743539a1e8d883869aa7a759ba1aa00cd0689" + integrity sha512-VNNROxO1wzjG2q35wKEh4STluZllVggNhb0UyGtpZVNbtLydSxeFGHcve26f8UfEWE3WfC5Yyw8nBOHyJxh6tg== dependencies: bootstrap-datepicker "^1.9.0" -"@abp/bootstrap@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-5.3.0-rc.2.tgz#c410f44d987d09b5a74fd58417d03788fa878884" - integrity sha512-jb58M67kWldW35zTjVDFLaCj4STly2eU40COYFgjPQSH7F21DvMdX69Cp3jpmHaxm8VQE9izgW0NV8+oGlFyAw== +"@abp/bootstrap@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-5.3.0-rc.3.tgz#338b5ce194a257e5f14be2344b4e722874273ab1" + integrity sha512-fom2AboT9d1O3K1cOrIFT9l5Cvw2l42BvxEHkV3sXkZxZSstc9exURQn0WmKxWnOMCwM03N2IMKsFlk6SePN2A== dependencies: - "@abp/core" "~5.3.0-rc.2" + "@abp/core" "~5.3.0-rc.3" bootstrap "^5.1.3" -"@abp/core@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-5.3.0-rc.2.tgz#3a3c6d187c502436bb02db99be3720f61628c924" - integrity sha512-/BEO90D7ibeyZxfCQHv2bbb9y/SpfZtaw0A8gmQlYrH3rZ3Th935v5XjCeYem8IGJ8fDZO7CRzW5TBsku/PukA== +"@abp/core@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-5.3.0-rc.3.tgz#7846bd8582bbb9effdb058b3b815fc1798b33f01" + integrity sha512-RyFoereWj/YOccWFeB5yq4aktKnYl44xrb6LKNkCmcVadbOJ+7AHgHljychTuMZalTvfzW2GcZacIoHw4bhn/A== dependencies: - "@abp/utils" "~5.3.0-rc.2" + "@abp/utils" "~5.3.0-rc.3" -"@abp/datatables.net-bs5@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-5.3.0-rc.2.tgz#452c2112fbe3cdac8c0d12bb626017f7c6333a45" - integrity sha512-Rk1uY76dGMnBFYILdXrb6Oc+jjblLdSzGZvDH1dyoFYs0bLWsjqVsOIE+kCjO447PgDOLyF+4nurLj+A9yCkEg== +"@abp/datatables.net-bs5@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-5.3.0-rc.3.tgz#f420208050a3a6f8e0ad3bcbb6af0e74584d2883" + integrity sha512-gwWMRElBQatElOdWyozYOY7lhYAUQu6/aZnf4XyiTlaWp6g1iMRJKgmaT73DhiIl+jxUiFtWjEla+65cXSl7sA== dependencies: - "@abp/datatables.net" "~5.3.0-rc.2" + "@abp/datatables.net" "~5.3.0-rc.3" datatables.net-bs5 "^1.11.4" -"@abp/datatables.net@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-5.3.0-rc.2.tgz#e7156085d76ab0b20e41fe92f9c99b14822b5f6a" - integrity sha512-aPSSmnBC939uYHR9fxxuvtxq4217qG3f8uf18ar7yWJwzWAYMOOhkmK0rEOqn86ObuXdjMAly7ThyfL6RH2iNQ== +"@abp/datatables.net@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-5.3.0-rc.3.tgz#e4b1f9fe41e788878f9cce082d6a79db9c4a8bae" + integrity sha512-FghO+XGSu9rwKOAUYC5AsB6hh1KrXAJ3GmHFYOIHrcd9nB/e60NtyoOo14TeO/LAFCVLOLq/FIBpEbkUZJZHkA== dependencies: - "@abp/jquery" "~5.3.0-rc.2" + "@abp/jquery" "~5.3.0-rc.3" datatables.net "^1.11.4" -"@abp/font-awesome@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-5.3.0-rc.2.tgz#30995f5f5f6d604cd2241ee677ec14dcfc78377d" - integrity sha512-KFwYcjiq01RxI75qnbDt+G8zFcSEJRurHHZQwcI7ySjtQV5xM41zycOYIOV3SKz/gcyYyBBL5UeJPjsE8cu+Fw== +"@abp/font-awesome@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-5.3.0-rc.3.tgz#ef97f0a95385f1d56d4432b84944379d2cb1bfbd" + integrity sha512-kbm9ZaK8SSMcoeBbMdT1b5rJOZ3y8i/bdqD+3g0s65LEeqXNrKV/TkDdJqns72x4PxUQV6r3naXaEbV6Yj/sXQ== dependencies: - "@abp/core" "~5.3.0-rc.2" + "@abp/core" "~5.3.0-rc.3" "@fortawesome/fontawesome-free" "^5.15.4" -"@abp/jquery-form@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-5.3.0-rc.2.tgz#53561d6966f25bf6f7e91dcb89032fecd2c35d1f" - integrity sha512-94ExZ5q02s7ANpFyQnEcuSUjyra+32jMMkV0ZITbjWlmFRcXEogeIF3q3B4XswRi+yf67kQg7ynYCbGR7JESDg== +"@abp/jquery-form@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-5.3.0-rc.3.tgz#497f0a442323d99a7939ba8f9e5234d1a1891e03" + integrity sha512-gknwOgCEF4oJo9Vz2uM2Dl9dkJ2ulJSLb6YXEsPWx5fAFfIuwOl/5H0I1EE4XemtcEpF6xb+Ettnaxo8TcnIcg== dependencies: - "@abp/jquery" "~5.3.0-rc.2" + "@abp/jquery" "~5.3.0-rc.3" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-5.3.0-rc.2.tgz#957387fb88414a50a5d3d84089ab3704b710645f" - integrity sha512-dIXsxqQ0x+xiLCA2x6xWR3wIvfpT0zukLFOrkCVNSc+mnWWyYlavRnGl3f5W/4jQSPZ9Ao/txhsThfkvO+Mu0Q== +"@abp/jquery-validation-unobtrusive@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-5.3.0-rc.3.tgz#a3e39dfb4ba2e0f45dcfde28bd22ff36c55173a0" + integrity sha512-zgSNkg/mzNDzvE+3cL58nLoV3EvFB/ALiLHudo8GcWsdFxx7R+2DfboCSFE1oJ8do6tED+9YG0/VJiZDXnFPwQ== dependencies: - "@abp/jquery-validation" "~5.3.0-rc.2" + "@abp/jquery-validation" "~5.3.0-rc.3" jquery-validation-unobtrusive "^3.2.12" -"@abp/jquery-validation@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-5.3.0-rc.2.tgz#d866b10ffbfc1852df11122aa2cf6a56e50819b3" - integrity sha512-DAxwKjalhMZNCuXBS6Ai9RlIDsEzm0SGnFDApQIo/i6HGKoK4J/eTnFZ175xZMQ79yrxe71MKWR29l/+PuwcRw== +"@abp/jquery-validation@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-5.3.0-rc.3.tgz#917a2b2e7e4b8e5aacdd10284f18f58bfac1743d" + integrity sha512-m2pPTGJs8MQzzdzMpWFD94RU4dqMrwwT4ZJyqz07EPzRv7NURGVlzJOPdwDiTVdiT5UsaYzDF0BYgfj3/FL/iw== dependencies: - "@abp/jquery" "~5.3.0-rc.2" + "@abp/jquery" "~5.3.0-rc.3" jquery-validation "^1.19.3" -"@abp/jquery@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-5.3.0-rc.2.tgz#8a5008123f5dbf1276c719ac45101161e9d9b793" - integrity sha512-VjA22n17pPKqj6jZUk6qxpqx2UT5Uv6q/AvyJtacDC3D1MXfrnSWxi9FAPFp4N52i4knkfuKFZtuFlFSkQe4FQ== +"@abp/jquery@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-5.3.0-rc.3.tgz#e75ca02fa0520c60b1aed14444fc129ed6a27d0b" + integrity sha512-ZJYpnFqByAzHKru1aGz8VLZw4xb/YD1wpahN9pIsPYeFrE6/7Vjs8npQk5it2Ww5gaA3unSrMIc0CMsr5kk0Nw== dependencies: - "@abp/core" "~5.3.0-rc.2" + "@abp/core" "~5.3.0-rc.3" jquery "~3.6.0" -"@abp/lodash@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-5.3.0-rc.2.tgz#51600a0ba49c6d4060c3e280b1f1d62ed7f48a16" - integrity sha512-qreUjH0umhsGKRSYpswcX1SAF1iNBp/AP32LMfvezvPaCA+KQFWknHuOTV2jn1tYC5c7KJTTTp46jRTi88VSHQ== +"@abp/lodash@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-5.3.0-rc.3.tgz#3fcc23626b9e36652ee36847b4a8879cf8aae8ef" + integrity sha512-KJFNAhW3AHi6AAhSlix50gbU9QmQT9TD5RYofEoIm1rfd7iZF0uowJheES0jqHU4PeS80Fnzp8AnBhVYgRMUjg== dependencies: - "@abp/core" "~5.3.0-rc.2" + "@abp/core" "~5.3.0-rc.3" lodash "^4.17.21" -"@abp/luxon@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-5.3.0-rc.2.tgz#6ea39998aaba2a3bd6e6dd3c9cacc1a0f56afa8f" - integrity sha512-9++6ZD0zEmJcH3iSNcTtC0haEVbQgxzoFx1wpEXsB3YVuBKUjJnJCXMbt0Qmkkq40tclmG8bfORRYhII29TLWA== +"@abp/luxon@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-5.3.0-rc.3.tgz#cf9e2070f3b3e1281dcf05ba1781d8daa41da98d" + integrity sha512-1gBfWwFrS+xuTD12dB/LLUbGWCATbByp1kCFbHdgVNOkkkDvJETS0LeB8o/ggw7rBWL5i3Jkpb5xFTRT6yKX4Q== dependencies: - "@abp/core" "~5.3.0-rc.2" + "@abp/core" "~5.3.0-rc.3" luxon "^2.3.0" -"@abp/malihu-custom-scrollbar-plugin@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-5.3.0-rc.2.tgz#069e071472eb8727260e9a1b5322e30cdaebffc9" - integrity sha512-JPaoNiYWR6T7Osx4ezURFanxC9ex1U9zr+7Fko1mmig8oZ+OHsk1cbdNBD5ChgAVsHdqK2eJ4iobDjhsDfMYiA== +"@abp/malihu-custom-scrollbar-plugin@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-5.3.0-rc.3.tgz#1d8d5cede65dbd0d0975d8fabfe135105710ddde" + integrity sha512-SW8UBKQGsS8zrG2RkmGBuze/NgreDWWJ84l2qMKYmTtgL/kOCLm4FBvo44azNOq6a3rYVJGpwirYRBcwrsAfHw== dependencies: - "@abp/core" "~5.3.0-rc.2" + "@abp/core" "~5.3.0-rc.3" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/select2@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-5.3.0-rc.2.tgz#50e622f2296c3594e89699e8747dcf520fb4415d" - integrity sha512-HwfiEgeECkzQhCf/3Je/V7pRtRvr3YQtX1gAWpI6Ty2P+nTV4ue/l1w5Si+59vuJm3JP+fCnSFPlHXxahfL/Gw== +"@abp/select2@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-5.3.0-rc.3.tgz#7a0f9f7472c812b85ce9bc5bd8a557c33e967e7d" + integrity sha512-6t+UXjDh3bzaCWsSxwuRtOgGz+aDidPKA2JKZfKLAFM4WkcLmY8Px0RY3jgsbxrtM9ANncA9gbl69Q3uY2DmHA== dependencies: - "@abp/core" "~5.3.0-rc.2" + "@abp/core" "~5.3.0-rc.3" select2 "^4.0.13" -"@abp/sweetalert2@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-5.3.0-rc.2.tgz#41d19b81011e3d5c9d12b8d6ec6da12e52553683" - integrity sha512-6Qx2WIpXQI/ydfX9P7cMISvwrFi4UAPzkuNkhPOZT7chq64auz88Rtqyw+SLXLnCCQ+e31/ekFldijOG9CbV1g== +"@abp/sweetalert2@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-5.3.0-rc.3.tgz#91557a4b4a103f68a926fde19c830e195597ff0d" + integrity sha512-hAw+E8EnGO9nnyGbGiD/y+SyScHD4R0MEi/eK2bsMSKAzBxKcUBv0MxrsNQc0WhVwqRQETRccdLX3WYofmh8Kw== dependencies: - "@abp/core" "~5.3.0-rc.2" + "@abp/core" "~5.3.0-rc.3" sweetalert2 "^11.3.6" -"@abp/timeago@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-5.3.0-rc.2.tgz#16f73659e83643d82eafac716115dbf0333cce98" - integrity sha512-fFvBX65Bzvg+x4vClzSh31FJJ2m6b2/s+IJ4/t4FNDxDqybfOzkAfRzPm7NVDw5Avu1fjRLwFhQueb0sECQD/w== +"@abp/timeago@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-5.3.0-rc.3.tgz#7480ed2d5ee035d2f43c223d7bb58d794ff3ba2f" + integrity sha512-kgIlH/KGWhYwZSGvCT5LnCYoD+1pSwoQf2GhtvgBUnYqxS6+s0FUSMSzX/MISLOvLWknl2KNnARsOXJkqrWXEw== dependencies: - "@abp/jquery" "~5.3.0-rc.2" + "@abp/jquery" "~5.3.0-rc.3" timeago "^1.6.7" -"@abp/toastr@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-5.3.0-rc.2.tgz#e868ffe7acc3e1838dd008f936e909250e360cc8" - integrity sha512-0BLjOSalZw7NdRXw4/SwPP7N+ChFGO2elEJ7zyd0c8Bi+Gz5lqL6ZW47O1ANKSv9HnPoyRsPDSBiCIvXXtlFOw== +"@abp/toastr@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-5.3.0-rc.3.tgz#1a6f03737c2ae92d62a8b7f51d4c70cc4d97212f" + integrity sha512-Vag9lz2YboyZ0/4Y/OvFG+EaY0PCs5X97ZijZRB+saSRe1pL1+qnBMpniMDUvbMEpitB5Qq+FqdkOnKdhlrH4A== dependencies: - "@abp/jquery" "~5.3.0-rc.2" + "@abp/jquery" "~5.3.0-rc.3" toastr "^2.1.4" -"@abp/utils@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-5.3.0-rc.2.tgz#cbdf34bb32f99396c2a7f6dd2f0fa0b5239413bb" - integrity sha512-0BgsxKwkiNcbBSDJIfxBObM4QYTk1umZ/WnKUdvSyv0Fe4hKK+gDvsBzk97O+ZVyBHIflvcln3dKpS3eIVwhIg== +"@abp/utils@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-5.3.0-rc.3.tgz#e91f10b18ac1e17af7f15c85257c24034cab2ba1" + integrity sha512-vMzsddCvI+M6Qd7Hns5KPUXqdFFboJwAOB9gvxj+MmjVNDCpFTo1hjq0H0zB6NHI8Ik+9sw44D0c7gkTdQQt7Q== dependencies: just-compare "^1.3.0" diff --git a/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo/package.json b/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo/package.json index f4cfda7d21..71d3a606ac 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": "^5.3.0-rc.2", - "@abp/prismjs": "^5.3.0-rc.2" + "@abp/aspnetcore.mvc.ui.theme.basic": "^5.3.0-rc.3", + "@abp/prismjs": "^5.3.0-rc.3" }, "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 f9898d010c..c8e695c6f2 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,37 +2,37 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.basic@^5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-5.3.0-rc.2.tgz#49da0f1ad2c0ec40eaacccae6874863fde954dda" - integrity sha512-Hb3ukaYMDhftkk7kQ9jVpkqhEoll8wU39/Qdy8JOlrJw3SDqqckWbVcJQkvetqa3mChy6kAVG3xe9ywG1h/6jA== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~5.3.0-rc.2" - -"@abp/aspnetcore.mvc.ui.theme.shared@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-5.3.0-rc.2.tgz#a4e6f033ee17fe7196e94047640bc826a69694a6" - integrity sha512-uKyb8by2dqYvCr9TCD0JKg2W+eLNcHanmQDL+aoI9OAExEEI/DYxw2a5++OntJGvmbcA6o1envmvOjqqsZuX0g== - dependencies: - "@abp/aspnetcore.mvc.ui" "~5.3.0-rc.2" - "@abp/bootstrap" "~5.3.0-rc.2" - "@abp/bootstrap-datepicker" "~5.3.0-rc.2" - "@abp/datatables.net-bs5" "~5.3.0-rc.2" - "@abp/font-awesome" "~5.3.0-rc.2" - "@abp/jquery-form" "~5.3.0-rc.2" - "@abp/jquery-validation-unobtrusive" "~5.3.0-rc.2" - "@abp/lodash" "~5.3.0-rc.2" - "@abp/luxon" "~5.3.0-rc.2" - "@abp/malihu-custom-scrollbar-plugin" "~5.3.0-rc.2" - "@abp/select2" "~5.3.0-rc.2" - "@abp/sweetalert2" "~5.3.0-rc.2" - "@abp/timeago" "~5.3.0-rc.2" - "@abp/toastr" "~5.3.0-rc.2" - -"@abp/aspnetcore.mvc.ui@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-5.3.0-rc.2.tgz#93a3c331cc75d2fbdd466a42777040466295f982" - integrity sha512-10RgXgZChbXNtXMblvvEZQctufJlP29RabfIOKWBTBMtU+jUgtDsLUwmF6Oi/65LLImOUogmBCb9MxjNm71iAQ== +"@abp/aspnetcore.mvc.ui.theme.basic@^5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-5.3.0-rc.3.tgz#726ce9dc03974ee192b3bb6a921a33fb69cf7f95" + integrity sha512-yOXp2ZXNGGDHWKHOXjudH1v7MK5ss1kpQ8DeorrboYybdmeWsq7BtrMIfvfudv8iCIWrg5Jmnf3GQ/7hBxdAdg== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~5.3.0-rc.3" + +"@abp/aspnetcore.mvc.ui.theme.shared@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-5.3.0-rc.3.tgz#34a752e71b965e762a81d758965a30d140501bc9" + integrity sha512-GnGhj6Y2DE1mrSWmp1jRnNvCsUiugWPKxlv1ue5dCdPVOw14OdXa6tLJwnZ38w9OOCDzXQyDUFdr19+uwOvEzQ== + dependencies: + "@abp/aspnetcore.mvc.ui" "~5.3.0-rc.3" + "@abp/bootstrap" "~5.3.0-rc.3" + "@abp/bootstrap-datepicker" "~5.3.0-rc.3" + "@abp/datatables.net-bs5" "~5.3.0-rc.3" + "@abp/font-awesome" "~5.3.0-rc.3" + "@abp/jquery-form" "~5.3.0-rc.3" + "@abp/jquery-validation-unobtrusive" "~5.3.0-rc.3" + "@abp/lodash" "~5.3.0-rc.3" + "@abp/luxon" "~5.3.0-rc.3" + "@abp/malihu-custom-scrollbar-plugin" "~5.3.0-rc.3" + "@abp/select2" "~5.3.0-rc.3" + "@abp/sweetalert2" "~5.3.0-rc.3" + "@abp/timeago" "~5.3.0-rc.3" + "@abp/toastr" "~5.3.0-rc.3" + +"@abp/aspnetcore.mvc.ui@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-5.3.0-rc.3.tgz#810821c844f4a1f248182ed9d3a8b54237b83124" + integrity sha512-1yvpDgZpYegL/JiwPdpCm/VjruEymt5VcamMYLPiUpmGTl0b7QFtUIwjSonE3gHEsBDXj9eCw9Kw3Bi+sd7NNQ== dependencies: ansi-colors "^4.1.1" extend-object "^1.0.0" @@ -41,161 +41,161 @@ merge-stream "^2.0.0" micromatch "^4.0.2" -"@abp/bootstrap-datepicker@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-5.3.0-rc.2.tgz#228735714f2baeb42e864c175e0aed3f855249d7" - integrity sha512-jZ7vGvsLjnXwpzvQ6vjKHWBkiptYBnEDVIfQ/zKV8kvkhdu+xxOP/u1LM90NSR2YckjIRj8+mINEcrnWhXgRNw== +"@abp/bootstrap-datepicker@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-5.3.0-rc.3.tgz#f98743539a1e8d883869aa7a759ba1aa00cd0689" + integrity sha512-VNNROxO1wzjG2q35wKEh4STluZllVggNhb0UyGtpZVNbtLydSxeFGHcve26f8UfEWE3WfC5Yyw8nBOHyJxh6tg== dependencies: bootstrap-datepicker "^1.9.0" -"@abp/bootstrap@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-5.3.0-rc.2.tgz#c410f44d987d09b5a74fd58417d03788fa878884" - integrity sha512-jb58M67kWldW35zTjVDFLaCj4STly2eU40COYFgjPQSH7F21DvMdX69Cp3jpmHaxm8VQE9izgW0NV8+oGlFyAw== +"@abp/bootstrap@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-5.3.0-rc.3.tgz#338b5ce194a257e5f14be2344b4e722874273ab1" + integrity sha512-fom2AboT9d1O3K1cOrIFT9l5Cvw2l42BvxEHkV3sXkZxZSstc9exURQn0WmKxWnOMCwM03N2IMKsFlk6SePN2A== dependencies: - "@abp/core" "~5.3.0-rc.2" + "@abp/core" "~5.3.0-rc.3" bootstrap "^5.1.3" -"@abp/clipboard@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-5.3.0-rc.2.tgz#e9a4f38a5d33d88a5c2440422a87e403671b3ed8" - integrity sha512-8OKcmGych7cmcYn8tuUmGo+mMlThNBDZA71c/cVAGw1RuLM16SCgeJVeVFhyUrmkBwH/E5Hfh06ZLlIrZKj36Q== +"@abp/clipboard@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-5.3.0-rc.3.tgz#30ed8014dfc383f53df91553cef8d405a6d9070a" + integrity sha512-4IVMgasvomY8Q0m1Y48VJr5TK3+BmeAQhEp+B4h2whE+/uIFpAhFWS5U0Bie9GjqQdEEqJ1a01tn16fK9jpzcw== dependencies: - "@abp/core" "~5.3.0-rc.2" + "@abp/core" "~5.3.0-rc.3" clipboard "^2.0.8" -"@abp/core@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-5.3.0-rc.2.tgz#3a3c6d187c502436bb02db99be3720f61628c924" - integrity sha512-/BEO90D7ibeyZxfCQHv2bbb9y/SpfZtaw0A8gmQlYrH3rZ3Th935v5XjCeYem8IGJ8fDZO7CRzW5TBsku/PukA== +"@abp/core@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-5.3.0-rc.3.tgz#7846bd8582bbb9effdb058b3b815fc1798b33f01" + integrity sha512-RyFoereWj/YOccWFeB5yq4aktKnYl44xrb6LKNkCmcVadbOJ+7AHgHljychTuMZalTvfzW2GcZacIoHw4bhn/A== dependencies: - "@abp/utils" "~5.3.0-rc.2" + "@abp/utils" "~5.3.0-rc.3" -"@abp/datatables.net-bs5@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-5.3.0-rc.2.tgz#452c2112fbe3cdac8c0d12bb626017f7c6333a45" - integrity sha512-Rk1uY76dGMnBFYILdXrb6Oc+jjblLdSzGZvDH1dyoFYs0bLWsjqVsOIE+kCjO447PgDOLyF+4nurLj+A9yCkEg== +"@abp/datatables.net-bs5@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-5.3.0-rc.3.tgz#f420208050a3a6f8e0ad3bcbb6af0e74584d2883" + integrity sha512-gwWMRElBQatElOdWyozYOY7lhYAUQu6/aZnf4XyiTlaWp6g1iMRJKgmaT73DhiIl+jxUiFtWjEla+65cXSl7sA== dependencies: - "@abp/datatables.net" "~5.3.0-rc.2" + "@abp/datatables.net" "~5.3.0-rc.3" datatables.net-bs5 "^1.11.4" -"@abp/datatables.net@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-5.3.0-rc.2.tgz#e7156085d76ab0b20e41fe92f9c99b14822b5f6a" - integrity sha512-aPSSmnBC939uYHR9fxxuvtxq4217qG3f8uf18ar7yWJwzWAYMOOhkmK0rEOqn86ObuXdjMAly7ThyfL6RH2iNQ== +"@abp/datatables.net@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-5.3.0-rc.3.tgz#e4b1f9fe41e788878f9cce082d6a79db9c4a8bae" + integrity sha512-FghO+XGSu9rwKOAUYC5AsB6hh1KrXAJ3GmHFYOIHrcd9nB/e60NtyoOo14TeO/LAFCVLOLq/FIBpEbkUZJZHkA== dependencies: - "@abp/jquery" "~5.3.0-rc.2" + "@abp/jquery" "~5.3.0-rc.3" datatables.net "^1.11.4" -"@abp/font-awesome@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-5.3.0-rc.2.tgz#30995f5f5f6d604cd2241ee677ec14dcfc78377d" - integrity sha512-KFwYcjiq01RxI75qnbDt+G8zFcSEJRurHHZQwcI7ySjtQV5xM41zycOYIOV3SKz/gcyYyBBL5UeJPjsE8cu+Fw== +"@abp/font-awesome@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-5.3.0-rc.3.tgz#ef97f0a95385f1d56d4432b84944379d2cb1bfbd" + integrity sha512-kbm9ZaK8SSMcoeBbMdT1b5rJOZ3y8i/bdqD+3g0s65LEeqXNrKV/TkDdJqns72x4PxUQV6r3naXaEbV6Yj/sXQ== dependencies: - "@abp/core" "~5.3.0-rc.2" + "@abp/core" "~5.3.0-rc.3" "@fortawesome/fontawesome-free" "^5.15.4" -"@abp/jquery-form@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-5.3.0-rc.2.tgz#53561d6966f25bf6f7e91dcb89032fecd2c35d1f" - integrity sha512-94ExZ5q02s7ANpFyQnEcuSUjyra+32jMMkV0ZITbjWlmFRcXEogeIF3q3B4XswRi+yf67kQg7ynYCbGR7JESDg== +"@abp/jquery-form@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-5.3.0-rc.3.tgz#497f0a442323d99a7939ba8f9e5234d1a1891e03" + integrity sha512-gknwOgCEF4oJo9Vz2uM2Dl9dkJ2ulJSLb6YXEsPWx5fAFfIuwOl/5H0I1EE4XemtcEpF6xb+Ettnaxo8TcnIcg== dependencies: - "@abp/jquery" "~5.3.0-rc.2" + "@abp/jquery" "~5.3.0-rc.3" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-5.3.0-rc.2.tgz#957387fb88414a50a5d3d84089ab3704b710645f" - integrity sha512-dIXsxqQ0x+xiLCA2x6xWR3wIvfpT0zukLFOrkCVNSc+mnWWyYlavRnGl3f5W/4jQSPZ9Ao/txhsThfkvO+Mu0Q== +"@abp/jquery-validation-unobtrusive@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-5.3.0-rc.3.tgz#a3e39dfb4ba2e0f45dcfde28bd22ff36c55173a0" + integrity sha512-zgSNkg/mzNDzvE+3cL58nLoV3EvFB/ALiLHudo8GcWsdFxx7R+2DfboCSFE1oJ8do6tED+9YG0/VJiZDXnFPwQ== dependencies: - "@abp/jquery-validation" "~5.3.0-rc.2" + "@abp/jquery-validation" "~5.3.0-rc.3" jquery-validation-unobtrusive "^3.2.12" -"@abp/jquery-validation@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-5.3.0-rc.2.tgz#d866b10ffbfc1852df11122aa2cf6a56e50819b3" - integrity sha512-DAxwKjalhMZNCuXBS6Ai9RlIDsEzm0SGnFDApQIo/i6HGKoK4J/eTnFZ175xZMQ79yrxe71MKWR29l/+PuwcRw== +"@abp/jquery-validation@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-5.3.0-rc.3.tgz#917a2b2e7e4b8e5aacdd10284f18f58bfac1743d" + integrity sha512-m2pPTGJs8MQzzdzMpWFD94RU4dqMrwwT4ZJyqz07EPzRv7NURGVlzJOPdwDiTVdiT5UsaYzDF0BYgfj3/FL/iw== dependencies: - "@abp/jquery" "~5.3.0-rc.2" + "@abp/jquery" "~5.3.0-rc.3" jquery-validation "^1.19.3" -"@abp/jquery@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-5.3.0-rc.2.tgz#8a5008123f5dbf1276c719ac45101161e9d9b793" - integrity sha512-VjA22n17pPKqj6jZUk6qxpqx2UT5Uv6q/AvyJtacDC3D1MXfrnSWxi9FAPFp4N52i4knkfuKFZtuFlFSkQe4FQ== +"@abp/jquery@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-5.3.0-rc.3.tgz#e75ca02fa0520c60b1aed14444fc129ed6a27d0b" + integrity sha512-ZJYpnFqByAzHKru1aGz8VLZw4xb/YD1wpahN9pIsPYeFrE6/7Vjs8npQk5it2Ww5gaA3unSrMIc0CMsr5kk0Nw== dependencies: - "@abp/core" "~5.3.0-rc.2" + "@abp/core" "~5.3.0-rc.3" jquery "~3.6.0" -"@abp/lodash@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-5.3.0-rc.2.tgz#51600a0ba49c6d4060c3e280b1f1d62ed7f48a16" - integrity sha512-qreUjH0umhsGKRSYpswcX1SAF1iNBp/AP32LMfvezvPaCA+KQFWknHuOTV2jn1tYC5c7KJTTTp46jRTi88VSHQ== +"@abp/lodash@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-5.3.0-rc.3.tgz#3fcc23626b9e36652ee36847b4a8879cf8aae8ef" + integrity sha512-KJFNAhW3AHi6AAhSlix50gbU9QmQT9TD5RYofEoIm1rfd7iZF0uowJheES0jqHU4PeS80Fnzp8AnBhVYgRMUjg== dependencies: - "@abp/core" "~5.3.0-rc.2" + "@abp/core" "~5.3.0-rc.3" lodash "^4.17.21" -"@abp/luxon@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-5.3.0-rc.2.tgz#6ea39998aaba2a3bd6e6dd3c9cacc1a0f56afa8f" - integrity sha512-9++6ZD0zEmJcH3iSNcTtC0haEVbQgxzoFx1wpEXsB3YVuBKUjJnJCXMbt0Qmkkq40tclmG8bfORRYhII29TLWA== +"@abp/luxon@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-5.3.0-rc.3.tgz#cf9e2070f3b3e1281dcf05ba1781d8daa41da98d" + integrity sha512-1gBfWwFrS+xuTD12dB/LLUbGWCATbByp1kCFbHdgVNOkkkDvJETS0LeB8o/ggw7rBWL5i3Jkpb5xFTRT6yKX4Q== dependencies: - "@abp/core" "~5.3.0-rc.2" + "@abp/core" "~5.3.0-rc.3" luxon "^2.3.0" -"@abp/malihu-custom-scrollbar-plugin@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-5.3.0-rc.2.tgz#069e071472eb8727260e9a1b5322e30cdaebffc9" - integrity sha512-JPaoNiYWR6T7Osx4ezURFanxC9ex1U9zr+7Fko1mmig8oZ+OHsk1cbdNBD5ChgAVsHdqK2eJ4iobDjhsDfMYiA== +"@abp/malihu-custom-scrollbar-plugin@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-5.3.0-rc.3.tgz#1d8d5cede65dbd0d0975d8fabfe135105710ddde" + integrity sha512-SW8UBKQGsS8zrG2RkmGBuze/NgreDWWJ84l2qMKYmTtgL/kOCLm4FBvo44azNOq6a3rYVJGpwirYRBcwrsAfHw== dependencies: - "@abp/core" "~5.3.0-rc.2" + "@abp/core" "~5.3.0-rc.3" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/prismjs@^5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-5.3.0-rc.2.tgz#8a5ed8032a1e8ba7644adbffae9efdc18c3811f7" - integrity sha512-G7ab7PL0TcjtvA9rdFj0RajP0pXZrXmIzKZ/vtQqW6mNLXNCI1OKJ/fAXXwS35gFEyVPvn9xKPnuYlhwqWl6ug== +"@abp/prismjs@^5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-5.3.0-rc.3.tgz#c382946b15c820a01e3833ba5c4b3f6d52f8365c" + integrity sha512-a/lahdqzBEcsQ8j9Vjg8KC8xyDroGBi+4NIV2wb+k0CAaA49L25lfq0RSCji5RgyZ9Hjznhg/NyD6AFKaB3ykA== dependencies: - "@abp/clipboard" "~5.3.0-rc.2" - "@abp/core" "~5.3.0-rc.2" + "@abp/clipboard" "~5.3.0-rc.3" + "@abp/core" "~5.3.0-rc.3" prismjs "^1.26.0" -"@abp/select2@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-5.3.0-rc.2.tgz#50e622f2296c3594e89699e8747dcf520fb4415d" - integrity sha512-HwfiEgeECkzQhCf/3Je/V7pRtRvr3YQtX1gAWpI6Ty2P+nTV4ue/l1w5Si+59vuJm3JP+fCnSFPlHXxahfL/Gw== +"@abp/select2@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-5.3.0-rc.3.tgz#7a0f9f7472c812b85ce9bc5bd8a557c33e967e7d" + integrity sha512-6t+UXjDh3bzaCWsSxwuRtOgGz+aDidPKA2JKZfKLAFM4WkcLmY8Px0RY3jgsbxrtM9ANncA9gbl69Q3uY2DmHA== dependencies: - "@abp/core" "~5.3.0-rc.2" + "@abp/core" "~5.3.0-rc.3" select2 "^4.0.13" -"@abp/sweetalert2@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-5.3.0-rc.2.tgz#41d19b81011e3d5c9d12b8d6ec6da12e52553683" - integrity sha512-6Qx2WIpXQI/ydfX9P7cMISvwrFi4UAPzkuNkhPOZT7chq64auz88Rtqyw+SLXLnCCQ+e31/ekFldijOG9CbV1g== +"@abp/sweetalert2@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-5.3.0-rc.3.tgz#91557a4b4a103f68a926fde19c830e195597ff0d" + integrity sha512-hAw+E8EnGO9nnyGbGiD/y+SyScHD4R0MEi/eK2bsMSKAzBxKcUBv0MxrsNQc0WhVwqRQETRccdLX3WYofmh8Kw== dependencies: - "@abp/core" "~5.3.0-rc.2" + "@abp/core" "~5.3.0-rc.3" sweetalert2 "^11.3.6" -"@abp/timeago@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-5.3.0-rc.2.tgz#16f73659e83643d82eafac716115dbf0333cce98" - integrity sha512-fFvBX65Bzvg+x4vClzSh31FJJ2m6b2/s+IJ4/t4FNDxDqybfOzkAfRzPm7NVDw5Avu1fjRLwFhQueb0sECQD/w== +"@abp/timeago@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-5.3.0-rc.3.tgz#7480ed2d5ee035d2f43c223d7bb58d794ff3ba2f" + integrity sha512-kgIlH/KGWhYwZSGvCT5LnCYoD+1pSwoQf2GhtvgBUnYqxS6+s0FUSMSzX/MISLOvLWknl2KNnARsOXJkqrWXEw== dependencies: - "@abp/jquery" "~5.3.0-rc.2" + "@abp/jquery" "~5.3.0-rc.3" timeago "^1.6.7" -"@abp/toastr@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-5.3.0-rc.2.tgz#e868ffe7acc3e1838dd008f936e909250e360cc8" - integrity sha512-0BLjOSalZw7NdRXw4/SwPP7N+ChFGO2elEJ7zyd0c8Bi+Gz5lqL6ZW47O1ANKSv9HnPoyRsPDSBiCIvXXtlFOw== +"@abp/toastr@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-5.3.0-rc.3.tgz#1a6f03737c2ae92d62a8b7f51d4c70cc4d97212f" + integrity sha512-Vag9lz2YboyZ0/4Y/OvFG+EaY0PCs5X97ZijZRB+saSRe1pL1+qnBMpniMDUvbMEpitB5Qq+FqdkOnKdhlrH4A== dependencies: - "@abp/jquery" "~5.3.0-rc.2" + "@abp/jquery" "~5.3.0-rc.3" toastr "^2.1.4" -"@abp/utils@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-5.3.0-rc.2.tgz#cbdf34bb32f99396c2a7f6dd2f0fa0b5239413bb" - integrity sha512-0BgsxKwkiNcbBSDJIfxBObM4QYTk1umZ/WnKUdvSyv0Fe4hKK+gDvsBzk97O+ZVyBHIflvcln3dKpS3eIVwhIg== +"@abp/utils@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-5.3.0-rc.3.tgz#e91f10b18ac1e17af7f15c85257c24034cab2ba1" + integrity sha512-vMzsddCvI+M6Qd7Hns5KPUXqdFFboJwAOB9gvxj+MmjVNDCpFTo1hjq0H0zB6NHI8Ik+9sw44D0c7gkTdQQt7Q== dependencies: just-compare "^1.3.0" diff --git a/modules/blogging/app/Volo.BloggingTestApp/package.json b/modules/blogging/app/Volo.BloggingTestApp/package.json index 81fc97bf0a..8f0fc7b4b4 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": "^5.3.0-rc.2", - "@abp/blogging": "^5.3.0-rc.2" + "@abp/aspnetcore.mvc.ui.theme.basic": "^5.3.0-rc.3", + "@abp/blogging": "^5.3.0-rc.3" } } diff --git a/modules/blogging/app/Volo.BloggingTestApp/yarn.lock b/modules/blogging/app/Volo.BloggingTestApp/yarn.lock index 9f4e5f22a2..c0057410c3 100644 --- a/modules/blogging/app/Volo.BloggingTestApp/yarn.lock +++ b/modules/blogging/app/Volo.BloggingTestApp/yarn.lock @@ -2,37 +2,37 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.basic@^5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-5.3.0-rc.2.tgz#49da0f1ad2c0ec40eaacccae6874863fde954dda" - integrity sha512-Hb3ukaYMDhftkk7kQ9jVpkqhEoll8wU39/Qdy8JOlrJw3SDqqckWbVcJQkvetqa3mChy6kAVG3xe9ywG1h/6jA== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~5.3.0-rc.2" - -"@abp/aspnetcore.mvc.ui.theme.shared@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-5.3.0-rc.2.tgz#a4e6f033ee17fe7196e94047640bc826a69694a6" - integrity sha512-uKyb8by2dqYvCr9TCD0JKg2W+eLNcHanmQDL+aoI9OAExEEI/DYxw2a5++OntJGvmbcA6o1envmvOjqqsZuX0g== - dependencies: - "@abp/aspnetcore.mvc.ui" "~5.3.0-rc.2" - "@abp/bootstrap" "~5.3.0-rc.2" - "@abp/bootstrap-datepicker" "~5.3.0-rc.2" - "@abp/datatables.net-bs5" "~5.3.0-rc.2" - "@abp/font-awesome" "~5.3.0-rc.2" - "@abp/jquery-form" "~5.3.0-rc.2" - "@abp/jquery-validation-unobtrusive" "~5.3.0-rc.2" - "@abp/lodash" "~5.3.0-rc.2" - "@abp/luxon" "~5.3.0-rc.2" - "@abp/malihu-custom-scrollbar-plugin" "~5.3.0-rc.2" - "@abp/select2" "~5.3.0-rc.2" - "@abp/sweetalert2" "~5.3.0-rc.2" - "@abp/timeago" "~5.3.0-rc.2" - "@abp/toastr" "~5.3.0-rc.2" - -"@abp/aspnetcore.mvc.ui@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-5.3.0-rc.2.tgz#93a3c331cc75d2fbdd466a42777040466295f982" - integrity sha512-10RgXgZChbXNtXMblvvEZQctufJlP29RabfIOKWBTBMtU+jUgtDsLUwmF6Oi/65LLImOUogmBCb9MxjNm71iAQ== +"@abp/aspnetcore.mvc.ui.theme.basic@^5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-5.3.0-rc.3.tgz#726ce9dc03974ee192b3bb6a921a33fb69cf7f95" + integrity sha512-yOXp2ZXNGGDHWKHOXjudH1v7MK5ss1kpQ8DeorrboYybdmeWsq7BtrMIfvfudv8iCIWrg5Jmnf3GQ/7hBxdAdg== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~5.3.0-rc.3" + +"@abp/aspnetcore.mvc.ui.theme.shared@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-5.3.0-rc.3.tgz#34a752e71b965e762a81d758965a30d140501bc9" + integrity sha512-GnGhj6Y2DE1mrSWmp1jRnNvCsUiugWPKxlv1ue5dCdPVOw14OdXa6tLJwnZ38w9OOCDzXQyDUFdr19+uwOvEzQ== + dependencies: + "@abp/aspnetcore.mvc.ui" "~5.3.0-rc.3" + "@abp/bootstrap" "~5.3.0-rc.3" + "@abp/bootstrap-datepicker" "~5.3.0-rc.3" + "@abp/datatables.net-bs5" "~5.3.0-rc.3" + "@abp/font-awesome" "~5.3.0-rc.3" + "@abp/jquery-form" "~5.3.0-rc.3" + "@abp/jquery-validation-unobtrusive" "~5.3.0-rc.3" + "@abp/lodash" "~5.3.0-rc.3" + "@abp/luxon" "~5.3.0-rc.3" + "@abp/malihu-custom-scrollbar-plugin" "~5.3.0-rc.3" + "@abp/select2" "~5.3.0-rc.3" + "@abp/sweetalert2" "~5.3.0-rc.3" + "@abp/timeago" "~5.3.0-rc.3" + "@abp/toastr" "~5.3.0-rc.3" + +"@abp/aspnetcore.mvc.ui@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-5.3.0-rc.3.tgz#810821c844f4a1f248182ed9d3a8b54237b83124" + integrity sha512-1yvpDgZpYegL/JiwPdpCm/VjruEymt5VcamMYLPiUpmGTl0b7QFtUIwjSonE3gHEsBDXj9eCw9Kw3Bi+sd7NNQ== dependencies: ansi-colors "^4.1.1" extend-object "^1.0.0" @@ -41,187 +41,187 @@ merge-stream "^2.0.0" micromatch "^4.0.2" -"@abp/blogging@^5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/blogging/-/blogging-5.3.0-rc.2.tgz#8677f547a4828a948f58e1f0078019d084676d5e" - integrity sha512-wFEg+X2HCXHpie7dsbvkKZpk7iumF9hw4Nz3Kct6YkfXfAi/fpUM9cA3/0kLwkVkPlE5Hp6Tq5nBManIJ0BjWw== +"@abp/blogging@^5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/blogging/-/blogging-5.3.0-rc.3.tgz#8fae4cde6d81edd1a00fe79cb42c7f05ed21bb69" + integrity sha512-xJ1VIAPCKRJBp9nMl51G+T5/arBFBHRVX3JXssnzimT1QbPqeDHaDjw3QIYoKPvXif5WvGs1xtmaXrCm9wXVSA== dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~5.3.0-rc.2" - "@abp/owl.carousel" "~5.3.0-rc.2" - "@abp/prismjs" "~5.3.0-rc.2" - "@abp/tui-editor" "~5.3.0-rc.2" + "@abp/aspnetcore.mvc.ui.theme.shared" "~5.3.0-rc.3" + "@abp/owl.carousel" "~5.3.0-rc.3" + "@abp/prismjs" "~5.3.0-rc.3" + "@abp/tui-editor" "~5.3.0-rc.3" -"@abp/bootstrap-datepicker@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-5.3.0-rc.2.tgz#228735714f2baeb42e864c175e0aed3f855249d7" - integrity sha512-jZ7vGvsLjnXwpzvQ6vjKHWBkiptYBnEDVIfQ/zKV8kvkhdu+xxOP/u1LM90NSR2YckjIRj8+mINEcrnWhXgRNw== +"@abp/bootstrap-datepicker@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-5.3.0-rc.3.tgz#f98743539a1e8d883869aa7a759ba1aa00cd0689" + integrity sha512-VNNROxO1wzjG2q35wKEh4STluZllVggNhb0UyGtpZVNbtLydSxeFGHcve26f8UfEWE3WfC5Yyw8nBOHyJxh6tg== dependencies: bootstrap-datepicker "^1.9.0" -"@abp/bootstrap@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-5.3.0-rc.2.tgz#c410f44d987d09b5a74fd58417d03788fa878884" - integrity sha512-jb58M67kWldW35zTjVDFLaCj4STly2eU40COYFgjPQSH7F21DvMdX69Cp3jpmHaxm8VQE9izgW0NV8+oGlFyAw== +"@abp/bootstrap@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-5.3.0-rc.3.tgz#338b5ce194a257e5f14be2344b4e722874273ab1" + integrity sha512-fom2AboT9d1O3K1cOrIFT9l5Cvw2l42BvxEHkV3sXkZxZSstc9exURQn0WmKxWnOMCwM03N2IMKsFlk6SePN2A== dependencies: - "@abp/core" "~5.3.0-rc.2" + "@abp/core" "~5.3.0-rc.3" bootstrap "^5.1.3" -"@abp/clipboard@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-5.3.0-rc.2.tgz#e9a4f38a5d33d88a5c2440422a87e403671b3ed8" - integrity sha512-8OKcmGych7cmcYn8tuUmGo+mMlThNBDZA71c/cVAGw1RuLM16SCgeJVeVFhyUrmkBwH/E5Hfh06ZLlIrZKj36Q== +"@abp/clipboard@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-5.3.0-rc.3.tgz#30ed8014dfc383f53df91553cef8d405a6d9070a" + integrity sha512-4IVMgasvomY8Q0m1Y48VJr5TK3+BmeAQhEp+B4h2whE+/uIFpAhFWS5U0Bie9GjqQdEEqJ1a01tn16fK9jpzcw== dependencies: - "@abp/core" "~5.3.0-rc.2" + "@abp/core" "~5.3.0-rc.3" clipboard "^2.0.8" -"@abp/core@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-5.3.0-rc.2.tgz#3a3c6d187c502436bb02db99be3720f61628c924" - integrity sha512-/BEO90D7ibeyZxfCQHv2bbb9y/SpfZtaw0A8gmQlYrH3rZ3Th935v5XjCeYem8IGJ8fDZO7CRzW5TBsku/PukA== +"@abp/core@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-5.3.0-rc.3.tgz#7846bd8582bbb9effdb058b3b815fc1798b33f01" + integrity sha512-RyFoereWj/YOccWFeB5yq4aktKnYl44xrb6LKNkCmcVadbOJ+7AHgHljychTuMZalTvfzW2GcZacIoHw4bhn/A== dependencies: - "@abp/utils" "~5.3.0-rc.2" + "@abp/utils" "~5.3.0-rc.3" -"@abp/datatables.net-bs5@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-5.3.0-rc.2.tgz#452c2112fbe3cdac8c0d12bb626017f7c6333a45" - integrity sha512-Rk1uY76dGMnBFYILdXrb6Oc+jjblLdSzGZvDH1dyoFYs0bLWsjqVsOIE+kCjO447PgDOLyF+4nurLj+A9yCkEg== +"@abp/datatables.net-bs5@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-5.3.0-rc.3.tgz#f420208050a3a6f8e0ad3bcbb6af0e74584d2883" + integrity sha512-gwWMRElBQatElOdWyozYOY7lhYAUQu6/aZnf4XyiTlaWp6g1iMRJKgmaT73DhiIl+jxUiFtWjEla+65cXSl7sA== dependencies: - "@abp/datatables.net" "~5.3.0-rc.2" + "@abp/datatables.net" "~5.3.0-rc.3" datatables.net-bs5 "^1.11.4" -"@abp/datatables.net@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-5.3.0-rc.2.tgz#e7156085d76ab0b20e41fe92f9c99b14822b5f6a" - integrity sha512-aPSSmnBC939uYHR9fxxuvtxq4217qG3f8uf18ar7yWJwzWAYMOOhkmK0rEOqn86ObuXdjMAly7ThyfL6RH2iNQ== +"@abp/datatables.net@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-5.3.0-rc.3.tgz#e4b1f9fe41e788878f9cce082d6a79db9c4a8bae" + integrity sha512-FghO+XGSu9rwKOAUYC5AsB6hh1KrXAJ3GmHFYOIHrcd9nB/e60NtyoOo14TeO/LAFCVLOLq/FIBpEbkUZJZHkA== dependencies: - "@abp/jquery" "~5.3.0-rc.2" + "@abp/jquery" "~5.3.0-rc.3" datatables.net "^1.11.4" -"@abp/font-awesome@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-5.3.0-rc.2.tgz#30995f5f5f6d604cd2241ee677ec14dcfc78377d" - integrity sha512-KFwYcjiq01RxI75qnbDt+G8zFcSEJRurHHZQwcI7ySjtQV5xM41zycOYIOV3SKz/gcyYyBBL5UeJPjsE8cu+Fw== +"@abp/font-awesome@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-5.3.0-rc.3.tgz#ef97f0a95385f1d56d4432b84944379d2cb1bfbd" + integrity sha512-kbm9ZaK8SSMcoeBbMdT1b5rJOZ3y8i/bdqD+3g0s65LEeqXNrKV/TkDdJqns72x4PxUQV6r3naXaEbV6Yj/sXQ== dependencies: - "@abp/core" "~5.3.0-rc.2" + "@abp/core" "~5.3.0-rc.3" "@fortawesome/fontawesome-free" "^5.15.4" -"@abp/jquery-form@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-5.3.0-rc.2.tgz#53561d6966f25bf6f7e91dcb89032fecd2c35d1f" - integrity sha512-94ExZ5q02s7ANpFyQnEcuSUjyra+32jMMkV0ZITbjWlmFRcXEogeIF3q3B4XswRi+yf67kQg7ynYCbGR7JESDg== +"@abp/jquery-form@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-5.3.0-rc.3.tgz#497f0a442323d99a7939ba8f9e5234d1a1891e03" + integrity sha512-gknwOgCEF4oJo9Vz2uM2Dl9dkJ2ulJSLb6YXEsPWx5fAFfIuwOl/5H0I1EE4XemtcEpF6xb+Ettnaxo8TcnIcg== dependencies: - "@abp/jquery" "~5.3.0-rc.2" + "@abp/jquery" "~5.3.0-rc.3" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-5.3.0-rc.2.tgz#957387fb88414a50a5d3d84089ab3704b710645f" - integrity sha512-dIXsxqQ0x+xiLCA2x6xWR3wIvfpT0zukLFOrkCVNSc+mnWWyYlavRnGl3f5W/4jQSPZ9Ao/txhsThfkvO+Mu0Q== +"@abp/jquery-validation-unobtrusive@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-5.3.0-rc.3.tgz#a3e39dfb4ba2e0f45dcfde28bd22ff36c55173a0" + integrity sha512-zgSNkg/mzNDzvE+3cL58nLoV3EvFB/ALiLHudo8GcWsdFxx7R+2DfboCSFE1oJ8do6tED+9YG0/VJiZDXnFPwQ== dependencies: - "@abp/jquery-validation" "~5.3.0-rc.2" + "@abp/jquery-validation" "~5.3.0-rc.3" jquery-validation-unobtrusive "^3.2.12" -"@abp/jquery-validation@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-5.3.0-rc.2.tgz#d866b10ffbfc1852df11122aa2cf6a56e50819b3" - integrity sha512-DAxwKjalhMZNCuXBS6Ai9RlIDsEzm0SGnFDApQIo/i6HGKoK4J/eTnFZ175xZMQ79yrxe71MKWR29l/+PuwcRw== +"@abp/jquery-validation@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-5.3.0-rc.3.tgz#917a2b2e7e4b8e5aacdd10284f18f58bfac1743d" + integrity sha512-m2pPTGJs8MQzzdzMpWFD94RU4dqMrwwT4ZJyqz07EPzRv7NURGVlzJOPdwDiTVdiT5UsaYzDF0BYgfj3/FL/iw== dependencies: - "@abp/jquery" "~5.3.0-rc.2" + "@abp/jquery" "~5.3.0-rc.3" jquery-validation "^1.19.3" -"@abp/jquery@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-5.3.0-rc.2.tgz#8a5008123f5dbf1276c719ac45101161e9d9b793" - integrity sha512-VjA22n17pPKqj6jZUk6qxpqx2UT5Uv6q/AvyJtacDC3D1MXfrnSWxi9FAPFp4N52i4knkfuKFZtuFlFSkQe4FQ== +"@abp/jquery@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-5.3.0-rc.3.tgz#e75ca02fa0520c60b1aed14444fc129ed6a27d0b" + integrity sha512-ZJYpnFqByAzHKru1aGz8VLZw4xb/YD1wpahN9pIsPYeFrE6/7Vjs8npQk5it2Ww5gaA3unSrMIc0CMsr5kk0Nw== dependencies: - "@abp/core" "~5.3.0-rc.2" + "@abp/core" "~5.3.0-rc.3" jquery "~3.6.0" -"@abp/lodash@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-5.3.0-rc.2.tgz#51600a0ba49c6d4060c3e280b1f1d62ed7f48a16" - integrity sha512-qreUjH0umhsGKRSYpswcX1SAF1iNBp/AP32LMfvezvPaCA+KQFWknHuOTV2jn1tYC5c7KJTTTp46jRTi88VSHQ== +"@abp/lodash@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-5.3.0-rc.3.tgz#3fcc23626b9e36652ee36847b4a8879cf8aae8ef" + integrity sha512-KJFNAhW3AHi6AAhSlix50gbU9QmQT9TD5RYofEoIm1rfd7iZF0uowJheES0jqHU4PeS80Fnzp8AnBhVYgRMUjg== dependencies: - "@abp/core" "~5.3.0-rc.2" + "@abp/core" "~5.3.0-rc.3" lodash "^4.17.21" -"@abp/luxon@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-5.3.0-rc.2.tgz#6ea39998aaba2a3bd6e6dd3c9cacc1a0f56afa8f" - integrity sha512-9++6ZD0zEmJcH3iSNcTtC0haEVbQgxzoFx1wpEXsB3YVuBKUjJnJCXMbt0Qmkkq40tclmG8bfORRYhII29TLWA== +"@abp/luxon@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-5.3.0-rc.3.tgz#cf9e2070f3b3e1281dcf05ba1781d8daa41da98d" + integrity sha512-1gBfWwFrS+xuTD12dB/LLUbGWCATbByp1kCFbHdgVNOkkkDvJETS0LeB8o/ggw7rBWL5i3Jkpb5xFTRT6yKX4Q== dependencies: - "@abp/core" "~5.3.0-rc.2" + "@abp/core" "~5.3.0-rc.3" luxon "^2.3.0" -"@abp/malihu-custom-scrollbar-plugin@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-5.3.0-rc.2.tgz#069e071472eb8727260e9a1b5322e30cdaebffc9" - integrity sha512-JPaoNiYWR6T7Osx4ezURFanxC9ex1U9zr+7Fko1mmig8oZ+OHsk1cbdNBD5ChgAVsHdqK2eJ4iobDjhsDfMYiA== +"@abp/malihu-custom-scrollbar-plugin@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-5.3.0-rc.3.tgz#1d8d5cede65dbd0d0975d8fabfe135105710ddde" + integrity sha512-SW8UBKQGsS8zrG2RkmGBuze/NgreDWWJ84l2qMKYmTtgL/kOCLm4FBvo44azNOq6a3rYVJGpwirYRBcwrsAfHw== dependencies: - "@abp/core" "~5.3.0-rc.2" + "@abp/core" "~5.3.0-rc.3" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/owl.carousel@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/owl.carousel/-/owl.carousel-5.3.0-rc.2.tgz#79fc806a2905fb7a2b93f3c7be124aa490dcb6bd" - integrity sha512-xDZw2pgz3ORMblgY2armom7Kn+q0ygQgrBlzjcz0jO3+V0krmTiT+NnQUNZca2fPhrX29eznO/INWTgw90uhcg== +"@abp/owl.carousel@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/owl.carousel/-/owl.carousel-5.3.0-rc.3.tgz#658a1703840205eb510c5183ae8b1dfdc18ae935" + integrity sha512-HgUsMdQEPOiKaMhuBnAfnC4ixQfvPLCYGUq9yABvriM1p7o5REmz3ClbTFY2mpAL0jhl6BR/TNavuGsfFo2bUA== dependencies: - "@abp/core" "~5.3.0-rc.2" + "@abp/core" "~5.3.0-rc.3" owl.carousel "^2.3.4" -"@abp/prismjs@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-5.3.0-rc.2.tgz#8a5ed8032a1e8ba7644adbffae9efdc18c3811f7" - integrity sha512-G7ab7PL0TcjtvA9rdFj0RajP0pXZrXmIzKZ/vtQqW6mNLXNCI1OKJ/fAXXwS35gFEyVPvn9xKPnuYlhwqWl6ug== +"@abp/prismjs@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-5.3.0-rc.3.tgz#c382946b15c820a01e3833ba5c4b3f6d52f8365c" + integrity sha512-a/lahdqzBEcsQ8j9Vjg8KC8xyDroGBi+4NIV2wb+k0CAaA49L25lfq0RSCji5RgyZ9Hjznhg/NyD6AFKaB3ykA== dependencies: - "@abp/clipboard" "~5.3.0-rc.2" - "@abp/core" "~5.3.0-rc.2" + "@abp/clipboard" "~5.3.0-rc.3" + "@abp/core" "~5.3.0-rc.3" prismjs "^1.26.0" -"@abp/select2@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-5.3.0-rc.2.tgz#50e622f2296c3594e89699e8747dcf520fb4415d" - integrity sha512-HwfiEgeECkzQhCf/3Je/V7pRtRvr3YQtX1gAWpI6Ty2P+nTV4ue/l1w5Si+59vuJm3JP+fCnSFPlHXxahfL/Gw== +"@abp/select2@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-5.3.0-rc.3.tgz#7a0f9f7472c812b85ce9bc5bd8a557c33e967e7d" + integrity sha512-6t+UXjDh3bzaCWsSxwuRtOgGz+aDidPKA2JKZfKLAFM4WkcLmY8Px0RY3jgsbxrtM9ANncA9gbl69Q3uY2DmHA== dependencies: - "@abp/core" "~5.3.0-rc.2" + "@abp/core" "~5.3.0-rc.3" select2 "^4.0.13" -"@abp/sweetalert2@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-5.3.0-rc.2.tgz#41d19b81011e3d5c9d12b8d6ec6da12e52553683" - integrity sha512-6Qx2WIpXQI/ydfX9P7cMISvwrFi4UAPzkuNkhPOZT7chq64auz88Rtqyw+SLXLnCCQ+e31/ekFldijOG9CbV1g== +"@abp/sweetalert2@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-5.3.0-rc.3.tgz#91557a4b4a103f68a926fde19c830e195597ff0d" + integrity sha512-hAw+E8EnGO9nnyGbGiD/y+SyScHD4R0MEi/eK2bsMSKAzBxKcUBv0MxrsNQc0WhVwqRQETRccdLX3WYofmh8Kw== dependencies: - "@abp/core" "~5.3.0-rc.2" + "@abp/core" "~5.3.0-rc.3" sweetalert2 "^11.3.6" -"@abp/timeago@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-5.3.0-rc.2.tgz#16f73659e83643d82eafac716115dbf0333cce98" - integrity sha512-fFvBX65Bzvg+x4vClzSh31FJJ2m6b2/s+IJ4/t4FNDxDqybfOzkAfRzPm7NVDw5Avu1fjRLwFhQueb0sECQD/w== +"@abp/timeago@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-5.3.0-rc.3.tgz#7480ed2d5ee035d2f43c223d7bb58d794ff3ba2f" + integrity sha512-kgIlH/KGWhYwZSGvCT5LnCYoD+1pSwoQf2GhtvgBUnYqxS6+s0FUSMSzX/MISLOvLWknl2KNnARsOXJkqrWXEw== dependencies: - "@abp/jquery" "~5.3.0-rc.2" + "@abp/jquery" "~5.3.0-rc.3" timeago "^1.6.7" -"@abp/toastr@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-5.3.0-rc.2.tgz#e868ffe7acc3e1838dd008f936e909250e360cc8" - integrity sha512-0BLjOSalZw7NdRXw4/SwPP7N+ChFGO2elEJ7zyd0c8Bi+Gz5lqL6ZW47O1ANKSv9HnPoyRsPDSBiCIvXXtlFOw== +"@abp/toastr@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-5.3.0-rc.3.tgz#1a6f03737c2ae92d62a8b7f51d4c70cc4d97212f" + integrity sha512-Vag9lz2YboyZ0/4Y/OvFG+EaY0PCs5X97ZijZRB+saSRe1pL1+qnBMpniMDUvbMEpitB5Qq+FqdkOnKdhlrH4A== dependencies: - "@abp/jquery" "~5.3.0-rc.2" + "@abp/jquery" "~5.3.0-rc.3" toastr "^2.1.4" -"@abp/tui-editor@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/tui-editor/-/tui-editor-5.3.0-rc.2.tgz#34d82fca81892cdd6a269ae7d61334db96a7af60" - integrity sha512-eWuwAz71MOkJ+oYWqpCfA5f4555cTGWe8pZJPboTfVluym/O8wyGfldMx8jxOq4F4EqogrUozgq6jHZRgQy0kg== +"@abp/tui-editor@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/tui-editor/-/tui-editor-5.3.0-rc.3.tgz#15059c844009e4fea931fc5ef1c7e7128dd453ee" + integrity sha512-m1CLpUzQsJaea3jKPBkII9+erHn+6kvltJXMePI5DSXDGYvaEZiO05pbk30rk0QsSYm++jTiGS+83JllfR/tTA== dependencies: - "@abp/jquery" "~5.3.0-rc.2" - "@abp/prismjs" "~5.3.0-rc.2" + "@abp/jquery" "~5.3.0-rc.3" + "@abp/prismjs" "~5.3.0-rc.3" -"@abp/utils@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-5.3.0-rc.2.tgz#cbdf34bb32f99396c2a7f6dd2f0fa0b5239413bb" - integrity sha512-0BgsxKwkiNcbBSDJIfxBObM4QYTk1umZ/WnKUdvSyv0Fe4hKK+gDvsBzk97O+ZVyBHIflvcln3dKpS3eIVwhIg== +"@abp/utils@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-5.3.0-rc.3.tgz#e91f10b18ac1e17af7f15c85257c24034cab2ba1" + integrity sha512-vMzsddCvI+M6Qd7Hns5KPUXqdFFboJwAOB9gvxj+MmjVNDCpFTo1hjq0H0zB6NHI8Ik+9sw44D0c7gkTdQQt7Q== dependencies: just-compare "^1.3.0" diff --git a/modules/client-simulation/demo/Volo.ClientSimulation.Demo/package.json b/modules/client-simulation/demo/Volo.ClientSimulation.Demo/package.json index 5aa39d51c3..4a23bb9f6f 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": "^5.3.0-rc.2" + "@abp/aspnetcore.mvc.ui.theme.basic": "^5.3.0-rc.3" } } diff --git a/modules/client-simulation/demo/Volo.ClientSimulation.Demo/yarn.lock b/modules/client-simulation/demo/Volo.ClientSimulation.Demo/yarn.lock index 475e8a5cca..35b2819ebc 100644 --- a/modules/client-simulation/demo/Volo.ClientSimulation.Demo/yarn.lock +++ b/modules/client-simulation/demo/Volo.ClientSimulation.Demo/yarn.lock @@ -2,37 +2,37 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.basic@^5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-5.3.0-rc.2.tgz#49da0f1ad2c0ec40eaacccae6874863fde954dda" - integrity sha512-Hb3ukaYMDhftkk7kQ9jVpkqhEoll8wU39/Qdy8JOlrJw3SDqqckWbVcJQkvetqa3mChy6kAVG3xe9ywG1h/6jA== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~5.3.0-rc.2" - -"@abp/aspnetcore.mvc.ui.theme.shared@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-5.3.0-rc.2.tgz#a4e6f033ee17fe7196e94047640bc826a69694a6" - integrity sha512-uKyb8by2dqYvCr9TCD0JKg2W+eLNcHanmQDL+aoI9OAExEEI/DYxw2a5++OntJGvmbcA6o1envmvOjqqsZuX0g== - dependencies: - "@abp/aspnetcore.mvc.ui" "~5.3.0-rc.2" - "@abp/bootstrap" "~5.3.0-rc.2" - "@abp/bootstrap-datepicker" "~5.3.0-rc.2" - "@abp/datatables.net-bs5" "~5.3.0-rc.2" - "@abp/font-awesome" "~5.3.0-rc.2" - "@abp/jquery-form" "~5.3.0-rc.2" - "@abp/jquery-validation-unobtrusive" "~5.3.0-rc.2" - "@abp/lodash" "~5.3.0-rc.2" - "@abp/luxon" "~5.3.0-rc.2" - "@abp/malihu-custom-scrollbar-plugin" "~5.3.0-rc.2" - "@abp/select2" "~5.3.0-rc.2" - "@abp/sweetalert2" "~5.3.0-rc.2" - "@abp/timeago" "~5.3.0-rc.2" - "@abp/toastr" "~5.3.0-rc.2" - -"@abp/aspnetcore.mvc.ui@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-5.3.0-rc.2.tgz#93a3c331cc75d2fbdd466a42777040466295f982" - integrity sha512-10RgXgZChbXNtXMblvvEZQctufJlP29RabfIOKWBTBMtU+jUgtDsLUwmF6Oi/65LLImOUogmBCb9MxjNm71iAQ== +"@abp/aspnetcore.mvc.ui.theme.basic@^5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-5.3.0-rc.3.tgz#726ce9dc03974ee192b3bb6a921a33fb69cf7f95" + integrity sha512-yOXp2ZXNGGDHWKHOXjudH1v7MK5ss1kpQ8DeorrboYybdmeWsq7BtrMIfvfudv8iCIWrg5Jmnf3GQ/7hBxdAdg== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~5.3.0-rc.3" + +"@abp/aspnetcore.mvc.ui.theme.shared@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-5.3.0-rc.3.tgz#34a752e71b965e762a81d758965a30d140501bc9" + integrity sha512-GnGhj6Y2DE1mrSWmp1jRnNvCsUiugWPKxlv1ue5dCdPVOw14OdXa6tLJwnZ38w9OOCDzXQyDUFdr19+uwOvEzQ== + dependencies: + "@abp/aspnetcore.mvc.ui" "~5.3.0-rc.3" + "@abp/bootstrap" "~5.3.0-rc.3" + "@abp/bootstrap-datepicker" "~5.3.0-rc.3" + "@abp/datatables.net-bs5" "~5.3.0-rc.3" + "@abp/font-awesome" "~5.3.0-rc.3" + "@abp/jquery-form" "~5.3.0-rc.3" + "@abp/jquery-validation-unobtrusive" "~5.3.0-rc.3" + "@abp/lodash" "~5.3.0-rc.3" + "@abp/luxon" "~5.3.0-rc.3" + "@abp/malihu-custom-scrollbar-plugin" "~5.3.0-rc.3" + "@abp/select2" "~5.3.0-rc.3" + "@abp/sweetalert2" "~5.3.0-rc.3" + "@abp/timeago" "~5.3.0-rc.3" + "@abp/toastr" "~5.3.0-rc.3" + +"@abp/aspnetcore.mvc.ui@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-5.3.0-rc.3.tgz#810821c844f4a1f248182ed9d3a8b54237b83124" + integrity sha512-1yvpDgZpYegL/JiwPdpCm/VjruEymt5VcamMYLPiUpmGTl0b7QFtUIwjSonE3gHEsBDXj9eCw9Kw3Bi+sd7NNQ== dependencies: ansi-colors "^4.1.1" extend-object "^1.0.0" @@ -41,144 +41,144 @@ merge-stream "^2.0.0" micromatch "^4.0.2" -"@abp/bootstrap-datepicker@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-5.3.0-rc.2.tgz#228735714f2baeb42e864c175e0aed3f855249d7" - integrity sha512-jZ7vGvsLjnXwpzvQ6vjKHWBkiptYBnEDVIfQ/zKV8kvkhdu+xxOP/u1LM90NSR2YckjIRj8+mINEcrnWhXgRNw== +"@abp/bootstrap-datepicker@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-5.3.0-rc.3.tgz#f98743539a1e8d883869aa7a759ba1aa00cd0689" + integrity sha512-VNNROxO1wzjG2q35wKEh4STluZllVggNhb0UyGtpZVNbtLydSxeFGHcve26f8UfEWE3WfC5Yyw8nBOHyJxh6tg== dependencies: bootstrap-datepicker "^1.9.0" -"@abp/bootstrap@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-5.3.0-rc.2.tgz#c410f44d987d09b5a74fd58417d03788fa878884" - integrity sha512-jb58M67kWldW35zTjVDFLaCj4STly2eU40COYFgjPQSH7F21DvMdX69Cp3jpmHaxm8VQE9izgW0NV8+oGlFyAw== +"@abp/bootstrap@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-5.3.0-rc.3.tgz#338b5ce194a257e5f14be2344b4e722874273ab1" + integrity sha512-fom2AboT9d1O3K1cOrIFT9l5Cvw2l42BvxEHkV3sXkZxZSstc9exURQn0WmKxWnOMCwM03N2IMKsFlk6SePN2A== dependencies: - "@abp/core" "~5.3.0-rc.2" + "@abp/core" "~5.3.0-rc.3" bootstrap "^5.1.3" -"@abp/core@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-5.3.0-rc.2.tgz#3a3c6d187c502436bb02db99be3720f61628c924" - integrity sha512-/BEO90D7ibeyZxfCQHv2bbb9y/SpfZtaw0A8gmQlYrH3rZ3Th935v5XjCeYem8IGJ8fDZO7CRzW5TBsku/PukA== +"@abp/core@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-5.3.0-rc.3.tgz#7846bd8582bbb9effdb058b3b815fc1798b33f01" + integrity sha512-RyFoereWj/YOccWFeB5yq4aktKnYl44xrb6LKNkCmcVadbOJ+7AHgHljychTuMZalTvfzW2GcZacIoHw4bhn/A== dependencies: - "@abp/utils" "~5.3.0-rc.2" + "@abp/utils" "~5.3.0-rc.3" -"@abp/datatables.net-bs5@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-5.3.0-rc.2.tgz#452c2112fbe3cdac8c0d12bb626017f7c6333a45" - integrity sha512-Rk1uY76dGMnBFYILdXrb6Oc+jjblLdSzGZvDH1dyoFYs0bLWsjqVsOIE+kCjO447PgDOLyF+4nurLj+A9yCkEg== +"@abp/datatables.net-bs5@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-5.3.0-rc.3.tgz#f420208050a3a6f8e0ad3bcbb6af0e74584d2883" + integrity sha512-gwWMRElBQatElOdWyozYOY7lhYAUQu6/aZnf4XyiTlaWp6g1iMRJKgmaT73DhiIl+jxUiFtWjEla+65cXSl7sA== dependencies: - "@abp/datatables.net" "~5.3.0-rc.2" + "@abp/datatables.net" "~5.3.0-rc.3" datatables.net-bs5 "^1.11.4" -"@abp/datatables.net@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-5.3.0-rc.2.tgz#e7156085d76ab0b20e41fe92f9c99b14822b5f6a" - integrity sha512-aPSSmnBC939uYHR9fxxuvtxq4217qG3f8uf18ar7yWJwzWAYMOOhkmK0rEOqn86ObuXdjMAly7ThyfL6RH2iNQ== +"@abp/datatables.net@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-5.3.0-rc.3.tgz#e4b1f9fe41e788878f9cce082d6a79db9c4a8bae" + integrity sha512-FghO+XGSu9rwKOAUYC5AsB6hh1KrXAJ3GmHFYOIHrcd9nB/e60NtyoOo14TeO/LAFCVLOLq/FIBpEbkUZJZHkA== dependencies: - "@abp/jquery" "~5.3.0-rc.2" + "@abp/jquery" "~5.3.0-rc.3" datatables.net "^1.11.4" -"@abp/font-awesome@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-5.3.0-rc.2.tgz#30995f5f5f6d604cd2241ee677ec14dcfc78377d" - integrity sha512-KFwYcjiq01RxI75qnbDt+G8zFcSEJRurHHZQwcI7ySjtQV5xM41zycOYIOV3SKz/gcyYyBBL5UeJPjsE8cu+Fw== +"@abp/font-awesome@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-5.3.0-rc.3.tgz#ef97f0a95385f1d56d4432b84944379d2cb1bfbd" + integrity sha512-kbm9ZaK8SSMcoeBbMdT1b5rJOZ3y8i/bdqD+3g0s65LEeqXNrKV/TkDdJqns72x4PxUQV6r3naXaEbV6Yj/sXQ== dependencies: - "@abp/core" "~5.3.0-rc.2" + "@abp/core" "~5.3.0-rc.3" "@fortawesome/fontawesome-free" "^5.15.4" -"@abp/jquery-form@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-5.3.0-rc.2.tgz#53561d6966f25bf6f7e91dcb89032fecd2c35d1f" - integrity sha512-94ExZ5q02s7ANpFyQnEcuSUjyra+32jMMkV0ZITbjWlmFRcXEogeIF3q3B4XswRi+yf67kQg7ynYCbGR7JESDg== +"@abp/jquery-form@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-5.3.0-rc.3.tgz#497f0a442323d99a7939ba8f9e5234d1a1891e03" + integrity sha512-gknwOgCEF4oJo9Vz2uM2Dl9dkJ2ulJSLb6YXEsPWx5fAFfIuwOl/5H0I1EE4XemtcEpF6xb+Ettnaxo8TcnIcg== dependencies: - "@abp/jquery" "~5.3.0-rc.2" + "@abp/jquery" "~5.3.0-rc.3" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-5.3.0-rc.2.tgz#957387fb88414a50a5d3d84089ab3704b710645f" - integrity sha512-dIXsxqQ0x+xiLCA2x6xWR3wIvfpT0zukLFOrkCVNSc+mnWWyYlavRnGl3f5W/4jQSPZ9Ao/txhsThfkvO+Mu0Q== +"@abp/jquery-validation-unobtrusive@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-5.3.0-rc.3.tgz#a3e39dfb4ba2e0f45dcfde28bd22ff36c55173a0" + integrity sha512-zgSNkg/mzNDzvE+3cL58nLoV3EvFB/ALiLHudo8GcWsdFxx7R+2DfboCSFE1oJ8do6tED+9YG0/VJiZDXnFPwQ== dependencies: - "@abp/jquery-validation" "~5.3.0-rc.2" + "@abp/jquery-validation" "~5.3.0-rc.3" jquery-validation-unobtrusive "^3.2.12" -"@abp/jquery-validation@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-5.3.0-rc.2.tgz#d866b10ffbfc1852df11122aa2cf6a56e50819b3" - integrity sha512-DAxwKjalhMZNCuXBS6Ai9RlIDsEzm0SGnFDApQIo/i6HGKoK4J/eTnFZ175xZMQ79yrxe71MKWR29l/+PuwcRw== +"@abp/jquery-validation@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-5.3.0-rc.3.tgz#917a2b2e7e4b8e5aacdd10284f18f58bfac1743d" + integrity sha512-m2pPTGJs8MQzzdzMpWFD94RU4dqMrwwT4ZJyqz07EPzRv7NURGVlzJOPdwDiTVdiT5UsaYzDF0BYgfj3/FL/iw== dependencies: - "@abp/jquery" "~5.3.0-rc.2" + "@abp/jquery" "~5.3.0-rc.3" jquery-validation "^1.19.3" -"@abp/jquery@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-5.3.0-rc.2.tgz#8a5008123f5dbf1276c719ac45101161e9d9b793" - integrity sha512-VjA22n17pPKqj6jZUk6qxpqx2UT5Uv6q/AvyJtacDC3D1MXfrnSWxi9FAPFp4N52i4knkfuKFZtuFlFSkQe4FQ== +"@abp/jquery@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-5.3.0-rc.3.tgz#e75ca02fa0520c60b1aed14444fc129ed6a27d0b" + integrity sha512-ZJYpnFqByAzHKru1aGz8VLZw4xb/YD1wpahN9pIsPYeFrE6/7Vjs8npQk5it2Ww5gaA3unSrMIc0CMsr5kk0Nw== dependencies: - "@abp/core" "~5.3.0-rc.2" + "@abp/core" "~5.3.0-rc.3" jquery "~3.6.0" -"@abp/lodash@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-5.3.0-rc.2.tgz#51600a0ba49c6d4060c3e280b1f1d62ed7f48a16" - integrity sha512-qreUjH0umhsGKRSYpswcX1SAF1iNBp/AP32LMfvezvPaCA+KQFWknHuOTV2jn1tYC5c7KJTTTp46jRTi88VSHQ== +"@abp/lodash@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-5.3.0-rc.3.tgz#3fcc23626b9e36652ee36847b4a8879cf8aae8ef" + integrity sha512-KJFNAhW3AHi6AAhSlix50gbU9QmQT9TD5RYofEoIm1rfd7iZF0uowJheES0jqHU4PeS80Fnzp8AnBhVYgRMUjg== dependencies: - "@abp/core" "~5.3.0-rc.2" + "@abp/core" "~5.3.0-rc.3" lodash "^4.17.21" -"@abp/luxon@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-5.3.0-rc.2.tgz#6ea39998aaba2a3bd6e6dd3c9cacc1a0f56afa8f" - integrity sha512-9++6ZD0zEmJcH3iSNcTtC0haEVbQgxzoFx1wpEXsB3YVuBKUjJnJCXMbt0Qmkkq40tclmG8bfORRYhII29TLWA== +"@abp/luxon@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-5.3.0-rc.3.tgz#cf9e2070f3b3e1281dcf05ba1781d8daa41da98d" + integrity sha512-1gBfWwFrS+xuTD12dB/LLUbGWCATbByp1kCFbHdgVNOkkkDvJETS0LeB8o/ggw7rBWL5i3Jkpb5xFTRT6yKX4Q== dependencies: - "@abp/core" "~5.3.0-rc.2" + "@abp/core" "~5.3.0-rc.3" luxon "^2.3.0" -"@abp/malihu-custom-scrollbar-plugin@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-5.3.0-rc.2.tgz#069e071472eb8727260e9a1b5322e30cdaebffc9" - integrity sha512-JPaoNiYWR6T7Osx4ezURFanxC9ex1U9zr+7Fko1mmig8oZ+OHsk1cbdNBD5ChgAVsHdqK2eJ4iobDjhsDfMYiA== +"@abp/malihu-custom-scrollbar-plugin@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-5.3.0-rc.3.tgz#1d8d5cede65dbd0d0975d8fabfe135105710ddde" + integrity sha512-SW8UBKQGsS8zrG2RkmGBuze/NgreDWWJ84l2qMKYmTtgL/kOCLm4FBvo44azNOq6a3rYVJGpwirYRBcwrsAfHw== dependencies: - "@abp/core" "~5.3.0-rc.2" + "@abp/core" "~5.3.0-rc.3" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/select2@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-5.3.0-rc.2.tgz#50e622f2296c3594e89699e8747dcf520fb4415d" - integrity sha512-HwfiEgeECkzQhCf/3Je/V7pRtRvr3YQtX1gAWpI6Ty2P+nTV4ue/l1w5Si+59vuJm3JP+fCnSFPlHXxahfL/Gw== +"@abp/select2@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-5.3.0-rc.3.tgz#7a0f9f7472c812b85ce9bc5bd8a557c33e967e7d" + integrity sha512-6t+UXjDh3bzaCWsSxwuRtOgGz+aDidPKA2JKZfKLAFM4WkcLmY8Px0RY3jgsbxrtM9ANncA9gbl69Q3uY2DmHA== dependencies: - "@abp/core" "~5.3.0-rc.2" + "@abp/core" "~5.3.0-rc.3" select2 "^4.0.13" -"@abp/sweetalert2@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-5.3.0-rc.2.tgz#41d19b81011e3d5c9d12b8d6ec6da12e52553683" - integrity sha512-6Qx2WIpXQI/ydfX9P7cMISvwrFi4UAPzkuNkhPOZT7chq64auz88Rtqyw+SLXLnCCQ+e31/ekFldijOG9CbV1g== +"@abp/sweetalert2@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-5.3.0-rc.3.tgz#91557a4b4a103f68a926fde19c830e195597ff0d" + integrity sha512-hAw+E8EnGO9nnyGbGiD/y+SyScHD4R0MEi/eK2bsMSKAzBxKcUBv0MxrsNQc0WhVwqRQETRccdLX3WYofmh8Kw== dependencies: - "@abp/core" "~5.3.0-rc.2" + "@abp/core" "~5.3.0-rc.3" sweetalert2 "^11.3.6" -"@abp/timeago@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-5.3.0-rc.2.tgz#16f73659e83643d82eafac716115dbf0333cce98" - integrity sha512-fFvBX65Bzvg+x4vClzSh31FJJ2m6b2/s+IJ4/t4FNDxDqybfOzkAfRzPm7NVDw5Avu1fjRLwFhQueb0sECQD/w== +"@abp/timeago@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-5.3.0-rc.3.tgz#7480ed2d5ee035d2f43c223d7bb58d794ff3ba2f" + integrity sha512-kgIlH/KGWhYwZSGvCT5LnCYoD+1pSwoQf2GhtvgBUnYqxS6+s0FUSMSzX/MISLOvLWknl2KNnARsOXJkqrWXEw== dependencies: - "@abp/jquery" "~5.3.0-rc.2" + "@abp/jquery" "~5.3.0-rc.3" timeago "^1.6.7" -"@abp/toastr@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-5.3.0-rc.2.tgz#e868ffe7acc3e1838dd008f936e909250e360cc8" - integrity sha512-0BLjOSalZw7NdRXw4/SwPP7N+ChFGO2elEJ7zyd0c8Bi+Gz5lqL6ZW47O1ANKSv9HnPoyRsPDSBiCIvXXtlFOw== +"@abp/toastr@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-5.3.0-rc.3.tgz#1a6f03737c2ae92d62a8b7f51d4c70cc4d97212f" + integrity sha512-Vag9lz2YboyZ0/4Y/OvFG+EaY0PCs5X97ZijZRB+saSRe1pL1+qnBMpniMDUvbMEpitB5Qq+FqdkOnKdhlrH4A== dependencies: - "@abp/jquery" "~5.3.0-rc.2" + "@abp/jquery" "~5.3.0-rc.3" toastr "^2.1.4" -"@abp/utils@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-5.3.0-rc.2.tgz#cbdf34bb32f99396c2a7f6dd2f0fa0b5239413bb" - integrity sha512-0BgsxKwkiNcbBSDJIfxBObM4QYTk1umZ/WnKUdvSyv0Fe4hKK+gDvsBzk97O+ZVyBHIflvcln3dKpS3eIVwhIg== +"@abp/utils@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-5.3.0-rc.3.tgz#e91f10b18ac1e17af7f15c85257c24034cab2ba1" + integrity sha512-vMzsddCvI+M6Qd7Hns5KPUXqdFFboJwAOB9gvxj+MmjVNDCpFTo1hjq0H0zB6NHI8Ik+9sw44D0c7gkTdQQt7Q== dependencies: just-compare "^1.3.0" diff --git a/modules/cms-kit/angular/package.json b/modules/cms-kit/angular/package.json index ad1e299393..3009112f64 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": "~5.3.0-rc.2", - "@abp/ng.identity": "~5.3.0-rc.2", - "@abp/ng.setting-management": "~5.3.0-rc.2", - "@abp/ng.tenant-management": "~5.3.0-rc.2", - "@abp/ng.theme.basic": "~5.3.0-rc.2", + "@abp/ng.account": "~5.3.0-rc.3", + "@abp/ng.identity": "~5.3.0-rc.3", + "@abp/ng.setting-management": "~5.3.0-rc.3", + "@abp/ng.tenant-management": "~5.3.0-rc.3", + "@abp/ng.theme.basic": "~5.3.0-rc.3", "@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 044d492d1d..c04d13cc96 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": ">=5.3.0-rc.2", - "@abp/ng.theme.shared": ">=5.3.0-rc.2" + "@abp/ng.core": ">=5.3.0-rc.3", + "@abp/ng.theme.shared": ">=5.3.0-rc.3" }, "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 70cd3a52eb..bc46bd777c 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": "^5.3.0-rc.2" + "@abp/aspnetcore.mvc.ui.theme.basic": "^5.3.0-rc.3" } } diff --git a/modules/cms-kit/host/Volo.CmsKit.IdentityServer/yarn.lock b/modules/cms-kit/host/Volo.CmsKit.IdentityServer/yarn.lock index 7aca0310e5..18b77e4cd0 100644 --- a/modules/cms-kit/host/Volo.CmsKit.IdentityServer/yarn.lock +++ b/modules/cms-kit/host/Volo.CmsKit.IdentityServer/yarn.lock @@ -2,37 +2,37 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.basic@^5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-5.3.0-rc.2.tgz#49da0f1ad2c0ec40eaacccae6874863fde954dda" - integrity sha512-Hb3ukaYMDhftkk7kQ9jVpkqhEoll8wU39/Qdy8JOlrJw3SDqqckWbVcJQkvetqa3mChy6kAVG3xe9ywG1h/6jA== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~5.3.0-rc.2" - -"@abp/aspnetcore.mvc.ui.theme.shared@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-5.3.0-rc.2.tgz#a4e6f033ee17fe7196e94047640bc826a69694a6" - integrity sha512-uKyb8by2dqYvCr9TCD0JKg2W+eLNcHanmQDL+aoI9OAExEEI/DYxw2a5++OntJGvmbcA6o1envmvOjqqsZuX0g== - dependencies: - "@abp/aspnetcore.mvc.ui" "~5.3.0-rc.2" - "@abp/bootstrap" "~5.3.0-rc.2" - "@abp/bootstrap-datepicker" "~5.3.0-rc.2" - "@abp/datatables.net-bs5" "~5.3.0-rc.2" - "@abp/font-awesome" "~5.3.0-rc.2" - "@abp/jquery-form" "~5.3.0-rc.2" - "@abp/jquery-validation-unobtrusive" "~5.3.0-rc.2" - "@abp/lodash" "~5.3.0-rc.2" - "@abp/luxon" "~5.3.0-rc.2" - "@abp/malihu-custom-scrollbar-plugin" "~5.3.0-rc.2" - "@abp/select2" "~5.3.0-rc.2" - "@abp/sweetalert2" "~5.3.0-rc.2" - "@abp/timeago" "~5.3.0-rc.2" - "@abp/toastr" "~5.3.0-rc.2" - -"@abp/aspnetcore.mvc.ui@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-5.3.0-rc.2.tgz#93a3c331cc75d2fbdd466a42777040466295f982" - integrity sha512-10RgXgZChbXNtXMblvvEZQctufJlP29RabfIOKWBTBMtU+jUgtDsLUwmF6Oi/65LLImOUogmBCb9MxjNm71iAQ== +"@abp/aspnetcore.mvc.ui.theme.basic@^5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-5.3.0-rc.3.tgz#726ce9dc03974ee192b3bb6a921a33fb69cf7f95" + integrity sha512-yOXp2ZXNGGDHWKHOXjudH1v7MK5ss1kpQ8DeorrboYybdmeWsq7BtrMIfvfudv8iCIWrg5Jmnf3GQ/7hBxdAdg== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~5.3.0-rc.3" + +"@abp/aspnetcore.mvc.ui.theme.shared@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-5.3.0-rc.3.tgz#34a752e71b965e762a81d758965a30d140501bc9" + integrity sha512-GnGhj6Y2DE1mrSWmp1jRnNvCsUiugWPKxlv1ue5dCdPVOw14OdXa6tLJwnZ38w9OOCDzXQyDUFdr19+uwOvEzQ== + dependencies: + "@abp/aspnetcore.mvc.ui" "~5.3.0-rc.3" + "@abp/bootstrap" "~5.3.0-rc.3" + "@abp/bootstrap-datepicker" "~5.3.0-rc.3" + "@abp/datatables.net-bs5" "~5.3.0-rc.3" + "@abp/font-awesome" "~5.3.0-rc.3" + "@abp/jquery-form" "~5.3.0-rc.3" + "@abp/jquery-validation-unobtrusive" "~5.3.0-rc.3" + "@abp/lodash" "~5.3.0-rc.3" + "@abp/luxon" "~5.3.0-rc.3" + "@abp/malihu-custom-scrollbar-plugin" "~5.3.0-rc.3" + "@abp/select2" "~5.3.0-rc.3" + "@abp/sweetalert2" "~5.3.0-rc.3" + "@abp/timeago" "~5.3.0-rc.3" + "@abp/toastr" "~5.3.0-rc.3" + +"@abp/aspnetcore.mvc.ui@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-5.3.0-rc.3.tgz#810821c844f4a1f248182ed9d3a8b54237b83124" + integrity sha512-1yvpDgZpYegL/JiwPdpCm/VjruEymt5VcamMYLPiUpmGTl0b7QFtUIwjSonE3gHEsBDXj9eCw9Kw3Bi+sd7NNQ== dependencies: ansi-colors "^4.1.1" extend-object "^1.0.0" @@ -41,144 +41,144 @@ merge-stream "^2.0.0" micromatch "^4.0.2" -"@abp/bootstrap-datepicker@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-5.3.0-rc.2.tgz#228735714f2baeb42e864c175e0aed3f855249d7" - integrity sha512-jZ7vGvsLjnXwpzvQ6vjKHWBkiptYBnEDVIfQ/zKV8kvkhdu+xxOP/u1LM90NSR2YckjIRj8+mINEcrnWhXgRNw== +"@abp/bootstrap-datepicker@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-5.3.0-rc.3.tgz#f98743539a1e8d883869aa7a759ba1aa00cd0689" + integrity sha512-VNNROxO1wzjG2q35wKEh4STluZllVggNhb0UyGtpZVNbtLydSxeFGHcve26f8UfEWE3WfC5Yyw8nBOHyJxh6tg== dependencies: bootstrap-datepicker "^1.9.0" -"@abp/bootstrap@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-5.3.0-rc.2.tgz#c410f44d987d09b5a74fd58417d03788fa878884" - integrity sha512-jb58M67kWldW35zTjVDFLaCj4STly2eU40COYFgjPQSH7F21DvMdX69Cp3jpmHaxm8VQE9izgW0NV8+oGlFyAw== +"@abp/bootstrap@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-5.3.0-rc.3.tgz#338b5ce194a257e5f14be2344b4e722874273ab1" + integrity sha512-fom2AboT9d1O3K1cOrIFT9l5Cvw2l42BvxEHkV3sXkZxZSstc9exURQn0WmKxWnOMCwM03N2IMKsFlk6SePN2A== dependencies: - "@abp/core" "~5.3.0-rc.2" + "@abp/core" "~5.3.0-rc.3" bootstrap "^5.1.3" -"@abp/core@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-5.3.0-rc.2.tgz#3a3c6d187c502436bb02db99be3720f61628c924" - integrity sha512-/BEO90D7ibeyZxfCQHv2bbb9y/SpfZtaw0A8gmQlYrH3rZ3Th935v5XjCeYem8IGJ8fDZO7CRzW5TBsku/PukA== +"@abp/core@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-5.3.0-rc.3.tgz#7846bd8582bbb9effdb058b3b815fc1798b33f01" + integrity sha512-RyFoereWj/YOccWFeB5yq4aktKnYl44xrb6LKNkCmcVadbOJ+7AHgHljychTuMZalTvfzW2GcZacIoHw4bhn/A== dependencies: - "@abp/utils" "~5.3.0-rc.2" + "@abp/utils" "~5.3.0-rc.3" -"@abp/datatables.net-bs5@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-5.3.0-rc.2.tgz#452c2112fbe3cdac8c0d12bb626017f7c6333a45" - integrity sha512-Rk1uY76dGMnBFYILdXrb6Oc+jjblLdSzGZvDH1dyoFYs0bLWsjqVsOIE+kCjO447PgDOLyF+4nurLj+A9yCkEg== +"@abp/datatables.net-bs5@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-5.3.0-rc.3.tgz#f420208050a3a6f8e0ad3bcbb6af0e74584d2883" + integrity sha512-gwWMRElBQatElOdWyozYOY7lhYAUQu6/aZnf4XyiTlaWp6g1iMRJKgmaT73DhiIl+jxUiFtWjEla+65cXSl7sA== dependencies: - "@abp/datatables.net" "~5.3.0-rc.2" + "@abp/datatables.net" "~5.3.0-rc.3" datatables.net-bs5 "^1.11.4" -"@abp/datatables.net@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-5.3.0-rc.2.tgz#e7156085d76ab0b20e41fe92f9c99b14822b5f6a" - integrity sha512-aPSSmnBC939uYHR9fxxuvtxq4217qG3f8uf18ar7yWJwzWAYMOOhkmK0rEOqn86ObuXdjMAly7ThyfL6RH2iNQ== +"@abp/datatables.net@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-5.3.0-rc.3.tgz#e4b1f9fe41e788878f9cce082d6a79db9c4a8bae" + integrity sha512-FghO+XGSu9rwKOAUYC5AsB6hh1KrXAJ3GmHFYOIHrcd9nB/e60NtyoOo14TeO/LAFCVLOLq/FIBpEbkUZJZHkA== dependencies: - "@abp/jquery" "~5.3.0-rc.2" + "@abp/jquery" "~5.3.0-rc.3" datatables.net "^1.11.4" -"@abp/font-awesome@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-5.3.0-rc.2.tgz#30995f5f5f6d604cd2241ee677ec14dcfc78377d" - integrity sha512-KFwYcjiq01RxI75qnbDt+G8zFcSEJRurHHZQwcI7ySjtQV5xM41zycOYIOV3SKz/gcyYyBBL5UeJPjsE8cu+Fw== +"@abp/font-awesome@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-5.3.0-rc.3.tgz#ef97f0a95385f1d56d4432b84944379d2cb1bfbd" + integrity sha512-kbm9ZaK8SSMcoeBbMdT1b5rJOZ3y8i/bdqD+3g0s65LEeqXNrKV/TkDdJqns72x4PxUQV6r3naXaEbV6Yj/sXQ== dependencies: - "@abp/core" "~5.3.0-rc.2" + "@abp/core" "~5.3.0-rc.3" "@fortawesome/fontawesome-free" "^5.15.4" -"@abp/jquery-form@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-5.3.0-rc.2.tgz#53561d6966f25bf6f7e91dcb89032fecd2c35d1f" - integrity sha512-94ExZ5q02s7ANpFyQnEcuSUjyra+32jMMkV0ZITbjWlmFRcXEogeIF3q3B4XswRi+yf67kQg7ynYCbGR7JESDg== +"@abp/jquery-form@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-5.3.0-rc.3.tgz#497f0a442323d99a7939ba8f9e5234d1a1891e03" + integrity sha512-gknwOgCEF4oJo9Vz2uM2Dl9dkJ2ulJSLb6YXEsPWx5fAFfIuwOl/5H0I1EE4XemtcEpF6xb+Ettnaxo8TcnIcg== dependencies: - "@abp/jquery" "~5.3.0-rc.2" + "@abp/jquery" "~5.3.0-rc.3" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-5.3.0-rc.2.tgz#957387fb88414a50a5d3d84089ab3704b710645f" - integrity sha512-dIXsxqQ0x+xiLCA2x6xWR3wIvfpT0zukLFOrkCVNSc+mnWWyYlavRnGl3f5W/4jQSPZ9Ao/txhsThfkvO+Mu0Q== +"@abp/jquery-validation-unobtrusive@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-5.3.0-rc.3.tgz#a3e39dfb4ba2e0f45dcfde28bd22ff36c55173a0" + integrity sha512-zgSNkg/mzNDzvE+3cL58nLoV3EvFB/ALiLHudo8GcWsdFxx7R+2DfboCSFE1oJ8do6tED+9YG0/VJiZDXnFPwQ== dependencies: - "@abp/jquery-validation" "~5.3.0-rc.2" + "@abp/jquery-validation" "~5.3.0-rc.3" jquery-validation-unobtrusive "^3.2.12" -"@abp/jquery-validation@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-5.3.0-rc.2.tgz#d866b10ffbfc1852df11122aa2cf6a56e50819b3" - integrity sha512-DAxwKjalhMZNCuXBS6Ai9RlIDsEzm0SGnFDApQIo/i6HGKoK4J/eTnFZ175xZMQ79yrxe71MKWR29l/+PuwcRw== +"@abp/jquery-validation@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-5.3.0-rc.3.tgz#917a2b2e7e4b8e5aacdd10284f18f58bfac1743d" + integrity sha512-m2pPTGJs8MQzzdzMpWFD94RU4dqMrwwT4ZJyqz07EPzRv7NURGVlzJOPdwDiTVdiT5UsaYzDF0BYgfj3/FL/iw== dependencies: - "@abp/jquery" "~5.3.0-rc.2" + "@abp/jquery" "~5.3.0-rc.3" jquery-validation "^1.19.3" -"@abp/jquery@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-5.3.0-rc.2.tgz#8a5008123f5dbf1276c719ac45101161e9d9b793" - integrity sha512-VjA22n17pPKqj6jZUk6qxpqx2UT5Uv6q/AvyJtacDC3D1MXfrnSWxi9FAPFp4N52i4knkfuKFZtuFlFSkQe4FQ== +"@abp/jquery@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-5.3.0-rc.3.tgz#e75ca02fa0520c60b1aed14444fc129ed6a27d0b" + integrity sha512-ZJYpnFqByAzHKru1aGz8VLZw4xb/YD1wpahN9pIsPYeFrE6/7Vjs8npQk5it2Ww5gaA3unSrMIc0CMsr5kk0Nw== dependencies: - "@abp/core" "~5.3.0-rc.2" + "@abp/core" "~5.3.0-rc.3" jquery "~3.6.0" -"@abp/lodash@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-5.3.0-rc.2.tgz#51600a0ba49c6d4060c3e280b1f1d62ed7f48a16" - integrity sha512-qreUjH0umhsGKRSYpswcX1SAF1iNBp/AP32LMfvezvPaCA+KQFWknHuOTV2jn1tYC5c7KJTTTp46jRTi88VSHQ== +"@abp/lodash@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-5.3.0-rc.3.tgz#3fcc23626b9e36652ee36847b4a8879cf8aae8ef" + integrity sha512-KJFNAhW3AHi6AAhSlix50gbU9QmQT9TD5RYofEoIm1rfd7iZF0uowJheES0jqHU4PeS80Fnzp8AnBhVYgRMUjg== dependencies: - "@abp/core" "~5.3.0-rc.2" + "@abp/core" "~5.3.0-rc.3" lodash "^4.17.21" -"@abp/luxon@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-5.3.0-rc.2.tgz#6ea39998aaba2a3bd6e6dd3c9cacc1a0f56afa8f" - integrity sha512-9++6ZD0zEmJcH3iSNcTtC0haEVbQgxzoFx1wpEXsB3YVuBKUjJnJCXMbt0Qmkkq40tclmG8bfORRYhII29TLWA== +"@abp/luxon@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-5.3.0-rc.3.tgz#cf9e2070f3b3e1281dcf05ba1781d8daa41da98d" + integrity sha512-1gBfWwFrS+xuTD12dB/LLUbGWCATbByp1kCFbHdgVNOkkkDvJETS0LeB8o/ggw7rBWL5i3Jkpb5xFTRT6yKX4Q== dependencies: - "@abp/core" "~5.3.0-rc.2" + "@abp/core" "~5.3.0-rc.3" luxon "^2.3.0" -"@abp/malihu-custom-scrollbar-plugin@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-5.3.0-rc.2.tgz#069e071472eb8727260e9a1b5322e30cdaebffc9" - integrity sha512-JPaoNiYWR6T7Osx4ezURFanxC9ex1U9zr+7Fko1mmig8oZ+OHsk1cbdNBD5ChgAVsHdqK2eJ4iobDjhsDfMYiA== +"@abp/malihu-custom-scrollbar-plugin@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-5.3.0-rc.3.tgz#1d8d5cede65dbd0d0975d8fabfe135105710ddde" + integrity sha512-SW8UBKQGsS8zrG2RkmGBuze/NgreDWWJ84l2qMKYmTtgL/kOCLm4FBvo44azNOq6a3rYVJGpwirYRBcwrsAfHw== dependencies: - "@abp/core" "~5.3.0-rc.2" + "@abp/core" "~5.3.0-rc.3" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/select2@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-5.3.0-rc.2.tgz#50e622f2296c3594e89699e8747dcf520fb4415d" - integrity sha512-HwfiEgeECkzQhCf/3Je/V7pRtRvr3YQtX1gAWpI6Ty2P+nTV4ue/l1w5Si+59vuJm3JP+fCnSFPlHXxahfL/Gw== +"@abp/select2@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-5.3.0-rc.3.tgz#7a0f9f7472c812b85ce9bc5bd8a557c33e967e7d" + integrity sha512-6t+UXjDh3bzaCWsSxwuRtOgGz+aDidPKA2JKZfKLAFM4WkcLmY8Px0RY3jgsbxrtM9ANncA9gbl69Q3uY2DmHA== dependencies: - "@abp/core" "~5.3.0-rc.2" + "@abp/core" "~5.3.0-rc.3" select2 "^4.0.13" -"@abp/sweetalert2@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-5.3.0-rc.2.tgz#41d19b81011e3d5c9d12b8d6ec6da12e52553683" - integrity sha512-6Qx2WIpXQI/ydfX9P7cMISvwrFi4UAPzkuNkhPOZT7chq64auz88Rtqyw+SLXLnCCQ+e31/ekFldijOG9CbV1g== +"@abp/sweetalert2@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-5.3.0-rc.3.tgz#91557a4b4a103f68a926fde19c830e195597ff0d" + integrity sha512-hAw+E8EnGO9nnyGbGiD/y+SyScHD4R0MEi/eK2bsMSKAzBxKcUBv0MxrsNQc0WhVwqRQETRccdLX3WYofmh8Kw== dependencies: - "@abp/core" "~5.3.0-rc.2" + "@abp/core" "~5.3.0-rc.3" sweetalert2 "^11.3.6" -"@abp/timeago@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-5.3.0-rc.2.tgz#16f73659e83643d82eafac716115dbf0333cce98" - integrity sha512-fFvBX65Bzvg+x4vClzSh31FJJ2m6b2/s+IJ4/t4FNDxDqybfOzkAfRzPm7NVDw5Avu1fjRLwFhQueb0sECQD/w== +"@abp/timeago@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-5.3.0-rc.3.tgz#7480ed2d5ee035d2f43c223d7bb58d794ff3ba2f" + integrity sha512-kgIlH/KGWhYwZSGvCT5LnCYoD+1pSwoQf2GhtvgBUnYqxS6+s0FUSMSzX/MISLOvLWknl2KNnARsOXJkqrWXEw== dependencies: - "@abp/jquery" "~5.3.0-rc.2" + "@abp/jquery" "~5.3.0-rc.3" timeago "^1.6.7" -"@abp/toastr@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-5.3.0-rc.2.tgz#e868ffe7acc3e1838dd008f936e909250e360cc8" - integrity sha512-0BLjOSalZw7NdRXw4/SwPP7N+ChFGO2elEJ7zyd0c8Bi+Gz5lqL6ZW47O1ANKSv9HnPoyRsPDSBiCIvXXtlFOw== +"@abp/toastr@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-5.3.0-rc.3.tgz#1a6f03737c2ae92d62a8b7f51d4c70cc4d97212f" + integrity sha512-Vag9lz2YboyZ0/4Y/OvFG+EaY0PCs5X97ZijZRB+saSRe1pL1+qnBMpniMDUvbMEpitB5Qq+FqdkOnKdhlrH4A== dependencies: - "@abp/jquery" "~5.3.0-rc.2" + "@abp/jquery" "~5.3.0-rc.3" toastr "^2.1.4" -"@abp/utils@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-5.3.0-rc.2.tgz#cbdf34bb32f99396c2a7f6dd2f0fa0b5239413bb" - integrity sha512-0BgsxKwkiNcbBSDJIfxBObM4QYTk1umZ/WnKUdvSyv0Fe4hKK+gDvsBzk97O+ZVyBHIflvcln3dKpS3eIVwhIg== +"@abp/utils@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-5.3.0-rc.3.tgz#e91f10b18ac1e17af7f15c85257c24034cab2ba1" + integrity sha512-vMzsddCvI+M6Qd7Hns5KPUXqdFFboJwAOB9gvxj+MmjVNDCpFTo1hjq0H0zB6NHI8Ik+9sw44D0c7gkTdQQt7Q== dependencies: just-compare "^1.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 02c80e93f1..c2c482a664 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": "^5.3.0-rc.2" + "@abp/aspnetcore.mvc.ui.theme.basic": "^5.3.0-rc.3" } } 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 d5f1b1bf13..ac783877b0 100644 --- a/modules/cms-kit/host/Volo.CmsKit.Web.Host/yarn.lock +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Host/yarn.lock @@ -2,37 +2,37 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.basic@^5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-5.3.0-rc.2.tgz#49da0f1ad2c0ec40eaacccae6874863fde954dda" - integrity sha512-Hb3ukaYMDhftkk7kQ9jVpkqhEoll8wU39/Qdy8JOlrJw3SDqqckWbVcJQkvetqa3mChy6kAVG3xe9ywG1h/6jA== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~5.3.0-rc.2" - -"@abp/aspnetcore.mvc.ui.theme.shared@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-5.3.0-rc.2.tgz#a4e6f033ee17fe7196e94047640bc826a69694a6" - integrity sha512-uKyb8by2dqYvCr9TCD0JKg2W+eLNcHanmQDL+aoI9OAExEEI/DYxw2a5++OntJGvmbcA6o1envmvOjqqsZuX0g== - dependencies: - "@abp/aspnetcore.mvc.ui" "~5.3.0-rc.2" - "@abp/bootstrap" "~5.3.0-rc.2" - "@abp/bootstrap-datepicker" "~5.3.0-rc.2" - "@abp/datatables.net-bs5" "~5.3.0-rc.2" - "@abp/font-awesome" "~5.3.0-rc.2" - "@abp/jquery-form" "~5.3.0-rc.2" - "@abp/jquery-validation-unobtrusive" "~5.3.0-rc.2" - "@abp/lodash" "~5.3.0-rc.2" - "@abp/luxon" "~5.3.0-rc.2" - "@abp/malihu-custom-scrollbar-plugin" "~5.3.0-rc.2" - "@abp/select2" "~5.3.0-rc.2" - "@abp/sweetalert2" "~5.3.0-rc.2" - "@abp/timeago" "~5.3.0-rc.2" - "@abp/toastr" "~5.3.0-rc.2" - -"@abp/aspnetcore.mvc.ui@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-5.3.0-rc.2.tgz#93a3c331cc75d2fbdd466a42777040466295f982" - integrity sha512-10RgXgZChbXNtXMblvvEZQctufJlP29RabfIOKWBTBMtU+jUgtDsLUwmF6Oi/65LLImOUogmBCb9MxjNm71iAQ== +"@abp/aspnetcore.mvc.ui.theme.basic@^5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-5.3.0-rc.3.tgz#726ce9dc03974ee192b3bb6a921a33fb69cf7f95" + integrity sha512-yOXp2ZXNGGDHWKHOXjudH1v7MK5ss1kpQ8DeorrboYybdmeWsq7BtrMIfvfudv8iCIWrg5Jmnf3GQ/7hBxdAdg== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~5.3.0-rc.3" + +"@abp/aspnetcore.mvc.ui.theme.shared@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-5.3.0-rc.3.tgz#34a752e71b965e762a81d758965a30d140501bc9" + integrity sha512-GnGhj6Y2DE1mrSWmp1jRnNvCsUiugWPKxlv1ue5dCdPVOw14OdXa6tLJwnZ38w9OOCDzXQyDUFdr19+uwOvEzQ== + dependencies: + "@abp/aspnetcore.mvc.ui" "~5.3.0-rc.3" + "@abp/bootstrap" "~5.3.0-rc.3" + "@abp/bootstrap-datepicker" "~5.3.0-rc.3" + "@abp/datatables.net-bs5" "~5.3.0-rc.3" + "@abp/font-awesome" "~5.3.0-rc.3" + "@abp/jquery-form" "~5.3.0-rc.3" + "@abp/jquery-validation-unobtrusive" "~5.3.0-rc.3" + "@abp/lodash" "~5.3.0-rc.3" + "@abp/luxon" "~5.3.0-rc.3" + "@abp/malihu-custom-scrollbar-plugin" "~5.3.0-rc.3" + "@abp/select2" "~5.3.0-rc.3" + "@abp/sweetalert2" "~5.3.0-rc.3" + "@abp/timeago" "~5.3.0-rc.3" + "@abp/toastr" "~5.3.0-rc.3" + +"@abp/aspnetcore.mvc.ui@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-5.3.0-rc.3.tgz#810821c844f4a1f248182ed9d3a8b54237b83124" + integrity sha512-1yvpDgZpYegL/JiwPdpCm/VjruEymt5VcamMYLPiUpmGTl0b7QFtUIwjSonE3gHEsBDXj9eCw9Kw3Bi+sd7NNQ== dependencies: ansi-colors "^4.1.1" extend-object "^1.0.0" @@ -41,144 +41,144 @@ merge-stream "^2.0.0" micromatch "^4.0.2" -"@abp/bootstrap-datepicker@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-5.3.0-rc.2.tgz#228735714f2baeb42e864c175e0aed3f855249d7" - integrity sha512-jZ7vGvsLjnXwpzvQ6vjKHWBkiptYBnEDVIfQ/zKV8kvkhdu+xxOP/u1LM90NSR2YckjIRj8+mINEcrnWhXgRNw== +"@abp/bootstrap-datepicker@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-5.3.0-rc.3.tgz#f98743539a1e8d883869aa7a759ba1aa00cd0689" + integrity sha512-VNNROxO1wzjG2q35wKEh4STluZllVggNhb0UyGtpZVNbtLydSxeFGHcve26f8UfEWE3WfC5Yyw8nBOHyJxh6tg== dependencies: bootstrap-datepicker "^1.9.0" -"@abp/bootstrap@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-5.3.0-rc.2.tgz#c410f44d987d09b5a74fd58417d03788fa878884" - integrity sha512-jb58M67kWldW35zTjVDFLaCj4STly2eU40COYFgjPQSH7F21DvMdX69Cp3jpmHaxm8VQE9izgW0NV8+oGlFyAw== +"@abp/bootstrap@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-5.3.0-rc.3.tgz#338b5ce194a257e5f14be2344b4e722874273ab1" + integrity sha512-fom2AboT9d1O3K1cOrIFT9l5Cvw2l42BvxEHkV3sXkZxZSstc9exURQn0WmKxWnOMCwM03N2IMKsFlk6SePN2A== dependencies: - "@abp/core" "~5.3.0-rc.2" + "@abp/core" "~5.3.0-rc.3" bootstrap "^5.1.3" -"@abp/core@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-5.3.0-rc.2.tgz#3a3c6d187c502436bb02db99be3720f61628c924" - integrity sha512-/BEO90D7ibeyZxfCQHv2bbb9y/SpfZtaw0A8gmQlYrH3rZ3Th935v5XjCeYem8IGJ8fDZO7CRzW5TBsku/PukA== +"@abp/core@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-5.3.0-rc.3.tgz#7846bd8582bbb9effdb058b3b815fc1798b33f01" + integrity sha512-RyFoereWj/YOccWFeB5yq4aktKnYl44xrb6LKNkCmcVadbOJ+7AHgHljychTuMZalTvfzW2GcZacIoHw4bhn/A== dependencies: - "@abp/utils" "~5.3.0-rc.2" + "@abp/utils" "~5.3.0-rc.3" -"@abp/datatables.net-bs5@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-5.3.0-rc.2.tgz#452c2112fbe3cdac8c0d12bb626017f7c6333a45" - integrity sha512-Rk1uY76dGMnBFYILdXrb6Oc+jjblLdSzGZvDH1dyoFYs0bLWsjqVsOIE+kCjO447PgDOLyF+4nurLj+A9yCkEg== +"@abp/datatables.net-bs5@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-5.3.0-rc.3.tgz#f420208050a3a6f8e0ad3bcbb6af0e74584d2883" + integrity sha512-gwWMRElBQatElOdWyozYOY7lhYAUQu6/aZnf4XyiTlaWp6g1iMRJKgmaT73DhiIl+jxUiFtWjEla+65cXSl7sA== dependencies: - "@abp/datatables.net" "~5.3.0-rc.2" + "@abp/datatables.net" "~5.3.0-rc.3" datatables.net-bs5 "^1.11.4" -"@abp/datatables.net@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-5.3.0-rc.2.tgz#e7156085d76ab0b20e41fe92f9c99b14822b5f6a" - integrity sha512-aPSSmnBC939uYHR9fxxuvtxq4217qG3f8uf18ar7yWJwzWAYMOOhkmK0rEOqn86ObuXdjMAly7ThyfL6RH2iNQ== +"@abp/datatables.net@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-5.3.0-rc.3.tgz#e4b1f9fe41e788878f9cce082d6a79db9c4a8bae" + integrity sha512-FghO+XGSu9rwKOAUYC5AsB6hh1KrXAJ3GmHFYOIHrcd9nB/e60NtyoOo14TeO/LAFCVLOLq/FIBpEbkUZJZHkA== dependencies: - "@abp/jquery" "~5.3.0-rc.2" + "@abp/jquery" "~5.3.0-rc.3" datatables.net "^1.11.4" -"@abp/font-awesome@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-5.3.0-rc.2.tgz#30995f5f5f6d604cd2241ee677ec14dcfc78377d" - integrity sha512-KFwYcjiq01RxI75qnbDt+G8zFcSEJRurHHZQwcI7ySjtQV5xM41zycOYIOV3SKz/gcyYyBBL5UeJPjsE8cu+Fw== +"@abp/font-awesome@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-5.3.0-rc.3.tgz#ef97f0a95385f1d56d4432b84944379d2cb1bfbd" + integrity sha512-kbm9ZaK8SSMcoeBbMdT1b5rJOZ3y8i/bdqD+3g0s65LEeqXNrKV/TkDdJqns72x4PxUQV6r3naXaEbV6Yj/sXQ== dependencies: - "@abp/core" "~5.3.0-rc.2" + "@abp/core" "~5.3.0-rc.3" "@fortawesome/fontawesome-free" "^5.15.4" -"@abp/jquery-form@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-5.3.0-rc.2.tgz#53561d6966f25bf6f7e91dcb89032fecd2c35d1f" - integrity sha512-94ExZ5q02s7ANpFyQnEcuSUjyra+32jMMkV0ZITbjWlmFRcXEogeIF3q3B4XswRi+yf67kQg7ynYCbGR7JESDg== +"@abp/jquery-form@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-5.3.0-rc.3.tgz#497f0a442323d99a7939ba8f9e5234d1a1891e03" + integrity sha512-gknwOgCEF4oJo9Vz2uM2Dl9dkJ2ulJSLb6YXEsPWx5fAFfIuwOl/5H0I1EE4XemtcEpF6xb+Ettnaxo8TcnIcg== dependencies: - "@abp/jquery" "~5.3.0-rc.2" + "@abp/jquery" "~5.3.0-rc.3" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-5.3.0-rc.2.tgz#957387fb88414a50a5d3d84089ab3704b710645f" - integrity sha512-dIXsxqQ0x+xiLCA2x6xWR3wIvfpT0zukLFOrkCVNSc+mnWWyYlavRnGl3f5W/4jQSPZ9Ao/txhsThfkvO+Mu0Q== +"@abp/jquery-validation-unobtrusive@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-5.3.0-rc.3.tgz#a3e39dfb4ba2e0f45dcfde28bd22ff36c55173a0" + integrity sha512-zgSNkg/mzNDzvE+3cL58nLoV3EvFB/ALiLHudo8GcWsdFxx7R+2DfboCSFE1oJ8do6tED+9YG0/VJiZDXnFPwQ== dependencies: - "@abp/jquery-validation" "~5.3.0-rc.2" + "@abp/jquery-validation" "~5.3.0-rc.3" jquery-validation-unobtrusive "^3.2.12" -"@abp/jquery-validation@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-5.3.0-rc.2.tgz#d866b10ffbfc1852df11122aa2cf6a56e50819b3" - integrity sha512-DAxwKjalhMZNCuXBS6Ai9RlIDsEzm0SGnFDApQIo/i6HGKoK4J/eTnFZ175xZMQ79yrxe71MKWR29l/+PuwcRw== +"@abp/jquery-validation@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-5.3.0-rc.3.tgz#917a2b2e7e4b8e5aacdd10284f18f58bfac1743d" + integrity sha512-m2pPTGJs8MQzzdzMpWFD94RU4dqMrwwT4ZJyqz07EPzRv7NURGVlzJOPdwDiTVdiT5UsaYzDF0BYgfj3/FL/iw== dependencies: - "@abp/jquery" "~5.3.0-rc.2" + "@abp/jquery" "~5.3.0-rc.3" jquery-validation "^1.19.3" -"@abp/jquery@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-5.3.0-rc.2.tgz#8a5008123f5dbf1276c719ac45101161e9d9b793" - integrity sha512-VjA22n17pPKqj6jZUk6qxpqx2UT5Uv6q/AvyJtacDC3D1MXfrnSWxi9FAPFp4N52i4knkfuKFZtuFlFSkQe4FQ== +"@abp/jquery@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-5.3.0-rc.3.tgz#e75ca02fa0520c60b1aed14444fc129ed6a27d0b" + integrity sha512-ZJYpnFqByAzHKru1aGz8VLZw4xb/YD1wpahN9pIsPYeFrE6/7Vjs8npQk5it2Ww5gaA3unSrMIc0CMsr5kk0Nw== dependencies: - "@abp/core" "~5.3.0-rc.2" + "@abp/core" "~5.3.0-rc.3" jquery "~3.6.0" -"@abp/lodash@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-5.3.0-rc.2.tgz#51600a0ba49c6d4060c3e280b1f1d62ed7f48a16" - integrity sha512-qreUjH0umhsGKRSYpswcX1SAF1iNBp/AP32LMfvezvPaCA+KQFWknHuOTV2jn1tYC5c7KJTTTp46jRTi88VSHQ== +"@abp/lodash@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-5.3.0-rc.3.tgz#3fcc23626b9e36652ee36847b4a8879cf8aae8ef" + integrity sha512-KJFNAhW3AHi6AAhSlix50gbU9QmQT9TD5RYofEoIm1rfd7iZF0uowJheES0jqHU4PeS80Fnzp8AnBhVYgRMUjg== dependencies: - "@abp/core" "~5.3.0-rc.2" + "@abp/core" "~5.3.0-rc.3" lodash "^4.17.21" -"@abp/luxon@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-5.3.0-rc.2.tgz#6ea39998aaba2a3bd6e6dd3c9cacc1a0f56afa8f" - integrity sha512-9++6ZD0zEmJcH3iSNcTtC0haEVbQgxzoFx1wpEXsB3YVuBKUjJnJCXMbt0Qmkkq40tclmG8bfORRYhII29TLWA== +"@abp/luxon@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-5.3.0-rc.3.tgz#cf9e2070f3b3e1281dcf05ba1781d8daa41da98d" + integrity sha512-1gBfWwFrS+xuTD12dB/LLUbGWCATbByp1kCFbHdgVNOkkkDvJETS0LeB8o/ggw7rBWL5i3Jkpb5xFTRT6yKX4Q== dependencies: - "@abp/core" "~5.3.0-rc.2" + "@abp/core" "~5.3.0-rc.3" luxon "^2.3.0" -"@abp/malihu-custom-scrollbar-plugin@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-5.3.0-rc.2.tgz#069e071472eb8727260e9a1b5322e30cdaebffc9" - integrity sha512-JPaoNiYWR6T7Osx4ezURFanxC9ex1U9zr+7Fko1mmig8oZ+OHsk1cbdNBD5ChgAVsHdqK2eJ4iobDjhsDfMYiA== +"@abp/malihu-custom-scrollbar-plugin@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-5.3.0-rc.3.tgz#1d8d5cede65dbd0d0975d8fabfe135105710ddde" + integrity sha512-SW8UBKQGsS8zrG2RkmGBuze/NgreDWWJ84l2qMKYmTtgL/kOCLm4FBvo44azNOq6a3rYVJGpwirYRBcwrsAfHw== dependencies: - "@abp/core" "~5.3.0-rc.2" + "@abp/core" "~5.3.0-rc.3" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/select2@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-5.3.0-rc.2.tgz#50e622f2296c3594e89699e8747dcf520fb4415d" - integrity sha512-HwfiEgeECkzQhCf/3Je/V7pRtRvr3YQtX1gAWpI6Ty2P+nTV4ue/l1w5Si+59vuJm3JP+fCnSFPlHXxahfL/Gw== +"@abp/select2@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-5.3.0-rc.3.tgz#7a0f9f7472c812b85ce9bc5bd8a557c33e967e7d" + integrity sha512-6t+UXjDh3bzaCWsSxwuRtOgGz+aDidPKA2JKZfKLAFM4WkcLmY8Px0RY3jgsbxrtM9ANncA9gbl69Q3uY2DmHA== dependencies: - "@abp/core" "~5.3.0-rc.2" + "@abp/core" "~5.3.0-rc.3" select2 "^4.0.13" -"@abp/sweetalert2@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-5.3.0-rc.2.tgz#41d19b81011e3d5c9d12b8d6ec6da12e52553683" - integrity sha512-6Qx2WIpXQI/ydfX9P7cMISvwrFi4UAPzkuNkhPOZT7chq64auz88Rtqyw+SLXLnCCQ+e31/ekFldijOG9CbV1g== +"@abp/sweetalert2@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-5.3.0-rc.3.tgz#91557a4b4a103f68a926fde19c830e195597ff0d" + integrity sha512-hAw+E8EnGO9nnyGbGiD/y+SyScHD4R0MEi/eK2bsMSKAzBxKcUBv0MxrsNQc0WhVwqRQETRccdLX3WYofmh8Kw== dependencies: - "@abp/core" "~5.3.0-rc.2" + "@abp/core" "~5.3.0-rc.3" sweetalert2 "^11.3.6" -"@abp/timeago@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-5.3.0-rc.2.tgz#16f73659e83643d82eafac716115dbf0333cce98" - integrity sha512-fFvBX65Bzvg+x4vClzSh31FJJ2m6b2/s+IJ4/t4FNDxDqybfOzkAfRzPm7NVDw5Avu1fjRLwFhQueb0sECQD/w== +"@abp/timeago@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-5.3.0-rc.3.tgz#7480ed2d5ee035d2f43c223d7bb58d794ff3ba2f" + integrity sha512-kgIlH/KGWhYwZSGvCT5LnCYoD+1pSwoQf2GhtvgBUnYqxS6+s0FUSMSzX/MISLOvLWknl2KNnARsOXJkqrWXEw== dependencies: - "@abp/jquery" "~5.3.0-rc.2" + "@abp/jquery" "~5.3.0-rc.3" timeago "^1.6.7" -"@abp/toastr@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-5.3.0-rc.2.tgz#e868ffe7acc3e1838dd008f936e909250e360cc8" - integrity sha512-0BLjOSalZw7NdRXw4/SwPP7N+ChFGO2elEJ7zyd0c8Bi+Gz5lqL6ZW47O1ANKSv9HnPoyRsPDSBiCIvXXtlFOw== +"@abp/toastr@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-5.3.0-rc.3.tgz#1a6f03737c2ae92d62a8b7f51d4c70cc4d97212f" + integrity sha512-Vag9lz2YboyZ0/4Y/OvFG+EaY0PCs5X97ZijZRB+saSRe1pL1+qnBMpniMDUvbMEpitB5Qq+FqdkOnKdhlrH4A== dependencies: - "@abp/jquery" "~5.3.0-rc.2" + "@abp/jquery" "~5.3.0-rc.3" toastr "^2.1.4" -"@abp/utils@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-5.3.0-rc.2.tgz#cbdf34bb32f99396c2a7f6dd2f0fa0b5239413bb" - integrity sha512-0BgsxKwkiNcbBSDJIfxBObM4QYTk1umZ/WnKUdvSyv0Fe4hKK+gDvsBzk97O+ZVyBHIflvcln3dKpS3eIVwhIg== +"@abp/utils@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-5.3.0-rc.3.tgz#e91f10b18ac1e17af7f15c85257c24034cab2ba1" + integrity sha512-vMzsddCvI+M6Qd7Hns5KPUXqdFFboJwAOB9gvxj+MmjVNDCpFTo1hjq0H0zB6NHI8Ik+9sw44D0c7gkTdQQt7Q== dependencies: just-compare "^1.3.0" diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/package.json b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/package.json index cad17f9fae..ae366f71c6 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": "^5.3.0-rc.2", - "@abp/cms-kit": "5.3.0-rc.2" + "@abp/aspnetcore.mvc.ui.theme.basic": "^5.3.0-rc.3", + "@abp/cms-kit": "5.3.0-rc.3" } } 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 10047181d8..e90bba211a 100644 --- a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/yarn.lock +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/yarn.lock @@ -2,37 +2,37 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.basic@^5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-5.3.0-rc.2.tgz#49da0f1ad2c0ec40eaacccae6874863fde954dda" - integrity sha512-Hb3ukaYMDhftkk7kQ9jVpkqhEoll8wU39/Qdy8JOlrJw3SDqqckWbVcJQkvetqa3mChy6kAVG3xe9ywG1h/6jA== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~5.3.0-rc.2" - -"@abp/aspnetcore.mvc.ui.theme.shared@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-5.3.0-rc.2.tgz#a4e6f033ee17fe7196e94047640bc826a69694a6" - integrity sha512-uKyb8by2dqYvCr9TCD0JKg2W+eLNcHanmQDL+aoI9OAExEEI/DYxw2a5++OntJGvmbcA6o1envmvOjqqsZuX0g== - dependencies: - "@abp/aspnetcore.mvc.ui" "~5.3.0-rc.2" - "@abp/bootstrap" "~5.3.0-rc.2" - "@abp/bootstrap-datepicker" "~5.3.0-rc.2" - "@abp/datatables.net-bs5" "~5.3.0-rc.2" - "@abp/font-awesome" "~5.3.0-rc.2" - "@abp/jquery-form" "~5.3.0-rc.2" - "@abp/jquery-validation-unobtrusive" "~5.3.0-rc.2" - "@abp/lodash" "~5.3.0-rc.2" - "@abp/luxon" "~5.3.0-rc.2" - "@abp/malihu-custom-scrollbar-plugin" "~5.3.0-rc.2" - "@abp/select2" "~5.3.0-rc.2" - "@abp/sweetalert2" "~5.3.0-rc.2" - "@abp/timeago" "~5.3.0-rc.2" - "@abp/toastr" "~5.3.0-rc.2" - -"@abp/aspnetcore.mvc.ui@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-5.3.0-rc.2.tgz#93a3c331cc75d2fbdd466a42777040466295f982" - integrity sha512-10RgXgZChbXNtXMblvvEZQctufJlP29RabfIOKWBTBMtU+jUgtDsLUwmF6Oi/65LLImOUogmBCb9MxjNm71iAQ== +"@abp/aspnetcore.mvc.ui.theme.basic@^5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-5.3.0-rc.3.tgz#726ce9dc03974ee192b3bb6a921a33fb69cf7f95" + integrity sha512-yOXp2ZXNGGDHWKHOXjudH1v7MK5ss1kpQ8DeorrboYybdmeWsq7BtrMIfvfudv8iCIWrg5Jmnf3GQ/7hBxdAdg== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~5.3.0-rc.3" + +"@abp/aspnetcore.mvc.ui.theme.shared@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-5.3.0-rc.3.tgz#34a752e71b965e762a81d758965a30d140501bc9" + integrity sha512-GnGhj6Y2DE1mrSWmp1jRnNvCsUiugWPKxlv1ue5dCdPVOw14OdXa6tLJwnZ38w9OOCDzXQyDUFdr19+uwOvEzQ== + dependencies: + "@abp/aspnetcore.mvc.ui" "~5.3.0-rc.3" + "@abp/bootstrap" "~5.3.0-rc.3" + "@abp/bootstrap-datepicker" "~5.3.0-rc.3" + "@abp/datatables.net-bs5" "~5.3.0-rc.3" + "@abp/font-awesome" "~5.3.0-rc.3" + "@abp/jquery-form" "~5.3.0-rc.3" + "@abp/jquery-validation-unobtrusive" "~5.3.0-rc.3" + "@abp/lodash" "~5.3.0-rc.3" + "@abp/luxon" "~5.3.0-rc.3" + "@abp/malihu-custom-scrollbar-plugin" "~5.3.0-rc.3" + "@abp/select2" "~5.3.0-rc.3" + "@abp/sweetalert2" "~5.3.0-rc.3" + "@abp/timeago" "~5.3.0-rc.3" + "@abp/toastr" "~5.3.0-rc.3" + +"@abp/aspnetcore.mvc.ui@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-5.3.0-rc.3.tgz#810821c844f4a1f248182ed9d3a8b54237b83124" + integrity sha512-1yvpDgZpYegL/JiwPdpCm/VjruEymt5VcamMYLPiUpmGTl0b7QFtUIwjSonE3gHEsBDXj9eCw9Kw3Bi+sd7NNQ== dependencies: ansi-colors "^4.1.1" extend-object "^1.0.0" @@ -41,243 +41,243 @@ merge-stream "^2.0.0" micromatch "^4.0.2" -"@abp/bootstrap-datepicker@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-5.3.0-rc.2.tgz#228735714f2baeb42e864c175e0aed3f855249d7" - integrity sha512-jZ7vGvsLjnXwpzvQ6vjKHWBkiptYBnEDVIfQ/zKV8kvkhdu+xxOP/u1LM90NSR2YckjIRj8+mINEcrnWhXgRNw== +"@abp/bootstrap-datepicker@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-5.3.0-rc.3.tgz#f98743539a1e8d883869aa7a759ba1aa00cd0689" + integrity sha512-VNNROxO1wzjG2q35wKEh4STluZllVggNhb0UyGtpZVNbtLydSxeFGHcve26f8UfEWE3WfC5Yyw8nBOHyJxh6tg== dependencies: bootstrap-datepicker "^1.9.0" -"@abp/bootstrap@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-5.3.0-rc.2.tgz#c410f44d987d09b5a74fd58417d03788fa878884" - integrity sha512-jb58M67kWldW35zTjVDFLaCj4STly2eU40COYFgjPQSH7F21DvMdX69Cp3jpmHaxm8VQE9izgW0NV8+oGlFyAw== +"@abp/bootstrap@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-5.3.0-rc.3.tgz#338b5ce194a257e5f14be2344b4e722874273ab1" + integrity sha512-fom2AboT9d1O3K1cOrIFT9l5Cvw2l42BvxEHkV3sXkZxZSstc9exURQn0WmKxWnOMCwM03N2IMKsFlk6SePN2A== dependencies: - "@abp/core" "~5.3.0-rc.2" + "@abp/core" "~5.3.0-rc.3" bootstrap "^5.1.3" -"@abp/clipboard@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-5.3.0-rc.2.tgz#e9a4f38a5d33d88a5c2440422a87e403671b3ed8" - integrity sha512-8OKcmGych7cmcYn8tuUmGo+mMlThNBDZA71c/cVAGw1RuLM16SCgeJVeVFhyUrmkBwH/E5Hfh06ZLlIrZKj36Q== +"@abp/clipboard@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-5.3.0-rc.3.tgz#30ed8014dfc383f53df91553cef8d405a6d9070a" + integrity sha512-4IVMgasvomY8Q0m1Y48VJr5TK3+BmeAQhEp+B4h2whE+/uIFpAhFWS5U0Bie9GjqQdEEqJ1a01tn16fK9jpzcw== dependencies: - "@abp/core" "~5.3.0-rc.2" + "@abp/core" "~5.3.0-rc.3" clipboard "^2.0.8" -"@abp/cms-kit.admin@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/cms-kit.admin/-/cms-kit.admin-5.3.0-rc.2.tgz#31ec41e5ce1143fe1ad03f8aa63e98384d097a14" - integrity sha512-ZppUtDIdeSTmch7/xalUap5Jh1LZy0VbpgzkCzZ6VjgDo0uAMcZ09V+09kuHZWfRcy5T5VMl+YvJKryrjCzSrA== +"@abp/cms-kit.admin@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/cms-kit.admin/-/cms-kit.admin-5.3.0-rc.3.tgz#008b3b76cc8254ce195b464ade2faaebc5a67e9b" + integrity sha512-z0NCiPGLi1vuh6fyWlnewqyYiyRU8KSQ5s7coWSp1IILjQx+C3vLYctdjpCL2iUC06pJp9zwR+obT2vW7a17YA== dependencies: - "@abp/codemirror" "~5.3.0-rc.2" - "@abp/jstree" "~5.3.0-rc.2" - "@abp/slugify" "~5.3.0-rc.2" - "@abp/tui-editor" "~5.3.0-rc.2" - "@abp/uppy" "~5.3.0-rc.2" + "@abp/codemirror" "~5.3.0-rc.3" + "@abp/jstree" "~5.3.0-rc.3" + "@abp/slugify" "~5.3.0-rc.3" + "@abp/tui-editor" "~5.3.0-rc.3" + "@abp/uppy" "~5.3.0-rc.3" -"@abp/cms-kit.public@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/cms-kit.public/-/cms-kit.public-5.3.0-rc.2.tgz#77639a85fc0d148ce3202778f8f0dec274de5088" - integrity sha512-Ati7T1faNYEs6bax+mWROpHtBV5lwDItvrf66ET+TqbbJGlXqdvSf7br1hslPThrXfqhDth3CkPFrT9nmP9WAg== +"@abp/cms-kit.public@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/cms-kit.public/-/cms-kit.public-5.3.0-rc.3.tgz#d20c34a3399309e430df844b544bcf823a65d0ea" + integrity sha512-//uKZBdmbpTyvdPxqA3YqfhNgkxsqCJWlhW0WHkYj7VNUDQF92n69GzstPC0IlF1A722GS6ymOQQxEFN2LVyyQ== dependencies: - "@abp/highlight.js" "~5.3.0-rc.2" - "@abp/star-rating-svg" "~5.3.0-rc.2" + "@abp/highlight.js" "~5.3.0-rc.3" + "@abp/star-rating-svg" "~5.3.0-rc.3" -"@abp/cms-kit@5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/cms-kit/-/cms-kit-5.3.0-rc.2.tgz#f959da04caf21fc4e1e0b4961451c73ee3b3f4e1" - integrity sha512-RtARr+YXULHnY8Gr8VakDUjOSM380KlfuG9Q5Oo3XIGXhJxERxlHzanJZZ9CAjF8j30A5D/+B9ZgvTtcHjevsA== +"@abp/cms-kit@5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/cms-kit/-/cms-kit-5.3.0-rc.3.tgz#4c4fbf7c4caa4ef559f2d045945e22ae9ef70775" + integrity sha512-8CFKOLVC0HX6uKCO57AVI5peMBineYB0dwJtdCoEAR4BcIOlUeAriTsD7riVOYpJMDk8ZcEYreQpusY/ikwqBg== dependencies: - "@abp/cms-kit.admin" "~5.3.0-rc.2" - "@abp/cms-kit.public" "~5.3.0-rc.2" + "@abp/cms-kit.admin" "~5.3.0-rc.3" + "@abp/cms-kit.public" "~5.3.0-rc.3" -"@abp/codemirror@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/codemirror/-/codemirror-5.3.0-rc.2.tgz#7c308e1dc69921ee5c70b791d345500da7b7c955" - integrity sha512-5NVhFrMgsMfGcoajJ3Pycy01Axl0u276XSx6fE5NeugEy/anXN6IH6bK2qUOmuuOzdtRTJ/nGemDJS2RGnmKVA== +"@abp/codemirror@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/codemirror/-/codemirror-5.3.0-rc.3.tgz#65e253eb2313a9c57c29d7ab3b2dd7740c4a2ab1" + integrity sha512-zf65dI0ScFsIHkGuf8nDLElGWLyMEF7JFyFDrS+TxeiZVTFCuvpjk79Aiptvf2oyYtg21vBxWVca2oif1mr30w== dependencies: - "@abp/core" "~5.3.0-rc.2" + "@abp/core" "~5.3.0-rc.3" codemirror "^5.65.1" -"@abp/core@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-5.3.0-rc.2.tgz#3a3c6d187c502436bb02db99be3720f61628c924" - integrity sha512-/BEO90D7ibeyZxfCQHv2bbb9y/SpfZtaw0A8gmQlYrH3rZ3Th935v5XjCeYem8IGJ8fDZO7CRzW5TBsku/PukA== +"@abp/core@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-5.3.0-rc.3.tgz#7846bd8582bbb9effdb058b3b815fc1798b33f01" + integrity sha512-RyFoereWj/YOccWFeB5yq4aktKnYl44xrb6LKNkCmcVadbOJ+7AHgHljychTuMZalTvfzW2GcZacIoHw4bhn/A== dependencies: - "@abp/utils" "~5.3.0-rc.2" + "@abp/utils" "~5.3.0-rc.3" -"@abp/datatables.net-bs5@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-5.3.0-rc.2.tgz#452c2112fbe3cdac8c0d12bb626017f7c6333a45" - integrity sha512-Rk1uY76dGMnBFYILdXrb6Oc+jjblLdSzGZvDH1dyoFYs0bLWsjqVsOIE+kCjO447PgDOLyF+4nurLj+A9yCkEg== +"@abp/datatables.net-bs5@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-5.3.0-rc.3.tgz#f420208050a3a6f8e0ad3bcbb6af0e74584d2883" + integrity sha512-gwWMRElBQatElOdWyozYOY7lhYAUQu6/aZnf4XyiTlaWp6g1iMRJKgmaT73DhiIl+jxUiFtWjEla+65cXSl7sA== dependencies: - "@abp/datatables.net" "~5.3.0-rc.2" + "@abp/datatables.net" "~5.3.0-rc.3" datatables.net-bs5 "^1.11.4" -"@abp/datatables.net@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-5.3.0-rc.2.tgz#e7156085d76ab0b20e41fe92f9c99b14822b5f6a" - integrity sha512-aPSSmnBC939uYHR9fxxuvtxq4217qG3f8uf18ar7yWJwzWAYMOOhkmK0rEOqn86ObuXdjMAly7ThyfL6RH2iNQ== +"@abp/datatables.net@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-5.3.0-rc.3.tgz#e4b1f9fe41e788878f9cce082d6a79db9c4a8bae" + integrity sha512-FghO+XGSu9rwKOAUYC5AsB6hh1KrXAJ3GmHFYOIHrcd9nB/e60NtyoOo14TeO/LAFCVLOLq/FIBpEbkUZJZHkA== dependencies: - "@abp/jquery" "~5.3.0-rc.2" + "@abp/jquery" "~5.3.0-rc.3" datatables.net "^1.11.4" -"@abp/font-awesome@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-5.3.0-rc.2.tgz#30995f5f5f6d604cd2241ee677ec14dcfc78377d" - integrity sha512-KFwYcjiq01RxI75qnbDt+G8zFcSEJRurHHZQwcI7ySjtQV5xM41zycOYIOV3SKz/gcyYyBBL5UeJPjsE8cu+Fw== +"@abp/font-awesome@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-5.3.0-rc.3.tgz#ef97f0a95385f1d56d4432b84944379d2cb1bfbd" + integrity sha512-kbm9ZaK8SSMcoeBbMdT1b5rJOZ3y8i/bdqD+3g0s65LEeqXNrKV/TkDdJqns72x4PxUQV6r3naXaEbV6Yj/sXQ== dependencies: - "@abp/core" "~5.3.0-rc.2" + "@abp/core" "~5.3.0-rc.3" "@fortawesome/fontawesome-free" "^5.15.4" -"@abp/highlight.js@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/highlight.js/-/highlight.js-5.3.0-rc.2.tgz#d0837fae2f985382e4d689c0bb81a5849bb470b7" - integrity sha512-BlDTmyok5zj7ud+QYM0NAcEhOJ5OBpPIktAPgqN/4ulIP7XY+Ylq1VbqMsQjO7hOdHDZ79wLOT3cGlnBn5V9MQ== +"@abp/highlight.js@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/highlight.js/-/highlight.js-5.3.0-rc.3.tgz#5a64b01c0a2b580c7281a2e020f4f7d172abf6b4" + integrity sha512-W1KkclGXR7VWmMq317y6dOvRWBNSsOrhMSck/up+uV+wmbqR3ON2Zxh78AqJlUHTQu0PK54CZYi722j3E6Im4A== dependencies: - "@abp/core" "~5.3.0-rc.2" + "@abp/core" "~5.3.0-rc.3" "@highlightjs/cdn-assets" "~11.4.0" -"@abp/jquery-form@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-5.3.0-rc.2.tgz#53561d6966f25bf6f7e91dcb89032fecd2c35d1f" - integrity sha512-94ExZ5q02s7ANpFyQnEcuSUjyra+32jMMkV0ZITbjWlmFRcXEogeIF3q3B4XswRi+yf67kQg7ynYCbGR7JESDg== +"@abp/jquery-form@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-5.3.0-rc.3.tgz#497f0a442323d99a7939ba8f9e5234d1a1891e03" + integrity sha512-gknwOgCEF4oJo9Vz2uM2Dl9dkJ2ulJSLb6YXEsPWx5fAFfIuwOl/5H0I1EE4XemtcEpF6xb+Ettnaxo8TcnIcg== dependencies: - "@abp/jquery" "~5.3.0-rc.2" + "@abp/jquery" "~5.3.0-rc.3" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-5.3.0-rc.2.tgz#957387fb88414a50a5d3d84089ab3704b710645f" - integrity sha512-dIXsxqQ0x+xiLCA2x6xWR3wIvfpT0zukLFOrkCVNSc+mnWWyYlavRnGl3f5W/4jQSPZ9Ao/txhsThfkvO+Mu0Q== +"@abp/jquery-validation-unobtrusive@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-5.3.0-rc.3.tgz#a3e39dfb4ba2e0f45dcfde28bd22ff36c55173a0" + integrity sha512-zgSNkg/mzNDzvE+3cL58nLoV3EvFB/ALiLHudo8GcWsdFxx7R+2DfboCSFE1oJ8do6tED+9YG0/VJiZDXnFPwQ== dependencies: - "@abp/jquery-validation" "~5.3.0-rc.2" + "@abp/jquery-validation" "~5.3.0-rc.3" jquery-validation-unobtrusive "^3.2.12" -"@abp/jquery-validation@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-5.3.0-rc.2.tgz#d866b10ffbfc1852df11122aa2cf6a56e50819b3" - integrity sha512-DAxwKjalhMZNCuXBS6Ai9RlIDsEzm0SGnFDApQIo/i6HGKoK4J/eTnFZ175xZMQ79yrxe71MKWR29l/+PuwcRw== +"@abp/jquery-validation@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-5.3.0-rc.3.tgz#917a2b2e7e4b8e5aacdd10284f18f58bfac1743d" + integrity sha512-m2pPTGJs8MQzzdzMpWFD94RU4dqMrwwT4ZJyqz07EPzRv7NURGVlzJOPdwDiTVdiT5UsaYzDF0BYgfj3/FL/iw== dependencies: - "@abp/jquery" "~5.3.0-rc.2" + "@abp/jquery" "~5.3.0-rc.3" jquery-validation "^1.19.3" -"@abp/jquery@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-5.3.0-rc.2.tgz#8a5008123f5dbf1276c719ac45101161e9d9b793" - integrity sha512-VjA22n17pPKqj6jZUk6qxpqx2UT5Uv6q/AvyJtacDC3D1MXfrnSWxi9FAPFp4N52i4knkfuKFZtuFlFSkQe4FQ== +"@abp/jquery@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-5.3.0-rc.3.tgz#e75ca02fa0520c60b1aed14444fc129ed6a27d0b" + integrity sha512-ZJYpnFqByAzHKru1aGz8VLZw4xb/YD1wpahN9pIsPYeFrE6/7Vjs8npQk5it2Ww5gaA3unSrMIc0CMsr5kk0Nw== dependencies: - "@abp/core" "~5.3.0-rc.2" + "@abp/core" "~5.3.0-rc.3" jquery "~3.6.0" -"@abp/jstree@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jstree/-/jstree-5.3.0-rc.2.tgz#e89ec5b6898591ee1544199df97f1ffa050c2f9b" - integrity sha512-jgmQI2Ehe3KNn1dMFzzjr4g9GoznYA6CBdBqzAPsx+Df8ZZJQsYl55GSK2TlXRCZ+9Bfbo+Z7JXcUodkvAzXFA== +"@abp/jstree@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/jstree/-/jstree-5.3.0-rc.3.tgz#dc065f231ebd3348f00d03c43bf78f967da3c683" + integrity sha512-7iTzrsX9uXQ6URMkzdy46lBQRX0FO1QPtFs8gSORofxlvz7ZPkpsNcos9+t2p8JmdZdAzl/FN/1oPqust0ZAYA== dependencies: - "@abp/jquery" "~5.3.0-rc.2" + "@abp/jquery" "~5.3.0-rc.3" jstree "^3.3.12" -"@abp/lodash@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-5.3.0-rc.2.tgz#51600a0ba49c6d4060c3e280b1f1d62ed7f48a16" - integrity sha512-qreUjH0umhsGKRSYpswcX1SAF1iNBp/AP32LMfvezvPaCA+KQFWknHuOTV2jn1tYC5c7KJTTTp46jRTi88VSHQ== +"@abp/lodash@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-5.3.0-rc.3.tgz#3fcc23626b9e36652ee36847b4a8879cf8aae8ef" + integrity sha512-KJFNAhW3AHi6AAhSlix50gbU9QmQT9TD5RYofEoIm1rfd7iZF0uowJheES0jqHU4PeS80Fnzp8AnBhVYgRMUjg== dependencies: - "@abp/core" "~5.3.0-rc.2" + "@abp/core" "~5.3.0-rc.3" lodash "^4.17.21" -"@abp/luxon@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-5.3.0-rc.2.tgz#6ea39998aaba2a3bd6e6dd3c9cacc1a0f56afa8f" - integrity sha512-9++6ZD0zEmJcH3iSNcTtC0haEVbQgxzoFx1wpEXsB3YVuBKUjJnJCXMbt0Qmkkq40tclmG8bfORRYhII29TLWA== +"@abp/luxon@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-5.3.0-rc.3.tgz#cf9e2070f3b3e1281dcf05ba1781d8daa41da98d" + integrity sha512-1gBfWwFrS+xuTD12dB/LLUbGWCATbByp1kCFbHdgVNOkkkDvJETS0LeB8o/ggw7rBWL5i3Jkpb5xFTRT6yKX4Q== dependencies: - "@abp/core" "~5.3.0-rc.2" + "@abp/core" "~5.3.0-rc.3" luxon "^2.3.0" -"@abp/malihu-custom-scrollbar-plugin@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-5.3.0-rc.2.tgz#069e071472eb8727260e9a1b5322e30cdaebffc9" - integrity sha512-JPaoNiYWR6T7Osx4ezURFanxC9ex1U9zr+7Fko1mmig8oZ+OHsk1cbdNBD5ChgAVsHdqK2eJ4iobDjhsDfMYiA== +"@abp/malihu-custom-scrollbar-plugin@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-5.3.0-rc.3.tgz#1d8d5cede65dbd0d0975d8fabfe135105710ddde" + integrity sha512-SW8UBKQGsS8zrG2RkmGBuze/NgreDWWJ84l2qMKYmTtgL/kOCLm4FBvo44azNOq6a3rYVJGpwirYRBcwrsAfHw== dependencies: - "@abp/core" "~5.3.0-rc.2" + "@abp/core" "~5.3.0-rc.3" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/prismjs@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-5.3.0-rc.2.tgz#8a5ed8032a1e8ba7644adbffae9efdc18c3811f7" - integrity sha512-G7ab7PL0TcjtvA9rdFj0RajP0pXZrXmIzKZ/vtQqW6mNLXNCI1OKJ/fAXXwS35gFEyVPvn9xKPnuYlhwqWl6ug== +"@abp/prismjs@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-5.3.0-rc.3.tgz#c382946b15c820a01e3833ba5c4b3f6d52f8365c" + integrity sha512-a/lahdqzBEcsQ8j9Vjg8KC8xyDroGBi+4NIV2wb+k0CAaA49L25lfq0RSCji5RgyZ9Hjznhg/NyD6AFKaB3ykA== dependencies: - "@abp/clipboard" "~5.3.0-rc.2" - "@abp/core" "~5.3.0-rc.2" + "@abp/clipboard" "~5.3.0-rc.3" + "@abp/core" "~5.3.0-rc.3" prismjs "^1.26.0" -"@abp/select2@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-5.3.0-rc.2.tgz#50e622f2296c3594e89699e8747dcf520fb4415d" - integrity sha512-HwfiEgeECkzQhCf/3Je/V7pRtRvr3YQtX1gAWpI6Ty2P+nTV4ue/l1w5Si+59vuJm3JP+fCnSFPlHXxahfL/Gw== +"@abp/select2@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-5.3.0-rc.3.tgz#7a0f9f7472c812b85ce9bc5bd8a557c33e967e7d" + integrity sha512-6t+UXjDh3bzaCWsSxwuRtOgGz+aDidPKA2JKZfKLAFM4WkcLmY8Px0RY3jgsbxrtM9ANncA9gbl69Q3uY2DmHA== dependencies: - "@abp/core" "~5.3.0-rc.2" + "@abp/core" "~5.3.0-rc.3" select2 "^4.0.13" -"@abp/slugify@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/slugify/-/slugify-5.3.0-rc.2.tgz#c5991d4625655c5cad6397885c78eab3a7933bef" - integrity sha512-5AqYkUHwzl7lXpZzXnp03fTSaxOkOWEXEQ1r47bWZz2o5IeI5csEKedV7/1DARXaUjrFYFWleFLceqiml4RK5w== +"@abp/slugify@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/slugify/-/slugify-5.3.0-rc.3.tgz#5b0279a18c9ba79613b91e196af642d16c244893" + integrity sha512-oONsqNzD9GNoxueO0LWYMDAZ/6RTxDgBULTYxS8F0jZdivGYfsgv6xtGi8omKDJq+H5Ap3yw3fw4X78Gy3uIjQ== dependencies: slugify "^1.6.5" -"@abp/star-rating-svg@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/star-rating-svg/-/star-rating-svg-5.3.0-rc.2.tgz#ef05336a5ed45335ed80884e7ac3000a4cca6271" - integrity sha512-oE6Sv3JdYwIvVXFCsNxHVykvcAUxtRuM3KEWdoCm7G3vl4576G5gk0HwOSLfs3KwWWzQGnUbqyNAs91DXGM1bg== +"@abp/star-rating-svg@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/star-rating-svg/-/star-rating-svg-5.3.0-rc.3.tgz#0e68f225eae78106d80812fcc32d20bdb3fc11f1" + integrity sha512-VaM6FBY0ePJdXs/yw0Jx+GgRDv3RqrGj7qAdcSyrfqfzhTm97g34RtSHtLTVsvSVn5rLaUn6QEpOvgIF05mJ1A== dependencies: - "@abp/jquery" "~5.3.0-rc.2" + "@abp/jquery" "~5.3.0-rc.3" star-rating-svg "^3.5.0" -"@abp/sweetalert2@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-5.3.0-rc.2.tgz#41d19b81011e3d5c9d12b8d6ec6da12e52553683" - integrity sha512-6Qx2WIpXQI/ydfX9P7cMISvwrFi4UAPzkuNkhPOZT7chq64auz88Rtqyw+SLXLnCCQ+e31/ekFldijOG9CbV1g== +"@abp/sweetalert2@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-5.3.0-rc.3.tgz#91557a4b4a103f68a926fde19c830e195597ff0d" + integrity sha512-hAw+E8EnGO9nnyGbGiD/y+SyScHD4R0MEi/eK2bsMSKAzBxKcUBv0MxrsNQc0WhVwqRQETRccdLX3WYofmh8Kw== dependencies: - "@abp/core" "~5.3.0-rc.2" + "@abp/core" "~5.3.0-rc.3" sweetalert2 "^11.3.6" -"@abp/timeago@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-5.3.0-rc.2.tgz#16f73659e83643d82eafac716115dbf0333cce98" - integrity sha512-fFvBX65Bzvg+x4vClzSh31FJJ2m6b2/s+IJ4/t4FNDxDqybfOzkAfRzPm7NVDw5Avu1fjRLwFhQueb0sECQD/w== +"@abp/timeago@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-5.3.0-rc.3.tgz#7480ed2d5ee035d2f43c223d7bb58d794ff3ba2f" + integrity sha512-kgIlH/KGWhYwZSGvCT5LnCYoD+1pSwoQf2GhtvgBUnYqxS6+s0FUSMSzX/MISLOvLWknl2KNnARsOXJkqrWXEw== dependencies: - "@abp/jquery" "~5.3.0-rc.2" + "@abp/jquery" "~5.3.0-rc.3" timeago "^1.6.7" -"@abp/toastr@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-5.3.0-rc.2.tgz#e868ffe7acc3e1838dd008f936e909250e360cc8" - integrity sha512-0BLjOSalZw7NdRXw4/SwPP7N+ChFGO2elEJ7zyd0c8Bi+Gz5lqL6ZW47O1ANKSv9HnPoyRsPDSBiCIvXXtlFOw== +"@abp/toastr@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-5.3.0-rc.3.tgz#1a6f03737c2ae92d62a8b7f51d4c70cc4d97212f" + integrity sha512-Vag9lz2YboyZ0/4Y/OvFG+EaY0PCs5X97ZijZRB+saSRe1pL1+qnBMpniMDUvbMEpitB5Qq+FqdkOnKdhlrH4A== dependencies: - "@abp/jquery" "~5.3.0-rc.2" + "@abp/jquery" "~5.3.0-rc.3" toastr "^2.1.4" -"@abp/tui-editor@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/tui-editor/-/tui-editor-5.3.0-rc.2.tgz#34d82fca81892cdd6a269ae7d61334db96a7af60" - integrity sha512-eWuwAz71MOkJ+oYWqpCfA5f4555cTGWe8pZJPboTfVluym/O8wyGfldMx8jxOq4F4EqogrUozgq6jHZRgQy0kg== +"@abp/tui-editor@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/tui-editor/-/tui-editor-5.3.0-rc.3.tgz#15059c844009e4fea931fc5ef1c7e7128dd453ee" + integrity sha512-m1CLpUzQsJaea3jKPBkII9+erHn+6kvltJXMePI5DSXDGYvaEZiO05pbk30rk0QsSYm++jTiGS+83JllfR/tTA== dependencies: - "@abp/jquery" "~5.3.0-rc.2" - "@abp/prismjs" "~5.3.0-rc.2" + "@abp/jquery" "~5.3.0-rc.3" + "@abp/prismjs" "~5.3.0-rc.3" -"@abp/uppy@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/uppy/-/uppy-5.3.0-rc.2.tgz#e16d95e629a7df878089f416244eeb6527940442" - integrity sha512-h0evvkMicfGuU0oy4iEAo6Wsg6c/5drsTLQyOUfXPE015K0dmkmx2D9h55QhFwb6m4Tw/YvL557yawenwwG7Hw== +"@abp/uppy@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/uppy/-/uppy-5.3.0-rc.3.tgz#a4048e3c23cb9ac9e3106404b45c634e18a1edbe" + integrity sha512-Imy4AD0WJSVKMsZrovd9U9uASuNmSdTUb7ntM8lXn32vVyT8WLl8Eezwccj9do//ECtS7w8qztSP2+jJUUWoZw== dependencies: - "@abp/core" "~5.3.0-rc.2" + "@abp/core" "~5.3.0-rc.3" uppy "^1.16.1" -"@abp/utils@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-5.3.0-rc.2.tgz#cbdf34bb32f99396c2a7f6dd2f0fa0b5239413bb" - integrity sha512-0BgsxKwkiNcbBSDJIfxBObM4QYTk1umZ/WnKUdvSyv0Fe4hKK+gDvsBzk97O+ZVyBHIflvcln3dKpS3eIVwhIg== +"@abp/utils@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-5.3.0-rc.3.tgz#e91f10b18ac1e17af7f15c85257c24034cab2ba1" + integrity sha512-vMzsddCvI+M6Qd7Hns5KPUXqdFFboJwAOB9gvxj+MmjVNDCpFTo1hjq0H0zB6NHI8Ik+9sw44D0c7gkTdQQt7Q== dependencies: just-compare "^1.3.0" diff --git a/modules/docs/app/VoloDocs.Web/package.json b/modules/docs/app/VoloDocs.Web/package.json index 5257786f65..0b5691b05e 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": "^5.3.0-rc.2", - "@abp/docs": "^5.3.0-rc.2" + "@abp/aspnetcore.mvc.ui.theme.basic": "^5.3.0-rc.3", + "@abp/docs": "^5.3.0-rc.3" } } diff --git a/modules/docs/app/VoloDocs.Web/yarn.lock b/modules/docs/app/VoloDocs.Web/yarn.lock index c96a0f6660..b1632096a8 100644 --- a/modules/docs/app/VoloDocs.Web/yarn.lock +++ b/modules/docs/app/VoloDocs.Web/yarn.lock @@ -2,45 +2,45 @@ # yarn lockfile v1 -"@abp/anchor-js@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/anchor-js/-/anchor-js-5.3.0-rc.2.tgz#8a8ac600bcc4f337c000156357f931f8186d73c4" - integrity sha512-8LJrBMCVpXZYe1ebvnrPVAAzm0/2IuTamudTQI0reQxINtqi3kFZEAe1r8W5zNbnpWFg8XnhS6Lat7YsmVEXAg== +"@abp/anchor-js@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/anchor-js/-/anchor-js-5.3.0-rc.3.tgz#e1c2f62b3e01b6b5895bab85fa94623644e6dd6e" + integrity sha512-q3UbE4WTWdWUaD2uETtGiJtqzKK3fQJjczV8DscnbwuwIPXPTT7VnEFNoAu5WEQl/tmBYVxW25IhMoEkqrJ89A== dependencies: - "@abp/core" "~5.3.0-rc.2" + "@abp/core" "~5.3.0-rc.3" anchor-js "^4.3.1" -"@abp/aspnetcore.mvc.ui.theme.basic@^5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-5.3.0-rc.2.tgz#49da0f1ad2c0ec40eaacccae6874863fde954dda" - integrity sha512-Hb3ukaYMDhftkk7kQ9jVpkqhEoll8wU39/Qdy8JOlrJw3SDqqckWbVcJQkvetqa3mChy6kAVG3xe9ywG1h/6jA== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~5.3.0-rc.2" - -"@abp/aspnetcore.mvc.ui.theme.shared@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-5.3.0-rc.2.tgz#a4e6f033ee17fe7196e94047640bc826a69694a6" - integrity sha512-uKyb8by2dqYvCr9TCD0JKg2W+eLNcHanmQDL+aoI9OAExEEI/DYxw2a5++OntJGvmbcA6o1envmvOjqqsZuX0g== - dependencies: - "@abp/aspnetcore.mvc.ui" "~5.3.0-rc.2" - "@abp/bootstrap" "~5.3.0-rc.2" - "@abp/bootstrap-datepicker" "~5.3.0-rc.2" - "@abp/datatables.net-bs5" "~5.3.0-rc.2" - "@abp/font-awesome" "~5.3.0-rc.2" - "@abp/jquery-form" "~5.3.0-rc.2" - "@abp/jquery-validation-unobtrusive" "~5.3.0-rc.2" - "@abp/lodash" "~5.3.0-rc.2" - "@abp/luxon" "~5.3.0-rc.2" - "@abp/malihu-custom-scrollbar-plugin" "~5.3.0-rc.2" - "@abp/select2" "~5.3.0-rc.2" - "@abp/sweetalert2" "~5.3.0-rc.2" - "@abp/timeago" "~5.3.0-rc.2" - "@abp/toastr" "~5.3.0-rc.2" - -"@abp/aspnetcore.mvc.ui@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-5.3.0-rc.2.tgz#93a3c331cc75d2fbdd466a42777040466295f982" - integrity sha512-10RgXgZChbXNtXMblvvEZQctufJlP29RabfIOKWBTBMtU+jUgtDsLUwmF6Oi/65LLImOUogmBCb9MxjNm71iAQ== +"@abp/aspnetcore.mvc.ui.theme.basic@^5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-5.3.0-rc.3.tgz#726ce9dc03974ee192b3bb6a921a33fb69cf7f95" + integrity sha512-yOXp2ZXNGGDHWKHOXjudH1v7MK5ss1kpQ8DeorrboYybdmeWsq7BtrMIfvfudv8iCIWrg5Jmnf3GQ/7hBxdAdg== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~5.3.0-rc.3" + +"@abp/aspnetcore.mvc.ui.theme.shared@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-5.3.0-rc.3.tgz#34a752e71b965e762a81d758965a30d140501bc9" + integrity sha512-GnGhj6Y2DE1mrSWmp1jRnNvCsUiugWPKxlv1ue5dCdPVOw14OdXa6tLJwnZ38w9OOCDzXQyDUFdr19+uwOvEzQ== + dependencies: + "@abp/aspnetcore.mvc.ui" "~5.3.0-rc.3" + "@abp/bootstrap" "~5.3.0-rc.3" + "@abp/bootstrap-datepicker" "~5.3.0-rc.3" + "@abp/datatables.net-bs5" "~5.3.0-rc.3" + "@abp/font-awesome" "~5.3.0-rc.3" + "@abp/jquery-form" "~5.3.0-rc.3" + "@abp/jquery-validation-unobtrusive" "~5.3.0-rc.3" + "@abp/lodash" "~5.3.0-rc.3" + "@abp/luxon" "~5.3.0-rc.3" + "@abp/malihu-custom-scrollbar-plugin" "~5.3.0-rc.3" + "@abp/select2" "~5.3.0-rc.3" + "@abp/sweetalert2" "~5.3.0-rc.3" + "@abp/timeago" "~5.3.0-rc.3" + "@abp/toastr" "~5.3.0-rc.3" + +"@abp/aspnetcore.mvc.ui@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-5.3.0-rc.3.tgz#810821c844f4a1f248182ed9d3a8b54237b83124" + integrity sha512-1yvpDgZpYegL/JiwPdpCm/VjruEymt5VcamMYLPiUpmGTl0b7QFtUIwjSonE3gHEsBDXj9eCw9Kw3Bi+sd7NNQ== dependencies: ansi-colors "^4.1.1" extend-object "^1.0.0" @@ -49,180 +49,180 @@ merge-stream "^2.0.0" micromatch "^4.0.2" -"@abp/bootstrap-datepicker@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-5.3.0-rc.2.tgz#228735714f2baeb42e864c175e0aed3f855249d7" - integrity sha512-jZ7vGvsLjnXwpzvQ6vjKHWBkiptYBnEDVIfQ/zKV8kvkhdu+xxOP/u1LM90NSR2YckjIRj8+mINEcrnWhXgRNw== +"@abp/bootstrap-datepicker@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-5.3.0-rc.3.tgz#f98743539a1e8d883869aa7a759ba1aa00cd0689" + integrity sha512-VNNROxO1wzjG2q35wKEh4STluZllVggNhb0UyGtpZVNbtLydSxeFGHcve26f8UfEWE3WfC5Yyw8nBOHyJxh6tg== dependencies: bootstrap-datepicker "^1.9.0" -"@abp/bootstrap@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-5.3.0-rc.2.tgz#c410f44d987d09b5a74fd58417d03788fa878884" - integrity sha512-jb58M67kWldW35zTjVDFLaCj4STly2eU40COYFgjPQSH7F21DvMdX69Cp3jpmHaxm8VQE9izgW0NV8+oGlFyAw== +"@abp/bootstrap@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-5.3.0-rc.3.tgz#338b5ce194a257e5f14be2344b4e722874273ab1" + integrity sha512-fom2AboT9d1O3K1cOrIFT9l5Cvw2l42BvxEHkV3sXkZxZSstc9exURQn0WmKxWnOMCwM03N2IMKsFlk6SePN2A== dependencies: - "@abp/core" "~5.3.0-rc.2" + "@abp/core" "~5.3.0-rc.3" bootstrap "^5.1.3" -"@abp/clipboard@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-5.3.0-rc.2.tgz#e9a4f38a5d33d88a5c2440422a87e403671b3ed8" - integrity sha512-8OKcmGych7cmcYn8tuUmGo+mMlThNBDZA71c/cVAGw1RuLM16SCgeJVeVFhyUrmkBwH/E5Hfh06ZLlIrZKj36Q== +"@abp/clipboard@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-5.3.0-rc.3.tgz#30ed8014dfc383f53df91553cef8d405a6d9070a" + integrity sha512-4IVMgasvomY8Q0m1Y48VJr5TK3+BmeAQhEp+B4h2whE+/uIFpAhFWS5U0Bie9GjqQdEEqJ1a01tn16fK9jpzcw== dependencies: - "@abp/core" "~5.3.0-rc.2" + "@abp/core" "~5.3.0-rc.3" clipboard "^2.0.8" -"@abp/core@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-5.3.0-rc.2.tgz#3a3c6d187c502436bb02db99be3720f61628c924" - integrity sha512-/BEO90D7ibeyZxfCQHv2bbb9y/SpfZtaw0A8gmQlYrH3rZ3Th935v5XjCeYem8IGJ8fDZO7CRzW5TBsku/PukA== +"@abp/core@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-5.3.0-rc.3.tgz#7846bd8582bbb9effdb058b3b815fc1798b33f01" + integrity sha512-RyFoereWj/YOccWFeB5yq4aktKnYl44xrb6LKNkCmcVadbOJ+7AHgHljychTuMZalTvfzW2GcZacIoHw4bhn/A== dependencies: - "@abp/utils" "~5.3.0-rc.2" + "@abp/utils" "~5.3.0-rc.3" -"@abp/datatables.net-bs5@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-5.3.0-rc.2.tgz#452c2112fbe3cdac8c0d12bb626017f7c6333a45" - integrity sha512-Rk1uY76dGMnBFYILdXrb6Oc+jjblLdSzGZvDH1dyoFYs0bLWsjqVsOIE+kCjO447PgDOLyF+4nurLj+A9yCkEg== +"@abp/datatables.net-bs5@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-5.3.0-rc.3.tgz#f420208050a3a6f8e0ad3bcbb6af0e74584d2883" + integrity sha512-gwWMRElBQatElOdWyozYOY7lhYAUQu6/aZnf4XyiTlaWp6g1iMRJKgmaT73DhiIl+jxUiFtWjEla+65cXSl7sA== dependencies: - "@abp/datatables.net" "~5.3.0-rc.2" + "@abp/datatables.net" "~5.3.0-rc.3" datatables.net-bs5 "^1.11.4" -"@abp/datatables.net@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-5.3.0-rc.2.tgz#e7156085d76ab0b20e41fe92f9c99b14822b5f6a" - integrity sha512-aPSSmnBC939uYHR9fxxuvtxq4217qG3f8uf18ar7yWJwzWAYMOOhkmK0rEOqn86ObuXdjMAly7ThyfL6RH2iNQ== +"@abp/datatables.net@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-5.3.0-rc.3.tgz#e4b1f9fe41e788878f9cce082d6a79db9c4a8bae" + integrity sha512-FghO+XGSu9rwKOAUYC5AsB6hh1KrXAJ3GmHFYOIHrcd9nB/e60NtyoOo14TeO/LAFCVLOLq/FIBpEbkUZJZHkA== dependencies: - "@abp/jquery" "~5.3.0-rc.2" + "@abp/jquery" "~5.3.0-rc.3" datatables.net "^1.11.4" -"@abp/docs@^5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/docs/-/docs-5.3.0-rc.2.tgz#1128191ac82cb863488a314385d8ce508586b3ec" - integrity sha512-cF3eW7jJW5oAuYXcoBZTH6EqnpGwt8o7WLEWz5S2bGABHS3d8Ar4eLeu1q05vGHAVQiFJ18CplRz3YARFPXl4w== +"@abp/docs@^5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/docs/-/docs-5.3.0-rc.3.tgz#7fee7afbf8524ec57f0a0337a7233a43b8a51599" + integrity sha512-W9ryWHrojgSKSRUzPUzLmkdq1M3YZwTkXB4pZNkSoknwC1TK/+LQMYCvCVAykRpqpQ6fuKNomhpCabVCcjTFXQ== dependencies: - "@abp/anchor-js" "~5.3.0-rc.2" - "@abp/clipboard" "~5.3.0-rc.2" - "@abp/malihu-custom-scrollbar-plugin" "~5.3.0-rc.2" - "@abp/popper.js" "~5.3.0-rc.2" - "@abp/prismjs" "~5.3.0-rc.2" + "@abp/anchor-js" "~5.3.0-rc.3" + "@abp/clipboard" "~5.3.0-rc.3" + "@abp/malihu-custom-scrollbar-plugin" "~5.3.0-rc.3" + "@abp/popper.js" "~5.3.0-rc.3" + "@abp/prismjs" "~5.3.0-rc.3" -"@abp/font-awesome@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-5.3.0-rc.2.tgz#30995f5f5f6d604cd2241ee677ec14dcfc78377d" - integrity sha512-KFwYcjiq01RxI75qnbDt+G8zFcSEJRurHHZQwcI7ySjtQV5xM41zycOYIOV3SKz/gcyYyBBL5UeJPjsE8cu+Fw== +"@abp/font-awesome@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-5.3.0-rc.3.tgz#ef97f0a95385f1d56d4432b84944379d2cb1bfbd" + integrity sha512-kbm9ZaK8SSMcoeBbMdT1b5rJOZ3y8i/bdqD+3g0s65LEeqXNrKV/TkDdJqns72x4PxUQV6r3naXaEbV6Yj/sXQ== dependencies: - "@abp/core" "~5.3.0-rc.2" + "@abp/core" "~5.3.0-rc.3" "@fortawesome/fontawesome-free" "^5.15.4" -"@abp/jquery-form@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-5.3.0-rc.2.tgz#53561d6966f25bf6f7e91dcb89032fecd2c35d1f" - integrity sha512-94ExZ5q02s7ANpFyQnEcuSUjyra+32jMMkV0ZITbjWlmFRcXEogeIF3q3B4XswRi+yf67kQg7ynYCbGR7JESDg== +"@abp/jquery-form@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-5.3.0-rc.3.tgz#497f0a442323d99a7939ba8f9e5234d1a1891e03" + integrity sha512-gknwOgCEF4oJo9Vz2uM2Dl9dkJ2ulJSLb6YXEsPWx5fAFfIuwOl/5H0I1EE4XemtcEpF6xb+Ettnaxo8TcnIcg== dependencies: - "@abp/jquery" "~5.3.0-rc.2" + "@abp/jquery" "~5.3.0-rc.3" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-5.3.0-rc.2.tgz#957387fb88414a50a5d3d84089ab3704b710645f" - integrity sha512-dIXsxqQ0x+xiLCA2x6xWR3wIvfpT0zukLFOrkCVNSc+mnWWyYlavRnGl3f5W/4jQSPZ9Ao/txhsThfkvO+Mu0Q== +"@abp/jquery-validation-unobtrusive@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-5.3.0-rc.3.tgz#a3e39dfb4ba2e0f45dcfde28bd22ff36c55173a0" + integrity sha512-zgSNkg/mzNDzvE+3cL58nLoV3EvFB/ALiLHudo8GcWsdFxx7R+2DfboCSFE1oJ8do6tED+9YG0/VJiZDXnFPwQ== dependencies: - "@abp/jquery-validation" "~5.3.0-rc.2" + "@abp/jquery-validation" "~5.3.0-rc.3" jquery-validation-unobtrusive "^3.2.12" -"@abp/jquery-validation@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-5.3.0-rc.2.tgz#d866b10ffbfc1852df11122aa2cf6a56e50819b3" - integrity sha512-DAxwKjalhMZNCuXBS6Ai9RlIDsEzm0SGnFDApQIo/i6HGKoK4J/eTnFZ175xZMQ79yrxe71MKWR29l/+PuwcRw== +"@abp/jquery-validation@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-5.3.0-rc.3.tgz#917a2b2e7e4b8e5aacdd10284f18f58bfac1743d" + integrity sha512-m2pPTGJs8MQzzdzMpWFD94RU4dqMrwwT4ZJyqz07EPzRv7NURGVlzJOPdwDiTVdiT5UsaYzDF0BYgfj3/FL/iw== dependencies: - "@abp/jquery" "~5.3.0-rc.2" + "@abp/jquery" "~5.3.0-rc.3" jquery-validation "^1.19.3" -"@abp/jquery@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-5.3.0-rc.2.tgz#8a5008123f5dbf1276c719ac45101161e9d9b793" - integrity sha512-VjA22n17pPKqj6jZUk6qxpqx2UT5Uv6q/AvyJtacDC3D1MXfrnSWxi9FAPFp4N52i4knkfuKFZtuFlFSkQe4FQ== +"@abp/jquery@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-5.3.0-rc.3.tgz#e75ca02fa0520c60b1aed14444fc129ed6a27d0b" + integrity sha512-ZJYpnFqByAzHKru1aGz8VLZw4xb/YD1wpahN9pIsPYeFrE6/7Vjs8npQk5it2Ww5gaA3unSrMIc0CMsr5kk0Nw== dependencies: - "@abp/core" "~5.3.0-rc.2" + "@abp/core" "~5.3.0-rc.3" jquery "~3.6.0" -"@abp/lodash@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-5.3.0-rc.2.tgz#51600a0ba49c6d4060c3e280b1f1d62ed7f48a16" - integrity sha512-qreUjH0umhsGKRSYpswcX1SAF1iNBp/AP32LMfvezvPaCA+KQFWknHuOTV2jn1tYC5c7KJTTTp46jRTi88VSHQ== +"@abp/lodash@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-5.3.0-rc.3.tgz#3fcc23626b9e36652ee36847b4a8879cf8aae8ef" + integrity sha512-KJFNAhW3AHi6AAhSlix50gbU9QmQT9TD5RYofEoIm1rfd7iZF0uowJheES0jqHU4PeS80Fnzp8AnBhVYgRMUjg== dependencies: - "@abp/core" "~5.3.0-rc.2" + "@abp/core" "~5.3.0-rc.3" lodash "^4.17.21" -"@abp/luxon@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-5.3.0-rc.2.tgz#6ea39998aaba2a3bd6e6dd3c9cacc1a0f56afa8f" - integrity sha512-9++6ZD0zEmJcH3iSNcTtC0haEVbQgxzoFx1wpEXsB3YVuBKUjJnJCXMbt0Qmkkq40tclmG8bfORRYhII29TLWA== +"@abp/luxon@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-5.3.0-rc.3.tgz#cf9e2070f3b3e1281dcf05ba1781d8daa41da98d" + integrity sha512-1gBfWwFrS+xuTD12dB/LLUbGWCATbByp1kCFbHdgVNOkkkDvJETS0LeB8o/ggw7rBWL5i3Jkpb5xFTRT6yKX4Q== dependencies: - "@abp/core" "~5.3.0-rc.2" + "@abp/core" "~5.3.0-rc.3" luxon "^2.3.0" -"@abp/malihu-custom-scrollbar-plugin@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-5.3.0-rc.2.tgz#069e071472eb8727260e9a1b5322e30cdaebffc9" - integrity sha512-JPaoNiYWR6T7Osx4ezURFanxC9ex1U9zr+7Fko1mmig8oZ+OHsk1cbdNBD5ChgAVsHdqK2eJ4iobDjhsDfMYiA== +"@abp/malihu-custom-scrollbar-plugin@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-5.3.0-rc.3.tgz#1d8d5cede65dbd0d0975d8fabfe135105710ddde" + integrity sha512-SW8UBKQGsS8zrG2RkmGBuze/NgreDWWJ84l2qMKYmTtgL/kOCLm4FBvo44azNOq6a3rYVJGpwirYRBcwrsAfHw== dependencies: - "@abp/core" "~5.3.0-rc.2" + "@abp/core" "~5.3.0-rc.3" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/popper.js@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/popper.js/-/popper.js-5.3.0-rc.2.tgz#456fa195785f0471cdeb69557029a0e5d193cd2a" - integrity sha512-/ZtPgiCGa1yXf4IH3XMwEGkwB4PeOKGRROmPkMZnwOMTkEYN3kZlwTgbRXdRnp8Cfqze5oIQiF5LO8i/J9QaOQ== +"@abp/popper.js@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/popper.js/-/popper.js-5.3.0-rc.3.tgz#d01c8cbfe2bdb75e302483dc8321f5b698a94b99" + integrity sha512-/FjBhHKTDQXDi3xsBQVuUIuIJoN230q5EsG5IGHXHUJr9pnlC4ZhYJlfni80XlXuue7X3RiJeZc5P5MyZt4QFA== dependencies: - "@abp/core" "~5.3.0-rc.2" + "@abp/core" "~5.3.0-rc.3" "@popperjs/core" "^2.11.2" -"@abp/prismjs@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-5.3.0-rc.2.tgz#8a5ed8032a1e8ba7644adbffae9efdc18c3811f7" - integrity sha512-G7ab7PL0TcjtvA9rdFj0RajP0pXZrXmIzKZ/vtQqW6mNLXNCI1OKJ/fAXXwS35gFEyVPvn9xKPnuYlhwqWl6ug== +"@abp/prismjs@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-5.3.0-rc.3.tgz#c382946b15c820a01e3833ba5c4b3f6d52f8365c" + integrity sha512-a/lahdqzBEcsQ8j9Vjg8KC8xyDroGBi+4NIV2wb+k0CAaA49L25lfq0RSCji5RgyZ9Hjznhg/NyD6AFKaB3ykA== dependencies: - "@abp/clipboard" "~5.3.0-rc.2" - "@abp/core" "~5.3.0-rc.2" + "@abp/clipboard" "~5.3.0-rc.3" + "@abp/core" "~5.3.0-rc.3" prismjs "^1.26.0" -"@abp/select2@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-5.3.0-rc.2.tgz#50e622f2296c3594e89699e8747dcf520fb4415d" - integrity sha512-HwfiEgeECkzQhCf/3Je/V7pRtRvr3YQtX1gAWpI6Ty2P+nTV4ue/l1w5Si+59vuJm3JP+fCnSFPlHXxahfL/Gw== +"@abp/select2@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-5.3.0-rc.3.tgz#7a0f9f7472c812b85ce9bc5bd8a557c33e967e7d" + integrity sha512-6t+UXjDh3bzaCWsSxwuRtOgGz+aDidPKA2JKZfKLAFM4WkcLmY8Px0RY3jgsbxrtM9ANncA9gbl69Q3uY2DmHA== dependencies: - "@abp/core" "~5.3.0-rc.2" + "@abp/core" "~5.3.0-rc.3" select2 "^4.0.13" -"@abp/sweetalert2@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-5.3.0-rc.2.tgz#41d19b81011e3d5c9d12b8d6ec6da12e52553683" - integrity sha512-6Qx2WIpXQI/ydfX9P7cMISvwrFi4UAPzkuNkhPOZT7chq64auz88Rtqyw+SLXLnCCQ+e31/ekFldijOG9CbV1g== +"@abp/sweetalert2@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-5.3.0-rc.3.tgz#91557a4b4a103f68a926fde19c830e195597ff0d" + integrity sha512-hAw+E8EnGO9nnyGbGiD/y+SyScHD4R0MEi/eK2bsMSKAzBxKcUBv0MxrsNQc0WhVwqRQETRccdLX3WYofmh8Kw== dependencies: - "@abp/core" "~5.3.0-rc.2" + "@abp/core" "~5.3.0-rc.3" sweetalert2 "^11.3.6" -"@abp/timeago@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-5.3.0-rc.2.tgz#16f73659e83643d82eafac716115dbf0333cce98" - integrity sha512-fFvBX65Bzvg+x4vClzSh31FJJ2m6b2/s+IJ4/t4FNDxDqybfOzkAfRzPm7NVDw5Avu1fjRLwFhQueb0sECQD/w== +"@abp/timeago@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-5.3.0-rc.3.tgz#7480ed2d5ee035d2f43c223d7bb58d794ff3ba2f" + integrity sha512-kgIlH/KGWhYwZSGvCT5LnCYoD+1pSwoQf2GhtvgBUnYqxS6+s0FUSMSzX/MISLOvLWknl2KNnARsOXJkqrWXEw== dependencies: - "@abp/jquery" "~5.3.0-rc.2" + "@abp/jquery" "~5.3.0-rc.3" timeago "^1.6.7" -"@abp/toastr@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-5.3.0-rc.2.tgz#e868ffe7acc3e1838dd008f936e909250e360cc8" - integrity sha512-0BLjOSalZw7NdRXw4/SwPP7N+ChFGO2elEJ7zyd0c8Bi+Gz5lqL6ZW47O1ANKSv9HnPoyRsPDSBiCIvXXtlFOw== +"@abp/toastr@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-5.3.0-rc.3.tgz#1a6f03737c2ae92d62a8b7f51d4c70cc4d97212f" + integrity sha512-Vag9lz2YboyZ0/4Y/OvFG+EaY0PCs5X97ZijZRB+saSRe1pL1+qnBMpniMDUvbMEpitB5Qq+FqdkOnKdhlrH4A== dependencies: - "@abp/jquery" "~5.3.0-rc.2" + "@abp/jquery" "~5.3.0-rc.3" toastr "^2.1.4" -"@abp/utils@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-5.3.0-rc.2.tgz#cbdf34bb32f99396c2a7f6dd2f0fa0b5239413bb" - integrity sha512-0BgsxKwkiNcbBSDJIfxBObM4QYTk1umZ/WnKUdvSyv0Fe4hKK+gDvsBzk97O+ZVyBHIflvcln3dKpS3eIVwhIg== +"@abp/utils@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-5.3.0-rc.3.tgz#e91f10b18ac1e17af7f15c85257c24034cab2ba1" + integrity sha512-vMzsddCvI+M6Qd7Hns5KPUXqdFFboJwAOB9gvxj+MmjVNDCpFTo1hjq0H0zB6NHI8Ik+9sw44D0c7gkTdQQt7Q== dependencies: just-compare "^1.3.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 e7c547990b..72943f2f7d 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": "^5.3.0-rc.2" + "@abp/aspnetcore.mvc.ui.theme.basic": "^5.3.0-rc.3" } } 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 04d5a92498..cd4b9ff9d3 100644 --- a/modules/setting-management/app/Volo.Abp.SettingManagement.DemoApp/yarn.lock +++ b/modules/setting-management/app/Volo.Abp.SettingManagement.DemoApp/yarn.lock @@ -2,37 +2,37 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.basic@^5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-5.3.0-rc.2.tgz#49da0f1ad2c0ec40eaacccae6874863fde954dda" - integrity sha512-Hb3ukaYMDhftkk7kQ9jVpkqhEoll8wU39/Qdy8JOlrJw3SDqqckWbVcJQkvetqa3mChy6kAVG3xe9ywG1h/6jA== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~5.3.0-rc.2" - -"@abp/aspnetcore.mvc.ui.theme.shared@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-5.3.0-rc.2.tgz#a4e6f033ee17fe7196e94047640bc826a69694a6" - integrity sha512-uKyb8by2dqYvCr9TCD0JKg2W+eLNcHanmQDL+aoI9OAExEEI/DYxw2a5++OntJGvmbcA6o1envmvOjqqsZuX0g== - dependencies: - "@abp/aspnetcore.mvc.ui" "~5.3.0-rc.2" - "@abp/bootstrap" "~5.3.0-rc.2" - "@abp/bootstrap-datepicker" "~5.3.0-rc.2" - "@abp/datatables.net-bs5" "~5.3.0-rc.2" - "@abp/font-awesome" "~5.3.0-rc.2" - "@abp/jquery-form" "~5.3.0-rc.2" - "@abp/jquery-validation-unobtrusive" "~5.3.0-rc.2" - "@abp/lodash" "~5.3.0-rc.2" - "@abp/luxon" "~5.3.0-rc.2" - "@abp/malihu-custom-scrollbar-plugin" "~5.3.0-rc.2" - "@abp/select2" "~5.3.0-rc.2" - "@abp/sweetalert2" "~5.3.0-rc.2" - "@abp/timeago" "~5.3.0-rc.2" - "@abp/toastr" "~5.3.0-rc.2" - -"@abp/aspnetcore.mvc.ui@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-5.3.0-rc.2.tgz#93a3c331cc75d2fbdd466a42777040466295f982" - integrity sha512-10RgXgZChbXNtXMblvvEZQctufJlP29RabfIOKWBTBMtU+jUgtDsLUwmF6Oi/65LLImOUogmBCb9MxjNm71iAQ== +"@abp/aspnetcore.mvc.ui.theme.basic@^5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-5.3.0-rc.3.tgz#726ce9dc03974ee192b3bb6a921a33fb69cf7f95" + integrity sha512-yOXp2ZXNGGDHWKHOXjudH1v7MK5ss1kpQ8DeorrboYybdmeWsq7BtrMIfvfudv8iCIWrg5Jmnf3GQ/7hBxdAdg== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~5.3.0-rc.3" + +"@abp/aspnetcore.mvc.ui.theme.shared@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-5.3.0-rc.3.tgz#34a752e71b965e762a81d758965a30d140501bc9" + integrity sha512-GnGhj6Y2DE1mrSWmp1jRnNvCsUiugWPKxlv1ue5dCdPVOw14OdXa6tLJwnZ38w9OOCDzXQyDUFdr19+uwOvEzQ== + dependencies: + "@abp/aspnetcore.mvc.ui" "~5.3.0-rc.3" + "@abp/bootstrap" "~5.3.0-rc.3" + "@abp/bootstrap-datepicker" "~5.3.0-rc.3" + "@abp/datatables.net-bs5" "~5.3.0-rc.3" + "@abp/font-awesome" "~5.3.0-rc.3" + "@abp/jquery-form" "~5.3.0-rc.3" + "@abp/jquery-validation-unobtrusive" "~5.3.0-rc.3" + "@abp/lodash" "~5.3.0-rc.3" + "@abp/luxon" "~5.3.0-rc.3" + "@abp/malihu-custom-scrollbar-plugin" "~5.3.0-rc.3" + "@abp/select2" "~5.3.0-rc.3" + "@abp/sweetalert2" "~5.3.0-rc.3" + "@abp/timeago" "~5.3.0-rc.3" + "@abp/toastr" "~5.3.0-rc.3" + +"@abp/aspnetcore.mvc.ui@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-5.3.0-rc.3.tgz#810821c844f4a1f248182ed9d3a8b54237b83124" + integrity sha512-1yvpDgZpYegL/JiwPdpCm/VjruEymt5VcamMYLPiUpmGTl0b7QFtUIwjSonE3gHEsBDXj9eCw9Kw3Bi+sd7NNQ== dependencies: ansi-colors "^4.1.1" extend-object "^1.0.0" @@ -41,144 +41,144 @@ merge-stream "^2.0.0" micromatch "^4.0.2" -"@abp/bootstrap-datepicker@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-5.3.0-rc.2.tgz#228735714f2baeb42e864c175e0aed3f855249d7" - integrity sha512-jZ7vGvsLjnXwpzvQ6vjKHWBkiptYBnEDVIfQ/zKV8kvkhdu+xxOP/u1LM90NSR2YckjIRj8+mINEcrnWhXgRNw== +"@abp/bootstrap-datepicker@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-5.3.0-rc.3.tgz#f98743539a1e8d883869aa7a759ba1aa00cd0689" + integrity sha512-VNNROxO1wzjG2q35wKEh4STluZllVggNhb0UyGtpZVNbtLydSxeFGHcve26f8UfEWE3WfC5Yyw8nBOHyJxh6tg== dependencies: bootstrap-datepicker "^1.9.0" -"@abp/bootstrap@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-5.3.0-rc.2.tgz#c410f44d987d09b5a74fd58417d03788fa878884" - integrity sha512-jb58M67kWldW35zTjVDFLaCj4STly2eU40COYFgjPQSH7F21DvMdX69Cp3jpmHaxm8VQE9izgW0NV8+oGlFyAw== +"@abp/bootstrap@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-5.3.0-rc.3.tgz#338b5ce194a257e5f14be2344b4e722874273ab1" + integrity sha512-fom2AboT9d1O3K1cOrIFT9l5Cvw2l42BvxEHkV3sXkZxZSstc9exURQn0WmKxWnOMCwM03N2IMKsFlk6SePN2A== dependencies: - "@abp/core" "~5.3.0-rc.2" + "@abp/core" "~5.3.0-rc.3" bootstrap "^5.1.3" -"@abp/core@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-5.3.0-rc.2.tgz#3a3c6d187c502436bb02db99be3720f61628c924" - integrity sha512-/BEO90D7ibeyZxfCQHv2bbb9y/SpfZtaw0A8gmQlYrH3rZ3Th935v5XjCeYem8IGJ8fDZO7CRzW5TBsku/PukA== +"@abp/core@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-5.3.0-rc.3.tgz#7846bd8582bbb9effdb058b3b815fc1798b33f01" + integrity sha512-RyFoereWj/YOccWFeB5yq4aktKnYl44xrb6LKNkCmcVadbOJ+7AHgHljychTuMZalTvfzW2GcZacIoHw4bhn/A== dependencies: - "@abp/utils" "~5.3.0-rc.2" + "@abp/utils" "~5.3.0-rc.3" -"@abp/datatables.net-bs5@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-5.3.0-rc.2.tgz#452c2112fbe3cdac8c0d12bb626017f7c6333a45" - integrity sha512-Rk1uY76dGMnBFYILdXrb6Oc+jjblLdSzGZvDH1dyoFYs0bLWsjqVsOIE+kCjO447PgDOLyF+4nurLj+A9yCkEg== +"@abp/datatables.net-bs5@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-5.3.0-rc.3.tgz#f420208050a3a6f8e0ad3bcbb6af0e74584d2883" + integrity sha512-gwWMRElBQatElOdWyozYOY7lhYAUQu6/aZnf4XyiTlaWp6g1iMRJKgmaT73DhiIl+jxUiFtWjEla+65cXSl7sA== dependencies: - "@abp/datatables.net" "~5.3.0-rc.2" + "@abp/datatables.net" "~5.3.0-rc.3" datatables.net-bs5 "^1.11.4" -"@abp/datatables.net@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-5.3.0-rc.2.tgz#e7156085d76ab0b20e41fe92f9c99b14822b5f6a" - integrity sha512-aPSSmnBC939uYHR9fxxuvtxq4217qG3f8uf18ar7yWJwzWAYMOOhkmK0rEOqn86ObuXdjMAly7ThyfL6RH2iNQ== +"@abp/datatables.net@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-5.3.0-rc.3.tgz#e4b1f9fe41e788878f9cce082d6a79db9c4a8bae" + integrity sha512-FghO+XGSu9rwKOAUYC5AsB6hh1KrXAJ3GmHFYOIHrcd9nB/e60NtyoOo14TeO/LAFCVLOLq/FIBpEbkUZJZHkA== dependencies: - "@abp/jquery" "~5.3.0-rc.2" + "@abp/jquery" "~5.3.0-rc.3" datatables.net "^1.11.4" -"@abp/font-awesome@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-5.3.0-rc.2.tgz#30995f5f5f6d604cd2241ee677ec14dcfc78377d" - integrity sha512-KFwYcjiq01RxI75qnbDt+G8zFcSEJRurHHZQwcI7ySjtQV5xM41zycOYIOV3SKz/gcyYyBBL5UeJPjsE8cu+Fw== +"@abp/font-awesome@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-5.3.0-rc.3.tgz#ef97f0a95385f1d56d4432b84944379d2cb1bfbd" + integrity sha512-kbm9ZaK8SSMcoeBbMdT1b5rJOZ3y8i/bdqD+3g0s65LEeqXNrKV/TkDdJqns72x4PxUQV6r3naXaEbV6Yj/sXQ== dependencies: - "@abp/core" "~5.3.0-rc.2" + "@abp/core" "~5.3.0-rc.3" "@fortawesome/fontawesome-free" "^5.15.4" -"@abp/jquery-form@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-5.3.0-rc.2.tgz#53561d6966f25bf6f7e91dcb89032fecd2c35d1f" - integrity sha512-94ExZ5q02s7ANpFyQnEcuSUjyra+32jMMkV0ZITbjWlmFRcXEogeIF3q3B4XswRi+yf67kQg7ynYCbGR7JESDg== +"@abp/jquery-form@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-5.3.0-rc.3.tgz#497f0a442323d99a7939ba8f9e5234d1a1891e03" + integrity sha512-gknwOgCEF4oJo9Vz2uM2Dl9dkJ2ulJSLb6YXEsPWx5fAFfIuwOl/5H0I1EE4XemtcEpF6xb+Ettnaxo8TcnIcg== dependencies: - "@abp/jquery" "~5.3.0-rc.2" + "@abp/jquery" "~5.3.0-rc.3" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-5.3.0-rc.2.tgz#957387fb88414a50a5d3d84089ab3704b710645f" - integrity sha512-dIXsxqQ0x+xiLCA2x6xWR3wIvfpT0zukLFOrkCVNSc+mnWWyYlavRnGl3f5W/4jQSPZ9Ao/txhsThfkvO+Mu0Q== +"@abp/jquery-validation-unobtrusive@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-5.3.0-rc.3.tgz#a3e39dfb4ba2e0f45dcfde28bd22ff36c55173a0" + integrity sha512-zgSNkg/mzNDzvE+3cL58nLoV3EvFB/ALiLHudo8GcWsdFxx7R+2DfboCSFE1oJ8do6tED+9YG0/VJiZDXnFPwQ== dependencies: - "@abp/jquery-validation" "~5.3.0-rc.2" + "@abp/jquery-validation" "~5.3.0-rc.3" jquery-validation-unobtrusive "^3.2.12" -"@abp/jquery-validation@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-5.3.0-rc.2.tgz#d866b10ffbfc1852df11122aa2cf6a56e50819b3" - integrity sha512-DAxwKjalhMZNCuXBS6Ai9RlIDsEzm0SGnFDApQIo/i6HGKoK4J/eTnFZ175xZMQ79yrxe71MKWR29l/+PuwcRw== +"@abp/jquery-validation@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-5.3.0-rc.3.tgz#917a2b2e7e4b8e5aacdd10284f18f58bfac1743d" + integrity sha512-m2pPTGJs8MQzzdzMpWFD94RU4dqMrwwT4ZJyqz07EPzRv7NURGVlzJOPdwDiTVdiT5UsaYzDF0BYgfj3/FL/iw== dependencies: - "@abp/jquery" "~5.3.0-rc.2" + "@abp/jquery" "~5.3.0-rc.3" jquery-validation "^1.19.3" -"@abp/jquery@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-5.3.0-rc.2.tgz#8a5008123f5dbf1276c719ac45101161e9d9b793" - integrity sha512-VjA22n17pPKqj6jZUk6qxpqx2UT5Uv6q/AvyJtacDC3D1MXfrnSWxi9FAPFp4N52i4knkfuKFZtuFlFSkQe4FQ== +"@abp/jquery@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-5.3.0-rc.3.tgz#e75ca02fa0520c60b1aed14444fc129ed6a27d0b" + integrity sha512-ZJYpnFqByAzHKru1aGz8VLZw4xb/YD1wpahN9pIsPYeFrE6/7Vjs8npQk5it2Ww5gaA3unSrMIc0CMsr5kk0Nw== dependencies: - "@abp/core" "~5.3.0-rc.2" + "@abp/core" "~5.3.0-rc.3" jquery "~3.6.0" -"@abp/lodash@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-5.3.0-rc.2.tgz#51600a0ba49c6d4060c3e280b1f1d62ed7f48a16" - integrity sha512-qreUjH0umhsGKRSYpswcX1SAF1iNBp/AP32LMfvezvPaCA+KQFWknHuOTV2jn1tYC5c7KJTTTp46jRTi88VSHQ== +"@abp/lodash@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-5.3.0-rc.3.tgz#3fcc23626b9e36652ee36847b4a8879cf8aae8ef" + integrity sha512-KJFNAhW3AHi6AAhSlix50gbU9QmQT9TD5RYofEoIm1rfd7iZF0uowJheES0jqHU4PeS80Fnzp8AnBhVYgRMUjg== dependencies: - "@abp/core" "~5.3.0-rc.2" + "@abp/core" "~5.3.0-rc.3" lodash "^4.17.21" -"@abp/luxon@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-5.3.0-rc.2.tgz#6ea39998aaba2a3bd6e6dd3c9cacc1a0f56afa8f" - integrity sha512-9++6ZD0zEmJcH3iSNcTtC0haEVbQgxzoFx1wpEXsB3YVuBKUjJnJCXMbt0Qmkkq40tclmG8bfORRYhII29TLWA== +"@abp/luxon@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-5.3.0-rc.3.tgz#cf9e2070f3b3e1281dcf05ba1781d8daa41da98d" + integrity sha512-1gBfWwFrS+xuTD12dB/LLUbGWCATbByp1kCFbHdgVNOkkkDvJETS0LeB8o/ggw7rBWL5i3Jkpb5xFTRT6yKX4Q== dependencies: - "@abp/core" "~5.3.0-rc.2" + "@abp/core" "~5.3.0-rc.3" luxon "^2.3.0" -"@abp/malihu-custom-scrollbar-plugin@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-5.3.0-rc.2.tgz#069e071472eb8727260e9a1b5322e30cdaebffc9" - integrity sha512-JPaoNiYWR6T7Osx4ezURFanxC9ex1U9zr+7Fko1mmig8oZ+OHsk1cbdNBD5ChgAVsHdqK2eJ4iobDjhsDfMYiA== +"@abp/malihu-custom-scrollbar-plugin@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-5.3.0-rc.3.tgz#1d8d5cede65dbd0d0975d8fabfe135105710ddde" + integrity sha512-SW8UBKQGsS8zrG2RkmGBuze/NgreDWWJ84l2qMKYmTtgL/kOCLm4FBvo44azNOq6a3rYVJGpwirYRBcwrsAfHw== dependencies: - "@abp/core" "~5.3.0-rc.2" + "@abp/core" "~5.3.0-rc.3" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/select2@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-5.3.0-rc.2.tgz#50e622f2296c3594e89699e8747dcf520fb4415d" - integrity sha512-HwfiEgeECkzQhCf/3Je/V7pRtRvr3YQtX1gAWpI6Ty2P+nTV4ue/l1w5Si+59vuJm3JP+fCnSFPlHXxahfL/Gw== +"@abp/select2@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-5.3.0-rc.3.tgz#7a0f9f7472c812b85ce9bc5bd8a557c33e967e7d" + integrity sha512-6t+UXjDh3bzaCWsSxwuRtOgGz+aDidPKA2JKZfKLAFM4WkcLmY8Px0RY3jgsbxrtM9ANncA9gbl69Q3uY2DmHA== dependencies: - "@abp/core" "~5.3.0-rc.2" + "@abp/core" "~5.3.0-rc.3" select2 "^4.0.13" -"@abp/sweetalert2@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-5.3.0-rc.2.tgz#41d19b81011e3d5c9d12b8d6ec6da12e52553683" - integrity sha512-6Qx2WIpXQI/ydfX9P7cMISvwrFi4UAPzkuNkhPOZT7chq64auz88Rtqyw+SLXLnCCQ+e31/ekFldijOG9CbV1g== +"@abp/sweetalert2@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-5.3.0-rc.3.tgz#91557a4b4a103f68a926fde19c830e195597ff0d" + integrity sha512-hAw+E8EnGO9nnyGbGiD/y+SyScHD4R0MEi/eK2bsMSKAzBxKcUBv0MxrsNQc0WhVwqRQETRccdLX3WYofmh8Kw== dependencies: - "@abp/core" "~5.3.0-rc.2" + "@abp/core" "~5.3.0-rc.3" sweetalert2 "^11.3.6" -"@abp/timeago@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-5.3.0-rc.2.tgz#16f73659e83643d82eafac716115dbf0333cce98" - integrity sha512-fFvBX65Bzvg+x4vClzSh31FJJ2m6b2/s+IJ4/t4FNDxDqybfOzkAfRzPm7NVDw5Avu1fjRLwFhQueb0sECQD/w== +"@abp/timeago@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-5.3.0-rc.3.tgz#7480ed2d5ee035d2f43c223d7bb58d794ff3ba2f" + integrity sha512-kgIlH/KGWhYwZSGvCT5LnCYoD+1pSwoQf2GhtvgBUnYqxS6+s0FUSMSzX/MISLOvLWknl2KNnARsOXJkqrWXEw== dependencies: - "@abp/jquery" "~5.3.0-rc.2" + "@abp/jquery" "~5.3.0-rc.3" timeago "^1.6.7" -"@abp/toastr@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-5.3.0-rc.2.tgz#e868ffe7acc3e1838dd008f936e909250e360cc8" - integrity sha512-0BLjOSalZw7NdRXw4/SwPP7N+ChFGO2elEJ7zyd0c8Bi+Gz5lqL6ZW47O1ANKSv9HnPoyRsPDSBiCIvXXtlFOw== +"@abp/toastr@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-5.3.0-rc.3.tgz#1a6f03737c2ae92d62a8b7f51d4c70cc4d97212f" + integrity sha512-Vag9lz2YboyZ0/4Y/OvFG+EaY0PCs5X97ZijZRB+saSRe1pL1+qnBMpniMDUvbMEpitB5Qq+FqdkOnKdhlrH4A== dependencies: - "@abp/jquery" "~5.3.0-rc.2" + "@abp/jquery" "~5.3.0-rc.3" toastr "^2.1.4" -"@abp/utils@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-5.3.0-rc.2.tgz#cbdf34bb32f99396c2a7f6dd2f0fa0b5239413bb" - integrity sha512-0BgsxKwkiNcbBSDJIfxBObM4QYTk1umZ/WnKUdvSyv0Fe4hKK+gDvsBzk97O+ZVyBHIflvcln3dKpS3eIVwhIg== +"@abp/utils@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-5.3.0-rc.3.tgz#e91f10b18ac1e17af7f15c85257c24034cab2ba1" + integrity sha512-vMzsddCvI+M6Qd7Hns5KPUXqdFFboJwAOB9gvxj+MmjVNDCpFTo1hjq0H0zB6NHI8Ik+9sw44D0c7gkTdQQt7Q== dependencies: just-compare "^1.3.0" 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 9927a3be71..1386e4887e 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": "^5.3.0-rc.2", - "@abp/virtual-file-explorer": "^5.3.0-rc.2" + "@abp/aspnetcore.mvc.ui.theme.basic": "^5.3.0-rc.3", + "@abp/virtual-file-explorer": "^5.3.0-rc.3" } } diff --git a/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/yarn.lock b/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/yarn.lock index 94efe4163c..83c5540822 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,37 +2,37 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.basic@^5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-5.3.0-rc.2.tgz#49da0f1ad2c0ec40eaacccae6874863fde954dda" - integrity sha512-Hb3ukaYMDhftkk7kQ9jVpkqhEoll8wU39/Qdy8JOlrJw3SDqqckWbVcJQkvetqa3mChy6kAVG3xe9ywG1h/6jA== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~5.3.0-rc.2" - -"@abp/aspnetcore.mvc.ui.theme.shared@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-5.3.0-rc.2.tgz#a4e6f033ee17fe7196e94047640bc826a69694a6" - integrity sha512-uKyb8by2dqYvCr9TCD0JKg2W+eLNcHanmQDL+aoI9OAExEEI/DYxw2a5++OntJGvmbcA6o1envmvOjqqsZuX0g== - dependencies: - "@abp/aspnetcore.mvc.ui" "~5.3.0-rc.2" - "@abp/bootstrap" "~5.3.0-rc.2" - "@abp/bootstrap-datepicker" "~5.3.0-rc.2" - "@abp/datatables.net-bs5" "~5.3.0-rc.2" - "@abp/font-awesome" "~5.3.0-rc.2" - "@abp/jquery-form" "~5.3.0-rc.2" - "@abp/jquery-validation-unobtrusive" "~5.3.0-rc.2" - "@abp/lodash" "~5.3.0-rc.2" - "@abp/luxon" "~5.3.0-rc.2" - "@abp/malihu-custom-scrollbar-plugin" "~5.3.0-rc.2" - "@abp/select2" "~5.3.0-rc.2" - "@abp/sweetalert2" "~5.3.0-rc.2" - "@abp/timeago" "~5.3.0-rc.2" - "@abp/toastr" "~5.3.0-rc.2" - -"@abp/aspnetcore.mvc.ui@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-5.3.0-rc.2.tgz#93a3c331cc75d2fbdd466a42777040466295f982" - integrity sha512-10RgXgZChbXNtXMblvvEZQctufJlP29RabfIOKWBTBMtU+jUgtDsLUwmF6Oi/65LLImOUogmBCb9MxjNm71iAQ== +"@abp/aspnetcore.mvc.ui.theme.basic@^5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-5.3.0-rc.3.tgz#726ce9dc03974ee192b3bb6a921a33fb69cf7f95" + integrity sha512-yOXp2ZXNGGDHWKHOXjudH1v7MK5ss1kpQ8DeorrboYybdmeWsq7BtrMIfvfudv8iCIWrg5Jmnf3GQ/7hBxdAdg== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~5.3.0-rc.3" + +"@abp/aspnetcore.mvc.ui.theme.shared@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-5.3.0-rc.3.tgz#34a752e71b965e762a81d758965a30d140501bc9" + integrity sha512-GnGhj6Y2DE1mrSWmp1jRnNvCsUiugWPKxlv1ue5dCdPVOw14OdXa6tLJwnZ38w9OOCDzXQyDUFdr19+uwOvEzQ== + dependencies: + "@abp/aspnetcore.mvc.ui" "~5.3.0-rc.3" + "@abp/bootstrap" "~5.3.0-rc.3" + "@abp/bootstrap-datepicker" "~5.3.0-rc.3" + "@abp/datatables.net-bs5" "~5.3.0-rc.3" + "@abp/font-awesome" "~5.3.0-rc.3" + "@abp/jquery-form" "~5.3.0-rc.3" + "@abp/jquery-validation-unobtrusive" "~5.3.0-rc.3" + "@abp/lodash" "~5.3.0-rc.3" + "@abp/luxon" "~5.3.0-rc.3" + "@abp/malihu-custom-scrollbar-plugin" "~5.3.0-rc.3" + "@abp/select2" "~5.3.0-rc.3" + "@abp/sweetalert2" "~5.3.0-rc.3" + "@abp/timeago" "~5.3.0-rc.3" + "@abp/toastr" "~5.3.0-rc.3" + +"@abp/aspnetcore.mvc.ui@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-5.3.0-rc.3.tgz#810821c844f4a1f248182ed9d3a8b54237b83124" + integrity sha512-1yvpDgZpYegL/JiwPdpCm/VjruEymt5VcamMYLPiUpmGTl0b7QFtUIwjSonE3gHEsBDXj9eCw9Kw3Bi+sd7NNQ== dependencies: ansi-colors "^4.1.1" extend-object "^1.0.0" @@ -41,171 +41,171 @@ merge-stream "^2.0.0" micromatch "^4.0.2" -"@abp/bootstrap-datepicker@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-5.3.0-rc.2.tgz#228735714f2baeb42e864c175e0aed3f855249d7" - integrity sha512-jZ7vGvsLjnXwpzvQ6vjKHWBkiptYBnEDVIfQ/zKV8kvkhdu+xxOP/u1LM90NSR2YckjIRj8+mINEcrnWhXgRNw== +"@abp/bootstrap-datepicker@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-5.3.0-rc.3.tgz#f98743539a1e8d883869aa7a759ba1aa00cd0689" + integrity sha512-VNNROxO1wzjG2q35wKEh4STluZllVggNhb0UyGtpZVNbtLydSxeFGHcve26f8UfEWE3WfC5Yyw8nBOHyJxh6tg== dependencies: bootstrap-datepicker "^1.9.0" -"@abp/bootstrap@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-5.3.0-rc.2.tgz#c410f44d987d09b5a74fd58417d03788fa878884" - integrity sha512-jb58M67kWldW35zTjVDFLaCj4STly2eU40COYFgjPQSH7F21DvMdX69Cp3jpmHaxm8VQE9izgW0NV8+oGlFyAw== +"@abp/bootstrap@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-5.3.0-rc.3.tgz#338b5ce194a257e5f14be2344b4e722874273ab1" + integrity sha512-fom2AboT9d1O3K1cOrIFT9l5Cvw2l42BvxEHkV3sXkZxZSstc9exURQn0WmKxWnOMCwM03N2IMKsFlk6SePN2A== dependencies: - "@abp/core" "~5.3.0-rc.2" + "@abp/core" "~5.3.0-rc.3" bootstrap "^5.1.3" -"@abp/clipboard@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-5.3.0-rc.2.tgz#e9a4f38a5d33d88a5c2440422a87e403671b3ed8" - integrity sha512-8OKcmGych7cmcYn8tuUmGo+mMlThNBDZA71c/cVAGw1RuLM16SCgeJVeVFhyUrmkBwH/E5Hfh06ZLlIrZKj36Q== +"@abp/clipboard@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-5.3.0-rc.3.tgz#30ed8014dfc383f53df91553cef8d405a6d9070a" + integrity sha512-4IVMgasvomY8Q0m1Y48VJr5TK3+BmeAQhEp+B4h2whE+/uIFpAhFWS5U0Bie9GjqQdEEqJ1a01tn16fK9jpzcw== dependencies: - "@abp/core" "~5.3.0-rc.2" + "@abp/core" "~5.3.0-rc.3" clipboard "^2.0.8" -"@abp/core@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-5.3.0-rc.2.tgz#3a3c6d187c502436bb02db99be3720f61628c924" - integrity sha512-/BEO90D7ibeyZxfCQHv2bbb9y/SpfZtaw0A8gmQlYrH3rZ3Th935v5XjCeYem8IGJ8fDZO7CRzW5TBsku/PukA== +"@abp/core@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-5.3.0-rc.3.tgz#7846bd8582bbb9effdb058b3b815fc1798b33f01" + integrity sha512-RyFoereWj/YOccWFeB5yq4aktKnYl44xrb6LKNkCmcVadbOJ+7AHgHljychTuMZalTvfzW2GcZacIoHw4bhn/A== dependencies: - "@abp/utils" "~5.3.0-rc.2" + "@abp/utils" "~5.3.0-rc.3" -"@abp/datatables.net-bs5@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-5.3.0-rc.2.tgz#452c2112fbe3cdac8c0d12bb626017f7c6333a45" - integrity sha512-Rk1uY76dGMnBFYILdXrb6Oc+jjblLdSzGZvDH1dyoFYs0bLWsjqVsOIE+kCjO447PgDOLyF+4nurLj+A9yCkEg== +"@abp/datatables.net-bs5@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-5.3.0-rc.3.tgz#f420208050a3a6f8e0ad3bcbb6af0e74584d2883" + integrity sha512-gwWMRElBQatElOdWyozYOY7lhYAUQu6/aZnf4XyiTlaWp6g1iMRJKgmaT73DhiIl+jxUiFtWjEla+65cXSl7sA== dependencies: - "@abp/datatables.net" "~5.3.0-rc.2" + "@abp/datatables.net" "~5.3.0-rc.3" datatables.net-bs5 "^1.11.4" -"@abp/datatables.net@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-5.3.0-rc.2.tgz#e7156085d76ab0b20e41fe92f9c99b14822b5f6a" - integrity sha512-aPSSmnBC939uYHR9fxxuvtxq4217qG3f8uf18ar7yWJwzWAYMOOhkmK0rEOqn86ObuXdjMAly7ThyfL6RH2iNQ== +"@abp/datatables.net@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-5.3.0-rc.3.tgz#e4b1f9fe41e788878f9cce082d6a79db9c4a8bae" + integrity sha512-FghO+XGSu9rwKOAUYC5AsB6hh1KrXAJ3GmHFYOIHrcd9nB/e60NtyoOo14TeO/LAFCVLOLq/FIBpEbkUZJZHkA== dependencies: - "@abp/jquery" "~5.3.0-rc.2" + "@abp/jquery" "~5.3.0-rc.3" datatables.net "^1.11.4" -"@abp/font-awesome@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-5.3.0-rc.2.tgz#30995f5f5f6d604cd2241ee677ec14dcfc78377d" - integrity sha512-KFwYcjiq01RxI75qnbDt+G8zFcSEJRurHHZQwcI7ySjtQV5xM41zycOYIOV3SKz/gcyYyBBL5UeJPjsE8cu+Fw== +"@abp/font-awesome@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-5.3.0-rc.3.tgz#ef97f0a95385f1d56d4432b84944379d2cb1bfbd" + integrity sha512-kbm9ZaK8SSMcoeBbMdT1b5rJOZ3y8i/bdqD+3g0s65LEeqXNrKV/TkDdJqns72x4PxUQV6r3naXaEbV6Yj/sXQ== dependencies: - "@abp/core" "~5.3.0-rc.2" + "@abp/core" "~5.3.0-rc.3" "@fortawesome/fontawesome-free" "^5.15.4" -"@abp/jquery-form@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-5.3.0-rc.2.tgz#53561d6966f25bf6f7e91dcb89032fecd2c35d1f" - integrity sha512-94ExZ5q02s7ANpFyQnEcuSUjyra+32jMMkV0ZITbjWlmFRcXEogeIF3q3B4XswRi+yf67kQg7ynYCbGR7JESDg== +"@abp/jquery-form@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-5.3.0-rc.3.tgz#497f0a442323d99a7939ba8f9e5234d1a1891e03" + integrity sha512-gknwOgCEF4oJo9Vz2uM2Dl9dkJ2ulJSLb6YXEsPWx5fAFfIuwOl/5H0I1EE4XemtcEpF6xb+Ettnaxo8TcnIcg== dependencies: - "@abp/jquery" "~5.3.0-rc.2" + "@abp/jquery" "~5.3.0-rc.3" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-5.3.0-rc.2.tgz#957387fb88414a50a5d3d84089ab3704b710645f" - integrity sha512-dIXsxqQ0x+xiLCA2x6xWR3wIvfpT0zukLFOrkCVNSc+mnWWyYlavRnGl3f5W/4jQSPZ9Ao/txhsThfkvO+Mu0Q== +"@abp/jquery-validation-unobtrusive@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-5.3.0-rc.3.tgz#a3e39dfb4ba2e0f45dcfde28bd22ff36c55173a0" + integrity sha512-zgSNkg/mzNDzvE+3cL58nLoV3EvFB/ALiLHudo8GcWsdFxx7R+2DfboCSFE1oJ8do6tED+9YG0/VJiZDXnFPwQ== dependencies: - "@abp/jquery-validation" "~5.3.0-rc.2" + "@abp/jquery-validation" "~5.3.0-rc.3" jquery-validation-unobtrusive "^3.2.12" -"@abp/jquery-validation@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-5.3.0-rc.2.tgz#d866b10ffbfc1852df11122aa2cf6a56e50819b3" - integrity sha512-DAxwKjalhMZNCuXBS6Ai9RlIDsEzm0SGnFDApQIo/i6HGKoK4J/eTnFZ175xZMQ79yrxe71MKWR29l/+PuwcRw== +"@abp/jquery-validation@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-5.3.0-rc.3.tgz#917a2b2e7e4b8e5aacdd10284f18f58bfac1743d" + integrity sha512-m2pPTGJs8MQzzdzMpWFD94RU4dqMrwwT4ZJyqz07EPzRv7NURGVlzJOPdwDiTVdiT5UsaYzDF0BYgfj3/FL/iw== dependencies: - "@abp/jquery" "~5.3.0-rc.2" + "@abp/jquery" "~5.3.0-rc.3" jquery-validation "^1.19.3" -"@abp/jquery@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-5.3.0-rc.2.tgz#8a5008123f5dbf1276c719ac45101161e9d9b793" - integrity sha512-VjA22n17pPKqj6jZUk6qxpqx2UT5Uv6q/AvyJtacDC3D1MXfrnSWxi9FAPFp4N52i4knkfuKFZtuFlFSkQe4FQ== +"@abp/jquery@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-5.3.0-rc.3.tgz#e75ca02fa0520c60b1aed14444fc129ed6a27d0b" + integrity sha512-ZJYpnFqByAzHKru1aGz8VLZw4xb/YD1wpahN9pIsPYeFrE6/7Vjs8npQk5it2Ww5gaA3unSrMIc0CMsr5kk0Nw== dependencies: - "@abp/core" "~5.3.0-rc.2" + "@abp/core" "~5.3.0-rc.3" jquery "~3.6.0" -"@abp/lodash@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-5.3.0-rc.2.tgz#51600a0ba49c6d4060c3e280b1f1d62ed7f48a16" - integrity sha512-qreUjH0umhsGKRSYpswcX1SAF1iNBp/AP32LMfvezvPaCA+KQFWknHuOTV2jn1tYC5c7KJTTTp46jRTi88VSHQ== +"@abp/lodash@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-5.3.0-rc.3.tgz#3fcc23626b9e36652ee36847b4a8879cf8aae8ef" + integrity sha512-KJFNAhW3AHi6AAhSlix50gbU9QmQT9TD5RYofEoIm1rfd7iZF0uowJheES0jqHU4PeS80Fnzp8AnBhVYgRMUjg== dependencies: - "@abp/core" "~5.3.0-rc.2" + "@abp/core" "~5.3.0-rc.3" lodash "^4.17.21" -"@abp/luxon@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-5.3.0-rc.2.tgz#6ea39998aaba2a3bd6e6dd3c9cacc1a0f56afa8f" - integrity sha512-9++6ZD0zEmJcH3iSNcTtC0haEVbQgxzoFx1wpEXsB3YVuBKUjJnJCXMbt0Qmkkq40tclmG8bfORRYhII29TLWA== +"@abp/luxon@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-5.3.0-rc.3.tgz#cf9e2070f3b3e1281dcf05ba1781d8daa41da98d" + integrity sha512-1gBfWwFrS+xuTD12dB/LLUbGWCATbByp1kCFbHdgVNOkkkDvJETS0LeB8o/ggw7rBWL5i3Jkpb5xFTRT6yKX4Q== dependencies: - "@abp/core" "~5.3.0-rc.2" + "@abp/core" "~5.3.0-rc.3" luxon "^2.3.0" -"@abp/malihu-custom-scrollbar-plugin@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-5.3.0-rc.2.tgz#069e071472eb8727260e9a1b5322e30cdaebffc9" - integrity sha512-JPaoNiYWR6T7Osx4ezURFanxC9ex1U9zr+7Fko1mmig8oZ+OHsk1cbdNBD5ChgAVsHdqK2eJ4iobDjhsDfMYiA== +"@abp/malihu-custom-scrollbar-plugin@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-5.3.0-rc.3.tgz#1d8d5cede65dbd0d0975d8fabfe135105710ddde" + integrity sha512-SW8UBKQGsS8zrG2RkmGBuze/NgreDWWJ84l2qMKYmTtgL/kOCLm4FBvo44azNOq6a3rYVJGpwirYRBcwrsAfHw== dependencies: - "@abp/core" "~5.3.0-rc.2" + "@abp/core" "~5.3.0-rc.3" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/prismjs@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-5.3.0-rc.2.tgz#8a5ed8032a1e8ba7644adbffae9efdc18c3811f7" - integrity sha512-G7ab7PL0TcjtvA9rdFj0RajP0pXZrXmIzKZ/vtQqW6mNLXNCI1OKJ/fAXXwS35gFEyVPvn9xKPnuYlhwqWl6ug== +"@abp/prismjs@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-5.3.0-rc.3.tgz#c382946b15c820a01e3833ba5c4b3f6d52f8365c" + integrity sha512-a/lahdqzBEcsQ8j9Vjg8KC8xyDroGBi+4NIV2wb+k0CAaA49L25lfq0RSCji5RgyZ9Hjznhg/NyD6AFKaB3ykA== dependencies: - "@abp/clipboard" "~5.3.0-rc.2" - "@abp/core" "~5.3.0-rc.2" + "@abp/clipboard" "~5.3.0-rc.3" + "@abp/core" "~5.3.0-rc.3" prismjs "^1.26.0" -"@abp/select2@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-5.3.0-rc.2.tgz#50e622f2296c3594e89699e8747dcf520fb4415d" - integrity sha512-HwfiEgeECkzQhCf/3Je/V7pRtRvr3YQtX1gAWpI6Ty2P+nTV4ue/l1w5Si+59vuJm3JP+fCnSFPlHXxahfL/Gw== +"@abp/select2@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-5.3.0-rc.3.tgz#7a0f9f7472c812b85ce9bc5bd8a557c33e967e7d" + integrity sha512-6t+UXjDh3bzaCWsSxwuRtOgGz+aDidPKA2JKZfKLAFM4WkcLmY8Px0RY3jgsbxrtM9ANncA9gbl69Q3uY2DmHA== dependencies: - "@abp/core" "~5.3.0-rc.2" + "@abp/core" "~5.3.0-rc.3" select2 "^4.0.13" -"@abp/sweetalert2@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-5.3.0-rc.2.tgz#41d19b81011e3d5c9d12b8d6ec6da12e52553683" - integrity sha512-6Qx2WIpXQI/ydfX9P7cMISvwrFi4UAPzkuNkhPOZT7chq64auz88Rtqyw+SLXLnCCQ+e31/ekFldijOG9CbV1g== +"@abp/sweetalert2@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-5.3.0-rc.3.tgz#91557a4b4a103f68a926fde19c830e195597ff0d" + integrity sha512-hAw+E8EnGO9nnyGbGiD/y+SyScHD4R0MEi/eK2bsMSKAzBxKcUBv0MxrsNQc0WhVwqRQETRccdLX3WYofmh8Kw== dependencies: - "@abp/core" "~5.3.0-rc.2" + "@abp/core" "~5.3.0-rc.3" sweetalert2 "^11.3.6" -"@abp/timeago@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-5.3.0-rc.2.tgz#16f73659e83643d82eafac716115dbf0333cce98" - integrity sha512-fFvBX65Bzvg+x4vClzSh31FJJ2m6b2/s+IJ4/t4FNDxDqybfOzkAfRzPm7NVDw5Avu1fjRLwFhQueb0sECQD/w== +"@abp/timeago@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-5.3.0-rc.3.tgz#7480ed2d5ee035d2f43c223d7bb58d794ff3ba2f" + integrity sha512-kgIlH/KGWhYwZSGvCT5LnCYoD+1pSwoQf2GhtvgBUnYqxS6+s0FUSMSzX/MISLOvLWknl2KNnARsOXJkqrWXEw== dependencies: - "@abp/jquery" "~5.3.0-rc.2" + "@abp/jquery" "~5.3.0-rc.3" timeago "^1.6.7" -"@abp/toastr@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-5.3.0-rc.2.tgz#e868ffe7acc3e1838dd008f936e909250e360cc8" - integrity sha512-0BLjOSalZw7NdRXw4/SwPP7N+ChFGO2elEJ7zyd0c8Bi+Gz5lqL6ZW47O1ANKSv9HnPoyRsPDSBiCIvXXtlFOw== +"@abp/toastr@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-5.3.0-rc.3.tgz#1a6f03737c2ae92d62a8b7f51d4c70cc4d97212f" + integrity sha512-Vag9lz2YboyZ0/4Y/OvFG+EaY0PCs5X97ZijZRB+saSRe1pL1+qnBMpniMDUvbMEpitB5Qq+FqdkOnKdhlrH4A== dependencies: - "@abp/jquery" "~5.3.0-rc.2" + "@abp/jquery" "~5.3.0-rc.3" toastr "^2.1.4" -"@abp/utils@~5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-5.3.0-rc.2.tgz#cbdf34bb32f99396c2a7f6dd2f0fa0b5239413bb" - integrity sha512-0BgsxKwkiNcbBSDJIfxBObM4QYTk1umZ/WnKUdvSyv0Fe4hKK+gDvsBzk97O+ZVyBHIflvcln3dKpS3eIVwhIg== +"@abp/utils@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-5.3.0-rc.3.tgz#e91f10b18ac1e17af7f15c85257c24034cab2ba1" + integrity sha512-vMzsddCvI+M6Qd7Hns5KPUXqdFFboJwAOB9gvxj+MmjVNDCpFTo1hjq0H0zB6NHI8Ik+9sw44D0c7gkTdQQt7Q== dependencies: just-compare "^1.3.0" -"@abp/virtual-file-explorer@^5.3.0-rc.2": - version "5.3.0-rc.2" - resolved "https://registry.yarnpkg.com/@abp/virtual-file-explorer/-/virtual-file-explorer-5.3.0-rc.2.tgz#12dc045a2c96cb8bf9961f26f82d36a69d92c8d4" - integrity sha512-cKI+6xOLbDkNK308ViUv0JYLl2DmF31jtES2Slar7/UoW/24iz9txSZcjCfM42Z15mw3p34Mx9BjtPQJMnHreg== +"@abp/virtual-file-explorer@^5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/virtual-file-explorer/-/virtual-file-explorer-5.3.0-rc.3.tgz#3e1728541e13a8e5aaf61a86faaa481e7c603e2d" + integrity sha512-g7lKMM6G6teoNKi7+zvg8Yp6Xp5p1XMzEstgVi+LEggYrDatxwoBCFNg4PcxghuzyJDQa9Hj1sk91bcW3HljmA== dependencies: - "@abp/clipboard" "~5.3.0-rc.2" - "@abp/prismjs" "~5.3.0-rc.2" + "@abp/clipboard" "~5.3.0-rc.3" + "@abp/prismjs" "~5.3.0-rc.3" "@fortawesome/fontawesome-free@^5.15.4": version "5.15.4" diff --git a/npm/lerna.json b/npm/lerna.json index c30835c26b..732e65a687 100644 --- a/npm/lerna.json +++ b/npm/lerna.json @@ -1,5 +1,5 @@ { - "version": "5.3.0-rc.2", + "version": "5.3.0-rc.3", "packages": [ "packs/*" ], diff --git a/npm/ng-packs/lerna.version.json b/npm/ng-packs/lerna.version.json index 745141ad08..a7b4a9e157 100644 --- a/npm/ng-packs/lerna.version.json +++ b/npm/ng-packs/lerna.version.json @@ -1,5 +1,5 @@ { - "version": "5.3.0-rc.2", + "version": "5.3.0-rc.3", "packages": [ "packages/*" ], diff --git a/npm/ng-packs/package.json b/npm/ng-packs/package.json index e0f4f87346..64e24cac82 100644 --- a/npm/ng-packs/package.json +++ b/npm/ng-packs/package.json @@ -38,7 +38,7 @@ }, "private": true, "devDependencies": { - "@abp/utils": "~5.3.0-rc.2", + "@abp/utils": "~5.3.0-rc.3", "@angular-devkit/build-angular": "13.3.5", "@angular-devkit/build-ng-packagr": "^0.1002.0", "@angular-devkit/schematics-cli": "~12.2.0", @@ -57,17 +57,17 @@ "@angular/platform-browser": "13.3.6", "@angular/platform-browser-dynamic": "13.3.6", "@angular/router": "13.3.6", - "@abp/ng.account": "~5.3.0-rc.2", - "@abp/ng.account.core": "~5.3.0-rc.2", - "@abp/ng.core": "~5.3.0-rc.2", - "@abp/ng.feature-management": "~5.3.0-rc.2", - "@abp/ng.identity": "~5.3.0-rc.2", - "@abp/ng.permission-management": "~5.3.0-rc.2", - "@abp/ng.schematics": "~5.3.0-rc.2", - "@abp/ng.setting-management": "~5.3.0-rc.2", - "@abp/ng.tenant-management": "~5.3.0-rc.2", - "@abp/ng.theme.basic": "~5.3.0-rc.2", - "@abp/ng.theme.shared": "~5.3.0-rc.2", + "@abp/ng.account": "~5.3.0-rc.3", + "@abp/ng.account.core": "~5.3.0-rc.3", + "@abp/ng.core": "~5.3.0-rc.3", + "@abp/ng.feature-management": "~5.3.0-rc.3", + "@abp/ng.identity": "~5.3.0-rc.3", + "@abp/ng.permission-management": "~5.3.0-rc.3", + "@abp/ng.schematics": "~5.3.0-rc.3", + "@abp/ng.setting-management": "~5.3.0-rc.3", + "@abp/ng.tenant-management": "~5.3.0-rc.3", + "@abp/ng.theme.basic": "~5.3.0-rc.3", + "@abp/ng.theme.shared": "~5.3.0-rc.3", "@fortawesome/fontawesome-free": "^5.15.4", "@ng-bootstrap/ng-bootstrap": "~12.0.0-beta.4", "@ngneat/spectator": "^10.0.0", diff --git a/npm/ng-packs/packages/account-core/package.json b/npm/ng-packs/packages/account-core/package.json index 4985bd8b0b..1f2c890a17 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": "5.3.0-rc.2", + "version": "5.3.0-rc.3", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "peerDependencies": { - "@abp/ng.core": "~5.3.0-rc.2", - "@abp/ng.theme.shared": "~5.3.0-rc.2", + "@abp/ng.core": "~5.3.0-rc.3", + "@abp/ng.theme.shared": "~5.3.0-rc.3", "@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 ec7606ded0..9c8d8921db 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": "5.3.0-rc.2", + "version": "5.3.0-rc.3", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.account.core": "~5.3.0-rc.2", - "@abp/ng.theme.shared": "~5.3.0-rc.2", + "@abp/ng.account.core": "~5.3.0-rc.3", + "@abp/ng.theme.shared": "~5.3.0-rc.3", "tslib": "^2.0.0" }, "publishConfig": { diff --git a/npm/ng-packs/packages/components/package.json b/npm/ng-packs/packages/components/package.json index 5a0b93d69f..562998574a 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": "5.3.0-rc.2", + "version": "5.3.0-rc.3", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "peerDependencies": { - "@abp/ng.core": ">=5.3.0-rc.2", - "@abp/ng.theme.shared": ">=5.3.0-rc.2", + "@abp/ng.core": ">=5.3.0-rc.3", + "@abp/ng.theme.shared": ">=5.3.0-rc.3", "@ng-bootstrap/ng-bootstrap": ">=10.0.0" }, "dependencies": { diff --git a/npm/ng-packs/packages/core/package.json b/npm/ng-packs/packages/core/package.json index 2e4f957eeb..6c931392a4 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": "5.3.0-rc.2", + "version": "5.3.0-rc.3", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/utils": "~5.3.0-rc.2", + "@abp/utils": "~5.3.0-rc.3", "angular-oauth2-oidc": "^13.0.1", "just-clone": "^3.2.1", "just-compare": "^1.4.0", diff --git a/npm/ng-packs/packages/feature-management/package.json b/npm/ng-packs/packages/feature-management/package.json index b25f7e95fd..42cc7e9171 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": "5.3.0-rc.2", + "version": "5.3.0-rc.3", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.theme.shared": "~5.3.0-rc.2", + "@abp/ng.theme.shared": "~5.3.0-rc.3", "tslib": "^2.0.0" }, "publishConfig": { diff --git a/npm/ng-packs/packages/identity/package.json b/npm/ng-packs/packages/identity/package.json index 801c4c4376..0f745aa774 100644 --- a/npm/ng-packs/packages/identity/package.json +++ b/npm/ng-packs/packages/identity/package.json @@ -1,14 +1,14 @@ { "name": "@abp/ng.identity", - "version": "5.3.0-rc.2", + "version": "5.3.0-rc.3", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.permission-management": "~5.3.0-rc.2", - "@abp/ng.theme.shared": "~5.3.0-rc.2", + "@abp/ng.permission-management": "~5.3.0-rc.3", + "@abp/ng.theme.shared": "~5.3.0-rc.3", "tslib": "^2.0.0" }, "publishConfig": { diff --git a/npm/ng-packs/packages/permission-management/package.json b/npm/ng-packs/packages/permission-management/package.json index 1a22192b9b..fd55ade2f3 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": "5.3.0-rc.2", + "version": "5.3.0-rc.3", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.theme.shared": "~5.3.0-rc.2", + "@abp/ng.theme.shared": "~5.3.0-rc.3", "tslib": "^2.0.0" }, "publishConfig": { diff --git a/npm/ng-packs/packages/schematics/package.json b/npm/ng-packs/packages/schematics/package.json index b2931fa5a4..1dc8cb270a 100644 --- a/npm/ng-packs/packages/schematics/package.json +++ b/npm/ng-packs/packages/schematics/package.json @@ -1,6 +1,6 @@ { "name": "@abp/ng.schematics", - "version": "5.3.0-rc.2", + "version": "5.3.0-rc.3", "description": "Schematics that works with ABP Backend", "keywords": [ "schematics" diff --git a/npm/ng-packs/packages/setting-management/package.json b/npm/ng-packs/packages/setting-management/package.json index f95fc32987..90b8c74d10 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": "5.3.0-rc.2", + "version": "5.3.0-rc.3", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.components": "~5.3.0-rc.2", - "@abp/ng.theme.shared": "~5.3.0-rc.2", + "@abp/ng.components": "~5.3.0-rc.3", + "@abp/ng.theme.shared": "~5.3.0-rc.3", "tslib": "^2.0.0" }, "publishConfig": { diff --git a/npm/ng-packs/packages/tenant-management/package.json b/npm/ng-packs/packages/tenant-management/package.json index 718c97d605..63ae84d25f 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": "5.3.0-rc.2", + "version": "5.3.0-rc.3", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.feature-management": "~5.3.0-rc.2", - "@abp/ng.theme.shared": "~5.3.0-rc.2", + "@abp/ng.feature-management": "~5.3.0-rc.3", + "@abp/ng.theme.shared": "~5.3.0-rc.3", "tslib": "^2.0.0" }, "publishConfig": { diff --git a/npm/ng-packs/packages/theme-basic/package.json b/npm/ng-packs/packages/theme-basic/package.json index 671b5e5fb5..97eb383e4e 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": "5.3.0-rc.2", + "version": "5.3.0-rc.3", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.account.core": "~5.3.0-rc.2", - "@abp/ng.theme.shared": "~5.3.0-rc.2", + "@abp/ng.account.core": "~5.3.0-rc.3", + "@abp/ng.theme.shared": "~5.3.0-rc.3", "tslib": "^2.0.0" }, "publishConfig": { diff --git a/npm/ng-packs/packages/theme-shared/package.json b/npm/ng-packs/packages/theme-shared/package.json index e521ab0531..203d514015 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": "5.3.0-rc.2", + "version": "5.3.0-rc.3", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.core": "~5.3.0-rc.2", + "@abp/ng.core": "~5.3.0-rc.3", "@fortawesome/fontawesome-free": "^5.15.4", "@ng-bootstrap/ng-bootstrap": "~12.0.0-beta.4", "@ngx-validate/core": "^0.1.1", diff --git a/npm/ng-packs/yarn.lock b/npm/ng-packs/yarn.lock index f4ba2b0583..efca2a65dd 100644 --- a/npm/ng-packs/yarn.lock +++ b/npm/ng-packs/yarn.lock @@ -2,72 +2,72 @@ # yarn lockfile v1 -"@abp/ng.account.core@~5.3.0-rc.1": - version "5.3.0-rc.1" - resolved "https://registry.yarnpkg.com/@abp/ng.account.core/-/ng.account.core-5.3.0-rc.1.tgz#47e80a8ae2c913d1ef123b0d9456424d8630bc16" - integrity sha512-qoWEBSWhdn7fi7RnUiuzegLZeHNaMuBho4/zPoR/owsai+HtDm0RiNapKCZMHat1mqeZI1Mw/THLkZ2lLBgyKg== +"@abp/ng.account.core@~5.3.0-rc.2": + version "5.3.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/ng.account.core/-/ng.account.core-5.3.0-rc.2.tgz#0a82588fe90d9f279c09bda230cc9f25afcc94c8" + integrity sha512-17q8FDty+q3RDZaKDfDtAbZcxFs6aGdRRql9+mtAH0llcYQN+pliKxBdoIa9fRQ6tOkbBq20vmlyzSEcDmOWoQ== dependencies: tslib "^2.0.0" -"@abp/ng.account@~5.3.0-rc.1": - version "5.3.0-rc.1" - resolved "https://registry.yarnpkg.com/@abp/ng.account/-/ng.account-5.3.0-rc.1.tgz#b1c197fd1e8d015fc07a1a026a3e8602e8356b37" - integrity sha512-7X66FBR77OjSzDuGGkI5zVL68qzhP0/ZrYF0WIk2sNSvcJW//KaaSqk44XEqZ7FzzUPwNePMCtxPtgFWdeXqnw== +"@abp/ng.account@~5.3.0-rc.2": + version "5.3.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/ng.account/-/ng.account-5.3.0-rc.2.tgz#8a10cf081ce4fb4898f8d6aad420f5310a3ffcff" + integrity sha512-r7ngWTjg4oiT1L7rRA/TwWD0DCy0PfiZYCTLOmfILN8Kcm9sAFU0WLdDRU3tLKgwsQJSY1fcIMK+aGTyMMAqNw== dependencies: - "@abp/ng.account.core" "~5.3.0-rc.1" - "@abp/ng.theme.shared" "~5.3.0-rc.1" + "@abp/ng.account.core" "~5.3.0-rc.2" + "@abp/ng.theme.shared" "~5.3.0-rc.2" tslib "^2.0.0" -"@abp/ng.components@~5.3.0-rc.1": - version "5.3.0-rc.1" - resolved "https://registry.yarnpkg.com/@abp/ng.components/-/ng.components-5.3.0-rc.1.tgz#a4ac86ca92f21b0ceb787f06bdc9624bd314159c" - integrity sha512-gBv8Y5SUAhUkORSprI0+obkPJuFs8zyyLu3QkNgAb+F2dHBkmpHZyDDE46uZ4kDTjVerEDdJ32sjcfNBGRUpiw== +"@abp/ng.components@~5.3.0-rc.2": + version "5.3.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/ng.components/-/ng.components-5.3.0-rc.2.tgz#89b7e1d8ec7aa5dabcbc83cc4d6fdc20316dc2cb" + integrity sha512-02YU6oZWzGFm8UPfJRokv9dHjuhW4JMV26qg0mL5HPSQOnwNuov5skHA9EFli5aRPBEjM0b3eitz+t8J9B68KQ== dependencies: chart.js "^3.5.1" ng-zorro-antd "^13.0.0" tslib "^2.0.0" -"@abp/ng.core@~5.3.0-rc.1": - version "5.3.0-rc.1" - resolved "https://registry.yarnpkg.com/@abp/ng.core/-/ng.core-5.3.0-rc.1.tgz#17eb15e7898f085f91ffae831aac4f94c10443d9" - integrity sha512-yfsrGyCuSbq8PR1GkmCPlMTn9+DIpiHB78MTA7G4KkrQukaIG3qlyeWEORrpc6XcUSePYZN8MiFLfpoUavBQ3A== +"@abp/ng.core@~5.3.0-rc.2": + version "5.3.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/ng.core/-/ng.core-5.3.0-rc.2.tgz#f5c34ce938e504195443188308786bbd66fb26c4" + integrity sha512-EcVUBFT+lKLbYQettq6woCjWeK1QkzTS7vDcVnl0n6HcMw4LDpUiitpu7/RBGX64U6jy0naqw8LYJ/Mh3bsamw== dependencies: - "@abp/utils" "~5.3.0-rc.1" + "@abp/utils" "~5.3.0-rc.2" angular-oauth2-oidc "^13.0.1" just-clone "^3.2.1" just-compare "^1.4.0" ts-toolbelt "6.15.4" tslib "^2.0.0" -"@abp/ng.feature-management@~5.3.0-rc.1": - version "5.3.0-rc.1" - resolved "https://registry.yarnpkg.com/@abp/ng.feature-management/-/ng.feature-management-5.3.0-rc.1.tgz#87e416e7a9b99e365262bbd4f6d7792181a63242" - integrity sha512-Ht+apAMaZeIPHaaHR/fuMa2Hb4P1XFMlFz4Cph04dIaqut5k7WYSEbXglZdwZynY5UE3cRaQlPRIjSM7IlTDVA== +"@abp/ng.feature-management@~5.3.0-rc.2": + version "5.3.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/ng.feature-management/-/ng.feature-management-5.3.0-rc.2.tgz#0616d2061d04c855136637f4df7e8374f576392c" + integrity sha512-N0j53PEqobzHqOVFuGpM67fVTSRMgaVprgb9tl8cudfbuP7ORS8whyMSd7fqeNIOg23hY+LJWgO9vvaChBq8xg== dependencies: - "@abp/ng.theme.shared" "~5.3.0-rc.1" + "@abp/ng.theme.shared" "~5.3.0-rc.2" tslib "^2.0.0" -"@abp/ng.identity@~5.3.0-rc.1": - version "5.3.0-rc.1" - resolved "https://registry.yarnpkg.com/@abp/ng.identity/-/ng.identity-5.3.0-rc.1.tgz#ff8cfd151b34cef01ec56b1e5976c7f59be29557" - integrity sha512-126mfJnfFPQZJPJ1HdKm5yjsq/QorKwgtV3UbN8gI8q5l2incOKgh2M1IHS/9KX5Qt9quKAyX8RKHZ2n50HxEQ== +"@abp/ng.identity@~5.3.0-rc.2": + version "5.3.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/ng.identity/-/ng.identity-5.3.0-rc.2.tgz#b209ad0d8c0d847b7c9ccf96879c0d95b380a8ea" + integrity sha512-VJZFosUlHG7O6eBx0kdlNAoAW+FQYJ7iN/u5+bLMJ4btUXqYtkTdjCzOAB/Ol3js3LkyYXrAxGQEQDPNZBZOvw== dependencies: - "@abp/ng.permission-management" "~5.3.0-rc.1" - "@abp/ng.theme.shared" "~5.3.0-rc.1" + "@abp/ng.permission-management" "~5.3.0-rc.2" + "@abp/ng.theme.shared" "~5.3.0-rc.2" tslib "^2.0.0" -"@abp/ng.permission-management@~5.3.0-rc.1": - version "5.3.0-rc.1" - resolved "https://registry.yarnpkg.com/@abp/ng.permission-management/-/ng.permission-management-5.3.0-rc.1.tgz#163c329019ef39fc6f2fbd5dd48cda8d72d4f784" - integrity sha512-+o/PDXcN3Uk3ctYdk3htseNPIzOOvAIbJHn/brjMQVfovMvRGEU/eX+b7u3GKlQWQdcTPNoLtNEzBPDCuuzhkw== +"@abp/ng.permission-management@~5.3.0-rc.2": + version "5.3.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/ng.permission-management/-/ng.permission-management-5.3.0-rc.2.tgz#aaa1b20e9c59fe85eb6f7e48e90de24c92c37c2e" + integrity sha512-Z3AIAT3DreotIKtZ4Nm4RjWlFSRVn+qSA7pWtA6Zy1t6IkO1ELJ8JSVuNK5Z3IsYSeD6h/+ypd3LzLnLwdAwdQ== dependencies: - "@abp/ng.theme.shared" "~5.3.0-rc.1" + "@abp/ng.theme.shared" "~5.3.0-rc.2" tslib "^2.0.0" -"@abp/ng.schematics@~5.3.0-rc.1": - version "5.3.0-rc.1" - resolved "https://registry.yarnpkg.com/@abp/ng.schematics/-/ng.schematics-5.3.0-rc.1.tgz#f4dfa53e05d34013a3f27786fcff14b972c0affa" - integrity sha512-7uavvwQdmKZMGFSHRvl5Wo5bT+fZcJPGiyUOAuZDzBIf447n6CP+p/l0tLadmWsaV5shHn6W75uJQJg9WeGvWg== +"@abp/ng.schematics@~5.3.0-rc.2": + version "5.3.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/ng.schematics/-/ng.schematics-5.3.0-rc.2.tgz#0ea5bcfea650cb69ebc6f301b2e58f0f7ec4545e" + integrity sha512-qGoGqGYge6wp+busuOBY4gLPKfmg6kB1aD+m+FF1w+vL3oa0P1tat/3G7raPCFJJWNGvCyDoqmRupSyCD2/PXQ== dependencies: "@angular-devkit/core" "~11.0.2" "@angular-devkit/schematics" "~11.0.2" @@ -76,39 +76,39 @@ should-quote "^1.0.0" typescript "~3.9.2" -"@abp/ng.setting-management@~5.3.0-rc.1": - version "5.3.0-rc.1" - resolved "https://registry.yarnpkg.com/@abp/ng.setting-management/-/ng.setting-management-5.3.0-rc.1.tgz#6c5df22b5485f4af034c3fa741476e3900d5a72a" - integrity sha512-m3wr5N4U3lFV5d0DouyWKUfrd9mQu/QcPIWwa7rRkhPlQl2848qv82aByGhoMLt/Q+XVH3HkzMlxH75FnuYw1A== +"@abp/ng.setting-management@~5.3.0-rc.2": + version "5.3.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/ng.setting-management/-/ng.setting-management-5.3.0-rc.2.tgz#278ec7cff6ea68ee5022368d6b0e01ab2328f191" + integrity sha512-t/pjNl0p3miy9EYMXhq3yyM9RezO40sSHYoNrW77VIoWKCzH5bQ9bx7otPIgLWXwCekthR8NzUgnDOTFvei9hQ== dependencies: - "@abp/ng.components" "~5.3.0-rc.1" - "@abp/ng.theme.shared" "~5.3.0-rc.1" + "@abp/ng.components" "~5.3.0-rc.2" + "@abp/ng.theme.shared" "~5.3.0-rc.2" tslib "^2.0.0" -"@abp/ng.tenant-management@~5.3.0-rc.1": - version "5.3.0-rc.1" - resolved "https://registry.yarnpkg.com/@abp/ng.tenant-management/-/ng.tenant-management-5.3.0-rc.1.tgz#9877bd91627f184bd4d976c6b8054d310bbfe475" - integrity sha512-tEVdpX9xDTbU0gn4TC87TzrzKT/G3c4NQPxDo1UNNHSYZv3ABlSlhEG89tG3XkEondhQfxssHTtdioh4RL6YSw== +"@abp/ng.tenant-management@~5.3.0-rc.2": + version "5.3.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/ng.tenant-management/-/ng.tenant-management-5.3.0-rc.2.tgz#08213a52b1458fd34d0e29a805a2d9bf1c223198" + integrity sha512-swNhIb97mFztu2U68t2/N1gaX3Up9F4rdUhF0EIA1uAKurKNT0XZc0vsJrgKTEf4kpfhKWnPAkUSBs+a7l/CSQ== dependencies: - "@abp/ng.feature-management" "~5.3.0-rc.1" - "@abp/ng.theme.shared" "~5.3.0-rc.1" + "@abp/ng.feature-management" "~5.3.0-rc.2" + "@abp/ng.theme.shared" "~5.3.0-rc.2" tslib "^2.0.0" -"@abp/ng.theme.basic@~5.3.0-rc.1": - version "5.3.0-rc.1" - resolved "https://registry.yarnpkg.com/@abp/ng.theme.basic/-/ng.theme.basic-5.3.0-rc.1.tgz#c60d7a8e4b461da50968bcf24ec1eca78e88c935" - integrity sha512-Igpxm+tH9pLjxBJBziOqDstBmfkbfNJhNLER9ekhSwCFm7LppWro8LVc15zrIg59JegP/W/Zbxia8FtDL3j1gA== +"@abp/ng.theme.basic@~5.3.0-rc.2": + version "5.3.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/ng.theme.basic/-/ng.theme.basic-5.3.0-rc.2.tgz#6adb81b5790179ead62e09c604ac689537d0adef" + integrity sha512-e4ZKI/br+BWsX7Lt7NJlN6p3gK/8ZgToEu6DAeVwCqkRFGO0w3yEPa97YE2ZsVV5m+4dmUZczR4VB3Q1xxMGLw== dependencies: - "@abp/ng.account.core" "~5.3.0-rc.1" - "@abp/ng.theme.shared" "~5.3.0-rc.1" + "@abp/ng.account.core" "~5.3.0-rc.2" + "@abp/ng.theme.shared" "~5.3.0-rc.2" tslib "^2.0.0" -"@abp/ng.theme.shared@~5.3.0-rc.1": - version "5.3.0-rc.1" - resolved "https://registry.yarnpkg.com/@abp/ng.theme.shared/-/ng.theme.shared-5.3.0-rc.1.tgz#c4e6ba2525d87316aaa2080b1b01d0bb08b35255" - integrity sha512-QsFy2/LMLlkC4CSATqF+ILZriRW/FPrUY4FUlSbqzus8d2LmDtZm9+qY10bGQu32mCkMiyD20YewCzZxDJCywA== +"@abp/ng.theme.shared@~5.3.0-rc.2": + version "5.3.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/ng.theme.shared/-/ng.theme.shared-5.3.0-rc.2.tgz#50eea0d1d6efb2e29af0eb611f243dc96293ea34" + integrity sha512-u69AruYkzYUfm7s0mB4AQD1RMfXCzwH8uM7yCuWjIR24ohXbYPXN+x+GQoJAs3/rfPY8yyhvcaBUbwc8UN8Y7A== dependencies: - "@abp/ng.core" "~5.3.0-rc.1" + "@abp/ng.core" "~5.3.0-rc.2" "@fortawesome/fontawesome-free" "^5.15.4" "@ng-bootstrap/ng-bootstrap" "~12.0.0-beta.4" "@ngx-validate/core" "^0.1.1" @@ -117,13 +117,6 @@ bootstrap "^5.1.1" tslib "^2.0.0" -"@abp/utils@~5.3.0-rc.1": - version "5.3.0-rc.1" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-5.3.0-rc.1.tgz#3fa758944e7325e7b3f528141e03bb71f8e04d24" - integrity sha512-/8BTYZomNMdy+RpYXWLp5dg0lRhmfiguciZEVWo4qRw1lCXm/JR+0842XT1XYE1dQ4orNNJ3/H86eRX8Ab6Yfg== - dependencies: - just-compare "^1.3.0" - "@abp/utils@~5.3.0-rc.2": version "5.3.0-rc.2" resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-5.3.0-rc.2.tgz#cbdf34bb32f99396c2a7f6dd2f0fa0b5239413bb" @@ -131,6 +124,13 @@ dependencies: just-compare "^1.3.0" +"@abp/utils@~5.3.0-rc.3": + version "5.3.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-5.3.0-rc.3.tgz#e91f10b18ac1e17af7f15c85257c24034cab2ba1" + integrity sha512-vMzsddCvI+M6Qd7Hns5KPUXqdFFboJwAOB9gvxj+MmjVNDCpFTo1hjq0H0zB6NHI8Ik+9sw44D0c7gkTdQQt7Q== + dependencies: + just-compare "^1.3.0" + "@ampproject/remapping@2.2.0", "@ampproject/remapping@^2.0.0", "@ampproject/remapping@^2.1.0": version "2.2.0" resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" diff --git a/npm/packs/anchor-js/package.json b/npm/packs/anchor-js/package.json index 3ed0a88f02..31d8ae7b9e 100644 --- a/npm/packs/anchor-js/package.json +++ b/npm/packs/anchor-js/package.json @@ -1,11 +1,11 @@ { - "version": "5.3.0-rc.2", + "version": "5.3.0-rc.3", "name": "@abp/anchor-js", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~5.3.0-rc.2", + "@abp/core": "~5.3.0-rc.3", "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 d19a262d47..ab1c7cd14b 100644 --- a/npm/packs/aspnetcore.components.server.basictheme/package.json +++ b/npm/packs/aspnetcore.components.server.basictheme/package.json @@ -1,11 +1,11 @@ { - "version": "5.3.0-rc.2", + "version": "5.3.0-rc.3", "name": "@abp/aspnetcore.components.server.basictheme", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/aspnetcore.components.server.theming": "~5.3.0-rc.2" + "@abp/aspnetcore.components.server.theming": "~5.3.0-rc.3" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/aspnetcore.components.server.theming/package.json b/npm/packs/aspnetcore.components.server.theming/package.json index bf6d6e22ed..58b72ddd39 100644 --- a/npm/packs/aspnetcore.components.server.theming/package.json +++ b/npm/packs/aspnetcore.components.server.theming/package.json @@ -1,12 +1,12 @@ { - "version": "5.3.0-rc.2", + "version": "5.3.0-rc.3", "name": "@abp/aspnetcore.components.server.theming", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/bootstrap": "~5.3.0-rc.2", - "@abp/font-awesome": "~5.3.0-rc.2" + "@abp/bootstrap": "~5.3.0-rc.3", + "@abp/font-awesome": "~5.3.0-rc.3" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/aspnetcore.mvc.ui.theme.basic/package.json b/npm/packs/aspnetcore.mvc.ui.theme.basic/package.json index 0df45ce1f3..8b5d3481bf 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": "5.3.0-rc.2", + "version": "5.3.0-rc.3", "name": "@abp/aspnetcore.mvc.ui.theme.basic", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.shared": "~5.3.0-rc.2" + "@abp/aspnetcore.mvc.ui.theme.shared": "~5.3.0-rc.3" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/aspnetcore.mvc.ui.theme.shared/package.json b/npm/packs/aspnetcore.mvc.ui.theme.shared/package.json index d9f4279e35..ea0c7b1f80 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": "5.3.0-rc.2", + "version": "5.3.0-rc.3", "name": "@abp/aspnetcore.mvc.ui.theme.shared", "repository": { "type": "git", @@ -10,20 +10,20 @@ "access": "public" }, "dependencies": { - "@abp/aspnetcore.mvc.ui": "~5.3.0-rc.2", - "@abp/bootstrap": "~5.3.0-rc.2", - "@abp/bootstrap-datepicker": "~5.3.0-rc.2", - "@abp/datatables.net-bs5": "~5.3.0-rc.2", - "@abp/font-awesome": "~5.3.0-rc.2", - "@abp/jquery-form": "~5.3.0-rc.2", - "@abp/jquery-validation-unobtrusive": "~5.3.0-rc.2", - "@abp/lodash": "~5.3.0-rc.2", - "@abp/luxon": "~5.3.0-rc.2", - "@abp/malihu-custom-scrollbar-plugin": "~5.3.0-rc.2", - "@abp/select2": "~5.3.0-rc.2", - "@abp/sweetalert2": "~5.3.0-rc.2", - "@abp/timeago": "~5.3.0-rc.2", - "@abp/toastr": "~5.3.0-rc.2" + "@abp/aspnetcore.mvc.ui": "~5.3.0-rc.3", + "@abp/bootstrap": "~5.3.0-rc.3", + "@abp/bootstrap-datepicker": "~5.3.0-rc.3", + "@abp/datatables.net-bs5": "~5.3.0-rc.3", + "@abp/font-awesome": "~5.3.0-rc.3", + "@abp/jquery-form": "~5.3.0-rc.3", + "@abp/jquery-validation-unobtrusive": "~5.3.0-rc.3", + "@abp/lodash": "~5.3.0-rc.3", + "@abp/luxon": "~5.3.0-rc.3", + "@abp/malihu-custom-scrollbar-plugin": "~5.3.0-rc.3", + "@abp/select2": "~5.3.0-rc.3", + "@abp/sweetalert2": "~5.3.0-rc.3", + "@abp/timeago": "~5.3.0-rc.3", + "@abp/toastr": "~5.3.0-rc.3" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/aspnetcore.mvc.ui/package-lock.json b/npm/packs/aspnetcore.mvc.ui/package-lock.json index 04582fc745..dbb85d8c4e 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": "5.3.0-rc.2", + "version": "5.3.0-rc.3", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/npm/packs/aspnetcore.mvc.ui/package.json b/npm/packs/aspnetcore.mvc.ui/package.json index b1d564a6a8..99f68059fe 100644 --- a/npm/packs/aspnetcore.mvc.ui/package.json +++ b/npm/packs/aspnetcore.mvc.ui/package.json @@ -1,5 +1,5 @@ { - "version": "5.3.0-rc.2", + "version": "5.3.0-rc.3", "name": "@abp/aspnetcore.mvc.ui", "repository": { "type": "git", diff --git a/npm/packs/blogging/package.json b/npm/packs/blogging/package.json index 7c91c01a0d..a4e1fbf07e 100644 --- a/npm/packs/blogging/package.json +++ b/npm/packs/blogging/package.json @@ -1,14 +1,14 @@ { - "version": "5.3.0-rc.2", + "version": "5.3.0-rc.3", "name": "@abp/blogging", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.shared": "~5.3.0-rc.2", - "@abp/owl.carousel": "~5.3.0-rc.2", - "@abp/prismjs": "~5.3.0-rc.2", - "@abp/tui-editor": "~5.3.0-rc.2" + "@abp/aspnetcore.mvc.ui.theme.shared": "~5.3.0-rc.3", + "@abp/owl.carousel": "~5.3.0-rc.3", + "@abp/prismjs": "~5.3.0-rc.3", + "@abp/tui-editor": "~5.3.0-rc.3" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/bootstrap-datepicker/package.json b/npm/packs/bootstrap-datepicker/package.json index 835229ff8b..d5029ec5f5 100644 --- a/npm/packs/bootstrap-datepicker/package.json +++ b/npm/packs/bootstrap-datepicker/package.json @@ -1,5 +1,5 @@ { - "version": "5.3.0-rc.2", + "version": "5.3.0-rc.3", "name": "@abp/bootstrap-datepicker", "repository": { "type": "git", diff --git a/npm/packs/bootstrap/package.json b/npm/packs/bootstrap/package.json index ad64c80a77..0dd24b6e2b 100644 --- a/npm/packs/bootstrap/package.json +++ b/npm/packs/bootstrap/package.json @@ -1,5 +1,5 @@ { - "version": "5.3.0-rc.2", + "version": "5.3.0-rc.3", "name": "@abp/bootstrap", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/core": "~5.3.0-rc.2", + "@abp/core": "~5.3.0-rc.3", "bootstrap": "^5.1.3" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/chart.js/package.json b/npm/packs/chart.js/package.json index 084df73b26..0300f199f9 100644 --- a/npm/packs/chart.js/package.json +++ b/npm/packs/chart.js/package.json @@ -1,5 +1,5 @@ { - "version": "5.3.0-rc.2", + "version": "5.3.0-rc.3", "name": "@abp/chart.js", "publishConfig": { "access": "public" diff --git a/npm/packs/clipboard/package.json b/npm/packs/clipboard/package.json index fae812fb57..28e049fead 100644 --- a/npm/packs/clipboard/package.json +++ b/npm/packs/clipboard/package.json @@ -1,11 +1,11 @@ { - "version": "5.3.0-rc.2", + "version": "5.3.0-rc.3", "name": "@abp/clipboard", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~5.3.0-rc.2", + "@abp/core": "~5.3.0-rc.3", "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 cc1668fba9..92e40de04e 100644 --- a/npm/packs/cms-kit.admin/package.json +++ b/npm/packs/cms-kit.admin/package.json @@ -1,15 +1,15 @@ { - "version": "5.3.0-rc.2", + "version": "5.3.0-rc.3", "name": "@abp/cms-kit.admin", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/codemirror": "~5.3.0-rc.2", - "@abp/jstree": "~5.3.0-rc.2", - "@abp/slugify": "~5.3.0-rc.2", - "@abp/tui-editor": "~5.3.0-rc.2", - "@abp/uppy": "~5.3.0-rc.2" + "@abp/codemirror": "~5.3.0-rc.3", + "@abp/jstree": "~5.3.0-rc.3", + "@abp/slugify": "~5.3.0-rc.3", + "@abp/tui-editor": "~5.3.0-rc.3", + "@abp/uppy": "~5.3.0-rc.3" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/cms-kit.public/package.json b/npm/packs/cms-kit.public/package.json index c4df11f103..2957d4d82f 100644 --- a/npm/packs/cms-kit.public/package.json +++ b/npm/packs/cms-kit.public/package.json @@ -1,12 +1,12 @@ { - "version": "5.3.0-rc.2", + "version": "5.3.0-rc.3", "name": "@abp/cms-kit.public", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/highlight.js": "~5.3.0-rc.2", - "@abp/star-rating-svg": "~5.3.0-rc.2" + "@abp/highlight.js": "~5.3.0-rc.3", + "@abp/star-rating-svg": "~5.3.0-rc.3" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/cms-kit/package.json b/npm/packs/cms-kit/package.json index 232f063a9f..1ef2b29501 100644 --- a/npm/packs/cms-kit/package.json +++ b/npm/packs/cms-kit/package.json @@ -1,12 +1,12 @@ { - "version": "5.3.0-rc.2", + "version": "5.3.0-rc.3", "name": "@abp/cms-kit", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/cms-kit.admin": "~5.3.0-rc.2", - "@abp/cms-kit.public": "~5.3.0-rc.2" + "@abp/cms-kit.admin": "~5.3.0-rc.3", + "@abp/cms-kit.public": "~5.3.0-rc.3" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/codemirror/package.json b/npm/packs/codemirror/package.json index 420723c2be..2620e13558 100644 --- a/npm/packs/codemirror/package.json +++ b/npm/packs/codemirror/package.json @@ -1,11 +1,11 @@ { - "version": "5.3.0-rc.2", + "version": "5.3.0-rc.3", "name": "@abp/codemirror", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~5.3.0-rc.2", + "@abp/core": "~5.3.0-rc.3", "codemirror": "^5.65.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/core/package.json b/npm/packs/core/package.json index 9bb001240d..f550c5b9d3 100644 --- a/npm/packs/core/package.json +++ b/npm/packs/core/package.json @@ -1,5 +1,5 @@ { - "version": "5.3.0-rc.2", + "version": "5.3.0-rc.3", "name": "@abp/core", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/utils": "~5.3.0-rc.2" + "@abp/utils": "~5.3.0-rc.3" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/cropperjs/package.json b/npm/packs/cropperjs/package.json index 55451153d2..6a0e798c17 100644 --- a/npm/packs/cropperjs/package.json +++ b/npm/packs/cropperjs/package.json @@ -1,11 +1,11 @@ { - "version": "5.3.0-rc.2", + "version": "5.3.0-rc.3", "name": "@abp/cropperjs", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~5.3.0-rc.2", + "@abp/core": "~5.3.0-rc.3", "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 18514d4983..caa51a40b7 100644 --- a/npm/packs/datatables.net-bs4/package.json +++ b/npm/packs/datatables.net-bs4/package.json @@ -1,5 +1,5 @@ { - "version": "5.3.0-rc.2", + "version": "5.3.0-rc.3", "name": "@abp/datatables.net-bs4", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/datatables.net": "~5.3.0-rc.2", + "@abp/datatables.net": "~5.3.0-rc.3", "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 a6bc0d1dcb..5f79e6e356 100644 --- a/npm/packs/datatables.net-bs5/package.json +++ b/npm/packs/datatables.net-bs5/package.json @@ -1,11 +1,11 @@ { - "version": "5.3.0-rc.2", + "version": "5.3.0-rc.3", "name": "@abp/datatables.net-bs5", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/datatables.net": "~5.3.0-rc.2", + "@abp/datatables.net": "~5.3.0-rc.3", "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 d936a92caf..5fa4277ca0 100644 --- a/npm/packs/datatables.net/package.json +++ b/npm/packs/datatables.net/package.json @@ -1,5 +1,5 @@ { - "version": "5.3.0-rc.2", + "version": "5.3.0-rc.3", "name": "@abp/datatables.net", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/jquery": "~5.3.0-rc.2", + "@abp/jquery": "~5.3.0-rc.3", "datatables.net": "^1.11.4" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/docs/package.json b/npm/packs/docs/package.json index ac23c779cb..ffba2667a6 100644 --- a/npm/packs/docs/package.json +++ b/npm/packs/docs/package.json @@ -1,15 +1,15 @@ { - "version": "5.3.0-rc.2", + "version": "5.3.0-rc.3", "name": "@abp/docs", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/anchor-js": "~5.3.0-rc.2", - "@abp/clipboard": "~5.3.0-rc.2", - "@abp/malihu-custom-scrollbar-plugin": "~5.3.0-rc.2", - "@abp/popper.js": "~5.3.0-rc.2", - "@abp/prismjs": "~5.3.0-rc.2" + "@abp/anchor-js": "~5.3.0-rc.3", + "@abp/clipboard": "~5.3.0-rc.3", + "@abp/malihu-custom-scrollbar-plugin": "~5.3.0-rc.3", + "@abp/popper.js": "~5.3.0-rc.3", + "@abp/prismjs": "~5.3.0-rc.3" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/flag-icon-css/package.json b/npm/packs/flag-icon-css/package.json index eeb64b7474..458d29de04 100644 --- a/npm/packs/flag-icon-css/package.json +++ b/npm/packs/flag-icon-css/package.json @@ -1,5 +1,5 @@ { - "version": "5.3.0-rc.2", + "version": "5.3.0-rc.3", "name": "@abp/flag-icon-css", "publishConfig": { "access": "public" diff --git a/npm/packs/font-awesome/package.json b/npm/packs/font-awesome/package.json index f4aa0c745e..bb9f6b299f 100644 --- a/npm/packs/font-awesome/package.json +++ b/npm/packs/font-awesome/package.json @@ -1,5 +1,5 @@ { - "version": "5.3.0-rc.2", + "version": "5.3.0-rc.3", "name": "@abp/font-awesome", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/core": "~5.3.0-rc.2", + "@abp/core": "~5.3.0-rc.3", "@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 fd1e10e579..bae5beaaf4 100644 --- a/npm/packs/highlight.js/package.json +++ b/npm/packs/highlight.js/package.json @@ -1,11 +1,11 @@ { - "version": "5.3.0-rc.2", + "version": "5.3.0-rc.3", "name": "@abp/highlight.js", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~5.3.0-rc.2", + "@abp/core": "~5.3.0-rc.3", "@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 c85000c281..f283eb8b5a 100644 --- a/npm/packs/jquery-form/package.json +++ b/npm/packs/jquery-form/package.json @@ -1,5 +1,5 @@ { - "version": "5.3.0-rc.2", + "version": "5.3.0-rc.3", "name": "@abp/jquery-form", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/jquery": "~5.3.0-rc.2", + "@abp/jquery": "~5.3.0-rc.3", "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 d3f387d85e..7007f2194a 100644 --- a/npm/packs/jquery-validation-unobtrusive/package.json +++ b/npm/packs/jquery-validation-unobtrusive/package.json @@ -1,5 +1,5 @@ { - "version": "5.3.0-rc.2", + "version": "5.3.0-rc.3", "name": "@abp/jquery-validation-unobtrusive", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/jquery-validation": "~5.3.0-rc.2", + "@abp/jquery-validation": "~5.3.0-rc.3", "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 a6ef81298b..75b92e9605 100644 --- a/npm/packs/jquery-validation/package.json +++ b/npm/packs/jquery-validation/package.json @@ -1,5 +1,5 @@ { - "version": "5.3.0-rc.2", + "version": "5.3.0-rc.3", "name": "@abp/jquery-validation", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/jquery": "~5.3.0-rc.2", + "@abp/jquery": "~5.3.0-rc.3", "jquery-validation": "^1.19.3" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/jquery/package.json b/npm/packs/jquery/package.json index dde71cd7bb..f2c949506f 100644 --- a/npm/packs/jquery/package.json +++ b/npm/packs/jquery/package.json @@ -1,5 +1,5 @@ { - "version": "5.3.0-rc.2", + "version": "5.3.0-rc.3", "name": "@abp/jquery", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/core": "~5.3.0-rc.2", + "@abp/core": "~5.3.0-rc.3", "jquery": "~3.6.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/jstree/package.json b/npm/packs/jstree/package.json index b2868122b1..23585e136c 100644 --- a/npm/packs/jstree/package.json +++ b/npm/packs/jstree/package.json @@ -1,11 +1,11 @@ { - "version": "5.3.0-rc.2", + "version": "5.3.0-rc.3", "name": "@abp/jstree", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/jquery": "~5.3.0-rc.2", + "@abp/jquery": "~5.3.0-rc.3", "jstree": "^3.3.12" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/lodash/package.json b/npm/packs/lodash/package.json index 32cb462a2b..ffd80148ac 100644 --- a/npm/packs/lodash/package.json +++ b/npm/packs/lodash/package.json @@ -1,5 +1,5 @@ { - "version": "5.3.0-rc.2", + "version": "5.3.0-rc.3", "name": "@abp/lodash", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/core": "~5.3.0-rc.2", + "@abp/core": "~5.3.0-rc.3", "lodash": "^4.17.21" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/luxon/package.json b/npm/packs/luxon/package.json index 63cf6710db..d3349cce1c 100644 --- a/npm/packs/luxon/package.json +++ b/npm/packs/luxon/package.json @@ -1,5 +1,5 @@ { - "version": "5.3.0-rc.2", + "version": "5.3.0-rc.3", "name": "@abp/luxon", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/core": "~5.3.0-rc.2", + "@abp/core": "~5.3.0-rc.3", "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 8ab4cff524..bd8ee451fb 100644 --- a/npm/packs/malihu-custom-scrollbar-plugin/package.json +++ b/npm/packs/malihu-custom-scrollbar-plugin/package.json @@ -1,5 +1,5 @@ { - "version": "5.3.0-rc.2", + "version": "5.3.0-rc.3", "name": "@abp/malihu-custom-scrollbar-plugin", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/core": "~5.3.0-rc.2", + "@abp/core": "~5.3.0-rc.3", "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 e022c54ff9..a57f9aada0 100644 --- a/npm/packs/markdown-it/package.json +++ b/npm/packs/markdown-it/package.json @@ -1,11 +1,11 @@ { - "version": "5.3.0-rc.2", + "version": "5.3.0-rc.3", "name": "@abp/markdown-it", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~5.3.0-rc.2", + "@abp/core": "~5.3.0-rc.3", "markdown-it": "^12.3.2" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/owl.carousel/package.json b/npm/packs/owl.carousel/package.json index 364760d2c4..8a3bd6f564 100644 --- a/npm/packs/owl.carousel/package.json +++ b/npm/packs/owl.carousel/package.json @@ -1,11 +1,11 @@ { - "version": "5.3.0-rc.2", + "version": "5.3.0-rc.3", "name": "@abp/owl.carousel", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~5.3.0-rc.2", + "@abp/core": "~5.3.0-rc.3", "owl.carousel": "^2.3.4" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/popper.js/package.json b/npm/packs/popper.js/package.json index b4edbe1cda..2ca1fb76e6 100644 --- a/npm/packs/popper.js/package.json +++ b/npm/packs/popper.js/package.json @@ -1,11 +1,11 @@ { - "version": "5.3.0-rc.2", + "version": "5.3.0-rc.3", "name": "@abp/popper.js", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~5.3.0-rc.2", + "@abp/core": "~5.3.0-rc.3", "@popperjs/core": "^2.11.2" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/prismjs/package.json b/npm/packs/prismjs/package.json index 6fefc56c8e..0354198fc5 100644 --- a/npm/packs/prismjs/package.json +++ b/npm/packs/prismjs/package.json @@ -1,12 +1,12 @@ { - "version": "5.3.0-rc.2", + "version": "5.3.0-rc.3", "name": "@abp/prismjs", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/clipboard": "~5.3.0-rc.2", - "@abp/core": "~5.3.0-rc.2", + "@abp/clipboard": "~5.3.0-rc.3", + "@abp/core": "~5.3.0-rc.3", "prismjs": "^1.26.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/select2/package.json b/npm/packs/select2/package.json index e14f206669..f1a3e0282e 100644 --- a/npm/packs/select2/package.json +++ b/npm/packs/select2/package.json @@ -1,5 +1,5 @@ { - "version": "5.3.0-rc.2", + "version": "5.3.0-rc.3", "name": "@abp/select2", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/core": "~5.3.0-rc.2", + "@abp/core": "~5.3.0-rc.3", "select2": "^4.0.13" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/signalr/package.json b/npm/packs/signalr/package.json index 503dd4ac3b..2a38fd737b 100644 --- a/npm/packs/signalr/package.json +++ b/npm/packs/signalr/package.json @@ -1,11 +1,11 @@ { - "version": "5.3.0-rc.2", + "version": "5.3.0-rc.3", "name": "@abp/signalr", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~5.3.0-rc.2", + "@abp/core": "~5.3.0-rc.3", "@microsoft/signalr": "~6.0.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/slugify/package.json b/npm/packs/slugify/package.json index 77276e3c11..ce758ca0d5 100644 --- a/npm/packs/slugify/package.json +++ b/npm/packs/slugify/package.json @@ -1,5 +1,5 @@ { - "version": "5.3.0-rc.2", + "version": "5.3.0-rc.3", "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 7bdb8406ad..e9341a0804 100644 --- a/npm/packs/star-rating-svg/package.json +++ b/npm/packs/star-rating-svg/package.json @@ -1,11 +1,11 @@ { - "version": "5.3.0-rc.2", + "version": "5.3.0-rc.3", "name": "@abp/star-rating-svg", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/jquery": "~5.3.0-rc.2", + "@abp/jquery": "~5.3.0-rc.3", "star-rating-svg": "^3.5.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/sweetalert2/package.json b/npm/packs/sweetalert2/package.json index 5ad16cb5ac..55f339b6ba 100644 --- a/npm/packs/sweetalert2/package.json +++ b/npm/packs/sweetalert2/package.json @@ -1,5 +1,5 @@ { - "version": "5.3.0-rc.2", + "version": "5.3.0-rc.3", "name": "@abp/sweetalert2", "publishConfig": { "access": "public" @@ -10,7 +10,7 @@ "directory": "npm/packs/sweetalert2" }, "dependencies": { - "@abp/core": "~5.3.0-rc.2", + "@abp/core": "~5.3.0-rc.3", "sweetalert2": "^11.3.6" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/timeago/package.json b/npm/packs/timeago/package.json index 056d0f06f3..2dac9b749d 100644 --- a/npm/packs/timeago/package.json +++ b/npm/packs/timeago/package.json @@ -1,5 +1,5 @@ { - "version": "5.3.0-rc.2", + "version": "5.3.0-rc.3", "name": "@abp/timeago", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/jquery": "~5.3.0-rc.2", + "@abp/jquery": "~5.3.0-rc.3", "timeago": "^1.6.7" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/toastr/package.json b/npm/packs/toastr/package.json index ebf8124247..96b6cf5e91 100644 --- a/npm/packs/toastr/package.json +++ b/npm/packs/toastr/package.json @@ -1,5 +1,5 @@ { - "version": "5.3.0-rc.2", + "version": "5.3.0-rc.3", "name": "@abp/toastr", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/jquery": "~5.3.0-rc.2", + "@abp/jquery": "~5.3.0-rc.3", "toastr": "^2.1.4" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/tui-editor/package.json b/npm/packs/tui-editor/package.json index e56820a7d8..574159036a 100644 --- a/npm/packs/tui-editor/package.json +++ b/npm/packs/tui-editor/package.json @@ -1,12 +1,12 @@ { - "version": "5.3.0-rc.2", + "version": "5.3.0-rc.3", "name": "@abp/tui-editor", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/jquery": "~5.3.0-rc.2", - "@abp/prismjs": "~5.3.0-rc.2" + "@abp/jquery": "~5.3.0-rc.3", + "@abp/prismjs": "~5.3.0-rc.3" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/uppy/package.json b/npm/packs/uppy/package.json index 99af0cdfc6..9d68a66546 100644 --- a/npm/packs/uppy/package.json +++ b/npm/packs/uppy/package.json @@ -1,11 +1,11 @@ { - "version": "5.3.0-rc.2", + "version": "5.3.0-rc.3", "name": "@abp/uppy", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~5.3.0-rc.2", + "@abp/core": "~5.3.0-rc.3", "uppy": "^1.16.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/utils/package.json b/npm/packs/utils/package.json index 25fa739215..d4422d4d92 100644 --- a/npm/packs/utils/package.json +++ b/npm/packs/utils/package.json @@ -1,6 +1,6 @@ { "name": "@abp/utils", - "version": "5.3.0-rc.2", + "version": "5.3.0-rc.3", "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 88f198dd2b..94082a3b36 100644 --- a/npm/packs/vee-validate/package.json +++ b/npm/packs/vee-validate/package.json @@ -1,11 +1,11 @@ { - "version": "5.3.0-rc.2", + "version": "5.3.0-rc.3", "name": "@abp/vee-validate", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/vue": "~5.3.0-rc.2", + "@abp/vue": "~5.3.0-rc.3", "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 dd8d5fa51f..d02225c254 100644 --- a/npm/packs/virtual-file-explorer/package.json +++ b/npm/packs/virtual-file-explorer/package.json @@ -1,12 +1,12 @@ { - "version": "5.3.0-rc.2", + "version": "5.3.0-rc.3", "name": "@abp/virtual-file-explorer", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/clipboard": "~5.3.0-rc.2", - "@abp/prismjs": "~5.3.0-rc.2" + "@abp/clipboard": "~5.3.0-rc.3", + "@abp/prismjs": "~5.3.0-rc.3" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/vue/package.json b/npm/packs/vue/package.json index 265414cf95..dd265377b1 100644 --- a/npm/packs/vue/package.json +++ b/npm/packs/vue/package.json @@ -1,5 +1,5 @@ { - "version": "5.3.0-rc.2", + "version": "5.3.0-rc.3", "name": "@abp/vue", "publishConfig": { "access": "public" diff --git a/templates/app-nolayers/angular/package.json b/templates/app-nolayers/angular/package.json index 30ca284adb..1a77240bda 100644 --- a/templates/app-nolayers/angular/package.json +++ b/templates/app-nolayers/angular/package.json @@ -12,14 +12,14 @@ }, "private": true, "dependencies": { - "@abp/ng.account": "~5.3.0-rc.2", - "@abp/ng.components": "~5.3.0-rc.2", - "@abp/ng.core": "~5.3.0-rc.2", - "@abp/ng.identity": "~5.3.0-rc.2", - "@abp/ng.setting-management": "~5.3.0-rc.2", - "@abp/ng.tenant-management": "~5.3.0-rc.2", - "@abp/ng.theme.basic": "~5.3.0-rc.2", - "@abp/ng.theme.shared": "~5.3.0-rc.2", + "@abp/ng.account": "~5.3.0-rc.3", + "@abp/ng.components": "~5.3.0-rc.3", + "@abp/ng.core": "~5.3.0-rc.3", + "@abp/ng.identity": "~5.3.0-rc.3", + "@abp/ng.setting-management": "~5.3.0-rc.3", + "@abp/ng.tenant-management": "~5.3.0-rc.3", + "@abp/ng.theme.basic": "~5.3.0-rc.3", + "@abp/ng.theme.shared": "~5.3.0-rc.3", "@angular/animations": "~13.1.1", "@angular/common": "~13.1.1", "@angular/compiler": "~13.1.1", @@ -34,7 +34,7 @@ "zone.js": "~0.11.4" }, "devDependencies": { - "@abp/ng.schematics": "~5.3.0-rc.2", + "@abp/ng.schematics": "~5.3.0-rc.3", "@angular-devkit/build-angular": "~13.1.2", "@angular-eslint/builder": "~13.0.1", "@angular-eslint/eslint-plugin": "~13.0.1", 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 49176baf14..4e18681ce6 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.mvc.ui.theme.basic": "^5.3.0-rc.2", - "@abp/aspnetcore.components.server.basictheme": "^5.3.0-rc.2" + "@abp/aspnetcore.mvc.ui.theme.basic": "^5.3.0-rc.3", + "@abp/aspnetcore.components.server.basictheme": "^5.3.0-rc.3" } } 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 49176baf14..4e18681ce6 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.basic": "^5.3.0-rc.2", - "@abp/aspnetcore.components.server.basictheme": "^5.3.0-rc.2" + "@abp/aspnetcore.mvc.ui.theme.basic": "^5.3.0-rc.3", + "@abp/aspnetcore.components.server.basictheme": "^5.3.0-rc.3" } } 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 02c80e93f1..c2c482a664 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.basic": "^5.3.0-rc.2" + "@abp/aspnetcore.mvc.ui.theme.basic": "^5.3.0-rc.3" } } 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 02c80e93f1..c2c482a664 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.basic": "^5.3.0-rc.2" + "@abp/aspnetcore.mvc.ui.theme.basic": "^5.3.0-rc.3" } } 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 6f6bdf156d..275f57d06b 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.basic": "~5.3.0-rc.2" + "@abp/aspnetcore.mvc.ui.theme.basic": "~5.3.0-rc.3" } } 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 6f6bdf156d..275f57d06b 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.basic": "~5.3.0-rc.2" + "@abp/aspnetcore.mvc.ui.theme.basic": "~5.3.0-rc.3" } } diff --git a/templates/app/angular/package.json b/templates/app/angular/package.json index da804c260e..5330a04e5a 100644 --- a/templates/app/angular/package.json +++ b/templates/app/angular/package.json @@ -12,14 +12,14 @@ }, "private": true, "dependencies": { - "@abp/ng.account": "~5.3.0-rc.2", - "@abp/ng.components": "~5.3.0-rc.2", - "@abp/ng.core": "~5.3.0-rc.2", - "@abp/ng.identity": "~5.3.0-rc.2", - "@abp/ng.setting-management": "~5.3.0-rc.2", - "@abp/ng.tenant-management": "~5.3.0-rc.2", - "@abp/ng.theme.basic": "~5.3.0-rc.2", - "@abp/ng.theme.shared": "~5.3.0-rc.2", + "@abp/ng.account": "~5.3.0-rc.3", + "@abp/ng.components": "~5.3.0-rc.3", + "@abp/ng.core": "~5.3.0-rc.3", + "@abp/ng.identity": "~5.3.0-rc.3", + "@abp/ng.setting-management": "~5.3.0-rc.3", + "@abp/ng.tenant-management": "~5.3.0-rc.3", + "@abp/ng.theme.basic": "~5.3.0-rc.3", + "@abp/ng.theme.shared": "~5.3.0-rc.3", "@angular/animations": "~13.3.3", "@angular/common": "~13.3.3", "@angular/compiler": "~13.3.3", @@ -34,7 +34,7 @@ "zone.js": "~0.11.4" }, "devDependencies": { - "@abp/ng.schematics": "~5.3.0-rc.2", + "@abp/ng.schematics": "~5.3.0-rc.3", "@angular-devkit/build-angular": "~13.3.3", "@angular-eslint/builder": "~13.2.1", "@angular-eslint/eslint-plugin": "~13.2.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 49176baf14..4e18681ce6 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.basic": "^5.3.0-rc.2", - "@abp/aspnetcore.components.server.basictheme": "^5.3.0-rc.2" + "@abp/aspnetcore.mvc.ui.theme.basic": "^5.3.0-rc.3", + "@abp/aspnetcore.components.server.basictheme": "^5.3.0-rc.3" } } 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 49176baf14..4e18681ce6 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.basic": "^5.3.0-rc.2", - "@abp/aspnetcore.components.server.basictheme": "^5.3.0-rc.2" + "@abp/aspnetcore.mvc.ui.theme.basic": "^5.3.0-rc.3", + "@abp/aspnetcore.components.server.basictheme": "^5.3.0-rc.3" } } 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 02c80e93f1..c2c482a664 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.basic": "^5.3.0-rc.2" + "@abp/aspnetcore.mvc.ui.theme.basic": "^5.3.0-rc.3" } } diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/package.json b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/package.json index 70cd3a52eb..bc46bd777c 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/package.json +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/package.json @@ -3,6 +3,6 @@ "name": "my-app-identityserver", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "^5.3.0-rc.2" + "@abp/aspnetcore.mvc.ui.theme.basic": "^5.3.0-rc.3" } } 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 02c80e93f1..c2c482a664 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.basic": "^5.3.0-rc.2" + "@abp/aspnetcore.mvc.ui.theme.basic": "^5.3.0-rc.3" } } 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 02c80e93f1..c2c482a664 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.basic": "^5.3.0-rc.2" + "@abp/aspnetcore.mvc.ui.theme.basic": "^5.3.0-rc.3" } } diff --git a/templates/module/angular/package.json b/templates/module/angular/package.json index f05c8b9514..ae2b939cb0 100644 --- a/templates/module/angular/package.json +++ b/templates/module/angular/package.json @@ -15,14 +15,14 @@ }, "private": true, "dependencies": { - "@abp/ng.account": "~5.3.0-rc.2", - "@abp/ng.components": "~5.3.0-rc.2", - "@abp/ng.core": "~5.3.0-rc.2", - "@abp/ng.identity": "~5.3.0-rc.2", - "@abp/ng.setting-management": "~5.3.0-rc.2", - "@abp/ng.tenant-management": "~5.3.0-rc.2", - "@abp/ng.theme.basic": "~5.3.0-rc.2", - "@abp/ng.theme.shared": "~5.3.0-rc.2", + "@abp/ng.account": "~5.3.0-rc.3", + "@abp/ng.components": "~5.3.0-rc.3", + "@abp/ng.core": "~5.3.0-rc.3", + "@abp/ng.identity": "~5.3.0-rc.3", + "@abp/ng.setting-management": "~5.3.0-rc.3", + "@abp/ng.tenant-management": "~5.3.0-rc.3", + "@abp/ng.theme.basic": "~5.3.0-rc.3", + "@abp/ng.theme.shared": "~5.3.0-rc.3", "@angular/animations": "~13.3.3", "@angular/common": "~13.3.3", "@angular/compiler": "~13.3.3", @@ -37,7 +37,7 @@ "zone.js": "~0.11.4" }, "devDependencies": { - "@abp/ng.schematics": "~5.3.0-rc.2", + "@abp/ng.schematics": "~5.3.0-rc.3", "@angular-devkit/build-angular": "~13.3.3", "@angular-eslint/builder": "~13.2.1", "@angular-eslint/eslint-plugin": "~13.2.1", diff --git a/templates/module/angular/projects/my-project-name/package.json b/templates/module/angular/projects/my-project-name/package.json index ca3c1b07be..cfd3740aac 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": ">=9", "@angular/core": ">=9", - "@abp/ng.core": ">=5.3.0-rc.2", - "@abp/ng.theme.shared": ">=5.3.0-rc.2" + "@abp/ng.core": ">=5.3.0-rc.3", + "@abp/ng.theme.shared": ">=5.3.0-rc.3" }, "dependencies": { "tslib": "^2.1.0" 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 49176baf14..4e18681ce6 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": "^5.3.0-rc.2", - "@abp/aspnetcore.components.server.basictheme": "^5.3.0-rc.2" + "@abp/aspnetcore.mvc.ui.theme.basic": "^5.3.0-rc.3", + "@abp/aspnetcore.components.server.basictheme": "^5.3.0-rc.3" } } diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/package.json b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/package.json index 70cd3a52eb..bc46bd777c 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/package.json +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/package.json @@ -3,6 +3,6 @@ "name": "my-app-identityserver", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "^5.3.0-rc.2" + "@abp/aspnetcore.mvc.ui.theme.basic": "^5.3.0-rc.3" } } 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 02c80e93f1..c2c482a664 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": "^5.3.0-rc.2" + "@abp/aspnetcore.mvc.ui.theme.basic": "^5.3.0-rc.3" } } 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 02c80e93f1..c2c482a664 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": "^5.3.0-rc.2" + "@abp/aspnetcore.mvc.ui.theme.basic": "^5.3.0-rc.3" } } From e04cefe5d46d28e52fabe4f539e5f6f9e521a33d Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Wed, 1 Jun 2022 15:43:13 +0800 Subject: [PATCH 46/59] Fix Tree in RTL problem --- .../FeatureManagement/FeatureManagementModal.cshtml | 12 ++++++------ .../PermissionManagementModal.cshtml | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/FeatureManagementModal.cshtml b/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/FeatureManagementModal.cshtml index d537b099c4..868211adcf 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/FeatureManagementModal.cshtml +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/FeatureManagementModal.cshtml @@ -55,10 +55,10 @@ disabled="@disabled" group-data-feature-name="@feature.Name" group-data-parent-name="@(feature.ParentName ?? "")" - group-style="margin-left: @(feature.Depth * 20)px"/> + group-style="margin-inline-start: @(feature.Depth * 20)px"/> @if (feature.Description != null) { -
    @feature.Description
    +
    @feature.Description
    } } @@ -78,16 +78,16 @@ type="@type" group-data-feature-name="@feature.Name" group-data-parent-name="@(feature.ParentName ?? "")" - group-style="margin-left: @(feature.Depth * 25)px"/> + group-style="margin-inline-start: @(feature.Depth * 25)px"/> @if (feature.Description != null) { -
    @feature.Description
    +
    @feature.Description
    } } @if (feature.ValueType is SelectionStringValueType selectType) { -
    +
    @if (feature.Description != null) { -
    @feature.Description
    +
    @feature.Description
    }
    } diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Web/Pages/AbpPermissionManagement/PermissionManagementModal.cshtml b/modules/permission-management/src/Volo.Abp.PermissionManagement.Web/Pages/AbpPermissionManagement/PermissionManagementModal.cshtml index 31639bf136..25fa692a32 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Web/Pages/AbpPermissionManagement/PermissionManagementModal.cshtml +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Web/Pages/AbpPermissionManagement/PermissionManagementModal.cshtml @@ -43,7 +43,7 @@ disabled="@permission.IsDisabled(Model.ProviderName)" group-data-permission-name="@permission.Name" group-data-parent-name="@(permission.ParentName ?? "")" - group-style="margin-left: @(permission.Depth * 20)px"/> + group-style="margin-inline-start: @(permission.Depth * 20)px"/> }
    From 249afe95f1f5a0387750b735ccbc41c1b6a6ac7a Mon Sep 17 00:00:00 2001 From: Enis Necipoglu Date: Wed, 1 Jun 2022 12:06:38 +0300 Subject: [PATCH 47/59] Add MenuItemName to PageLayout for blazor --- .../Layout/PageLayout.cs | 24 +++++++++++++++---- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Layout/PageLayout.cs b/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Layout/PageLayout.cs index 618445bd83..3edbb9dc45 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Layout/PageLayout.cs +++ b/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Layout/PageLayout.cs @@ -1,5 +1,6 @@ using System.Collections.ObjectModel; using System.ComponentModel; +using System.Runtime.CompilerServices; using Volo.Abp.AspNetCore.Components.Web.Theming.PageToolbars; using Volo.Abp.BlazoriseUI; using Volo.Abp.DependencyInjection; @@ -11,19 +12,32 @@ public class PageLayout : IScopedDependency, INotifyPropertyChanged private string title; // TODO: Consider using this property for setting Page Title too. - public virtual string Title - { + public virtual string Title { get => title; - set - { + set { title = value; - PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Title))); + OnPropertyChanged(); } } + private string menuItemName; + + public string MenuItemName { + get => menuItemName; + set { + menuItemName = value; + OnPropertyChanged(); + } + } + public virtual ObservableCollection BreadcrumbItems { get; set; } = new(); public virtual ObservableCollection ToolbarItems { get; set; } = new(); public event PropertyChangedEventHandler PropertyChanged; + + protected void OnPropertyChanged([CallerMemberName]string propertyName = null) + { + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); + } } \ No newline at end of file From 1a6c44d3abe2a9165b598ed0aa68d780c6f680b5 Mon Sep 17 00:00:00 2001 From: Enis Necipoglu Date: Wed, 1 Jun 2022 12:18:11 +0300 Subject: [PATCH 48/59] Update PageLayout documentation for MenuItemName --- docs/en/UI/Blazor/Page-Layout.md | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/docs/en/UI/Blazor/Page-Layout.md b/docs/en/UI/Blazor/Page-Layout.md index 61d91d66af..49ed1659f4 100644 --- a/docs/en/UI/Blazor/Page-Layout.md +++ b/docs/en/UI/Blazor/Page-Layout.md @@ -13,6 +13,37 @@ Title is used to render page title in the PageHeader. } ``` +## MenuItemName +Indicates current selected menu item name. Menu item name should match a unique menu item name defined using the [Navigation / Menu system](../Blazor/Navigation-Menu.md). In this case, it is expected from the theme to make the menu item "active" in the main menu. + +```csharp +@inject PageLayout PageLayout + +@code { + protected override async Task OnInitializedAsync() + { + PageLayout.MenuItemName = "MyProjectName.Products"; + } +} +``` + +Menu item name can be set on runtime too. + +```html +@inject PageLayout PageLayout + + + +@code{ + protected void SetCategoriesMenuAsSelected() + { + PageLayout.MenuItemName = "MyProjectName.Categories"; + } +} +``` + +> Be aware, The [Basic Theme](../Blazor/Basic-Theme.md) currently doesn't support the selected menu item since it is not applicable to the top menu. + ## BreadCrumbs BreadCrumbItems are used to render breadcrumbs in the PageHeader. ```csharp From 6b9c9461011080bca160a33e4bb814a9a5327be0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Wed, 1 Jun 2022 15:12:56 +0300 Subject: [PATCH 49/59] Revisited the Application-Single-Layer document --- docs/en/CLI.md | 2 +- .../Application-Single-Layer.md | 47 ++++++++++--------- 2 files changed, 25 insertions(+), 24 deletions(-) diff --git a/docs/en/CLI.md b/docs/en/CLI.md index 330967ff98..0597c0daf5 100644 --- a/docs/en/CLI.md +++ b/docs/en/CLI.md @@ -109,7 +109,7 @@ For more samples, go to [ABP CLI Create Solution Samples](CLI-New-Command-Sample * **`module`**: [Module template](Startup-Templates/Module.md). Additional options: * `--no-ui`: Specifies to not include the UI. This makes possible to create service-only modules (a.k.a. microservices - without UI). * **`console`**: [Console template](Startup-Templates/Console.md). - * **`app-nolayers`**: Application single layer template. + * **`app-nolayers`**: [Single-layer application template](Startup-Templates/Application-Single-Layer.md). Additional options: * `--ui` or `-u`: Specifies the UI framework. Default framework is `mvc`. Available frameworks: * `mvc`: ASP.NET Core MVC. * `angular`: Angular UI. diff --git a/docs/en/Startup-Templates/Application-Single-Layer.md b/docs/en/Startup-Templates/Application-Single-Layer.md index ce194d7585..95ebad55a7 100644 --- a/docs/en/Startup-Templates/Application-Single-Layer.md +++ b/docs/en/Startup-Templates/Application-Single-Layer.md @@ -2,19 +2,15 @@ ## Introduction -This template provides a single-layered application for a quick start with ABP Framework. +This template provides a simple solution structure with a single project. This document explains that solution structure in details. -This document explains the **solution structure** and project in detail. +### The Difference Between the Application Startup Templates -### What is the Difference Between the Application Startup Templates? - -ABP's [Application Startup Template](Application.md) provides a well-organized and layered solution to create maintainable business applications based on the [Domain Driven Design](../Domain-Driven-Design.md) (DDD) practices. However, some developers find this template a little bit complex (or unnecessary) for simple and short-time applications. - -At this point, a single-layer application template has been created for such applications. This template has the same functionality, features and modules on runtime with the [Application Startup Template](Application.md) but the development model is minimal and everything is in a single project (`.csproj`). +ABP's [Application Startup Template](Application.md) provides a well-organized and layered solution to create maintainable business applications based on the [Domain Driven Design](../Domain-Driven-Design.md) (DDD) practices. However, some developers find this template a little bit complex for simple and short-term applications. The single-layer application template has been created to provide a simpler development model for such applications. This template has the same functionality, features and modules on runtime with the [Application Startup Template](Application.md) but the development model is minimal and everything is in a single project (`.csproj`). ## How to Start with It? -You can use the [ABP CLI](../CLI.md) to create a new project using this startup template. Alternatively, you can directly create & download this startup template from the [Get Started](https://abp.io/get-started) page. How to download via CLI is explained in this section. +You can use the [ABP CLI](../CLI.md) to create a new project using this startup template. Alternatively, you can directly create & download this startup template from the [Get Started](https://abp.io/get-started) page. In this section, we will use the ABP CLI. Firstly, install the ABP CLI if you haven't installed it before: @@ -29,8 +25,8 @@ abp new Acme.BookStore -t app-nolayers ``` * `Acme.BookStore` is the solution name, like *YourCompany.YourProduct*. You can use single-level, two-level or three-level naming. -* In this example, the `-t` option (or `--template` option) specifies the template name. - +* In this example, the `-t` (or `--template`) option specifies the template name. + ### Specify the UI Framework This template provides multiple UI frameworks: @@ -38,17 +34,17 @@ This template provides multiple UI frameworks: * `mvc`: ASP.NET Core MVC UI with Razor Pages (default) * `blazor-server`: Blazor Server UI * `angular`: Angular UI -* `none`: Without UI +* `none`: Without UI (for HTTP API development) -> Currently, this template doesn't have Blazor WASM UI, because it requires 3 projects at least (server-side, UI and shared library between these two projects). +> This template doesn't have Blazor WebAssembly UI, because it requires 3 projects at least (server-side, UI and shared library between these two projects). We are recommending to use the layered [application startup template](Application.md) for Blazor WebAssembly projects. -Use the `-u` or `--ui` option to specify the UI framework while creating the solution: +Use the `-u` (or `--ui`) option to specify the UI framework while creating the solution: ```bash abp new Acme.BookStore -t app-nolayers -u angular ``` -* This example specifies the UI type (`-u` option) as `angular`, you can also specify `mvc` or `blazor-server` for UI type. +This example specifies the UI type (the `-u` option) as `angular`. You can also specify `mvc`, `blazor-server` or `none` for the UI type. ### Specify the Database Provider @@ -69,37 +65,42 @@ If you don't specify any additional options while creating an `app-nolayers` tem ![](../images/bookstore-single-layer-solution-structure.png) -It's a single-layer template rather than a layered-architecture solution (like the `Application Startup Template`). It's helpful to create a running application quickly without considering the layered architecture. +In the next sections, we will explain the structure based on this example. Your startup solution can be slightly different based on your preferences. ### Folder Structure -Since this template provides a single-layer solution, we've separated concerns into folders instead of layers and you can see the pre-defined folders as shown below: +Since this template provides a single-project solution, we've separated concerns into folders instead of projects. You can see the pre-defined folders as shown below: ![](../images/single-layer-folder-structure.png) -* You can define your `entities`, `application services`, `DTOs`, etc. in this single project (in the related folders). -* For example, you can define your `application services` and `DTOs` under the **Services** folder. +* Define your database mappings (for [EF Core](../Entity-Framework-Core.md) or [MongoDB](../MongoDB.md)) and [repositories](../Repositories.md) in the `Data` folder. +* Define your [entities](../Entities.md) in the `Entities` folder. +* Define your UI localization keys/values in the `Localization` folder. +* Define your UI menu items in the `Menus` folder. +* Define your [object-to-object mapping](../Object-To-Object-Mapping.md) classes in the `ObjectMapping` folder. +* Define your UI pages (Razor Pages) in the `Pages` folder (create `Controllers` and `Views` folder yourself if you prefer the MVC pattern). +* Define your [application services](../Application-Services.md) in the `Services` folder. ### How to Run? -Before running the application, you need to create the database and seed the initial data. To do that, you can run the following command in the directory of your project: +Before running the application, you need to create the database and seed the initial data. To do that, you can run the following command in the directory of your project (in the same folder of the `.csproj` file): ```bash dotnet run --migrate-database ``` -* This command will create the database and seed the initial data for you. Then you can run the application with any IDE that supports .NET or by running the `dotnet run` CLI command in the directory of your project. The default username is `admin` and the password is `1q2w3E*`. +This command will create the database and seed the initial data for you. Then you can run the application with any IDE that supports .NET or by running the `dotnet run` command in the directory of your project. The default username is `admin` and the password is `1q2w3E*`. -> While creating a database & applying migrations seem only necessary for relational databases, this project comes even if you choose a NoSQL database provider (like MongoDB). In that case, it still seeds the initial data which is necessary for the application. +> While creating a database & applying migrations seem only necessary for relational databases, you should run this command even if you choose a NoSQL database provider (like MongoDB). In that case, it still seeds the initial data which is necessary for the application. -### Angular UI +### The Angular UI If you choose `Angular` as the UI framework, the solution will be separated into two folders: * An `angular` folder that contains the Angular UI application, the client-side code. * An `aspnet-core` folder that contains the ASP.NET Core solution (a single project), the server-side code. -The server-side is similar to the solution described in the [Solution Structure](#solution-structure) section above. This project serves the API, so the `Angular` application can consume it. +The server-side is similar to the solution described in the *Solution Structure* section above. This project serves the API, so the Angular application can consume it. The client-side application consumes the HTTP APIs as mentioned. You can see the folder structure of the Angular project shown below: From cb9445044dfe46e1b4dcba74c5b8fd07689778b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Wed, 1 Jun 2022 15:55:50 +0300 Subject: [PATCH 50/59] Revised the Single-Layer TODO app tutorial. --- docs/en/Tutorials/Todo/Single-Layer/Index.md | 49 +++++++++----------- 1 file changed, 22 insertions(+), 27 deletions(-) diff --git a/docs/en/Tutorials/Todo/Single-Layer/Index.md b/docs/en/Tutorials/Todo/Single-Layer/Index.md index 9f4927f5e4..0dcabf664e 100644 --- a/docs/en/Tutorials/Todo/Single-Layer/Index.md +++ b/docs/en/Tutorials/Todo/Single-Layer/Index.md @@ -17,6 +17,7 @@ You can find the source code of the completed application [here](https://github. ## Pre-Requirements * An IDE (e.g. [Visual Studio](https://visualstudio.microsoft.com/vs/)) that supports [.NET 6.0+](https://dotnet.microsoft.com/download/dotnet) development. +* [Node v14.x](https://nodejs.org/) {{if DB=="Mongo"}} @@ -24,15 +25,9 @@ You can find the source code of the completed application [here](https://github. {{end}} -{{if UI=="NG"}} - -* [Node v14.x](https://nodejs.org/) - -{{end}} - ## Creating a New Solution -In this tutorial, we will use the [ABP CLI](../../CLI.md) to create the sample application with the ABP Framework. You can run the following command in a command-line terminal to install the **ABP CLI**, if you haven't installed it yet: +In this tutorial, we will use the [ABP CLI](../../../CLI.md) to create the sample application with the ABP Framework. You can run the following command in a command-line terminal to install the **ABP CLI**, if you haven't installed it yet: ````bash dotnet tool install -g Volo.Abp.Cli @@ -46,7 +41,7 @@ abp new TodoApp -t app-nolayers{{if UI=="BlazorServer"}} -u blazor-server{{else {{if UI=="NG"}} -This will create a new solution with a single project, named *TodoApp* with `angular` and `aspnet-core` folders. Once the solution is ready, open the solution in your favorite IDE. +This will create a new solution, named *TodoApp*, with `angular` and `aspnet-core` folders. Once the solution is ready, open the solution (in the `aspnet-core` folder) with your favorite IDE. {{else}} @@ -56,7 +51,7 @@ This will create a new solution with a single project, named *TodoApp*. Once the ### Create the Database -You can run the following command in the directory of your project to create the database and seed the initial data: +You can run the following command in the root directory of your project (in the same folder of the `.csproj` file) to create the database and seed the initial data: ```bash dotnet run --migrate-database @@ -99,9 +94,9 @@ You can click on the *Login* button and use `admin` as the username and `1q2w3E* All right. We can start coding! -## Defining Entities +## Defining the Entity -This application will have a single [entity](../../../Entities.md) and we can start by creating it. So, create a new `TodoItem` class under the **Entities** folder of the project: +This application will have a single [entity](../../../Entities.md) and we can start by creating it. So, create a new `TodoItem` class under the `Entities` folder of the project: ````csharp using Volo.Abp.Domain.Entities; @@ -124,7 +119,7 @@ Next step is to setup the [Entity Framework Core](../../../Entity-Framework-Core ### Mapping Configuration -Open the `TodoAppDbContext` class (under the **Data** folder) and add a new `DbSet` property to this class: +Open the `TodoAppDbContext` class (in the `Data` folder) and add a new `DbSet` property to this class: ````csharp public DbSet TodoItems { get; set; } @@ -156,13 +151,13 @@ We've mapped the `TodoItem` entity to the `TodoItems` table in the database. The The startup solution is configured to use Entity Framework Core [Code First Migrations](https://docs.microsoft.com/en-us/ef/core/managing-schemas/migrations). Since we've changed the database mapping configuration, we should create a new migration and apply changes to the database. -Open a command-line terminal in the directory of your project and type the following command: +Open a command-line terminal in the root directory of your project and type the following command: ````bash dotnet ef migrations add Added_TodoItem ```` -This will add a new migration class to the project. You should see the new migration in the **Migrations** folder. +This will add a new migration class to the project. You should see the new migration in the `Migrations` folder: ![todo-efcore-migration](todo-efcore-migration-single-layer.png) @@ -197,17 +192,17 @@ After the database integrations, now we can start to create application service ## Creating the Application Service -An [Application Service](../../Application-Services.md) is used to perform the use cases of the application. We need to perform the following use cases in this application: +An [application service](../../../Application-Services.md) is used to perform the use cases of the application. We need to perform the following use cases in this application: * Get the list of the todo items * Create a new todo item * Delete an existing todo item -Before starting to implement these use cases, first we need to create DTOs. +Before starting to implement these use cases, first we need to create a DTO class that will be used in the application service. ### Creating the Data Transfer Object (DTO) -`ApplicationService` typically gets and returns DTOs ([Data Transfer Objects](../../../Data-Transfer-Objects.md)) instead of entities. So, create a new `TodoItemDto` class under the **Dtos** folder (under the **Services** folder): +[Application services](../../../Application-Services.md) typically get and return DTOs ([Data Transfer Objects](../../../Data-Transfer-Objects.md)) instead of entities. So, create a new `TodoItemDto` class under the `Services/Dtos` folder: ```csharp namespace TodoApp.Services.Dtos; @@ -219,11 +214,11 @@ public class TodoItemDto } ``` -* This is a very simple DTO class that has the same properties as the `TodoItem` entity. Now, we are ready to implement our use-cases. +This is a very simple DTO class that has the same properties as the `TodoItem` entity. Now, we are ready to implement our use-cases. -### Application Service Implementation +### The Application Service Implementation -Create a `TodoAppService` class under the **Services** folder of your project, as shown below: +Create a `TodoAppService` class under the `Services` folder of your project, as shown below: ```csharp using TodoApp.Entities; @@ -245,11 +240,11 @@ public class TodoAppService : ApplicationService } ``` -This class inherits from the `ApplicationService` class of the ABP Framework and implements our use-cases. ABP provides default generic [repositories](../../../Repositories.md) for the entities. We can use them to perform the fundamental database operations. This class [injects](../../../Dependency-Injection.md) `IRepository`, which is the default repository for the `TodoItem` entity. We will use it to implement the use cases (`GetListAsync`, `CreateAsync` and `DeleteAsync`) described before. +This class inherits from the `ApplicationService` class of the ABP Framework and implements our use-cases. ABP provides default generic [repositories](../../../Repositories.md) for the entities. We can use them to perform the fundamental database operations. This class [injects](../../../Dependency-Injection.md) `IRepository`, which is the default repository for the `TodoItem` entity. We will use it to implement our use cases. #### Getting the Todo Items -Let's start by implementing the `GetListAsync` method: +Let's start by implementing the `GetListAsync` method, which is used to get a list of todo items: ````csharp public async Task> GetListAsync() @@ -264,7 +259,7 @@ public async Task> GetListAsync() } ```` -We are simply getting the `TodoItem` list from the database, mapping them to the `TodoItemDto` objects and returning as the result. +We are simply getting the `TodoItem` list from the repository, mapping them to the `TodoItemDto` objects and returning as the result. #### Creating a New Todo Item @@ -387,7 +382,7 @@ Open the `Index.cshtml` file in the `Pages` folder and replace it with the follo
    ``` -We are using ABP's [card tag helper](../../UI/AspNetCore/Tag-Helpers/Cards.md) to create a simple card view. You could directly use the standard bootstrap HTML structure, however the ABP [tag helpers](../../UI/AspNetCore/Tag-Helpers/Index.md) make it much easier and type safe. +We are using ABP's [card tag helper](../../../UI/AspNetCore/Tag-Helpers/Cards.md) to create a simple card view. You could directly use the standard bootstrap HTML structure, however the ABP [tag helpers](../../../UI/AspNetCore/Tag-Helpers/Index.md) make it much easier and type safe. This page imports a CSS and a JavaScript file, so we should also create them. @@ -428,7 +423,7 @@ In the first part, we subscribed to the click events of the trash icons near the In the second part, we created a new todo item on the server. If it succeeded, we would then manipulate the DOM to insert a new `
  • ` element to the todo list. This way, we wouldn't need to refresh the whole page after creating a new todo item. -The interesting part here is how we communicate with the server. See the [*Dynamic JavaScript Proxies & Auto API Controllers*](#dynamic-javascript-proxies--auto-api-controllers) section to understand how it works. But now, let's continue and complete the application. +The interesting part here is how we communicate with the server. See the *Dynamic JavaScript Proxies & Auto API Controllers* section to understand how it works. But now, let's continue and complete the application. ### Index.cshtml.css @@ -469,7 +464,7 @@ Now, you can run the application again and see the result. In the `Index.cshtml.js` file, we've used the `todoApp.services.todo.delete(...)` and `todoApp.services.todo.create(...)` functions to communicate with the server. These functions are dynamically created by the ABP Framework, thanks to the [Dynamic JavaScript Client Proxy](../../../UI/AspNetCore/Dynamic-JavaScript-Proxies.md) system. They perform HTTP API calls to the server and return a promise, so you can register a callback to the `then` function as we've done above. -> **services** keyword comes from the namespace (`namespace TodoApp.Services;`). It's a naming convention. +> `services` keyword comes from the namespace (`namespace TodoApp.Services;`). It's a naming convention. However, you may notice that we haven't created any API Controllers, so how does the server handle these requests? This question brings us to the [Auto API Controller](../../../API/Auto-API-Controllers.md) feature of the ABP Framework. It automatically converts the application services to **API Controllers** by convention. @@ -757,4 +752,4 @@ You can find the source code of the completed application [here](https://github. ## See Also -* Check the [Web Application Development Tutorial](../Part-1.md) to see a real-life web application development in a layered architecture using the [Application Startup Template](../../../Startup-Templates/Application.md). +* Check the [Web Application Development Tutorial](../../Part-1.md) to see a real-life web application development in a layered architecture using the [Application Startup Template](../../../Startup-Templates/Application.md). From afcc8cc6ed47393099cbcd106796c5028f657cfd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Wed, 1 Jun 2022 15:59:31 +0300 Subject: [PATCH 51/59] Update Index.md --- docs/en/Tutorials/Todo/Index.md | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/docs/en/Tutorials/Todo/Index.md b/docs/en/Tutorials/Todo/Index.md index b3e5a876df..5ecee2074b 100644 --- a/docs/en/Tutorials/Todo/Index.md +++ b/docs/en/Tutorials/Todo/Index.md @@ -17,6 +17,7 @@ You can find the source code of the completed application [here](https://github. ## Pre-Requirements * An IDE (e.g. [Visual Studio](https://visualstudio.microsoft.com/vs/)) that supports [.NET 6.0+](https://dotnet.microsoft.com/download/dotnet) development. +* [Node v14.x](https://nodejs.org/) {{if DB=="Mongo"}} @@ -24,12 +25,6 @@ You can find the source code of the completed application [here](https://github. {{end}} -{{if UI=="NG"}} - -* [Node v14.x](https://nodejs.org/) - -{{end}} - ## Creating a New Solution We will use the [ABP CLI](../../CLI.md) to create new solutions with the ABP Framework. You can run the following command in a command-line terminal to install it: From 9cbf28399fc64ac063fcec476ed8f61a7d1b6bb4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Wed, 1 Jun 2022 16:17:55 +0300 Subject: [PATCH 52/59] Added document: Todo/Overall.md --- docs/en/Tutorials/Todo/Overall.md | 14 ++++++++++++++ docs/en/docs-nav.json | 12 +++++++++++- 2 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 docs/en/Tutorials/Todo/Overall.md diff --git a/docs/en/Tutorials/Todo/Overall.md b/docs/en/Tutorials/Todo/Overall.md new file mode 100644 index 0000000000..66ff0d54e3 --- /dev/null +++ b/docs/en/Tutorials/Todo/Overall.md @@ -0,0 +1,14 @@ +# Quick Start: Overall + +**Welcome to the ABP Framework**. This is a single-part, quick-start tutorial to build a simple application. Start with this tutorial if you want to quickly understand how ABP Framework works. + +## Select the Solution Architecture + +This tutorial has multiple versions. Please select the one best fits for you: + +* **[Single-Layer Solution](Single-Layer/Index.md)**: Creates a single-project solution. Recommended for building an application with a **simpler and easy to understand** architecture. +* **[Layered Solution Architecture](Index.md)**: A fully layered (multiple projects) solution based on [Domain Driven Design](../../Domain-Driven-Design.md) practices. Recommended for long-term projects that need a **maintainable and extensible** codebase. + +## See Also + +* Check the [Web Application Development Tutorial](../../Part-1.md) to see a real-life web application development in a layered architecture. diff --git a/docs/en/docs-nav.json b/docs/en/docs-nav.json index c0151e4e9c..070d390ff5 100644 --- a/docs/en/docs-nav.json +++ b/docs/en/docs-nav.json @@ -2,7 +2,17 @@ "items": [ { "text": "Quick Start", - "path": "Tutorials/Todo/Index.md" + "path": "Tutorials/Todo/Overall.md", + "items": [ + { + "text": "With single-layer solution", + "path": "Tutorials/Todo/Single-Layer/Index.md" + }, + { + "text": "With layered architecture", + "path": "Tutorials/Todo/Index.md" + } + ] }, { "text": "Getting Started", From 3a3a1d2a74222e06b7f31b3cac194f11f2380056 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Wed, 1 Jun 2022 16:20:03 +0300 Subject: [PATCH 53/59] Fix Todo\Overall.md --- docs/en/Tutorials/Todo/Overall.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/Tutorials/Todo/Overall.md b/docs/en/Tutorials/Todo/Overall.md index 66ff0d54e3..2fc92ae2ac 100644 --- a/docs/en/Tutorials/Todo/Overall.md +++ b/docs/en/Tutorials/Todo/Overall.md @@ -11,4 +11,4 @@ This tutorial has multiple versions. Please select the one best fits for you: ## See Also -* Check the [Web Application Development Tutorial](../../Part-1.md) to see a real-life web application development in a layered architecture. +* Check the [Web Application Development Tutorial](../Part-1.md) to see a real-life web application development in a layered architecture. From 416e1ea55b236068470b0182fed2eb1b54e38308 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Wed, 1 Jun 2022 16:31:15 +0300 Subject: [PATCH 54/59] Update Index.md --- docs/en/Index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/Index.md b/docs/en/Index.md index 3f5c3dbf44..d2d5931913 100644 --- a/docs/en/Index.md +++ b/docs/en/Index.md @@ -4,7 +4,7 @@ ABP Framework offers an **opinionated architecture** to build enterprise softwar ## Getting Started -* [Quick Start](Tutorials/Todo/Index.md) is a single-part, quick-start tutorial to build a simple application with the ABP Framework. Start with this tutorial if you want to quickly understand how ABP works. +* [Quick Start](Tutorials/Todo/Overall.md) is a single-part, quick-start tutorial to build a simple application with the ABP Framework. Start with this tutorial if you want to quickly understand how ABP works. * [Getting Started](Getting-Started.md) guide can be used to create and run ABP based solutions with different options and details. * [Web Application Development Tutorial](Tutorials/Part-1.md) is a complete tutorial to develop a full stack web application with all aspects of a real-life solution. From c62907809ab5fbfdd1131ee4d22a3d1a8a57cc29 Mon Sep 17 00:00:00 2001 From: maliming Date: Thu, 2 Jun 2022 10:51:16 +0800 Subject: [PATCH 55/59] Add PlugIn test and update its document. --- docs/en/PlugIn-Modules.md | 11 ++++----- .../images/simple-razor-plug-in-dll-file.png | Bin 52768 -> 163924 bytes framework/Volo.Abp.sln | 7 ++++++ .../MyPlungInModule.cs | 22 ++++++++++++++++++ .../Volo.Abp.AspNetCore.Mvc.PlugIn.csproj | 13 +++++++++++ .../Volo/Abp/AspNetCore/Mvc/Index.cshtml | 4 ++++ .../Volo/Abp/AspNetCore/Mvc/Index.cshtml.cs | 11 +++++++++ .../Abp/AspNetCore/Mvc/PlugIn/PlugIn_Tests.cs | 18 ++++++++++++++ .../Volo/Abp/AspNetCore/Mvc/Startup.cs | 17 ++++++++++++-- 9 files changed, 94 insertions(+), 9 deletions(-) create mode 100644 framework/test/Volo.Abp.AspNetCore.Mvc.PlugIn/MyPlungInModule.cs create mode 100644 framework/test/Volo.Abp.AspNetCore.Mvc.PlugIn/Volo.Abp.AspNetCore.Mvc.PlugIn.csproj create mode 100644 framework/test/Volo.Abp.AspNetCore.Mvc.PlugIn/Volo/Abp/AspNetCore/Mvc/Index.cshtml create mode 100644 framework/test/Volo.Abp.AspNetCore.Mvc.PlugIn/Volo/Abp/AspNetCore/Mvc/Index.cshtml.cs create mode 100644 framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/PlugIn/PlugIn_Tests.cs diff --git a/docs/en/PlugIn-Modules.md b/docs/en/PlugIn-Modules.md index 1d613582ab..5c0cdacfd3 100644 --- a/docs/en/PlugIn-Modules.md +++ b/docs/en/PlugIn-Modules.md @@ -178,10 +178,8 @@ namespace MyMvcUIPlugIn //Add plugin assembly mvcBuilder.PartManager.ApplicationParts.Add(new AssemblyPart(typeof(MyMvcUIPlugInModule).Assembly)); - //Add views assembly - var viewDllPath = Path.Combine(Path.GetDirectoryName(typeof(MyMvcUIPlugInModule).Assembly.Location), "MyMvcUIPlugIn.Views.dll"); - var viewAssembly = new CompiledRazorAssemblyPart(Assembly.LoadFrom(viewDllPath)); - mvcBuilder.PartManager.ApplicationParts.Add(viewAssembly); + //Add CompiledRazorAssemblyPart if the PlugIn module contains razor views. + mvcBuilder.PartManager.ApplicationParts.Add(new CompiledRazorAssemblyPart(typeof(MyMvcUIPlugInModule).Assembly)); }); } } @@ -189,8 +187,7 @@ namespace MyMvcUIPlugIn ```` * Depending on the `AbpAspNetCoreMvcUiThemeSharedModule` since we added the related NuGet package. -* Adding the plug-in's assembly to the `PartManager` of ASP.NET Core MVC. This is required by ASP.NET Core. Otherwise, your controllers inside the plug-in doesn't work. -* Adding the plug-in's views assembly to the `PartManager` of ASP.NET Core MVC. This is required by ASP.NET Core. Otherwise, your views inside the plug-in doesn't work. +* Adding the plug-in's assembly as `AssemblyPart` and `CompiledRazorAssemblyPart` to the `PartManager` of ASP.NET Core MVC. This is required by ASP.NET Core. Otherwise, your controllers or views inside the plug-in doesn't work. You can now add a razor page, like `MyPlugInPage.cshtml` inside the `Pages` folder: @@ -205,7 +202,7 @@ Now, you can build the plug-in project. It will produce the following output: ![simple-razor-plug-in-dll-file](images/simple-razor-plug-in-dll-file.png) -Copy the `MyMvcUIPlugIn.dll` and `MyMvcUIPlugIn.Views.dll` into the plug-in folder (`D:\Temp\MyPlugIns` for this example). +Copy the `MyMvcUIPlugIn.dll` into the plug-in folder (`D:\Temp\MyPlugIns` for this example). If you have configured the main application like described above (see Basic Usage section), you should be able to visit the `/MyPlugInPage` URL when your application: diff --git a/docs/en/images/simple-razor-plug-in-dll-file.png b/docs/en/images/simple-razor-plug-in-dll-file.png index 06b7a565feafca9b01149d1e1c53492571588084..956194195240bca2960444abb00db194d443432d 100644 GIT binary patch literal 163924 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�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 UHa)fxBRxd4^;1SM#k?W^+-6@2PF;zpzy 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

    N{7eVn#Ef4VW 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 w0;PiT@G;fgnqW3x9$@5Pm=)kE)+P26x2hu__^u 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 jKZZ(#nrlKgHahlE_2*yW6YAks#e8`k}8rL7K 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 diff --git a/framework/Volo.Abp.sln b/framework/Volo.Abp.sln index f92a9d336b..fadd40bcc5 100644 --- a/framework/Volo.Abp.sln +++ b/framework/Volo.Abp.sln @@ -407,6 +407,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.Gdpr.Abstractions" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.RemoteServices", "src\Volo.Abp.RemoteServices\Volo.Abp.RemoteServices.csproj", "{EDFFDA74-090D-439C-A58D-06CCF86D4423}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.AspNetCore.Mvc.PlugIn", "test\Volo.Abp.AspNetCore.Mvc.PlugIn\Volo.Abp.AspNetCore.Mvc.PlugIn.csproj", "{C6D6D878-208A-4FD2-822E-365545D8681B}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -1213,6 +1215,10 @@ Global {EDFFDA74-090D-439C-A58D-06CCF86D4423}.Debug|Any CPU.Build.0 = Debug|Any CPU {EDFFDA74-090D-439C-A58D-06CCF86D4423}.Release|Any CPU.ActiveCfg = Release|Any CPU {EDFFDA74-090D-439C-A58D-06CCF86D4423}.Release|Any CPU.Build.0 = Release|Any CPU + {C6D6D878-208A-4FD2-822E-365545D8681B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C6D6D878-208A-4FD2-822E-365545D8681B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C6D6D878-208A-4FD2-822E-365545D8681B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C6D6D878-208A-4FD2-822E-365545D8681B}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -1418,6 +1424,7 @@ Global {E5FCE710-C5A3-4F94-B9C9-BD1E99252BFB} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} {3683340D-92F5-4B14-B77B-34A163333309} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} {EDFFDA74-090D-439C-A58D-06CCF86D4423} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} + {C6D6D878-208A-4FD2-822E-365545D8681B} = {447C8A77-E5F0-4538-8687-7383196D04EA} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {BB97ECF4-9A84-433F-A80B-2A3285BDD1D5} diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.PlugIn/MyPlungInModule.cs b/framework/test/Volo.Abp.AspNetCore.Mvc.PlugIn/MyPlungInModule.cs new file mode 100644 index 0000000000..5f007720b3 --- /dev/null +++ b/framework/test/Volo.Abp.AspNetCore.Mvc.PlugIn/MyPlungInModule.cs @@ -0,0 +1,22 @@ +using Microsoft.AspNetCore.Mvc.ApplicationParts; +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared; +using Volo.Abp.Modularity; + +namespace Volo.Abp.AspNetCore.Mvc.PlugIn; + +[DependsOn(typeof(AbpAspNetCoreMvcUiThemeSharedModule))] +public class MyPlungInModule : AbpModule +{ + public override void PreConfigureServices(ServiceConfigurationContext context) + { + PreConfigure(mvcBuilder => + { + //Add plugin assembly + mvcBuilder.PartManager.ApplicationParts.Add(new AssemblyPart(typeof(MyPlungInModule).Assembly)); + + //Add CompiledRazorAssemblyPart if the PlugIn module contains razor views. + mvcBuilder.PartManager.ApplicationParts.Add(new CompiledRazorAssemblyPart(typeof(MyPlungInModule).Assembly)); + }); + } +} diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.PlugIn/Volo.Abp.AspNetCore.Mvc.PlugIn.csproj b/framework/test/Volo.Abp.AspNetCore.Mvc.PlugIn/Volo.Abp.AspNetCore.Mvc.PlugIn.csproj new file mode 100644 index 0000000000..91ca2b1312 --- /dev/null +++ b/framework/test/Volo.Abp.AspNetCore.Mvc.PlugIn/Volo.Abp.AspNetCore.Mvc.PlugIn.csproj @@ -0,0 +1,13 @@ + + + + net6.0 + Library + true + + + + + + + diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.PlugIn/Volo/Abp/AspNetCore/Mvc/Index.cshtml b/framework/test/Volo.Abp.AspNetCore.Mvc.PlugIn/Volo/Abp/AspNetCore/Mvc/Index.cshtml new file mode 100644 index 0000000000..6ed75571d1 --- /dev/null +++ b/framework/test/Volo.Abp.AspNetCore.Mvc.PlugIn/Volo/Abp/AspNetCore/Mvc/Index.cshtml @@ -0,0 +1,4 @@ +@page +@model Volo.Abp.AspNetCore.Mvc.PlugIn.Volo.Abp.AspNetCore.Mvc.Index +

    Welcome to my plug-in page

    +

    This page is located inside a plug-in module! :)

    diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.PlugIn/Volo/Abp/AspNetCore/Mvc/Index.cshtml.cs b/framework/test/Volo.Abp.AspNetCore.Mvc.PlugIn/Volo/Abp/AspNetCore/Mvc/Index.cshtml.cs new file mode 100644 index 0000000000..2570e93950 --- /dev/null +++ b/framework/test/Volo.Abp.AspNetCore.Mvc.PlugIn/Volo/Abp/AspNetCore/Mvc/Index.cshtml.cs @@ -0,0 +1,11 @@ +using Microsoft.AspNetCore.Mvc.RazorPages; + +namespace Volo.Abp.AspNetCore.Mvc.PlugIn.Volo.Abp.AspNetCore.Mvc; + +public class Index : PageModel +{ + public void OnGet() + { + + } +} diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/PlugIn/PlugIn_Tests.cs b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/PlugIn/PlugIn_Tests.cs new file mode 100644 index 0000000000..c8519e9612 --- /dev/null +++ b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/PlugIn/PlugIn_Tests.cs @@ -0,0 +1,18 @@ +using System.Threading.Tasks; +using Shouldly; +using Xunit; + +namespace Volo.Abp.AspNetCore.Mvc.PlugIn; + +public class PlugIn_Tests : AspNetCoreMvcTestBase +{ + [Fact] + public async Task Get_PlugIn_Views() + { + var page = await GetResponseAsStringAsync( + "/Index" + ); + + page.ShouldContain("Welcome to my plug-in page"); + } +} diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Startup.cs b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Startup.cs index f913b431e7..e26e6ce2c3 100644 --- a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Startup.cs +++ b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Startup.cs @@ -1,8 +1,9 @@ -using System; +using System.IO; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; +using Volo.Abp.Modularity.PlugIns; namespace Volo.Abp.AspNetCore.Mvc; @@ -10,7 +11,19 @@ public class Startup { public void ConfigureServices(IServiceCollection services) { - services.AddApplication(); + services.AddApplication(options => + { + var hostEnvironment = services.GetHostingEnvironment(); +#if DEBUG + var plugDllInPath = Path.Combine(hostEnvironment.ContentRootPath, + @"..\..\..\..\..\Volo.Abp.AspNetCore.Mvc.PlugIn\bin\Debug\net6.0\"); +#else + plugDllInPath = Path.Combine(_env.ContentRootPath, + @"..\..\..\..\..\Volo.Abp.AspNetCore.Mvc.PlugIn\bin\Release\net6.0\"); +#endif + + options.PlugInSources.AddFolder(plugDllInPath); + }); } public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILoggerFactory loggerFactory) From 024a7164d44c80baeea6fa5786235e23042c9add Mon Sep 17 00:00:00 2001 From: albert <9526587+ebicoglu@users.noreply.github.com> Date: Thu, 2 Jun 2022 09:00:36 +0300 Subject: [PATCH 56/59] Delete 0 --- nupkg/0 | Bin 8 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 nupkg/0 diff --git a/nupkg/0 b/nupkg/0 deleted file mode 100644 index cf175e3b0b668a96032b3e0d45584039f893e6a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 PcmezW&wzoKfr|kE5LyC7 From 30cff4ac60206417c7ec1e3b1f23c049a5cb29b5 Mon Sep 17 00:00:00 2001 From: Engincan VESKE Date: Thu, 2 Jun 2022 10:59:55 +0300 Subject: [PATCH 57/59] Remove redis configurations from `app-nolayers` template --- ...yCompanyName.MyProjectName.Host.Mongo.csproj | 2 -- .../MyProjectNameModule.cs | 17 +++-------------- .../appsettings.json | 3 --- .../MyCompanyName.MyProjectName.Host.csproj | 2 -- .../MyProjectNameModule.cs | 17 +++-------------- .../appsettings.json | 3 --- 6 files changed, 6 insertions(+), 38 deletions(-) diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/MyCompanyName.MyProjectName.Host.Mongo.csproj b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/MyCompanyName.MyProjectName.Host.Mongo.csproj index e53c4fc5db..4afc1624f8 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/MyCompanyName.MyProjectName.Host.Mongo.csproj +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/MyCompanyName.MyProjectName.Host.Mongo.csproj @@ -16,7 +16,6 @@ - @@ -70,7 +69,6 @@ - diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/MyProjectNameModule.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/MyProjectNameModule.cs index f8d6fd1d67..eb6e9b50f6 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/MyProjectNameModule.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/MyProjectNameModule.cs @@ -3,7 +3,6 @@ using Microsoft.AspNetCore.DataProtection; using Microsoft.OpenApi.Models; using MyCompanyName.MyProjectName.Data; using MyCompanyName.MyProjectName.Localization; -using StackExchange.Redis; using Volo.Abp; using Volo.Abp.Account; using Volo.Abp.Account.Web; @@ -19,7 +18,6 @@ using Volo.Abp.AspNetCore.Serilog; using Volo.Abp.AuditLogging.MongoDB; using Volo.Abp.Autofac; using Volo.Abp.AutoMapper; -using Volo.Abp.Caching.StackExchangeRedis; using Volo.Abp.FeatureManagement; using Volo.Abp.FeatureManagement.MongoDB; using Volo.Abp.Identity; @@ -52,7 +50,6 @@ namespace MyCompanyName.MyProjectName; typeof(AbpAspNetCoreMultiTenancyModule), typeof(AbpAutofacModule), typeof(AbpAutoMapperModule), - typeof(AbpCachingStackExchangeRedisModule), typeof(AbpAspNetCoreMvcUiBasicThemeModule), typeof(AbpSwashbuckleModule), typeof(AbpAspNetCoreAuthenticationJwtBearerModule), @@ -124,7 +121,7 @@ public class MyProjectNameModule : AbpModule ConfigureLocalization(); ConfigureAuthentication(context.Services, configuration); ConfigureCors(context, configuration); - ConfigureDataProtection(context, configuration, hostingEnvironment); + ConfigureDataProtection(context); ConfigureMongoDB(context); } @@ -276,17 +273,9 @@ public class MyProjectNameModule : AbpModule }); } - private void ConfigureDataProtection( - ServiceConfigurationContext context, - IConfiguration configuration, - IWebHostEnvironment hostingEnvironment) + private void ConfigureDataProtection(ServiceConfigurationContext context) { - var dataProtectionBuilder = context.Services.AddDataProtection().SetApplicationName("MyProjectName"); - if (!hostingEnvironment.IsDevelopment()) - { - var redis = ConnectionMultiplexer.Connect(configuration["Redis:Configuration"]); - dataProtectionBuilder.PersistKeysToStackExchangeRedis(redis, "MyProjectName-Protection-Keys"); - } + context.Services.AddDataProtection().SetApplicationName("MyProjectName"); } private void ConfigureMongoDB(ServiceConfigurationContext context) diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/appsettings.json b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/appsettings.json index d512dd03b3..5a7133396c 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/appsettings.json +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/appsettings.json @@ -8,9 +8,6 @@ "ConnectionStrings": { "Default": "mongodb://localhost:27017/MyProjectName" }, - "Redis": { - "Configuration": "127.0.0.1" - }, "AuthServer": { "Authority": "https://localhost:44300", "RequireHttpsMetadata": "false", diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/MyCompanyName.MyProjectName.Host.csproj b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/MyCompanyName.MyProjectName.Host.csproj index 9987e82790..3545a1ce01 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/MyCompanyName.MyProjectName.Host.csproj +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/MyCompanyName.MyProjectName.Host.csproj @@ -16,7 +16,6 @@ - @@ -71,7 +70,6 @@ - diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/MyProjectNameModule.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/MyProjectNameModule.cs index 24eef29cb3..84ad100327 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/MyProjectNameModule.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/MyProjectNameModule.cs @@ -3,7 +3,6 @@ using Microsoft.AspNetCore.DataProtection; using Microsoft.OpenApi.Models; using MyCompanyName.MyProjectName.Data; using MyCompanyName.MyProjectName.Localization; -using StackExchange.Redis; using Volo.Abp; using Volo.Abp.Account; using Volo.Abp.Account.Web; @@ -19,7 +18,6 @@ using Volo.Abp.AspNetCore.Serilog; using Volo.Abp.AuditLogging.EntityFrameworkCore; using Volo.Abp.Autofac; using Volo.Abp.AutoMapper; -using Volo.Abp.Caching.StackExchangeRedis; using Volo.Abp.EntityFrameworkCore; using Volo.Abp.EntityFrameworkCore.SqlServer; using Volo.Abp.FeatureManagement; @@ -53,7 +51,6 @@ namespace MyCompanyName.MyProjectName; typeof(AbpAspNetCoreMultiTenancyModule), typeof(AbpAutofacModule), typeof(AbpAutoMapperModule), - typeof(AbpCachingStackExchangeRedisModule), typeof(AbpEntityFrameworkCoreSqlServerModule), typeof(AbpAspNetCoreMvcUiBasicThemeModule), typeof(AbpSwashbuckleModule), @@ -126,7 +123,7 @@ public class MyProjectNameModule : AbpModule ConfigureLocalization(); ConfigureAuthentication(context.Services, configuration); ConfigureCors(context, configuration); - ConfigureDataProtection(context, configuration, hostingEnvironment); + ConfigureDataProtection(context); ConfigureEfCore(context); } @@ -278,17 +275,9 @@ public class MyProjectNameModule : AbpModule }); } - private void ConfigureDataProtection( - ServiceConfigurationContext context, - IConfiguration configuration, - IWebHostEnvironment hostingEnvironment) + private void ConfigureDataProtection(ServiceConfigurationContext context) { - var dataProtectionBuilder = context.Services.AddDataProtection().SetApplicationName("MyProjectName"); - if (!hostingEnvironment.IsDevelopment()) - { - var redis = ConnectionMultiplexer.Connect(configuration["Redis:Configuration"]); - dataProtectionBuilder.PersistKeysToStackExchangeRedis(redis, "MyProjectName-Protection-Keys"); - } + context.Services.AddDataProtection().SetApplicationName("MyProjectName"); } private void ConfigureEfCore(ServiceConfigurationContext context) diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/appsettings.json b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/appsettings.json index 7a0f48e4d6..a6040d7c48 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/appsettings.json +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/appsettings.json @@ -8,9 +8,6 @@ "ConnectionStrings": { "Default": "Server=(LocalDb)\\MSSQLLocalDB;Database=MyProjectName;Trusted_Connection=True" }, - "Redis": { - "Configuration": "127.0.0.1" - }, "AuthServer": { "Authority": "https://localhost:44300", "RequireHttpsMetadata": "false", From 8ce5daba10fbb87f83ff3e3704f63af47d7faa9d Mon Sep 17 00:00:00 2001 From: Engincan VESKE Date: Thu, 2 Jun 2022 11:06:27 +0300 Subject: [PATCH 58/59] Add missing `NullEmailSender` replacement to `app-nolayers` template --- .../MyProjectNameModule.cs | 7 +++++++ .../MyProjectNameModule.cs | 7 +++++++ .../MyProjectNameModule.cs | 7 +++++++ .../MyProjectNameModule.cs | 7 +++++++ .../MyProjectNameModule.cs | 9 ++++++++- .../MyProjectNameModule.cs | 9 ++++++++- 6 files changed, 44 insertions(+), 2 deletions(-) diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/MyProjectNameModule.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/MyProjectNameModule.cs index 0fb12feed2..0a173f00b9 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/MyProjectNameModule.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/MyProjectNameModule.cs @@ -1,5 +1,6 @@ using Blazorise.Bootstrap5; using Blazorise.Icons.FontAwesome; +using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.OpenApi.Models; using MyCompanyName.MyProjectName.Data; using MyCompanyName.MyProjectName.Localization; @@ -21,6 +22,7 @@ using Volo.Abp.AuditLogging.MongoDB; using Volo.Abp.Autofac; using Volo.Abp.AutoMapper; using Volo.Abp.MongoDB; +using Volo.Abp.Emailing; using Volo.Abp.FeatureManagement; using Volo.Abp.FeatureManagement.Blazor.Server; using Volo.Abp.FeatureManagement.MongoDB; @@ -123,6 +125,11 @@ public class MyProjectNameModule : AbpModule var hostingEnvironment = context.Services.GetHostingEnvironment(); var configuration = context.Services.GetConfiguration(); + if (hostingEnvironment.IsDevelopment()) + { + context.Services.Replace(ServiceDescriptor.Singleton()); + } + ConfigureUrls(configuration); ConfigureBundles(); ConfigureAutoMapper(context); diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/MyProjectNameModule.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/MyProjectNameModule.cs index 9567786a99..f5ad689be7 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/MyProjectNameModule.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/MyProjectNameModule.cs @@ -1,5 +1,6 @@ using Blazorise.Bootstrap5; using Blazorise.Icons.FontAwesome; +using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.OpenApi.Models; using MyCompanyName.MyProjectName.Data; using MyCompanyName.MyProjectName.Localization; @@ -20,6 +21,7 @@ using Volo.Abp.AspNetCore.Serilog; using Volo.Abp.AuditLogging.EntityFrameworkCore; using Volo.Abp.Autofac; using Volo.Abp.AutoMapper; +using Volo.Abp.Emailing; using Volo.Abp.EntityFrameworkCore; using Volo.Abp.EntityFrameworkCore.SqlServer; using Volo.Abp.FeatureManagement; @@ -123,6 +125,11 @@ public class MyProjectNameModule : AbpModule { var hostingEnvironment = context.Services.GetHostingEnvironment(); var configuration = context.Services.GetConfiguration(); + + if (hostingEnvironment.IsDevelopment()) + { + context.Services.Replace(ServiceDescriptor.Singleton()); + } ConfigureUrls(configuration); ConfigureBundles(); diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/MyProjectNameModule.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/MyProjectNameModule.cs index eb6e9b50f6..4550b6d997 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/MyProjectNameModule.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/MyProjectNameModule.cs @@ -1,5 +1,6 @@ using Microsoft.AspNetCore.Cors; using Microsoft.AspNetCore.DataProtection; +using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.OpenApi.Models; using MyCompanyName.MyProjectName.Data; using MyCompanyName.MyProjectName.Localization; @@ -18,6 +19,7 @@ using Volo.Abp.AspNetCore.Serilog; using Volo.Abp.AuditLogging.MongoDB; using Volo.Abp.Autofac; using Volo.Abp.AutoMapper; +using Volo.Abp.Emailing; using Volo.Abp.FeatureManagement; using Volo.Abp.FeatureManagement.MongoDB; using Volo.Abp.Identity; @@ -110,6 +112,11 @@ public class MyProjectNameModule : AbpModule { var hostingEnvironment = context.Services.GetHostingEnvironment(); var configuration = context.Services.GetConfiguration(); + + if (hostingEnvironment.IsDevelopment()) + { + context.Services.Replace(ServiceDescriptor.Singleton()); + } ConfigureBundles(); ConfigureMultiTenancy(); diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/MyProjectNameModule.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/MyProjectNameModule.cs index 84ad100327..c5cf3e4d79 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/MyProjectNameModule.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/MyProjectNameModule.cs @@ -1,5 +1,6 @@ using Microsoft.AspNetCore.Cors; using Microsoft.AspNetCore.DataProtection; +using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.OpenApi.Models; using MyCompanyName.MyProjectName.Data; using MyCompanyName.MyProjectName.Localization; @@ -18,6 +19,7 @@ using Volo.Abp.AspNetCore.Serilog; using Volo.Abp.AuditLogging.EntityFrameworkCore; using Volo.Abp.Autofac; using Volo.Abp.AutoMapper; +using Volo.Abp.Emailing; using Volo.Abp.EntityFrameworkCore; using Volo.Abp.EntityFrameworkCore.SqlServer; using Volo.Abp.FeatureManagement; @@ -112,6 +114,11 @@ public class MyProjectNameModule : AbpModule { var hostingEnvironment = context.Services.GetHostingEnvironment(); var configuration = context.Services.GetConfiguration(); + + if (hostingEnvironment.IsDevelopment()) + { + context.Services.Replace(ServiceDescriptor.Singleton()); + } ConfigureBundles(); ConfigureMultiTenancy(); diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc.Mongo/MyProjectNameModule.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc.Mongo/MyProjectNameModule.cs index 0fc9f27f87..a6379697d5 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc.Mongo/MyProjectNameModule.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc.Mongo/MyProjectNameModule.cs @@ -1,4 +1,5 @@ -using Microsoft.OpenApi.Models; +using Microsoft.Extensions.DependencyInjection.Extensions; +using Microsoft.OpenApi.Models; using MyCompanyName.MyProjectName.Data; using MyCompanyName.MyProjectName.Localization; using MyCompanyName.MyProjectName.Menus; @@ -17,6 +18,7 @@ using Volo.Abp.AuditLogging.MongoDB; using Volo.Abp.Autofac; using Volo.Abp.AutoMapper; using Volo.Abp.MongoDB; +using Volo.Abp.Emailing; using Volo.Abp.FeatureManagement; using Volo.Abp.FeatureManagement.MongoDB; using Volo.Abp.Identity; @@ -116,6 +118,11 @@ public class MyProjectNameModule : AbpModule { var hostingEnvironment = context.Services.GetHostingEnvironment(); var configuration = context.Services.GetConfiguration(); + + if (hostingEnvironment.IsDevelopment()) + { + context.Services.Replace(ServiceDescriptor.Singleton()); + } ConfigureMultiTenancy(); ConfigureUrls(configuration); diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/MyProjectNameModule.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/MyProjectNameModule.cs index f9725d589d..90e602c336 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/MyProjectNameModule.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/MyProjectNameModule.cs @@ -1,4 +1,5 @@ -using Microsoft.OpenApi.Models; +using Microsoft.Extensions.DependencyInjection.Extensions; +using Microsoft.OpenApi.Models; using MyCompanyName.MyProjectName.Data; using MyCompanyName.MyProjectName.Localization; using MyCompanyName.MyProjectName.Menus; @@ -16,6 +17,7 @@ using Volo.Abp.AspNetCore.Serilog; using Volo.Abp.AuditLogging.EntityFrameworkCore; using Volo.Abp.Autofac; using Volo.Abp.AutoMapper; +using Volo.Abp.Emailing; using Volo.Abp.EntityFrameworkCore; using Volo.Abp.EntityFrameworkCore.SqlServer; using Volo.Abp.FeatureManagement; @@ -117,6 +119,11 @@ public class MyProjectNameModule : AbpModule { var hostingEnvironment = context.Services.GetHostingEnvironment(); var configuration = context.Services.GetConfiguration(); + + if (hostingEnvironment.IsDevelopment()) + { + context.Services.Replace(ServiceDescriptor.Singleton()); + } ConfigureMultiTenancy(); ConfigureUrls(configuration); From 218ac6c81330571e080f432b067a329c80289f8b Mon Sep 17 00:00:00 2001 From: Engincan VESKE <43685404+EngincanV@users.noreply.github.com> Date: Thu, 2 Jun 2022 17:36:33 +0300 Subject: [PATCH 59/59] Update Error-Handling.md --- docs/en/UI/Blazor/Error-Handling.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/docs/en/UI/Blazor/Error-Handling.md b/docs/en/UI/Blazor/Error-Handling.md index 6582ee0c8e..18cb958f72 100644 --- a/docs/en/UI/Blazor/Error-Handling.md +++ b/docs/en/UI/Blazor/Error-Handling.md @@ -23,12 +23,12 @@ There are different type of `Exception` classes handled differently by the ABP F `UserFriendlyException` is a special type of exception. You can directly show a error message dialog to the user by throwing such an exception. +{{if UI == "BlazorServer"}} + > For Blazor Server, exceptions must be handled manually. Otherwise it crashes the whole application. Auto Exception Handling is not possible with Blazor Server right now, please follow [this issue](https://github.com/abpframework/abp/issues/8195) to see progress. In meantime, you can use try-catch blocks and call the `HandleErrorAsync` method of ABP to handle errors manually, which shows an error dialog for you. **Example** -{{if UI == "BlazorServer"}} - ````csharp @page "/" @using Volo.Abp @@ -55,6 +55,8 @@ There are different type of `Exception` classes handled differently by the ABP F {{if UI == "Blazor"}} +**Example** + ````csharp @page "/" @using Volo.Abp @@ -97,4 +99,4 @@ Errors (like Validation, Authorization and User Friendly Errors) sent by the ser ## See Also -* [Exception Handling System](../../Exception-Handling.md) \ No newline at end of file +* [Exception Handling System](../../Exception-Handling.md)