Browse Source

Merge pull request #9261 from abpframework/cms-kit/menu-management

Cms Kit menu management
pull/9349/head
Halil İbrahim Kalkan 5 years ago
committed by GitHub
parent
commit
35bbf0022a
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 10
      framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/AbpNavigationOptions.cs
  2. 2
      framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/IMenuManager.cs
  3. 53
      framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/MenuManager.cs
  4. 3
      framework/test/Volo.Abp.UI.Navigation.Tests/Volo/Abp/Ui/Navigation/AbpUiNavigationTestModule.cs
  5. 39
      framework/test/Volo.Abp.UI.Navigation.Tests/Volo/Abp/Ui/Navigation/MenuManager_Tests.cs
  6. 2
      modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.BasicTheme/Themes/Basic/NavMenu.razor.cs
  7. 2
      modules/basic-theme/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/Themes/Basic/Components/Menu/MainNavbarMenuViewComponent.cs
  8. 417
      modules/cms-kit/host/Volo.CmsKit.HttpApi.Host/Migrations/20210609081519_Initial.Designer.cs
  9. 207
      modules/cms-kit/host/Volo.CmsKit.HttpApi.Host/Migrations/20210609081519_Initial.cs
  10. 415
      modules/cms-kit/host/Volo.CmsKit.HttpApi.Host/Migrations/CmsKitHttpApiHostMigrationsDbContextModelSnapshot.cs
  11. 2022
      modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20210219113255_Initial.Designer.cs
  12. 2022
      modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20210219144454_BlogFeatureEnabledColumnRename.Designer.cs
  13. 23
      modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20210219144454_BlogFeatureEnabledColumnRename.cs
  14. 2018
      modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20210225092130_Page_Remove_Description.Designer.cs
  15. 24
      modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20210225092130_Page_Remove_Description.cs
  16. 2007
      modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20210226112040_BlogPost_Author.Designer.cs
  17. 109
      modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20210226112040_BlogPost_Author.cs
  18. 2012
      modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20210302064229_Added_EntityType_to_Media.Designer.cs
  19. 25
      modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20210302064229_Added_EntityType_to_Media.cs
  20. 2016
      modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20210302075529_Added_Content_To_BlogPost.Designer.cs
  21. 24
      modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20210302075529_Added_Content_To_BlogPost.cs
  22. 24
      modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20210302091451_Added_Content_To_Page.cs
  23. 1951
      modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20210305122554_BlogPost_CoverImage.Designer.cs
  24. 56
      modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20210305122554_BlogPost_CoverImage.cs
  25. 1957
      modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20210315123344_Page_StyleScript.Designer.cs
  26. 33
      modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20210315123344_Page_StyleScript.cs
  27. 150
      modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20210614072230_Initial.Designer.cs
  28. 136
      modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20210614072230_Initial.cs
  29. 143
      modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/UnifiedDbContextModelSnapshot.cs
  30. 2
      modules/cms-kit/host/Volo.CmsKit.Web.Unified/Properties/launchSettings.json
  31. 3
      modules/cms-kit/host/Volo.CmsKit.Web.Unified/package.json
  32. 8638
      modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/jstree/jstree.js
  33. 6
      modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/jstree/jstree.min.js
  34. BIN
      modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/jstree/themes/default-dark/32px.png
  35. BIN
      modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/jstree/themes/default-dark/40px.png
  36. 1146
      modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/jstree/themes/default-dark/style.css
  37. 1
      modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/jstree/themes/default-dark/style.min.css
  38. BIN
      modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/jstree/themes/default-dark/throbber.gif
  39. BIN
      modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/jstree/themes/default/32px.png
  40. BIN
      modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/jstree/themes/default/40px.png
  41. 1102
      modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/jstree/themes/default/style.css
  42. 1
      modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/jstree/themes/default/style.min.css
  43. BIN
      modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/jstree/themes/default/throbber.gif
  44. 20
      modules/cms-kit/host/Volo.CmsKit.Web.Unified/yarn.lock
  45. 36
      modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Menus/IMenuAdminAppService.cs
  46. 14
      modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Menus/MenuCreateInput.cs
  47. 32
      modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Menus/MenuItemCreateInput.cs
  48. 16
      modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Menus/MenuItemMoveInput.cs
  49. 26
      modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Menus/MenuItemUpdateInput.cs
  50. 14
      modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Menus/MenuUpdateInput.cs
  51. 12
      modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Menus/PageLookupDto.cs
  52. 11
      modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Menus/PageLookupInputDto.cs
  53. 10
      modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Menus/UpdateMainMenuInput.cs
  54. 1
      modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Pages/IPageAdminAppService.cs
  55. 10
      modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Permissions/CmsKitAdminPermissionDefinitionProvider.cs
  56. 8
      modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Permissions/CmsKitAdminPermissions.cs
  57. 12
      modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/CmsKitAdminApplicationAutoMapperProfile.cs
  58. 207
      modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Menus/MenuAdminAppService.cs
  59. 1
      modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Pages/PageAdminAppService.cs
  60. 123
      modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Menus/MenuAdminController.cs
  61. 1
      modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Pages/PageAdminController.cs
  62. 30
      modules/cms-kit/src/Volo.CmsKit.Admin.Web/CmsKitAdminWebModule.cs
  63. 8
      modules/cms-kit/src/Volo.CmsKit.Admin.Web/Menus/CmsKitAdminMenuContributor.cs
  64. 4
      modules/cms-kit/src/Volo.CmsKit.Admin.Web/Menus/CmsKitAdminMenus.cs
  65. 4
      modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Blogs/UpdateModal.cshtml.cs
  66. 23
      modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Menus/CreateModal.cshtml
  67. 44
      modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Menus/CreateModal.cshtml.cs
  68. 34
      modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Menus/Index.cshtml
  69. 13
      modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Menus/Index.cshtml.cs
  70. 49
      modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Menus/MenuItems/CreateModal.cshtml
  71. 75
      modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Menus/MenuItems/CreateModal.cshtml.cs
  72. 51
      modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Menus/MenuItems/Index.cshtml
  73. 31
      modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Menus/MenuItems/Index.cshtml.cs
  74. 47
      modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Menus/MenuItems/UpdateModal.cshtml
  75. 70
      modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Menus/MenuItems/UpdateModal.cshtml.cs
  76. 45
      modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Menus/MenuItems/createModal.js
  77. 1
      modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Menus/MenuItems/index.css
  78. 409
      modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Menus/MenuItems/index.js
  79. 46
      modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Menus/MenuItems/updateModal.js
  80. 23
      modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Menus/UpdateModal.cshtml
  81. 53
      modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Menus/UpdateModal.cshtml.cs
  82. 1
      modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Menus/createModal.js
  83. 118
      modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Menus/index.js
  84. 1
      modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Menus/updateModal.js
  85. 21
      modules/cms-kit/src/Volo.CmsKit.Common.Application.Contracts/Volo/CmsKit/Menus/MenuItemDto.cs
  86. 18
      modules/cms-kit/src/Volo.CmsKit.Common.Application.Contracts/Volo/CmsKit/Menus/MenuWithDetailsDto.cs
  87. 3
      modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/GlobalCmsKitFeatures.cs
  88. 17
      modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/MenuFeature.cs
  89. 24
      modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/de-DE.json
  90. 4
      modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en-GB.json
  91. 34
      modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json
  92. 40
      modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json
  93. 4
      modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/zh-Hans.json
  94. 4
      modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/zh-Hant.json
  95. 13
      modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Menus/MenuConsts.cs
  96. 8
      modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Menus/MenuItemConsts.cs
  97. 19
      modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Pages/PageConsts.cs
  98. 18
      modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Menus/IMenuRepository.cs
  99. 33
      modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Menus/Menu.cs
  100. 87
      modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Menus/MenuItem.cs

10
framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/AbpNavigationOptions.cs

@ -7,10 +7,20 @@ namespace Volo.Abp.UI.Navigation
{
[NotNull]
public List<IMenuContributor> MenuContributors { get; }
/// <summary>
/// Includes the <see cref="StandardMenus.Main"/> by default.
/// </summary>
public List<string> MainMenuNames { get; }
public AbpNavigationOptions()
{
MenuContributors = new List<IMenuContributor>();
MainMenuNames = new List<string>
{
StandardMenus.Main
};
}
}
}

2
framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/IMenuManager.cs

@ -5,5 +5,7 @@ namespace Volo.Abp.UI.Navigation
public interface IMenuManager
{
Task<ApplicationMenu> GetAsync(string name);
Task<ApplicationMenu> GetMainMenuAsync();
}
}

53
framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/MenuManager.cs

@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.Extensions.Options;
@ -24,7 +25,57 @@ namespace Volo.Abp.UI.Navigation
SimpleStateCheckerManager = simpleStateCheckerManager;
}
public async Task<ApplicationMenu> GetAsync(string name)
public Task<ApplicationMenu> GetAsync(string name)
{
return GetInternalAsync(name);
}
public Task<ApplicationMenu> GetMainMenuAsync()
{
return GetAsync(Options.MainMenuNames.ToArray());
}
protected virtual async Task<ApplicationMenu> GetAsync(params string[] menuNames)
{
if (menuNames.IsNullOrEmpty())
{
return new ApplicationMenu(StandardMenus.Main);
}
var menus = new List<ApplicationMenu>();
foreach (var menuName in Options.MainMenuNames)
{
menus.Add(await GetInternalAsync(menuName));
}
return MergeMenus(menus);
}
protected virtual ApplicationMenu MergeMenus(List<ApplicationMenu> menus)
{
Check.NotNullOrEmpty(menus, nameof(menus));
if (menus.Count == 1)
{
return menus[0];
}
var firstMenu = menus[0];
for (int i = 1; i < menus.Count; i++)
{
var currentMenu = menus[i];
foreach (var menuItem in currentMenu.Items)
{
firstMenu.AddItem(menuItem);
}
}
return firstMenu;
}
protected virtual async Task<ApplicationMenu> GetInternalAsync(string name)
{
var menu = new ApplicationMenu(name);

3
framework/test/Volo.Abp.UI.Navigation.Tests/Volo/Abp/Ui/Navigation/AbpUiNavigationTestModule.cs

@ -15,6 +15,9 @@ namespace Volo.Abp.UI.Navigation
{
options.MenuContributors.Add(new MenuManager_Tests.TestMenuContributor1());
options.MenuContributors.Add(new MenuManager_Tests.TestMenuContributor2());
options.MenuContributors.Add(new MenuManager_Tests.TestMenuContributor3());
options.MainMenuNames.Add(MenuManager_Tests.TestMenuContributor3.MenuName);
});
}
}

39
framework/test/Volo.Abp.UI.Navigation.Tests/Volo/Abp/Ui/Navigation/MenuManager_Tests.cs

@ -56,6 +56,19 @@ namespace Volo.Abp.UI.Navigation
// Administration.SubMenu1.1 and Administration.SubMenu1.2 are removed because of don't have permissions.
}
[Fact]
public async Task GetMainMenuAsync_ShouldMergeMultipleMenus()
{
var mainMenu = await _menuManager.GetMainMenuAsync();
mainMenu.Name.ShouldBe(StandardMenus.Main);
mainMenu.Items.Count.ShouldBe(3);
mainMenu.Items.ShouldContain(x => x.Name == "Products");
mainMenu.Items.ShouldContain(x => x.Name == "Dashboard");
}
/* Adds menu items:
* - Administration
* - User Management
@ -110,5 +123,31 @@ namespace Volo.Abp.UI.Navigation
return Task.CompletedTask;
}
}
/* Adds menu items:
* - Products
* - AspNetZero
* - ABP
*/
public class TestMenuContributor3 : IMenuContributor
{
public const string MenuName = "MenuThree";
public Task ConfigureMenuAsync(MenuConfigurationContext context)
{
if (context.Menu.Name != MenuName)
{
return Task.CompletedTask;
}
var products = new ApplicationMenuItem("Products", "Products", "/products");
context.Menu.Items.Add(products);
products.AddItem(new ApplicationMenuItem("AspNetZero", "AspNetZero", url: "/products/aspnetzero"));
products.AddItem(new ApplicationMenuItem("ABP", "ABP", url: "/products/abp"));
return Task.CompletedTask;
}
}
}
}

2
modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.BasicTheme/Themes/Basic/NavMenu.razor.cs

@ -13,7 +13,7 @@ namespace Volo.Abp.AspNetCore.Components.Web.BasicTheme.Themes.Basic
protected override async Task OnInitializedAsync()
{
Menu = await MenuManager.GetAsync(StandardMenus.Main);
Menu = await MenuManager.GetMainMenuAsync();
}
}
}

2
modules/basic-theme/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/Themes/Basic/Components/Menu/MainNavbarMenuViewComponent.cs

@ -15,7 +15,7 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Themes.Basic.Components.Menu
public async Task<IViewComponentResult> InvokeAsync()
{
var menu = await _menuManager.GetAsync(StandardMenus.Main);
var menu = await _menuManager.GetMainMenuAsync();
return View("~/Themes/Basic/Components/Menu/Default.cshtml", menu);
}
}

417
modules/cms-kit/host/Volo.CmsKit.HttpApi.Host/Migrations/20201231111745_Initial.Designer.cs → modules/cms-kit/host/Volo.CmsKit.HttpApi.Host/Migrations/20210609081519_Initial.Designer.cs

@ -11,17 +11,17 @@ using Volo.CmsKit.EntityFrameworkCore;
namespace Volo.CmsKit.Migrations
{
[DbContext(typeof(CmsKitHttpApiHostMigrationsDbContext))]
[Migration("20201231111745_Initial")]
[Migration("20210609081519_Initial")]
partial class Initial
{
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.UseIdentityColumns()
.HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer)
.HasAnnotation("Relational:MaxIdentifierLength", 128)
.HasAnnotation("ProductVersion", "5.0.1");
.HasAnnotation("ProductVersion", "5.0.7")
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
modelBuilder.Entity("Volo.Abp.BlobStoring.Database.DatabaseBlob", b =>
{
@ -96,6 +96,219 @@ namespace Volo.CmsKit.Migrations
b.ToTable("AbpBlobContainers");
});
modelBuilder.Entity("Volo.CmsKit.Blogs.Blog", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("uniqueidentifier");
b.Property<string>("ConcurrencyStamp")
.IsConcurrencyToken()
.HasMaxLength(40)
.HasColumnType("nvarchar(40)")
.HasColumnName("ConcurrencyStamp");
b.Property<DateTime>("CreationTime")
.HasColumnType("datetime2")
.HasColumnName("CreationTime");
b.Property<Guid?>("CreatorId")
.HasColumnType("uniqueidentifier")
.HasColumnName("CreatorId");
b.Property<Guid?>("DeleterId")
.HasColumnType("uniqueidentifier")
.HasColumnName("DeleterId");
b.Property<DateTime?>("DeletionTime")
.HasColumnType("datetime2")
.HasColumnName("DeletionTime");
b.Property<string>("ExtraProperties")
.HasColumnType("nvarchar(max)")
.HasColumnName("ExtraProperties");
b.Property<bool>("IsDeleted")
.ValueGeneratedOnAdd()
.HasColumnType("bit")
.HasDefaultValue(false)
.HasColumnName("IsDeleted");
b.Property<DateTime?>("LastModificationTime")
.HasColumnType("datetime2")
.HasColumnName("LastModificationTime");
b.Property<Guid?>("LastModifierId")
.HasColumnType("uniqueidentifier")
.HasColumnName("LastModifierId");
b.Property<string>("Name")
.IsRequired()
.HasMaxLength(64)
.HasColumnType("nvarchar(64)");
b.Property<string>("Slug")
.IsRequired()
.HasMaxLength(64)
.HasColumnType("nvarchar(64)");
b.Property<Guid?>("TenantId")
.HasColumnType("uniqueidentifier")
.HasColumnName("TenantId");
b.HasKey("Id");
b.ToTable("CmsBlogs");
});
modelBuilder.Entity("Volo.CmsKit.Blogs.BlogFeature", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("uniqueidentifier");
b.Property<Guid>("BlogId")
.HasColumnType("uniqueidentifier");
b.Property<string>("ConcurrencyStamp")
.IsConcurrencyToken()
.HasMaxLength(40)
.HasColumnType("nvarchar(40)")
.HasColumnName("ConcurrencyStamp");
b.Property<DateTime>("CreationTime")
.HasColumnType("datetime2")
.HasColumnName("CreationTime");
b.Property<Guid?>("CreatorId")
.HasColumnType("uniqueidentifier")
.HasColumnName("CreatorId");
b.Property<Guid?>("DeleterId")
.HasColumnType("uniqueidentifier")
.HasColumnName("DeleterId");
b.Property<DateTime?>("DeletionTime")
.HasColumnType("datetime2")
.HasColumnName("DeletionTime");
b.Property<string>("ExtraProperties")
.HasColumnType("nvarchar(max)")
.HasColumnName("ExtraProperties");
b.Property<string>("FeatureName")
.IsRequired()
.HasMaxLength(64)
.HasColumnType("nvarchar(64)");
b.Property<bool>("IsDeleted")
.ValueGeneratedOnAdd()
.HasColumnType("bit")
.HasDefaultValue(false)
.HasColumnName("IsDeleted");
b.Property<bool>("IsEnabled")
.HasColumnType("bit");
b.Property<DateTime?>("LastModificationTime")
.HasColumnType("datetime2")
.HasColumnName("LastModificationTime");
b.Property<Guid?>("LastModifierId")
.HasColumnType("uniqueidentifier")
.HasColumnName("LastModifierId");
b.HasKey("Id");
b.ToTable("CmsBlogFeatures");
});
modelBuilder.Entity("Volo.CmsKit.Blogs.BlogPost", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("uniqueidentifier");
b.Property<Guid>("AuthorId")
.HasColumnType("uniqueidentifier");
b.Property<Guid>("BlogId")
.HasColumnType("uniqueidentifier");
b.Property<string>("ConcurrencyStamp")
.IsConcurrencyToken()
.HasMaxLength(40)
.HasColumnType("nvarchar(40)")
.HasColumnName("ConcurrencyStamp");
b.Property<string>("Content")
.HasMaxLength(2147483647)
.HasColumnType("nvarchar(max)");
b.Property<Guid?>("CoverImageMediaId")
.HasColumnType("uniqueidentifier");
b.Property<DateTime>("CreationTime")
.HasColumnType("datetime2")
.HasColumnName("CreationTime");
b.Property<Guid?>("CreatorId")
.HasColumnType("uniqueidentifier")
.HasColumnName("CreatorId");
b.Property<Guid?>("DeleterId")
.HasColumnType("uniqueidentifier")
.HasColumnName("DeleterId");
b.Property<DateTime?>("DeletionTime")
.HasColumnType("datetime2")
.HasColumnName("DeletionTime");
b.Property<string>("ExtraProperties")
.HasColumnType("nvarchar(max)")
.HasColumnName("ExtraProperties");
b.Property<bool>("IsDeleted")
.ValueGeneratedOnAdd()
.HasColumnType("bit")
.HasDefaultValue(false)
.HasColumnName("IsDeleted");
b.Property<DateTime?>("LastModificationTime")
.HasColumnType("datetime2")
.HasColumnName("LastModificationTime");
b.Property<Guid?>("LastModifierId")
.HasColumnType("uniqueidentifier")
.HasColumnName("LastModifierId");
b.Property<string>("ShortDescription")
.HasMaxLength(256)
.HasColumnType("nvarchar(256)");
b.Property<string>("Slug")
.IsRequired()
.HasMaxLength(256)
.HasColumnType("nvarchar(256)");
b.Property<Guid?>("TenantId")
.HasColumnType("uniqueidentifier")
.HasColumnName("TenantId");
b.Property<string>("Title")
.IsRequired()
.HasMaxLength(64)
.HasColumnType("nvarchar(64)");
b.HasKey("Id");
b.HasIndex("AuthorId");
b.HasIndex("Slug", "BlogId");
b.ToTable("CmsBlogPosts");
});
modelBuilder.Entity("Volo.CmsKit.Comments.Comment", b =>
{
b.Property<Guid>("Id")
@ -141,7 +354,7 @@ namespace Volo.CmsKit.Migrations
b.ToTable("CmsComments");
});
modelBuilder.Entity("Volo.CmsKit.Contents.Content", b =>
modelBuilder.Entity("Volo.CmsKit.MediaDescriptors.MediaDescriptor", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
@ -169,15 +382,79 @@ namespace Volo.CmsKit.Migrations
.HasColumnType("datetime2")
.HasColumnName("DeletionTime");
b.Property<string>("EntityId")
b.Property<string>("EntityType")
.IsRequired()
.HasMaxLength(64)
.HasColumnType("nvarchar(64)");
b.Property<string>("EntityType")
b.Property<string>("ExtraProperties")
.HasColumnType("nvarchar(max)")
.HasColumnName("ExtraProperties");
b.Property<bool>("IsDeleted")
.ValueGeneratedOnAdd()
.HasColumnType("bit")
.HasDefaultValue(false)
.HasColumnName("IsDeleted");
b.Property<DateTime?>("LastModificationTime")
.HasColumnType("datetime2")
.HasColumnName("LastModificationTime");
b.Property<Guid?>("LastModifierId")
.HasColumnType("uniqueidentifier")
.HasColumnName("LastModifierId");
b.Property<string>("MimeType")
.IsRequired()
.HasMaxLength(64)
.HasColumnType("nvarchar(64)");
.HasMaxLength(128)
.HasColumnType("nvarchar(128)");
b.Property<string>("Name")
.IsRequired()
.HasMaxLength(255)
.HasColumnType("nvarchar(255)");
b.Property<long>("Size")
.HasMaxLength(2147483647)
.HasColumnType("bigint");
b.Property<Guid?>("TenantId")
.HasColumnType("uniqueidentifier")
.HasColumnName("TenantId");
b.HasKey("Id");
b.ToTable("CmsMediaDescriptors");
});
modelBuilder.Entity("Volo.CmsKit.Menus.Menu", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("uniqueidentifier");
b.Property<string>("ConcurrencyStamp")
.IsConcurrencyToken()
.HasMaxLength(40)
.HasColumnType("nvarchar(40)")
.HasColumnName("ConcurrencyStamp");
b.Property<DateTime>("CreationTime")
.HasColumnType("datetime2")
.HasColumnName("CreationTime");
b.Property<Guid?>("CreatorId")
.HasColumnType("uniqueidentifier")
.HasColumnName("CreatorId");
b.Property<Guid?>("DeleterId")
.HasColumnType("uniqueidentifier")
.HasColumnName("DeleterId");
b.Property<DateTime?>("DeletionTime")
.HasColumnType("datetime2")
.HasColumnName("DeletionTime");
b.Property<string>("ExtraProperties")
.HasColumnType("nvarchar(max)")
@ -197,20 +474,85 @@ namespace Volo.CmsKit.Migrations
.HasColumnType("uniqueidentifier")
.HasColumnName("LastModifierId");
b.Property<string>("Name")
.HasColumnType("nvarchar(max)");
b.Property<Guid?>("TenantId")
.HasColumnType("uniqueidentifier")
.HasColumnName("TenantId");
b.Property<string>("Value")
b.HasKey("Id");
b.ToTable("CmsMenus");
});
modelBuilder.Entity("Volo.CmsKit.Menus.MenuItem", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("uniqueidentifier");
b.Property<DateTime>("CreationTime")
.HasColumnType("datetime2")
.HasColumnName("CreationTime");
b.Property<Guid?>("CreatorId")
.HasColumnType("uniqueidentifier")
.HasColumnName("CreatorId");
b.Property<string>("CssClass")
.HasColumnType("nvarchar(max)");
b.Property<string>("DisplayName")
.IsRequired()
.HasMaxLength(2147483647)
.HasMaxLength(64)
.HasColumnType("nvarchar(64)");
b.Property<string>("ElementId")
.HasColumnType("nvarchar(max)");
b.Property<string>("Icon")
.HasColumnType("nvarchar(max)");
b.Property<bool>("IsActive")
.HasColumnType("bit");
b.Property<DateTime?>("LastModificationTime")
.HasColumnType("datetime2")
.HasColumnName("LastModificationTime");
b.Property<Guid?>("LastModifierId")
.HasColumnType("uniqueidentifier")
.HasColumnName("LastModifierId");
b.Property<Guid>("MenuId")
.HasColumnType("uniqueidentifier");
b.Property<int>("Order")
.HasColumnType("int");
b.Property<Guid?>("PageId")
.HasColumnType("uniqueidentifier");
b.Property<Guid?>("ParentId")
.HasColumnType("uniqueidentifier");
b.Property<string>("RequiredPermissionName")
.HasColumnType("nvarchar(max)");
b.Property<string>("Target")
.HasColumnType("nvarchar(max)");
b.Property<string>("Url")
.IsRequired()
.HasMaxLength(1024)
.HasColumnType("nvarchar(1024)");
b.HasKey("Id");
b.HasIndex("TenantId", "EntityType", "EntityId");
b.HasIndex("MenuId");
b.ToTable("CmsContents");
b.ToTable("CmsMenuItems");
});
modelBuilder.Entity("Volo.CmsKit.Pages.Page", b =>
@ -225,6 +567,10 @@ namespace Volo.CmsKit.Migrations
.HasColumnType("nvarchar(40)")
.HasColumnName("ConcurrencyStamp");
b.Property<string>("Content")
.HasMaxLength(2147483647)
.HasColumnType("nvarchar(max)");
b.Property<DateTime>("CreationTime")
.HasColumnType("datetime2")
.HasColumnName("CreationTime");
@ -241,10 +587,6 @@ namespace Volo.CmsKit.Migrations
.HasColumnType("datetime2")
.HasColumnName("DeletionTime");
b.Property<string>("Description")
.HasMaxLength(512)
.HasColumnType("nvarchar(512)");
b.Property<string>("ExtraProperties")
.HasColumnType("nvarchar(max)")
.HasColumnName("ExtraProperties");
@ -263,23 +605,29 @@ namespace Volo.CmsKit.Migrations
.HasColumnType("uniqueidentifier")
.HasColumnName("LastModifierId");
b.Property<Guid?>("TenantId")
.HasColumnType("uniqueidentifier")
.HasColumnName("TenantId");
b.Property<string>("Script")
.HasColumnType("nvarchar(max)");
b.Property<string>("Title")
b.Property<string>("Slug")
.IsRequired()
.HasMaxLength(256)
.HasColumnType("nvarchar(256)");
b.Property<string>("Url")
b.Property<string>("Style")
.HasColumnType("nvarchar(max)");
b.Property<Guid?>("TenantId")
.HasColumnType("uniqueidentifier")
.HasColumnName("TenantId");
b.Property<string>("Title")
.IsRequired()
.HasMaxLength(256)
.HasColumnType("nvarchar(256)");
b.HasKey("Id");
b.HasIndex("TenantId", "Url");
b.HasIndex("TenantId", "Slug");
b.ToTable("CmsPages");
});
@ -525,6 +873,31 @@ namespace Volo.CmsKit.Migrations
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("Volo.CmsKit.Blogs.BlogPost", b =>
{
b.HasOne("Volo.CmsKit.Users.CmsUser", "Author")
.WithMany()
.HasForeignKey("AuthorId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Author");
});
modelBuilder.Entity("Volo.CmsKit.Menus.MenuItem", b =>
{
b.HasOne("Volo.CmsKit.Menus.Menu", null)
.WithMany("Items")
.HasForeignKey("MenuId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("Volo.CmsKit.Menus.Menu", b =>
{
b.Navigation("Items");
});
#pragma warning restore 612, 618
}
}

207
modules/cms-kit/host/Volo.CmsKit.HttpApi.Host/Migrations/20201231111745_Initial.cs → modules/cms-kit/host/Volo.CmsKit.HttpApi.Host/Migrations/20210609081519_Initial.cs

@ -22,6 +22,52 @@ namespace Volo.CmsKit.Migrations
table.PrimaryKey("PK_AbpBlobContainers", x => x.Id);
});
migrationBuilder.CreateTable(
name: "CmsBlogFeatures",
columns: table => new
{
Id = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
BlogId = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
FeatureName = table.Column<string>(type: "nvarchar(64)", maxLength: 64, nullable: false),
IsEnabled = table.Column<bool>(type: "bit", nullable: false),
ExtraProperties = table.Column<string>(type: "nvarchar(max)", nullable: true),
ConcurrencyStamp = table.Column<string>(type: "nvarchar(40)", maxLength: 40, nullable: true),
CreationTime = table.Column<DateTime>(type: "datetime2", nullable: false),
CreatorId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
LastModificationTime = table.Column<DateTime>(type: "datetime2", nullable: true),
LastModifierId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
IsDeleted = table.Column<bool>(type: "bit", nullable: false, defaultValue: false),
DeleterId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
DeletionTime = table.Column<DateTime>(type: "datetime2", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_CmsBlogFeatures", x => x.Id);
});
migrationBuilder.CreateTable(
name: "CmsBlogs",
columns: table => new
{
Id = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
Name = table.Column<string>(type: "nvarchar(64)", maxLength: 64, nullable: false),
Slug = table.Column<string>(type: "nvarchar(64)", maxLength: 64, nullable: false),
TenantId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
ExtraProperties = table.Column<string>(type: "nvarchar(max)", nullable: true),
ConcurrencyStamp = table.Column<string>(type: "nvarchar(40)", maxLength: 40, nullable: true),
CreationTime = table.Column<DateTime>(type: "datetime2", nullable: false),
CreatorId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
LastModificationTime = table.Column<DateTime>(type: "datetime2", nullable: true),
LastModifierId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
IsDeleted = table.Column<bool>(type: "bit", nullable: false, defaultValue: false),
DeleterId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
DeletionTime = table.Column<DateTime>(type: "datetime2", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_CmsBlogs", x => x.Id);
});
migrationBuilder.CreateTable(
name: "CmsComments",
columns: table => new
@ -41,14 +87,28 @@ namespace Volo.CmsKit.Migrations
});
migrationBuilder.CreateTable(
name: "CmsContents",
name: "CmsEntityTags",
columns: table => new
{
TagId = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
EntityId = table.Column<string>(type: "nvarchar(450)", nullable: false),
TenantId = table.Column<Guid>(type: "uniqueidentifier", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_CmsEntityTags", x => new { x.EntityId, x.TagId });
});
migrationBuilder.CreateTable(
name: "CmsMediaDescriptors",
columns: table => new
{
Id = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
TenantId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
EntityType = table.Column<string>(type: "nvarchar(64)", maxLength: 64, nullable: false),
EntityId = table.Column<string>(type: "nvarchar(64)", maxLength: 64, nullable: false),
Value = table.Column<string>(type: "nvarchar(max)", maxLength: 2147483647, nullable: false),
Name = table.Column<string>(type: "nvarchar(255)", maxLength: 255, nullable: false),
MimeType = table.Column<string>(type: "nvarchar(128)", maxLength: 128, nullable: false),
Size = table.Column<long>(type: "bigint", maxLength: 2147483647, nullable: false),
ExtraProperties = table.Column<string>(type: "nvarchar(max)", nullable: true),
ConcurrencyStamp = table.Column<string>(type: "nvarchar(40)", maxLength: 40, nullable: true),
CreationTime = table.Column<DateTime>(type: "datetime2", nullable: false),
@ -61,20 +121,29 @@ namespace Volo.CmsKit.Migrations
},
constraints: table =>
{
table.PrimaryKey("PK_CmsContents", x => x.Id);
table.PrimaryKey("PK_CmsMediaDescriptors", x => x.Id);
});
migrationBuilder.CreateTable(
name: "CmsEntityTags",
name: "CmsMenus",
columns: table => new
{
TagId = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
EntityId = table.Column<string>(type: "nvarchar(450)", nullable: false),
TenantId = table.Column<Guid>(type: "uniqueidentifier", nullable: true)
Id = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
Name = table.Column<string>(type: "nvarchar(max)", nullable: true),
TenantId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
ExtraProperties = table.Column<string>(type: "nvarchar(max)", nullable: true),
ConcurrencyStamp = table.Column<string>(type: "nvarchar(40)", maxLength: 40, nullable: true),
CreationTime = table.Column<DateTime>(type: "datetime2", nullable: false),
CreatorId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
LastModificationTime = table.Column<DateTime>(type: "datetime2", nullable: true),
LastModifierId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
IsDeleted = table.Column<bool>(type: "bit", nullable: false, defaultValue: false),
DeleterId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
DeletionTime = table.Column<DateTime>(type: "datetime2", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_CmsEntityTags", x => new { x.EntityId, x.TagId });
table.PrimaryKey("PK_CmsMenus", x => x.Id);
});
migrationBuilder.CreateTable(
@ -84,8 +153,10 @@ namespace Volo.CmsKit.Migrations
Id = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
TenantId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
Title = table.Column<string>(type: "nvarchar(256)", maxLength: 256, nullable: false),
Url = table.Column<string>(type: "nvarchar(256)", maxLength: 256, nullable: false),
Description = table.Column<string>(type: "nvarchar(512)", maxLength: 512, nullable: true),
Slug = table.Column<string>(type: "nvarchar(256)", maxLength: 256, nullable: false),
Content = table.Column<string>(type: "nvarchar(max)", maxLength: 2147483647, nullable: true),
Script = table.Column<string>(type: "nvarchar(max)", nullable: true),
Style = table.Column<string>(type: "nvarchar(max)", nullable: true),
ExtraProperties = table.Column<string>(type: "nvarchar(max)", nullable: true),
ConcurrencyStamp = table.Column<string>(type: "nvarchar(40)", maxLength: 40, nullable: true),
CreationTime = table.Column<DateTime>(type: "datetime2", nullable: false),
@ -123,9 +194,9 @@ namespace Volo.CmsKit.Migrations
columns: table => new
{
Id = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
TenantId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
EntityType = table.Column<string>(type: "nvarchar(64)", maxLength: 64, nullable: false),
Name = table.Column<string>(type: "nvarchar(32)", maxLength: 32, nullable: false),
TenantId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
ExtraProperties = table.Column<string>(type: "nvarchar(max)", nullable: true),
ConcurrencyStamp = table.Column<string>(type: "nvarchar(40)", maxLength: 40, nullable: true),
CreationTime = table.Column<DateTime>(type: "datetime2", nullable: false),
@ -202,6 +273,73 @@ namespace Volo.CmsKit.Migrations
onDelete: ReferentialAction.Cascade);
});
migrationBuilder.CreateTable(
name: "CmsMenuItems",
columns: table => new
{
Id = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
MenuId = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
ParentId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
DisplayName = table.Column<string>(type: "nvarchar(64)", maxLength: 64, nullable: false),
IsActive = table.Column<bool>(type: "bit", nullable: false),
Url = table.Column<string>(type: "nvarchar(1024)", maxLength: 1024, nullable: false),
Icon = table.Column<string>(type: "nvarchar(max)", nullable: true),
Order = table.Column<int>(type: "int", nullable: false),
Target = table.Column<string>(type: "nvarchar(max)", nullable: true),
ElementId = table.Column<string>(type: "nvarchar(max)", nullable: true),
CssClass = table.Column<string>(type: "nvarchar(max)", nullable: true),
RequiredPermissionName = table.Column<string>(type: "nvarchar(max)", nullable: true),
PageId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
CreationTime = table.Column<DateTime>(type: "datetime2", nullable: false),
CreatorId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
LastModificationTime = table.Column<DateTime>(type: "datetime2", nullable: true),
LastModifierId = table.Column<Guid>(type: "uniqueidentifier", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_CmsMenuItems", x => x.Id);
table.ForeignKey(
name: "FK_CmsMenuItems_CmsMenus_MenuId",
column: x => x.MenuId,
principalTable: "CmsMenus",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
});
migrationBuilder.CreateTable(
name: "CmsBlogPosts",
columns: table => new
{
Id = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
BlogId = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
Title = table.Column<string>(type: "nvarchar(64)", maxLength: 64, nullable: false),
Slug = table.Column<string>(type: "nvarchar(256)", maxLength: 256, nullable: false),
ShortDescription = table.Column<string>(type: "nvarchar(256)", maxLength: 256, nullable: true),
Content = table.Column<string>(type: "nvarchar(max)", maxLength: 2147483647, nullable: true),
CoverImageMediaId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
TenantId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
AuthorId = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
ExtraProperties = table.Column<string>(type: "nvarchar(max)", nullable: true),
ConcurrencyStamp = table.Column<string>(type: "nvarchar(40)", maxLength: 40, nullable: true),
CreationTime = table.Column<DateTime>(type: "datetime2", nullable: false),
CreatorId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
LastModificationTime = table.Column<DateTime>(type: "datetime2", nullable: true),
LastModifierId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
IsDeleted = table.Column<bool>(type: "bit", nullable: false, defaultValue: false),
DeleterId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
DeletionTime = table.Column<DateTime>(type: "datetime2", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_CmsBlogPosts", x => x.Id);
table.ForeignKey(
name: "FK_CmsBlogPosts_CmsUsers_AuthorId",
column: x => x.AuthorId,
principalTable: "CmsUsers",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
});
migrationBuilder.CreateIndex(
name: "IX_AbpBlobContainers_TenantId_Name",
table: "AbpBlobContainers",
@ -217,6 +355,16 @@ namespace Volo.CmsKit.Migrations
table: "AbpBlobs",
columns: new[] { "TenantId", "ContainerId", "Name" });
migrationBuilder.CreateIndex(
name: "IX_CmsBlogPosts_AuthorId",
table: "CmsBlogPosts",
column: "AuthorId");
migrationBuilder.CreateIndex(
name: "IX_CmsBlogPosts_Slug_BlogId",
table: "CmsBlogPosts",
columns: new[] { "Slug", "BlogId" });
migrationBuilder.CreateIndex(
name: "IX_CmsComments_TenantId_EntityType_EntityId",
table: "CmsComments",
@ -227,20 +375,20 @@ namespace Volo.CmsKit.Migrations
table: "CmsComments",
columns: new[] { "TenantId", "RepliedCommentId" });
migrationBuilder.CreateIndex(
name: "IX_CmsContents_TenantId_EntityType_EntityId",
table: "CmsContents",
columns: new[] { "TenantId", "EntityType", "EntityId" });
migrationBuilder.CreateIndex(
name: "IX_CmsEntityTags_TenantId_EntityId_TagId",
table: "CmsEntityTags",
columns: new[] { "TenantId", "EntityId", "TagId" });
migrationBuilder.CreateIndex(
name: "IX_CmsPages_TenantId_Url",
name: "IX_CmsMenuItems_MenuId",
table: "CmsMenuItems",
column: "MenuId");
migrationBuilder.CreateIndex(
name: "IX_CmsPages_TenantId_Slug",
table: "CmsPages",
columns: new[] { "TenantId", "Url" });
columns: new[] { "TenantId", "Slug" });
migrationBuilder.CreateIndex(
name: "IX_CmsRatings_TenantId_EntityType_EntityId_CreatorId",
@ -279,14 +427,26 @@ namespace Volo.CmsKit.Migrations
name: "AbpBlobs");
migrationBuilder.DropTable(
name: "CmsComments");
name: "CmsBlogFeatures");
migrationBuilder.DropTable(
name: "CmsBlogPosts");
migrationBuilder.DropTable(
name: "CmsBlogs");
migrationBuilder.DropTable(
name: "CmsContents");
name: "CmsComments");
migrationBuilder.DropTable(
name: "CmsEntityTags");
migrationBuilder.DropTable(
name: "CmsMediaDescriptors");
migrationBuilder.DropTable(
name: "CmsMenuItems");
migrationBuilder.DropTable(
name: "CmsPages");
@ -299,11 +459,14 @@ namespace Volo.CmsKit.Migrations
migrationBuilder.DropTable(
name: "CmsUserReactions");
migrationBuilder.DropTable(
name: "AbpBlobContainers");
migrationBuilder.DropTable(
name: "CmsUsers");
migrationBuilder.DropTable(
name: "AbpBlobContainers");
name: "CmsMenus");
}
}
}

415
modules/cms-kit/host/Volo.CmsKit.HttpApi.Host/Migrations/CmsKitHttpApiHostMigrationsDbContextModelSnapshot.cs

@ -16,10 +16,10 @@ namespace Volo.CmsKit.Migrations
{
#pragma warning disable 612, 618
modelBuilder
.UseIdentityColumns()
.HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer)
.HasAnnotation("Relational:MaxIdentifierLength", 128)
.HasAnnotation("ProductVersion", "5.0.1");
.HasAnnotation("ProductVersion", "5.0.7")
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
modelBuilder.Entity("Volo.Abp.BlobStoring.Database.DatabaseBlob", b =>
{
@ -94,6 +94,219 @@ namespace Volo.CmsKit.Migrations
b.ToTable("AbpBlobContainers");
});
modelBuilder.Entity("Volo.CmsKit.Blogs.Blog", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("uniqueidentifier");
b.Property<string>("ConcurrencyStamp")
.IsConcurrencyToken()
.HasMaxLength(40)
.HasColumnType("nvarchar(40)")
.HasColumnName("ConcurrencyStamp");
b.Property<DateTime>("CreationTime")
.HasColumnType("datetime2")
.HasColumnName("CreationTime");
b.Property<Guid?>("CreatorId")
.HasColumnType("uniqueidentifier")
.HasColumnName("CreatorId");
b.Property<Guid?>("DeleterId")
.HasColumnType("uniqueidentifier")
.HasColumnName("DeleterId");
b.Property<DateTime?>("DeletionTime")
.HasColumnType("datetime2")
.HasColumnName("DeletionTime");
b.Property<string>("ExtraProperties")
.HasColumnType("nvarchar(max)")
.HasColumnName("ExtraProperties");
b.Property<bool>("IsDeleted")
.ValueGeneratedOnAdd()
.HasColumnType("bit")
.HasDefaultValue(false)
.HasColumnName("IsDeleted");
b.Property<DateTime?>("LastModificationTime")
.HasColumnType("datetime2")
.HasColumnName("LastModificationTime");
b.Property<Guid?>("LastModifierId")
.HasColumnType("uniqueidentifier")
.HasColumnName("LastModifierId");
b.Property<string>("Name")
.IsRequired()
.HasMaxLength(64)
.HasColumnType("nvarchar(64)");
b.Property<string>("Slug")
.IsRequired()
.HasMaxLength(64)
.HasColumnType("nvarchar(64)");
b.Property<Guid?>("TenantId")
.HasColumnType("uniqueidentifier")
.HasColumnName("TenantId");
b.HasKey("Id");
b.ToTable("CmsBlogs");
});
modelBuilder.Entity("Volo.CmsKit.Blogs.BlogFeature", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("uniqueidentifier");
b.Property<Guid>("BlogId")
.HasColumnType("uniqueidentifier");
b.Property<string>("ConcurrencyStamp")
.IsConcurrencyToken()
.HasMaxLength(40)
.HasColumnType("nvarchar(40)")
.HasColumnName("ConcurrencyStamp");
b.Property<DateTime>("CreationTime")
.HasColumnType("datetime2")
.HasColumnName("CreationTime");
b.Property<Guid?>("CreatorId")
.HasColumnType("uniqueidentifier")
.HasColumnName("CreatorId");
b.Property<Guid?>("DeleterId")
.HasColumnType("uniqueidentifier")
.HasColumnName("DeleterId");
b.Property<DateTime?>("DeletionTime")
.HasColumnType("datetime2")
.HasColumnName("DeletionTime");
b.Property<string>("ExtraProperties")
.HasColumnType("nvarchar(max)")
.HasColumnName("ExtraProperties");
b.Property<string>("FeatureName")
.IsRequired()
.HasMaxLength(64)
.HasColumnType("nvarchar(64)");
b.Property<bool>("IsDeleted")
.ValueGeneratedOnAdd()
.HasColumnType("bit")
.HasDefaultValue(false)
.HasColumnName("IsDeleted");
b.Property<bool>("IsEnabled")
.HasColumnType("bit");
b.Property<DateTime?>("LastModificationTime")
.HasColumnType("datetime2")
.HasColumnName("LastModificationTime");
b.Property<Guid?>("LastModifierId")
.HasColumnType("uniqueidentifier")
.HasColumnName("LastModifierId");
b.HasKey("Id");
b.ToTable("CmsBlogFeatures");
});
modelBuilder.Entity("Volo.CmsKit.Blogs.BlogPost", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("uniqueidentifier");
b.Property<Guid>("AuthorId")
.HasColumnType("uniqueidentifier");
b.Property<Guid>("BlogId")
.HasColumnType("uniqueidentifier");
b.Property<string>("ConcurrencyStamp")
.IsConcurrencyToken()
.HasMaxLength(40)
.HasColumnType("nvarchar(40)")
.HasColumnName("ConcurrencyStamp");
b.Property<string>("Content")
.HasMaxLength(2147483647)
.HasColumnType("nvarchar(max)");
b.Property<Guid?>("CoverImageMediaId")
.HasColumnType("uniqueidentifier");
b.Property<DateTime>("CreationTime")
.HasColumnType("datetime2")
.HasColumnName("CreationTime");
b.Property<Guid?>("CreatorId")
.HasColumnType("uniqueidentifier")
.HasColumnName("CreatorId");
b.Property<Guid?>("DeleterId")
.HasColumnType("uniqueidentifier")
.HasColumnName("DeleterId");
b.Property<DateTime?>("DeletionTime")
.HasColumnType("datetime2")
.HasColumnName("DeletionTime");
b.Property<string>("ExtraProperties")
.HasColumnType("nvarchar(max)")
.HasColumnName("ExtraProperties");
b.Property<bool>("IsDeleted")
.ValueGeneratedOnAdd()
.HasColumnType("bit")
.HasDefaultValue(false)
.HasColumnName("IsDeleted");
b.Property<DateTime?>("LastModificationTime")
.HasColumnType("datetime2")
.HasColumnName("LastModificationTime");
b.Property<Guid?>("LastModifierId")
.HasColumnType("uniqueidentifier")
.HasColumnName("LastModifierId");
b.Property<string>("ShortDescription")
.HasMaxLength(256)
.HasColumnType("nvarchar(256)");
b.Property<string>("Slug")
.IsRequired()
.HasMaxLength(256)
.HasColumnType("nvarchar(256)");
b.Property<Guid?>("TenantId")
.HasColumnType("uniqueidentifier")
.HasColumnName("TenantId");
b.Property<string>("Title")
.IsRequired()
.HasMaxLength(64)
.HasColumnType("nvarchar(64)");
b.HasKey("Id");
b.HasIndex("AuthorId");
b.HasIndex("Slug", "BlogId");
b.ToTable("CmsBlogPosts");
});
modelBuilder.Entity("Volo.CmsKit.Comments.Comment", b =>
{
b.Property<Guid>("Id")
@ -139,7 +352,7 @@ namespace Volo.CmsKit.Migrations
b.ToTable("CmsComments");
});
modelBuilder.Entity("Volo.CmsKit.Contents.Content", b =>
modelBuilder.Entity("Volo.CmsKit.MediaDescriptors.MediaDescriptor", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
@ -167,15 +380,79 @@ namespace Volo.CmsKit.Migrations
.HasColumnType("datetime2")
.HasColumnName("DeletionTime");
b.Property<string>("EntityId")
b.Property<string>("EntityType")
.IsRequired()
.HasMaxLength(64)
.HasColumnType("nvarchar(64)");
b.Property<string>("EntityType")
b.Property<string>("ExtraProperties")
.HasColumnType("nvarchar(max)")
.HasColumnName("ExtraProperties");
b.Property<bool>("IsDeleted")
.ValueGeneratedOnAdd()
.HasColumnType("bit")
.HasDefaultValue(false)
.HasColumnName("IsDeleted");
b.Property<DateTime?>("LastModificationTime")
.HasColumnType("datetime2")
.HasColumnName("LastModificationTime");
b.Property<Guid?>("LastModifierId")
.HasColumnType("uniqueidentifier")
.HasColumnName("LastModifierId");
b.Property<string>("MimeType")
.IsRequired()
.HasMaxLength(64)
.HasColumnType("nvarchar(64)");
.HasMaxLength(128)
.HasColumnType("nvarchar(128)");
b.Property<string>("Name")
.IsRequired()
.HasMaxLength(255)
.HasColumnType("nvarchar(255)");
b.Property<long>("Size")
.HasMaxLength(2147483647)
.HasColumnType("bigint");
b.Property<Guid?>("TenantId")
.HasColumnType("uniqueidentifier")
.HasColumnName("TenantId");
b.HasKey("Id");
b.ToTable("CmsMediaDescriptors");
});
modelBuilder.Entity("Volo.CmsKit.Menus.Menu", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("uniqueidentifier");
b.Property<string>("ConcurrencyStamp")
.IsConcurrencyToken()
.HasMaxLength(40)
.HasColumnType("nvarchar(40)")
.HasColumnName("ConcurrencyStamp");
b.Property<DateTime>("CreationTime")
.HasColumnType("datetime2")
.HasColumnName("CreationTime");
b.Property<Guid?>("CreatorId")
.HasColumnType("uniqueidentifier")
.HasColumnName("CreatorId");
b.Property<Guid?>("DeleterId")
.HasColumnType("uniqueidentifier")
.HasColumnName("DeleterId");
b.Property<DateTime?>("DeletionTime")
.HasColumnType("datetime2")
.HasColumnName("DeletionTime");
b.Property<string>("ExtraProperties")
.HasColumnType("nvarchar(max)")
@ -195,20 +472,85 @@ namespace Volo.CmsKit.Migrations
.HasColumnType("uniqueidentifier")
.HasColumnName("LastModifierId");
b.Property<string>("Name")
.HasColumnType("nvarchar(max)");
b.Property<Guid?>("TenantId")
.HasColumnType("uniqueidentifier")
.HasColumnName("TenantId");
b.Property<string>("Value")
b.HasKey("Id");
b.ToTable("CmsMenus");
});
modelBuilder.Entity("Volo.CmsKit.Menus.MenuItem", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("uniqueidentifier");
b.Property<DateTime>("CreationTime")
.HasColumnType("datetime2")
.HasColumnName("CreationTime");
b.Property<Guid?>("CreatorId")
.HasColumnType("uniqueidentifier")
.HasColumnName("CreatorId");
b.Property<string>("CssClass")
.HasColumnType("nvarchar(max)");
b.Property<string>("DisplayName")
.IsRequired()
.HasMaxLength(2147483647)
.HasMaxLength(64)
.HasColumnType("nvarchar(64)");
b.Property<string>("ElementId")
.HasColumnType("nvarchar(max)");
b.Property<string>("Icon")
.HasColumnType("nvarchar(max)");
b.Property<bool>("IsActive")
.HasColumnType("bit");
b.Property<DateTime?>("LastModificationTime")
.HasColumnType("datetime2")
.HasColumnName("LastModificationTime");
b.Property<Guid?>("LastModifierId")
.HasColumnType("uniqueidentifier")
.HasColumnName("LastModifierId");
b.Property<Guid>("MenuId")
.HasColumnType("uniqueidentifier");
b.Property<int>("Order")
.HasColumnType("int");
b.Property<Guid?>("PageId")
.HasColumnType("uniqueidentifier");
b.Property<Guid?>("ParentId")
.HasColumnType("uniqueidentifier");
b.Property<string>("RequiredPermissionName")
.HasColumnType("nvarchar(max)");
b.Property<string>("Target")
.HasColumnType("nvarchar(max)");
b.Property<string>("Url")
.IsRequired()
.HasMaxLength(1024)
.HasColumnType("nvarchar(1024)");
b.HasKey("Id");
b.HasIndex("TenantId", "EntityType", "EntityId");
b.HasIndex("MenuId");
b.ToTable("CmsContents");
b.ToTable("CmsMenuItems");
});
modelBuilder.Entity("Volo.CmsKit.Pages.Page", b =>
@ -223,6 +565,10 @@ namespace Volo.CmsKit.Migrations
.HasColumnType("nvarchar(40)")
.HasColumnName("ConcurrencyStamp");
b.Property<string>("Content")
.HasMaxLength(2147483647)
.HasColumnType("nvarchar(max)");
b.Property<DateTime>("CreationTime")
.HasColumnType("datetime2")
.HasColumnName("CreationTime");
@ -239,10 +585,6 @@ namespace Volo.CmsKit.Migrations
.HasColumnType("datetime2")
.HasColumnName("DeletionTime");
b.Property<string>("Description")
.HasMaxLength(512)
.HasColumnType("nvarchar(512)");
b.Property<string>("ExtraProperties")
.HasColumnType("nvarchar(max)")
.HasColumnName("ExtraProperties");
@ -261,23 +603,29 @@ namespace Volo.CmsKit.Migrations
.HasColumnType("uniqueidentifier")
.HasColumnName("LastModifierId");
b.Property<Guid?>("TenantId")
.HasColumnType("uniqueidentifier")
.HasColumnName("TenantId");
b.Property<string>("Script")
.HasColumnType("nvarchar(max)");
b.Property<string>("Title")
b.Property<string>("Slug")
.IsRequired()
.HasMaxLength(256)
.HasColumnType("nvarchar(256)");
b.Property<string>("Url")
b.Property<string>("Style")
.HasColumnType("nvarchar(max)");
b.Property<Guid?>("TenantId")
.HasColumnType("uniqueidentifier")
.HasColumnName("TenantId");
b.Property<string>("Title")
.IsRequired()
.HasMaxLength(256)
.HasColumnType("nvarchar(256)");
b.HasKey("Id");
b.HasIndex("TenantId", "Url");
b.HasIndex("TenantId", "Slug");
b.ToTable("CmsPages");
});
@ -523,6 +871,31 @@ namespace Volo.CmsKit.Migrations
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("Volo.CmsKit.Blogs.BlogPost", b =>
{
b.HasOne("Volo.CmsKit.Users.CmsUser", "Author")
.WithMany()
.HasForeignKey("AuthorId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Author");
});
modelBuilder.Entity("Volo.CmsKit.Menus.MenuItem", b =>
{
b.HasOne("Volo.CmsKit.Menus.Menu", null)
.WithMany("Items")
.HasForeignKey("MenuId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("Volo.CmsKit.Menus.Menu", b =>
{
b.Navigation("Items");
});
#pragma warning restore 612, 618
}
}

2022
modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20210219113255_Initial.Designer.cs

File diff suppressed because it is too large

2022
modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20210219144454_BlogFeatureEnabledColumnRename.Designer.cs

File diff suppressed because it is too large

23
modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20210219144454_BlogFeatureEnabledColumnRename.cs

@ -1,23 +0,0 @@
using Microsoft.EntityFrameworkCore.Migrations;
namespace Volo.CmsKit.Migrations
{
public partial class BlogFeatureEnabledColumnRename : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.RenameColumn(
name: "Enabled",
table: "CmsBlogFeatures",
newName: "IsEnabled");
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.RenameColumn(
name: "IsEnabled",
table: "CmsBlogFeatures",
newName: "Enabled");
}
}
}

2018
modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20210225092130_Page_Remove_Description.Designer.cs

File diff suppressed because it is too large

24
modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20210225092130_Page_Remove_Description.cs

@ -1,24 +0,0 @@
using Microsoft.EntityFrameworkCore.Migrations;
namespace Volo.CmsKit.Migrations
{
public partial class Page_Remove_Description : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn(
name: "Description",
table: "CmsPages");
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.AddColumn<string>(
name: "Description",
table: "CmsPages",
type: "nvarchar(512)",
maxLength: 512,
nullable: true);
}
}
}

2007
modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20210226112040_BlogPost_Author.Designer.cs

File diff suppressed because it is too large

109
modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20210226112040_BlogPost_Author.cs

@ -1,109 +0,0 @@
using System;
using Microsoft.EntityFrameworkCore.Migrations;
namespace Volo.CmsKit.Migrations
{
public partial class BlogPost_Author : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropForeignKey(
name: "FK_CmsBlogPosts_CmsUsers_CreatorId",
table: "CmsBlogPosts");
migrationBuilder.DropForeignKey(
name: "FK_CmsBlogPosts_CmsUsers_DeleterId",
table: "CmsBlogPosts");
migrationBuilder.DropForeignKey(
name: "FK_CmsBlogPosts_CmsUsers_LastModifierId",
table: "CmsBlogPosts");
migrationBuilder.DropIndex(
name: "IX_CmsBlogPosts_CreatorId",
table: "CmsBlogPosts");
migrationBuilder.DropIndex(
name: "IX_CmsBlogPosts_DeleterId",
table: "CmsBlogPosts");
migrationBuilder.DropIndex(
name: "IX_CmsBlogPosts_LastModifierId",
table: "CmsBlogPosts");
migrationBuilder.AddColumn<Guid>(
name: "AuthorId",
table: "CmsBlogPosts",
type: "uniqueidentifier",
nullable: false,
defaultValue: new Guid("00000000-0000-0000-0000-000000000000"));
migrationBuilder.CreateIndex(
name: "IX_CmsBlogPosts_AuthorId",
table: "CmsBlogPosts",
column: "AuthorId");
migrationBuilder.AddForeignKey(
name: "FK_CmsBlogPosts_CmsUsers_AuthorId",
table: "CmsBlogPosts",
column: "AuthorId",
principalTable: "CmsUsers",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropForeignKey(
name: "FK_CmsBlogPosts_CmsUsers_AuthorId",
table: "CmsBlogPosts");
migrationBuilder.DropIndex(
name: "IX_CmsBlogPosts_AuthorId",
table: "CmsBlogPosts");
migrationBuilder.DropColumn(
name: "AuthorId",
table: "CmsBlogPosts");
migrationBuilder.CreateIndex(
name: "IX_CmsBlogPosts_CreatorId",
table: "CmsBlogPosts",
column: "CreatorId");
migrationBuilder.CreateIndex(
name: "IX_CmsBlogPosts_DeleterId",
table: "CmsBlogPosts",
column: "DeleterId");
migrationBuilder.CreateIndex(
name: "IX_CmsBlogPosts_LastModifierId",
table: "CmsBlogPosts",
column: "LastModifierId");
migrationBuilder.AddForeignKey(
name: "FK_CmsBlogPosts_CmsUsers_CreatorId",
table: "CmsBlogPosts",
column: "CreatorId",
principalTable: "CmsUsers",
principalColumn: "Id",
onDelete: ReferentialAction.Restrict);
migrationBuilder.AddForeignKey(
name: "FK_CmsBlogPosts_CmsUsers_DeleterId",
table: "CmsBlogPosts",
column: "DeleterId",
principalTable: "CmsUsers",
principalColumn: "Id",
onDelete: ReferentialAction.Restrict);
migrationBuilder.AddForeignKey(
name: "FK_CmsBlogPosts_CmsUsers_LastModifierId",
table: "CmsBlogPosts",
column: "LastModifierId",
principalTable: "CmsUsers",
principalColumn: "Id",
onDelete: ReferentialAction.Restrict);
}
}
}

2012
modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20210302064229_Added_EntityType_to_Media.Designer.cs

File diff suppressed because it is too large

25
modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20210302064229_Added_EntityType_to_Media.cs

@ -1,25 +0,0 @@
using Microsoft.EntityFrameworkCore.Migrations;
namespace Volo.CmsKit.Migrations
{
public partial class Added_EntityType_to_Media : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AddColumn<string>(
name: "EntityType",
table: "CmsMediaDescriptors",
type: "nvarchar(64)",
maxLength: 64,
nullable: false,
defaultValue: "");
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn(
name: "EntityType",
table: "CmsMediaDescriptors");
}
}
}

2016
modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20210302075529_Added_Content_To_BlogPost.Designer.cs

File diff suppressed because it is too large

24
modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20210302075529_Added_Content_To_BlogPost.cs

@ -1,24 +0,0 @@
using Microsoft.EntityFrameworkCore.Migrations;
namespace Volo.CmsKit.Migrations
{
public partial class Added_Content_To_BlogPost : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AddColumn<string>(
name: "Content",
table: "CmsBlogPosts",
type: "nvarchar(max)",
maxLength: 2147483647,
nullable: true);
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn(
name: "Content",
table: "CmsBlogPosts");
}
}
}

24
modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20210302091451_Added_Content_To_Page.cs

@ -1,24 +0,0 @@
using Microsoft.EntityFrameworkCore.Migrations;
namespace Volo.CmsKit.Migrations
{
public partial class Added_Content_To_Page : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AddColumn<string>(
name: "Content",
table: "CmsPages",
type: "nvarchar(max)",
maxLength: 2147483647,
nullable: true);
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn(
name: "Content",
table: "CmsPages");
}
}
}

1951
modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20210305122554_BlogPost_CoverImage.Designer.cs

File diff suppressed because it is too large

56
modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20210305122554_BlogPost_CoverImage.cs

@ -1,56 +0,0 @@
using System;
using Microsoft.EntityFrameworkCore.Migrations;
namespace Volo.CmsKit.Migrations
{
public partial class BlogPost_CoverImage : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "CmsContents");
migrationBuilder.AddColumn<Guid>(
name: "CoverImageMediaId",
table: "CmsBlogPosts",
type: "uniqueidentifier",
nullable: true);
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn(
name: "CoverImageMediaId",
table: "CmsBlogPosts");
migrationBuilder.CreateTable(
name: "CmsContents",
columns: table => new
{
Id = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
ConcurrencyStamp = table.Column<string>(type: "nvarchar(40)", maxLength: 40, nullable: true),
CreationTime = table.Column<DateTime>(type: "datetime2", nullable: false),
CreatorId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
DeleterId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
DeletionTime = table.Column<DateTime>(type: "datetime2", nullable: true),
EntityId = table.Column<string>(type: "nvarchar(64)", maxLength: 64, nullable: false),
EntityType = table.Column<string>(type: "nvarchar(64)", maxLength: 64, nullable: false),
ExtraProperties = table.Column<string>(type: "nvarchar(max)", nullable: true),
IsDeleted = table.Column<bool>(type: "bit", nullable: false, defaultValue: false),
LastModificationTime = table.Column<DateTime>(type: "datetime2", nullable: true),
LastModifierId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
TenantId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
Value = table.Column<string>(type: "nvarchar(max)", maxLength: 2147483647, nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_CmsContents", x => x.Id);
});
migrationBuilder.CreateIndex(
name: "IX_CmsContents_TenantId_EntityType_EntityId",
table: "CmsContents",
columns: new[] { "TenantId", "EntityType", "EntityId" });
}
}
}

1957
modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20210315123344_Page_StyleScript.Designer.cs

File diff suppressed because it is too large

33
modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20210315123344_Page_StyleScript.cs

@ -1,33 +0,0 @@
using Microsoft.EntityFrameworkCore.Migrations;
namespace Volo.CmsKit.Migrations
{
public partial class Page_StyleScript : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AddColumn<string>(
name: "Script",
table: "CmsPages",
type: "nvarchar(max)",
nullable: true);
migrationBuilder.AddColumn<string>(
name: "Style",
table: "CmsPages",
type: "nvarchar(max)",
nullable: true);
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn(
name: "Script",
table: "CmsPages");
migrationBuilder.DropColumn(
name: "Style",
table: "CmsPages");
}
}
}

150
modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20210302091451_Added_Content_To_Page.Designer.cs → modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20210614072230_Initial.Designer.cs

@ -11,8 +11,8 @@ using Volo.CmsKit.EntityFrameworkCore;
namespace Volo.CmsKit.Migrations
{
[DbContext(typeof(UnifiedDbContext))]
[Migration("20210302091451_Added_Content_To_Page")]
partial class Added_Content_To_Page
[Migration("20210614072230_Initial")]
partial class Initial
{
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
@ -20,7 +20,7 @@ namespace Volo.CmsKit.Migrations
modelBuilder
.HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer)
.HasAnnotation("Relational:MaxIdentifierLength", 128)
.HasAnnotation("ProductVersion", "5.0.3")
.HasAnnotation("ProductVersion", "5.0.7")
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLog", b =>
@ -1275,6 +1275,9 @@ namespace Volo.CmsKit.Migrations
.HasMaxLength(2147483647)
.HasColumnType("nvarchar(max)");
b.Property<Guid?>("CoverImageMediaId")
.HasColumnType("uniqueidentifier");
b.Property<DateTime>("CreationTime")
.HasColumnType("datetime2")
.HasColumnName("CreationTime");
@ -1381,7 +1384,7 @@ namespace Volo.CmsKit.Migrations
b.ToTable("CmsComments");
});
modelBuilder.Entity("Volo.CmsKit.Contents.Content", b =>
modelBuilder.Entity("Volo.CmsKit.MediaDescriptors.MediaDescriptor", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
@ -1409,11 +1412,6 @@ namespace Volo.CmsKit.Migrations
.HasColumnType("datetime2")
.HasColumnName("DeletionTime");
b.Property<string>("EntityId")
.IsRequired()
.HasMaxLength(64)
.HasColumnType("nvarchar(64)");
b.Property<string>("EntityType")
.IsRequired()
.HasMaxLength(64)
@ -1437,23 +1435,30 @@ namespace Volo.CmsKit.Migrations
.HasColumnType("uniqueidentifier")
.HasColumnName("LastModifierId");
b.Property<Guid?>("TenantId")
.HasColumnType("uniqueidentifier")
.HasColumnName("TenantId");
b.Property<string>("MimeType")
.IsRequired()
.HasMaxLength(128)
.HasColumnType("nvarchar(128)");
b.Property<string>("Value")
b.Property<string>("Name")
.IsRequired()
.HasMaxLength(255)
.HasColumnType("nvarchar(255)");
b.Property<long>("Size")
.HasMaxLength(2147483647)
.HasColumnType("nvarchar(max)");
.HasColumnType("bigint");
b.HasKey("Id");
b.Property<Guid?>("TenantId")
.HasColumnType("uniqueidentifier")
.HasColumnName("TenantId");
b.HasIndex("TenantId", "EntityType", "EntityId");
b.HasKey("Id");
b.ToTable("CmsContents");
b.ToTable("CmsMediaDescriptors");
});
modelBuilder.Entity("Volo.CmsKit.MediaDescriptors.MediaDescriptor", b =>
modelBuilder.Entity("Volo.CmsKit.Menus.Menu", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
@ -1481,11 +1486,6 @@ namespace Volo.CmsKit.Migrations
.HasColumnType("datetime2")
.HasColumnName("DeletionTime");
b.Property<string>("EntityType")
.IsRequired()
.HasMaxLength(64)
.HasColumnType("nvarchar(64)");
b.Property<string>("ExtraProperties")
.HasColumnType("nvarchar(max)")
.HasColumnName("ExtraProperties");
@ -1496,6 +1496,9 @@ namespace Volo.CmsKit.Migrations
.HasDefaultValue(false)
.HasColumnName("IsDeleted");
b.Property<bool>("IsMainMenu")
.HasColumnType("bit");
b.Property<DateTime?>("LastModificationTime")
.HasColumnType("datetime2")
.HasColumnName("LastModificationTime");
@ -1504,19 +1507,8 @@ namespace Volo.CmsKit.Migrations
.HasColumnType("uniqueidentifier")
.HasColumnName("LastModifierId");
b.Property<string>("MimeType")
.IsRequired()
.HasMaxLength(128)
.HasColumnType("nvarchar(128)");
b.Property<string>("Name")
.IsRequired()
.HasMaxLength(255)
.HasColumnType("nvarchar(255)");
b.Property<long>("Size")
.HasMaxLength(2147483647)
.HasColumnType("bigint");
.HasColumnType("nvarchar(max)");
b.Property<Guid?>("TenantId")
.HasColumnType("uniqueidentifier")
@ -1524,7 +1516,73 @@ namespace Volo.CmsKit.Migrations
b.HasKey("Id");
b.ToTable("CmsMediaDescriptors");
b.ToTable("CmsMenus");
});
modelBuilder.Entity("Volo.CmsKit.Menus.MenuItem", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("uniqueidentifier");
b.Property<DateTime>("CreationTime")
.HasColumnType("datetime2")
.HasColumnName("CreationTime");
b.Property<Guid?>("CreatorId")
.HasColumnType("uniqueidentifier")
.HasColumnName("CreatorId");
b.Property<string>("CssClass")
.HasColumnType("nvarchar(max)");
b.Property<string>("DisplayName")
.IsRequired()
.HasMaxLength(64)
.HasColumnType("nvarchar(64)");
b.Property<string>("ElementId")
.HasColumnType("nvarchar(max)");
b.Property<string>("Icon")
.HasColumnType("nvarchar(max)");
b.Property<bool>("IsActive")
.HasColumnType("bit");
b.Property<DateTime?>("LastModificationTime")
.HasColumnType("datetime2")
.HasColumnName("LastModificationTime");
b.Property<Guid?>("LastModifierId")
.HasColumnType("uniqueidentifier")
.HasColumnName("LastModifierId");
b.Property<Guid>("MenuId")
.HasColumnType("uniqueidentifier");
b.Property<int>("Order")
.HasColumnType("int");
b.Property<Guid?>("PageId")
.HasColumnType("uniqueidentifier");
b.Property<Guid?>("ParentId")
.HasColumnType("uniqueidentifier");
b.Property<string>("Target")
.HasColumnType("nvarchar(max)");
b.Property<string>("Url")
.IsRequired()
.HasMaxLength(1024)
.HasColumnType("nvarchar(1024)");
b.HasKey("Id");
b.HasIndex("MenuId");
b.ToTable("CmsMenuItems");
});
modelBuilder.Entity("Volo.CmsKit.Pages.Page", b =>
@ -1577,11 +1635,17 @@ namespace Volo.CmsKit.Migrations
.HasColumnType("uniqueidentifier")
.HasColumnName("LastModifierId");
b.Property<string>("Script")
.HasColumnType("nvarchar(max)");
b.Property<string>("Slug")
.IsRequired()
.HasMaxLength(256)
.HasColumnType("nvarchar(256)");
b.Property<string>("Style")
.HasColumnType("nvarchar(max)");
b.Property<Guid?>("TenantId")
.HasColumnType("uniqueidentifier")
.HasColumnName("TenantId");
@ -1975,6 +2039,15 @@ namespace Volo.CmsKit.Migrations
b.Navigation("Author");
});
modelBuilder.Entity("Volo.CmsKit.Menus.MenuItem", b =>
{
b.HasOne("Volo.CmsKit.Menus.Menu", null)
.WithMany("Items")
.HasForeignKey("MenuId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLog", b =>
{
b.Navigation("Actions");
@ -2014,6 +2087,11 @@ namespace Volo.CmsKit.Migrations
{
b.Navigation("ConnectionStrings");
});
modelBuilder.Entity("Volo.CmsKit.Menus.Menu", b =>
{
b.Navigation("Items");
});
#pragma warning restore 612, 618
}
}

136
modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20210219113255_Initial.cs → modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20210614072230_Initial.cs

@ -273,7 +273,7 @@ namespace Volo.CmsKit.Migrations
Id = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
BlogId = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
FeatureName = table.Column<string>(type: "nvarchar(64)", maxLength: 64, nullable: false),
Enabled = table.Column<bool>(type: "bit", nullable: false),
IsEnabled = table.Column<bool>(type: "bit", nullable: false),
ExtraProperties = table.Column<string>(type: "nvarchar(max)", nullable: true),
ConcurrencyStamp = table.Column<string>(type: "nvarchar(40)", maxLength: 40, nullable: true),
CreationTime = table.Column<DateTime>(type: "datetime2", nullable: false),
@ -331,14 +331,28 @@ namespace Volo.CmsKit.Migrations
});
migrationBuilder.CreateTable(
name: "CmsContents",
name: "CmsEntityTags",
columns: table => new
{
TagId = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
EntityId = table.Column<string>(type: "nvarchar(450)", nullable: false),
TenantId = table.Column<Guid>(type: "uniqueidentifier", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_CmsEntityTags", x => new { x.EntityId, x.TagId });
});
migrationBuilder.CreateTable(
name: "CmsMediaDescriptors",
columns: table => new
{
Id = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
TenantId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
EntityType = table.Column<string>(type: "nvarchar(64)", maxLength: 64, nullable: false),
EntityId = table.Column<string>(type: "nvarchar(64)", maxLength: 64, nullable: false),
Value = table.Column<string>(type: "nvarchar(max)", maxLength: 2147483647, nullable: false),
Name = table.Column<string>(type: "nvarchar(255)", maxLength: 255, nullable: false),
MimeType = table.Column<string>(type: "nvarchar(128)", maxLength: 128, nullable: false),
Size = table.Column<long>(type: "bigint", maxLength: 2147483647, nullable: false),
ExtraProperties = table.Column<string>(type: "nvarchar(max)", nullable: true),
ConcurrencyStamp = table.Column<string>(type: "nvarchar(40)", maxLength: 40, nullable: true),
CreationTime = table.Column<DateTime>(type: "datetime2", nullable: false),
@ -351,31 +365,17 @@ namespace Volo.CmsKit.Migrations
},
constraints: table =>
{
table.PrimaryKey("PK_CmsContents", x => x.Id);
});
migrationBuilder.CreateTable(
name: "CmsEntityTags",
columns: table => new
{
TagId = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
EntityId = table.Column<string>(type: "nvarchar(450)", nullable: false),
TenantId = table.Column<Guid>(type: "uniqueidentifier", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_CmsEntityTags", x => new { x.EntityId, x.TagId });
table.PrimaryKey("PK_CmsMediaDescriptors", x => x.Id);
});
migrationBuilder.CreateTable(
name: "CmsMediaDescriptors",
name: "CmsMenus",
columns: table => new
{
Id = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
Name = table.Column<string>(type: "nvarchar(max)", nullable: true),
IsMainMenu = table.Column<bool>(type: "bit", nullable: false),
TenantId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
Name = table.Column<string>(type: "nvarchar(255)", maxLength: 255, nullable: false),
MimeType = table.Column<string>(type: "nvarchar(128)", maxLength: 128, nullable: false),
Size = table.Column<long>(type: "bigint", maxLength: 2147483647, nullable: false),
ExtraProperties = table.Column<string>(type: "nvarchar(max)", nullable: true),
ConcurrencyStamp = table.Column<string>(type: "nvarchar(40)", maxLength: 40, nullable: true),
CreationTime = table.Column<DateTime>(type: "datetime2", nullable: false),
@ -388,7 +388,7 @@ namespace Volo.CmsKit.Migrations
},
constraints: table =>
{
table.PrimaryKey("PK_CmsMediaDescriptors", x => x.Id);
table.PrimaryKey("PK_CmsMenus", x => x.Id);
});
migrationBuilder.CreateTable(
@ -399,7 +399,9 @@ namespace Volo.CmsKit.Migrations
TenantId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
Title = table.Column<string>(type: "nvarchar(256)", maxLength: 256, nullable: false),
Slug = table.Column<string>(type: "nvarchar(256)", maxLength: 256, nullable: false),
Description = table.Column<string>(type: "nvarchar(512)", maxLength: 512, nullable: true),
Content = table.Column<string>(type: "nvarchar(max)", maxLength: 2147483647, nullable: true),
Script = table.Column<string>(type: "nvarchar(max)", nullable: true),
Style = table.Column<string>(type: "nvarchar(max)", nullable: true),
ExtraProperties = table.Column<string>(type: "nvarchar(max)", nullable: true),
ConcurrencyStamp = table.Column<string>(type: "nvarchar(40)", maxLength: 40, nullable: true),
CreationTime = table.Column<DateTime>(type: "datetime2", nullable: false),
@ -748,6 +750,38 @@ namespace Volo.CmsKit.Migrations
onDelete: ReferentialAction.Cascade);
});
migrationBuilder.CreateTable(
name: "CmsMenuItems",
columns: table => new
{
Id = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
MenuId = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
ParentId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
DisplayName = table.Column<string>(type: "nvarchar(64)", maxLength: 64, nullable: false),
IsActive = table.Column<bool>(type: "bit", nullable: false),
Url = table.Column<string>(type: "nvarchar(1024)", maxLength: 1024, nullable: false),
Icon = table.Column<string>(type: "nvarchar(max)", nullable: true),
Order = table.Column<int>(type: "int", nullable: false),
Target = table.Column<string>(type: "nvarchar(max)", nullable: true),
ElementId = table.Column<string>(type: "nvarchar(max)", nullable: true),
CssClass = table.Column<string>(type: "nvarchar(max)", nullable: true),
PageId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
CreationTime = table.Column<DateTime>(type: "datetime2", nullable: false),
CreatorId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
LastModificationTime = table.Column<DateTime>(type: "datetime2", nullable: true),
LastModifierId = table.Column<Guid>(type: "uniqueidentifier", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_CmsMenuItems", x => x.Id);
table.ForeignKey(
name: "FK_CmsMenuItems_CmsMenus_MenuId",
column: x => x.MenuId,
principalTable: "CmsMenus",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
});
migrationBuilder.CreateTable(
name: "CmsBlogPosts",
columns: table => new
@ -757,7 +791,10 @@ namespace Volo.CmsKit.Migrations
Title = table.Column<string>(type: "nvarchar(64)", maxLength: 64, nullable: false),
Slug = table.Column<string>(type: "nvarchar(256)", maxLength: 256, nullable: false),
ShortDescription = table.Column<string>(type: "nvarchar(256)", maxLength: 256, nullable: true),
Content = table.Column<string>(type: "nvarchar(max)", maxLength: 2147483647, nullable: true),
CoverImageMediaId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
TenantId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
AuthorId = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
ExtraProperties = table.Column<string>(type: "nvarchar(max)", nullable: true),
ConcurrencyStamp = table.Column<string>(type: "nvarchar(40)", maxLength: 40, nullable: true),
CreationTime = table.Column<DateTime>(type: "datetime2", nullable: false),
@ -772,23 +809,11 @@ namespace Volo.CmsKit.Migrations
{
table.PrimaryKey("PK_CmsBlogPosts", x => x.Id);
table.ForeignKey(
name: "FK_CmsBlogPosts_CmsUsers_CreatorId",
column: x => x.CreatorId,
principalTable: "CmsUsers",
principalColumn: "Id",
onDelete: ReferentialAction.Restrict);
table.ForeignKey(
name: "FK_CmsBlogPosts_CmsUsers_DeleterId",
column: x => x.DeleterId,
principalTable: "CmsUsers",
principalColumn: "Id",
onDelete: ReferentialAction.Restrict);
table.ForeignKey(
name: "FK_CmsBlogPosts_CmsUsers_LastModifierId",
column: x => x.LastModifierId,
name: "FK_CmsBlogPosts_CmsUsers_AuthorId",
column: x => x.AuthorId,
principalTable: "CmsUsers",
principalColumn: "Id",
onDelete: ReferentialAction.Restrict);
onDelete: ReferentialAction.Cascade);
});
migrationBuilder.CreateTable(
@ -977,19 +1002,9 @@ namespace Volo.CmsKit.Migrations
column: "UserName");
migrationBuilder.CreateIndex(
name: "IX_CmsBlogPosts_CreatorId",
table: "CmsBlogPosts",
column: "CreatorId");
migrationBuilder.CreateIndex(
name: "IX_CmsBlogPosts_DeleterId",
name: "IX_CmsBlogPosts_AuthorId",
table: "CmsBlogPosts",
column: "DeleterId");
migrationBuilder.CreateIndex(
name: "IX_CmsBlogPosts_LastModifierId",
table: "CmsBlogPosts",
column: "LastModifierId");
column: "AuthorId");
migrationBuilder.CreateIndex(
name: "IX_CmsBlogPosts_Slug_BlogId",
@ -1006,16 +1021,16 @@ namespace Volo.CmsKit.Migrations
table: "CmsComments",
columns: new[] { "TenantId", "RepliedCommentId" });
migrationBuilder.CreateIndex(
name: "IX_CmsContents_TenantId_EntityType_EntityId",
table: "CmsContents",
columns: new[] { "TenantId", "EntityType", "EntityId" });
migrationBuilder.CreateIndex(
name: "IX_CmsEntityTags_TenantId_EntityId_TagId",
table: "CmsEntityTags",
columns: new[] { "TenantId", "EntityId", "TagId" });
migrationBuilder.CreateIndex(
name: "IX_CmsMenuItems_MenuId",
table: "CmsMenuItems",
column: "MenuId");
migrationBuilder.CreateIndex(
name: "IX_CmsPages_TenantId_Slug",
table: "CmsPages",
@ -1117,15 +1132,15 @@ namespace Volo.CmsKit.Migrations
migrationBuilder.DropTable(
name: "CmsComments");
migrationBuilder.DropTable(
name: "CmsContents");
migrationBuilder.DropTable(
name: "CmsEntityTags");
migrationBuilder.DropTable(
name: "CmsMediaDescriptors");
migrationBuilder.DropTable(
name: "CmsMenuItems");
migrationBuilder.DropTable(
name: "CmsPages");
@ -1159,6 +1174,9 @@ namespace Volo.CmsKit.Migrations
migrationBuilder.DropTable(
name: "CmsUsers");
migrationBuilder.DropTable(
name: "CmsMenus");
migrationBuilder.DropTable(
name: "AbpAuditLogs");
}

143
modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/UnifiedDbContextModelSnapshot.cs

@ -18,7 +18,7 @@ namespace Volo.CmsKit.Migrations
modelBuilder
.HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer)
.HasAnnotation("Relational:MaxIdentifierLength", 128)
.HasAnnotation("ProductVersion", "5.0.4")
.HasAnnotation("ProductVersion", "5.0.7")
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLog", b =>
@ -1456,6 +1456,133 @@ namespace Volo.CmsKit.Migrations
b.ToTable("CmsMediaDescriptors");
});
modelBuilder.Entity("Volo.CmsKit.Menus.Menu", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("uniqueidentifier");
b.Property<string>("ConcurrencyStamp")
.IsConcurrencyToken()
.HasMaxLength(40)
.HasColumnType("nvarchar(40)")
.HasColumnName("ConcurrencyStamp");
b.Property<DateTime>("CreationTime")
.HasColumnType("datetime2")
.HasColumnName("CreationTime");
b.Property<Guid?>("CreatorId")
.HasColumnType("uniqueidentifier")
.HasColumnName("CreatorId");
b.Property<Guid?>("DeleterId")
.HasColumnType("uniqueidentifier")
.HasColumnName("DeleterId");
b.Property<DateTime?>("DeletionTime")
.HasColumnType("datetime2")
.HasColumnName("DeletionTime");
b.Property<string>("ExtraProperties")
.HasColumnType("nvarchar(max)")
.HasColumnName("ExtraProperties");
b.Property<bool>("IsDeleted")
.ValueGeneratedOnAdd()
.HasColumnType("bit")
.HasDefaultValue(false)
.HasColumnName("IsDeleted");
b.Property<bool>("IsMainMenu")
.HasColumnType("bit");
b.Property<DateTime?>("LastModificationTime")
.HasColumnType("datetime2")
.HasColumnName("LastModificationTime");
b.Property<Guid?>("LastModifierId")
.HasColumnType("uniqueidentifier")
.HasColumnName("LastModifierId");
b.Property<string>("Name")
.HasColumnType("nvarchar(max)");
b.Property<Guid?>("TenantId")
.HasColumnType("uniqueidentifier")
.HasColumnName("TenantId");
b.HasKey("Id");
b.ToTable("CmsMenus");
});
modelBuilder.Entity("Volo.CmsKit.Menus.MenuItem", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("uniqueidentifier");
b.Property<DateTime>("CreationTime")
.HasColumnType("datetime2")
.HasColumnName("CreationTime");
b.Property<Guid?>("CreatorId")
.HasColumnType("uniqueidentifier")
.HasColumnName("CreatorId");
b.Property<string>("CssClass")
.HasColumnType("nvarchar(max)");
b.Property<string>("DisplayName")
.IsRequired()
.HasMaxLength(64)
.HasColumnType("nvarchar(64)");
b.Property<string>("ElementId")
.HasColumnType("nvarchar(max)");
b.Property<string>("Icon")
.HasColumnType("nvarchar(max)");
b.Property<bool>("IsActive")
.HasColumnType("bit");
b.Property<DateTime?>("LastModificationTime")
.HasColumnType("datetime2")
.HasColumnName("LastModificationTime");
b.Property<Guid?>("LastModifierId")
.HasColumnType("uniqueidentifier")
.HasColumnName("LastModifierId");
b.Property<Guid>("MenuId")
.HasColumnType("uniqueidentifier");
b.Property<int>("Order")
.HasColumnType("int");
b.Property<Guid?>("PageId")
.HasColumnType("uniqueidentifier");
b.Property<Guid?>("ParentId")
.HasColumnType("uniqueidentifier");
b.Property<string>("Target")
.HasColumnType("nvarchar(max)");
b.Property<string>("Url")
.IsRequired()
.HasMaxLength(1024)
.HasColumnType("nvarchar(1024)");
b.HasKey("Id");
b.HasIndex("MenuId");
b.ToTable("CmsMenuItems");
});
modelBuilder.Entity("Volo.CmsKit.Pages.Page", b =>
{
b.Property<Guid>("Id")
@ -1910,6 +2037,15 @@ namespace Volo.CmsKit.Migrations
b.Navigation("Author");
});
modelBuilder.Entity("Volo.CmsKit.Menus.MenuItem", b =>
{
b.HasOne("Volo.CmsKit.Menus.Menu", null)
.WithMany("Items")
.HasForeignKey("MenuId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLog", b =>
{
b.Navigation("Actions");
@ -1949,6 +2085,11 @@ namespace Volo.CmsKit.Migrations
{
b.Navigation("ConnectionStrings");
});
modelBuilder.Entity("Volo.CmsKit.Menus.Menu", b =>
{
b.Navigation("Items");
});
#pragma warning restore 612, 618
}
}

2
modules/cms-kit/host/Volo.CmsKit.Web.Unified/Properties/launchSettings.json

@ -15,7 +15,7 @@
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"Volo.CmsKit.DemoApp": {
"Volo.CmsKit.Web.Unified": {
"commandName": "Project",
"launchBrowser": true,
"applicationUrl": "https://localhost:44349",

3
modules/cms-kit/host/Volo.CmsKit.Web.Unified/package.json

@ -8,6 +8,7 @@
"@abp/tui-editor": "^4.3.2",
"tui-code-snippet": "1.5.2",
"@abp/uppy": "^4.3.2",
"slugify": "1.4.6"
"slugify": "1.4.6",
"@abp/jstree": "4.3.2"
}
}

8638
modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/jstree/jstree.js

File diff suppressed because it is too large

6
modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/jstree/jstree.min.js

File diff suppressed because one or more lines are too long

BIN
modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/jstree/themes/default-dark/32px.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

BIN
modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/jstree/themes/default-dark/40px.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

1146
modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/jstree/themes/default-dark/style.css

File diff suppressed because it is too large

1
modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/jstree/themes/default-dark/style.min.css

File diff suppressed because one or more lines are too long

BIN
modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/jstree/themes/default-dark/throbber.gif

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/jstree/themes/default/32px.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

BIN
modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/jstree/themes/default/40px.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

1102
modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/jstree/themes/default/style.css

File diff suppressed because it is too large

1
modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/jstree/themes/default/style.min.css

File diff suppressed because one or more lines are too long

BIN
modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/jstree/themes/default/throbber.gif

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

20
modules/cms-kit/host/Volo.CmsKit.Web.Unified/yarn.lock

@ -160,6 +160,14 @@
"@abp/core" "~4.3.2"
jquery "~3.5.1"
"@abp/jstree@4.3.2":
version "4.3.2"
resolved "https://registry.yarnpkg.com/@abp/jstree/-/jstree-4.3.2.tgz#9743f703139ae4f10263f51cb7c58789f50ee9a7"
integrity sha512-7bGKMKsJPn5ETM2JXs/VhcW6qeK69BRSLyFNL0nHdKHQ4EUayuwDcoC0N7snwUnX9prH9nr3dSEe4LRzI7617g==
dependencies:
"@abp/jquery" "~4.3.2"
jstree "^3.3.9"
"@abp/lodash@~4.3.2":
version "4.3.2"
resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-4.3.2.tgz#a785378c298274aac8c9c2b8fe44f744ad9d5023"
@ -2032,6 +2040,11 @@ jquery@>=1.12.0, jquery@>=1.7, jquery@>=1.7.2, jquery@>=1.8, "jquery@^1.7 || ^2.
resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.4.1.tgz#714f1f8d9dde4bdfa55764ba37ef214630d80ef2"
integrity sha512-36+AdBzCL+y6qjw5Tx7HgzeGCzC81MDDgaUP8ld2zhx58HdqXGoBd+tHdrBMiyjGQs0Hxs/MLZTu/eHNJJuWPw==
jquery@>=1.9.1:
version "3.6.0"
resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.6.0.tgz#c72a09f15c1bdce142f49dbf1170bdf8adac2470"
integrity sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw==
jquery@^3.3.1, jquery@~3.5.1:
version "3.5.1"
resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.5.1.tgz#d7b4d08e1bfdb86ad2f1a3d039ea17304717abb5"
@ -2047,6 +2060,13 @@ json-stable-stringify-without-jsonify@^1.0.1:
resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651"
integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=
jstree@^3.3.9:
version "3.3.11"
resolved "https://registry.yarnpkg.com/jstree/-/jstree-3.3.11.tgz#da2f12bcab6af61839586c81db46e8f2e19160aa"
integrity sha512-9ZJKroPjCyjb6JLPuAbBrLJKT6pS1f4m5gkwoEagG5oQWtvzm0IiDsntXTxeFtz7AmqrKfij+gLfF9MgWriNxg==
dependencies:
jquery ">=1.9.1"
just-compare@^1.3.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/just-compare/-/just-compare-1.3.0.tgz#a53c31373f150a5b238555c243af4d8a38d7a0e5"

36
modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Menus/IMenuAdminAppService.cs

@ -0,0 +1,36 @@
using System;
using System.Threading.Tasks;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services;
using Volo.CmsKit.Menus;
namespace Volo.CmsKit.Admin.Menus
{
public interface IMenuAdminAppService : IApplicationService
{
Task<PagedResultDto<MenuWithDetailsDto>> GetListAsync(PagedAndSortedResultRequestDto input);
Task<MenuWithDetailsDto> GetAsync(Guid id);
Task<MenuWithDetailsDto> CreateAsync(MenuCreateInput input);
Task<MenuWithDetailsDto> UpdateAsync(Guid menuId, MenuUpdateInput input);
Task DeleteAsync(Guid menuId);
Task<MenuItemDto> GetMenuItemAsync(Guid menuId, Guid menuItemId);
Task<MenuItemDto> CreateMenuItemAsync(Guid menuId, MenuItemCreateInput input);
Task<MenuItemDto> UpdateMenuItemAsync(Guid menuId, Guid menuItemId, MenuItemUpdateInput input);
Task DeleteMenuItemAsync(Guid menuId, Guid menuItemId);
Task MoveMenuItemAsync(Guid menuId, Guid menuItemId, MenuItemMoveInput input);
Task UpdateMainMenuAsync(Guid menuId, UpdateMainMenuInput input);
Task<PagedResultDto<PageLookupDto>> GetPageLookupAsync(PageLookupInputDto input);
}
}

14
modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Menus/MenuCreateInput.cs

@ -0,0 +1,14 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Volo.CmsKit.Admin.Menus
{
[Serializable]
public class MenuCreateInput
{
public string Name { get; set; }
}
}

32
modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Menus/MenuItemCreateInput.cs

@ -0,0 +1,32 @@
using System;
using System.ComponentModel.DataAnnotations;
namespace Volo.CmsKit.Admin.Menus
{
[Serializable]
public class MenuItemCreateInput
{
public Guid MenuId { get; set; }
public Guid? ParentId { get; set; }
[Required]
public string DisplayName { get; set; }
public bool IsActive { get; set; }
public string Url { get; set; }
public string Icon { get; set; }
public int Order { get; set; }
public string Target { get; set; }
public string ElementId { get; set; }
public string CssClass { get; set; }
public Guid? PageId { get; set; }
}
}

16
modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Menus/MenuItemMoveInput.cs

@ -0,0 +1,16 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Volo.CmsKit.Admin.Menus
{
[Serializable]
public class MenuItemMoveInput
{
public Guid? NewParentId { get; set; }
public int Position { get; set; }
}
}

26
modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Menus/MenuItemUpdateInput.cs

@ -0,0 +1,26 @@
using System;
using System.ComponentModel.DataAnnotations;
namespace Volo.CmsKit.Admin.Menus
{
[Serializable]
public class MenuItemUpdateInput
{
[Required]
public string DisplayName { get; set; }
public bool IsActive { get; set; }
public string Url { get; set; }
public string Icon { get; set; }
public string Target { get; set; }
public string ElementId { get; set; }
public string CssClass { get; set; }
public Guid? PageId { get; set; }
}
}

14
modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Menus/MenuUpdateInput.cs

@ -0,0 +1,14 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Volo.CmsKit.Admin.Menus
{
[Serializable]
public class MenuUpdateInput
{
public string Name { get; set; }
}
}

12
modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Menus/PageLookupDto.cs

@ -0,0 +1,12 @@
using System;
using Volo.Abp.Application.Dtos;
namespace Volo.CmsKit.Admin.Menus
{
public class PageLookupDto : EntityDto<Guid>
{
public string Title { get; set; }
public string Slug { get; set; }
}
}

11
modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Menus/PageLookupInputDto.cs

@ -0,0 +1,11 @@
using System;
using Volo.Abp.Application.Dtos;
namespace Volo.CmsKit.Admin.Menus
{
[Serializable]
public class PageLookupInputDto: PagedAndSortedResultRequestDto
{
public string Filter { get; set; }
}
}

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

@ -0,0 +1,10 @@
using System;
namespace Volo.CmsKit.Admin.Menus
{
[Serializable]
public class UpdateMainMenuInput
{
public bool IsMainMenu { get; set; }
}
}

1
modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Pages/IPageAdminAppService.cs

@ -1,5 +1,6 @@
using System;
using System.Threading.Tasks;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services;
using Volo.Abp.Content;

10
modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Permissions/CmsKitAdminPermissionDefinitionProvider.cs

@ -55,6 +55,16 @@ namespace Volo.CmsKit.Permissions
.RequireGlobalFeatures(typeof(BlogsFeature));
blogPostManagement.AddChild(CmsKitAdminPermissions.BlogPosts.Delete, L("Permission:BlogPostManagement.Delete"))
.RequireGlobalFeatures(typeof(BlogsFeature));
var menuManagement = cmsGroup.AddPermission(CmsKitAdminPermissions.Menus.Default, L("Permission:MenuManagement"))
.RequireGlobalFeatures(typeof(MenuFeature));
menuManagement.AddChild(CmsKitAdminPermissions.Menus.Create, L("Permission:MenuManagement.Create"))
.RequireGlobalFeatures(typeof(MenuFeature));
menuManagement.AddChild(CmsKitAdminPermissions.Menus.Update, L("Permission:MenuManagement.Update"))
.RequireGlobalFeatures(typeof(MenuFeature));
menuManagement.AddChild(CmsKitAdminPermissions.Menus.Delete, L("Permission:MenuManagement.Delete"))
.RequireGlobalFeatures(typeof(MenuFeature));
}
private static LocalizableString L(string name)

8
modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Permissions/CmsKitAdminPermissions.cs

@ -52,5 +52,13 @@ namespace Volo.CmsKit.Permissions
public const string Update = Default + ".Update";
public const string Delete = Default + ".Delete";
}
public static class Menus
{
public const string Default = GroupName + ".Menus";
public const string Create = Default + ".Create";
public const string Update = Default + ".Update";
public const string Delete = Default + ".Delete";
}
}
}

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

@ -11,6 +11,8 @@ using Volo.CmsKit.MediaDescriptors;
using Volo.CmsKit.Pages;
using Volo.CmsKit.Tags;
using Volo.CmsKit.Users;
using Volo.CmsKit.Menus;
using Volo.CmsKit.Admin.Menus;
namespace Volo.CmsKit.Admin
{
@ -19,12 +21,13 @@ namespace Volo.CmsKit.Admin
public CmsKitAdminApplicationAutoMapperProfile()
{
CreateMap<CmsUser, Comments.CmsUserDto>();
CreateMap<Comment, CommentDto>();
CreateMap<Comment, CommentWithAuthorDto>()
.Ignore(x=> x.Author);
.Ignore(x => x.Author);
CreateMap<Page, PageDto>();
CreateMap<Page, PageLookupDto>();
CreateMap<BlogPost, BlogPostDto>(MemberList.Destination);
CreateMap<BlogPost, BlogPostListDto>()
@ -39,6 +42,9 @@ namespace Volo.CmsKit.Admin
CreateMap<Tag, TagDto>();
CreateMap<MediaDescriptor, MediaDescriptorDto>();
CreateMap<Menu, MenuWithDetailsDto>();
CreateMap<MenuItem, MenuItemDto>();
}
}
}

207
modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Menus/MenuAdminAppService.cs

@ -0,0 +1,207 @@
using Microsoft.AspNetCore.Authorization;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Domain.Entities;
using Volo.Abp.GlobalFeatures;
using Volo.CmsKit.GlobalFeatures;
using Volo.CmsKit.Menus;
using Volo.CmsKit.Pages;
using Volo.CmsKit.Permissions;
namespace Volo.CmsKit.Admin.Menus
{
[RequiresGlobalFeature(typeof(MenuFeature))]
[Authorize(CmsKitAdminPermissions.Menus.Default)]
public class MenuAdminAppService : CmsKitAdminAppServiceBase, IMenuAdminAppService
{
protected MenuManager MenuManager { get; }
protected IMenuRepository MenuRepository { get; }
protected IPageRepository PageRepository { get; }
public MenuAdminAppService(
MenuManager menuManager,
IMenuRepository menuRepository,
IPageRepository pageRepository)
{
MenuManager = menuManager;
MenuRepository = menuRepository;
PageRepository = pageRepository;
}
public async Task<PagedResultDto<MenuWithDetailsDto>> GetListAsync(PagedAndSortedResultRequestDto input)
{
var menus = await MenuRepository.GetPagedListAsync(input.SkipCount, input.MaxResultCount, input.Sorting);
return new PagedResultDto<MenuWithDetailsDto>(
await MenuRepository.GetCountAsync(),
ObjectMapper.Map<List<Menu>, List<MenuWithDetailsDto>>(menus)
);
}
public async Task<MenuWithDetailsDto> GetAsync(Guid id)
{
var menu = await MenuRepository.GetAsync(id, includeDetails: true);
return ObjectMapper.Map<Menu, MenuWithDetailsDto>(menu);
}
public async Task<MenuWithDetailsDto> GetSimpleAsync(Guid id)
{
var menu = await MenuRepository.GetAsync(id, includeDetails: false);
return ObjectMapper.Map<Menu, MenuWithDetailsDto>(menu);
}
[Authorize(CmsKitAdminPermissions.Menus.Create)]
public async Task<MenuWithDetailsDto> CreateAsync(MenuCreateInput input)
{
var menu = await MenuManager.CreateAsync(CurrentTenant.Id, input.Name);
await MenuRepository.InsertAsync(menu);
return ObjectMapper.Map<Menu, MenuWithDetailsDto>(menu);
}
[Authorize(CmsKitAdminPermissions.Menus.Update)]
public async Task<MenuWithDetailsDto> UpdateAsync(Guid menuId, MenuUpdateInput input)
{
var menu = await MenuRepository.GetAsync(menuId);
menu.SetName(input.Name);
await MenuRepository.UpdateAsync(menu);
return ObjectMapper.Map<Menu, MenuWithDetailsDto>(menu);
}
[Authorize(CmsKitAdminPermissions.Menus.Delete)]
public virtual Task DeleteAsync(Guid menuId)
{
return MenuRepository.DeleteAsync(menuId);
}
public async Task<MenuItemDto> GetMenuItemAsync(Guid menuId, Guid menuItemId)
{
var menu = await MenuRepository.GetAsync(menuId);
var menuItem = menu.Items.FirstOrDefault(x => x.Id == menuItemId)
?? throw new EntityNotFoundException(typeof(MenuItem), menuItemId);
return ObjectMapper.Map<MenuItem, MenuItemDto>(menuItem);
}
[Authorize(CmsKitAdminPermissions.Menus.Update)]
public virtual async Task<MenuItemDto> CreateMenuItemAsync(Guid menuId, MenuItemCreateInput input)
{
var menu = await MenuRepository.GetAsync(menuId, includeDetails: true);
var menuItem =
new MenuItem(
GuidGenerator.Create(),
menuId,
input.DisplayName,
input.Url.IsNullOrEmpty() ? "#" : input.Url,
input.IsActive,
input.ParentId,
input.Icon,
input.Order,
input.Target,
input.ElementId,
input.CssClass);
if (input.PageId.HasValue)
{
var page = await PageRepository.GetAsync(input.PageId.Value);
MenuManager.SetPageUrl(menuItem, page);
}
menu.Items.Add(menuItem);
MenuManager.OrganizeTreeOrderForMenuItem(menu, menuItem);
await MenuRepository.UpdateAsync(menu);
return ObjectMapper.Map<MenuItem, MenuItemDto>(menuItem);
}
[Authorize(CmsKitAdminPermissions.Menus.Update)]
public virtual async Task<MenuItemDto> UpdateMenuItemAsync(Guid menuId, Guid menuItemId,
MenuItemUpdateInput input)
{
var menu = await MenuRepository.GetAsync(menuId, includeDetails: true);
var menuItem = menu.Items.FirstOrDefault(x => x.Id == menuItemId)
?? throw new EntityNotFoundException(typeof(MenuItem), menuItemId);
if (input.PageId.HasValue)
{
MenuManager.SetPageUrl(menuItem, await PageRepository.GetAsync(input.PageId.Value));
}
else
{
menuItem.SetUrl(input.Url);
}
menuItem.SetDisplayName(input.DisplayName);
menuItem.IsActive = input.IsActive;
menuItem.Icon = input.Icon;
menuItem.Target = input.Target;
menuItem.ElementId = input.ElementId;
menuItem.CssClass = input.CssClass;
await MenuRepository.UpdateAsync(menu);
return ObjectMapper.Map<MenuItem, MenuItemDto>(menuItem);
}
[Authorize(CmsKitAdminPermissions.Menus.Update)]
public virtual async Task DeleteMenuItemAsync(Guid menuId, Guid menuItemId)
{
var menu = await MenuRepository.GetAsync(menuId, includeDetails: true);
var menuItem = menu.Items.FirstOrDefault(x => x.Id == menuItemId)
?? throw new EntityNotFoundException(typeof(MenuItem), menuItemId);
menu.Items.Remove(menuItem);
await MenuRepository.UpdateAsync(menu);
}
[Authorize(CmsKitAdminPermissions.Menus.Update)]
public virtual Task MoveMenuItemAsync(Guid menuId, Guid menuItemId, MenuItemMoveInput input)
{
return MenuManager.MoveAsync(menuId, menuItemId, input.NewParentId, input.Position);
}
public virtual async Task UpdateMainMenuAsync(Guid menuId, UpdateMainMenuInput input)
{
if (input.IsMainMenu)
{
await MenuManager.SetMainMenuAsync(menuId);
}
else
{
await MenuManager.UnSetMainMenuAsync(menuId);
}
}
public virtual async Task<PagedResultDto<PageLookupDto>> GetPageLookupAsync(PageLookupInputDto input)
{
var count = await PageRepository.GetCountAsync(input.Filter);
var pages = await PageRepository.GetListAsync(
input.Filter,
input.MaxResultCount,
input.SkipCount,
input.Sorting
);
return new PagedResultDto<PageLookupDto>(
count,
ObjectMapper.Map<List<Page>, List<PageLookupDto>>(pages)
);
}
}
}

1
modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Pages/PageAdminAppService.cs

@ -5,6 +5,7 @@ using AutoMapper;
using Microsoft.AspNetCore.Authorization;
using Volo.Abp.Application.Dtos;
using Volo.Abp.GlobalFeatures;
using Volo.CmsKit.Admin.Menus;
using Volo.CmsKit.GlobalFeatures;
using Volo.CmsKit.Pages;
using Volo.CmsKit.Permissions;

123
modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Menus/MenuAdminController.cs

@ -0,0 +1,123 @@
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Volo.Abp;
using Volo.Abp.Application.Dtos;
using Volo.Abp.GlobalFeatures;
using Volo.Abp.UI.Navigation;
using Volo.CmsKit.GlobalFeatures;
using Volo.CmsKit.Menus;
using Volo.CmsKit.Permissions;
namespace Volo.CmsKit.Admin.Menus
{
[RequiresGlobalFeature(typeof(MenuFeature))]
[RemoteService(Name = CmsKitAdminRemoteServiceConsts.RemoteServiceName)]
[Area("cms-kit")]
[Authorize(CmsKitAdminPermissions.Menus.Default)]
[Route("api/cms-kit-admin/menus")]
public class MenuAdminController : CmsKitAdminController, IMenuAdminAppService
{
protected IMenuAdminAppService MenuAdminAppService { get; }
public MenuAdminController(IMenuAdminAppService menuAdminAppService)
{
MenuAdminAppService = menuAdminAppService;
}
[HttpPost]
[Authorize(CmsKitAdminPermissions.Menus.Create)]
public Task<MenuWithDetailsDto> CreateAsync(MenuCreateInput input)
{
return MenuAdminAppService.CreateAsync(input);
}
[Route("{menuId}/menu-items/{menuItemId}")]
[Authorize(CmsKitAdminPermissions.Menus.Update)]
[HttpGet]
public Task<MenuItemDto> GetMenuItemAsync(Guid menuId, Guid menuItemId)
{
return MenuAdminAppService.GetMenuItemAsync(menuId, menuItemId);
}
[Route("{menuId}/menu-items")]
[HttpPost]
[Authorize(CmsKitAdminPermissions.Menus.Update)]
public Task<MenuItemDto> CreateMenuItemAsync(Guid menuId, MenuItemCreateInput input)
{
return MenuAdminAppService.CreateMenuItemAsync(menuId, input);
}
[Route("{menuId}")]
[HttpDelete]
[Authorize(CmsKitAdminPermissions.Menus.Delete)]
public Task DeleteAsync(Guid menuId)
{
return MenuAdminAppService.DeleteAsync(menuId);
}
[Route("{menuId}/menu-items/{menuItemId}")]
[HttpDelete]
[Authorize(CmsKitAdminPermissions.Menus.Update)]
public Task DeleteMenuItemAsync(Guid menuId, Guid menuItemId)
{
return MenuAdminAppService.DeleteMenuItemAsync(menuId, menuItemId);
}
[Route("{menuId}")]
[HttpGet]
public Task<MenuWithDetailsDto> GetAsync(Guid menuId)
{
return MenuAdminAppService.GetAsync(menuId);
}
[HttpGet]
public Task<PagedResultDto<MenuWithDetailsDto>> GetListAsync(PagedAndSortedResultRequestDto input)
{
return MenuAdminAppService.GetListAsync(input);
}
[Route("{menuId}/menu-items/{menuItemId}/move")]
[HttpPut]
[Authorize(CmsKitAdminPermissions.Menus.Update)]
public Task MoveMenuItemAsync(Guid menuId, Guid menuItemId, MenuItemMoveInput input)
{
return MenuAdminAppService.MoveMenuItemAsync(menuId, menuItemId, input);
}
[Route("{menuId}/main-menu")]
[HttpPut]
[Authorize(CmsKitAdminPermissions.Menus.Update)]
public Task UpdateMainMenuAsync(Guid menuId, UpdateMainMenuInput input)
{
return MenuAdminAppService.UpdateMainMenuAsync(menuId, input);
}
[Route("{menuId}")]
[HttpPut]
[Authorize(CmsKitAdminPermissions.Menus.Update)]
public Task<MenuWithDetailsDto> UpdateAsync(Guid menuId, MenuUpdateInput input)
{
return MenuAdminAppService.UpdateAsync(menuId, input);
}
[Route("{menuId}/menu-items/{menuItemId}")]
[HttpPut]
[Authorize(CmsKitAdminPermissions.Menus.Update)]
public Task<MenuItemDto> UpdateMenuItemAsync(Guid menuId, Guid menuItemId, MenuItemUpdateInput input)
{
return MenuAdminAppService.UpdateMenuItemAsync(menuId, menuItemId, input);
}
[HttpGet]
[Route("lookup/pages")]
public virtual Task<PagedResultDto<PageLookupDto>> GetPageLookupAsync([FromQuery]PageLookupInputDto input)
{
return MenuAdminAppService.GetPageLookupAsync(input);
}
}
}

1
modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Pages/PageAdminController.cs

@ -5,6 +5,7 @@ using Microsoft.AspNetCore.Mvc;
using Volo.Abp;
using Volo.Abp.Application.Dtos;
using Volo.Abp.GlobalFeatures;
using Volo.CmsKit.Admin.Menus;
using Volo.CmsKit.GlobalFeatures;
using Volo.CmsKit.Permissions;

30
modules/cms-kit/src/Volo.CmsKit.Admin.Web/CmsKitAdminWebModule.cs

@ -69,6 +69,10 @@ namespace Volo.CmsKit.Admin.Web
options.Conventions.AuthorizeFolder("/CmsKit/BlogPosts/Update", CmsKitAdminPermissions.BlogPosts.Update);
options.Conventions.AuthorizeFolder("/CmsKit/Comments/", CmsKitAdminPermissions.Comments.Default);
options.Conventions.AuthorizeFolder("/CmsKit/Comments/Details", CmsKitAdminPermissions.Comments.Default);
options.Conventions.AuthorizeFolder("/CmsKit/Menus", CmsKitAdminPermissions.Menus.Default);
options.Conventions.AuthorizePage("/CmsKit/Menus/CreateModal", CmsKitAdminPermissions.Menus.Create);
options.Conventions.AuthorizePage("/CmsKit/Menus/UpdateModal", CmsKitAdminPermissions.Menus.Update);
options.Conventions.AuthorizeFolder("/CmsKit/Menus/MenuItems", CmsKitAdminPermissions.Menus.Update);
});
Configure<RazorPagesOptions>(options =>
@ -83,6 +87,8 @@ namespace Volo.CmsKit.Admin.Web
options.Conventions.AddPageRoute("/CmsKit/BlogPosts/Update", "/Cms/BlogPosts/Update/{Id}");
options.Conventions.AddPageRoute("/CmsKit/Comments/Index", "/Cms/Comments");
options.Conventions.AddPageRoute("/CmsKit/Comments/Details", "/Cms/Comments/{Id}");
options.Conventions.AddPageRoute("/CmsKit/Menus/Index", "/Cms/Menus");
options.Conventions.AddPageRoute("/CmsKit/Menus/MenuItems/Index", "/Cms/Menus/{Id}/menu-items");
});
Configure<AbpPageToolbarOptions>(options =>
@ -134,6 +140,30 @@ namespace Volo.CmsKit.Admin.Web
requiredPolicyName: CmsKitAdminPermissions.BlogPosts.Create
);
});
options.Configure<Volo.CmsKit.Admin.Web.Pages.CmsKit.Menus.IndexModel>(
toolbar =>
{
toolbar.AddButton(
LocalizableString.Create<CmsKitResource>("NewMenu"),
icon: "plus",
name: "CreateMenu",
id: "CreateMenu",
requiredPolicyName: CmsKitAdminPermissions.Menus.Create
);
});
options.Configure<Volo.CmsKit.Admin.Web.Pages.CmsKit.Menus.MenuItems.IndexModel>(
toolbar =>
{
toolbar.AddButton(
LocalizableString.Create<CmsKitResource>("NewMenuItem"),
icon: "plus",
name: "CreateMenuItem",
id: "CreateMenuItem",
requiredPolicyName: CmsKitAdminPermissions.Menus.Update
);
});
});
}
}

8
modules/cms-kit/src/Volo.CmsKit.Admin.Web/Menus/CmsKitAdminMenuContributor.cs

@ -71,6 +71,14 @@ namespace Volo.CmsKit.Admin.Web.Menus
.RequireGlobalFeatures(typeof(CommentsFeature))
.RequirePermissions(CmsKitAdminPermissions.Comments.Default));
cmsMenus.Add(new ApplicationMenuItem(
CmsKitAdminMenus.Menus.MenusMenu,
l["Menus"],
"/Cms/Menus",
"fa fa-bars")
.RequireGlobalFeatures(typeof(MenuFeature))
.RequirePermissions(CmsKitAdminPermissions.Menus.Default));
if (cmsMenus.Any())
{
var cmsMenu = context.Menu.FindMenuItem(CmsKitAdminMenus.GroupName);

4
modules/cms-kit/src/Volo.CmsKit.Admin.Web/Menus/CmsKitAdminMenus.cs

@ -29,5 +29,9 @@
public const string BlogPostsMenu = GroupName + ".BlogPosts";
}
public static class Menus
{
public const string MenusMenu = GroupName + ".Menus";
}
}
}

4
modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Blogs/UpdateModal.cshtml.cs

@ -1,11 +1,7 @@
using AutoMapper;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
using Volo.Abp.Validation;
using Volo.CmsKit.Admin.Blogs;

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

@ -0,0 +1,23 @@
@page
@using Volo.CmsKit.Admin.Web.Pages.CmsKit.Menus
@using Volo.CmsKit.Admin.Web.Pages
@using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Modal
@inherits CmsKitAdminPageBase
@model CreateModalModel
@{
Layout = null;
}
<abp-dynamic-form abp-model="ViewModel" asp-page="/CmsKit/Menus/CreateModal">
<abp-modal>
<abp-modal-header title="@L["New"].Value"></abp-modal-header>
<abp-modal-body>
<abp-form-content />
</abp-modal-body>
<abp-modal-footer buttons="@(AbpModalButtons.Cancel | AbpModalButtons.Save)"></abp-modal-footer>
</abp-modal>
</abp-dynamic-form>

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

@ -0,0 +1,44 @@
using AutoMapper;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Volo.Abp.Validation;
using Volo.CmsKit.Admin.Menus;
using Volo.CmsKit.Menus;
namespace Volo.CmsKit.Admin.Web.Pages.CmsKit.Menus
{
public class CreateModalModel : CmsKitAdminPageModel
{
protected IMenuAdminAppService MenuAdminAppService { get; }
[BindProperty]
public CreateMenuViewModel ViewModel { get; set; }
public CreateModalModel(IMenuAdminAppService menuAdminAppService)
{
MenuAdminAppService = menuAdminAppService;
}
public async Task<IActionResult> OnPostAsync()
{
var input = ObjectMapper.Map<CreateMenuViewModel, MenuCreateInput>(ViewModel);
await MenuAdminAppService.CreateAsync(input);
return NoContent();
}
[AutoMap(typeof(MenuCreateInput), ReverseMap = true)]
public class CreateMenuViewModel
{
[Required]
[DynamicMaxLength(typeof(MenuConsts), nameof(MenuConsts.MaxNameLength))]
public string Name { get; set; }
}
}
}

34
modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Menus/Index.cshtml

@ -0,0 +1,34 @@
@page
@using Volo.CmsKit.Admin.Web.Pages.CmsKit.Menus
@using Volo.CmsKit.Admin.Web.Pages
@using Volo.CmsKit.Admin.Web.Menus
@using Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Pages.Shared.Components.AbpPageToolbar
@inherits CmsKitAdminPageBase
@model IndexModel
@{
PageLayout.Content.Title = L["Menus"].Value;
PageLayout.Content.BreadCrumb.Add(L["Menu:CMS"].Value);
PageLayout.Content.MenuItemName = CmsKitAdminMenus.Menus.MenusMenu;
}
@section scripts {
<abp-script-bundle>
<abp-script src="/Pages/CmsKit/Menus/index.js" />
</abp-script-bundle>
}
@section content_toolbar {
@await Component.InvokeAsync(typeof(AbpPageToolbarViewComponent), new { pageName = typeof(IndexModel).FullName })
}
<div id="CmsKitMenusWrapper">
<abp-card>
<abp-card-body>
<abp-table striped-rows="true" id="MenusTable" class="nowrap"></abp-table>
</abp-card-body>
</abp-card>
</div>

13
modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Menus/Index.cshtml.cs

@ -0,0 +1,13 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Volo.CmsKit.Admin.Web.Pages.CmsKit.Menus
{
public class IndexModel
{
}
}

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

@ -0,0 +1,49 @@
@page
@using Volo.CmsKit.Admin.Web.Pages.CmsKit.Menus.MenuItems
@using Volo.CmsKit.Admin.Web.Pages
@using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Modal
@inherits CmsKitAdminPageBase
@model CreateModalModel
@{
Layout = null;
}
<form asp-page="/CmsKit/Menus/MenuItems/CreateModal">
<abp-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"/>
</abp-tab>
<abp-tab title="@L["Page"]">
<label asp-for="ViewModel.PageId"></label>
<select class="form-control" asp-for="ViewModel.PageId"></select>
<span asp-validation-for="ViewModel.PageId"></span>
</abp-tab>
</abp-tabs>
<hr/>
<abp-input asp-for="ViewModel.MenuId"/>
<abp-input asp-for="ViewModel.ParentId"/>
<abp-input asp-for="ViewModel.DisplayName"/>
<abp-input asp-for="ViewModel.IsActive"/>
<abp-input asp-for="ViewModel.Icon"/>
<abp-input asp-for="ViewModel.Order"/>
<abp-input asp-for="ViewModel.Target"/>
<abp-input asp-for="ViewModel.ElementId"/>
<abp-input asp-for="ViewModel.CssClass"/>
</abp-modal-body>
<abp-modal-footer buttons="@(AbpModalButtons.Cancel | AbpModalButtons.Save)"></abp-modal-footer>
</abp-modal>
</form>

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

@ -0,0 +1,75 @@
using AutoMapper;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form;
using Volo.CmsKit.Admin.Menus;
namespace Volo.CmsKit.Admin.Web.Pages.CmsKit.Menus.MenuItems
{
public class CreateModalModel : CmsKitAdminPageModel
{
protected IMenuAdminAppService MenuAdminAppService { get; }
[BindProperty]
public MenuItemCreateViewModel ViewModel { get; set; }
public CreateModalModel(IMenuAdminAppService menuAdminAppService)
{
MenuAdminAppService = menuAdminAppService;
ViewModel = new MenuItemCreateViewModel();
}
public virtual Task OnGetAsync(Guid menuId, Guid? parentId)
{
ViewModel.MenuId = menuId;
ViewModel.ParentId = parentId;
return Task.CompletedTask;
}
public virtual async Task<IActionResult> OnPostAsync()
{
var input = ObjectMapper.Map<MenuItemCreateViewModel, MenuItemCreateInput>(ViewModel);
var dto = await MenuAdminAppService.CreateMenuItemAsync(ViewModel.MenuId, input);
return new OkObjectResult(dto);
}
[AutoMap(typeof(MenuItemCreateInput), ReverseMap = true)]
public class MenuItemCreateViewModel
{
[HiddenInput]
public Guid MenuId { get; set; }
[HiddenInput]
public Guid? ParentId { get; set; }
[Required]
public string DisplayName { get; set; }
public bool IsActive { get; set; } = true;
public string Url { get; set; }
public Guid? PageId { get; set; }
public string Icon { get; set; }
[HiddenInput]
public int Order { get; set; }
public string Target { get; set; }
public string ElementId { get; set; }
public string CssClass { get; set; }
}
}
}

51
modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Menus/MenuItems/Index.cshtml

@ -0,0 +1,51 @@
@page
@using Volo.CmsKit.Admin.Web.Pages.CmsKit.Menus.MenuItems
@using Volo.CmsKit.Admin.Web.Pages
@using Volo.CmsKit.Admin.Web.Menus
@using Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Pages.Shared.Components.AbpPageToolbar
@using Volo.Abp.AspNetCore.Mvc.UI.Packages.JsTree
@inherits CmsKitAdminPageBase
@model IndexModel
@{
PageLayout.Content.Title = @Model.Menu.Name + " - " + L["MenuItems"].Value;
PageLayout.Content.BreadCrumb.Add(L["Menu:CMS"].Value);
PageLayout.Content.BreadCrumb.Add(L["Menus"].Value, "/Cms/Menus");
PageLayout.Content.MenuItemName = CmsKitAdminMenus.Menus.MenusMenu;
}
@section styles {
<abp-style-bundle name="@typeof(IndexModel).FullName">
<abp-style type="typeof(JsTreeStyleContributor)"/>
<abp-script src="/Pages/CmsKit/Menus/MenuItems/index.css"/>
</abp-style-bundle>
}
@section scripts {
<abp-script-bundle name="@typeof(IndexModel).FullName">
<abp-style type="typeof(JsTreeScriptContributor)"/>
<abp-script src="/Pages/CmsKit/Menus/MenuItems/index.js"/>
<abp-script src="/Pages/CmsKit/Menus/MenuItems/createModal.js"/>
<abp-script src="/Pages/CmsKit/Menus/MenuItems/updateModal.js"/>
</abp-script-bundle>
}
@section content_toolbar {
@await Component.InvokeAsync(typeof(AbpPageToolbarViewComponent), new {pageName = typeof(IndexModel).FullName})
}
<div id="CmsKitMenuItemsWrapper" data-menu-id="@Model.Id">
<abp-card>
<abp-card-body>
<abp-card-title>
@Model.Menu.Name
</abp-card-title>
<div id="MenuItemsEditTree"></div>
<div id="MenuItemsTreeEmptyInfo" class="text-muted">@L["NoMenuItems"]</div>
</abp-card-body>
</abp-card>
</div>

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

@ -0,0 +1,31 @@
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Volo.CmsKit.Admin.Menus;
using Volo.CmsKit.Menus;
namespace Volo.CmsKit.Admin.Web.Pages.CmsKit.Menus.MenuItems
{
public class IndexModel : CmsKitAdminPageModel
{
protected IMenuAdminAppService MenuAdminAppService { get; }
[BindProperty(SupportsGet = true)]
public Guid Id { get; set; }
public MenuWithDetailsDto Menu { get; protected set; }
public IndexModel(IMenuAdminAppService menuAdminAppService)
{
MenuAdminAppService = menuAdminAppService;
}
public async Task OnGetAsync()
{
Menu = await MenuAdminAppService.GetAsync(Id);
}
}
}

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

@ -0,0 +1,47 @@
@page
@using Volo.CmsKit.Admin.Web.Pages.CmsKit.Menus.MenuItems
@using Volo.CmsKit.Admin.Web.Pages
@using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Modal
@inherits CmsKitAdminPageBase
@model UpdateModalModel
@{
Layout = null;
}
<form asp-page="/CmsKit/Menus/MenuItems/UpdateModal">
<abp-modal>
<abp-modal-header title="@L["New"].Value"></abp-modal-header>
<abp-modal-body>
<abp-input asp-for="MenuId"/>
<abp-input asp-for="Id"/>
<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 asp-for="ViewModel.PageId"></label>
<select class="form-control" asp-for="ViewModel.PageId"></select>
</abp-tab>
</abp-tabs>
<hr/>
<abp-input asp-for="ViewModel.DisplayName"/>
<abp-input asp-for="ViewModel.IsActive"/>
<abp-input asp-for="ViewModel.Icon"/>
<abp-input asp-for="ViewModel.Target"/>
<abp-input asp-for="ViewModel.ElementId"/>
<abp-input asp-for="ViewModel.CssClass"/>
</abp-modal-body>
<abp-modal-footer buttons="@(AbpModalButtons.Cancel | AbpModalButtons.Save)"></abp-modal-footer>
</abp-modal>
</form>

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

@ -0,0 +1,70 @@
using System;
using System.ComponentModel.DataAnnotations;
using System.Threading.Tasks;
using AutoMapper;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Volo.CmsKit.Admin.Menus;
using Volo.CmsKit.Menus;
namespace Volo.CmsKit.Admin.Web.Pages.CmsKit.Menus.MenuItems
{
public class UpdateModalModel : CmsKitAdminPageModel
{
protected IMenuAdminAppService MenuAdminAppService { get; }
[BindProperty]
public MenuItemUpdateViewModel ViewModel { get; set; }
[HiddenInput]
[BindProperty(SupportsGet = true)]
public Guid MenuId { get; set; }
[HiddenInput]
[BindProperty(SupportsGet = true)]
public Guid Id { get; set; }
public UpdateModalModel(IMenuAdminAppService menuAdminAppService)
{
MenuAdminAppService = menuAdminAppService;
}
public async Task OnGetAsync()
{
var menuItemDto = await MenuAdminAppService.GetMenuItemAsync(MenuId, Id);
ViewModel = ObjectMapper.Map<MenuItemDto, MenuItemUpdateViewModel>(menuItemDto);
}
public async Task<IActionResult> OnPostAsync()
{
var input = ObjectMapper.Map<MenuItemUpdateViewModel, MenuItemUpdateInput>(ViewModel);
var result = await MenuAdminAppService.UpdateMenuItemAsync(MenuId, Id, input);
return new OkObjectResult(result);
}
[AutoMap(typeof(MenuItemDto))]
[AutoMap(typeof(MenuItemUpdateInput), ReverseMap = true)]
public class MenuItemUpdateViewModel
{
[Required]
public string DisplayName { get; set; }
public bool IsActive { get; set; }
public string Url { get; set; }
public string Icon { get; set; }
public string Target { get; set; }
public string ElementId { get; set; }
public string CssClass { get; set; }
public Guid? PageId { get; set; }
}
}
}

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

@ -0,0 +1,45 @@
var abp = abp || {};
$(function () {
abp.modals.createMenuItem = function () {
var initModal = function (publicApi, args) {
var $pageId = $('#ViewModel_PageId');
var $url = $('#ViewModel_Url');
var $displayName = $('#ViewModel_DisplayName');
var $pageIdClearButton = $('#url-tab');
initSelectPageId();
$pageId.on('change', function (params) {
$url.prop('disabled', $pageId.val());
if ($pageId.val())
{
if (!$displayName.val()){
$displayName.val($pageId.text());
}
}
})
$pageIdClearButton.click(function (){
$pageId.val('');
$pageId.trigger('change');
})
function initSelectPageId() {
$pageId.data('autocompleteApiUrl', '/api/cms-kit-admin/menus/lookup/pages');
$pageId.data('autocompleteDisplayProperty', 'title');
$pageId.data('autocompleteValueProperty', 'id');
$pageId.data('autocompleteItemsProperty', 'items');
$pageId.data('autocompleteFilterParamName', 'filter');
abp.dom.initializers.initializeAutocompleteSelects($pageId);
}
};
return {
initModal: initModal
};
};
});

1
modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Menus/MenuItems/index.css

@ -0,0 +1 @@
.vakata-context { z-index:10052 !important; }

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

@ -0,0 +1,409 @@
var _menuItem = {};
$(function () {
var l = abp.localization.getResource("CmsKit");
var menuId = $('#CmsKitMenuItemsWrapper').data('menu-id');
var menuService = volo.cmsKit.admin.menus.menuAdmin;
var createModal = new abp.ModalManager({ viewUrl: abp.appPath + 'CmsKit/Menus/MenuItems/CreateModal', modalClass: 'createMenuItem' });
var updateModal = new abp.ModalManager({ viewUrl: abp.appPath + 'CmsKit/Menus/MenuItems/UpdateModal', modalClass: 'updateMenuItem'});
var menuTree = {
$tree: $('#MenuItemsEditTree'),
$emptyInfo: $('#MenuItemsTreeEmptyInfo'),
show: function () {
menuTree.$emptyInfo.hide();
menuTree.$tree.show();
},
hide: function () {
menuTree.$emptyInfo.show();
menuTree.$tree.hide();
},
itemCount: 0,
setItemCount: function (itemCount) {
menuTree.itemCount = itemCount;
if (itemCount) {
menuTree.show();
} else {
menuTree.hide();
}
},
refreshItemCount: function () {
menuTree.setItemCount(menuTree.$tree.jstree('get_json').length);
},
selectedMenuItem: {
id: null,
displayName: null,
code: null,
set: function (menuItemOnTree) {
if (!menuItemOnTree) {
menuTree.selectedMenuItem.id = null;
menuTree.selectedMenuItem.displayName = null;
menuTree.selectedMenuItem.IsActive = true;
menuTree.selectedMenuItem.Url = null;
menuTree.selectedMenuItem.Icon = null;
menuTree.selectedMenuItem.Order = 1;
menuTree.selectedMenuItem.Target = null;
menuTree.selectedMenuItem.ElementId = null;
menuTree.selectedMenuItem.CssClass = null;
menuTree.selectedMenuItem.PageId = null;
} else {
menuTree.selectedMenuItem.id = menuItemOnTree.id;
menuTree.selectedMenuItem.displayName = menuItemOnTree.original.displayName;
menuTree.selectedMenuItem.IsActive = menuItemOnTree.original.IsActive;
menuTree.selectedMenuItem.Url = menuItemOnTree.original.Url;
menuTree.selectedMenuItem.Icon = menuItemOnTree.original.Icon;
menuTree.selectedMenuItem.Order = menuItemOnTree.original.Order;
menuTree.selectedMenuItem.Target = menuItemOnTree.original.Target;
menuTree.selectedMenuItem.ElementId = menuItemOnTree.original.ElementId;
menuTree.selectedMenuItem.CssClass = menuItemOnTree.original.CssClass;
menuTree.selectedMenuItem.PageId = menuItemOnTree.original.PageId;
}
_menuItem.checkbox.setSelectedItem({
id: menuTree.selectedMenuItem.id,
displayName: menuTree.selectedMenuItem.displayName,
isActive: menuTree.selectedMenuItem.IsActive,
url: menuTree.selectedMenuItem.Url,
icon: menuTree.selectedMenuItem.Icon,
order: menuTree.selectedMenuItem.Order,
target: menuTree.selectedMenuItem.Target,
elementId: menuTree.selectedMenuItem.ElementId,
cssClass: menuTree.selectedMenuItem.CssClass,
pageId: menuTree.selectedMenuItem.PageId
});
}
},
contextMenu: function (node) {
var items = {
edit: {
label: l('Edit'),
icon: 'fa fa-pencil',
_disabled: !abp.auth.isGranted('CmsKit.Menus.Update'),
action: function (data) {
var instance = $.jstree.reference(data.reference);
updateModal.open({
id: node.id,
menuId: menuId
})
}
},
addSubMenuItem: {
label: l('AddSubMenuItem'),
icon: 'fa fa-plus',
_disabled: !abp.auth.isGranted('CmsKit.Menus.Update'),
action: function () {
menuTree.addItem(node.id);
}
},
'delete': {
label: l('Delete'),
icon: 'fa fa-remove',
_disabled: !abp.auth.isGranted('CmsKit.Menus.Update'),
action: function (data) {
var instance = $.jstree.reference(data.reference);
abp.message.confirm(
l('MenuItemDeletionConfirmationMessage', node.original.displayName),
l('AreYouSure'),
function (isConfirmed) {
if (isConfirmed) {
menuService
.deleteMenuItem(menuId, node.id)
.done(function () {
instance.delete_node(node);
menuTree.refreshItemCount();
})
.fail(function (err) {
setTimeout(function () {
abp.message.error(err.message);
}, 500);
});
}
}
)
}
}
}
return items;
},
addItem: function (parentId) {
var instance = $.jstree.reference(menuTree.$tree);
createModal.open({
menuId: menuId,
parentId: parentId,
}, function (newMenuItem) {
instance.create_node(
parentId ? instance.get_node(parentId) : '#',
{
id: newMenuItem.id,
parent: newMenuItem.parentId ? newMenuItem.parentId : '#',
isActive: newMenuItem.isActive,
displayName: $.fn.dataTable.render.text().display(newMenuItem.displayName),
text: menuTree.generateTextOnTree(newMenuItem),
url: newMenuItem.url,
icon: newMenuItem.icon,
order: newMenuItem.order,
target: newMenuItem.target,
elementId: newMenuItem.elementId,
cssClass: newMenuItem.cssClass,
pageId: newMenuItem.pageId,
state: {
opened: true
}
});
menuTree.refreshItemCount();
});
},
generateTextOnTree: function (item) {
var itemClass = ' ou-text-no-members';
return '<span title="' + item.displayName + '" class="ou-text text-dark' + itemClass + '" data-menuitem-id="' + item.id + '">' +
$.fn.dataTable.render.text().display(item.displayName) +
' <i class="fa fa-caret-down text-muted"></i></span > ';
},
getTreeDataFromServer: function (callback) {
menuService.get(menuId).done(function (result) {
var treeData = _.map(result.items, function (item) {
return {
id: item.id,
parent: item.parentId ? item.parentId : '#',
isActive: item.isActive,
displayName: $.fn.dataTable.render.text().display(item.displayName),
url: item.url,
icon: item.icon,
order: item.order,
target: item.target,
elementId: item.elementId,
cssClass: item.cssClass,
pageId: item.pageId,
text: menuTree.generateTextOnTree(item),
state: {
opened: true
}
};
});
callback(treeData);
});
},
init: function () {
menuTree.getTreeDataFromServer(function (treeData) {
menuTree.setItemCount(treeData.length);
menuTree.$tree
.on('changed.jstree', function (e, data) {
if (data.selected.length != 1) {
menuTree.selectedMenuItem.set(null);
} else {
var selectedNode = data.instance.get_node(data.selected[0]);
menuTree.selectedMenuItem.set(selectedNode);
}
})
.on('move_node.jstree', function (e, data) {
var parentNodeName = (!data.parent || data.parent == '#')
? l('Root')
: menuTree.$tree.jstree('get_node', data.parent).original.displayName;
abp.message.confirm(
l('MenuItemMoveConfirmMessage', data.node.original.displayName, parentNodeName),
l('AreYouSure'),
function (isConfirmed) {
if (isConfirmed) {
menuService
.moveMenuItem(menuId, data.node.id, {
newParentId: data.parent === '#' ? null : data.parent,
position: data.position
})
.done(function () {
menuTree.reload();
})
.fail(function (err) {
menuTree.$tree.jstree('refresh'); //rollback
setTimeout(function () {
abp.message.error(err.message);
}, 500);
});
} else {
menuTree.$tree.jstree('refresh'); //rollback
}
}
);
})
.jstree({
'core': {
data: treeData,
multiple: false,
check_callback: function (operation, node, node_parent, node_position, more) {
return true;
}
},
contextmenu: {
items: menuTree.contextMenu,
'select_node': false
},
sort: function (node1, node2) {
if (this.get_node(node2).original.order < this.get_node(node1).original.order) {
return 1;
}
return -1;
},
plugins: [
'types',
'contextmenu',
'wholerow',
'sort',
'dnd'
]
});
$('button[name=CreateMenuItem]').click(function (e) {
e.preventDefault();
createModal.open({menuId: menuId});
});
createModal.onResult(function () {
menuTree.reload();
});
updateModal.onResult(function (item) {
menuTree.reload();
});
menuTree.$tree.on('click', '.ou-text .fa-caret-down', function (e) {
e.preventDefault();
var id = $(this).closest('.ou-text').attr('data-menuitem-id');
setTimeout(function () {
menuTree.$tree.jstree('show_contextmenu', id);
}, 100);
});
});
},
reload: function () {
menuTree.getTreeDataFromServer(function (treeData) {
menuTree.setItemCount(treeData.length);
menuTree.$tree.jstree(true).settings.core.data = treeData;
menuTree.$tree.jstree('refresh');
});
}
};
menuTree.init();
let selectedIds = [];
let selectedItem = {};
let selectedCheckboxNames;
let selectAllHeaderTitle = '<div class="custom-checkbox custom-control no-height">' +
'<input type="checkbox" id="select_all" name="select-all" class="custom-control-input custom-selectbox" value="false" data-val="false">' +
'<label class="custom-control-label" for="select_all"></label></div>';
_menuItem.checkbox = {
initialize: function (selectedCbNames) {
selectedIds = [];
selectedCheckboxNames = selectedCbNames;
},
getSelectedIds: function () {
return selectedIds;
},
setSelectedItem: function (item) {
selectedItem = item;
},
getSelectedItem: function () {
return selectedItem;
},
getSelectAllHeaderTitle: function () {
return selectAllHeaderTitle;
}
};
$(document).on('click', '.custom-selectbox', function (el) {
el.stopPropagation();
if (!$(el.target).is(':checkbox')) {
return;
}
if ($(el.target).prop("checked") == true) {
checkAndAddAll();
} else if ($(el.target).prop("checked") == false) {
uncheckAndRemoveAll();
}
});
$(document).on('click', '.selectable', function (el) {
el.stopPropagation();
selectDeselect(el);
});
const checkAndAddAll = function () {
$('table>tbody>').find('input[type="checkbox"]').prop("checked", true);
let selectedItems = $(`input[name="${selectedCheckboxNames}"]:checked`);
selectedIds = [];
for (var i = 0; typeof (selectedItems[i]) != 'undefined'; selectedIds.push(selectedItems[i++].getAttribute('id'))) ;
};
const uncheckAndRemoveAll = function () {
$('table>tbody>').find('input[type="checkbox"]').prop("checked", false);
selectedIds = [];
};
const addId = function (id) {
selectedIds.push(id);
};
const removeId = function (id) {
selectedIds = selectedIds.filter(function (e) {
return e !== id;
});
};
const selectDeselect = function (el) {
$el = $(el);
if ($(el.target).is(':checkbox')) {
el.preventDefault();
return;
}
if (!$(el.target).is(':checkbox')) {
$el = $(el.target).parent().closest('tr').find('[type=checkbox]');
if ($el.prop("checked") == true) {
$el.prop("checked", false);
} else if ($el.prop("checked") == false) {
$el.prop("checked", true);
}
}
if ($el.prop("checked") == true) {
addId($el.attr('id'));
} else if ($el.prop("checked") == false) {
removeId($el.attr('id'));
}
}
});

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

@ -0,0 +1,46 @@
var abp = abp || {};
$(function () {
abp.modals.updateMenuItem = function () {
var initModal = function (publicApi, args) {
var $pageId = $('#ViewModel_PageId');
var $url = $('#ViewModel_Url');
var $displayName = $('#ViewModel_DisplayName');
var $pageIdClearButton = $('#url-tab');
initSelectPageId();
$pageId.on('change', function (params) {
$url.prop('disabled', $pageId.val());
if ($pageId.val()) {
if (!$displayName.val()) {
$displayName.val($pageId.text());
}
}
})
$pageId.trigger('change');
$pageIdClearButton.click(function () {
$pageId.val('');
$pageId.trigger('change');
});
function initSelectPageId() {
$pageId.data('autocompleteApiUrl', '/api/cms-kit-admin/menus/lookup/pages');
$pageId.data('autocompleteDisplayProperty', 'title');
$pageId.data('autocompleteValueProperty', 'id');
$pageId.data('autocompleteItemsProperty', 'items');
$pageId.data('autocompleteFilterParamName', 'filter');
abp.dom.initializers.initializeAutocompleteSelects($pageId);
}
};
return {
initModal: initModal
};
};
});

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

@ -0,0 +1,23 @@
@page
@using Volo.CmsKit.Admin.Web.Pages
@using Volo.CmsKit.Admin.Web.Pages.CmsKit.Menus
@using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Modal
@inherits CmsKitAdminPageBase
@model UpdateModalModel
@{
Layout = null;
}
<abp-dynamic-form abp-model="ViewModel" asp-page="/CmsKit/Menus/UpdateModal">
<abp-modal>
<abp-modal-header title="@L["Edit"].Value"></abp-modal-header>
<abp-modal-body>
<abp-input asp-for="Id" />
<abp-form-content />
</abp-modal-body>
<abp-modal-footer buttons="@(AbpModalButtons.Cancel|AbpModalButtons.Save)"></abp-modal-footer>
</abp-modal>
</abp-dynamic-form>

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

@ -0,0 +1,53 @@
using AutoMapper;
using Microsoft.AspNetCore.Mvc;
using System;
using System.ComponentModel.DataAnnotations;
using System.Threading.Tasks;
using Volo.Abp.Validation;
using Volo.CmsKit.Admin.Menus;
using Volo.CmsKit.Menus;
namespace Volo.CmsKit.Admin.Web.Pages.CmsKit.Menus
{
public class UpdateModalModel : CmsKitAdminPageModel
{
protected IMenuAdminAppService MenuAdminAppService { get; }
[HiddenInput]
[BindProperty(SupportsGet = true)]
public Guid Id { get; set; }
[BindProperty]
public UpdateMenuViewModel ViewModel { get; set; }
public UpdateModalModel(IMenuAdminAppService menuAdminAppService)
{
MenuAdminAppService = menuAdminAppService;
}
public async Task OnGetAsync()
{
var menu = await MenuAdminAppService.GetAsync(Id);
ViewModel = ObjectMapper.Map<MenuWithDetailsDto, UpdateMenuViewModel>(menu);
}
public async Task<IActionResult> OnPostAsync()
{
var input = ObjectMapper.Map<UpdateMenuViewModel, MenuUpdateInput>(ViewModel);
await MenuAdminAppService.UpdateAsync(Id, input);
return NoContent();
}
[AutoMap(typeof(MenuWithDetailsDto))]
[AutoMap(typeof(MenuUpdateInput), ReverseMap = true)]
public class UpdateMenuViewModel
{
[Required]
[DynamicMaxLength(typeof(MenuConsts), nameof(MenuConsts.MaxNameLength))]
public string Name { get; set; }
}
}
}

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

@ -0,0 +1 @@


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

@ -0,0 +1,118 @@
$(function () {
var l = abp.localization.getResource("CmsKit");
var createModal = new abp.ModalManager(abp.appPath + "CmsKit/Menus/CreateModal");
var updateModal = new abp.ModalManager(abp.appPath + "CmsKit/Menus/UpdateModal");
var menusService = volo.cmsKit.admin.menus.menuAdmin;
var dataTable = $("#MenusTable").DataTable(abp.libs.datatables.normalizeConfiguration({
processing: true,
serverSide: true,
paging: true,
searching: false,
scrollCollapse: true,
scrollX: true,
ordering: true,
order: [[1, "desc"]],
ajax: abp.libs.datatables.createAjax(menusService.getList),
columnDefs: [
{
title: l("Details"),
targets: 0,
rowAction: {
items: [
{
text: l('MenuItems'),
visible: abp.auth.isGranted('CmsKit.Menus.Update'),
action: function (data) {
location.href = "/Cms/Menus/" + data.record.id + "/menu-items"
}
},
{
text: l('MakeMainMenu'),
visible: function (data) {
return abp.auth.isGranted('CmsKit.Menus.Update') && !data.isMainMenu
},
action: function (data) {
menusService
.updateMainMenu(data.record.id, {isMainMenu: true})
.then(function () {
dataTable.ajax.reload();
});
}
},
{
text: l('UnMakeMainMenu'),
visible: function (data) {
return abp.auth.isGranted('CmsKit.Menus.Update') && data.isMainMenu
},
action: function (data) {
menusService
.updateMainMenu(data.record.id, {isMainMenu: false})
.then(function () {
dataTable.ajax.reload();
});
}
},
{
text: l('Edit'),
visible: abp.auth.isGranted('CmsKit.Menus.Update'),
action: function (data) {
updateModal.open({id: data.record.id});
}
},
{
text: l('Delete'),
visible: abp.auth.isGranted('CmsKit.Menus.Delete'),
confirmMessage: function (data) {
return l("MenuDeletionConfirmationMessage", data.record.name)
},
action: function (data) {
menusService
.delete(data.record.id)
.then(function () {
dataTable.ajax.reload();
});
}
}
]
}
},
{
title: l("Name"),
orderable: true,
data: "name",
render: function (data, val, record) {
if (record.isMainMenu) {
return (
data
+
'<span class="badge badge-pill badge-info ml-1">'
+
l("MainMenu")
+
'</span>'
);
} else {
return data;
}
}
}
]
}));
$('#AbpContentToolbar button[name=CreateMenu]').on('click', function (e) {
e.preventDefault();
createModal.open();
});
createModal.onResult(function () {
dataTable.ajax.reload();
});
updateModal.onResult(function () {
dataTable.ajax.reload();
});
});

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

@ -0,0 +1 @@


21
modules/cms-kit/src/Volo.CmsKit.Common.Application.Contracts/Volo/CmsKit/Menus/MenuItemDto.cs

@ -0,0 +1,21 @@
using System;
using System.Collections.Generic;
using Volo.Abp.Application.Dtos;
namespace Volo.CmsKit.Menus
{
public class MenuItemDto : AuditedEntityDto<Guid>
{
public Guid MenuId { get; set; }
public Guid? ParentId { get; set; }
public string DisplayName { get; set; }
public bool IsActive { get; set; }
public string Url { get; set; }
public string Icon { get; set; }
public int Order { get; set; }
public string Target { get; set; }
public string ElementId { get; set; }
public string CssClass { get; set; }
public Guid? PageId { get; set; }
}
}

18
modules/cms-kit/src/Volo.CmsKit.Common.Application.Contracts/Volo/CmsKit/Menus/MenuWithDetailsDto.cs

@ -0,0 +1,18 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Volo.Abp.Application.Dtos;
namespace Volo.CmsKit.Menus
{
public class MenuWithDetailsDto : FullAuditedEntityDto<Guid>
{
public string Name { get; set; }
public bool IsMainMenu { get; set; }
public List<MenuItemDto> Items { get; set; }
}
}

3
modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/GlobalCmsKitFeatures.cs

@ -23,6 +23,8 @@ namespace Volo.CmsKit.GlobalFeatures
public CmsUserFeature User => GetFeature<CmsUserFeature>();
public MenuFeature Menu => GetFeature<MenuFeature>();
public GlobalCmsKitFeatures([NotNull] GlobalFeatureManager featureManager)
: base(featureManager)
{
@ -34,6 +36,7 @@ namespace Volo.CmsKit.GlobalFeatures
AddFeature(new PagesFeature(this));
AddFeature(new BlogsFeature(this));
AddFeature(new CmsUserFeature(this));
AddFeature(new MenuFeature(this));
}
}
}

17
modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/MenuFeature.cs

@ -0,0 +1,17 @@
using JetBrains.Annotations;
using Volo.Abp.GlobalFeatures;
namespace Volo.CmsKit.GlobalFeatures
{
[GlobalFeatureName(Name)]
public class MenuFeature : GlobalFeature
{
public const string Name = "CmsKit.Menus";
internal MenuFeature(
[NotNull] GlobalCmsKitFeatures cmsKit) : base(cmsKit)
{
}
}
}

24
modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/de-DE.json

@ -1,22 +1,26 @@
{
"culture": "de-DE",
"texts": {
"PickYourReaction": "Wählen Sie Ihre Reaktion",
"YourComment": "Ihr Kommentar",
"YourReply": "Ihre Antwort",
"CommentAuthorizationExceptionMessage": "Diese Kommentare dürfen nicht öffentlich angezeigt werden.",
"Comments": "Kommentare",
"Send": "Senden",
"Delete": "Löschen",
"Reply": "Antworten",
"Update": "Aktualisieren",
"Edit": "Bearbeiten",
"LoginToAddComment": "Melden Sie sich an, um zu Kommentieren",
"LoginToRate": "Melden Sie sich an, um zu Bewerten",
"LoginToReply": "Melden Sie sich an, um zu Antworten",
"MessageDeletionConfirmationMessage": "Dieser Kommentar wird vollständig gelöscht.",
"CommentAuthorizationExceptionMessage": "Diese Kommentare dürfen nicht öffentlich angezeigt werden.",
"Undo": "Rüchkängig machen",
"Permission:Menus": "Menüverwaltung",
"Permission:Menus.Create": "Erstellen",
"Permission:Menus.Delete": "Löschen",
"Permission:Menus.Update": "Aktualisieren",
"PickYourReaction": "Wählen Sie Ihre Reaktion",
"RatingUndoMessage": "Ihre Bewertung wird rückgängig gemacht.",
"LoginToRate": "Melden Sie sich an, um zu Bewerten",
"Star": "Stern"
"Reply": "Antworten",
"Send": "Senden",
"Star": "Stern",
"Undo": "Rüchkängig machen",
"Update": "Aktualisieren",
"YourComment": "Ihr Kommentar",
"YourReply": "Ihre Antwort"
}
}

4
modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en-GB.json

@ -14,6 +14,10 @@
"Permission:TagManagement.Create": "Create Tag",
"Permission:TagManagement.Delete": "Delete Tag",
"Permission:TagManagement.Update": "Update Tag",
"Permission:Menus": "Menu Management",
"Permission:Menus.Create": "Create",
"Permission:Menus.Delete": "Delete",
"Permission:Menus.Update": "Update",
"PickYourReaction": "Pick your reaction",
"RatingUndoMessage": "Your rating will be undone.",
"Reply": "Reply",

34
modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json

@ -1,6 +1,8 @@
{
"culture": "en",
"texts": {
"AddSubMenuItem": "New Sub-MenuItem",
"AreYouSure": "Are You Sure?",
"BlogDeletionConfirmationMessage": "The blog '{0}' will be deleted. Are you sure?",
"BlogFeatureNotAvailable": "This feature is not available now. Enable with 'GlobalFeatureManager' to use it.",
"BlogId": "Blog",
@ -36,6 +38,7 @@
"Delete": "Delete",
"Detail": "Detail",
"Details": "Details",
"DisplayName": "Display Name",
"DoYouPreferAdditionalEmails": "Do you prefer additional emails?",
"Edit": "Edit",
"EndDate": "End Date",
@ -44,20 +47,33 @@
"ExportCSV": "Export CSV",
"Features": "Features",
"GenericDeletionConfirmationMessage": "Are you sure to delete '{0}'?",
"IsActive" : "Active",
"LastModification": "Last Modification",
"LastModificationTime": "Last Modification Time",
"LoginToAddComment": "Login to add comment",
"LoginToRate": "Login to rate",
"LoginToReact": "Login to react",
"LoginToReply": "Login to reply",
"MainMenu": "Main Menu",
"MakeMainMenu": "Make Main Menu",
"Menu:CMS": "CMS",
"Menus": "Menus",
"MenuDeletionConfirmationMessage": "The menu '{0}' will be deleted. Are you sure?",
"MenuItemDeletionConfirmationMessage": "Are sure to delete this menu item?",
"MenuItemMoveConfirmMessage": "Are you sure you want to move '{0}' under '{1}'?",
"MenuItems": "Menu Items",
"Message": "Message",
"MessageDeletionConfirmationMessage": "This comment will be deleted completely.",
"NewPage": "New Page",
"NewBlog": "New Blog",
"NewBlogPost": "New Blog Post",
"NewMenu": "New Menu",
"NewMenuItem": "New Root Menu Item",
"NewPage": "New Page",
"NewTag": "New Tag",
"NoMenuItems": "There is no menu item yet!",
"OK": "OK",
"PageDeletionConfirmationMessage": "Are you sure to delete this page?",
"PageId": "Page",
"Pages": "Pages",
"PageSlugInformation": "Slug is used on url. Your url will be '/pages/{{slug}}'.",
"Permission:BlogManagement": "Blog Management",
@ -79,6 +95,18 @@
"Permission:MediaDescriptorManagement": "Media Management",
"Permission:MediaDescriptorManagement:Create": "Create",
"Permission:MediaDescriptorManagement:Delete": "Delete",
"Permission:MenuItemManagement": "Menu Item Management",
"Permission:MenuItemManagement.Create": "Create",
"Permission:MenuItemManagement.Delete": "Delete",
"Permission:MenuItemManagement.Update": "Update",
"Permission:MenuManagement": "Menu Management",
"Permission:MenuManagement.Create": "Create",
"Permission:MenuManagement.Delete": "Delete",
"Permission:MenuManagement.Update": "Update",
"Permission:Menus": "Menu Management",
"Permission:Menus.Create": "Create",
"Permission:Menus.Delete": "Delete",
"Permission:Menus.Update": "Update",
"Permission:PageManagement": "Page Management",
"Permission:PageManagement:Create": "Create",
"Permission:PageManagement:Delete": "Delete",
@ -122,6 +150,7 @@
"Update": "Update",
"UpdatePreferenceSuccessMessage": "Your preferences have been saved.",
"UpdateYourEmailPreferences": "Update your email preferences",
"UnMakeMainMenu": "Unmake Main Menu",
"UploadFailedMessage": "Upload failed.",
"UserId": "User Id",
"Username": "Username",
@ -129,7 +158,6 @@
"YourEmailAddress": "Your e-mail address",
"YourFullName": "Your full name",
"YourMessage": "Your Message",
"YourReply": "Your reply",
"LastModificationTime": "Last Modification Time"
"YourReply": "Your reply"
}
}

40
modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json

@ -1,6 +1,8 @@
{
"culture": "tr",
"texts": {
"AddSubMenuItem": "Alt menü elemanı ekle",
"AreYouSure": "Emin Misiniz?",
"BlogDeletionConfirmationMessage": "'{0}' adlı blog silinecek. Emin misiniz?",
"BlogFeatureNotAvailable": "Bu özellik kullanılabilir değil. 'GlobalFeatureManager' ile aktif ederek kullanabilisiniz.",
"BlogId": "Blog",
@ -9,9 +11,6 @@
"Blogs": "Bloglar",
"ChoosePreference": "Tercih seçiniz...",
"Cms": "CMS",
"Content": "İçerik",
"Script": "Script Kodları",
"Style": "Stil Kodları",
"CmsKit.Comments": "Yorumlar",
"CmsKit.Ratings": "Puanlama",
"CmsKit.Reactions": "Tepkiler",
@ -28,6 +27,7 @@
"CommentAuthorizationExceptionMessage": "Bu yorumları görebilmek için yetki gerekir.",
"CommentDeletionConfirmationMessage": "Bu yorum ve buna yapılan tüm yorumlan silinecektir!",
"Comments": "Yorumlar",
"Content": "İçerik",
"ContentDeletionConfirmationMessage": "Bu içeriği gerçekten silmek istediğinize emin misiniz?",
"Contents": "İçerikler",
"CoverImage": "Kapak Resmi",
@ -37,6 +37,7 @@
"DeleteSubscriptionSubject": "E-posta adresiniz silinmiştir.",
"Detail": "Detay",
"Details": "Detaylar",
"DisplayName": "İsim",
"DoYouPreferAdditionalEmails": "Ek e-postaları tercih ediyor musunuz?",
"Edit": "Düzenle",
"EndDate": "Bitiş Tarihi",
@ -45,21 +46,34 @@
"ExportCSV": "CSV olarak dışa aktar",
"Features": "Özellikler",
"GenericDeletionConfirmationMessage": "'{0}' kaydını silmek istediğinize emin misiniz?",
"IsActive" : "Aktif",
"LastModification": "Son Güncellenme",
"LastModificationTime": "Son Güncelleme Zamanı",
"LoginToAddComment": "Yorum yapmak için giriş yap",
"LoginToRate": "Oylamak için giriş yapın",
"LoginToReact": "Reaksiyon vermek için giriş yap",
"LoginToReply": "Cevap vermek için giriş yap",
"MainMenu": "Ana Menü",
"MakeMainMenu": "Ana Menü Yap",
"Menu:CMS": "CMS",
"Menus": "Menüler",
"MenuDeletionConfirmationMessage": "'{0}' isimli menü silinecek. Emin misiniz?",
"MenuItemDeletionConfirmationMessage": "Bu menü elemanını silmek istediğinize emin misiniz?",
"MenuItems": "Menü Elemanları",
"Message": "Mesaj",
"MenuItemMoveConfirmMessage": "'{0}' ögesini '{1}' ögesinin altına taşımak istediğinize emin misiniz?",
"MessageDeletionConfirmationMessage": "Bu yorum tamamen silinecektir",
"Name": "Ad",
"NewPage": "Yeni Sayfa",
"NewBlog": "Yeni Blog",
"NewBlogPost": "Yeni Blog Yazısı",
"NewMenu": "Yeni Menü",
"NewMenuItem": "Yeni Kök Menü Ögesi",
"NewPage": "Yeni Sayfa",
"NewTag": "Yeni Etiket",
"NoMenuItems": "Herhangi bir menü elemanı bulunmuyor.",
"OK": "Tamam",
"PageDeletionConfirmationMessage": "Bu sayfayı silmek istediğinize emin misiniz?",
"PageId": "Sayfa",
"PageSlugInformation": "Etiket URL'de kullanılır. Url şöyle görünür: '/pages/{{slug}}'.",
"Permission:BlogManagement": "Blog Yönetimi",
"Permission:BlogManagement.Create": "Oluşturma",
@ -75,6 +89,18 @@
"Permission:Contents.Create": "İçerik Oluşturma",
"Permission:Contents.Delete": "İçerik Silme",
"Permission:Contents.Update": "İçerik Güncelleme",
"Permission:MenuItemManagement": "Menü Elemanları Yönetimi",
"Permission:MenuItemManagement.Create": "Oluşturma",
"Permission:MenuItemManagement.Delete": "Silme",
"Permission:MenuItemManagement.Update": "Güncelleme",
"Permission:MenuManagement": "Menü Yönetimi",
"Permission:MenuManagement.Create": "Oluşturma",
"Permission:MenuManagement.Delete": "Silme",
"Permission:MenuManagement.Update": "Güncelleme",
"Permission:Menus": "Menü Yönetimi",
"Permission:Menus.Create": "Menü Oluşturma",
"Permission:Menus.Delete": "Menü Silme",
"Permission:Menus.Update": "Menü Güncelleme",
"Permission:TagManagement": "Etiket Yönetimi",
"Permission:TagManagement.Create": "Etiket Oluşturma",
"Permission:TagManagement.Delete": "Etiket Silme",
@ -89,6 +115,7 @@
"ReplyTo": "Cevap",
"SamplePageMessage": "Pro modulünden örnek bir sayfa",
"SaveChanges": "Değişiklikleri Kaydet",
"Script": "Script Kodları",
"SelectAll": "Hepsini seç",
"Send": "Gönder",
"SendMessage": "Mesajı Gönder",
@ -98,6 +125,7 @@
"SourceUrl": "Kaynak Link",
"Star": "Yıldız",
"StartDate": "Başlangıç Tarihi",
"Style": "Stil Kodları",
"Subject": "Konu",
"SubjectPlaceholder": "Lütfen bir konu yazınız",
"Submit": "Kaydet",
@ -113,6 +141,7 @@
"UpdatePreference": "Tercihleri Güncelle",
"UpdatePreferenceSuccessMessage": "Tercihleriniz kaydedilmiştir.",
"UpdateYourEmailPreferences": "E-posta tercihlerinizi güncelleyin",
"UnMakeMainMenu": "Ana Menü Atamasını Kaldır",
"UploadFailedMessage": "Karşıya yükleme işlemi başarısız oldu.",
"UserId": "Kullanıcı Id",
"Username": "Kullanıcı adı",
@ -120,7 +149,6 @@
"YourEmailAddress": "Email adresiniz",
"YourFullName": "Tam adınız",
"YourMessage": "Mesajınız",
"YourReply": "Cevabınız",
"LastModificationTime": "Son Güncelleme Zamanı"
"YourReply": "Cevabınız"
}
}

4
modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/zh-Hans.json

@ -72,6 +72,10 @@
"Permission:MediaDescriptorManagement": "媒体管理",
"Permission:MediaDescriptorManagement:Create": "创建",
"Permission:MediaDescriptorManagement:Delete": "删除",
"Permission:Menus": "Menu Management",
"Permission:Menus.Create": "Create",
"Permission:Menus.Delete": "Delete",
"Permission:Menus.Update": "Update",
"Permission:PageManagement": "页面管理",
"Permission:PageManagement:Create": "创建",
"Permission:PageManagement:Delete": "删除",

4
modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/zh-Hant.json

@ -73,6 +73,10 @@
"Permission:MediaDescriptorManagement": "媒體管理",
"Permission:MediaDescriptorManagement:Create": "創建",
"Permission:MediaDescriptorManagement:Delete": "刪除",
"Permission:Menus": "Menu Management",
"Permission:Menus.Create": "Create",
"Permission:Menus.Delete": "Delete",
"Permission:Menus.Update": "Update",
"Permission:PageManagement": "頁面管理",
"Permission:PageManagement:Create": "創建",
"Permission:PageManagement:Delete": "刪除",

13
modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Menus/MenuConsts.cs

@ -0,0 +1,13 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Volo.CmsKit.Menus
{
public static class MenuConsts
{
public static int MaxNameLength { get; set; } = 128;
}
}

8
modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Menus/MenuItemConsts.cs

@ -0,0 +1,8 @@
namespace Volo.CmsKit.Menus
{
public static class MenuItemConsts
{
public const int MaxDisplayNameLength = 64;
public const int MaxUrlLength = 1024;
}
}

19
modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Pages/PageConsts.cs

@ -1,17 +1,26 @@
namespace Volo.CmsKit.Pages
using System;
namespace Volo.CmsKit.Pages
{
public class PageConsts
{
public const string EntityType = "Page";
public static int MaxTitleLength { get; set; } = 256;
public static int MaxSlugLength { get; set; } = 256;
public static int MaxContentLength { get; set; } = int.MaxValue;
public static int MaxScriptLength { get; set; } = int.MaxValue;
public static int MaxStyleLength { get; set; } = int.MaxValue;
private static string _urlPrefix = "/pages/";
public static string UrlPrefix
{
get => _urlPrefix;
set => _urlPrefix = value.EnsureEndsWith('/').EnsureStartsWith('/');
}
}
}

18
modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Menus/IMenuRepository.cs

@ -0,0 +1,18 @@
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using Volo.Abp.Domain.Repositories;
namespace Volo.CmsKit.Menus
{
public interface IMenuRepository : IBasicRepository<Menu, Guid>
{
Task<Menu> FindMainMenuAsync(bool includeDetails = true, CancellationToken cancellationToken = default);
Task<List<Menu>> GetCurrentAndNextMainMenusAsync(
Guid nextMainMenuId,
bool includeDetails = true,
CancellationToken cancellationToken = default);
}
}

33
modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Menus/Menu.cs

@ -0,0 +1,33 @@
using JetBrains.Annotations;
using System;
using System.Collections;
using System.Collections.Generic;
using Volo.Abp;
using Volo.Abp.Domain.Entities.Auditing;
using Volo.Abp.MultiTenancy;
namespace Volo.CmsKit.Menus
{
public class Menu : FullAuditedAggregateRoot<Guid>, IMultiTenant
{
public string Name { get; protected set; }
public bool IsMainMenu { get; internal set; }
public Guid? TenantId { get; protected set; }
public ICollection<MenuItem> Items { get; protected set; }
internal Menu(Guid id, Guid? tenantId, [NotNull] string name) : base(id)
{
TenantId = tenantId;
SetName(name);
Items = new HashSet<MenuItem>();
}
public void SetName([NotNull] string name)
{
Name = Check.NotNullOrEmpty(name, nameof(name), MenuConsts.MaxNameLength);
}
}
}

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

@ -0,0 +1,87 @@
using JetBrains.Annotations;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Volo.Abp;
using Volo.Abp.Authorization.Permissions;
using Volo.Abp.Domain.Entities.Auditing;
namespace Volo.CmsKit.Menus
{
public class MenuItem : AuditedEntity<Guid>
{
/// <summary>
/// Parent <see cref="Menu"/> Id.
/// </summary>
public Guid MenuId { get; set; }
/// <summary>
/// Presents another <see cref="MenuItem"/> Id.
/// If it's <see langword="null"/>, then it's a root menu item.
/// </summary>
public Guid? ParentId { get; set; }
[NotNull]
public string DisplayName { get; protected set; }
public bool IsActive { get; set; }
[NotNull]
public string Url { get; protected set; }
public string Icon { get; set; }
public int Order { get; set; }
public string Target { get; set; }
public string ElementId { get; set; }
public string CssClass { get; set; }
public Guid? PageId { get; protected set; }
public MenuItem(Guid id,
Guid menuId,
[NotNull] string displayName,
[NotNull] string url,
bool isActive = true,
[CanBeNull] Guid? parentId = null,
[CanBeNull] string icon = null,
int order = 0,
[CanBeNull] string target = null,
[CanBeNull] string elementId = null,
[CanBeNull] string cssClass = null)
:base(id)
{
MenuId = menuId;
SetDisplayName(displayName);
IsActive = isActive;
ParentId = parentId;
SetUrl(url);
Icon = icon;
Order = order;
Target = target;
ElementId = elementId;
CssClass = cssClass;
}
public void SetDisplayName([NotNull] string displayName)
{
DisplayName = Check.NotNullOrEmpty(displayName, nameof(displayName), MenuItemConsts.MaxDisplayNameLength);
}
public void SetUrl([NotNull]string url)
{
Url = Check.NotNullOrEmpty(url, nameof(url), MenuItemConsts.MaxUrlLength);
}
internal void SetPageId(Guid pageId)
{
PageId = pageId;
}
}
}

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save