Browse Source

Merge branch 'dev' into issues/8169

pull/9307/head
Yunus Emre Kalkan 5 years ago
committed by GitHub
parent
commit
75b2a7a952
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 3
      .gitignore
  2. 52
      docs/en/Modules/Account.md
  3. 96
      docs/en/Modules/Identity.md
  4. 2
      docs/en/Modules/Tenant-Management.md
  5. 3
      docs/en/Samples/Index.md
  6. 2
      docs/en/UI/AspNetCore/Basic-Theme.md
  7. 2
      docs/en/UI/Blazor/Basic-Theme.md
  8. BIN
      docs/en/images/account-module-forgot-password.png
  9. BIN
      docs/en/images/account-module-login.png
  10. BIN
      docs/en/images/account-module-manage-account.png
  11. BIN
      docs/en/images/account-module-register.png
  12. BIN
      docs/en/images/identity-module-menu.png
  13. BIN
      docs/en/images/identity-module-permissions.png
  14. BIN
      docs/en/images/identity-module-roles.png
  15. BIN
      docs/en/images/identity-module-users.png
  16. 1
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/ModuleProjectBuildPipelineBuilder.cs
  17. 56
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/CreateAppSettingsSecretsStep.cs
  18. 3
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/LicenseCodeReplaceStep.cs
  19. 5
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/TemplateInfo.cs
  20. 1
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/TemplateProjectBuildPipelineBuilder.cs
  21. 21
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/ModuleInfo.cs
  22. 12
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/SolutionModuleAdder.cs
  23. 10
      framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/AbpNavigationOptions.cs
  24. 2
      framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/IMenuManager.cs
  25. 53
      framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/MenuManager.cs
  26. 3
      framework/test/Volo.Abp.UI.Navigation.Tests/Volo/Abp/Ui/Navigation/AbpUiNavigationTestModule.cs
  27. 39
      framework/test/Volo.Abp.UI.Navigation.Tests/Volo/Abp/Ui/Navigation/MenuManager_Tests.cs
  28. 2
      modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.BasicTheme/Themes/Basic/NavMenu.razor.cs
  29. 2
      modules/basic-theme/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/Themes/Basic/Components/Menu/MainNavbarMenuViewComponent.cs
  30. 417
      modules/cms-kit/host/Volo.CmsKit.HttpApi.Host/Migrations/20210609081519_Initial.Designer.cs
  31. 207
      modules/cms-kit/host/Volo.CmsKit.HttpApi.Host/Migrations/20210609081519_Initial.cs
  32. 415
      modules/cms-kit/host/Volo.CmsKit.HttpApi.Host/Migrations/CmsKitHttpApiHostMigrationsDbContextModelSnapshot.cs
  33. 2022
      modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20210219113255_Initial.Designer.cs
  34. 2022
      modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20210219144454_BlogFeatureEnabledColumnRename.Designer.cs
  35. 23
      modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20210219144454_BlogFeatureEnabledColumnRename.cs
  36. 2018
      modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20210225092130_Page_Remove_Description.Designer.cs
  37. 24
      modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20210225092130_Page_Remove_Description.cs
  38. 2007
      modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20210226112040_BlogPost_Author.Designer.cs
  39. 109
      modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20210226112040_BlogPost_Author.cs
  40. 2012
      modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20210302064229_Added_EntityType_to_Media.Designer.cs
  41. 25
      modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20210302064229_Added_EntityType_to_Media.cs
  42. 2016
      modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20210302075529_Added_Content_To_BlogPost.Designer.cs
  43. 24
      modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20210302075529_Added_Content_To_BlogPost.cs
  44. 24
      modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20210302091451_Added_Content_To_Page.cs
  45. 1951
      modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20210305122554_BlogPost_CoverImage.Designer.cs
  46. 56
      modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20210305122554_BlogPost_CoverImage.cs
  47. 1957
      modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20210315123344_Page_StyleScript.Designer.cs
  48. 33
      modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20210315123344_Page_StyleScript.cs
  49. 150
      modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20210614072230_Initial.Designer.cs
  50. 136
      modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20210614072230_Initial.cs
  51. 143
      modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/UnifiedDbContextModelSnapshot.cs
  52. 2
      modules/cms-kit/host/Volo.CmsKit.Web.Unified/Properties/launchSettings.json
  53. 3
      modules/cms-kit/host/Volo.CmsKit.Web.Unified/package.json
  54. 8638
      modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/jstree/jstree.js
  55. 6
      modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/jstree/jstree.min.js
  56. BIN
      modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/jstree/themes/default-dark/32px.png
  57. BIN
      modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/jstree/themes/default-dark/40px.png
  58. 1146
      modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/jstree/themes/default-dark/style.css
  59. 1
      modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/jstree/themes/default-dark/style.min.css
  60. BIN
      modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/jstree/themes/default-dark/throbber.gif
  61. BIN
      modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/jstree/themes/default/32px.png
  62. BIN
      modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/jstree/themes/default/40px.png
  63. 1102
      modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/jstree/themes/default/style.css
  64. 1
      modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/jstree/themes/default/style.min.css
  65. BIN
      modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/jstree/themes/default/throbber.gif
  66. 20
      modules/cms-kit/host/Volo.CmsKit.Web.Unified/yarn.lock
  67. 36
      modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Menus/IMenuAdminAppService.cs
  68. 14
      modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Menus/MenuCreateInput.cs
  69. 32
      modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Menus/MenuItemCreateInput.cs
  70. 16
      modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Menus/MenuItemMoveInput.cs
  71. 26
      modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Menus/MenuItemUpdateInput.cs
  72. 14
      modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Menus/MenuUpdateInput.cs
  73. 12
      modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Menus/PageLookupDto.cs
  74. 11
      modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Menus/PageLookupInputDto.cs
  75. 10
      modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Menus/UpdateMainMenuInput.cs
  76. 1
      modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Pages/IPageAdminAppService.cs
  77. 10
      modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Permissions/CmsKitAdminPermissionDefinitionProvider.cs
  78. 8
      modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Permissions/CmsKitAdminPermissions.cs
  79. 12
      modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/CmsKitAdminApplicationAutoMapperProfile.cs
  80. 207
      modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Menus/MenuAdminAppService.cs
  81. 1
      modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Pages/PageAdminAppService.cs
  82. 123
      modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Menus/MenuAdminController.cs
  83. 1
      modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Pages/PageAdminController.cs
  84. 30
      modules/cms-kit/src/Volo.CmsKit.Admin.Web/CmsKitAdminWebModule.cs
  85. 8
      modules/cms-kit/src/Volo.CmsKit.Admin.Web/Menus/CmsKitAdminMenuContributor.cs
  86. 4
      modules/cms-kit/src/Volo.CmsKit.Admin.Web/Menus/CmsKitAdminMenus.cs
  87. 4
      modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Blogs/UpdateModal.cshtml.cs
  88. 23
      modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Menus/CreateModal.cshtml
  89. 44
      modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Menus/CreateModal.cshtml.cs
  90. 34
      modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Menus/Index.cshtml
  91. 13
      modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Menus/Index.cshtml.cs
  92. 49
      modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Menus/MenuItems/CreateModal.cshtml
  93. 75
      modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Menus/MenuItems/CreateModal.cshtml.cs
  94. 51
      modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Menus/MenuItems/Index.cshtml
  95. 31
      modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Menus/MenuItems/Index.cshtml.cs
  96. 47
      modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Menus/MenuItems/UpdateModal.cshtml
  97. 70
      modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Menus/MenuItems/UpdateModal.cshtml.cs
  98. 45
      modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Menus/MenuItems/createModal.js
  99. 1
      modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Menus/MenuItems/index.css
  100. 409
      modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Menus/MenuItems/index.js

3
.gitignore

@ -315,3 +315,6 @@ tempkey.jwk
# ABP Analyzing files
*.abppkg.analyze.json
# appsettings.secrets.json
appsettings.secrets.json

52
docs/en/Modules/Account.md

@ -1,12 +1,54 @@
# Account Module
This module provides necessary UI pages/components to make the user login and register to the application.
Account module implements the basic authentication features like **login**, **register**, **forgot password** and **account management**.
> This document is incomplete.
This module is based on [Microsoft's Identity library](https://docs.microsoft.com/en-us/aspnet/core/security/authentication/identity) and the [Identity Module](Identity.md). It has [IdentityServer](https://github.com/IdentityServer) integration (based on the [IdentityServer Module](IdentityServer.md)) to provide **single sign-on**, access control and other advanced authentication features.
## How to Install
This module comes as pre-installed (as NuGet/NPM packages) when you [create a new solution](https://abp.io/get-started) with the ABP Framework. You can continue to use it as package and get updates easily, or you can include its source code into your solution (see `get-source` [CLI](../CLI.md) command) to develop your custom module.
### The Source Code
The source code of this module can be accessed [here](https://github.com/abpframework/abp/tree/dev/modules/account). The source code is licensed with [MIT](https://choosealicense.com/licenses/mit/), so you can freely use and customize it.
## User Interface
This section introduces the main pages provided by this module.
### Login
`/Account/Login` page provides the login functionality.
![account-module-login](../images/account-module-login.png)
Social/external login buttons becomes visible if you setup it. See the *Social/External Logins* section below. Register and Forgot password and links redirect to the pages explained in the next sections.
### Register
`/Account/Register` page provides the new user registration functionality.
![account-module-register](../images/account-module-register.png)
### Forgot Password & Reset Password
`/Account/ForgotPassword` page provides a way of sending password reset link to user's email address. The user then clicks to the link and determines a new password.
![account-module-forgot-password](../images/account-module-forgot-password.png)
### Account Management
`/Account/Manage` page is used to change password and personal information of the user.
![account-module-manage-account](../images/account-module-manage-account.png)
## IdentityServer Integration
[Volo.Abp.Account.Web.IdentityServer](https://www.nuget.org/packages/Volo.Abp.Account.Web.IdentityServer) package provides integration for the [IdentityServer](https://github.com/IdentityServer). This package comes as installed with the [application startup template](../Startup-Templates/Application.md). See the [IdentityServer Module](IdentityServer.md) documentation.
## Social/External Logins
The [Account Module](../Modules/Account.md) has already configured to handle social or external logins out of the box. You can follow the ASP.NET Core documentation to add a social/external login provider to your application.
The Account Module has already configured to handle social or external logins out of the box. You can follow the ASP.NET Core documentation to add a social/external login provider to your application.
### Example: Facebook Authentication
@ -32,7 +74,3 @@ context.Services.AddAuthentication()
````
> It would be a better practice to use the `appsettings.json` or the ASP.NET Core User Secrets system to store your credentials, instead of a hard-coded value like that. Follow the [Microsoft's document](https://docs.microsoft.com/en-us/aspnet/core/security/authentication/social/facebook-logins) to learn the user secrets usage.
### Other UI Types
Beginning from the v3.1, the [Angular UI](../UI/Angular/Quick-Start.md) uses authorization code flow (as a best practice) to authenticate the user by redirecting to the MVC UI login page. So, even if you are using the Angular UI, social/external login integration is same as explained above and it will work out of the box. As similar, The [Blazor UI](../UI/Blazor/Overall.md) also uses the MVC UI to logic.

96
docs/en/Modules/Identity.md

@ -1,38 +1,59 @@
# Identity Management Module
Identity module is used to manage organization units, roles, users and their permissions, based on the Microsoft Identity library.
Identity module is used to manage roles, users and their permissions, based on the [Microsoft Identity library](https://docs.microsoft.com/en-us/aspnet/core/security/authentication/identity).
> **See [the source code](https://github.com/abpframework/abp/tree/dev/modules/identity). Documentation will come soon...**
## How to Install
This module comes as pre-installed (as NuGet/NPM packages) when you [create a new solution](https://abp.io/get-started) with the ABP Framework. You can continue to use it as package and get updates easily, or you can include its source code into your solution (see `get-source` [CLI](../CLI.md) command) to develop your custom module.
## Identity Security Log
### The Source Code
The security log can record some important operations or changes about your account. You can save the security log if needed.
The source code of this module can be accessed [here](https://github.com/abpframework/abp/tree/dev/modules/identity). The source code is licensed with [MIT](https://choosealicense.com/licenses/mit/), so you can freely use and customize it.
You can inject and use `IdentitySecurityLogManager` or `ISecurityLogManager` to write security logs. It will create a log object by default and fill in some common values, such as `CreationTime`, `ClientIpAddress`, `BrowserInfo`, `current user/tenant`, etc. Of course, you can override them.
## Menu Items
```cs
await IdentitySecurityLogManager.SaveAsync(new IdentitySecurityLogContext()
{
Identity = "IdentityServer";
Action = "ChangePassword";
});
```
This module adds an *Identity management* menu item under the *Administration* menu:
Configure `AbpSecurityLogOptions` to provide the application name for the log or disable this feature. **Enabled** by default.
![identity-module-menu](../images/identity-module-menu.png)
```cs
Configure<AbpSecurityLogOptions>(options =>
{
options.ApplicationName = "AbpSecurityTest";
});
```
The menu items and the related pages are authorized. That means the current user must have the related permissions to make them visible. The `admin` role (and the users with this role - like the `admin` user) already has these permissions. If you want to enable permissions for other roles/users, open the *Permissions* dialog on the *Roles* or *Users* page and check the permissions as shown below:
![identity-module-permissions](../images/identity-module-permissions.png)
See the [Authorization document](../Authorization.md) to understand the permission system.
## Pages
This section introduces the main pages provided by this module.
### Users
This page is used to see the list of users. You can create/edit and delete users, assign users to roles.
![identity-module-users](../images/identity-module-users.png)
A user can have zero or more roles. Users inherit permissions from their roles. In addition, you can assign permissions directly to the users (by clicking the *Actions* button, then selecting the *Permissions*).
### Roles
Roles are used to group permissions assign them to users.
![identity-module-roles](../images/identity-module-roles.png)
## Organization Unit Management
Beside the role name, there are two properties of a role:
Organization units (OU) is a part of **Identity Module** and can be used to **hierarchically group users and entities**.
* `Default`: If a role is marked as "default", then that role is assigned to new users by default when they register to the application themselves (using the [Account Module](Account.md)).
* `Public`: A public role of a user can be seen by other users in the application. This feature has no usage in the Identity module, but provided as a feature that you may want to use in your own application.
### OrganizationUnit Entity
## Other Features
This section covers some other features provided by this module which don't have the UI pages.
### Organization Units
Organization Units (OU) can be used to **hierarchically group users and entities**.
#### OrganizationUnit Entity
An OU is represented by the **OrganizationUnit** entity. The fundamental properties of this entity are:
@ -41,8 +62,6 @@ An OU is represented by the **OrganizationUnit** entity. The fundamental propert
- **Code**: A hierarchical string code that is unique for a tenant.
- **DisplayName**: Shown name of the OU.
The OrganizationUnit entity's primary key (Id) is a **Guid** type and it derives from the [**FullAuditedAggregateRoot**](../Entities.md) class.
#### Organization Tree
Since an OU can have a parent, all OUs of a tenant are in a **tree** structure. There are some rules for this tree;
@ -52,7 +71,7 @@ Since an OU can have a parent, all OUs of a tenant are in a **tree** structure.
#### OU Code
OU code is automatically generated and maintained by the OrganizationUnit Manager. It's a string that looks something like this:
OU code is automatically generated and maintained by the `OrganizationUnitManager` service. It's a string that looks something like this:
"**00001.00042.00005**"
@ -72,6 +91,29 @@ The **OrganizationUnitManager** class can be [injected](../Dependency-Injection.
- Move an OU in the OU tree.
- Getting information about the OU tree and its items.
#### Multi-Tenancy
### Identity Security Log
The security log can record some important operations or changes about your account. You can save the security log if needed.
You can inject and use `IdentitySecurityLogManager` or `ISecurityLogManager` to write security logs. It will create a log object by default and fill in some common values, such as `CreationTime`, `ClientIpAddress`, `BrowserInfo`, `current user/tenant`, etc. Of course, you can override them.
```cs
await IdentitySecurityLogManager.SaveAsync(new IdentitySecurityLogContext()
{
Identity = "IdentityServer";
Action = "ChangePassword";
});
```
Configure `AbpSecurityLogOptions` to provide the application name for the log or disable this feature. **Enabled** by default.
```cs
Configure<AbpSecurityLogOptions>(options =>
{
options.ApplicationName = "AbpSecurityTest";
});
```
### Options
The `OrganizationUnitManager` is designed to work for a **single tenant** at a time. It works for the **current tenant** by default.
TODO

2
docs/en/Modules/Tenant-Management.md

@ -12,7 +12,7 @@ The [SaaS Module](https://commercial.abp.io/modules/Volo.Saas) is an alternative
## How to Install
This module comes as pre-installed (as [NuGet/NPM packages](NuGet/NPM packages)) when you [create a new solution](https://abp.io/get-started) with the ABP Framework. You can continue to use it as package and get updates easily, or you can include its source code into your solution (see `get-source` [CLI](../CLI.md) command) to develop your custom module.
This module comes as pre-installed (as NuGet/NPM packages) when you [create a new solution](https://abp.io/get-started) with the ABP Framework. You can continue to use it as package and get updates easily, or you can include its source code into your solution (see `get-source` [CLI](../CLI.md) command) to develop your custom module.
### The Source Code

3
docs/en/Samples/Index.md

@ -76,6 +76,9 @@ While there is no Razor Pages & MongoDB combination, you can check both document
* **DevExtreme MVC / Razor Pages Component Integration**: How to install and use DevExtreme components in the ABP Framework MVC / Razor Pages UI.
* [Source code](https://github.com/abpframework/abp-samples/tree/master/DevExtreme-Mvc)
* [Article](https://community.abp.io/articles/using-devextreme-components-with-the-abp-framework-zb8z7yqv)
* **Syncfusion Blazor Integration**: Shows how to install and integrate Syncfusion UI with ABP Framework Blazor UI.
* [Source code](https://github.com/abpframework/abp-samples/tree/master/SyncfusionSample)
* [Article](https://community.abp.io/articles/using-syncfusion-components-with-the-abp-framework-5ccvi8kc)
* **Empty ASP.NET Core Application**: The most basic ASP.NET Core application with the ABP Framework installed.
* [Source code](https://github.com/abpframework/abp-samples/tree/master/BasicAspNetCoreApplication)
* [Documentation](../Getting-Started-AspNetCore-Application.md)

2
docs/en/UI/AspNetCore/Basic-Theme.md

@ -93,4 +93,4 @@ Or, you can download the [source code](https://github.com/abpframework/abp/tree/
## See Also
* [Theming](Theming.md)
* [Theming](Theming.md)

2
docs/en/UI/Blazor/Basic-Theme.md

@ -64,4 +64,4 @@ Or, you can download the [source code](https://github.com/abpframework/abp/tree/
## See Also
* [Theming](Theming.md)
* [Theming](Theming.md)

BIN
docs/en/images/account-module-forgot-password.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

BIN
docs/en/images/account-module-login.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

BIN
docs/en/images/account-module-manage-account.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

BIN
docs/en/images/account-module-register.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

BIN
docs/en/images/identity-module-menu.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.9 KiB

BIN
docs/en/images/identity-module-permissions.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

BIN
docs/en/images/identity-module-roles.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

BIN
docs/en/images/identity-module-users.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

1
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/ModuleProjectBuildPipelineBuilder.cs

@ -10,6 +10,7 @@ namespace Volo.Abp.Cli.ProjectBuilding.Building
var pipeline = new ProjectBuildPipeline(context);
pipeline.Steps.Add(new FileEntryListReadStep());
pipeline.Steps.Add(new CreateAppSettingsSecretsStep());
pipeline.Steps.Add(new ProjectReferenceReplaceStep());
pipeline.Steps.Add(new ReplaceCommonPropsStep());
pipeline.Steps.Add(new ReplaceConfigureAwaitPropsStep());

56
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/CreateAppSettingsSecretsStep.cs

@ -0,0 +1,56 @@
using System;
using System.Linq;
using Volo.Abp.Cli.ProjectBuilding.Files;
namespace Volo.Abp.Cli.ProjectBuilding.Building.Steps
{
public class CreateAppSettingsSecretsStep : ProjectBuildPipelineStep
{
private const string FileName = "appsettings.secrets.json";
private const string AppSettingsFileName = "appsettings.json";
private const string AppSettingsPlaceholder = "<!--APPSETTINGS-SECRETS-->";
public override void Execute(ProjectBuildContext context)
{
var appSettingsFiles = context.Files
.Where(x =>
x.Name.EndsWith(AppSettingsFileName) &&
NotBlazorWasmProject(x.Name))
.ToList();
var content = context.Template.IsPro()
? $"{{{Environment.NewLine} \"AbpLicenseCode\": \"<LICENSE_CODE/>\" {Environment.NewLine}}}"
: $"{{{Environment.NewLine}}}";
foreach (var appSettingsFile in appSettingsFiles)
{
context.Files.Add(new FileEntry(
appSettingsFile.Name.Replace(AppSettingsFileName, FileName),
content.GetBytes(),
false));
}
var projectFiles = context.Files.Where(x => x.Content.Contains(AppSettingsPlaceholder)).ToList();
foreach (var projectFile in projectFiles)
{
projectFile.SetContent(ReplaceAppSettingsSecretsPlaceholder(projectFile.Content));
}
}
private static bool NotBlazorWasmProject(string fileName)
{
return !fileName.Contains("Blazor/wwwroot") && !fileName.Contains("Blazor.Host/wwwroot");
}
private static string ReplaceAppSettingsSecretsPlaceholder(string content)
{
var replaceContent = $"<None Remove=\"{FileName}\" />{Environment.NewLine}" +
$" <Content Include=\"{FileName}\">{Environment.NewLine}" +
$" <CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>{Environment.NewLine}" +
$" <CopyToOutputDirectory>Always</CopyToOutputDirectory>{Environment.NewLine}" +
" </Content>";
return content.Replace(AppSettingsPlaceholder, replaceContent);
}
}
}

3
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/LicenseCodeReplaceStep.cs

@ -12,7 +12,8 @@ namespace Volo.Abp.Cli.ProjectBuilding.Building.Steps
var licenseCode = context.BuildArgs.ExtraProperties.GetOrDefault("license-code");
var appSettingsJsonFiles = context.Files.Where(f =>
f.Name.EndsWith("appsettings.json", StringComparison.OrdinalIgnoreCase));
f.Name.EndsWith("appsettings.json", StringComparison.OrdinalIgnoreCase) ||
f.Name.EndsWith("appsettings.secrets.json", StringComparison.OrdinalIgnoreCase));
foreach (var appSettingsJson in appSettingsJsonFiles)
{

5
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/TemplateInfo.cs

@ -30,5 +30,10 @@ namespace Volo.Abp.Cli.ProjectBuilding.Building
{
return Array.Empty<ProjectBuildPipelineStep>();
}
public bool IsPro()
{
return Name.EndsWith("pro", StringComparison.OrdinalIgnoreCase);
}
}
}

1
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/TemplateProjectBuildPipelineBuilder.cs

@ -12,6 +12,7 @@ namespace Volo.Abp.Cli.ProjectBuilding.Building
var pipeline = new ProjectBuildPipeline(context);
pipeline.Steps.Add(new FileEntryListReadStep());
pipeline.Steps.Add(new CreateAppSettingsSecretsStep());
pipeline.Steps.AddRange(context.Template.GetCustomSteps(context));

21
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/ModuleInfo.cs

@ -1,4 +1,6 @@
using System.Collections.Generic;
using System;
using System.Collections.Generic;
using System.Linq;
namespace Volo.Abp.Cli.ProjectModification
{
@ -10,8 +12,23 @@ namespace Volo.Abp.Cli.ProjectModification
public string EfCoreConfigureMethodName { get; set; }
public string DocumentationLinks { get; set; }
public List<NugetPackageInfo> NugetPackages { get; set; }
public List<NpmPackageInfo> NpmPackages { get; set; }
public string GetFirstDocumentationLinkOrNull()
{
if (string.IsNullOrWhiteSpace(DocumentationLinks))
{
return null;
}
var docs = DocumentationLinks.Split(" ", StringSplitOptions.RemoveEmptyEntries);
return docs.Any() ?
docs.First() :
null;
}
}
}
}

12
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/SolutionModuleAdder.cs

@ -131,6 +131,12 @@ namespace Volo.Abp.Cli.ProjectModification
await RunBundleForBlazorAsync(projectFiles, module);
ModifyDbContext(projectFiles, module, skipDbMigrations);
var documentationLink = module.GetFirstDocumentationLinkOrNull();
if (documentationLink != null)
{
CmdHelper.OpenWebPage(documentationLink);
}
}
private ModuleWithMastersInfo RemoveIncompatiblePackages(ModuleWithMastersInfo module, string version)
@ -209,7 +215,7 @@ namespace Volo.Abp.Cli.ProjectModification
{
projectsToRemove.AddRange(await FindProjectsToRemoveByTarget(module, NuGetPackageTarget.BlazorWebAssembly, isProjectTiered));
webPackagesWillBeAddedToBlazorServerProject = module.NugetPackages.All(np=> np.Target != NuGetPackageTarget.BlazorServer && np.TieredTarget != NuGetPackageTarget.BlazorServer);
webPackagesWillBeAddedToBlazorServerProject = module.NugetPackages.All(np => np.Target != NuGetPackageTarget.BlazorServer && np.TieredTarget != NuGetPackageTarget.BlazorServer);
}
else
{
@ -250,7 +256,7 @@ namespace Volo.Abp.Cli.ProjectModification
private bool IsReferencedByAnotherModuleProject(string moduleDirectory, List<string> projectsToRemove, string projectToRemove)
{
var moduleProjects = Directory.GetFiles(moduleDirectory, "*.csproj", SearchOption.AllDirectories);
var projectsToKeep = moduleProjects.Where(mp=> !projectsToRemove.Contains(Path.GetFileName(mp).RemovePostFix(".csproj"))).ToList();
var projectsToKeep = moduleProjects.Where(mp => !projectsToRemove.Contains(Path.GetFileName(mp).RemovePostFix(".csproj"))).ToList();
return projectsToKeep.Select(File.ReadAllText).Any(content => content.Contains($"\"{projectToRemove}\""));
}
@ -278,7 +284,7 @@ namespace Volo.Abp.Cli.ProjectModification
return projectsToRemove;
}
private async Task<List<string>> FindProjectsToRemoveByPostFix(string moduleDirectory, string targetFolder,
private async Task<List<string>> FindProjectsToRemoveByPostFix(string moduleDirectory, string targetFolder,
string postFix)
{
var projectsToRemove = new List<string>();

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'));
}
}
});

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

Loading…
Cancel
Save