From 33f45d504b1b3d4f78a7d45b9a994c198c91a744 Mon Sep 17 00:00:00 2001 From: Yunus Emre Kalkan Date: Mon, 22 Feb 2021 14:06:56 +0300 Subject: [PATCH 01/21] CLI CreateMigrationAndRunMigrator: check if EF Core global tool installed resolves https://github.com/abpframework/abp/issues/7800 --- .../Commands/CreateMigrationAndRunMigrator.cs | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/CreateMigrationAndRunMigrator.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/CreateMigrationAndRunMigrator.cs index 982ef77065..b6eadd4183 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/CreateMigrationAndRunMigrator.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/CreateMigrationAndRunMigrator.cs @@ -2,6 +2,8 @@ using System.IO; using System.Linq; using System.Threading.Tasks; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Logging.Abstractions; using Volo.Abp.Cli.Args; using Volo.Abp.Cli.Utils; using Volo.Abp.DependencyInjection; @@ -10,6 +12,13 @@ namespace Volo.Abp.Cli.Commands { public class CreateMigrationAndRunMigrator : IConsoleCommand, ITransientDependency { + public ILogger Logger { get; set; } + + public CreateMigrationAndRunMigrator() + { + Logger = NullLogger.Instance; + } + public virtual async Task ExecuteAsync(CommandLineArgs commandLineArgs) { if (commandLineArgs.Target.IsNullOrEmpty()) @@ -26,6 +35,8 @@ namespace Volo.Abp.Cli.Commands throw new Exception("DbMigrator is not found!"); } + await CheckAndInstallDotnetEfIfNeededAsync(); + var output = CmdHelper.RunCmdAndGetOutput($"cd \"{commandLineArgs.Target}\" && dotnet ef migrations add Initial -s \"{dbMigratorProjectPath}\""); if (output.Contains("Done.") && output.Contains("To undo this action") && output.Contains("ef migrations remove")) // Migration added successfully @@ -38,6 +49,22 @@ namespace Volo.Abp.Cli.Commands } } + private async Task CheckAndInstallDotnetEfIfNeededAsync() + { + var output = CmdHelper.RunCmdAndGetOutput("dotnet tool list -g"); + + if (output.Contains("dotnet-ef")) + { + return; + } + + Logger.LogInformation("Installing dotnet-ef tool..."); + + CmdHelper.RunCmd("dotnet tool install --global dotnet-ef"); + + Logger.LogInformation("dotnet-ef tool is installed."); + } + private string GetDbMigratorProjectPath(string dbMigrationsFolderPath) { var srcFolder = Directory.GetParent(dbMigrationsFolderPath); From 37973efb459ec0615cad14b36e94168635b95a02 Mon Sep 17 00:00:00 2001 From: Yunus Emre Kalkan Date: Mon, 22 Feb 2021 14:07:43 +0300 Subject: [PATCH 02/21] rename CreateMigrationAndRunMigrator to CreateMigrationAndRunMigratorCommand --- .../Volo.Abp.Cli.Core/Volo/Abp/Cli/AbpCliCoreModule.cs | 2 +- ...igrator.cs => CreateMigrationAndRunMigratorCommand.cs} | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) rename framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/{CreateMigrationAndRunMigrator.cs => CreateMigrationAndRunMigratorCommand.cs} (89%) diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/AbpCliCoreModule.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/AbpCliCoreModule.cs index 9208357d4a..7ee6700d43 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/AbpCliCoreModule.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/AbpCliCoreModule.cs @@ -40,7 +40,7 @@ namespace Volo.Abp.Cli options.Commands["translate"] = typeof(TranslateCommand); options.Commands["build"] = typeof(BuildCommand); options.Commands["bundle"] = typeof(BundleCommand); - options.Commands["create-migration-and-run-migrator"] = typeof(CreateMigrationAndRunMigrator); + options.Commands["create-migration-and-run-migrator"] = typeof(CreateMigrationAndRunMigratorCommand); }); } } diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/CreateMigrationAndRunMigrator.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/CreateMigrationAndRunMigratorCommand.cs similarity index 89% rename from framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/CreateMigrationAndRunMigrator.cs rename to framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/CreateMigrationAndRunMigratorCommand.cs index b6eadd4183..3946ca35bb 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/CreateMigrationAndRunMigrator.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/CreateMigrationAndRunMigratorCommand.cs @@ -10,13 +10,13 @@ using Volo.Abp.DependencyInjection; namespace Volo.Abp.Cli.Commands { - public class CreateMigrationAndRunMigrator : IConsoleCommand, ITransientDependency + public class CreateMigrationAndRunMigratorCommand : IConsoleCommand, ITransientDependency { - public ILogger Logger { get; set; } + public ILogger Logger { get; set; } - public CreateMigrationAndRunMigrator() + public CreateMigrationAndRunMigratorCommand() { - Logger = NullLogger.Instance; + Logger = NullLogger.Instance; } public virtual async Task ExecuteAsync(CommandLineArgs commandLineArgs) From d07230910b15b3f723574b1b4906455f2c25b19e Mon Sep 17 00:00:00 2001 From: maliming Date: Tue, 23 Feb 2021 13:25:34 +0800 Subject: [PATCH 03/21] Use ApplicationApiDescriptionModel.Create insetad of new. Resolve #7815 --- .../Volo/Abp/Http/Modeling/ApplicationApiDescriptionModel.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/src/Volo.Abp.Http/Volo/Abp/Http/Modeling/ApplicationApiDescriptionModel.cs b/framework/src/Volo.Abp.Http/Volo/Abp/Http/Modeling/ApplicationApiDescriptionModel.cs index 77fb28eed5..92f844dd3c 100644 --- a/framework/src/Volo.Abp.Http/Volo/Abp/Http/Modeling/ApplicationApiDescriptionModel.cs +++ b/framework/src/Volo.Abp.Http/Volo/Abp/Http/Modeling/ApplicationApiDescriptionModel.cs @@ -43,7 +43,7 @@ namespace Volo.Abp.Http.Modeling public ApplicationApiDescriptionModel CreateSubModel(string[] modules = null, string[] controllers = null, string[] actions = null) { - var subModel = new ApplicationApiDescriptionModel(); + var subModel = ApplicationApiDescriptionModel.Create();; foreach (var module in Modules.Values) { From 105d7fd542029455b512279e316c0e7859fda84f Mon Sep 17 00:00:00 2001 From: maliming Date: Tue, 23 Feb 2021 14:21:18 +0800 Subject: [PATCH 04/21] Use controller type as key. --- .../Mvc/AspNetCoreApiDescriptionModelProvider.cs | 1 - .../Abp/Http/Modeling/ModuleApiDescriptionModel.cs | 10 +++++----- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AspNetCoreApiDescriptionModelProvider.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AspNetCoreApiDescriptionModelProvider.cs index 135b506e69..1710fd5bd7 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AspNetCoreApiDescriptionModelProvider.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AspNetCoreApiDescriptionModelProvider.cs @@ -84,7 +84,6 @@ namespace Volo.Abp.AspNetCore.Mvc ); var controllerModel = moduleModel.GetOrAddController( - controllerType.FullName, _options.ControllerNameGenerator(controllerType, setting), controllerType, _modelOptions.IgnoredInterfaces diff --git a/framework/src/Volo.Abp.Http/Volo/Abp/Http/Modeling/ModuleApiDescriptionModel.cs b/framework/src/Volo.Abp.Http/Volo/Abp/Http/Modeling/ModuleApiDescriptionModel.cs index 5c7c53745c..62365b898b 100644 --- a/framework/src/Volo.Abp.Http/Volo/Abp/Http/Modeling/ModuleApiDescriptionModel.cs +++ b/framework/src/Volo.Abp.Http/Volo/Abp/Http/Modeling/ModuleApiDescriptionModel.cs @@ -41,17 +41,17 @@ namespace Volo.Abp.Http.Modeling public ControllerApiDescriptionModel AddController(ControllerApiDescriptionModel controller) { - if (Controllers.ContainsKey(controller.ControllerName)) + if (Controllers.ContainsKey(controller.Type)) { - throw new AbpException($"There is already a controller with name: {controller.ControllerName} in module: {RootPath}"); + throw new AbpException($"There is already a controller with type: {controller.Type} in module: {RootPath}"); } - return Controllers[controller.ControllerName] = controller; + return Controllers[controller.Type] = controller; } - public ControllerApiDescriptionModel GetOrAddController(string uniqueName, string name, Type type, [CanBeNull] HashSet ignoredInterfaces = null) + public ControllerApiDescriptionModel GetOrAddController(string name, Type type, [CanBeNull] HashSet ignoredInterfaces = null) { - return Controllers.GetOrAdd(uniqueName, () => ControllerApiDescriptionModel.Create(name, type, ignoredInterfaces)); + return Controllers.GetOrAdd(type.FullName, () => ControllerApiDescriptionModel.Create(name, type, ignoredInterfaces)); } public ModuleApiDescriptionModel CreateSubModel(string[] controllers, string[] actions) From 9a81666557e07162043b6854b3195e1557d51672 Mon Sep 17 00:00:00 2001 From: Alper Ebicoglu Date: Tue, 23 Feb 2021 10:10:50 +0300 Subject: [PATCH 05/21] refactor CreateMigrationAndRunMigratorCommand.cs --- .../CreateMigrationAndRunMigratorCommand.cs | 58 ++++++++++--------- 1 file changed, 32 insertions(+), 26 deletions(-) diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/CreateMigrationAndRunMigratorCommand.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/CreateMigrationAndRunMigratorCommand.cs index 3946ca35bb..68fae779ce 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/CreateMigrationAndRunMigratorCommand.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/CreateMigrationAndRunMigratorCommand.cs @@ -23,60 +23,66 @@ namespace Volo.Abp.Cli.Commands { if (commandLineArgs.Target.IsNullOrEmpty()) { - throw new CliUsageException( - "DbMigrations folder path is missing!" - ); + throw new CliUsageException("DbMigrations folder path is missing!"); } var dbMigratorProjectPath = GetDbMigratorProjectPath(commandLineArgs.Target); - if (dbMigratorProjectPath == null) { throw new Exception("DbMigrator is not found!"); } - await CheckAndInstallDotnetEfIfNeededAsync(); + if (!IsDotNetEfToolInstalled()) + { + InstallDotnetEfTool(); + } - var output = CmdHelper.RunCmdAndGetOutput($"cd \"{commandLineArgs.Target}\" && dotnet ef migrations add Initial -s \"{dbMigratorProjectPath}\""); + var addMigrationCmd = $"cd \"{commandLineArgs.Target}\" && " + + $"dotnet ef migrations add Initial -s \"{dbMigratorProjectPath}\""; - if (output.Contains("Done.") && output.Contains("To undo this action") && output.Contains("ef migrations remove")) // Migration added successfully + var output = CmdHelper.RunCmdAndGetOutput(addMigrationCmd); + if (output.Contains("Done.") && + output.Contains("To undo this action") && + output.Contains("ef migrations remove")) { + // Migration added successfully CmdHelper.RunCmd("cd \"" + Path.GetDirectoryName(dbMigratorProjectPath) + "\" && dotnet run"); + await Task.CompletedTask; } else { - throw new Exception("Migrations failed: " + output); + var exceptionMsg = "Migrations failed! The following command didn't run successfully:" + + Environment.NewLine + + addMigrationCmd + + Environment.NewLine + output; + + Logger.LogError(exceptionMsg); + throw new Exception(exceptionMsg); } } - private async Task CheckAndInstallDotnetEfIfNeededAsync() + private static bool IsDotNetEfToolInstalled() { var output = CmdHelper.RunCmdAndGetOutput("dotnet tool list -g"); + return output.Contains("dotnet-ef"); + } - if (output.Contains("dotnet-ef")) - { - return; - } - + private void InstallDotnetEfTool() + { Logger.LogInformation("Installing dotnet-ef tool..."); - CmdHelper.RunCmd("dotnet tool install --global dotnet-ef"); - Logger.LogInformation("dotnet-ef tool is installed."); } - private string GetDbMigratorProjectPath(string dbMigrationsFolderPath) + private static string GetDbMigratorProjectPath(string dbMigrationsFolderPath) { var srcFolder = Directory.GetParent(dbMigrationsFolderPath); + var dbMigratorDirectory = Directory.GetDirectories(srcFolder.FullName) + .FirstOrDefault(d => d.EndsWith(".DbMigrator")); - var dbMigratorFolderPath = Directory.GetDirectories(srcFolder.FullName).FirstOrDefault(d => d.EndsWith(".DbMigrator")); - - if (dbMigratorFolderPath == null) - { - return null; - } - - return Directory.GetFiles(dbMigratorFolderPath).FirstOrDefault(f => f.EndsWith(".csproj")); + return dbMigratorDirectory == null + ? null + : Directory.GetFiles(dbMigratorDirectory).FirstOrDefault(f => f.EndsWith(".csproj")); } public string GetUsageInfo() @@ -89,4 +95,4 @@ namespace Volo.Abp.Cli.Commands return string.Empty; } } -} +} \ No newline at end of file From 5dd1db0823c729db949229c5622586f7493a0641 Mon Sep 17 00:00:00 2001 From: Arman Ozak Date: Tue, 23 Feb 2021 10:23:32 +0300 Subject: [PATCH 06/21] remove duplicate BookModule heading --- docs/en/Tutorials/Part-2.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/docs/en/Tutorials/Part-2.md b/docs/en/Tutorials/Part-2.md index 7bc42b1fc9..5ec23ba43a 100644 --- a/docs/en/Tutorials/Part-2.md +++ b/docs/en/Tutorials/Part-2.md @@ -344,8 +344,6 @@ It's time to create something visible and usable! There are some tools that we w - [Ng Bootstrap](https://ng-bootstrap.github.io/#/home) will be used as the UI component library. - [Ngx-Datatable](https://swimlane.gitbook.io/ngx-datatable/) will be used as the datatable library. -### BookModule - Run the following command line to create a new module, named `BookModule` in the root folder of the angular application: ```bash From 5a96082252878e38b1dc8412e0f1fd2a26e76dcc Mon Sep 17 00:00:00 2001 From: Arman Ozak Date: Tue, 23 Feb 2021 10:25:21 +0300 Subject: [PATCH 07/21] remove dot before image paths --- docs/en/Tutorials/Part-2.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/en/Tutorials/Part-2.md b/docs/en/Tutorials/Part-2.md index 5ec23ba43a..1987ca7e7a 100644 --- a/docs/en/Tutorials/Part-2.md +++ b/docs/en/Tutorials/Part-2.md @@ -103,7 +103,7 @@ Before starting to the UI development, we first want to prepare the localization Localization texts are located under the `Localization/BookStore` folder of the `Acme.BookStore.Domain.Shared` project: -![bookstore-localization-files](./images/bookstore-localization-files-v2.png) +![bookstore-localization-files](images/bookstore-localization-files-v2.png) Open the `en.json` (*the English translations*) file and change the content as below: @@ -157,7 +157,7 @@ It's time to create something visible and usable! Instead of classic MVC, we wil Create `Books` folder under the `Pages` folder of the `Acme.BookStore.Web` project. Add a new Razor Page by right clicking the Books folder then selecting **Add > Razor Page** menu item. Name it as `Index`: -![bookstore-add-index-page](./images/bookstore-add-index-page-v2.png) +![bookstore-add-index-page](images/bookstore-add-index-page-v2.png) Open the `Index.cshtml` and change the whole content as shown below: @@ -208,7 +208,7 @@ context.Menu.AddItem( Run the project, login to the application with the username `admin` and the password `1q2w3E*` and see the new menu item has been added to the main menu: -![bookstore-menu-items](./images/bookstore-new-menu-item.png) +![bookstore-menu-items](images/bookstore-new-menu-item.png) When you click to the Books menu item under the Book Store parent, you are being redirected to the new empty Books Page. @@ -250,7 +250,7 @@ Change the `Pages/Books/Index.cshtml` as following: Create an `Index.js` file under the `Pages/Books` folder: -![bookstore-index-js-file](./images/bookstore-index-js-file-v3.png) +![bookstore-index-js-file](images/bookstore-index-js-file-v3.png) The content of the file is shown below: @@ -455,7 +455,7 @@ abp generate-proxy This command will create the following files under the `/src/app/proxy/books` folder: -![Generated files](./images/generated-proxies-3.png) +![Generated files](images/generated-proxies-3.png) ### BookComponent @@ -529,7 +529,7 @@ Open the `/src/app/book/book.component.html` and replace the content as below: Now you can see the final result on your browser: -![Book list final result](./images/bookstore-book-list.png) +![Book list final result](images/bookstore-book-list.png) {{else if UI == "Blazor"}} From 7fda88a486fd8583e13ad6c79d4380eb3d994a72 Mon Sep 17 00:00:00 2001 From: Arman Ozak Date: Tue, 23 Feb 2021 10:29:56 +0300 Subject: [PATCH 08/21] make list service link in tutorial relative --- docs/en/Tutorials/Part-2.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/Tutorials/Part-2.md b/docs/en/Tutorials/Part-2.md index 1987ca7e7a..627b55a476 100644 --- a/docs/en/Tutorials/Part-2.md +++ b/docs/en/Tutorials/Part-2.md @@ -488,7 +488,7 @@ export class BookComponent implements OnInit { ``` * We imported and injected the generated `BookService`. -* We are using the [ListService](https://docs.abp.io/en/abp/latest/UI/Angular/List-Service), a utility service of the ABP Framework which provides easy pagination, sorting and searching. +* We are using the [ListService](../UI/Angular/List-Service.md), a utility service of the ABP Framework which provides easy pagination, sorting and searching. Open the `/src/app/book/book.component.html` and replace the content as below: From 3e9e90e3d0da714faa616ffcc31dc0c9bb30bb4f Mon Sep 17 00:00:00 2001 From: Arman Ozak Date: Tue, 23 Feb 2021 11:21:35 +0300 Subject: [PATCH 09/21] remove dot before image paths --- docs/en/Tutorials/Part-3.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/docs/en/Tutorials/Part-3.md b/docs/en/Tutorials/Part-3.md index e58857ec89..1190c31b0f 100644 --- a/docs/en/Tutorials/Part-3.md +++ b/docs/en/Tutorials/Part-3.md @@ -48,13 +48,13 @@ This part is also recorded as a video tutorial and ** Date: Tue, 23 Feb 2021 11:22:08 +0300 Subject: [PATCH 10/21] avoid confusion about bookTypeOptions import comment --- docs/en/Tutorials/Part-3.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/docs/en/Tutorials/Part-3.md b/docs/en/Tutorials/Part-3.md index 1190c31b0f..ec326ddb65 100644 --- a/docs/en/Tutorials/Part-3.md +++ b/docs/en/Tutorials/Part-3.md @@ -732,8 +732,7 @@ Open `/src/app/book/book.component.ts` and replace the content as below: ```js import { ListService, PagedResultDto } from '@abp/ng.core'; import { Component, OnInit } from '@angular/core'; -// import bookTypeOptions from @proxy/books -import { BookService, BookDto, bookTypeOptions } from '@proxy/books'; +import { BookService, BookDto, bookTypeOptions } from '@proxy/books'; // add bookTypeOptions import { FormGroup, FormBuilder, Validators } from '@angular/forms'; // add this @Component({ From 7539e9b3aaad1577252610ceb9175df96698295e Mon Sep 17 00:00:00 2001 From: Arman Ozak Date: Tue, 23 Feb 2021 12:37:00 +0300 Subject: [PATCH 11/21] fix note about localization key names --- docs/en/Tutorials/Part-5.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/Tutorials/Part-5.md b/docs/en/Tutorials/Part-5.md index 29374419cb..213dd8821b 100644 --- a/docs/en/Tutorials/Part-5.md +++ b/docs/en/Tutorials/Part-5.md @@ -117,7 +117,7 @@ Finally, edit the localization file (`en.json` under the `Localization/BookStore "Permission:Books.Delete": "Deleting the books" ```` -> Localization key names are arbitrary and no forcing rule. But we prefer the convention used above. +> Localization key names are arbitrary and there is no forcing rule. But we prefer the convention used above. ### Permission Management UI From 5212e4409f3ce0468af6e1ff354d42ac07348dd0 Mon Sep 17 00:00:00 2001 From: Ahmet Date: Tue, 23 Feb 2021 12:39:18 +0300 Subject: [PATCH 12/21] Checkin repliedComment on comment creating --- .../Volo/CmsKit/Public/Comments/CommentPublicAppService.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Comments/CommentPublicAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Comments/CommentPublicAppService.cs index a4ce4a2b46..f283473f95 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Comments/CommentPublicAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Comments/CommentPublicAppService.cs @@ -52,6 +52,11 @@ namespace Volo.CmsKit.Public.Comments { var user = await CmsUserLookupService.GetByIdAsync(CurrentUser.GetId()); + if(input.RepliedCommentId.HasValue) + { + await CommentRepository.GetAsync(input.RepliedCommentId.Value); + } + var comment = await CommentRepository.InsertAsync( new Comment( GuidGenerator.Create(), From 9d65eb81ddfba35749d69e2308451669af5bf44f Mon Sep 17 00:00:00 2001 From: Arman Ozak Date: Tue, 23 Feb 2021 12:45:04 +0300 Subject: [PATCH 13/21] fix spelling and grammar --- docs/en/Tutorials/Part-6.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/en/Tutorials/Part-6.md b/docs/en/Tutorials/Part-6.md index 69c6574520..d5df8133b7 100644 --- a/docs/en/Tutorials/Part-6.md +++ b/docs/en/Tutorials/Part-6.md @@ -124,7 +124,7 @@ Created this class inside the `Acme.BookStore.Domain.Shared` project since we wi ## AuthorManager: The Domain Service -`Author` constructor and `ChangeName` method is `internal`, so they can be usable only in the domain layer. Create an `AuthorManager` class in the `Authors` folder (namespace) of the `Acme.BookStore.Domain` project: +`Author` constructor and `ChangeName` methods are `internal`, so they can be used only in the domain layer. Create an `AuthorManager` class in the `Authors` folder (namespace) of the `Acme.BookStore.Domain` project: ````csharp using System; @@ -186,7 +186,7 @@ namespace Acme.BookStore.Authors * `AuthorManager` forces to create an author and change name of an author in a controlled way. The application layer (will be introduced later) will use these methods. -> **DDD tip**: Do not introduce domain service methods unless they are really needed and perform some core business rules. For this case, we needed to this service to be able to force the unique name constraint. +> **DDD tip**: Do not introduce domain service methods unless they are really needed and perform some core business rules. For this case, we needed this service to be able to force the unique name constraint. Both methods checks if there is already an author with the given name and throws a special business exception, `AuthorAlreadyExistsException`, defined in the `Acme.BookStore.Domain` project (in the `Authors` folder) as shown below: @@ -226,7 +226,7 @@ This is a unique string represents the error code thrown by your application and "BookStore:00001": "There is already an author with the same name: {name}" ```` -Whenever you throw an `AuthorAlreadyExistsException`, the end use will see a this message on the UI. +Whenever you throw an `AuthorAlreadyExistsException`, the end user will see a nice error message on the UI. ## IAuthorRepository From 74cd9da7c70a5e3b5997930a83b72f49128bd334 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Tue, 23 Feb 2021 13:03:42 +0300 Subject: [PATCH 14/21] add a document titled How Replaceable Components Work with Extensions --- ...aceable-Components-Work-with-Extensions.md | 288 ++++++++++++++++++ .../my-roles-component-form-extensions.jpg | Bin 0 -> 57069 bytes .../my-roles-component-with-extensions.jpg | Bin 0 -> 60822 bytes 3 files changed, 288 insertions(+) create mode 100644 docs/en/UI/Angular/How-Replaceable-Components-Work-with-Extensions.md create mode 100644 docs/en/UI/Angular/images/my-roles-component-form-extensions.jpg create mode 100644 docs/en/UI/Angular/images/my-roles-component-with-extensions.jpg diff --git a/docs/en/UI/Angular/How-Replaceable-Components-Work-with-Extensions.md b/docs/en/UI/Angular/How-Replaceable-Components-Work-with-Extensions.md new file mode 100644 index 0000000000..84425667c7 --- /dev/null +++ b/docs/en/UI/Angular/How-Replaceable-Components-Work-with-Extensions.md @@ -0,0 +1,288 @@ +# How Replaceable Components Work with Extensions + +Additional UI extensibility points ([Entity action extensions](https://docs.abp.io/en/abp/latest/UI/Angular/Entity-Action-Extensions), [data table column extensions](https://docs.abp.io/en/abp/latest/UI/Angular/Data-Table-Column-Extensions), [page toolbar extensions](https://docs.abp.io/en/abp/latest/UI/Angular/Page-Toolbar-Extensions) and others) are used in ABP pages to allow to control entity actions, table columns and page toolbar of a page. If you replace a page, you need to apply some configurations to be able to work extension components in your component. Let's see how to do this by replacing the roles page. + +Create a new module called `MyRolesModule`: + +```bash +yarn ng generate module my-roles --module app +``` + +Create a new component called `MyRolesComponent`: + +```bash +yarn ng generate component my-roles/my-roles --flat --export +``` + +Open the generated `src/app/my-roles/my-roles.component.ts` file and replace its content with the following: + +```js +import { ListService, PagedAndSortedResultRequestDto } from '@abp/ng.core'; +import { + CreateRole, + DeleteRole, + eIdentityComponents, + GetRoleById, + GetRoles, + IdentityRoleDto, + IdentityState, + RolesComponent, + UpdateRole, +} from '@abp/ng.identity'; +import { ePermissionManagementComponents } from '@abp/ng.permission-management'; +import { Confirmation, ConfirmationService } from '@abp/ng.theme.shared'; +import { + EXTENSIONS_IDENTIFIER, + FormPropData, + generateFormFromProps, +} from '@abp/ng.theme.shared/extensions'; +import { Component, Injector, OnInit } from '@angular/core'; +import { FormGroup } from '@angular/forms'; +import { Select, Store } from '@ngxs/store'; +import { Observable } from 'rxjs'; +import { finalize, pluck } from 'rxjs/operators'; + +@Component({ + selector: 'app-my-roles', + templateUrl: './my-roles.component.html', + providers: [ + ListService, + { + provide: EXTENSIONS_IDENTIFIER, + useValue: eIdentityComponents.Roles, + }, + { provide: RolesComponent, useExisting: MyRolesComponent }, + ], +}) +export class MyRolesComponent implements OnInit { + @Select(IdentityState.getRoles) + data$: Observable; + + @Select(IdentityState.getRolesTotalCount) + totalCount$: Observable; + + form: FormGroup; + + selected: IdentityRoleDto; + + isModalVisible: boolean; + + visiblePermissions = false; + + providerKey: string; + + modalBusy = false; + + permissionManagementKey = ePermissionManagementComponents.PermissionManagement; + + onVisiblePermissionChange = event => { + this.visiblePermissions = event; + }; + + constructor( + public readonly list: ListService, + protected confirmationService: ConfirmationService, + protected store: Store, + protected injector: Injector + ) {} + + ngOnInit() { + this.hookToQuery(); + } + + buildForm() { + const data = new FormPropData(this.injector, this.selected); + this.form = generateFormFromProps(data); + } + + openModal() { + this.buildForm(); + this.isModalVisible = true; + } + + add() { + this.selected = {} as IdentityRoleDto; + this.openModal(); + } + + edit(id: string) { + this.store + .dispatch(new GetRoleById(id)) + .pipe(pluck('IdentityState', 'selectedRole')) + .subscribe(selectedRole => { + this.selected = selectedRole; + this.openModal(); + }); + } + + save() { + if (!this.form.valid) return; + this.modalBusy = true; + + this.store + .dispatch( + this.selected.id + ? new UpdateRole({ ...this.selected, ...this.form.value, id: this.selected.id }) + : new CreateRole(this.form.value) + ) + .pipe(finalize(() => (this.modalBusy = false))) + .subscribe(() => { + this.isModalVisible = false; + this.list.get(); + }); + } + + delete(id: string, name: string) { + this.confirmationService + .warn('AbpIdentity::RoleDeletionConfirmationMessage', 'AbpIdentity::AreYouSure', { + messageLocalizationParams: [name], + }) + .subscribe((status: Confirmation.Status) => { + if (status === Confirmation.Status.confirm) { + this.store.dispatch(new DeleteRole(id)).subscribe(() => this.list.get()); + } + }); + } + + private hookToQuery() { + this.list.hookToQuery(query => this.store.dispatch(new GetRoles(query))).subscribe(); + } + + openPermissionsModal(providerKey: string) { + this.providerKey = providerKey; + setTimeout(() => { + this.visiblePermissions = true; + }, 0); + } + + sort(data) { + const { prop, dir } = data.sorts[0]; + this.list.sortKey = prop; + this.list.sortOrder = dir; + } +} +``` + +```js + { + provide: EXTENSIONS_IDENTIFIER, + useValue: eIdentityComponents.Roles, + }, + { + provide: RolesComponent, + useExisting: MyRolesComponent + } +``` + +The two providers we have defined in `MyRolesComponent` are required for the extension components to work correctly. + +* With the first provider, we defined the extension identifier for using `RolesComponent`'s extension actions in the `MyRolesComponent`. +* With the second provider, we have replaced the `RolesComponent` injection with the `MyRolesComponent`. Default extension actions of the `RolesComponent` try to get `RolesComponent` instance. However, the actions can get the `MyRolesComponent` instance after defining the second provider. + +Open the generated `src/app/my-role/my-role.component.html` file and replace its content with the following: + +```html +
+
+
+
+
My Roles
+
+
+ +
+
+
+ +
+ +
+
+ + + +

{%{{{ (selected?.id ? 'AbpIdentity::Edit' : 'AbpIdentity::NewRole') | abpLocalization }}}%}

+
+ + +
+ +
+
+ + + + {%{{{ + 'AbpIdentity::Save' | abpLocalization + }}}%} + +
+ + + +``` + +We have added the `abp-page-toolbar`, `abp-extensible-table`, and `abp-extensible-form` extension components to template of the `MyRolesComponent`. + +You should import the required modules for the `MyRolesComponent` to `MyRolesModule`. Open the `src/my-roles/my-roles.module.ts` file and replace the content with the following: + +```ts +import { UiExtensionsModule } from '@abp/ng.theme.shared/extensions'; +import { NgModule } from '@angular/core'; +import { SharedModule } from '../shared/shared.module'; +import { MyRolesComponent } from './my-roles.component'; +import { PermissionManagementModule } from '@abp/ng.permission-management'; + +@NgModule({ + declarations: [MyRolesComponent], + imports: [SharedModule, UiExtensionsModule, PermissionManagementModule], + exports: [MyRolesComponent], +}) +export class MyRolesModule {} +``` + +- `UiExtensionsModule` imported to be able to use the extension components in your component. +- `PermissionManagementModule` imported to be able to use the `abp-permission-*management` in your component. + +As the last step, it is needs to be replaced the `RolesComponent` with the `MyRolesComponent`. Open the `app.component.ts` and modify its content as shown below: + +```js +import { ReplaceableComponentsService } from '@abp/ng.core'; +import { eIdentityComponents } from '@abp/ng.identity'; +import { MyRolesComponent } from './my-roles/my-roles.component'; + +@Component(/* component metadata */) +export class AppComponent { + constructor(private replaceableComponents: ReplaceableComponentsService) { + this.replaceableComponents.add({ component: MyRolesComponent, key: eIdentityComponents.Roles }); + } +} +``` + +After the steps above, the `RolesComponent` has been successfully replaced with the `MyRolesComponent`. When you navigate to the `/identity/roles` URL, you will see the `MyRolesComponent`'s template and see the extension components working correctly. + +![my-roles-component-with-extensions](./images/my-roles-component-with-extensions.jpg) + +![my-roles-component-form-extensions](./images/my-roles-component-form-extensions.jpg) \ No newline at end of file diff --git a/docs/en/UI/Angular/images/my-roles-component-form-extensions.jpg b/docs/en/UI/Angular/images/my-roles-component-form-extensions.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a686d26edc665ca29e92ae3329d5503bed2fda1f GIT binary patch literal 57069 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 literal 0 HcmV?d00001 diff --git a/docs/en/UI/Angular/images/my-roles-component-with-extensions.jpg b/docs/en/UI/Angular/images/my-roles-component-with-extensions.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1ac82c40b72967365d6d80e71855c7d8a5f4d314 GIT binary patch literal 60822 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 Q>>{v>!2cTr_J0%p8#Eedm;e9( literal 0 HcmV?d00001 From da9427d98df80d4712108a3960a8cedc6ea5037d Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Tue, 23 Feb 2021 13:05:03 +0300 Subject: [PATCH 15/21] add a document link to the see also section of component replacement --- docs/en/UI/Angular/Component-Replacement.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/UI/Angular/Component-Replacement.md b/docs/en/UI/Angular/Component-Replacement.md index 54a1869c0e..0010a30a2f 100644 --- a/docs/en/UI/Angular/Component-Replacement.md +++ b/docs/en/UI/Angular/Component-Replacement.md @@ -546,4 +546,5 @@ The final UI looks like below: ## See Also +- [How Replaceable Components Work with Extensions](./How-Replaceable-Components-Work-with-Extensions.md) - [How to Replace PermissionManagementComponent](./Permission-Management-Component-Replacement.md) From d8334b87acc8f216b1b5a896fa194373b370d0e9 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Tue, 23 Feb 2021 13:06:07 +0300 Subject: [PATCH 16/21] add extensions menu element --- docs/en/docs-nav.json | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/docs/en/docs-nav.json b/docs/en/docs-nav.json index c0a4d4d2bc..369d14371c 100644 --- a/docs/en/docs-nav.json +++ b/docs/en/docs-nav.json @@ -847,6 +847,27 @@ { "text": "Custom Setting Page", "path": "UI/Angular/Custom-Setting-Page.md" + }, + { + "text": "Extensions", + "items": [ + { + "text": "Entity Action Extensions", + "path": "UI/Angular/Entity-Action-Extensions.md" + }, + { + "text": "Data Table Column Extensions", + "path": "UI/Angular/Data-Table-Column-Extensions.md" + }, + { + "text": "Page Toolbar Extensions", + "path": "UI/Angular/Page-Toolbar-Extensions.md" + }, + { + "text": "Dynamic Form Extensions", + "path": "UI/Angular/Dynamic-Form-Extensions.md" + } + ] } ] } From fcd634caf9eeac605bcacbac1dd3351fa711d073 Mon Sep 17 00:00:00 2001 From: Yunus Emre Kalkan Date: Tue, 23 Feb 2021 14:30:13 +0300 Subject: [PATCH 17/21] CLI: Create a command to list open-source modules resolves https://github.com/abpframework/abp/issues/3161 --- docs/en/CLI.md | 21 +++++ .../Volo/Abp/Cli/AbpCliCoreModule.cs | 1 + .../Abp/Cli/Commands/ListModulesCommand.cs | 83 +++++++++++++++++++ 3 files changed, 105 insertions(+) create mode 100644 framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/ListModulesCommand.cs diff --git a/docs/en/CLI.md b/docs/en/CLI.md index fc76aa997b..d4a33a2a12 100644 --- a/docs/en/CLI.md +++ b/docs/en/CLI.md @@ -31,6 +31,7 @@ Here, the list of all available commands before explaining their details: * **`update`**: Automatically updates all ABP related NuGet and NPM packages in a solution. * **`add-package`**: Adds an ABP package to a project. * **`add-module`**: Adds a [multi-package application module](https://docs.abp.io/en/abp/latest/Modules/Index) to a solution. +* **`list-modules`**: Lists names of open-source application modules. * **`get-source`**: Downloads the source code of a module. * **`generate-proxy`**: Generates client side proxies to use HTTP API endpoints. * **`remove-proxy`**: Removes previously generated client side proxies. @@ -202,6 +203,26 @@ abp add-module ProductManagement --new --add-to-solution-file * `--with-source-code`: Downloads the source code of the module to your solution folder and uses local project references instead of NuGet/NPM packages. This options is always `True` if `--new` is used. * `--add-to-solution-file`: Adds the downloaded/created module to your solution file, so you will also see the projects of the module when you open the solution on a IDE. (only available when `--with-source-code` is `True`.) +### list-modules + +Lists names of open-source application modules. + +Usage + +````bash +abp list-modules [options] +```` + +Example: + +```bash +abp list-modules +``` + +#### Options + +* `--include-pro-modules`: Includes commercial (pro) modules in the output. + ### get-source Downloads the source code of a module to your computer. diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/AbpCliCoreModule.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/AbpCliCoreModule.cs index 6b23857233..f6afda5809 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/AbpCliCoreModule.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/AbpCliCoreModule.cs @@ -34,6 +34,7 @@ namespace Volo.Abp.Cli options.Commands["update"] = typeof(UpdateCommand); options.Commands["add-package"] = typeof(AddPackageCommand); options.Commands["add-module"] = typeof(AddModuleCommand); + options.Commands["list-modules"] = typeof(ListModulesCommand); options.Commands["login"] = typeof(LoginCommand); options.Commands["logout"] = typeof(LogoutCommand); options.Commands[GenerateProxyCommand.Name] = typeof(GenerateProxyCommand); diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/ListModulesCommand.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/ListModulesCommand.cs new file mode 100644 index 0000000000..cb05a19031 --- /dev/null +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/ListModulesCommand.cs @@ -0,0 +1,83 @@ +using System; +using System.IO; +using System.Linq; +using System.Text; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Logging.Abstractions; +using System.Threading.Tasks; +using Volo.Abp.Cli.Args; +using Volo.Abp.Cli.ProjectBuilding; +using Volo.Abp.Cli.ProjectBuilding.Templates.MvcModule; +using Volo.Abp.Cli.ProjectModification; +using Volo.Abp.Cli.Utils; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.Cli.Commands +{ + public class ListModulesCommand : IConsoleCommand, ITransientDependency + { + public ModuleInfoProvider ModuleInfoProvider { get; } + public ILogger Logger { get; set; } + + + public ListModulesCommand(ModuleInfoProvider moduleInfoProvider) + { + ModuleInfoProvider = moduleInfoProvider; + Logger = NullLogger.Instance; + } + + public async Task ExecuteAsync(CommandLineArgs commandLineArgs) + { + var modules = await ModuleInfoProvider.GetModuleListAsync(); + var freeModules = modules.Where(m => !m.IsPro).ToList(); + var proModules = modules.Where(m => m.IsPro).ToList(); + + var output = new StringBuilder(Environment.NewLine); + output.AppendLine("Open Source Application Modules"); + output.AppendLine(); + + foreach (var module in freeModules) + { + output.AppendLine($"> {module.DisplayName.PadRight(50)} ({module.Name})"); + } + + if (commandLineArgs.Options.ContainsKey("include-pro-modules")) + { + output.AppendLine(); + output.AppendLine("Commercial (Pro) Application Modules"); + output.AppendLine(); + foreach (var module in proModules) + { + output.AppendLine($"> {module.DisplayName.PadRight(50)} ({module.Name})"); + } + } + + Logger.LogInformation(output.ToString()); + } + + public string GetUsageInfo() + { + var sb = new StringBuilder(); + + sb.AppendLine(""); + sb.AppendLine("'list-modules' command is used for listing open source application modules."); + sb.AppendLine(""); + sb.AppendLine("Usage:"); + sb.AppendLine(" abp list-modules"); + sb.AppendLine(" abp list-modules --include-pro-modules"); + sb.AppendLine(""); + sb.AppendLine("Options:"); + sb.AppendLine(" --include-pro-modules Includes commercial (pro) modules in the output."); + sb.AppendLine(""); + sb.AppendLine("See the documentation for more info: https://docs.abp.io/en/abp/latest/CLI"); + + return sb.ToString(); + } + + public string GetShortDescription() + { + return "List open source application modules"; + } + + } +} From 50319ad7d3274849dfd5debed93f8666bcfa28b0 Mon Sep 17 00:00:00 2001 From: Yunus Emre Kalkan Date: Tue, 23 Feb 2021 14:32:50 +0300 Subject: [PATCH 18/21] Update ListModulesCommand.cs --- .../Volo/Abp/Cli/Commands/ListModulesCommand.cs | 4 ---- 1 file changed, 4 deletions(-) diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/ListModulesCommand.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/ListModulesCommand.cs index cb05a19031..ed201d77d7 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/ListModulesCommand.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/ListModulesCommand.cs @@ -1,5 +1,4 @@ using System; -using System.IO; using System.Linq; using System.Text; using Microsoft.Extensions.Logging; @@ -7,9 +6,6 @@ using Microsoft.Extensions.Logging.Abstractions; using System.Threading.Tasks; using Volo.Abp.Cli.Args; using Volo.Abp.Cli.ProjectBuilding; -using Volo.Abp.Cli.ProjectBuilding.Templates.MvcModule; -using Volo.Abp.Cli.ProjectModification; -using Volo.Abp.Cli.Utils; using Volo.Abp.DependencyInjection; namespace Volo.Abp.Cli.Commands From 6ef507a278956996b9802f091d391a0f111a236e Mon Sep 17 00:00:00 2001 From: Mehmet Erim <34455572+mehmet-erim@users.noreply.github.com> Date: Tue, 23 Feb 2021 15:42:25 +0300 Subject: [PATCH 19/21] Update How-Replaceable-Components-Work-with-Extensions.md --- .../How-Replaceable-Components-Work-with-Extensions.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/en/UI/Angular/How-Replaceable-Components-Work-with-Extensions.md b/docs/en/UI/Angular/How-Replaceable-Components-Work-with-Extensions.md index 84425667c7..d942975646 100644 --- a/docs/en/UI/Angular/How-Replaceable-Components-Work-with-Extensions.md +++ b/docs/en/UI/Angular/How-Replaceable-Components-Work-with-Extensions.md @@ -248,7 +248,7 @@ We have added the `abp-page-toolbar`, `abp-extensible-table`, and `abp-extensibl You should import the required modules for the `MyRolesComponent` to `MyRolesModule`. Open the `src/my-roles/my-roles.module.ts` file and replace the content with the following: -```ts +```js import { UiExtensionsModule } from '@abp/ng.theme.shared/extensions'; import { NgModule } from '@angular/core'; import { SharedModule } from '../shared/shared.module'; @@ -285,4 +285,4 @@ After the steps above, the `RolesComponent` has been successfully replaced with ![my-roles-component-with-extensions](./images/my-roles-component-with-extensions.jpg) -![my-roles-component-form-extensions](./images/my-roles-component-form-extensions.jpg) \ No newline at end of file +![my-roles-component-form-extensions](./images/my-roles-component-form-extensions.jpg) From 9a4dcb149a4a82bb8903adce9b1484e158c0d2c4 Mon Sep 17 00:00:00 2001 From: Ahmet Date: Wed, 24 Feb 2021 10:36:04 +0300 Subject: [PATCH 20/21] fix namespaces --- .../src/Volo.CmsKit.Common.Web/CmsKitUiCommentOptions.cs | 2 +- .../Volo/CmsKit/PolicySpecifiedDefinition.cs | 4 +--- .../Volo/CmsKit/Tags/TagEntityTypeDefiniton.cs | 1 - .../Volo/CmsKit/Public/Contents/ContentDto.cs | 2 +- .../cms-kit/test/Volo.CmsKit.TestBase/CmsKitTestBaseModule.cs | 1 - modules/cms-kit/test/Volo.CmsKit.TestBase/FakeBlobProvider.cs | 2 +- 6 files changed, 4 insertions(+), 8 deletions(-) diff --git a/modules/cms-kit/src/Volo.CmsKit.Common.Web/CmsKitUiCommentOptions.cs b/modules/cms-kit/src/Volo.CmsKit.Common.Web/CmsKitUiCommentOptions.cs index 4d3bf670e3..b1ac26a004 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Common.Web/CmsKitUiCommentOptions.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Common.Web/CmsKitUiCommentOptions.cs @@ -1,4 +1,4 @@ -namespace Volo.CmsKit +namespace Volo.CmsKit.Web { public class CmsKitUiCommentOptions { diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/PolicySpecifiedDefinition.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/PolicySpecifiedDefinition.cs index 6105beab97..54527621ec 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/PolicySpecifiedDefinition.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/PolicySpecifiedDefinition.cs @@ -1,8 +1,6 @@ using JetBrains.Annotations; -using Volo.Abp; -using Volo.Abp.Localization; -namespace Volo.CmsKit.Domain.Volo.CmsKit +namespace Volo.CmsKit { public abstract class PolicySpecifiedDefinition { diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Tags/TagEntityTypeDefiniton.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Tags/TagEntityTypeDefiniton.cs index 4be00e4ac9..e714d91c0b 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Tags/TagEntityTypeDefiniton.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Tags/TagEntityTypeDefiniton.cs @@ -2,7 +2,6 @@ using System; using Volo.Abp; using Volo.Abp.Localization; -using Volo.CmsKit.Domain.Volo.CmsKit; namespace Volo.CmsKit.Tags { diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Contents/ContentDto.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Contents/ContentDto.cs index 100626fb6d..b2cea836b9 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Contents/ContentDto.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Contents/ContentDto.cs @@ -1,7 +1,7 @@ using System; using Volo.Abp.Application.Dtos; -namespace Volo.CmsKit.Contents +namespace Volo.CmsKit.Public.Contents { public class ContentDto : EntityDto { diff --git a/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitTestBaseModule.cs b/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitTestBaseModule.cs index a0330dadbc..e29a1cc841 100644 --- a/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitTestBaseModule.cs +++ b/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitTestBaseModule.cs @@ -8,7 +8,6 @@ using Volo.Abp.Data; using Volo.Abp.GlobalFeatures; using Volo.Abp.Modularity; using Volo.Abp.Threading; -using Volo.FileManagement; namespace Volo.CmsKit { diff --git a/modules/cms-kit/test/Volo.CmsKit.TestBase/FakeBlobProvider.cs b/modules/cms-kit/test/Volo.CmsKit.TestBase/FakeBlobProvider.cs index 1f3db06e6e..4d7ed4f127 100644 --- a/modules/cms-kit/test/Volo.CmsKit.TestBase/FakeBlobProvider.cs +++ b/modules/cms-kit/test/Volo.CmsKit.TestBase/FakeBlobProvider.cs @@ -2,7 +2,7 @@ using System.Threading.Tasks; using Volo.Abp.BlobStoring; -namespace Volo.FileManagement +namespace Volo.CmsKit { public class FakeBlobProvider : IBlobProvider { From 7e3c0e54bd16908dafb9959cfcbdaaf1ebf0f3c5 Mon Sep 17 00:00:00 2001 From: Ahmet Date: Wed, 24 Feb 2021 10:46:17 +0300 Subject: [PATCH 21/21] Added Serializable attribute to all cmskit dtos --- .../Volo/CmsKit/Admin/Blogs/BlogDto.cs | 1 + .../Volo/CmsKit/Admin/Blogs/BlogFeatureInputDto.cs | 5 ++++- .../Volo/CmsKit/Admin/Blogs/BlogGetListInput.cs | 4 +++- .../Volo/CmsKit/Admin/Blogs/BlogPostDto.cs | 1 + .../Volo/CmsKit/Admin/Blogs/CreateBlogPostDto.cs | 6 ++---- .../Volo/CmsKit/Admin/Blogs/UpdateBlogPostDto.cs | 9 ++++----- .../Volo/CmsKit/Admin/Comments/CmsUserDto.cs | 1 + .../Volo/CmsKit/Admin/Comments/CommentDto.cs | 1 + .../CmsKit/Admin/Comments/CommentGetListInput.cs | 1 + .../CmsKit/Admin/Comments/CommentWithAuthorDto.cs | 1 + .../Volo/CmsKit/Admin/Contents/ContentCreateDto.cs | 4 +++- .../Volo/CmsKit/Admin/Contents/ContentDto.cs | 1 + .../CmsKit/Admin/Contents/ContentGetListDto.cs | 1 + .../CmsKit/Admin/Contents/ContentGetListInput.cs | 4 +++- .../Volo/CmsKit/Admin/Contents/ContentUpdateDto.cs | 4 +++- ...eMediaInputDto.cs => CreateMediaInputStream.cs} | 0 .../Admin/MediaDescriptors/MediaDescriptorDto.cs | 1 + .../Volo/CmsKit/Admin/Pages/CreatePageInputDto.cs | 4 +++- .../Volo/CmsKit/Admin/Pages/GetPagesInputDto.cs | 4 +++- .../Volo/CmsKit/Admin/Pages/PageDto.cs | 1 + .../Volo/CmsKit/Admin/Pages/UpdatePageInputDto.cs | 4 +++- .../Volo/CmsKit/Admin/Tags/EntityTagCreateDto.cs | 4 +++- .../Volo/CmsKit/Admin/Tags/EntityTagRemoveDto.cs | 1 + .../Volo/CmsKit/Admin/Tags/EntityTagSetDto.cs | 1 + .../Volo/CmsKit/Admin/Tags/TagCreateDto.cs | 4 +++- .../Volo/CmsKit/Admin/Tags/TagDefinitionDto.cs | 14 ++++---------- .../Volo/CmsKit/Admin/Tags/TagGetListInput.cs | 4 +++- .../Volo/CmsKit/Admin/Tags/TagUpdateDto.cs | 4 +++- .../Volo/CmsKit/Admin/Tags/TagAdminAppService.cs | 8 +++++--- .../Volo/CmsKit/Blogs/BlogFeatureDto.cs | 1 + .../Volo/CmsKit/Tags/TagDto.cs | 1 + .../Volo/CmsKit/Users/CmsUserDto.cs | 1 + .../Volo/CmsKit/Public/Blogs/BlogPostPublicDto.cs | 3 ++- .../CmsKit/Public/Blogs/GetBlogFeatureInput.cs | 4 +--- .../Volo/CmsKit/Public/Comments/CmsUserDto.cs | 1 + .../Volo/CmsKit/Public/Comments/CommentDto.cs | 1 + .../Public/Comments/CommentWithDetailsDto.cs | 1 + .../CmsKit/Public/Comments/CreateCommentInput.cs | 1 + .../CmsKit/Public/Comments/UpdateCommentInput.cs | 4 +++- .../Volo/CmsKit/Public/Contents/ContentDto.cs | 1 + .../Volo/CmsKit/Public/Contents/GetContentInput.cs | 6 +++++- .../Volo/CmsKit/Public/Pages/PageDto.cs | 1 + .../Public/Ratings/CreateUpdateRatingInput.cs | 4 +++- .../Volo/CmsKit/Public/Ratings/RatingDto.cs | 1 + .../Public/Ratings/RatingWithStarCountDto.cs | 5 ++++- .../Volo/CmsKit/Public/Reactions/ReactionDto.cs | 4 +++- 46 files changed, 95 insertions(+), 43 deletions(-) rename modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/MediaDescriptors/{CreateMediaInputDto.cs => CreateMediaInputStream.cs} (100%) diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/BlogDto.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/BlogDto.cs index 6bf7adcfaa..2e43db655c 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/BlogDto.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/BlogDto.cs @@ -6,6 +6,7 @@ using Volo.CmsKit.Blogs; namespace Volo.CmsKit.Admin.Blogs { + [Serializable] public class BlogDto : EntityDto { [Required] diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/BlogFeatureInputDto.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/BlogFeatureInputDto.cs index aebbc58e26..91437d5532 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/BlogFeatureInputDto.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/BlogFeatureInputDto.cs @@ -1,11 +1,14 @@ -using System.ComponentModel.DataAnnotations; +using System; +using System.ComponentModel.DataAnnotations; namespace Volo.CmsKit.Admin.Blogs { + [Serializable] public class BlogFeatureInputDto { [Required] public string FeatureName { get; set; } + public bool IsEnabled { get; set; } } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/BlogGetListInput.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/BlogGetListInput.cs index e26307c6d0..ddca65f8c0 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/BlogGetListInput.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/BlogGetListInput.cs @@ -1,7 +1,9 @@ -using Volo.Abp.Application.Dtos; +using System; +using Volo.Abp.Application.Dtos; namespace Volo.CmsKit.Admin.Blogs { + [Serializable] public class BlogGetListInput : PagedAndSortedResultRequestDto { public string Filter { get; set; } diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/BlogPostDto.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/BlogPostDto.cs index 9d1e74a578..d12a2f2982 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/BlogPostDto.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/BlogPostDto.cs @@ -3,6 +3,7 @@ using Volo.Abp.Application.Dtos; namespace Volo.CmsKit.Admin.Blogs { + [Serializable] public class BlogPostDto : EntityDto { public Guid BlogId { get; set; } diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/CreateBlogPostDto.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/CreateBlogPostDto.cs index a8423a7300..7780a21669 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/CreateBlogPostDto.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/CreateBlogPostDto.cs @@ -5,6 +5,7 @@ using Volo.CmsKit.Blogs; namespace Volo.CmsKit.Admin.Blogs { + [Serializable] public class CreateBlogPostDto { [Required] @@ -15,10 +16,7 @@ namespace Volo.CmsKit.Admin.Blogs public string Title { get; set; } [Required] - [DynamicStringLength( - typeof(BlogPostConsts), - nameof(BlogPostConsts.MaxSlugLength), - nameof(BlogPostConsts.MinSlugLength))] + [DynamicStringLength(typeof(BlogPostConsts), nameof(BlogPostConsts.MaxSlugLength), nameof(BlogPostConsts.MinSlugLength))] public string Slug { get; set; } [DynamicMaxLength(typeof(BlogPostConsts), nameof(BlogPostConsts.MaxShortDescriptionLength))] diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/UpdateBlogPostDto.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/UpdateBlogPostDto.cs index 909d8e2e9e..eeb4548c8e 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/UpdateBlogPostDto.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/UpdateBlogPostDto.cs @@ -1,9 +1,11 @@ -using System.ComponentModel.DataAnnotations; +using System; +using System.ComponentModel.DataAnnotations; using Volo.Abp.Validation; using Volo.CmsKit.Blogs; namespace Volo.CmsKit.Admin.Blogs { + [Serializable] public class UpdateBlogPostDto { [Required] @@ -11,10 +13,7 @@ namespace Volo.CmsKit.Admin.Blogs public string Title { get; set; } [Required] - [DynamicStringLength( - typeof(BlogPostConsts), - nameof(BlogPostConsts.MaxSlugLength), - nameof(BlogPostConsts.MinSlugLength))] + [DynamicStringLength(typeof(BlogPostConsts), nameof(BlogPostConsts.MaxSlugLength), nameof(BlogPostConsts.MinSlugLength))] public string Slug { get; set; } [DynamicMaxLength(typeof(BlogPostConsts), nameof(BlogPostConsts.MaxShortDescriptionLength))] diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Comments/CmsUserDto.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Comments/CmsUserDto.cs index 90eb3d7fb2..2fc4109047 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Comments/CmsUserDto.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Comments/CmsUserDto.cs @@ -2,6 +2,7 @@ namespace Volo.CmsKit.Admin.Comments { + [Serializable] public class CmsUserDto { public Guid Id { get; set; } diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Comments/CommentDto.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Comments/CommentDto.cs index bf43a1e50a..da09d88b8b 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Comments/CommentDto.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Comments/CommentDto.cs @@ -2,6 +2,7 @@ namespace Volo.CmsKit.Admin.Comments { + [Serializable] public class CommentDto { public Guid Id { get; set; } diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Comments/CommentGetListInput.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Comments/CommentGetListInput.cs index f2d14c8153..cc79741213 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Comments/CommentGetListInput.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Comments/CommentGetListInput.cs @@ -3,6 +3,7 @@ using Volo.Abp.Application.Dtos; namespace Volo.CmsKit.Admin.Comments { + [Serializable] public class CommentGetListInput : PagedAndSortedResultRequestDto { public string EntityType { get; set; } diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Comments/CommentWithAuthorDto.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Comments/CommentWithAuthorDto.cs index 833a52180b..d60b836d89 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Comments/CommentWithAuthorDto.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Comments/CommentWithAuthorDto.cs @@ -4,6 +4,7 @@ using Volo.CmsKit.Users; namespace Volo.CmsKit.Admin.Comments { + [Serializable] public class CommentWithAuthorDto { public Guid Id { get; set; } diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Contents/ContentCreateDto.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Contents/ContentCreateDto.cs index 6729203c8e..6832d26bd3 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Contents/ContentCreateDto.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Contents/ContentCreateDto.cs @@ -1,9 +1,11 @@ -using System.ComponentModel.DataAnnotations; +using System; +using System.ComponentModel.DataAnnotations; using Volo.Abp.Validation; using Volo.CmsKit.Contents; namespace Volo.CmsKit.Admin.Contents { + [Serializable] public class ContentCreateDto { [Required] diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Contents/ContentDto.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Contents/ContentDto.cs index 69ece26ca4..8cfb2e2e7c 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Contents/ContentDto.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Contents/ContentDto.cs @@ -3,6 +3,7 @@ using Volo.Abp.Application.Dtos; namespace Volo.CmsKit.Admin.Contents { + [Serializable] public class ContentDto : EntityDto { public string EntityType { get; set; } diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Contents/ContentGetListDto.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Contents/ContentGetListDto.cs index ce1ca1e86c..ba44253ae9 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Contents/ContentGetListDto.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Contents/ContentGetListDto.cs @@ -3,6 +3,7 @@ using Volo.Abp.Application.Dtos; namespace Volo.CmsKit.Admin.Contents { + [Serializable] public class ContentGetListDto : EntityDto { public string EntityType { get; set; } diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Contents/ContentGetListInput.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Contents/ContentGetListInput.cs index 73df63558b..fbca53a7b9 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Contents/ContentGetListInput.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Contents/ContentGetListInput.cs @@ -1,7 +1,9 @@ -using Volo.Abp.Application.Dtos; +using System; +using Volo.Abp.Application.Dtos; namespace Volo.CmsKit.Admin.Contents { + [Serializable] public class ContentGetListInput : PagedAndSortedResultRequestDto { } diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Contents/ContentUpdateDto.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Contents/ContentUpdateDto.cs index 1164b4eecc..c59075cc8d 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Contents/ContentUpdateDto.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Contents/ContentUpdateDto.cs @@ -1,9 +1,11 @@ -using System.ComponentModel.DataAnnotations; +using System; +using System.ComponentModel.DataAnnotations; using Volo.Abp.Validation; using Volo.CmsKit.Contents; namespace Volo.CmsKit.Admin.Contents { + [Serializable] public class ContentUpdateDto { [Required] diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/MediaDescriptors/CreateMediaInputDto.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/MediaDescriptors/CreateMediaInputStream.cs similarity index 100% rename from modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/MediaDescriptors/CreateMediaInputDto.cs rename to modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/MediaDescriptors/CreateMediaInputStream.cs diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/MediaDescriptors/MediaDescriptorDto.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/MediaDescriptors/MediaDescriptorDto.cs index d82eb63992..d6ee63c523 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/MediaDescriptors/MediaDescriptorDto.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/MediaDescriptors/MediaDescriptorDto.cs @@ -3,6 +3,7 @@ using Volo.Abp.Application.Dtos; namespace Volo.CmsKit.Admin.MediaDescriptors { + [Serializable] public class MediaDescriptorDto : EntityDto { public string Name { get; set; } diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Pages/CreatePageInputDto.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Pages/CreatePageInputDto.cs index c7398945dc..394d965a98 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Pages/CreatePageInputDto.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Pages/CreatePageInputDto.cs @@ -1,10 +1,12 @@ -using System.ComponentModel.DataAnnotations; +using System; +using System.ComponentModel.DataAnnotations; using Volo.Abp.Validation; using Volo.CmsKit.Contents; using Volo.CmsKit.Pages; namespace Volo.CmsKit.Admin.Pages { + [Serializable] public class CreatePageInputDto { [Required] diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Pages/GetPagesInputDto.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Pages/GetPagesInputDto.cs index 8523eeeffa..132921ac0c 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Pages/GetPagesInputDto.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Pages/GetPagesInputDto.cs @@ -1,7 +1,9 @@ -using Volo.Abp.Application.Dtos; +using System; +using Volo.Abp.Application.Dtos; namespace Volo.CmsKit.Admin.Pages { + [Serializable] public class GetPagesInputDto : PagedAndSortedResultRequestDto { public string Filter { get; set; } diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Pages/PageDto.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Pages/PageDto.cs index 23b42a48dc..d314c386c9 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Pages/PageDto.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Pages/PageDto.cs @@ -3,6 +3,7 @@ using Volo.Abp.Application.Dtos; namespace Volo.CmsKit.Admin.Pages { + [Serializable] public class PageDto : AuditedEntityDto { public string Title { get; set; } diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Pages/UpdatePageInputDto.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Pages/UpdatePageInputDto.cs index 4dba6faac0..af9c4e3334 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Pages/UpdatePageInputDto.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Pages/UpdatePageInputDto.cs @@ -1,10 +1,12 @@ -using System.ComponentModel.DataAnnotations; +using System; +using System.ComponentModel.DataAnnotations; using Volo.Abp.Validation; using Volo.CmsKit.Contents; using Volo.CmsKit.Pages; namespace Volo.CmsKit.Admin.Pages { + [Serializable] public class UpdatePageInputDto { [Required] diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Tags/EntityTagCreateDto.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Tags/EntityTagCreateDto.cs index 92e83fecf4..da4b52fe49 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Tags/EntityTagCreateDto.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Tags/EntityTagCreateDto.cs @@ -1,7 +1,9 @@ -using System.ComponentModel.DataAnnotations; +using System; +using System.ComponentModel.DataAnnotations; namespace Volo.CmsKit.Admin.Tags { + [Serializable] public class EntityTagCreateDto { [Required] diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Tags/EntityTagRemoveDto.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Tags/EntityTagRemoveDto.cs index 411d4c7157..67e54be54d 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Tags/EntityTagRemoveDto.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Tags/EntityTagRemoveDto.cs @@ -3,6 +3,7 @@ using System.ComponentModel.DataAnnotations; namespace Volo.CmsKit.Admin.Tags { + [Serializable] public class EntityTagRemoveDto { [Required] diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Tags/EntityTagSetDto.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Tags/EntityTagSetDto.cs index d80c1aa62a..052b63a596 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Tags/EntityTagSetDto.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Tags/EntityTagSetDto.cs @@ -6,6 +6,7 @@ using System.Threading.Tasks; namespace Volo.CmsKit.Admin.Tags { + [Serializable] public class EntityTagSetDto { public string EntityId { get; set; } diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Tags/TagCreateDto.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Tags/TagCreateDto.cs index 6dd90d1362..bb831918c5 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Tags/TagCreateDto.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Tags/TagCreateDto.cs @@ -1,9 +1,11 @@ -using System.ComponentModel.DataAnnotations; +using System; +using System.ComponentModel.DataAnnotations; using Volo.Abp.Validation; using Volo.CmsKit.Tags; namespace Volo.CmsKit.Admin.Tags { + [Serializable] public class TagCreateDto { [Required] diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Tags/TagDefinitionDto.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Tags/TagDefinitionDto.cs index 0fdfe04b00..c44180c02b 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Tags/TagDefinitionDto.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Tags/TagDefinitionDto.cs @@ -1,16 +1,10 @@ -namespace Volo.CmsKit.Admin.Tags +using System; + +namespace Volo.CmsKit.Admin.Tags { + [Serializable] public class TagDefinitionDto { - public TagDefinitionDto() - { - } - public TagDefinitionDto(string entityType, string displayName) - { - EntityType = entityType; - DisplayName = displayName; - } - public string EntityType { get; set; } public string DisplayName { get; set; } diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Tags/TagGetListInput.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Tags/TagGetListInput.cs index 23e7041134..71a5b692bf 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Tags/TagGetListInput.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Tags/TagGetListInput.cs @@ -1,7 +1,9 @@ -using Volo.Abp.Application.Dtos; +using System; +using Volo.Abp.Application.Dtos; namespace Volo.CmsKit.Admin.Tags { + [Serializable] public class TagGetListInput : PagedAndSortedResultRequestDto { public string Filter { get; set; } diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Tags/TagUpdateDto.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Tags/TagUpdateDto.cs index c4298b7730..b28df94b8a 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Tags/TagUpdateDto.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Tags/TagUpdateDto.cs @@ -1,9 +1,11 @@ -using System.ComponentModel.DataAnnotations; +using System; +using System.ComponentModel.DataAnnotations; using Volo.Abp.Validation; using Volo.CmsKit.Tags; namespace Volo.CmsKit.Admin.Tags { + [Serializable] public class TagUpdateDto { [Required] diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Tags/TagAdminAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Tags/TagAdminAppService.cs index 15dde35076..1120312466 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Tags/TagAdminAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Tags/TagAdminAppService.cs @@ -78,9 +78,11 @@ namespace Volo.CmsKit.Admin.Tags return definitions .Select(s => - new TagDefinitionDto( - s.EntityType, - s.DisplayName?.Localize(StringLocalizerFactory) ?? s.EntityType)) + new TagDefinitionDto + { + EntityType = s.EntityType, + DisplayName = s.DisplayName?.Localize(StringLocalizerFactory) ?? s.EntityType + }) .ToList(); } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Common.Application.Contracts/Volo/CmsKit/Blogs/BlogFeatureDto.cs b/modules/cms-kit/src/Volo.CmsKit.Common.Application.Contracts/Volo/CmsKit/Blogs/BlogFeatureDto.cs index aed9d4ddcb..6d6188c985 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Common.Application.Contracts/Volo/CmsKit/Blogs/BlogFeatureDto.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Common.Application.Contracts/Volo/CmsKit/Blogs/BlogFeatureDto.cs @@ -3,6 +3,7 @@ using Volo.Abp.Application.Dtos; namespace Volo.CmsKit.Blogs { + [Serializable] public class BlogFeatureDto : EntityDto { public string FeatureName { get; set; } diff --git a/modules/cms-kit/src/Volo.CmsKit.Common.Application.Contracts/Volo/CmsKit/Tags/TagDto.cs b/modules/cms-kit/src/Volo.CmsKit.Common.Application.Contracts/Volo/CmsKit/Tags/TagDto.cs index e7d41e6657..ab9114919c 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Common.Application.Contracts/Volo/CmsKit/Tags/TagDto.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Common.Application.Contracts/Volo/CmsKit/Tags/TagDto.cs @@ -3,6 +3,7 @@ using Volo.Abp.Application.Dtos; namespace Volo.CmsKit.Tags { + [Serializable] public class TagDto : EntityDto { public string EntityType { get; set; } diff --git a/modules/cms-kit/src/Volo.CmsKit.Common.Application.Contracts/Volo/CmsKit/Users/CmsUserDto.cs b/modules/cms-kit/src/Volo.CmsKit.Common.Application.Contracts/Volo/CmsKit/Users/CmsUserDto.cs index 3600688f4b..3bd54fec03 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Common.Application.Contracts/Volo/CmsKit/Users/CmsUserDto.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Common.Application.Contracts/Volo/CmsKit/Users/CmsUserDto.cs @@ -7,6 +7,7 @@ using Volo.Abp.Application.Dtos; namespace Volo.CmsKit.Users { + [Serializable] public class CmsUserDto : EntityDto { public virtual Guid? TenantId { get; protected set; } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/BlogPostPublicDto.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/BlogPostPublicDto.cs index 5cbbda938e..5876028712 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/BlogPostPublicDto.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/BlogPostPublicDto.cs @@ -3,7 +3,8 @@ using Volo.Abp.Application.Dtos; using Volo.CmsKit.Users; namespace Volo.CmsKit.Public.Blogs -{ +{ + [Serializable] public class BlogPostPublicDto : AuditedEntityWithUserDto { public Guid BlogId { get; set; } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/GetBlogFeatureInput.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/GetBlogFeatureInput.cs index 8be4ebaa07..5a95402564 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/GetBlogFeatureInput.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/GetBlogFeatureInput.cs @@ -1,11 +1,9 @@ using System; using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Volo.CmsKit.Public.Blogs { + [Serializable] public class GetBlogFeatureInput { public List FeatureNames { get; set; } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Comments/CmsUserDto.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Comments/CmsUserDto.cs index 060117c201..4b79bb7e5e 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Comments/CmsUserDto.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Comments/CmsUserDto.cs @@ -2,6 +2,7 @@ namespace Volo.CmsKit.Public.Comments { + [Serializable] public class CmsUserDto { public Guid Id { get; set; } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Comments/CommentDto.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Comments/CommentDto.cs index 106ca46802..0c6e2a21bf 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Comments/CommentDto.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Comments/CommentDto.cs @@ -2,6 +2,7 @@ namespace Volo.CmsKit.Public.Comments { + [Serializable] public class CommentDto { public Guid Id { get; set; } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Comments/CommentWithDetailsDto.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Comments/CommentWithDetailsDto.cs index 5c0c3454d9..3c5b074a86 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Comments/CommentWithDetailsDto.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Comments/CommentWithDetailsDto.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; namespace Volo.CmsKit.Public.Comments { + [Serializable] public class CommentWithDetailsDto { public Guid Id { get; set; } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Comments/CreateCommentInput.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Comments/CreateCommentInput.cs index c489721466..7f63896652 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Comments/CreateCommentInput.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Comments/CreateCommentInput.cs @@ -5,6 +5,7 @@ using Volo.CmsKit.Comments; namespace Volo.CmsKit.Public.Comments { + [Serializable] public class CreateCommentInput { [Required] diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Comments/UpdateCommentInput.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Comments/UpdateCommentInput.cs index af8cb1bfef..13b7b9804a 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Comments/UpdateCommentInput.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Comments/UpdateCommentInput.cs @@ -1,9 +1,11 @@ -using System.ComponentModel.DataAnnotations; +using System; +using System.ComponentModel.DataAnnotations; using Volo.Abp.Validation; using Volo.CmsKit.Comments; namespace Volo.CmsKit.Public.Comments { + [Serializable] public class UpdateCommentInput { [Required] diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Contents/ContentDto.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Contents/ContentDto.cs index b2cea836b9..f11b4c8681 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Contents/ContentDto.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Contents/ContentDto.cs @@ -3,6 +3,7 @@ using Volo.Abp.Application.Dtos; namespace Volo.CmsKit.Public.Contents { + [Serializable] public class ContentDto : EntityDto { public string Value { get; set; } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Contents/GetContentInput.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Contents/GetContentInput.cs index 0dfd9a1636..26a127e105 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Contents/GetContentInput.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Contents/GetContentInput.cs @@ -1,8 +1,12 @@ -namespace Volo.CmsKit.Public.Contents +using System; + +namespace Volo.CmsKit.Public.Contents { + [Serializable] public class GetContentInput { public string EntityType { get; set; } + public string EntityId { get; set; } } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Pages/PageDto.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Pages/PageDto.cs index 19a3664578..2add3c9d38 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Pages/PageDto.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Pages/PageDto.cs @@ -3,6 +3,7 @@ using Volo.Abp.Application.Dtos; namespace Volo.CmsKit.Public.Pages { + [Serializable] public class PageDto : EntityDto { public string Title { get; set; } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Ratings/CreateUpdateRatingInput.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Ratings/CreateUpdateRatingInput.cs index 0577a97a68..c3a7fab1f9 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Ratings/CreateUpdateRatingInput.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Ratings/CreateUpdateRatingInput.cs @@ -1,9 +1,11 @@ -using System.ComponentModel.DataAnnotations; +using System; +using System.ComponentModel.DataAnnotations; using Volo.Abp.Validation; using Volo.CmsKit.Ratings; namespace Volo.CmsKit.Public.Ratings { + [Serializable] public class CreateUpdateRatingInput { [Required] diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Ratings/RatingDto.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Ratings/RatingDto.cs index bf050465c9..b7ed97c315 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Ratings/RatingDto.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Ratings/RatingDto.cs @@ -2,6 +2,7 @@ namespace Volo.CmsKit.Public.Ratings { + [Serializable] public class RatingDto { public Guid Id { get; set; } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Ratings/RatingWithStarCountDto.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Ratings/RatingWithStarCountDto.cs index 981ef2bd6e..66fa0d1738 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Ratings/RatingWithStarCountDto.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Ratings/RatingWithStarCountDto.cs @@ -1,5 +1,8 @@ -namespace Volo.CmsKit.Public.Ratings +using System; + +namespace Volo.CmsKit.Public.Ratings { + [Serializable] public class RatingWithStarCountDto { public short StarCount { get; set; } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Reactions/ReactionDto.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Reactions/ReactionDto.cs index e770bb4017..23908fa4f6 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Reactions/ReactionDto.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Reactions/ReactionDto.cs @@ -1,7 +1,9 @@ -using JetBrains.Annotations; +using System; +using JetBrains.Annotations; namespace Volo.CmsKit.Public.Reactions { + [Serializable] public class ReactionDto { [NotNull]