Browse Source

Merge pull request #18782 from abpframework/cmskit-menuitem-page-relation

CMSKit - MenuItem & Page relation enhancements
pull/18861/head
liangshiwei 3 years ago
committed by GitHub
parent
commit
e1585d5744
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 2
      modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Menus/IMenuItemAdminAppService.cs
  2. 10
      modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Menus/MenuItemWithDetailsDto.cs
  3. 3
      modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/CmsKitAdminApplicationAutoMapperProfile.cs
  4. 15
      modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Menus/MenuItemAdminAppService.cs
  5. 4
      modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi.Client/ClientProxies/Volo/CmsKit/Admin/Menus/MenuItemAdminClientProxy.Generated.cs
  6. 3104
      modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi.Client/ClientProxies/cms-kit-admin-generate-proxy.json
  7. 2
      modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Menus/MenuItemAdminController.cs
  8. 3
      modules/cms-kit/src/Volo.CmsKit.Admin.Web/CmsKitAdminWebAutoMapperProfile.cs
  9. 45
      modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Menus/MenuItems/CreateModal.cshtml
  10. 26
      modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Menus/MenuItems/CreateModal.cshtml.cs
  11. 45
      modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Menus/MenuItems/UpdateModal.cshtml
  12. 21
      modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Menus/MenuItems/UpdateModal.cshtml.cs
  13. 26
      modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Menus/MenuItems/createModal.js
  14. 20
      modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Menus/MenuItems/updateModal.js
  15. 2
      modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Menus/MenuItem.cs
  16. 6
      modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Menus/MenuItemManager.cs
  17. 2
      modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Pages/IPageRepository.cs
  18. 5
      modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Pages/EfCorePageRepository.cs
  19. 6
      modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Pages/MongoPageRepository.cs
  20. 36
      modules/cms-kit/test/Volo.CmsKit.Application.Tests/Menus/MenuItemAdminAppService_Tests.cs
  21. 14
      modules/cms-kit/test/Volo.CmsKit.Domain.Tests/Menus/MenuManager_Test.cs
  22. 17
      modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitDataSeedContributor.cs
  23. 4
      modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitTestData.cs
  24. 19
      modules/cms-kit/test/Volo.CmsKit.TestBase/Pages/PageRepository_Test.cs

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

@ -10,7 +10,7 @@ public interface IMenuItemAdminAppService : IApplicationService
{ {
Task<ListResultDto<MenuItemDto>> GetListAsync(); Task<ListResultDto<MenuItemDto>> GetListAsync();
Task<MenuItemDto> GetAsync(Guid id); Task<MenuItemWithDetailsDto> GetAsync(Guid id);
Task<MenuItemDto> CreateAsync(MenuItemCreateInput input); Task<MenuItemDto> CreateAsync(MenuItemCreateInput input);

10
modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Menus/MenuItemWithDetailsDto.cs

@ -0,0 +1,10 @@
using System;
using Volo.CmsKit.Menus;
namespace Volo.CmsKit.Admin.Menus;
[Serializable]
public class MenuItemWithDetailsDto : MenuItemDto
{
public string? PageTitle { get; set; }
}

3
modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/CmsKitAdminApplicationAutoMapperProfile.cs

@ -46,5 +46,8 @@ public class CmsKitAdminApplicationAutoMapperProfile : Profile
CreateMap<MediaDescriptor, MediaDescriptorDto>().MapExtraProperties(); CreateMap<MediaDescriptor, MediaDescriptorDto>().MapExtraProperties();
CreateMap<MenuItem, MenuItemDto>().MapExtraProperties(); CreateMap<MenuItem, MenuItemDto>().MapExtraProperties();
CreateMap<MenuItem, MenuItemWithDetailsDto>()
.Ignore(x => x.PageTitle)
.MapExtraProperties();
} }
} }

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

@ -43,10 +43,17 @@ public class MenuItemAdminAppService : CmsKitAdminAppServiceBase, IMenuItemAdmin
); );
} }
public virtual async Task<MenuItemDto> GetAsync(Guid id) public virtual async Task<MenuItemWithDetailsDto> GetAsync(Guid id)
{ {
var menu = await MenuItemRepository.GetAsync(id); var menuItem = await MenuItemRepository.GetAsync(id);
return ObjectMapper.Map<MenuItem, MenuItemDto>(menu); var dto = ObjectMapper.Map<MenuItem, MenuItemWithDetailsDto>(menuItem);
if (menuItem.PageId.HasValue)
{
dto.PageTitle = await PageRepository.FindTitleAsync(menuItem.PageId.Value);
}
return dto;
} }
[Authorize(CmsKitAdminPermissions.Menus.Create)] [Authorize(CmsKitAdminPermissions.Menus.Create)]
@ -87,7 +94,7 @@ public class MenuItemAdminAppService : CmsKitAdminAppServiceBase, IMenuItemAdmin
} }
else else
{ {
menuItem.SetUrl(input.Url); MenuManager.SetPageUrl(menuItem, input.Url);
} }
menuItem.SetDisplayName(input.DisplayName); menuItem.SetDisplayName(input.DisplayName);

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

@ -23,9 +23,9 @@ public partial class MenuItemAdminClientProxy : ClientProxyBase<IMenuItemAdminAp
return await RequestAsync<ListResultDto<MenuItemDto>>(nameof(GetListAsync)); return await RequestAsync<ListResultDto<MenuItemDto>>(nameof(GetListAsync));
} }
public virtual async Task<MenuItemDto> GetAsync(Guid id) public virtual async Task<MenuItemWithDetailsDto> GetAsync(Guid id)
{ {
return await RequestAsync<MenuItemDto>(nameof(GetAsync), new ClientProxyRequestTypeValue return await RequestAsync<MenuItemWithDetailsDto>(nameof(GetAsync), new ClientProxyRequestTypeValue
{ {
{ typeof(Guid), id } { typeof(Guid), id }
}); });

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

File diff suppressed because it is too large

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

@ -36,7 +36,7 @@ public class MenuItemAdminController : CmsKitAdminController, IMenuItemAdminAppS
[HttpGet] [HttpGet]
[Route("{id}")] [Route("{id}")]
public virtual Task<MenuItemDto> GetAsync(Guid id) public virtual Task<MenuItemWithDetailsDto> GetAsync(Guid id)
{ {
return MenuItemAdminAppService.GetAsync(id); return MenuItemAdminAppService.GetAsync(id);
} }

3
modules/cms-kit/src/Volo.CmsKit.Admin.Web/CmsKitAdminWebAutoMapperProfile.cs

@ -1,4 +1,5 @@
using AutoMapper; using AutoMapper;
using Volo.Abp.AutoMapper;
using Volo.CmsKit.Admin.Blogs; using Volo.CmsKit.Admin.Blogs;
using Volo.CmsKit.Admin.Menus; using Volo.CmsKit.Admin.Menus;
using Volo.CmsKit.Admin.Pages; using Volo.CmsKit.Admin.Pages;
@ -37,7 +38,7 @@ public class CmsKitAdminWebAutoMapperProfile : Profile
{ {
CreateMap<Volo.CmsKit.Admin.Web.Pages.CmsKit.Menus.MenuItems.CreateModalModel.MenuItemCreateViewModel, MenuItemCreateInput>().MapExtraProperties(); CreateMap<Volo.CmsKit.Admin.Web.Pages.CmsKit.Menus.MenuItems.CreateModalModel.MenuItemCreateViewModel, MenuItemCreateInput>().MapExtraProperties();
CreateMap<Volo.CmsKit.Admin.Web.Pages.CmsKit.Menus.MenuItems.UpdateModalModel.MenuItemUpdateViewModel, MenuItemUpdateInput>().MapExtraProperties(); CreateMap<Volo.CmsKit.Admin.Web.Pages.CmsKit.Menus.MenuItems.UpdateModalModel.MenuItemUpdateViewModel, MenuItemUpdateInput>().MapExtraProperties();
CreateMap<MenuItemDto, Volo.CmsKit.Admin.Web.Pages.CmsKit.Menus.MenuItems.UpdateModalModel.MenuItemUpdateViewModel>().MapExtraProperties(); CreateMap<MenuItemWithDetailsDto, Volo.CmsKit.Admin.Web.Pages.CmsKit.Menus.MenuItems.UpdateModalModel.MenuItemUpdateViewModel>().MapExtraProperties();
} }
protected virtual void CreatePageMappings() protected virtual void CreatePageMappings()

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

@ -19,28 +19,45 @@
Layout = null; Layout = null;
} }
<form asp-page="/CmsKit/Menus/MenuItems/CreateModal"> <form id="menu-item-form" asp-page="/CmsKit/Menus/MenuItems/CreateModal">
<abp-modal id="menu-create-modal"> <abp-modal id="menu-create-modal">
<abp-modal-header title="@L["New"].Value"></abp-modal-header> <abp-modal-header title="@L["New"].Value"></abp-modal-header>
<abp-modal-body> <abp-modal-body>
<abp-tabs tab-style="Tab"> @if (Model.IsPageFeatureEnabled)
<abp-tab name="url" title="@L["Url"]"> {
<abp-tabs tab-style="Tab">
<abp-input asp-for="ViewModel.Url"/> <abp-tab name="url" title="@L["Url"]">
<abp-input asp-for="ViewModel.Url" />
</abp-tab>
<abp-tab title="@L["Page"]">
<label class="form-label" asp-for="ViewModel.PageId"></label>
</abp-tab> <select asp-for="ViewModel.PageId"
<abp-tab title="@L["Page"]"> class="auto-complete-select"
data-autocomplete-api-url="/api/cms-kit-admin/menu-items/lookup/pages"
data-autocomplete-display-property="title"
data-autocomplete-value-property="id"
data-autocomplete-items-property="items"
data-autocomplete-filter-param-name="filter"
data-autocomplete-allow-clear="true"
data-autocomplete-parent-selector="#menu-create-modal">
</select>
<label class="form-label" asp-for="ViewModel.PageId"></label> <span asp-validation-for="ViewModel.PageId"></span>
</abp-tab>
<select class="form-control" asp-for="ViewModel.PageId"></select> </abp-tabs>
<hr />
<span asp-validation-for="ViewModel.PageId"></span> }
</abp-tab> else
{
<abp-input asp-for="ViewModel.Url" />
}
</abp-tabs>
<hr/>
<abp-input asp-for="ViewModel.ParentId"/> <abp-input asp-for="ViewModel.ParentId"/>
<abp-input asp-for="ViewModel.DisplayName"/> <abp-input asp-for="ViewModel.DisplayName"/>
<abp-input asp-for="ViewModel.IsActive"/> <abp-input asp-for="ViewModel.IsActive"/>

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

@ -1,35 +1,40 @@
using AutoMapper; using System;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form; using AutoMapper;
using Microsoft.AspNetCore.Mvc;
using Volo.Abp.Features;
using Volo.Abp.GlobalFeatures;
using Volo.Abp.ObjectExtending; using Volo.Abp.ObjectExtending;
using Volo.CmsKit.Admin.Menus; using Volo.CmsKit.Admin.Menus;
using Volo.CmsKit.Features;
using Volo.CmsKit.GlobalFeatures;
namespace Volo.CmsKit.Admin.Web.Pages.CmsKit.Menus.MenuItems; namespace Volo.CmsKit.Admin.Web.Pages.CmsKit.Menus.MenuItems;
public class CreateModalModel : CmsKitAdminPageModel public class CreateModalModel : CmsKitAdminPageModel
{ {
protected IMenuItemAdminAppService MenuAdminAppService { get; } protected IMenuItemAdminAppService MenuAdminAppService { get; }
protected IFeatureChecker FeatureChecker { get; }
[BindProperty] [BindProperty]
public MenuItemCreateViewModel ViewModel { get; set; } public MenuItemCreateViewModel ViewModel { get; set; }
public CreateModalModel(IMenuItemAdminAppService menuAdminAppService) public bool IsPageFeatureEnabled { get; set; }
public CreateModalModel(IMenuItemAdminAppService menuAdminAppService, IFeatureChecker featureChecker)
{ {
MenuAdminAppService = menuAdminAppService; MenuAdminAppService = menuAdminAppService;
FeatureChecker = featureChecker;
ViewModel = new MenuItemCreateViewModel(); ViewModel = new MenuItemCreateViewModel();
} }
public virtual Task OnGetAsync(Guid? parentId) public virtual async Task OnGetAsync(Guid? parentId)
{ {
ViewModel.ParentId = parentId; ViewModel.ParentId = parentId;
return Task.CompletedTask; IsPageFeatureEnabled = GlobalFeatureManager.Instance.IsEnabled<PagesFeature>()
&& await FeatureChecker.IsEnabledAsync(CmsKitFeatures.PageEnable);
} }
public virtual async Task<IActionResult> OnPostAsync() public virtual async Task<IActionResult> OnPostAsync()
@ -52,6 +57,7 @@ public class CreateModalModel : CmsKitAdminPageModel
public bool IsActive { get; set; } = true; public bool IsActive { get; set; } = true;
[Required]
public string Url { get; set; } public string Url { get; set; }
public Guid? PageId { get; set; } public Guid? PageId { get; set; }

45
modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Menus/MenuItems/UpdateModal.cshtml

@ -19,28 +19,49 @@
Layout = null; Layout = null;
} }
<form asp-page="/CmsKit/Menus/MenuItems/UpdateModal"> <form id="menu-item-form" asp-page="/CmsKit/Menus/MenuItems/UpdateModal">
<abp-modal id="menu-update-modal"> <abp-modal id="menu-update-modal">
<abp-modal-header title="@L["New"].Value"></abp-modal-header> <abp-modal-header title="@L["Edit"].Value"></abp-modal-header>
<abp-modal-body> <abp-modal-body>
<abp-input asp-for="Id"/> <abp-input asp-for="Id"/>
<abp-input asp-for="ViewModel.ConcurrencyStamp"/> <abp-input asp-for="ViewModel.ConcurrencyStamp"/>
<abp-tabs tab-style="Tab"> @if (Model.IsPageFeatureEnabled)
<abp-tab name="url" title="@L["Url"]"> {
<abp-input asp-for="ViewModel.Url"/> <abp-tabs tab-style="Tab">
<abp-tab name="url" title="@L["Url"]">
<abp-input asp-for="ViewModel.Url" />
</abp-tab>
<abp-tab title="@L["Page"]">
</abp-tab> <label class="form-label" asp-for="ViewModel.PageId"></label>
<abp-tab title="@L["Page"]">
<label class="form-label" asp-for="ViewModel.PageId"></label> <select asp-for="ViewModel.PageId"
class="auto-complete-select"
data-autocomplete-api-url="/api/cms-kit-admin/menu-items/lookup/pages"
data-autocomplete-display-property="title"
data-autocomplete-value-property="id"
data-autocomplete-items-property="items"
data-autocomplete-filter-param-name="filter"
data-autocomplete-allow-clear="true"
data-autocomplete-parent-selector="#menu-update-modal">
<select class="form-control" asp-for="ViewModel.PageId"></select> <!-- You can define selected option(s) here -->
</abp-tab> @if (Model.ViewModel.PageId.HasValue)
{
<option selected value="@Model.ViewModel.PageId">@Model.ViewModel.PageTitle</option>
}
</select>
</abp-tab>
</abp-tabs> </abp-tabs>
<hr/> <hr />
}
else
{
<abp-input asp-for="ViewModel.Url" />
}
<abp-input asp-for="ViewModel.DisplayName"/> <abp-input asp-for="ViewModel.DisplayName"/>
<abp-input asp-for="ViewModel.IsActive"/> <abp-input asp-for="ViewModel.IsActive"/>

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

@ -5,8 +5,12 @@ using AutoMapper;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages; using Microsoft.AspNetCore.Mvc.RazorPages;
using Volo.Abp.Domain.Entities; using Volo.Abp.Domain.Entities;
using Volo.Abp.Features;
using Volo.Abp.GlobalFeatures;
using Volo.Abp.ObjectExtending; using Volo.Abp.ObjectExtending;
using Volo.CmsKit.Admin.Menus; using Volo.CmsKit.Admin.Menus;
using Volo.CmsKit.Features;
using Volo.CmsKit.GlobalFeatures;
using Volo.CmsKit.Menus; using Volo.CmsKit.Menus;
namespace Volo.CmsKit.Admin.Web.Pages.CmsKit.Menus.MenuItems; namespace Volo.CmsKit.Admin.Web.Pages.CmsKit.Menus.MenuItems;
@ -14,6 +18,7 @@ namespace Volo.CmsKit.Admin.Web.Pages.CmsKit.Menus.MenuItems;
public class UpdateModalModel : CmsKitAdminPageModel public class UpdateModalModel : CmsKitAdminPageModel
{ {
protected IMenuItemAdminAppService MenuAdminAppService { get; } protected IMenuItemAdminAppService MenuAdminAppService { get; }
protected IFeatureChecker FeatureChecker { get; }
[BindProperty] [BindProperty]
public MenuItemUpdateViewModel ViewModel { get; set; } public MenuItemUpdateViewModel ViewModel { get; set; }
@ -22,16 +27,23 @@ public class UpdateModalModel : CmsKitAdminPageModel
[BindProperty(SupportsGet = true)] [BindProperty(SupportsGet = true)]
public Guid Id { get; set; } public Guid Id { get; set; }
public UpdateModalModel(IMenuItemAdminAppService menuAdminAppService) public bool IsPageFeatureEnabled { get; set; }
public UpdateModalModel(IMenuItemAdminAppService menuAdminAppService, IFeatureChecker featureChecker)
{ {
MenuAdminAppService = menuAdminAppService; MenuAdminAppService = menuAdminAppService;
FeatureChecker = featureChecker;
IsPageFeatureEnabled = GlobalFeatureManager.Instance.IsEnabled<PagesFeature>();
} }
public async Task OnGetAsync() public async Task OnGetAsync()
{ {
var menuItemDto = await MenuAdminAppService.GetAsync(Id); var menuItemDto = await MenuAdminAppService.GetAsync(Id);
ViewModel = ObjectMapper.Map<MenuItemDto, MenuItemUpdateViewModel>(menuItemDto); IsPageFeatureEnabled = GlobalFeatureManager.Instance.IsEnabled<PagesFeature>()
&& await FeatureChecker.IsEnabledAsync(CmsKitFeatures.PageEnable);
ViewModel = ObjectMapper.Map<MenuItemWithDetailsDto, MenuItemUpdateViewModel>(menuItemDto);
} }
public async Task<IActionResult> OnPostAsync() public async Task<IActionResult> OnPostAsync()
@ -43,8 +55,6 @@ public class UpdateModalModel : CmsKitAdminPageModel
return new OkObjectResult(result); return new OkObjectResult(result);
} }
[AutoMap(typeof(MenuItemDto))]
[AutoMap(typeof(MenuItemUpdateInput), ReverseMap = true)]
public class MenuItemUpdateViewModel : ExtensibleObject, IHasConcurrencyStamp public class MenuItemUpdateViewModel : ExtensibleObject, IHasConcurrencyStamp
{ {
[Required] [Required]
@ -52,6 +62,7 @@ public class UpdateModalModel : CmsKitAdminPageModel
public bool IsActive { get; set; } public bool IsActive { get; set; }
[Required]
public string Url { get; set; } public string Url { get; set; }
public string Icon { get; set; } public string Icon { get; set; }
@ -64,6 +75,8 @@ public class UpdateModalModel : CmsKitAdminPageModel
public Guid? PageId { get; set; } public Guid? PageId { get; set; }
public string? PageTitle { get; set; }
[HiddenInput] [HiddenInput]
public string ConcurrencyStamp { get; set; } public string ConcurrencyStamp { get; set; }
} }

26
modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Menus/MenuItems/createModal.js

@ -7,36 +7,22 @@ $(function () {
var $pageId = $('#ViewModel_PageId'); var $pageId = $('#ViewModel_PageId');
var $url = $('#ViewModel_Url'); var $url = $('#ViewModel_Url');
var $displayName = $('#ViewModel_DisplayName'); var $displayName = $('#ViewModel_DisplayName');
var $pageIdClearButton = $('#url-tab'); var $menuItemForm = $('#menu-item-form');
initSelectPageId();
$pageId.on('change', function (params) { $pageId.on('change', function (params) {
$url.prop('disabled', $pageId.val()); $url.prop('disabled', $pageId.val());
if ($pageId.val()) if ($pageId.val())
{ {
if (!$displayName.val()){ if (!$displayName.val()){
$displayName.val($pageId.text()); $displayName.val($pageId.text().trim());
} }
} }
}) })
$pageIdClearButton.click(function (){
$pageId.val('');
$pageId.trigger('change');
})
function initSelectPageId() {
$pageId.data('autocompleteApiUrl', '/api/cms-kit-admin/menu-items/lookup/pages');
$pageId.data('autocompleteDisplayProperty', 'title');
$pageId.data('autocompleteValueProperty', 'id');
$pageId.data('autocompleteItemsProperty', 'items');
$pageId.data('autocompleteFilterParamName', 'filter');
$pageId.data('autocompleteParentSelector', '#menu-create-modal');
abp.dom.initializers.initializeAutocompleteSelects($pageId); $menuItemForm.on('submit', function (e) {
} $('[href="#url"]').tab('show');
});
}; };
return { return {

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

@ -7,9 +7,7 @@ $(function () {
var $pageId = $('#ViewModel_PageId'); var $pageId = $('#ViewModel_PageId');
var $url = $('#ViewModel_Url'); var $url = $('#ViewModel_Url');
var $displayName = $('#ViewModel_DisplayName'); var $displayName = $('#ViewModel_DisplayName');
var $pageIdClearButton = $('#url-tab'); var $menuItemForm = $('#menu-item-form');
initSelectPageId();
$pageId.on('change', function (params) { $pageId.on('change', function (params) {
$url.prop('disabled', $pageId.val()); $url.prop('disabled', $pageId.val());
@ -23,21 +21,9 @@ $(function () {
$pageId.trigger('change'); $pageId.trigger('change');
$pageIdClearButton.click(function () { $menuItemForm.on('submit', function (e) {
$pageId.val(''); $('[href="#url"]').tab('show');
$pageId.trigger('change');
}); });
function initSelectPageId() {
$pageId.data('autocompleteApiUrl', '/api/cms-kit-admin/menu-items/lookup/pages');
$pageId.data('autocompleteDisplayProperty', 'title');
$pageId.data('autocompleteValueProperty', 'id');
$pageId.data('autocompleteItemsProperty', 'items');
$pageId.data('autocompleteFilterParamName', 'filter');
$pageId.data('autocompleteParentSelector', '#menu-update-modal');
abp.dom.initializers.initializeAutocompleteSelects($pageId);
}
}; };
return { return {

2
modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Menus/MenuItem.cs

@ -80,7 +80,7 @@ public class MenuItem : AuditedAggregateRoot<Guid>, IMultiTenant
Url = Check.NotNullOrEmpty(url, nameof(url), MenuItemConsts.MaxUrlLength); Url = Check.NotNullOrEmpty(url, nameof(url), MenuItemConsts.MaxUrlLength);
} }
internal void SetPageId(Guid pageId) internal void SetPageId(Guid? pageId)
{ {
PageId = pageId; PageId = pageId;
} }

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

@ -25,6 +25,12 @@ public class MenuItemManager : CmsKitDomainServiceBase
menuItem.SetUrl(page.Slug.EnsureStartsWith('/')); menuItem.SetUrl(page.Slug.EnsureStartsWith('/'));
} }
public virtual void SetPageUrl(MenuItem menuItem, string url)
{
menuItem.SetPageId(null);
menuItem.SetUrl(url);
}
[UnitOfWork] [UnitOfWork]
public virtual async Task MoveAsync(Guid menuItemId, Guid? newParentMenuItemId, int position = 0) public virtual async Task MoveAsync(Guid menuItemId, Guid? newParentMenuItemId, int position = 0)
{ {

2
modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Pages/IPageRepository.cs

@ -24,4 +24,6 @@ public interface IPageRepository : IBasicRepository<Page, Guid>
Task<bool> ExistsAsync(string slug, CancellationToken cancellationToken = default); Task<bool> ExistsAsync(string slug, CancellationToken cancellationToken = default);
Task<List<Page>> GetListOfHomePagesAsync(CancellationToken cancellationToken = default); Task<List<Page>> GetListOfHomePagesAsync(CancellationToken cancellationToken = default);
Task<string?> FindTitleAsync(Guid pageId, CancellationToken cancellationToken = default);
} }

5
modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Pages/EfCorePageRepository.cs

@ -68,4 +68,9 @@ public class EfCorePageRepository : EfCoreRepository<ICmsKitDbContext, Page, Gui
{ {
return GetListAsync(x => x.IsHomePage, cancellationToken: GetCancellationToken(cancellationToken)); return GetListAsync(x => x.IsHomePage, cancellationToken: GetCancellationToken(cancellationToken));
} }
public async Task<string?> FindTitleAsync(Guid pageId, CancellationToken cancellationToken = default)
{
return await (await GetDbSetAsync()).Where(x => x.Id == pageId).Select(x => x.Title).FirstOrDefaultAsync(cancellationToken);
}
} }

6
modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Pages/MongoPageRepository.cs

@ -76,4 +76,10 @@ public class MongoPageRepository : MongoDbRepository<ICmsKitMongoDbContext, Page
{ {
return GetListAsync(x => x.IsHomePage, cancellationToken: GetCancellationToken(cancellationToken)); return GetListAsync(x => x.IsHomePage, cancellationToken: GetCancellationToken(cancellationToken));
} }
public async Task<string?> FindTitleAsync(Guid pageId, CancellationToken cancellationToken = default)
{
return await (await GetMongoQueryableAsync(cancellationToken)).Where(x => x.Id == pageId).Select(x => x.Title)
.FirstOrDefaultAsync(cancellationToken);
}
} }

36
modules/cms-kit/test/Volo.CmsKit.Application.Tests/Menus/MenuItemAdminAppService_Tests.cs

@ -32,6 +32,15 @@ public class MenuItemAdminAppService_Tests : CmsKitApplicationTestBase
menu.ShouldNotBeNull(); menu.ShouldNotBeNull();
} }
[Fact]
public async Task GetAsync_PageTitleShouldBeCorrect_WithRelatedPage()
{
var menu = await MenuAdminAppService.GetAsync(TestData.MenuItem_4_With_Page_1_Id);
menu.ShouldNotBeNull();
menu.PageTitle.ShouldBe(TestData.Page_1_Title);
}
[Fact] [Fact]
public async Task GetListAsync_ShouldWorkProperly() public async Task GetListAsync_ShouldWorkProperly()
{ {
@ -39,7 +48,7 @@ public class MenuItemAdminAppService_Tests : CmsKitApplicationTestBase
result.ShouldNotBeNull(); result.ShouldNotBeNull();
result.Items.ShouldNotBeEmpty(); result.Items.ShouldNotBeEmpty();
result.Items.Count.ShouldBe(3); result.Items.Count.ShouldBe(4);
} }
[Fact] [Fact]
@ -48,7 +57,7 @@ public class MenuItemAdminAppService_Tests : CmsKitApplicationTestBase
var name = "My Awesome Menu"; var name = "My Awesome Menu";
var menu = await MenuAdminAppService.CreateAsync(new MenuItemCreateInput var menu = await MenuAdminAppService.CreateAsync(new MenuItemCreateInput
{ {
DisplayName = name DisplayName = name,
}); });
menu.ShouldNotBeNull(); menu.ShouldNotBeNull();
@ -77,6 +86,29 @@ public class MenuItemAdminAppService_Tests : CmsKitApplicationTestBase
menu.Url.ShouldBe(newUrl); menu.Url.ShouldBe(newUrl);
} }
[Fact]
public async Task UpdateAsync_ShouldRemoveRelation_WithoutPageId()
{
var newUrl = "/my-new-url";
await WithUnitOfWorkAsync(async () =>
{
await MenuAdminAppService.UpdateAsync(
TestData.MenuItem_4_With_Page_1_Id,
new MenuItemUpdateInput
{
DisplayName = TestData.MenuItem_4_With_Page_1_Name,
Url = newUrl,
PageId = null
});
});
var menu = await MenuRepository.FindAsync(TestData.MenuItem_4_With_Page_1_Id);
menu.ShouldNotBeNull();
menu.Url.ShouldBe(newUrl);
menu.PageId.ShouldBeNull();
}
[Fact] [Fact]
public async Task DeleteAsync_ShouldWorkProperly_WithExistingId() public async Task DeleteAsync_ShouldWorkProperly_WithExistingId()
{ {

14
modules/cms-kit/test/Volo.CmsKit.Domain.Tests/Menus/MenuManager_Test.cs

@ -35,6 +35,20 @@ public class MenuManager_Test : CmsKitDomainTestBase
menuItem.Url.ShouldBe(page.Slug.EnsureStartsWith('/')); menuItem.Url.ShouldBe(page.Slug.EnsureStartsWith('/'));
} }
[Fact]
public async Task SetPageUrl_ShouldSetUrlSameWithPage_WithStringUrl()
{
var newUrl = "/my-new-url";
var menuItem = await menuItemRepository.GetAsync(testData.MenuItem_4_With_Page_1_Id);
menuManager.SetPageUrl(menuItem, newUrl);
menuItem.Url.ShouldNotBeNullOrEmpty();
menuItem.Url.ShouldBe(newUrl);
menuItem.PageId.ShouldBeNull();
}
[Fact] [Fact]
public async Task MoveAsync_ShouldMoveCorrectly_UnderAnotherMenu() public async Task MoveAsync_ShouldMoveCorrectly_UnderAnotherMenu()
{ {

17
modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitDataSeedContributor.cs

@ -1,8 +1,9 @@
using Microsoft.Extensions.Options; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.Extensions.Options;
using Volo.Abp.BlobStoring; using Volo.Abp.BlobStoring;
using Volo.Abp.Data; using Volo.Abp.Data;
using Volo.Abp.DependencyInjection; using Volo.Abp.DependencyInjection;
@ -194,7 +195,8 @@ public class CmsKitDataSeedContributor : IDataSeedContributor, ITransientDepende
"comment", "comment",
null, null,
_cmsKitTestData.User1Id _cmsKitTestData.User1Id
){ IdempotencyToken = _cmsKitTestData.IdempotencyToken_1 }); )
{ IdempotencyToken = _cmsKitTestData.IdempotencyToken_1 });
await _commentRepository.InsertAsync(new Comment(_guidGenerator.Create(), await _commentRepository.InsertAsync(new Comment(_guidGenerator.Create(),
_cmsKitTestData.EntityType1, _cmsKitTestData.EntityType1,
@ -416,6 +418,13 @@ public class CmsKitDataSeedContributor : IDataSeedContributor, ITransientDepende
private async Task SeedMenusAsync() private async Task SeedMenusAsync()
{ {
var menuItem4 = new MenuItem(
_cmsKitTestData.MenuItem_4_With_Page_1_Id,
_cmsKitTestData.MenuItem_4_With_Page_1_Name,
_cmsKitTestData.Page_1_Slug.EnsureStartsWith('/'));
menuItem4.SetPageId(_cmsKitTestData.Page_1_Id);
await _menuItemRepository.InsertManyAsync(new[] await _menuItemRepository.InsertManyAsync(new[]
{ {
new MenuItem( new MenuItem(
@ -429,8 +438,8 @@ public class CmsKitDataSeedContributor : IDataSeedContributor, ITransientDepende
new MenuItem( new MenuItem(
_cmsKitTestData.MenuItem_3_Id, _cmsKitTestData.MenuItem_3_Id,
_cmsKitTestData.MenuItem_3_Name, _cmsKitTestData.MenuItem_3_Name,
_cmsKitTestData.MenuItem_3_Url) _cmsKitTestData.MenuItem_3_Url),
menuItem4
}); });
} }
} }

4
modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitTestData.cs

@ -128,6 +128,10 @@ public class CmsKitTestData : ISingletonDependency
public string MenuItem_3_Url { get; } = "/products"; public string MenuItem_3_Url { get; } = "/products";
public Guid MenuItem_4_With_Page_1_Id { get; } = Guid.NewGuid();
public string MenuItem_4_With_Page_1_Name { get; } = "Products";
public string PollName { get; } = "Poll"; public string PollName { get; } = "Poll";
public string WidgetName { get; } = "CmsPollByCode"; public string WidgetName { get; } = "CmsPollByCode";

19
modules/cms-kit/test/Volo.CmsKit.TestBase/Pages/PageRepository_Test.cs

@ -1,4 +1,5 @@
using System.Linq; using System;
using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using Shouldly; using Shouldly;
using Volo.Abp.Modularity; using Volo.Abp.Modularity;
@ -99,4 +100,20 @@ public abstract class PageRepository_Test<TStartupModule> : CmsKitTestBase<TStar
pages.ShouldBeEmpty(); pages.ShouldBeEmpty();
} }
[Fact]
public async Task ShouldFindTitleAsync()
{
var result = await _pageRepository.FindTitleAsync(_cmsKitTestData.Page_1_Id);
result.ShouldNotBeNull();
result.ShouldBe(_cmsKitTestData.Page_1_Title);
}
[Fact]
public async Task ShouldReturnNullFindTitleAsync()
{
var nonExistingId = Guid.NewGuid();
var result = await _pageRepository.FindTitleAsync(nonExistingId);
result.ShouldBeNull();
}
} }

Loading…
Cancel
Save