Browse Source

CMS: Fix dynamic menu ordering

pull/23576/head
EngincanV 6 months ago
parent
commit
87efe7bf19
  1. 2
      modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Menus/IMenuItemAdminAppService.cs
  2. 8
      modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Menus/MenuItemAdminAppService.cs
  3. 8
      modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi.Client/ClientProxies/Volo/CmsKit/Admin/Menus/MenuItemAdminClientProxy.Generated.cs
  4. 54
      modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi.Client/ClientProxies/cms-kit-admin-generate-proxy.json
  5. 9
      modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Menus/MenuItemAdminController.cs
  6. 2
      modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Menus/MenuItems/CreateModal.cshtml.cs
  7. 20
      modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Menus/MenuItems/index.js
  8. 29
      modules/cms-kit/src/Volo.CmsKit.Admin.Web/wwwroot/client-proxies/cms-kit-admin-proxy.js
  9. 6
      modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Menus/IMenuItemRepository.cs
  10. 22
      modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Menus/EfCoreMenuItemRepository.cs
  11. 22
      modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Menus/MongoMenuItemRepository.cs
  12. 2
      modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Menus/MenuItemPublicAppService.cs

2
modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Menus/IMenuItemAdminAppService.cs

@ -23,4 +23,6 @@ public interface IMenuItemAdminAppService : IApplicationService
Task<PagedResultDto<PageLookupDto>> GetPageLookupAsync(PageLookupInputDto input);
Task<ListResultDto<PermissionLookupDto>> GetPermissionLookupAsync(PermissionLookupInputDto inputDto);
Task<int> GetAvailableMenuOrderAsync(Guid? parentId = null);
}

8
modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Menus/MenuItemAdminAppService.cs

@ -41,7 +41,7 @@ public class MenuItemAdminAppService : CmsKitAdminAppServiceBase, IMenuItemAdmin
public virtual async Task<ListResultDto<MenuItemDto>> GetListAsync()
{
var menuItems = await MenuItemRepository.GetListAsync();
var menuItems = await MenuItemRepository.GetOrderedListAsync();
return new ListResultDto<MenuItemDto>(
ObjectMapper.Map<List<MenuItem>, List<MenuItemDto>>(menuItems)
@ -162,4 +162,10 @@ public class MenuItemAdminAppService : CmsKitAdminAppServiceBase, IMenuItemAdmin
permissionLookupDtos
);
}
public async Task<int> GetAvailableMenuOrderAsync(Guid? parentId = null)
{
var highestOrder = await MenuItemRepository.GetHighestMenuOrderAsync(parentId);
return highestOrder + 1;
}
}

8
modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi.Client/ClientProxies/Volo/CmsKit/Admin/Menus/MenuItemAdminClientProxy.Generated.cs

@ -80,4 +80,12 @@ public partial class MenuItemAdminClientProxy : ClientProxyBase<IMenuItemAdminAp
{ typeof(PermissionLookupInputDto), inputDto }
});
}
public virtual async Task<int> GetAvailableMenuOrderAsync(Guid? parentId)
{
return await RequestAsync<int>(nameof(GetAvailableMenuOrderAsync), new ClientProxyRequestTypeValue
{
{ typeof(Guid?), parentId }
});
}
}

54
modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi.Client/ClientProxies/cms-kit-admin-generate-proxy.json

@ -2184,6 +2184,23 @@
"type": "Volo.Abp.Application.Dtos.ListResultDto<Volo.CmsKit.Admin.Menus.PermissionLookupDto>",
"typeSimple": "Volo.Abp.Application.Dtos.ListResultDto<Volo.CmsKit.Admin.Menus.PermissionLookupDto>"
}
},
{
"name": "GetAvailableMenuOrderAsync",
"parametersOnMethod": [
{
"name": "parentId",
"typeAsString": "System.Nullable`1[[System.Guid, System.Private.CoreLib, Version=9.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]], System.Private.CoreLib",
"type": "System.Guid?",
"typeSimple": "string?",
"isOptional": true,
"defaultValue": null
}
],
"returnValue": {
"type": "System.Int32",
"typeSimple": "number"
}
}
]
}
@ -2538,6 +2555,43 @@
},
"allowAnonymous": false,
"implementFrom": "Volo.CmsKit.Admin.Menus.IMenuItemAdminAppService"
},
"GetAvailableMenuOrderAsyncByParentId": {
"uniqueName": "GetAvailableMenuOrderAsyncByParentId",
"name": "GetAvailableMenuOrderAsync",
"httpMethod": "GET",
"url": "api/cms-kit-admin/menu-items/available-order",
"supportedVersions": [],
"parametersOnMethod": [
{
"name": "parentId",
"typeAsString": "System.Nullable`1[[System.Guid, System.Private.CoreLib, Version=9.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]], System.Private.CoreLib",
"type": "System.Guid?",
"typeSimple": "string?",
"isOptional": true,
"defaultValue": null
}
],
"parameters": [
{
"nameOnMethod": "parentId",
"name": "parentId",
"jsonName": null,
"type": "System.Guid?",
"typeSimple": "string?",
"isOptional": false,
"defaultValue": null,
"constraintTypes": null,
"bindingSourceId": "ModelBinding",
"descriptorName": ""
}
],
"returnValue": {
"type": "System.Int32",
"typeSimple": "number"
},
"allowAnonymous": false,
"implementFrom": "Volo.CmsKit.Admin.Menus.IMenuItemAdminAppService"
}
}
},

9
modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Menus/MenuItemAdminController.cs

@ -81,8 +81,15 @@ public class MenuItemAdminController : CmsKitAdminController, IMenuItemAdminAppS
[HttpGet]
[Route("lookup/permissions")]
public Task<ListResultDto<PermissionLookupDto>> GetPermissionLookupAsync(PermissionLookupInputDto inputDto)
public virtual Task<ListResultDto<PermissionLookupDto>> GetPermissionLookupAsync(PermissionLookupInputDto inputDto)
{
return MenuItemAdminAppService.GetPermissionLookupAsync(inputDto);
}
[HttpGet]
[Route("available-order")]
public virtual Task<int> GetAvailableMenuOrderAsync(Guid? parentId = null)
{
return MenuItemAdminAppService.GetAvailableMenuOrderAsync(parentId);
}
}

2
modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Menus/MenuItems/CreateModal.cshtml.cs

@ -39,6 +39,8 @@ public class CreateModalModel : CmsKitAdminPageModel
public virtual async Task<IActionResult> OnPostAsync()
{
ViewModel.Order = await MenuAdminAppService.GetAvailableMenuOrderAsync(ViewModel.ParentId);
var input = ObjectMapper.Map<MenuItemCreateViewModel, MenuItemCreateInput>(ViewModel);
var dto = await MenuAdminAppService.CreateAsync(input);

20
modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Menus/MenuItems/index.js

@ -263,11 +263,21 @@ $(function () {
},
sort: function (node1, node2) {
if (this.get_node(node2).original.order < this.get_node(node1).original.order) {
return 1;
}
return -1;
const node1Data = this.get_node(node1).original;
const node2Data = this.get_node(node2).original;
if (node1Data.parentId === null && node2Data.parentId !== null) {
return -1;
}
if (node1Data.parentId !== null && node2Data.parentId === null) {
return 1;
}
if (node1Data.order < node2Data.order) {
return -1;
}
if (node1Data.order > node2Data.order) {
return 1;
}
return 0;
},
plugins: [

29
modules/cms-kit/src/Volo.CmsKit.Admin.Web/wwwroot/client-proxies/cms-kit-admin-proxy.js

@ -49,6 +49,21 @@
}, ajaxParams));
};
volo.cmsKit.admin.blogs.blogAdmin.getAllList = function(ajaxParams) {
return abp.ajax($.extend(true, {
url: abp.appPath + 'api/cms-kit-admin/blogs/all',
type: 'GET'
}, ajaxParams));
};
volo.cmsKit.admin.blogs.blogAdmin.moveAllBlogPosts = function(blogId, assignToBlogId, id, ajaxParams) {
return abp.ajax($.extend(true, {
url: abp.appPath + 'api/cms-kit-admin/blogs/' + id + '/move-all-blog-posts' + abp.utils.buildQueryString([{ name: 'blogId', value: blogId }, { name: 'assignToBlogId', value: assignToBlogId }]) + '',
type: 'PUT',
dataType: null
}, ajaxParams));
};
})();
// controller volo.cmsKit.admin.blogs.blogFeatureAdmin
@ -330,6 +345,20 @@
}, ajaxParams));
};
volo.cmsKit.admin.menus.menuItemAdmin.getPermissionLookup = function(inputDto, ajaxParams) {
return abp.ajax($.extend(true, {
url: abp.appPath + 'api/cms-kit-admin/menu-items/lookup/permissions' + abp.utils.buildQueryString([{ name: 'filter', value: inputDto.filter }]) + '',
type: 'GET'
}, ajaxParams));
};
volo.cmsKit.admin.menus.menuItemAdmin.getAvailableMenuOrder = function(parentId, ajaxParams) {
return abp.ajax($.extend(true, {
url: abp.appPath + 'api/cms-kit-admin/menu-items/available-order' + abp.utils.buildQueryString([{ name: 'parentId', value: parentId }]) + '',
type: 'GET'
}, ajaxParams));
};
})();
// controller volo.cmsKit.admin.pages.pageAdmin

6
modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Menus/IMenuItemRepository.cs

@ -1,8 +1,14 @@
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using Volo.Abp.Domain.Repositories;
namespace Volo.CmsKit.Menus;
public interface IMenuItemRepository : IBasicRepository<MenuItem, Guid>
{
Task<List<MenuItem>> GetOrderedListAsync(bool includeDetails = false, CancellationToken cancellationToken = default);
Task<int> GetHighestMenuOrderAsync(Guid? parentId = null, CancellationToken cancellationToken = default);
}

22
modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Menus/EfCoreMenuItemRepository.cs

@ -1,4 +1,9 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using Volo.Abp.Domain.Repositories.EntityFrameworkCore;
using Volo.Abp.EntityFrameworkCore;
using Volo.CmsKit.EntityFrameworkCore;
@ -10,4 +15,21 @@ public class EfCoreMenuItemRepository : EfCoreRepository<ICmsKitDbContext, MenuI
public EfCoreMenuItemRepository(IDbContextProvider<ICmsKitDbContext> dbContextProvider) : base(dbContextProvider)
{
}
public virtual async Task<int> GetHighestMenuOrderAsync(Guid? parentId = null, CancellationToken cancellationToken = default)
{
return await (await GetDbSetAsync())
.WhereIf(parentId.HasValue, x => x.ParentId == parentId)
.OrderByDescending(x => x.Order)
.Select(x => x.Order)
.FirstOrDefaultAsync(GetCancellationToken(cancellationToken));
}
public virtual async Task<List<MenuItem>> GetOrderedListAsync(bool includeDetails = false, CancellationToken cancellationToken = default)
{
return await (await GetDbSetAsync())
.OrderBy(x => x.Order)
.ThenBy(x => x.CreationTime)
.ToListAsync(GetCancellationToken(cancellationToken));
}
}

22
modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Menus/MongoMenuItemRepository.cs

@ -1,7 +1,6 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using MongoDB.Driver;
@ -17,4 +16,25 @@ public class MongoMenuItemRepository : MongoDbRepository<ICmsKitMongoDbContext,
public MongoMenuItemRepository(IMongoDbContextProvider<ICmsKitMongoDbContext> dbContextProvider) : base(dbContextProvider)
{
}
public virtual async Task<int> GetHighestMenuOrderAsync(Guid? parentId = null, CancellationToken cancellationToken = default)
{
cancellationToken = GetCancellationToken(cancellationToken);
return await (await GetQueryableAsync(cancellationToken))
.WhereIf(parentId.HasValue, x => x.ParentId == parentId)
.OrderByDescending(x => x.Order)
.Select(x => x.Order)
.FirstOrDefaultAsync(cancellationToken);
}
public virtual async Task<List<MenuItem>> GetOrderedListAsync(bool includeDetails = false, CancellationToken cancellationToken = default)
{
cancellationToken = GetCancellationToken(cancellationToken);
return await (await GetQueryableAsync(cancellationToken))
.OrderBy(x => x.Order)
.ThenBy(x => x.CreationTime)
.ToListAsync(cancellationToken);
}
}

2
modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Menus/MenuItemPublicAppService.cs

@ -30,7 +30,7 @@ public class MenuItemPublicAppService : CmsKitPublicAppServiceBase, IMenuItemPub
MenuApplicationConsts.MainMenuCacheKey,
async () =>
{
var menuItems = await MenuItemRepository.GetListAsync();
var menuItems = await MenuItemRepository.GetOrderedListAsync();
if (menuItems == null)
{

Loading…
Cancel
Save