From 9f90cc27f25ded892cd5666f84b0f776ecce31d9 Mon Sep 17 00:00:00 2001 From: Suhaib Date: Fri, 1 Nov 2024 21:52:25 +0300 Subject: [PATCH] implement favorites filter for blog post listing --- .../Admin/Blogs/BlogPostAdminAppService.cs | 10 +++- .../CmsKit/Localization/Resources/ar.json | 3 ++ .../CmsKit/Localization/Resources/en.json | 3 ++ .../Volo/CmsKit/Blogs/IBlogPostRepository.cs | 2 + .../Volo/CmsKit/CmsKitDomainModule.cs | 19 ++++++++ .../CmsKit/MarkedItems/MarkedItemManager.cs | 12 ++++- .../CmsKit/Blogs/EfCoreBlogPostRepository.cs | 36 ++++++++++----- .../MongoDB/Blogs/MongoBlogPostRepository.cs | 46 +++++++++++++++++-- .../Public/Blogs/BlogPostGetListInput.cs | 1 + .../Public/Blogs/BlogPostPublicAppService.cs | 13 ++++++ .../Pages/Public/CmsKit/Blogs/Index.cshtml | 43 +++++++++++++++-- .../Pages/Public/CmsKit/Blogs/Index.cshtml.cs | 6 ++- .../CmsKit/Blogs/filter-on-favorites.js | 27 +++++++++++ .../Pages/Public/CmsKit/Blogs/index.css | 5 ++ 14 files changed, 201 insertions(+), 25 deletions(-) create mode 100644 modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/filter-on-favorites.js 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 adace8bd9a..dd39cddf88 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 @@ -111,9 +111,15 @@ 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, input.TagId, + var blogPosts = await BlogPostRepository.GetListAsync( + input.Filter, + input.BlogId, + input.AuthorId, + input.TagId, statusFilter: input.Status, - input.MaxResultCount, input.SkipCount, input.Sorting); + maxResultCount: input.MaxResultCount, + skipCount: input.SkipCount, + sorting: input.Sorting); var count = await BlogPostRepository.GetCountAsync(input.Filter, input.BlogId, input.AuthorId, tagId: input.TagId); diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/ar.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/ar.json index c86c314d87..6b608eb8bd 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/ar.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/ar.json @@ -28,6 +28,9 @@ "CmsKit:MarkedItem:0001": "لا يمكن أن تمييز الكيان {EntityType}.", "CmsKit:MarkedItem:0002": "لم يتم العثور على تعريف لنوع الكيان '{EntityType}'.", "CmsKit:MarkedItem:0003": "يوجد بالفعل تعريف لنوع الكيان '{EntityType}'. يجب أن يكون لكل نوع كيان تعريف واحد فقط.", + "ToggleFavorite": "تفضيل/إلغاء", + "FavoritesFilterMessage": "يرجى تسجيل الدخول لتصفية المفضلات الخاصة بك", + "FilterOnFavorites": "تصفية المفضلات", "CmsKit:Tag:0002": "الكيان غير قابل للوسم!", "CommentAuthorizationExceptionMessage": "هذه التعليقات غير مسموح بها للعرض العام.", "CommentDeletionConfirmationMessage": "سيتم حذف هذا التعليق وجميع الردود!", diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json index 149f1072bf..5719eceb27 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json @@ -27,6 +27,9 @@ "CmsKit:Reaction:0001": "The entity {EntityType} can't have reactions.", "CmsKit:Tag:0002": "The entity is not taggable!", "CmsKit:MarkedItem:ToggleConfirmation": "Are you sure you want to toggle the marked item?", + "ToggleFavorite": "Add/Remove Favorite", + "FavoritesFilterMessage": "Please log in to filter your favorites", + "FilterOnFavorites": "Filter On Favorites", "CommentAuthorizationExceptionMessage": "Those comments are not allowed for public display.", "CmsKit:Modals:Login": "Login", "CmsKit:Modals:LoginModalDefaultMessage": "Please login to continue!", diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/IBlogPostRepository.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/IBlogPostRepository.cs index 404d21dc83..b66066378e 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 @@ -14,6 +14,7 @@ public interface IBlogPostRepository : IBasicRepository Guid? blogId = null, Guid? authorId = null, Guid? tagId = null, + Guid? favoriteUserId = null, BlogPostStatus? statusFilter = null, CancellationToken cancellationToken = default); @@ -22,6 +23,7 @@ public interface IBlogPostRepository : IBasicRepository Guid? blogId = null, Guid? authorId = null, Guid? tagId = null, + Guid? favoriteUserId = null, BlogPostStatus? statusFilter = null, int maxResultCount = int.MaxValue, int skipCount = 0, diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/CmsKitDomainModule.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/CmsKitDomainModule.cs index e3824063e6..10ffbf964b 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/CmsKitDomainModule.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/CmsKitDomainModule.cs @@ -12,6 +12,7 @@ using Volo.CmsKit.Blogs; using Volo.CmsKit.Comments; using Volo.CmsKit.GlobalFeatures; using Volo.CmsKit.Localization; +using Volo.CmsKit.MarkedItems; using Volo.CmsKit.MediaDescriptors; using Volo.CmsKit.Menus; using Volo.CmsKit.Pages; @@ -91,6 +92,24 @@ public class CmsKitDomainModule : AbpModule { // TODO: Configure TagEntityTypes here... } + + if (GlobalFeatureManager.Instance.IsEnabled()) + { + Configure(options => + { + if (GlobalFeatureManager.Instance.IsEnabled()) + { + options.EntityTypes.Add( + new MarkedItemEntityTypeDefinition( + BlogPostConsts.EntityType, + StandardMarkedItems.Favorite + ) + ); + } + + // TODO: Add more entities that can be marked. + }); + } } public override void PostConfigureServices(ServiceConfigurationContext context) diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/MarkedItems/MarkedItemManager.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/MarkedItems/MarkedItemManager.cs index 15c858f5c4..bb9f884dba 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/MarkedItems/MarkedItemManager.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/MarkedItems/MarkedItemManager.cs @@ -2,6 +2,8 @@ using JetBrains.Annotations; using System.Threading.Tasks; using Volo.Abp; +using System.Collections.Generic; +using System.Threading; namespace Volo.CmsKit.MarkedItems; public class MarkedItemManager : CmsKitDomainServiceBase @@ -20,7 +22,7 @@ public class MarkedItemManager : CmsKitDomainServiceBase public virtual async Task ToggleUserMarkedItemAsync( Guid creatorId, - [NotNull] string entityType, + [NotNull] string entityType, [NotNull] string entityId) { Check.NotNullOrWhiteSpace(entityType, nameof(entityType)); @@ -49,4 +51,12 @@ public class MarkedItemManager : CmsKitDomainServiceBase ); return true; } + public async Task> GetEntityIdsFilteredByUserAsync( + [NotNull] Guid userId, + [NotNull] string entityType, + [CanBeNull] Guid? tenantId = null, + CancellationToken cancellationToken = default) + { + return await UserMarkedItemRepository.GetEntityIdsFilteredByUserAsync(userId, entityType, tenantId, cancellationToken); + } } diff --git a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Blogs/EfCoreBlogPostRepository.cs b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Blogs/EfCoreBlogPostRepository.cs index 266a04a910..ccebbdff10 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,6 +11,7 @@ using Volo.Abp.Domain.Entities; using Volo.Abp.Domain.Repositories.EntityFrameworkCore; using Volo.Abp.EntityFrameworkCore; using Volo.CmsKit.EntityFrameworkCore; +using Volo.CmsKit.MarkedItems; using Volo.CmsKit.Tags; using Volo.CmsKit.Users; @@ -18,12 +19,15 @@ namespace Volo.CmsKit.Blogs; public class EfCoreBlogPostRepository : EfCoreRepository, IBlogPostRepository { + private readonly MarkedItemManager _markedItemManager; private EntityTagManager _entityTagManager; public EfCoreBlogPostRepository( IDbContextProvider dbContextProvider, + MarkedItemManager markedItemManager, EntityTagManager entityTagManager) : base(dbContextProvider) { + _markedItemManager = markedItemManager; _entityTagManager = entityTagManager; } @@ -50,17 +54,21 @@ public class EfCoreBlogPostRepository : EfCoreRepository entityIdFilters = null; - if (tagId.HasValue) - { - entityIdFilters = await _entityTagManager.GetEntityIdsFilteredByTagAsync(tagId.Value, CurrentTenant.Id, cancellationToken); - } + var tagFilteredEntityIds = tagId.HasValue + ? await _entityTagManager.GetEntityIdsFilteredByTagAsync(tagId.Value, CurrentTenant.Id, cancellationToken) + : null; + + var favoriteUserFilteredEntityIds = favoriteUserId.HasValue + ? await _markedItemManager.GetEntityIdsFilteredByUserAsync(favoriteUserId.Value, BlogPostConsts.EntityType) + : null; var queryable = (await GetDbSetAsync()) - .WhereIf(entityIdFilters != null, x => entityIdFilters.Contains(x.Id.ToString())) + .WhereIf(tagFilteredEntityIds != null, x => tagFilteredEntityIds.Contains(x.Id.ToString())) + .WhereIf(favoriteUserFilteredEntityIds != null, x => favoriteUserFilteredEntityIds.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) @@ -75,6 +83,7 @@ public class EfCoreBlogPostRepository : EfCoreRepository(); var usersDbSet = dbContext.Set(); - List entityIdFilters = null; - if (tagId.HasValue) - { - entityIdFilters = await _entityTagManager.GetEntityIdsFilteredByTagAsync(tagId.Value, CurrentTenant.Id, cancellationToken); - } + var tagFilteredEntityIds = tagId.HasValue + ? await _entityTagManager.GetEntityIdsFilteredByTagAsync(tagId.Value, CurrentTenant.Id, cancellationToken) + : null; + + var favoriteUserFilteredEntityIds = favoriteUserId.HasValue + ? await _markedItemManager.GetEntityIdsFilteredByUserAsync(favoriteUserId.Value, BlogPostConsts.EntityType) + : null; var queryable = (await GetDbSetAsync()) - .WhereIf(entityIdFilters != null, x => entityIdFilters.Contains(x.Id.ToString())) + .WhereIf(tagFilteredEntityIds != null, x => tagFilteredEntityIds.Contains(x.Id.ToString())) + .WhereIf(favoriteUserFilteredEntityIds != null, x => favoriteUserFilteredEntityIds.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/Blogs/MongoBlogPostRepository.cs b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Blogs/MongoBlogPostRepository.cs index d3ae31926b..b07c2cdee2 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,6 +12,7 @@ using Volo.Abp.Domain.Entities; using Volo.Abp.Domain.Repositories.MongoDB; using Volo.Abp.MongoDB; using Volo.CmsKit.Blogs; +using Volo.CmsKit.MarkedItems; using Volo.CmsKit.Tags; using Volo.CmsKit.Users; @@ -19,10 +20,15 @@ namespace Volo.CmsKit.MongoDB.Blogs; public class MongoBlogPostRepository : MongoDbRepository, IBlogPostRepository { + private readonly MarkedItemManager _markedItemManager; private EntityTagManager _entityTagManager; - public MongoBlogPostRepository(IMongoDbContextProvider dbContextProvider, EntityTagManager entityTagManager) : base( + public MongoBlogPostRepository( + IMongoDbContextProvider dbContextProvider, + MarkedItemManager markedItemManager, + EntityTagManager entityTagManager) : base( dbContextProvider) { + _markedItemManager = markedItemManager; _entityTagManager = entityTagManager; } @@ -48,15 +54,19 @@ public class MongoBlogPostRepository : MongoDbRepository>(entityIdFilters.Any(), x => entityIdFilters.Contains(x.Id)) + .WhereIf>(tagFilteredEntityIds.Any(), x => tagFilteredEntityIds.Contains(x.Id)) + .WhereIf>(favoriteUserFilteredEntityIds.Any(), x => favoriteUserFilteredEntityIds.Contains(x.Id)) .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) @@ -69,6 +79,7 @@ public class MongoBlogPostRepository : MongoDbRepository().AsQueryable(); var queryable = blogPostQueryable - .WhereIf(entityIdFilters.Any(), x => entityIdFilters.Contains(x.Id)) + .WhereIf(tagFilteredEntityIds.Any(), x => tagFilteredEntityIds.Contains(x.Id)) + .WhereIf(favoriteUserFilteredEntityIds.Any(), x => favoriteUserFilteredEntityIds.Contains(x.Id)) .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) @@ -132,6 +146,28 @@ public class MongoBlogPostRepository : MongoDbRepository> GetFavoriteEntityIdsByUserId(Guid? userId, CancellationToken cancellationToken) + { + var entityIdFilters = new List(); + if (!userId.HasValue) + { + return entityIdFilters; + } + + var entityIds = + await _markedItemManager.GetEntityIdsFilteredByUserAsync(userId.Value, BlogPostConsts.EntityType, CurrentTenant.Id, cancellationToken); + + foreach (var entityId in entityIds) + { + if (Guid.TryParse(entityId, out var parsedEntityId)) + { + entityIdFilters.Add(parsedEntityId); + } + } + + return entityIdFilters; + } + public virtual async Task SlugExistsAsync(Guid blogId, [NotNull] string slug, CancellationToken cancellationToken = default) { 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 5e3ffe9311..762d8663d6 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 @@ -8,4 +8,5 @@ public class BlogPostGetListInput : PagedAndSortedResultRequestDto public Guid? AuthorId { get; set; } public Guid? TagId { get; set; } + public bool? FilterOnFavorites { 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 9b831ca8a6..561b6a9bcb 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 @@ -54,7 +54,10 @@ public class BlogPostPublicAppService : CmsKitPublicAppServiceBase, IBlogPostPub { var blog = await BlogRepository.GetBySlugAsync(blogSlug); + Guid? favoriteUserId = await GetFavoriteUserIdAsync(input.FilterOnFavorites); + var blogPosts = await BlogPostRepository.GetListAsync(null, blog.Id, input.AuthorId, input.TagId, + favoriteUserId, BlogPostStatus.Published, input.MaxResultCount, input.SkipCount, input.Sorting); @@ -100,4 +103,14 @@ public class BlogPostPublicAppService : CmsKitPublicAppServiceBase, IBlogPostPub return tag.Name; } + + protected virtual async Task GetFavoriteUserIdAsync(bool? filterOnFavorites) + { + if (!filterOnFavorites.GetValueOrDefault() || !CurrentUser.IsAuthenticated) + { + return null; + } + + return CurrentUser.GetId(); + } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/Index.cshtml b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/Index.cshtml index 6074ed573f..f2c40a647e 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/Index.cshtml +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/Index.cshtml @@ -1,6 +1,10 @@ @page +@using Volo.CmsKit.Blogs @using Volo.CmsKit.Public.Web.Pages +@using Volo.Abp.GlobalFeatures +@using Volo.CmsKit.GlobalFeatures +@using Volo.CmsKit.Public.Web.Pages.CmsKit.Shared.Components.MarkedItemToggle @using Volo.CmsKit.Public.Web.Pages.Public.CmsKit.Blogs @using Volo.CmsKit.Web @@ -8,6 +12,11 @@ @model IndexModel +@{ + const string dummyImageSource = "/cms-kit/dummy-placeholder-320x180.png"; + var isMarkedItemFeatureEnabled = GlobalFeatureManager.Instance.IsEnabled(); +} + @section styles { } @@ -15,13 +24,13 @@ @section scripts { + @if (isMarkedItemFeatureEnabled) + { + + } } -@{ - const string dummyImageSource = "/cms-kit/dummy-placeholder-320x180.png"; -} - @if (Model.AuthorId.HasValue) { @@ -61,11 +70,37 @@ @if (Model.Blogs.TotalCount > 0) { + @if (isMarkedItemFeatureEnabled) + { + var filterOnFavorties = Model.FilterOnFavorites.GetValueOrDefault(); + string icon = filterOnFavorties ? "heart" : "heart-o"; + + + + } @foreach (var blog in Model.Blogs.Items) { + @if (isMarkedItemFeatureEnabled) + { +
+ + @await Component.InvokeAsync(typeof(MarkedItemToggleViewComponent), new + { + entityId = blog.Id.ToString(), + entityType = BlogPostConsts.EntityType + }) + +
+ } @if (blog.CoverImageMediaId != null) { 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 e47dd40816..4375f93a40 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 @@ -22,6 +22,9 @@ public class IndexModel : CmsKitPublicPageModelBase [BindProperty(SupportsGet = true)] public Guid? AuthorId { get; set; } + [BindProperty(SupportsGet = true)] + public bool? FilterOnFavorites { get; set; } + [BindProperty(SupportsGet = true)] public Guid? TagId { get; set; } @@ -49,7 +52,8 @@ public class IndexModel : CmsKitPublicPageModelBase SkipCount = PageSize * (CurrentPage - 1), MaxResultCount = PageSize, AuthorId = AuthorId, - TagId = TagId + TagId = TagId, + FilterOnFavorites = FilterOnFavorites }); if (AuthorId != null) diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/filter-on-favorites.js b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/filter-on-favorites.js new file mode 100644 index 0000000000..0fb87bc0ef --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/filter-on-favorites.js @@ -0,0 +1,27 @@ +$(function () { + var l = abp.localization.getResource('CmsKit'); + + let filterButton = $('.favorite-button'); + let filterOnFavorites = filterButton.attr('filter-on-favorites'); + const loginModal = new abp.ModalManager(abp.appPath + 'CmsKit/Shared/Modals/Login/LoginModal'); + + $('.favorite-button').on('click', function () { + if (!abp.currentUser.isAuthenticated) { + const currentPageRoute = window.location.pathname; + loginModal.open({ message: l("FavoritesFilterMessage"), returnUrl: currentPageRoute }); + return; + } + + let currentUrl = new URL(window.location.href); + let searchParams = currentUrl.searchParams; + + // Toggle the 'filterOnFavorites' parameter + if (filterOnFavorites) { + searchParams.delete('filterOnFavorites'); + } else { + searchParams.set('filterOnFavorites', 'true'); + } + + window.location.href = currentUrl.pathname + '?' + searchParams.toString(); + }); +}); \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/index.css b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/index.css index e9a4f2fa19..83b1e8482c 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/index.css +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/index.css @@ -17,4 +17,9 @@ display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 3; +} + +.favorite-toggle { + width: 40px; + height: 40px; } \ No newline at end of file