@ -0,0 +1,69 @@ |
|||
# Introducing the Lepton Theme Next Generation! |
|||
|
|||
We are delighted and proud to announce that the next generation of [Lepton Theme](https://leptontheme.com/) which will be referred to as LeptonX is on the way. |
|||
|
|||
At Volosoft, we care about developer experience as much as user experience. Thus, LeptonX is following the latest trends for a better user experience and provides highly customizable features that will be easy to use. Our APIs follow a strict guideline to be easy-to-use, intuitive, extendable, and replaceable. In short, we'd like LeptonX to grow into such a platform that developers (not just ABP developers) love to build their applications on top of, and end-users love to interact with. |
|||
|
|||
The initial version has been built upon Bootstrap v4. Bootstrap v5 has been recently published and the ecosystem has not caught up yet. In addition, ABP packages are already dependent on Bootstrap v4, it will be easy to switch from the [Basic Theme](https://docs.abp.io/en/abp/latest/UI/AspNetCore/Basic-Theme) or from the [Lepton Theme](https://commercial.abp.io/themes) to the LeptonX. |
|||
|
|||
We believe that the bigger the community is, the better the framework turns out to be. As we have done in our other products, we will release a free-to-use version of LeptonX, a.k.a LeptonX-lite which will contain most of the basic features. With LeptonX-lite, free ABP [application startup template](https://docs.abp.io/en/abp/latest/Startup-Templates/Application)s will come with a production-ready theme, and existing applications will be able to switch from the Basic Theme to the LeptonX-lite with ease. |
|||
|
|||
## Highlights |
|||
|
|||
In this section, I want to highlight some of the LeptonX features. |
|||
|
|||
### Better Mobile UX |
|||
|
|||
When people talk about Responsive Web Applications, they usually refer to a side menu or top menu that shrinks down into a hamburger menu which does not provide a good user experience for mobile users. |
|||
|
|||
On the other hand, widely used native mobile applications usually employ a tab menu stick to the bottom of the screen. People have become acquainted with this type of experience. With this UX in mind, menus in the `LeptonX` theme switches to the tab menu on the mobile resolution as opposed to the hamburger menu. |
|||
|
|||
 |
|||
 |
|||
|
|||
### Theme Build System |
|||
|
|||
Following the latest trends, LeptonX comes with three built-in theme styles; `dark`, `dim`, `light`. |
|||
A theme builder system (written in SASS) is provided with the LeptonX which you can run with your brand colors and create your own theme style as well. |
|||
|
|||
LeptonX is built on top of CSS variables that enable runtime theme building. In the future, we may release a color picker that can create custom themes. Each user can create their own color palettes. |
|||
|
|||
### Multiple Layouts |
|||
|
|||
LeptonX is being developed with such an architecture that it will be easy to replace the layout. You will be given many options to choose any layout you prefer. |
|||
|
|||
Take a look at the following layouts: |
|||
|
|||
 |
|||
 |
|||
|
|||
## The LeptonX Ecosystem |
|||
|
|||
The previous version of Lepton Theme has been only available to Commercial ABP customers and it has never been as a standalone (ABP independent) template. With LeptonX, we aim at a broader audience. With this goal in mind, LeptonX can be integrated into any tech stack you'd prefer as well as the ABP Framework. That's why you'll be offered a variety of packages as follows: |
|||
|
|||
- A template with HTML, VanillaJS, CSS (can be used as ABP independent) |
|||
- You can just download this like any other template and start developing your application. |
|||
- An angular library (can be used as ABP independent) |
|||
- An upgradeable angular package contains layouts, components, directives, and services for you to build any application you'd like. If you choose this option, you'll be able to stay up-to-date with LeptonX as we will continue to introduce new features. |
|||
- A standalone Angular template that contains code of the npm package above (can be used as ABP independent) |
|||
- You can also download an angular template that contains the library above. You can edit it as you see fit, however, it will be harder to integrate new features once they become available. |
|||
- Free ABP packages for all of the clients available, MVC, Blazor, and Angular that utilizes the lite packages |
|||
- Client-specific packages that employ LeptonX-lite for open-source ABP users. |
|||
- Commercial ABP packages for all of the clients available, MVC, Blazor, and Angular that utilizes Pro (full version) packages |
|||
- Client-specific packages that employ, provide and extend all of the features that LeptonX-Pro packages have. |
|||
|
|||
As is seen above, the LeptonX ecosystem contains multiple projects that are designed for different kinds of users. |
|||
|
|||
## The LeptonX-lite |
|||
|
|||
As mentioned above, there will be a free-to-use version of LeptonX. It will contain most of the basic features and components that the pro version has. It will be also a one-line change to upgrade from the lite version to the pro (full) version. Here, some of the differences between the lite and pro versions: |
|||
|
|||
- The mobile tab navigation bar shown above will be only available to pro. In the lite version, a hamburger menu will take its place. |
|||
- The lite version will be released just with the side menu layout although we may release more in the future as our infrastructure makes it easy to develop and replace layouts. |
|||
- Different color options and the ability to change colors during runtime are pro-only features. CSS of the lite version is built with the `dim` colors. |
|||
|
|||
## Alpha Version |
|||
|
|||
As we have mentioned above, both user and developer experience means a great deal to us. Therefore, we will release an alpha version of the LeptonX-lite package and the free ABP-based Angular package soon to start collecting feedback from our users. Once the packages are released, we would like you to try them out and give us feedback. It will help us improve the LeptonX greatly. We plan to release a stable version later this year. |
|||
|
|||
To stay up-to-date with LeptonX and be notified once the alpha version is ready, follow our [Twitter account](https://twitter.com/volosoftcompany). |
|||
|
After Width: | Height: | Size: 144 KiB |
|
After Width: | Height: | Size: 150 KiB |
|
After Width: | Height: | Size: 163 KiB |
|
After Width: | Height: | Size: 127 KiB |
|
After Width: | Height: | Size: 105 KiB |
|
After Width: | Height: | Size: 13 KiB |
|
After Width: | Height: | Size: 10 KiB |
|
After Width: | Height: | Size: 20 KiB |
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 8.9 KiB |
|
After Width: | Height: | Size: 30 KiB |
|
After Width: | Height: | Size: 18 KiB |
|
After Width: | Height: | Size: 18 KiB |
@ -0,0 +1,40 @@ |
|||
using System; |
|||
using System.Collections.Generic; |
|||
using System.Linq; |
|||
using System.Security.Claims; |
|||
using System.Text.Json; |
|||
using Microsoft.AspNetCore.Authentication.OAuth.Claims; |
|||
|
|||
namespace Volo.Abp.AspNetCore.Authentication.OAuth.Claims |
|||
{ |
|||
public class RemoveDuplicateClaimAction : ClaimAction |
|||
{ |
|||
public RemoveDuplicateClaimAction(string claimType) |
|||
: base(claimType, ClaimValueTypes.String) |
|||
{ |
|||
} |
|||
|
|||
/// <inheritdoc />
|
|||
public override void Run(JsonElement userData, ClaimsIdentity identity, string issuer) |
|||
{ |
|||
var claims = identity.Claims.Where(c => c.Type == ClaimType).ToArray(); |
|||
if (claims.Length < 2) |
|||
{ |
|||
return; |
|||
} |
|||
|
|||
var previousValues = new List<string>(); |
|||
foreach (var claim in claims) |
|||
{ |
|||
if (claim.Value.IsIn(previousValues)) |
|||
{ |
|||
identity.RemoveClaim(claim); |
|||
} |
|||
else |
|||
{ |
|||
previousValues.Add(claim.Value); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
@ -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); |
|||
} |
|||
} |
|||
} |
|||
@ -1,6 +1,6 @@ |
|||
{ |
|||
"culture": "ar", |
|||
"texts": { |
|||
"ManageYourProfile": "إدارة ملف التعريف الخاص بك" |
|||
"MyAccount": "حسابي" |
|||
} |
|||
} |
|||
@ -1,6 +1,6 @@ |
|||
{ |
|||
"culture": "cs", |
|||
"texts": { |
|||
"ManageYourProfile": "Spravovat profil" |
|||
"MyAccount": "Můj účet" |
|||
} |
|||
} |
|||
|
|||
@ -1,6 +1,6 @@ |
|||
{ |
|||
"culture": "de-DE", |
|||
"texts": { |
|||
"ManageYourProfile": "Verwalten Sie Ihr Profil" |
|||
"MyAccount": "Mein Konto" |
|||
} |
|||
} |
|||
@ -1,6 +1,6 @@ |
|||
{ |
|||
"culture": "en-GB", |
|||
"texts": { |
|||
"ManageYourProfile": "Manage your profile" |
|||
"MyAccount": "My account" |
|||
} |
|||
} |
|||
@ -1,6 +1,6 @@ |
|||
{ |
|||
"culture": "en", |
|||
"texts": { |
|||
"ManageYourProfile": "Manage your profile" |
|||
"MyAccount": "My account" |
|||
} |
|||
} |
|||
@ -1,6 +1,6 @@ |
|||
{ |
|||
"culture": "es", |
|||
"texts": { |
|||
"ManageYourProfile": "Administra tu perfil" |
|||
"MyAccount": "Mi cuenta" |
|||
} |
|||
} |
|||
@ -1,6 +1,6 @@ |
|||
{ |
|||
"culture": "fi", |
|||
"texts": { |
|||
"ManageYourProfile": "Hallitse profiiliasi" |
|||
"MyAccount": "Tilini" |
|||
} |
|||
} |
|||
@ -1,6 +1,6 @@ |
|||
{ |
|||
"culture": "fr", |
|||
"texts": { |
|||
"ManageYourProfile": "Gérer votre profil" |
|||
"MyAccount": "Mon compte" |
|||
} |
|||
} |
|||
@ -1,6 +1,6 @@ |
|||
{ |
|||
"culture": "hi", |
|||
"texts": { |
|||
"ManageYourProfile": "अपनी प्रोफ़ाइल प्रबंधित करें" |
|||
"MyAccount": "मेरा खाता" |
|||
} |
|||
} |
|||
@ -1,6 +1,6 @@ |
|||
{ |
|||
"culture": "hu", |
|||
"texts": { |
|||
"ManageYourProfile": "Kezelje a profilját" |
|||
"MyAccount": "A fiókom" |
|||
} |
|||
} |
|||
@ -1,6 +1,6 @@ |
|||
{ |
|||
"culture": "it", |
|||
"texts": { |
|||
"ManageYourProfile": "Gestisci il tuo profilo" |
|||
"MyAccount": "Il mio conto" |
|||
} |
|||
} |
|||
@ -1,6 +1,6 @@ |
|||
{ |
|||
"culture": "nl", |
|||
"texts": { |
|||
"ManageYourProfile": "Beheer uw profiel" |
|||
"MyAccount": "Mijn rekening" |
|||
} |
|||
} |
|||
@ -1,6 +1,6 @@ |
|||
{ |
|||
"culture": "sl", |
|||
"texts": { |
|||
"ManageYourProfile": "Upravljajte svojim profilom" |
|||
"MyAccount": "Moj račun" |
|||
} |
|||
} |
|||
@ -1,6 +1,6 @@ |
|||
{ |
|||
"culture": "tr", |
|||
"texts": { |
|||
"ManageYourProfile": "Profil yönetimi" |
|||
"MyAccount": "Hesabım" |
|||
} |
|||
} |
|||
@ -1,6 +1,6 @@ |
|||
{ |
|||
"culture": "zh-Hans", |
|||
"texts": { |
|||
"ManageYourProfile": "管理个人资料" |
|||
"MyAccount": "我的账户" |
|||
} |
|||
} |
|||
@ -1,6 +1,6 @@ |
|||
{ |
|||
"culture": "zh-Hant", |
|||
"texts": { |
|||
"ManageYourProfile": "管理個人資料" |
|||
"MyAccount": "我的賬戶" |
|||
} |
|||
} |
|||
@ -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"); |
|||
} |
|||
} |
|||
} |
|||
@ -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); |
|||
} |
|||
} |
|||
} |
|||
@ -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); |
|||
} |
|||
} |
|||
} |
|||
@ -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"); |
|||
} |
|||
} |
|||
} |
|||
@ -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"); |
|||
} |
|||
} |
|||
} |
|||
@ -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"); |
|||
} |
|||
} |
|||
} |
|||
@ -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" }); |
|||
} |
|||
} |
|||
} |
|||