Browse Source

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

CMSKit - MenuItem & Page relation enhancements
pull/18861/head
liangshiwei 2 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<MenuItemDto> GetAsync(Guid id);
Task<MenuItemWithDetailsDto> GetAsync(Guid id);
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<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);
return ObjectMapper.Map<MenuItem, MenuItemDto>(menu);
var menuItem = await MenuItemRepository.GetAsync(id);
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)]
@ -87,7 +94,7 @@ public class MenuItemAdminAppService : CmsKitAdminAppServiceBase, IMenuItemAdmin
}
else
{
menuItem.SetUrl(input.Url);
MenuManager.SetPageUrl(menuItem, input.Url);
}
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));
}
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 }
});

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]
[Route("{id}")]
public virtual Task<MenuItemDto> GetAsync(Guid id)
public virtual Task<MenuItemWithDetailsDto> GetAsync(Guid id)
{
return MenuItemAdminAppService.GetAsync(id);
}

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

@ -1,4 +1,5 @@
using AutoMapper;
using Volo.Abp.AutoMapper;
using Volo.CmsKit.Admin.Blogs;
using Volo.CmsKit.Admin.Menus;
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.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()

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

@ -19,28 +19,45 @@
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-header title="@L["New"].Value"></abp-modal-header>
<abp-modal-body>
<abp-tabs tab-style="Tab">
<abp-tab name="url" title="@L["Url"]">
<abp-input asp-for="ViewModel.Url"/>
@if (Model.IsPageFeatureEnabled)
{
<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"]">
<label class="form-label" asp-for="ViewModel.PageId"></label>
</abp-tab>
<abp-tab title="@L["Page"]">
<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-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>
<span asp-validation-for="ViewModel.PageId"></span>
</abp-tab>
</abp-tabs>
<hr />
}
else
{
<abp-input asp-for="ViewModel.Url" />
}
</abp-tabs>
<hr/>
<abp-input asp-for="ViewModel.ParentId"/>
<abp-input asp-for="ViewModel.DisplayName"/>
<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 Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;
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.CmsKit.Admin.Menus;
using Volo.CmsKit.Features;
using Volo.CmsKit.GlobalFeatures;
namespace Volo.CmsKit.Admin.Web.Pages.CmsKit.Menus.MenuItems;
public class CreateModalModel : CmsKitAdminPageModel
{
protected IMenuItemAdminAppService MenuAdminAppService { get; }
protected IFeatureChecker FeatureChecker { get; }
[BindProperty]
public MenuItemCreateViewModel ViewModel { get; set; }
public CreateModalModel(IMenuItemAdminAppService menuAdminAppService)
public bool IsPageFeatureEnabled { get; set; }
public CreateModalModel(IMenuItemAdminAppService menuAdminAppService, IFeatureChecker featureChecker)
{
MenuAdminAppService = menuAdminAppService;
FeatureChecker = featureChecker;
ViewModel = new MenuItemCreateViewModel();
}
public virtual Task OnGetAsync(Guid? parentId)
public virtual async Task OnGetAsync(Guid? parentId)
{
ViewModel.ParentId = parentId;
return Task.CompletedTask;
IsPageFeatureEnabled = GlobalFeatureManager.Instance.IsEnabled<PagesFeature>()
&& await FeatureChecker.IsEnabledAsync(CmsKitFeatures.PageEnable);
}
public virtual async Task<IActionResult> OnPostAsync()
@ -52,6 +57,7 @@ public class CreateModalModel : CmsKitAdminPageModel
public bool IsActive { get; set; } = true;
[Required]
public string Url { 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;
}
<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-header title="@L["New"].Value"></abp-modal-header>
<abp-modal-header title="@L["Edit"].Value"></abp-modal-header>
<abp-modal-body>
<abp-input asp-for="Id"/>
<abp-input asp-for="ViewModel.ConcurrencyStamp"/>
<abp-tabs tab-style="Tab">
<abp-tab name="url" title="@L["Url"]">
<abp-input asp-for="ViewModel.Url"/>
@if (Model.IsPageFeatureEnabled)
{
<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>
<abp-tab title="@L["Page"]">
<label class="form-label" asp-for="ViewModel.PageId"></label>
<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>
</abp-tab>
<!-- You can define selected option(s) here -->
@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.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.RazorPages;
using Volo.Abp.Domain.Entities;
using Volo.Abp.Features;
using Volo.Abp.GlobalFeatures;
using Volo.Abp.ObjectExtending;
using Volo.CmsKit.Admin.Menus;
using Volo.CmsKit.Features;
using Volo.CmsKit.GlobalFeatures;
using Volo.CmsKit.Menus;
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
{
protected IMenuItemAdminAppService MenuAdminAppService { get; }
protected IFeatureChecker FeatureChecker { get; }
[BindProperty]
public MenuItemUpdateViewModel ViewModel { get; set; }
@ -22,16 +27,23 @@ public class UpdateModalModel : CmsKitAdminPageModel
[BindProperty(SupportsGet = true)]
public Guid Id { get; set; }
public UpdateModalModel(IMenuItemAdminAppService menuAdminAppService)
public bool IsPageFeatureEnabled { get; set; }
public UpdateModalModel(IMenuItemAdminAppService menuAdminAppService, IFeatureChecker featureChecker)
{
MenuAdminAppService = menuAdminAppService;
FeatureChecker = featureChecker;
IsPageFeatureEnabled = GlobalFeatureManager.Instance.IsEnabled<PagesFeature>();
}
public async Task OnGetAsync()
{
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()
@ -43,8 +55,6 @@ public class UpdateModalModel : CmsKitAdminPageModel
return new OkObjectResult(result);
}
[AutoMap(typeof(MenuItemDto))]
[AutoMap(typeof(MenuItemUpdateInput), ReverseMap = true)]
public class MenuItemUpdateViewModel : ExtensibleObject, IHasConcurrencyStamp
{
[Required]
@ -52,6 +62,7 @@ public class UpdateModalModel : CmsKitAdminPageModel
public bool IsActive { get; set; }
[Required]
public string Url { get; set; }
public string Icon { get; set; }
@ -64,6 +75,8 @@ public class UpdateModalModel : CmsKitAdminPageModel
public Guid? PageId { get; set; }
public string? PageTitle { get; set; }
[HiddenInput]
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 $url = $('#ViewModel_Url');
var $displayName = $('#ViewModel_DisplayName');
var $pageIdClearButton = $('#url-tab');
initSelectPageId();
var $menuItemForm = $('#menu-item-form');
$pageId.on('change', function (params) {
$url.prop('disabled', $pageId.val());
if ($pageId.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 {

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 $url = $('#ViewModel_Url');
var $displayName = $('#ViewModel_DisplayName');
var $pageIdClearButton = $('#url-tab');
initSelectPageId();
var $menuItemForm = $('#menu-item-form');
$pageId.on('change', function (params) {
$url.prop('disabled', $pageId.val());
@ -23,21 +21,9 @@ $(function () {
$pageId.trigger('change');
$pageIdClearButton.click(function () {
$pageId.val('');
$pageId.trigger('change');
$menuItemForm.on('submit', function (e) {
$('[href="#url"]').tab('show');
});
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 {

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);
}
internal void SetPageId(Guid pageId)
internal void SetPageId(Guid? 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('/'));
}
public virtual void SetPageUrl(MenuItem menuItem, string url)
{
menuItem.SetPageId(null);
menuItem.SetUrl(url);
}
[UnitOfWork]
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<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));
}
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));
}
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();
}
[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]
public async Task GetListAsync_ShouldWorkProperly()
{
@ -39,7 +48,7 @@ public class MenuItemAdminAppService_Tests : CmsKitApplicationTestBase
result.ShouldNotBeNull();
result.Items.ShouldNotBeEmpty();
result.Items.Count.ShouldBe(3);
result.Items.Count.ShouldBe(4);
}
[Fact]
@ -48,7 +57,7 @@ public class MenuItemAdminAppService_Tests : CmsKitApplicationTestBase
var name = "My Awesome Menu";
var menu = await MenuAdminAppService.CreateAsync(new MenuItemCreateInput
{
DisplayName = name
DisplayName = name,
});
menu.ShouldNotBeNull();
@ -77,6 +86,29 @@ public class MenuItemAdminAppService_Tests : CmsKitApplicationTestBase
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]
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('/'));
}
[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]
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.IO;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Extensions.Options;
using Volo.Abp.BlobStoring;
using Volo.Abp.Data;
using Volo.Abp.DependencyInjection;
@ -194,7 +195,8 @@ public class CmsKitDataSeedContributor : IDataSeedContributor, ITransientDepende
"comment",
null,
_cmsKitTestData.User1Id
){ IdempotencyToken = _cmsKitTestData.IdempotencyToken_1 });
)
{ IdempotencyToken = _cmsKitTestData.IdempotencyToken_1 });
await _commentRepository.InsertAsync(new Comment(_guidGenerator.Create(),
_cmsKitTestData.EntityType1,
@ -416,6 +418,13 @@ public class CmsKitDataSeedContributor : IDataSeedContributor, ITransientDepende
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[]
{
new MenuItem(
@ -429,8 +438,8 @@ public class CmsKitDataSeedContributor : IDataSeedContributor, ITransientDepende
new MenuItem(
_cmsKitTestData.MenuItem_3_Id,
_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 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 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 Shouldly;
using Volo.Abp.Modularity;
@ -99,4 +100,20 @@ public abstract class PageRepository_Test<TStartupModule> : CmsKitTestBase<TStar
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