From 545bda17d697c6a50c53dc0fdc89cb7c07320c40 Mon Sep 17 00:00:00 2001 From: Richard Calvo Date: Fri, 6 May 2022 13:43:27 -0600 Subject: [PATCH 01/84] Getting-Started-AspNetCore-Application_ES --- .../Getting-Started-AspNetCore-Application.md | 140 ++++++++++++++++++ .../images/create-aspnet-core-application.png | Bin 0 -> 41674 bytes .../create-new-aspnet-core-application-v2.png | Bin 0 -> 182368 bytes .../select-empty-web-application-v2.png | Bin 0 -> 65159 bytes 4 files changed, 140 insertions(+) create mode 100644 docs/es/Getting-Started-AspNetCore-Application.md create mode 100644 docs/es/images/create-aspnet-core-application.png create mode 100644 docs/es/images/create-new-aspnet-core-application-v2.png create mode 100644 docs/es/images/select-empty-web-application-v2.png diff --git a/docs/es/Getting-Started-AspNetCore-Application.md b/docs/es/Getting-Started-AspNetCore-Application.md new file mode 100644 index 0000000000..c4d124d827 --- /dev/null +++ b/docs/es/Getting-Started-AspNetCore-Application.md @@ -0,0 +1,140 @@ +# Empezando con ABP y una Aplicacion AspNet Core MVC Web + +Este tutorial explica como empezar una aplicacion ABP desde cero usando las dependencias minimas. Uno generalmente desea +empezar con la **[plantilla de inicio](Getting-Started-AspNetCore-MVC-Template.md)**. + +## Crea un Proyecto Nuevo + +1. Crea una Aplicacion Web AspNet Core nueva usando Visual Studio 2022 (17.0.0+): + +![](images/create-new-aspnet-core-application-v2.png) + +2. Configura el nuevo proyecto: + +![](images/select-empty-web-application-v2.png) + +3. Presione el boton Create: + +![create-aspnet-core-application](images/create-aspnet-core-application.png) + +## Instale el paquete Volo.Abp.AspNetCore.Mvc + +Volo.Abp.AspNetCore.Mvc es el paquete de integracion con AspNet Core MVC para ABP. Siendo asi, instalalo en su proyecto: + +```` +Install-Package Volo.Abp.AspNetCore.Mvc +```` + +## Crea el primer modulo ABP + +ABP es un marco de referencia modular y require una clase de **inicio (raíz) tipo modulo** derivada de ``AbpModule``: + +````C# +using Microsoft.AspNetCore.Builder; +using Microsoft.Extensions.Hosting; +using Volo.Abp; +using Volo.Abp.AspNetCore.Mvc; +using Volo.Abp.Modularity; + +namespace BasicAspNetCoreApplication +{ + [DependsOn(typeof(AbpAspNetCoreMvcModule))] + public class AppModule : AbpModule + { + public override void OnApplicationInitialization(ApplicationInitializationContext context) + { + var app = context.GetApplicationBuilder(); + var env = context.GetEnvironment(); + + // Configura la canalización de peticiones HTTP. + if (env.IsDevelopment()) + { + app.UseExceptionHandler("/Error"); + // El valor por defecto de HSTS es 30 dias. Debes cambiar esto en ambientes productivos. Referencia https://aka.ms/aspnetcore-hsts. + app.UseHsts(); + } + + app.UseHttpsRedirection(); + app.UseStaticFiles(); + app.UseRouting(); + app.UseConfiguredEndpoints(); + } + } +} +```` + +``AppModule`` es un buen nombre para el modulo de inicio de una aplicacion. + +Los paquetes de ABP definen clases de tipo modulo y cada modulo puede depender de otro. +En el codigo anterior, el ``AppModule`` depende de el modulo ``AbpAspNetCoreMvcModule`` (definido por el paquete [Volo.Abp.AspNetCore.Mvc](https://www.nuget.org/packages/Volo.Abp.AspNetCore.Mvc)). Es comun agregar el atributo ``DependsOn`` despues de instalar un paquete ABP nuevo. + +En vez de la clase de inicion Startup, estamos configurando una canalizacion de ASP.NET Core en este modulo. + +## La clase Program + +El proximo paso es modificar la clase Program para integrate el sistema de modulos ABP: + +````C# +using BasicAspNetCoreApplication; + +var builder = WebApplication.CreateBuilder(args); + +await builder.Services.AddApplicationAsync(); + +var app = builder.Build(); + +await app.InitializeApplicationAsync(); +await app.RunAsync(); +```` + +``builder.Services.AddApplicationAsync();`` Agrega todos los servicios definidos en todos los modulos empezando desde ``AppModule``. + +``app.InitializeApplicationAsync()`` inicializa y empieza la aplicacion. + +## Ejecutar la Aplicación + +Es todo! Ejecuta la aplicación, debe funcionar como esperado. + +## Uso de Autofac como Marco de Inyección de Dependencia + +Mientras el sistema de Inyección de Dependencia de ASP.NET Core es suficiente para requerimientos basico, [Autofac](https://autofac.org/) proporciona características avanzadas como Inyección de Propiedades e Intercepcion de Metodos, los cuales son necesarios para que ABP pueda llevar a cabo funciones avanzadas. + +El acto de remplazar el sistema DI de ASP.NET Core por Autofac e integrarlo con ABP es facil. + +1. Instala el paquete [Volo.Abp.Autofac](https://www.nuget.org/packages/Volo.Abp.Autofac) + +```` +Install-Package Volo.Abp.Autofac +```` + +2. Agrega la dependencia sobre el modulo ``AbpAutofacModule`` + +````C# +[DependsOn(typeof(AbpAspNetCoreMvcModule))] +[DependsOn(typeof(AbpAutofacModule))] //Agrega la dependencia sobre el modulo ABP Autofac +public class AppModule : AbpModule +{ + ... +} +```` + +3. Actualiza `Program.cs` para que use Autofac: + +````C# +using BasicAspNetCoreApplication; + +var builder = WebApplication.CreateBuilder(args); + +builder.Host.UseAutofac(); //Agrega esta linea + +await builder.Services.AddApplicationAsync(); + +var app = builder.Build(); + +await app.InitializeApplicationAsync(); +await app.RunAsync(); +```` + +## Codigo fuente + + Obten el codigo fuente del ejemplo creado en este tutorial de [aqui](https://github.com/abpframework/abp-samples/tree/master/BasicAspNetCoreApplication). diff --git a/docs/es/images/create-aspnet-core-application.png b/docs/es/images/create-aspnet-core-application.png new file mode 100644 index 0000000000000000000000000000000000000000..b8b98f5c32617368964520014be24185edcdd4f3 GIT binary patch literal 41674 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∓6 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

-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

s)Dg{Q#>93D&(_R9rb46-p<) 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

i9KLoecehuP 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 RAoOULYz# literal 0 HcmV?d00001 diff --git a/docs/es/images/select-empty-web-application-v2.png b/docs/es/images/select-empty-web-application-v2.png new file mode 100644 index 0000000000000000000000000000000000000000..da32f71857caa06376da5fa5083f6f47d06e0987 GIT binary patch literal 65159 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 Q+IvlJSp1GMeDK$Q08#fmBLDyZ literal 0 HcmV?d00001 From af6b013395a7185c12dcac41b70ecc970e424567 Mon Sep 17 00:00:00 2001 From: Salih Date: Thu, 14 Jul 2022 10:52:13 +0300 Subject: [PATCH 02/84] Update en.json Add localizations for Microservice E-Book --- .../Www/Localization/Resources/en.json | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json index 41eda60de6..d1d4636eab 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json @@ -372,6 +372,19 @@ "MasteringAbpFramework_Book_What_You_Will_Learn_8": "Write unit, integration, and UI tests using ABP Framework.", "MasteringAbpFramework_Book_WhoIsThisBookFor": "Who's this book for", "MasteringAbpFramework_Book_WhoIsThisBookFor_Description": "This book is for web developers who want to learn software architectures and best practices for building\n maintainable web-based solutions using Microsoft technologies and ABP Framework. Basic knowledge of C#\n and ASP.NET Core is necessary to get started with this book.", - "ComputersAndTechnology": "Computers & Technology" + "ComputersAndTechnology": "Computers & Technology", + "BuildingMicroserviceSolutions":"Building Microservice Solutions", + "MicroserviceBookPracticalGuide":"This book is a reference guide for developing and managing microservice-based applications using the ABP Framework. It references the .*NET Microservice Sample Rerefence Application*: eShopOnContainers and discusses the architectural design and implementation approaches using the ABP Framework. Moreover, you will learn the working implementation of an e-shop process like adding products, completing the purchase using PayPal, updating the basket cart item in real-time, shipping a purchased product, and more. Written by the main contributors of the ABP Framework, this book will help you understand how the ABP modularity is used like lego pieces to become a running distributed system. It will discuss the decisions to create a microservice environment and how to develop an application rapidly.By the end of this book, you'll learn how ABP approaches the common microservice complexities such as authorization, distributed transactions, inter-microservice communications, deployment, etc. ", + "IntroducingMicroservice":"Introducing Microservice", + "RunningTheSolution":"Running the Solution", + "UnderstandingTheAuthenticationSystem":"Understanding the Authentication System", + "ExploringTheApplications":"Exploring the Applications", + "UnderstandingTheAPIGateways":"Understanding the API Gateways", + "DevelopingTheMicroservices":"Developing the Microservices", + "UnderstandingTheInfrastructure":"Understanding the Infrastructure", + "DiggingInTheUseCases":"Digging in the Use Cases", + "DeployingTheSolution":"Deploying the Solution", + "Authors":"Authors", + "MicroserviceEBook":"Microservice E-Book" } } From 0e85c5849ae2b6e1ee69f428dd214d7835052de5 Mon Sep 17 00:00:00 2001 From: malik masis Date: Tue, 19 Jul 2022 23:40:04 +0300 Subject: [PATCH 03/84] catched preview event --- .../Pages/CmsKit/Pages/create.js | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/create.js b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/create.js index 49a482bf33..46c5fa9e77 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/create.js +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/create.js @@ -90,7 +90,7 @@ $(function () { var fileUriPrefix = "/api/cms-kit/media/"; initEditor(); - + var editor; function initEditor() { var $editorContainer = $("#ContentEditor"); @@ -133,7 +133,7 @@ $(function () { } }); } - + function uploadFile(blob, callback, source) { var UPPY_OPTIONS = { endpoint: fileUploadUri, @@ -166,11 +166,17 @@ $(function () { }); } - $('#GeneratedWidgetText').on('change',function () { + $('#GeneratedWidgetText').on('change', function () { var txt = $('#GeneratedWidgetText').val(); editor.insertText(txt); }); - + + $('.tab-item').on('click', function () { + if ($(this).attr("aria-label") == 'Preview' && editor.isMarkdownMode()) { + editor.setMarkdown(editor.getMarkdown(), true); + } + }); + function createAddWidgetButton() { const button = document.createElement('button'); From f02ad494a996eb3c4d282260d2cefe429412e199 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Jul 2022 08:56:29 +0000 Subject: [PATCH 04/84] Bump lodash from 4.17.20 to 4.17.21 in /npm/scripts Bumps [lodash](https://github.com/lodash/lodash) from 4.17.20 to 4.17.21. - [Release notes](https://github.com/lodash/lodash/releases) - [Commits](https://github.com/lodash/lodash/compare/4.17.20...4.17.21) --- updated-dependencies: - dependency-name: lodash dependency-type: indirect ... Signed-off-by: dependabot[bot] --- npm/scripts/yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/npm/scripts/yarn.lock b/npm/scripts/yarn.lock index bae2201646..2feefc9b8a 100644 --- a/npm/scripts/yarn.lock +++ b/npm/scripts/yarn.lock @@ -1144,9 +1144,9 @@ locate-path@^6.0.0: p-locate "^5.0.0" lodash@^4.17.20: - version "4.17.20" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" - integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: version "1.0.1" From f87002eee12b580c6671c8f40f4c8d16423f0842 Mon Sep 17 00:00:00 2001 From: maliming Date: Thu, 21 Jul 2022 12:14:05 +0800 Subject: [PATCH 05/84] Remove `IHybridServiceScopeFactory`. Resolve #12246 --- .../PageToolbars/PageToolbarManager.cs | 5 +- .../PageToolbars/PageToolbarManager.cs | 5 +- .../HttpContextServiceScopeFactory.cs | 52 -------------- .../Abp/Cli/Commands/GenerateProxyCommand.cs | 3 +- .../Volo/Abp/Cli/Commands/ProxyCommandBase.cs | 5 +- .../Abp/Cli/Commands/RemoveProxyCommand.cs | 3 +- .../DefaultServiceScopeFactory.cs | 22 ------ .../IHybridServiceScopeFactory.cs | 8 --- .../Volo/Abp/Ui/Navigation/MenuManager.cs | 5 +- .../HybridServiceScopeFactory_Tests.cs | 71 ------------------- .../Abp/FeatureManagement/FeatureManager.cs | 2 +- .../IdentityServer/AbpCorsPolicyService.cs | 4 +- .../AbpWildcardSubdomainCorsPolicyService.cs | 3 +- .../AbpResourceOwnerPasswordValidator.cs | 4 +- .../Controllers/TokenController.Password.cs | 2 +- .../Abp/SettingManagement/SettingManager.cs | 2 +- 16 files changed, 25 insertions(+), 171 deletions(-) delete mode 100644 framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/DependencyInjection/HttpContextServiceScopeFactory.cs delete mode 100644 framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/DefaultServiceScopeFactory.cs delete mode 100644 framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/IHybridServiceScopeFactory.cs delete mode 100644 framework/test/Volo.Abp.Core.Tests/Volo/Abp/DependencyInjection/HybridServiceScopeFactory_Tests.cs diff --git a/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/PageToolbars/PageToolbarManager.cs b/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/PageToolbars/PageToolbarManager.cs index 05531096d4..00f7f5da23 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/PageToolbars/PageToolbarManager.cs +++ b/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/PageToolbars/PageToolbarManager.cs @@ -3,16 +3,17 @@ using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; using Volo.Abp.DependencyInjection; namespace Volo.Abp.AspNetCore.Components.Web.Theming.PageToolbars; public class PageToolbarManager : IPageToolbarManager, ITransientDependency { - protected IHybridServiceScopeFactory ServiceScopeFactory { get; } + protected IServiceScopeFactory ServiceScopeFactory { get; } public PageToolbarManager( - IHybridServiceScopeFactory serviceScopeFactory) + IServiceScopeFactory serviceScopeFactory) { ServiceScopeFactory = serviceScopeFactory; } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/PageToolbars/PageToolbarManager.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/PageToolbars/PageToolbarManager.cs index b795c62c39..ec27b8087c 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/PageToolbars/PageToolbarManager.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/PageToolbars/PageToolbarManager.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using Volo.Abp.DependencyInjection; @@ -10,11 +11,11 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.PageToolbars; public class PageToolbarManager : IPageToolbarManager, ITransientDependency { protected AbpPageToolbarOptions Options { get; } - protected IHybridServiceScopeFactory ServiceScopeFactory { get; } + protected IServiceScopeFactory ServiceScopeFactory { get; } public PageToolbarManager( IOptions options, - IHybridServiceScopeFactory serviceScopeFactory) + IServiceScopeFactory serviceScopeFactory) { Options = options.Value; ServiceScopeFactory = serviceScopeFactory; diff --git a/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/DependencyInjection/HttpContextServiceScopeFactory.cs b/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/DependencyInjection/HttpContextServiceScopeFactory.cs deleted file mode 100644 index a7f00f7451..0000000000 --- a/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/DependencyInjection/HttpContextServiceScopeFactory.cs +++ /dev/null @@ -1,52 +0,0 @@ -using System; -using Microsoft.AspNetCore.Http; -using Microsoft.Extensions.DependencyInjection; -using Volo.Abp.DependencyInjection; - -namespace Volo.Abp.AspNetCore.DependencyInjection; - -[ExposeServices( - typeof(IHybridServiceScopeFactory), - typeof(HttpContextServiceScopeFactory) - )] -[Dependency(ReplaceServices = true)] -public class HttpContextServiceScopeFactory : IHybridServiceScopeFactory, ITransientDependency -{ - protected IHttpContextAccessor HttpContextAccessor { get; } - - protected IServiceScopeFactory ServiceScopeFactory { get; } - - public HttpContextServiceScopeFactory( - IHttpContextAccessor httpContextAccessor, - IServiceScopeFactory serviceScopeFactory) - { - HttpContextAccessor = httpContextAccessor; - ServiceScopeFactory = serviceScopeFactory; - } - - public virtual IServiceScope CreateScope() - { - var httpContext = HttpContextAccessor.HttpContext; - if (httpContext == null) - { - return ServiceScopeFactory.CreateScope(); - } - - return new NonDisposedHttpContextServiceScope(httpContext.RequestServices); - } - - protected class NonDisposedHttpContextServiceScope : IServiceScope - { - public IServiceProvider ServiceProvider { get; } - - public NonDisposedHttpContextServiceScope(IServiceProvider serviceProvider) - { - ServiceProvider = serviceProvider; - } - - public void Dispose() - { - - } - } -} diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/GenerateProxyCommand.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/GenerateProxyCommand.cs index bf8e2e3028..7874fddb86 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/GenerateProxyCommand.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/GenerateProxyCommand.cs @@ -1,4 +1,5 @@ using System.Text; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using Volo.Abp.Cli.ServiceProxying; using Volo.Abp.DependencyInjection; @@ -13,7 +14,7 @@ public class GenerateProxyCommand : ProxyCommandBase public GenerateProxyCommand( IOptions serviceProxyOptions, - IHybridServiceScopeFactory serviceScopeFactory) + IServiceScopeFactory serviceScopeFactory) : base(serviceProxyOptions, serviceScopeFactory) { } diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/ProxyCommandBase.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/ProxyCommandBase.cs index 22311bb986..67c61b2a28 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/ProxyCommandBase.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/ProxyCommandBase.cs @@ -2,6 +2,7 @@ using System.IO; using System.Text; using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Options; @@ -19,11 +20,11 @@ public abstract class ProxyCommandBase : IConsoleCommand, ITransientDependenc protected AbpCliServiceProxyOptions ServiceProxyOptions { get; } - protected IHybridServiceScopeFactory ServiceScopeFactory { get; } + protected IServiceScopeFactory ServiceScopeFactory { get; } public ProxyCommandBase( IOptions serviceProxyOptions, - IHybridServiceScopeFactory serviceScopeFactory) + IServiceScopeFactory serviceScopeFactory) { ServiceScopeFactory = serviceScopeFactory; ServiceProxyOptions = serviceProxyOptions.Value; diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/RemoveProxyCommand.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/RemoveProxyCommand.cs index d89c19c892..3372584f1a 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/RemoveProxyCommand.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/RemoveProxyCommand.cs @@ -1,4 +1,5 @@ using System.Text; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using Volo.Abp.Cli.ServiceProxying; using Volo.Abp.DependencyInjection; @@ -13,7 +14,7 @@ public class RemoveProxyCommand : ProxyCommandBase public RemoveProxyCommand( IOptions serviceProxyOptions, - IHybridServiceScopeFactory serviceScopeFactory) + IServiceScopeFactory serviceScopeFactory) : base(serviceProxyOptions, serviceScopeFactory) { } diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/DefaultServiceScopeFactory.cs b/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/DefaultServiceScopeFactory.cs deleted file mode 100644 index befcf7951e..0000000000 --- a/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/DefaultServiceScopeFactory.cs +++ /dev/null @@ -1,22 +0,0 @@ -using Microsoft.Extensions.DependencyInjection; - -namespace Volo.Abp.DependencyInjection; - -[ExposeServices( - typeof(IHybridServiceScopeFactory), - typeof(DefaultServiceScopeFactory) - )] -public class DefaultServiceScopeFactory : IHybridServiceScopeFactory, ITransientDependency -{ - protected IServiceScopeFactory Factory { get; } - - public DefaultServiceScopeFactory(IServiceScopeFactory factory) - { - Factory = factory; - } - - public IServiceScope CreateScope() - { - return Factory.CreateScope(); - } -} diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/IHybridServiceScopeFactory.cs b/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/IHybridServiceScopeFactory.cs deleted file mode 100644 index 62c3707352..0000000000 --- a/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/IHybridServiceScopeFactory.cs +++ /dev/null @@ -1,8 +0,0 @@ -using Microsoft.Extensions.DependencyInjection; - -namespace Volo.Abp.DependencyInjection; - -public interface IHybridServiceScopeFactory : IServiceScopeFactory -{ - -} diff --git a/framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/MenuManager.cs b/framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/MenuManager.cs index d325708175..aa933c6e09 100644 --- a/framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/MenuManager.cs +++ b/framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/MenuManager.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using Volo.Abp.Authorization.Permissions; using Volo.Abp.DependencyInjection; @@ -13,11 +14,11 @@ namespace Volo.Abp.UI.Navigation; public class MenuManager : IMenuManager, ITransientDependency { protected AbpNavigationOptions Options { get; } - protected IHybridServiceScopeFactory ServiceScopeFactory { get; } + protected IServiceScopeFactory ServiceScopeFactory { get; } protected ISimpleStateCheckerManager SimpleStateCheckerManager { get; } public MenuManager( IOptions options, - IHybridServiceScopeFactory serviceScopeFactory, + IServiceScopeFactory serviceScopeFactory, ISimpleStateCheckerManager simpleStateCheckerManager) { Options = options.Value; diff --git a/framework/test/Volo.Abp.Core.Tests/Volo/Abp/DependencyInjection/HybridServiceScopeFactory_Tests.cs b/framework/test/Volo.Abp.Core.Tests/Volo/Abp/DependencyInjection/HybridServiceScopeFactory_Tests.cs deleted file mode 100644 index 6a3f059ba8..0000000000 --- a/framework/test/Volo.Abp.Core.Tests/Volo/Abp/DependencyInjection/HybridServiceScopeFactory_Tests.cs +++ /dev/null @@ -1,71 +0,0 @@ -using System; -using System.Threading.Tasks; -using Microsoft.Extensions.DependencyInjection; -using Shouldly; -using Volo.Abp.Modularity; -using Xunit; - -namespace Volo.Abp.DependencyInjection; - -public class HybridServiceScopeFactory_Tests -{ - [Fact] - public async Task Should_Use_Default_ServiceScopeFactory_By_Default_Async() - { - using (var application = await AbpApplicationFactory.CreateAsync()) - { - application.Services.AddType(typeof(MyServiceAsync)); - - await application.InitializeAsync(); - - var serviceScopeFactory = application.ServiceProvider.GetRequiredService(); - - using (var scope = serviceScopeFactory.CreateScope()) - { - scope.ServiceProvider.GetRequiredService(); - } - - MyServiceAsync.DisposeCount.ShouldBe(1); - } - } - - [Fact] - public void Should_Use_Default_ServiceScopeFactory_By_Default() - { - using (var application = AbpApplicationFactory.Create()) - { - application.Services.AddType(typeof(MyService)); - - application.Initialize(); - - var serviceScopeFactory = application.ServiceProvider.GetRequiredService(); - - using (var scope = serviceScopeFactory.CreateScope()) - { - scope.ServiceProvider.GetRequiredService(); - } - - MyService.DisposeCount.ShouldBe(1); - } - } - - private class MyServiceAsync : ITransientDependency, IDisposable - { - public static int DisposeCount { get; private set; } - - public void Dispose() - { - ++DisposeCount; - } - } - - private class MyService : ITransientDependency, IDisposable - { - public static int DisposeCount { get; private set; } - - public void Dispose() - { - ++DisposeCount; - } - } -} diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/FeatureManager.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/FeatureManager.cs index 06c293219b..36800a9a33 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/FeatureManager.cs +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/FeatureManager.cs @@ -29,7 +29,7 @@ public class FeatureManager : IFeatureManager, ISingletonDependency StringLocalizerFactory = stringLocalizerFactory; Options = options.Value; - //TODO: Instead, use IHybridServiceScopeFactory and create a scope..? + //TODO: Instead, use IServiceScopeFactory and create a scope..? _lazyProviders = new Lazy>( () => Options diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AbpCorsPolicyService.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AbpCorsPolicyService.cs index ac6c9d9edf..bc711254f1 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AbpCorsPolicyService.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AbpCorsPolicyService.cs @@ -17,13 +17,13 @@ namespace Volo.Abp.IdentityServer; public class AbpCorsPolicyService : ICorsPolicyService { public ILogger Logger { get; set; } - protected IHybridServiceScopeFactory HybridServiceScopeFactory { get; } + protected IServiceScopeFactory HybridServiceScopeFactory { get; } protected IDistributedCache Cache { get; } protected IdentityServerOptions Options { get; } public AbpCorsPolicyService( IDistributedCache cache, - IHybridServiceScopeFactory hybridServiceScopeFactory, + IServiceScopeFactory hybridServiceScopeFactory, IOptions options) { Cache = cache; diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AbpWildcardSubdomainCorsPolicyService.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AbpWildcardSubdomainCorsPolicyService.cs index 82658ceccd..32d2d1eb73 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AbpWildcardSubdomainCorsPolicyService.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AbpWildcardSubdomainCorsPolicyService.cs @@ -3,6 +3,7 @@ using System.Linq; using System.Threading.Tasks; using IdentityServer4.Configuration; using Microsoft.Extensions.Options; +using Microsoft.Extensions.DependencyInjection; using Volo.Abp.Caching; using Volo.Abp.DependencyInjection; using Volo.Abp.Text.Formatting; @@ -13,7 +14,7 @@ public class AbpWildcardSubdomainCorsPolicyService : AbpCorsPolicyService { public AbpWildcardSubdomainCorsPolicyService( IDistributedCache cache, - IHybridServiceScopeFactory hybridServiceScopeFactory, + IServiceScopeFactory hybridServiceScopeFactory, IOptions options) : base(cache, hybridServiceScopeFactory, options) { diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AspNetIdentity/AbpResourceOwnerPasswordValidator.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AspNetIdentity/AbpResourceOwnerPasswordValidator.cs index 77181a8b8b..cf69fda91a 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AspNetIdentity/AbpResourceOwnerPasswordValidator.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AspNetIdentity/AbpResourceOwnerPasswordValidator.cs @@ -32,7 +32,7 @@ public class AbpResourceOwnerPasswordValidator : IResourceOwnerPasswordValidator protected IdentitySecurityLogManager IdentitySecurityLogManager { get; } protected ILogger> Logger { get; } protected IStringLocalizer Localizer { get; } - protected IHybridServiceScopeFactory ServiceScopeFactory { get; } + protected IServiceScopeFactory ServiceScopeFactory { get; } protected AbpIdentityOptions AbpIdentityOptions { get; } protected IOptions IdentityOptions { get; } @@ -43,7 +43,7 @@ public class AbpResourceOwnerPasswordValidator : IResourceOwnerPasswordValidator ILogger> logger, IStringLocalizer localizer, IOptions abpIdentityOptions, - IHybridServiceScopeFactory serviceScopeFactory, + IServiceScopeFactory serviceScopeFactory, IOptions identityOptions) { UserManager = userManager; diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/Controllers/TokenController.Password.cs b/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/Controllers/TokenController.Password.cs index 49d415c927..1484ea4b52 100644 --- a/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/Controllers/TokenController.Password.cs +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/Controllers/TokenController.Password.cs @@ -22,7 +22,7 @@ namespace Volo.Abp.OpenIddict.Controllers; public partial class TokenController { - protected IHybridServiceScopeFactory ServiceScopeFactory => LazyServiceProvider.LazyGetRequiredService(); + protected IServiceScopeFactory ServiceScopeFactory => LazyServiceProvider.LazyGetRequiredService(); protected ITenantConfigurationProvider TenantConfigurationProvider=> LazyServiceProvider.LazyGetRequiredService(); protected IOptions AbpIdentityOptions => LazyServiceProvider.LazyGetRequiredService>(); protected IOptions IdentityOptions => LazyServiceProvider.LazyGetRequiredService>(); diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/SettingManager.cs b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/SettingManager.cs index 14629b988e..570c99925b 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/SettingManager.cs +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/SettingManager.cs @@ -27,7 +27,7 @@ public class SettingManager : ISettingManager, ISingletonDependency SettingEncryptionService = settingEncryptionService; Options = options.Value; - //TODO: Instead, use IHybridServiceScopeFactory and create a scope..? + //TODO: Instead, use IServiceScopeFactory and create a scope..? _lazyProviders = new Lazy>( () => Options From 49f6cb5ccbfbf05f2ac51cec369806707ca474d7 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Thu, 21 Jul 2022 18:07:16 +0800 Subject: [PATCH 06/84] Move "host features" to the settings page --- .../Localization/Domain/ar.json | 1 + .../Localization/Domain/cs.json | 1 + .../Localization/Domain/de-DE.json | 1 + .../Localization/Domain/el.json | 1 + .../Localization/Domain/en-GB.json | 1 + .../Localization/Domain/en.json | 1 + .../Localization/Domain/es.json | 1 + .../Localization/Domain/fa.json | 1 + .../Localization/Domain/fi.json | 1 + .../Localization/Domain/fr.json | 1 + .../Localization/Domain/hi.json | 1 + .../Localization/Domain/hu.json | 1 + .../Localization/Domain/is.json | 1 + .../Localization/Domain/it.json | 1 + .../Localization/Domain/nl.json | 1 + .../Localization/Domain/pl-PL.json | 1 + .../Localization/Domain/pt-BR.json | 1 + .../Localization/Domain/ro-RO.json | 1 + .../Localization/Domain/ru.json | 1 + .../Localization/Domain/sk.json | 1 + .../Localization/Domain/sl.json | 1 + .../Localization/Domain/tr.json | 1 + .../Localization/Domain/vi.json | 1 + .../Localization/Domain/zh-Hans.json | 1 + .../Localization/Domain/zh-Hant.json | 1 + .../AbpFeatureManagementWebModule.cs | 11 ++++++- .../FeatureSettingGroup/Default.cshtml | 13 ++++++++ .../Components/FeatureSettingGroup/Default.js | 16 ++++++++++ .../FeatureSettingGroupViewComponent.cs | 31 +++++++++++++++++++ ...FeatureSettingManagementPageContributor.cs | 29 +++++++++++++++++ .../Volo.Abp.FeatureManagement.Web.csproj | 5 +++ .../Localization/Resources/ar.json | 1 - .../Localization/Resources/cs.json | 1 - .../Localization/Resources/de-DE.json | 1 - .../Localization/Resources/el.json | 1 - .../Localization/Resources/en-GB.json | 1 - .../Localization/Resources/en.json | 1 - .../Localization/Resources/es.json | 1 - .../Localization/Resources/fa.json | 1 - .../Localization/Resources/fi.json | 1 - .../Localization/Resources/fr.json | 1 - .../Localization/Resources/hi.json | 1 - .../Localization/Resources/hu.json | 1 - .../Localization/Resources/is.json | 1 - .../Localization/Resources/it.json | 1 - .../Localization/Resources/nl.json | 1 - .../Localization/Resources/pl-PL.json | 1 - .../Localization/Resources/pt-BR.json | 1 - .../Localization/Resources/ro-RO.json | 1 - .../Localization/Resources/ru.json | 1 - .../Localization/Resources/sk.json | 1 - .../Localization/Resources/sl.json | 1 - .../Localization/Resources/tr.json | 1 - .../Localization/Resources/vi.json | 1 - .../Localization/Resources/zh-Hans.json | 1 - .../Localization/Resources/zh-Hant.json | 1 - .../AbpTenantManagementWebModule.cs | 7 ----- .../Pages/TenantManagement/Tenants/Index.js | 7 ----- 58 files changed, 129 insertions(+), 40 deletions(-) create mode 100644 modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/Components/FeatureSettingGroup/Default.cshtml create mode 100644 modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/Components/FeatureSettingGroup/Default.js create mode 100644 modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/Components/FeatureSettingGroup/FeatureSettingGroupViewComponent.cs create mode 100644 modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Settings/FeatureSettingManagementPageContributor.cs diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/ar.json b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/ar.json index 5fff0f6d8a..c482493f88 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/ar.json +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/ar.json @@ -3,6 +3,7 @@ "texts": { "Features": "المميزات", "NoFeatureFoundMessage": "لا توجد أي ميزة متاحة.", + "ManageHostFeatures": "إدارة ميزات المضيف", "Permission:FeatureManagement": "إدارة الميزات", "Permission:FeatureManagement.ManageHostFeatures": "إدارة ميزات المضيف", "Volo.Abp.FeatureManagement:InvalidFeatureValue": "{0} قيمة الميزة غير صالحة!" diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/cs.json b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/cs.json index 36bc77b789..2e8b78a947 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/cs.json +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/cs.json @@ -3,6 +3,7 @@ "texts": { "Features": "Funkce", "NoFeatureFoundMessage": "Nejsou zde dostupné žádné funkce.", + "ManageHostFeatures": "Správa funkcí hostitele", "Permission:FeatureManagement": "Správa funkcí", "Permission:FeatureManagement.ManageHostFeatures": "Správa funkcí hostitele", "Volo.Abp.FeatureManagement:InvalidFeatureValue": "Hodnota funkce {0} není platná!" diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/de-DE.json b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/de-DE.json index af3a7601af..0c7d1a40eb 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/de-DE.json +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/de-DE.json @@ -3,6 +3,7 @@ "texts": { "Features": "Features", "NoFeatureFoundMessage": "Es ist kein Feature verfügbar.", + "ManageHostFeatures": "Host-Features verwalten", "Permission:FeatureManagement": "Feature-Verwaltung", "Permission:FeatureManagement.ManageHostFeatures": "Host-Features verwalten", "Volo.Abp.FeatureManagement:InvalidFeatureValue": "{0} Feature-Wert ist ungültig!" diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/el.json b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/el.json index 6e5529f2cd..744b94a2c5 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/el.json +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/el.json @@ -3,6 +3,7 @@ "texts": { "Features": "Χαρακτηριστικά", "NoFeatureFoundMessage": "Δεν διατίθεται καποιο χαρακτηριστικο.", + "ManageHostFeatures": "Διαχείριση δυνατοτήτων του Οικοδεσπότη", "Permission:FeatureManagement": "Διαχείριση χαρακτηριστικών", "Permission:FeatureManagement.ManageHostFeatures": "Διαχείριση Χαρακτηριστικών Εξυπηρετήτη", "Volo.Abp.FeatureManagement:InvalidFeatureValue" : "Η τιμή χαρακτηριστικού {0} δεν ειναι έγκυρη!" diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/en-GB.json b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/en-GB.json index 09b4b306b7..0c61bfbbb5 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/en-GB.json +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/en-GB.json @@ -3,6 +3,7 @@ "texts": { "Features": "Features", "NoFeatureFoundMessage": "There isn't any available feature.", + "ManageHostFeatures": "Manage Host features", "Permission:FeatureManagement": "Feature management", "Permission:FeatureManagement.ManageHostFeatures": "Manage Host features", "Volo.Abp.FeatureManagement:InvalidFeatureValue": "{0} feature value is not valid!" diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/en.json b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/en.json index c5194de6c7..8033d2c6a0 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/en.json +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/en.json @@ -3,6 +3,7 @@ "texts": { "Features": "Features", "NoFeatureFoundMessage": "There isn't any available feature.", + "ManageHostFeatures": "Manage Host features", "Permission:FeatureManagement": "Feature management", "Permission:FeatureManagement.ManageHostFeatures": "Manage Host features", "Volo.Abp.FeatureManagement:InvalidFeatureValue" : "{0} feature value is not valid!" diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/es.json b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/es.json index 74e51eb9d4..7f4ae2055c 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/es.json +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/es.json @@ -3,6 +3,7 @@ "texts": { "Features": "Características", "NoFeatureFoundMessage": "No hay ninguna característica disponible.", + "ManageHostFeatures": "Administrar funciones de host", "Permission:FeatureManagement": "Gestión de características", "Permission:FeatureManagement.ManageHostFeatures": "Gestionar características del Host", "Volo.Abp.FeatureManagement:InvalidFeatureValue": "{0} valor de característica no es valido!" diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/fa.json b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/fa.json index af7a5ff5a0..fd1af964fa 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/fa.json +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/fa.json @@ -3,6 +3,7 @@ "texts": { "Features": "ویژگی ها", "NoFeatureFoundMessage": "هیچ ویژگی ای در دسترس نمی باشد.", + "ManageHostFeatures": "مدیریت ویژگی های میزبان", "Permission:FeatureManagement": "مدیریت ویژگی ها", "Permission:FeatureManagement.ManageHostFeatures": "مدیریت ویژگی های میزبان", "Volo.Abp.FeatureManagement:InvalidFeatureValue": "{0} مقدار ویژگی صحیح نمی باشد!" diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/fi.json b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/fi.json index 73c352c5b2..43c3ede121 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/fi.json +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/fi.json @@ -3,6 +3,7 @@ "texts": { "Features": "ominaisuudet", "NoFeatureFoundMessage": "Ei ole mitään käytettävissä olevaa ominaisuutta.", + "ManageHostFeatures": "Hallinnoi isäntäominaisuuksia", "Permission:FeatureManagement": "Ominaisuuden hallinta", "Permission:FeatureManagement.ManageHostFeatures": "Hallinnoi isäntäominaisuuksia", "Volo.Abp.FeatureManagement:InvalidFeatureValue": "Ominaisuuden {0} arvo ei kelpaa!" diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/fr.json b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/fr.json index 5983edf8a3..44a6a59a14 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/fr.json +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/fr.json @@ -3,6 +3,7 @@ "texts": { "Features": "Fonctionnalités", "NoFeatureFoundMessage": "Il n'y a aucune fonctionnalité disponible.", + "ManageHostFeatures": "Gérer les fonctionnalités de l’hôte", "Permission:FeatureManagement": "Gestion des fonctionnalités", "Permission:FeatureManagement.ManageHostFeatures": "Gérer les fonctionnalités de l'hôte", "Volo.Abp.FeatureManagement:InvalidFeatureValue": "La valeur de la fonctionnalité {0} n'est pas valide!" diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/hi.json b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/hi.json index 51fe35a788..303b2ff84d 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/hi.json +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/hi.json @@ -3,6 +3,7 @@ "texts": { "Features": "विशेषताएं", "NoFeatureFoundMessage": "कोई भी उपलब्ध सुविधा नहीं है।", + "ManageHostFeatures": "होस्ट सुविधाएँ प्रबंधित करें", "Permission:FeatureManagement": "सुविधा प्रबंधन", "Permission:FeatureManagement.ManageHostFeatures": "होस्ट सुविधाएँ प्रबंधित करें", "Volo.Abp.FeatureManagement:InvalidFeatureValue": "{0} सुविधा मान मान्य नहीं है!" diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/hu.json b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/hu.json index a7e1b8378e..db82d25610 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/hu.json +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/hu.json @@ -3,6 +3,7 @@ "texts": { "Features": "Funkciók", "NoFeatureFoundMessage": "Nincs elérhető funkció.", + "ManageHostFeatures": "Host funkciók kezelése", "Permission:FeatureManagement": "Funkciókezelés", "Permission:FeatureManagement.ManageHostFeatures": "Host funkciók kezelése", "Volo.Abp.FeatureManagement:InvalidFeatureValue" : "A (z) {0} szolgáltatás értéke érvénytelen!" diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/is.json b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/is.json index e245bf5a54..1aac3eb952 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/is.json +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/is.json @@ -3,6 +3,7 @@ "texts": { "Features": "Eiginleikar", "NoFeatureFoundMessage": "Enginn eiginleiki í boði.", + "ManageHostFeatures": "Stjórna Gestgjafa Eiginleikum", "Permission:FeatureManagement": "Eiginleika stjórnun", "Permission:FeatureManagement.ManageHostFeatures": "Stjórna Gestgjafa Eiginleikum", "Volo.Abp.FeatureManagement:InvalidFeatureValue": "eiginleikagildið {0} er ekki gilt" diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/it.json b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/it.json index ba77671388..ee08666365 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/it.json +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/it.json @@ -3,6 +3,7 @@ "texts": { "Features": "Funzionalità", "NoFeatureFoundMessage": "Non ci sono funzioni disponibili.", + "ManageHostFeatures": "Gestisci le funzionalità dell'host", "Permission:FeatureManagement": "Gestione funzionalità", "Permission:FeatureManagement.ManageHostFeatures": "Gestisci le funzionalità dell'host", "Volo.Abp.FeatureManagement:InvalidFeatureValue": "Il valore dell'elemento {0} non è valido!" diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/nl.json b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/nl.json index c34ae5cc93..f34188e0a6 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/nl.json +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/nl.json @@ -3,6 +3,7 @@ "texts": { "Features": "Functies", "NoFeatureFoundMessage": "Er is geen functie beschikbaar.", + "ManageHostFeatures": "Beheer host functies", "Permission:FeatureManagement": "Functiebeheer", "Permission:FeatureManagement.ManageHostFeatures": "Beheer host functies", "Volo.Abp.FeatureManagement:InvalidFeatureValue": "{0} functie-waarde is niet geldig!" diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/pl-PL.json b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/pl-PL.json index 6eff64c1b0..5be57e6198 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/pl-PL.json +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/pl-PL.json @@ -3,6 +3,7 @@ "texts": { "Features": "Funkcje", "NoFeatureFoundMessage": "Brak dostępnej funkcji.", + "ManageHostFeatures": "Zarządzaj funkcjami hosta", "Permission:FeatureManagement": "Zarządzanie funkcjami", "Permission:FeatureManagement.ManageHostFeatures": "Zarządzaj funkcjami hosta", "Volo.Abp.FeatureManagement:InvalidFeatureValue": "{0} wartość funkcji jest nieprawidłowa!" diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/pt-BR.json b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/pt-BR.json index a50ec6d471..570b9a40d5 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/pt-BR.json +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/pt-BR.json @@ -3,6 +3,7 @@ "texts": { "Features": "Funcionalidades", "NoFeatureFoundMessage": "Não há nenhuma funcionalidade disponivel.", + "ManageHostFeatures": "Gerenciar recursos do Host", "Permission:FeatureManagement": "Gerenciamento de recursos", "Permission:FeatureManagement.ManageHostFeatures": "Gerenciar recursos do Host", "Volo.Abp.FeatureManagement:InvalidFeatureValue": "O valor do recurso {0} não é válido!" diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/ro-RO.json b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/ro-RO.json index 824d789291..8e42f19123 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/ro-RO.json +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/ro-RO.json @@ -3,6 +3,7 @@ "texts": { "Features": "Caracteristici", "NoFeatureFoundMessage": "Nu există nicio caracteristică disponibilă.", + "ManageHostFeatures": "Administraţi caracteristicile de host", "Permission:FeatureManagement": "Administrare caracteristici", "Permission:FeatureManagement.ManageHostFeatures": "Gestionare caracteristici gazdă", "Volo.Abp.FeatureManagement:InvalidFeatureValue" : "Valoarea {0} a caracteristicii nu este validă!" diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/ru.json b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/ru.json index bdcb53005d..e72a87388a 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/ru.json +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/ru.json @@ -3,6 +3,7 @@ "texts": { "Features": "Функциональные возможности", "NoFeatureFoundMessage": "Нет доступных функциональных возможностей.", + "ManageHostFeatures": "Управление функциями хоста", "Permission:FeatureManagement": "Управление функциями", "Permission:FeatureManagement.ManageHostFeatures": "Управление функциями хоста", "Volo.Abp.FeatureManagement:InvalidFeatureValue": "Недопустимое значение функции {0}!" diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/sk.json b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/sk.json index 817d1ba801..fe7772a5b1 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/sk.json +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/sk.json @@ -3,6 +3,7 @@ "texts": { "Features": "Funkcie", "NoFeatureFoundMessage": "Nie je k dispozícii žiadna funkcia.", + "ManageHostFeatures": "Spravovať funkcie poskytovateľa", "Permission:FeatureManagement": "Správa funkcií", "Permission:FeatureManagement.ManageHostFeatures": "Správa funkcií poskytovateľa", "Volo.Abp.FeatureManagement:InvalidFeatureValue": "Hodnota funkcie {0} nie je platná!" diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/sl.json b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/sl.json index 2cec7a09c0..29987fa094 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/sl.json +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/sl.json @@ -3,6 +3,7 @@ "texts": { "Features": "Funkcionalnosti", "NoFeatureFoundMessage": "Na voljo ni nobene funkcionalnosti.", + "ManageHostFeatures": "Upravljajte funkcije gostitelja", "Permission:FeatureManagement": "Upravljanje funkcij", "Permission:FeatureManagement.ManageHostFeatures": "Upravljajte funkcije gostitelja", "Volo.Abp.FeatureManagement:InvalidFeatureValue": "Vrednost funkcije {0} ni veljavna!" diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/tr.json b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/tr.json index 421b66824d..7f7ca999e6 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/tr.json +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/tr.json @@ -3,6 +3,7 @@ "texts": { "Features": "Özellikler", "NoFeatureFoundMessage": "Hiç özellik yok.", + "ManageHostFeatures": "Host özelliklerini yönetin", "Permission:FeatureManagement": "Özellik yönetimi", "Permission:FeatureManagement.ManageHostFeatures": "Host özelliklerini düzenle", "Volo.Abp.FeatureManagement:InvalidFeatureValue" : "{0} özellik değeri geçerli değil!" diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/vi.json b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/vi.json index a87f6f719d..36195a8ce4 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/vi.json +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/vi.json @@ -3,6 +3,7 @@ "texts": { "Features": "Tính năng", "NoFeatureFoundMessage": "Không có bất kỳ tính năng khả dụng nào.", + "ManageHostFeatures": "Quản lý các tính năng của Máy chủ lưu trữ", "Permission:FeatureManagement": "Quản lý tính năng", "Permission:FeatureManagement.ManageHostFeatures": "Quản lý các tính năng của Máy chủ lưu trữ", "Volo.Abp.FeatureManagement:InvalidFeatureValue": "Giá trị tính năng {0} không hợp lệ!" diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/zh-Hans.json b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/zh-Hans.json index 473f581b34..41ac0eb5b5 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/zh-Hans.json +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/zh-Hans.json @@ -3,6 +3,7 @@ "texts": { "Features": "功能", "NoFeatureFoundMessage": "没有可用的功能.", + "ManageHostFeatures": "管理Host特性", "Permission:FeatureManagement": "特性管理", "Permission:FeatureManagement.ManageHostFeatures": "管理Host特性", "Volo.Abp.FeatureManagement:InvalidFeatureValue" : "{0}功能的值无效!" diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/zh-Hant.json b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/zh-Hant.json index dc84e7c104..41f625352f 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/zh-Hant.json +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/zh-Hant.json @@ -3,6 +3,7 @@ "texts": { "Features": "功能", "NoFeatureFoundMessage": "沒有可用的功能.", + "ManageHostFeatures": "管理Host功能", "Permission:FeatureManagement": "功能管理", "Permission:FeatureManagement.ManageHostFeatures": "管理Host功能", "Volo.Abp.FeatureManagement:InvalidFeatureValue" : "{0}功能的值無效!" diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/AbpFeatureManagementWebModule.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/AbpFeatureManagementWebModule.cs index 752e966ef2..78959e7d22 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/AbpFeatureManagementWebModule.cs +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/AbpFeatureManagementWebModule.cs @@ -3,15 +3,19 @@ using Microsoft.Extensions.DependencyInjection; using Volo.Abp.AspNetCore.Mvc.Localization; using Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared; using Volo.Abp.FeatureManagement.Localization; +using Volo.Abp.FeatureManagement.Settings; using Volo.Abp.Http.ProxyScripting.Generators.JQuery; using Volo.Abp.Modularity; +using Volo.Abp.SettingManagement.Web; +using Volo.Abp.SettingManagement.Web.Pages.SettingManagement; using Volo.Abp.VirtualFileSystem; namespace Volo.Abp.FeatureManagement; [DependsOn( typeof(AbpFeatureManagementApplicationContractsModule), - typeof(AbpAspNetCoreMvcUiThemeSharedModule) + typeof(AbpAspNetCoreMvcUiThemeSharedModule), + typeof(AbpSettingManagementWebModule) )] public class AbpFeatureManagementWebModule : AbpModule { @@ -44,5 +48,10 @@ public class AbpFeatureManagementWebModule : AbpModule { options.DisableModule(FeatureManagementRemoteServiceConsts.ModuleName); }); + + Configure(options => + { + options.Contributors.Add(new FeatureSettingManagementPageContributor()); + }); } } diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/Components/FeatureSettingGroup/Default.cshtml b/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/Components/FeatureSettingGroup/Default.cshtml new file mode 100644 index 0000000000..9e975306a4 --- /dev/null +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/Components/FeatureSettingGroup/Default.cshtml @@ -0,0 +1,13 @@ +@inject IHtmlLocalizer L +@using Microsoft.AspNetCore.Mvc.Localization +@using Volo.Abp.FeatureManagement.Localization +@model Volo.Abp.FeatureManagement.Pages.FeatureManagement.Components.FeatureSettingGroup.FeatureSettingGroupViewComponent.FeatureSettingViewModel + + + +
+ @if (Model.HasManageHostFeaturesPermission) + { + + } + \ No newline at end of file diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/Components/FeatureSettingGroup/Default.js b/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/Components/FeatureSettingGroup/Default.js new file mode 100644 index 0000000000..3e6842928e --- /dev/null +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/Components/FeatureSettingGroup/Default.js @@ -0,0 +1,16 @@ +(function($){ + + $(function(){ + var _featuresModal = new abp.ModalManager( + abp.appPath + 'FeatureManagement/FeatureManagementModal' + ); + + $("#ManageHostFeatures").click(function (e) { + e.preventDefault(); + _featuresModal.open({ + providerName: 'T' + }); + }); + }) + +})(jQuery); \ No newline at end of file diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/Components/FeatureSettingGroup/FeatureSettingGroupViewComponent.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/Components/FeatureSettingGroup/FeatureSettingGroupViewComponent.cs new file mode 100644 index 0000000000..fc6aee9c55 --- /dev/null +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/Components/FeatureSettingGroup/FeatureSettingGroupViewComponent.cs @@ -0,0 +1,31 @@ +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc; +using Volo.Abp.AspNetCore.Mvc; +using Volo.Abp.Authorization.Permissions; +using Volo.Abp.Features; + +namespace Volo.Abp.FeatureManagement.Pages.FeatureManagement.Components.FeatureSettingGroup; + +public class FeatureSettingGroupViewComponent: AbpViewComponent +{ + protected IPermissionChecker PermissionChecker { get; } + + public FeatureSettingGroupViewComponent(IPermissionChecker permissionChecker) + { + PermissionChecker = permissionChecker; + } + + public virtual async Task InvokeAsync() + { + var model = new FeatureSettingViewModel + { + HasManageHostFeaturesPermission = await PermissionChecker.IsGrantedAsync(FeatureManagementPermissions.ManageHostFeatures) + }; + return View("~/Pages/FeatureManagement/Components/FeatureSettingGroup/Default.cshtml", model); + } + + public class FeatureSettingViewModel + { + public bool HasManageHostFeaturesPermission { get; set; } + } +} \ No newline at end of file diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Settings/FeatureSettingManagementPageContributor.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Settings/FeatureSettingManagementPageContributor.cs new file mode 100644 index 0000000000..259c440166 --- /dev/null +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Settings/FeatureSettingManagementPageContributor.cs @@ -0,0 +1,29 @@ +using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Localization; +using Volo.Abp.FeatureManagement.Localization; +using Volo.Abp.FeatureManagement.Pages.FeatureManagement.Components.FeatureSettingGroup; +using Volo.Abp.SettingManagement.Web.Pages.SettingManagement; + +namespace Volo.Abp.FeatureManagement.Settings; + +public class FeatureSettingManagementPageContributor : SettingPageContributorBase +{ + public FeatureSettingManagementPageContributor() + { + RequiredPermissions(FeatureManagementPermissions.ManageHostFeatures); + } + + public override Task ConfigureAsync(SettingPageCreationContext context) + { + var l = context.ServiceProvider.GetRequiredService>(); + context.Groups.Add( + new SettingPageGroup( + "Volo.Abp.FeatureManagement", + l["Permission:FeatureManagement"], + typeof(FeatureSettingGroupViewComponent) + ) + ); + return Task.CompletedTask; + } +} \ No newline at end of file diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Volo.Abp.FeatureManagement.Web.csproj b/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Volo.Abp.FeatureManagement.Web.csproj index e5c8b3ba52..4b1394c27d 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Volo.Abp.FeatureManagement.Web.csproj +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Volo.Abp.FeatureManagement.Web.csproj @@ -33,7 +33,12 @@ + + + <_ContentIncludedByDefault Remove="Pages\Components\FeatureSettingGroup\Default.cshtml" /> + + diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/ar.json b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/ar.json index 134da8c601..267165038c 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/ar.json +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/ar.json @@ -10,7 +10,6 @@ "ConnectionStrings": "Connection Strings", "DisplayName:DefaultConnectionString": "Default Connection String", "DisplayName:UseSharedDatabase": "استخدام قاعدة البيانات المشتركة", - "ManageHostFeatures": "إدارة ميزات المضيف", "Permission:TenantManagement": "إدارة المستأجر", "Permission:Create": "إنشاء", "Permission:Edit": "تحرير", diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/cs.json b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/cs.json index 754b66d081..001d5d71fb 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/cs.json +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/cs.json @@ -10,7 +10,6 @@ "ConnectionStrings": "Connection stringy", "DisplayName:DefaultConnectionString": "Výchozí connection string", "DisplayName:UseSharedDatabase": "Použít sdílenou databázi", - "ManageHostFeatures": "Správa funkcí hostitele", "Permission:TenantManagement": "Správa tenantů", "Permission:Create": "Vytvořit", "Permission:Edit": "Upravit", diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/de-DE.json b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/de-DE.json index 16644b17aa..c744619234 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/de-DE.json +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/de-DE.json @@ -10,7 +10,6 @@ "ConnectionStrings": "Connection Strings", "DisplayName:DefaultConnectionString": "Standard-Connection String", "DisplayName:UseSharedDatabase": "Verwenden Sie die freigegebene Datenbank", - "ManageHostFeatures": "Host-Features verwalten", "Permission:TenantManagement": "Mandantenverwaltung", "Permission:Create": "Erstellen", "Permission:Edit": "Bearbeiten", diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/el.json b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/el.json index 026bcb0b76..bc75c34e03 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/el.json +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/el.json @@ -10,7 +10,6 @@ "ConnectionStrings": "Συμβολοσειρές σύνδεσης", "DisplayName:DefaultConnectionString": "Προεπιλεγμένη συμβολοσειρά σύνδεσης", "DisplayName:UseSharedDatabase": "Χρησιμοποιήστε την Κοινόχρηστη βάση δεδομένων", - "ManageHostFeatures": "Διαχείριση δυνατοτήτων του Οικοδεσπότη", "Permission:TenantManagement": "Διαχείριση ενοικιαστών", "Permission:Create": "Δημιουργία", "Permission:Edit": "Επεξεργασία", diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/en-GB.json b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/en-GB.json index 4d6075ff74..8b4e4c185b 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/en-GB.json +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/en-GB.json @@ -10,7 +10,6 @@ "ConnectionStrings": "Connection Strings", "DisplayName:DefaultConnectionString": "Default Connection String", "DisplayName:UseSharedDatabase": "Use the Shared Database", - "ManageHostFeatures": "Manage Host features", "Permission:TenantManagement": "Tenant management", "Permission:Create": "Create", "Permission:Edit": "Edit", diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/en.json b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/en.json index ba4109c392..da222e994d 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/en.json +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/en.json @@ -10,7 +10,6 @@ "ConnectionStrings": "Connection Strings", "DisplayName:DefaultConnectionString": "Default Connection String", "DisplayName:UseSharedDatabase": "Use the Shared Database", - "ManageHostFeatures": "Manage Host features", "Permission:TenantManagement": "Tenant management", "Permission:Create": "Create", "Permission:Edit": "Edit", diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/es.json b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/es.json index cd18e3c33b..a570c4a84e 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/es.json +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/es.json @@ -10,7 +10,6 @@ "ConnectionStrings": "Connection Strings", "DisplayName:DefaultConnectionString": "Connection String predeterminado", "DisplayName:UseSharedDatabase": "Usar la base de datos compartida", - "ManageHostFeatures": "Administrar funciones de host", "Permission:TenantManagement": "Gestión de tenants", "Permission:Create": "Crear", "Permission:Edit": "Editar", diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/fa.json b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/fa.json index f0a804c073..c67a9c070b 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/fa.json +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/fa.json @@ -10,7 +10,6 @@ "ConnectionStrings": "کانکشن استرینگها", "DisplayName:DefaultConnectionString": "کانکشن استرینگ پیش فرض", "DisplayName:UseSharedDatabase": "استفاده از پایگاه داده مشترک", - "ManageHostFeatures": "مدیریت ویژگی های میزبان", "Permission:TenantManagement": "مدیریت تننت", "Permission:Create": "ایجاد", "Permission:Edit": "ویرایش", diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/fi.json b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/fi.json index cae6bf6cac..3bd039ffcf 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/fi.json +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/fi.json @@ -10,7 +10,6 @@ "ConnectionStrings": "Yhteysjonot", "DisplayName:DefaultConnectionString": "Oletusyhteysmerkkijono", "DisplayName:UseSharedDatabase": "Käytä jaettua tietokantaa", - "ManageHostFeatures": "Hallinnoi isäntäominaisuuksia", "Permission:TenantManagement": "Vuokralaisten hallinta", "Permission:Create": "Luoda", "Permission:Edit": "Muokata", diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/fr.json b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/fr.json index 4aac3eebab..771a1e1fd5 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/fr.json +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/fr.json @@ -10,7 +10,6 @@ "ConnectionStrings": "Chaînes de connexion", "DisplayName:DefaultConnectionString": "Chaîne de connexion par défaut", "DisplayName:UseSharedDatabase": "Utiliser la base de données partagée", - "ManageHostFeatures": "Gérer les fonctionnalités de l’hôte", "Permission:TenantManagement": "Gestion des locataires", "Permission:Create": "Créer", "Permission:Edit": "Modifier", diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/hi.json b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/hi.json index 1094744a16..45e5de55c0 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/hi.json +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/hi.json @@ -10,7 +10,6 @@ "ConnectionStrings": "कनेक्शन स्ट्रिंग्स", "DisplayName:DefaultConnectionString": "डिफ़ॉल्ट कनेक्शन स्ट्रिंग", "DisplayName:UseSharedDatabase": "साझा डेटाबेस का उपयोग करें", - "ManageHostFeatures": "होस्ट सुविधाएँ प्रबंधित करें", "Permission:TenantManagement": "किरायेदार प्रबंधन", "Permission:Create": "सृजन करना", "Permission:Edit": "संपादित करें", diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/hu.json b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/hu.json index 60c61c15cf..f4ccb64b0a 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/hu.json +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/hu.json @@ -10,7 +10,6 @@ "ConnectionStrings": "Kapcsolat beállítás", "DisplayName:DefaultConnectionString": "Alapértelmezettt kapcsolati beállítás", "DisplayName:UseSharedDatabase": "Használjon megosztott adatbázist", - "ManageHostFeatures": "Host funkciók kezelése", "Permission:TenantManagement": "Bérlő menedzsment", "Permission:Create": "Létrehozás", "Permission:Edit": "Szerkesztés", diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/is.json b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/is.json index 25c6a86ca3..ca2a8cb7a9 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/is.json +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/is.json @@ -10,7 +10,6 @@ "ConnectionStrings": "Tengi strengir", "DisplayName:DefaultConnectionString": "Sjálfgefin tengistrengur", "DisplayName:UseSharedDatabase": "Notaðu samnýttan gagnagrunn", - "ManageHostFeatures": "Stjórna Gestgjafa Eiginleikum", "Permission:TenantManagement": "Tenant umsjá", "Permission:Create": "Búa til", "Permission:Edit": "Breyta", diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/it.json b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/it.json index c80b7974ab..efc7cb2f6b 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/it.json +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/it.json @@ -10,7 +10,6 @@ "ConnectionStrings": "Stringhe di connessione", "DisplayName:DefaultConnectionString": "Stringa di connessione predefinita", "DisplayName:UseSharedDatabase": "Usa il database condiviso", - "ManageHostFeatures": "Gestisci le funzionalità dell'host", "Permission:TenantManagement": "Gestione Tenant", "Permission:Create": "Crea", "Permission:Edit": "Modifica", diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/nl.json b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/nl.json index d4c45b8aad..1aeb208560 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/nl.json +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/nl.json @@ -10,7 +10,6 @@ "ConnectionStrings": "Connection Strings", "DisplayName:DefaultConnectionString": "Standaard Connection String", "DisplayName:UseSharedDatabase": "Gebruik de gedeelde database", - "ManageHostFeatures": "Beheer host functies", "Permission:TenantManagement": "Klanten beheer", "Permission:Create": "Maak aan", "Permission:Edit": "Bewerk", diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/pl-PL.json b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/pl-PL.json index c62c67123e..6ec40c7310 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/pl-PL.json +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/pl-PL.json @@ -10,7 +10,6 @@ "ConnectionStrings": "Connection Strings", "DisplayName:DefaultConnectionString": "Domyślny Connection String", "DisplayName:UseSharedDatabase": "Użyj współdzielonej bazy danych", - "ManageHostFeatures": "Zarządzaj funkcjami hosta", "Permission:TenantManagement": "Zarządzanie tenantami", "Permission:Create": "Utwórz", "Permission:Edit": "Edytuj", diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/pt-BR.json b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/pt-BR.json index 6f43740161..9d0771ed9e 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/pt-BR.json +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/pt-BR.json @@ -10,7 +10,6 @@ "ConnectionStrings": "Cadeia de Conexão", "DisplayName:DefaultConnectionString": "Cadeia de Conexão Padrão", "DisplayName:UseSharedDatabase": "Use o banco de dados compartilhado", - "ManageHostFeatures": "Gerenciar recursos do Host", "Permission:TenantManagement": "Inquilinos", "Permission:Create": "Criar", "Permission:Edit": "Editar", diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/ro-RO.json b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/ro-RO.json index 70147d9921..18bf9fb74e 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/ro-RO.json +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/ro-RO.json @@ -10,7 +10,6 @@ "ConnectionStrings": "Connection Strings", "DisplayName:DefaultConnectionString": "Connection String implicit", "DisplayName:UseSharedDatabase": "Folosiţi baza de date partajată", - "ManageHostFeatures": "Administraţi caracteristicile de host", "Permission:TenantManagement": "Administrarea clienţilor", "Permission:Create": "Creează", "Permission:Edit": "Editează", diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/ru.json b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/ru.json index 9e5732bbd7..b737b7ee24 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/ru.json +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/ru.json @@ -10,7 +10,6 @@ "ConnectionStrings": "Строки подключения", "DisplayName:DefaultConnectionString": "Строка подключения по умолчанию", "DisplayName:UseSharedDatabase": "Использование общей базы данных", - "ManageHostFeatures": "Управление функциями хоста", "Permission:TenantManagement": "Управление арендаторами", "Permission:Create": "Создать", "Permission:Edit": "Редактировать", diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/sk.json b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/sk.json index df3cd3dd13..0689dee0e2 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/sk.json +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/sk.json @@ -10,7 +10,6 @@ "ConnectionStrings": "Connection stringy", "DisplayName:DefaultConnectionString": "Predvolený connection string", "DisplayName:UseSharedDatabase": "Použiť zdieľanú databázu", - "ManageHostFeatures": "Spravovať funkcie poskytovateľa", "Permission:TenantManagement": "Správa tenantov", "Permission:Create": "Vytvoriť", "Permission:Edit": "Upraviť", diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/sl.json b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/sl.json index b9df388d7c..bc2d857331 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/sl.json +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/sl.json @@ -10,7 +10,6 @@ "ConnectionStrings": "Connection Strings", "DisplayName:DefaultConnectionString": "Privzeti Connection String", "DisplayName:UseSharedDatabase": "Uporabi skupno bazo", - "ManageHostFeatures": "Upravljajte funkcije gostitelja", "Permission:TenantManagement": "Upravljanje najemnikov", "Permission:Create": "Ustvarjanje", "Permission:Edit": "Urejanje", diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/tr.json b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/tr.json index 25ca3f2407..933f4a4650 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/tr.json +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/tr.json @@ -10,7 +10,6 @@ "ConnectionStrings": "Bağlantı cümlesi", "DisplayName:DefaultConnectionString": "Varsayılan bağlantı cümlesi", "DisplayName:UseSharedDatabase": "Paylaşılan veritabanını kullan", - "ManageHostFeatures": "Host özelliklerini yönetin", "Permission:TenantManagement": "Müşteri yönetimi", "Permission:Create": "Oluşturma", "Permission:Edit": "Düzenleme", diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/vi.json b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/vi.json index 025ec04eb6..4fafa9cc72 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/vi.json +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/vi.json @@ -10,7 +10,6 @@ "ConnectionStrings": "Chuỗi kết nối", "DisplayName:DefaultConnectionString": "Chuỗi kết nối mặc định", "DisplayName:UseSharedDatabase": "Sử dụng cơ sở dữ liệu dùng chung", - "ManageHostFeatures": "Quản lý các tính năng của Máy chủ lưu trữ", "Permission:TenantManagement": "Quản lý khách thuê", "Permission:Create": "Tạo", "Permission:Edit": "Sửa", diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/zh-Hans.json b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/zh-Hans.json index 034d4bac81..1e8e98412a 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/zh-Hans.json +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/zh-Hans.json @@ -10,7 +10,6 @@ "ConnectionStrings": "连接字符串", "DisplayName:DefaultConnectionString": "默认连接字符串", "DisplayName:UseSharedDatabase": "使用共享数据库", - "ManageHostFeatures": "管理Host特性", "Permission:TenantManagement": "租户管理", "Permission:Create": "创建", "Permission:Edit": "编辑", diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/zh-Hant.json b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/zh-Hant.json index 6950a1ca00..200dde595f 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/zh-Hant.json +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/zh-Hant.json @@ -10,7 +10,6 @@ "ConnectionStrings": "資料庫連線字串", "DisplayName:DefaultConnectionString": "預設資料庫連線字串", "DisplayName:UseSharedDatabase": "使用共用資料庫", - "ManageHostFeatures": "管理Host功能", "Permission:TenantManagement": "租戶管理", "Permission:Create": "新增", "Permission:Edit": "編輯", diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/AbpTenantManagementWebModule.cs b/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/AbpTenantManagementWebModule.cs index 1ac62db5e2..b3a63fb8ae 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/AbpTenantManagementWebModule.cs +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/AbpTenantManagementWebModule.cs @@ -69,13 +69,6 @@ public class AbpTenantManagementWebModule : AbpModule options.Configure( toolbar => { - toolbar.AddButton( - LocalizableString.Create("ManageHostFeatures"), - icon: "cog", - name: "ManageHostFeatures", - requiredPolicyName: FeatureManagementPermissions.ManageHostFeatures - ); - toolbar.AddButton( LocalizableString.Create("NewTenant"), icon: "plus", diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Pages/TenantManagement/Tenants/Index.js b/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Pages/TenantManagement/Tenants/Index.js index e990b8fc37..a9cf094c6c 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Pages/TenantManagement/Tenants/Index.js +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Pages/TenantManagement/Tenants/Index.js @@ -113,12 +113,5 @@ e.preventDefault(); _createModal.open(); }); - - _$wrapper.find('button[name=ManageHostFeatures]').click(function (e) { - e.preventDefault(); - _featuresModal.open({ - providerName: 'T' - }); - }); }); })(); From c14bbe3200bde383af337821df8e2f99be2043b0 Mon Sep 17 00:00:00 2001 From: malik masis Date: Thu, 21 Jul 2022 17:53:08 +0300 Subject: [PATCH 07/84] Added Content AppService and Controller --- .../CmsKit/Contents/IContentAppService.cs | 10 +++++++ .../Volo/CmsKit/Contents/ContentAppService.cs | 22 ++++++++++++++ .../Volo/CmsKit/Contents/ContentController.cs | 29 +++++++++++++++++++ .../client-proxies/cms-kit-common-proxy.js | 15 ++++++++++ 4 files changed, 76 insertions(+) create mode 100644 modules/cms-kit/src/Volo.CmsKit.Common.Application.Contracts/Volo/CmsKit/Contents/IContentAppService.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Common.Application/Volo/CmsKit/Contents/ContentAppService.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Common.HttpApi/Volo/CmsKit/Contents/ContentController.cs diff --git a/modules/cms-kit/src/Volo.CmsKit.Common.Application.Contracts/Volo/CmsKit/Contents/IContentAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Common.Application.Contracts/Volo/CmsKit/Contents/IContentAppService.cs new file mode 100644 index 0000000000..ec2b9bcf42 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Common.Application.Contracts/Volo/CmsKit/Contents/IContentAppService.cs @@ -0,0 +1,10 @@ +using System.Collections.Generic; +using System.Threading.Tasks; +using Volo.Abp.Application.Services; + +namespace Volo.CmsKit.Contents; + +public interface IContentAppService : IApplicationService +{ + Task> ParseAsync(string content); +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Common.Application/Volo/CmsKit/Contents/ContentAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Common.Application/Volo/CmsKit/Contents/ContentAppService.cs new file mode 100644 index 0000000000..a227f31e18 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Common.Application/Volo/CmsKit/Contents/ContentAppService.cs @@ -0,0 +1,22 @@ +using System.Collections.Generic; +using System.Threading.Tasks; +using Volo.Abp.GlobalFeatures; +using Volo.CmsKit.GlobalFeatures; + +namespace Volo.CmsKit.Contents; + +[RequiresGlobalFeature(typeof(PagesFeature))] +public class ContentAppService : CmsKitAppServiceBase, IContentAppService +{ + protected ContentParser ContentParser { get; } + + public ContentAppService(ContentParser contentParser) + { + ContentParser = contentParser; + } + + public async Task> ParseAsync(string content) + { + return await ContentParser.ParseAsync(content); + } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Common.HttpApi/Volo/CmsKit/Contents/ContentController.cs b/modules/cms-kit/src/Volo.CmsKit.Common.HttpApi/Volo/CmsKit/Contents/ContentController.cs new file mode 100644 index 0000000000..fd7ba47a44 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Common.HttpApi/Volo/CmsKit/Contents/ContentController.cs @@ -0,0 +1,29 @@ +using System.Collections.Generic; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc; +using Volo.Abp; +using Volo.Abp.GlobalFeatures; +using Volo.CmsKit.GlobalFeatures; + +namespace Volo.CmsKit.Contents; + +[RequiresGlobalFeature(typeof(PagesFeature))] +[RemoteService(Name = CmsKitCommonRemoteServiceConsts.RemoteServiceName)] +[Area(CmsKitCommonRemoteServiceConsts.ModuleName)] +[Route("api/cms-kit/contents")] +public class ContentController : CmsKitControllerBase, IContentAppService +{ + protected IContentAppService ContentAppService { get; } + + public ContentController(IContentAppService contentAppService) + { + ContentAppService = contentAppService; + } + + [HttpGet] + [Route("{parse}")] + public async Task> ParseAsync(string content) + { + return await ContentAppService.ParseAsync(content); + } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Common.Web/wwwroot/client-proxies/cms-kit-common-proxy.js b/modules/cms-kit/src/Volo.CmsKit.Common.Web/wwwroot/client-proxies/cms-kit-common-proxy.js index 27aa1d819e..e7a38d5af4 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Common.Web/wwwroot/client-proxies/cms-kit-common-proxy.js +++ b/modules/cms-kit/src/Volo.CmsKit.Common.Web/wwwroot/client-proxies/cms-kit-common-proxy.js @@ -20,6 +20,21 @@ })(); + // controller volo.cmsKit.contents.content + + (function(){ + + abp.utils.createNamespace(window, 'volo.cmsKit.contents.content'); + + volo.cmsKit.contents.content.parse = function(content, parse, ajaxParams) { + return abp.ajax($.extend(true, { + url: abp.appPath + 'api/cms-kit/contents/' + parse + '' + abp.utils.buildQueryString([{ name: 'content', value: content }]) + '', + type: 'GET' + }, ajaxParams)); + }; + + })(); + // controller volo.cmsKit.blogs.blogFeature (function(){ From 08ca8f3d65da8822d50a25cad5d419bf7d0e7377 Mon Sep 17 00:00:00 2001 From: malik masis Date: Thu, 21 Jul 2022 17:53:32 +0300 Subject: [PATCH 08/84] Update ContentParser.cs --- .../Volo/CmsKit/Contents/ContentParser.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/cms-kit/src/Volo.CmsKit.Common.Application/Volo/CmsKit/Contents/ContentParser.cs b/modules/cms-kit/src/Volo.CmsKit.Common.Application/Volo/CmsKit/Contents/ContentParser.cs index 7fe9fe5b60..9c6aafc0d0 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Common.Application/Volo/CmsKit/Contents/ContentParser.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Common.Application/Volo/CmsKit/Contents/ContentParser.cs @@ -28,10 +28,10 @@ public class ContentParser : ITransientDependency }); } - var parsedList = new List(); + List parsedList = new(); ParseContent(content, parsedList); - var contentFragments = new List(); + List contentFragments = new(); FillContentFragment(content, parsedList, contentFragments); return Task.FromResult(contentFragments); From 1c6bad977fae2a5d1adf6525343301d2f42ea5c5 Mon Sep 17 00:00:00 2001 From: malik masis Date: Thu, 21 Jul 2022 17:53:52 +0300 Subject: [PATCH 09/84] Update Index.cshtml.cs --- .../Pages/Public/CmsKit/Pages/Index.cshtml.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Pages/Index.cshtml.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Pages/Index.cshtml.cs index 1434eccb4b..2ade3faee1 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Pages/Index.cshtml.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Pages/Index.cshtml.cs @@ -12,9 +12,9 @@ public class IndexModel : CommonPageModel protected IPagePublicAppService PagePublicAppService { get; } - public PageDto PageDto{ get; private set; } + public PageDto PageDto { get; private set; } -public IndexModel(IPagePublicAppService pagePublicAppService) + public IndexModel(IPagePublicAppService pagePublicAppService) { PagePublicAppService = pagePublicAppService; } From fb26e5222e28981cc31b2d664041c9e80ac7080c Mon Sep 17 00:00:00 2001 From: malik masis Date: Thu, 21 Jul 2022 17:54:04 +0300 Subject: [PATCH 10/84] Create ContentsFeature.cs --- .../CmsKit/GlobalFeatures/ContentsFeature.cs | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/ContentsFeature.cs diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/ContentsFeature.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/ContentsFeature.cs new file mode 100644 index 0000000000..ac752a68c4 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/ContentsFeature.cs @@ -0,0 +1,28 @@ +using JetBrains.Annotations; +using Volo.Abp.GlobalFeatures; + +namespace Volo.CmsKit.GlobalFeatures; + +[GlobalFeatureName(Name)] +public class ContentsFeature : GlobalFeature +{ + public const string Name = "CmsKit.Contents"; + + internal ContentsFeature( + [NotNull] GlobalCmsKitFeatures cmsKit + ) : base(cmsKit) + { + + } + + public override void Enable() + { + var userFeature = FeatureManager.Modules.CmsKit().User; + if (!userFeature.IsEnabled) + { + userFeature.Enable(); + } + + base.Enable(); + } +} From 64be91b7ebf681bd9a8f9cf1dc1e9088c22a867c Mon Sep 17 00:00:00 2001 From: Engincan VESKE Date: Thu, 21 Jul 2022 21:34:59 +0300 Subject: [PATCH 11/84] Update en.json --- .../Base/Localization/Resources/en.json | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json index 3a1b574d21..1db88983d9 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json @@ -164,6 +164,13 @@ "Books": "Books", "ABPDiscordServer": "ABP Discord Server", "ABPCommunityTalks": "ABP Community Talks", - "ABPCommunityPosts": "ABP Community Posts" + "ABPCommunityPosts": "ABP Community Posts", + "BuyAndGetMonths": "BUY {0} MONTHS, GET 14 MONTHS!", + "GetYourDeal": "Get Your Deal", + "BuyOrRenewLicense": "Buy or Renew License Now and Get 2 Extra Months!", + "BuyOrRenewLicenseToGetExtra2Months": "Buy or Renew License Now and Get 2 Extra Months! HURRY UP! ⏰ Last Day: {0}", + "HurryUp": "HURRY UP!", + "LastDay": "Last Day: {0}", + "BuyNewLicenseBetweenDatesToGetBenefit": "Buy a new license between {0} and {1} to get benefit for extra 2 months!" } } From 0a11133d696cf66856e4294d34ba744f7a4e3d56 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Fri, 22 Jul 2022 13:17:35 +0800 Subject: [PATCH 12/84] Blazor UI: Move "host features" to the settings page --- .../AbpFeatureManagementBlazorModule.cs | 13 +++++- .../FeatureSettingManagementComponent.razor | 12 ++++++ ...FeatureSettingManagementComponent.razor.cs | 40 ++++++++++++++++++ ...reSettingManagementComponentContributor.cs | 41 +++++++++++++++++++ .../Volo.Abp.FeatureManagement.Blazor.csproj | 1 + .../FeatureSettingGroup/Default.cshtml | 2 +- .../TenantManagement.razor.cs | 5 --- 7 files changed, 106 insertions(+), 8 deletions(-) create mode 100644 modules/feature-management/src/Volo.Abp.FeatureManagement.Blazor/Components/FeatureSettingGroup/FeatureSettingManagementComponent.razor create mode 100644 modules/feature-management/src/Volo.Abp.FeatureManagement.Blazor/Components/FeatureSettingGroup/FeatureSettingManagementComponent.razor.cs create mode 100644 modules/feature-management/src/Volo.Abp.FeatureManagement.Blazor/Settings/FeatureSettingManagementComponentContributor.cs diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Blazor/AbpFeatureManagementBlazorModule.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.Blazor/AbpFeatureManagementBlazorModule.cs index 8bfee863b1..87882015fc 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Blazor/AbpFeatureManagementBlazorModule.cs +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Blazor/AbpFeatureManagementBlazorModule.cs @@ -1,15 +1,24 @@ using Volo.Abp.AspNetCore.Components.Web.Theming; +using Volo.Abp.FeatureManagement.Blazor.Settings; using Volo.Abp.Features; using Volo.Abp.Modularity; +using Volo.Abp.SettingManagement.Blazor; namespace Volo.Abp.FeatureManagement.Blazor; [DependsOn( typeof(AbpAspNetCoreComponentsWebThemingModule), typeof(AbpFeatureManagementApplicationContractsModule), - typeof(AbpFeaturesModule) + typeof(AbpFeaturesModule), + typeof(AbpSettingManagementBlazorModule) )] public class AbpFeatureManagementBlazorModule : AbpModule { - + public override void ConfigureServices(ServiceConfigurationContext context) + { + Configure(options => + { + options.Contributors.Add(new FeatureSettingManagementComponentContributor()); + }); + } } diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Blazor/Components/FeatureSettingGroup/FeatureSettingManagementComponent.razor b/modules/feature-management/src/Volo.Abp.FeatureManagement.Blazor/Components/FeatureSettingGroup/FeatureSettingManagementComponent.razor new file mode 100644 index 0000000000..15f8e65ee4 --- /dev/null +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Blazor/Components/FeatureSettingGroup/FeatureSettingManagementComponent.razor @@ -0,0 +1,12 @@ +@inherits Volo.Abp.AspNetCore.Components.AbpComponentBase + +@if (Settings != null && Settings.HasManageHostFeaturesPermission) +{ +
+ +
+ + +} \ No newline at end of file diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Blazor/Components/FeatureSettingGroup/FeatureSettingManagementComponent.razor.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.Blazor/Components/FeatureSettingGroup/FeatureSettingManagementComponent.razor.cs new file mode 100644 index 0000000000..09b31b9609 --- /dev/null +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Blazor/Components/FeatureSettingGroup/FeatureSettingManagementComponent.razor.cs @@ -0,0 +1,40 @@ +using System.Threading.Tasks; +using Microsoft.AspNetCore.Components; +using Microsoft.Extensions.Localization; +using Volo.Abp.AspNetCore.Components; +using Volo.Abp.Authorization.Permissions; +using Volo.Abp.FeatureManagement.Localization; +using Volo.Abp.Features; + +namespace Volo.Abp.FeatureManagement.Blazor.Components.FeatureSettingGroup; + +public partial class FeatureSettingManagementComponent : AbpComponentBase +{ + [Inject] + protected IStringLocalizer L { get; set; } + + [Inject] + protected PermissionChecker PermissionChecker { get; set; } + + protected FeatureManagementModal FeatureManagementModal; + + protected FeatureSettingViewModel Settings; + + protected async override Task OnInitializedAsync() + { + Settings = new FeatureSettingViewModel + { + HasManageHostFeaturesPermission = await PermissionChecker.IsGrantedAsync(FeatureManagementPermissions.ManageHostFeatures) + }; + } + + protected virtual async Task OnManageHostFeaturesClicked() + { + await FeatureManagementModal.OpenAsync(TenantFeatureValueProvider.ProviderName); + } +} + +public class FeatureSettingViewModel +{ + public bool HasManageHostFeaturesPermission { get; set; } +} \ No newline at end of file diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Blazor/Settings/FeatureSettingManagementComponentContributor.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.Blazor/Settings/FeatureSettingManagementComponentContributor.cs new file mode 100644 index 0000000000..caeb17de26 --- /dev/null +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Blazor/Settings/FeatureSettingManagementComponentContributor.cs @@ -0,0 +1,41 @@ +using System.Threading.Tasks; +using Microsoft.AspNetCore.Authorization; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Localization; +using Volo.Abp.FeatureManagement.Blazor.Components.FeatureSettingGroup; +using Volo.Abp.FeatureManagement.Localization; +using Volo.Abp.SettingManagement.Blazor; + +namespace Volo.Abp.FeatureManagement.Blazor.Settings; + +public class FeatureSettingManagementComponentContributor: ISettingComponentContributor +{ + public virtual async Task ConfigureAsync(SettingComponentCreationContext context) + { + if (!await CheckPermissionsInternalAsync(context)) + { + return; + } + + var l = context.ServiceProvider.GetRequiredService>(); + context.Groups.Add( + new SettingComponentGroup( + "Volo.Abp.Feature", + l["Permission:FeatureManagement"], + typeof(FeatureSettingManagementComponent) + ) + ); + } + + public virtual async Task CheckPermissionsAsync(SettingComponentCreationContext context) + { + return await CheckPermissionsInternalAsync(context); + } + + protected virtual async Task CheckPermissionsInternalAsync(SettingComponentCreationContext context) + { + var authorizationService = context.ServiceProvider.GetRequiredService(); + + return await authorizationService.IsGrantedAsync(FeatureManagementPermissions.ManageHostFeatures); + } +} diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Blazor/Volo.Abp.FeatureManagement.Blazor.csproj b/modules/feature-management/src/Volo.Abp.FeatureManagement.Blazor/Volo.Abp.FeatureManagement.Blazor.csproj index 22dab36cff..49d7ffd6c6 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Blazor/Volo.Abp.FeatureManagement.Blazor.csproj +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Blazor/Volo.Abp.FeatureManagement.Blazor.csproj @@ -14,6 +14,7 @@ + diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/Components/FeatureSettingGroup/Default.cshtml b/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/Components/FeatureSettingGroup/Default.cshtml index 9e975306a4..66f7b4861c 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/Components/FeatureSettingGroup/Default.cshtml +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/Components/FeatureSettingGroup/Default.cshtml @@ -8,6 +8,6 @@
@if (Model.HasManageHostFeaturesPermission) { - + } \ No newline at end of file diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Blazor/Pages/TenantManagement/TenantManagement.razor.cs b/modules/tenant-management/src/Volo.Abp.TenantManagement.Blazor/Pages/TenantManagement/TenantManagement.razor.cs index 0f0e689f2f..6fe3005a98 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Blazor/Pages/TenantManagement/TenantManagement.razor.cs +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Blazor/Pages/TenantManagement/TenantManagement.razor.cs @@ -54,11 +54,6 @@ public partial class TenantManagement protected override ValueTask SetToolbarItemsAsync() { - Toolbar.AddButton(L["ManageHostFeatures"], - async () => await FeatureManagementModal.OpenAsync(FeatureProviderName), - "fa fa-cog", - requiredPolicyName: FeatureManagementPermissions.ManageHostFeatures); - Toolbar.AddButton(L["NewTenant"], OpenCreateModalAsync, IconName.Add, From 50ef1aa5ef76d1ea7a4fcc12fd83ce0a9a61dd80 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Fri, 22 Jul 2022 13:50:47 +0800 Subject: [PATCH 13/84] improve --- .../FeatureSettingGroup/FeatureSettingManagementComponent.razor | 2 +- .../Components/FeatureSettingGroup/Default.cshtml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Blazor/Components/FeatureSettingGroup/FeatureSettingManagementComponent.razor b/modules/feature-management/src/Volo.Abp.FeatureManagement.Blazor/Components/FeatureSettingGroup/FeatureSettingManagementComponent.razor index 15f8e65ee4..341d405e4e 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Blazor/Components/FeatureSettingGroup/FeatureSettingManagementComponent.razor +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Blazor/Components/FeatureSettingGroup/FeatureSettingManagementComponent.razor @@ -3,7 +3,7 @@ @if (Settings != null && Settings.HasManageHostFeaturesPermission) {
-
diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/Components/FeatureSettingGroup/Default.cshtml b/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/Components/FeatureSettingGroup/Default.cshtml index 66f7b4861c..0af011ee8b 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/Components/FeatureSettingGroup/Default.cshtml +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/Components/FeatureSettingGroup/Default.cshtml @@ -8,6 +8,6 @@
@if (Model.HasManageHostFeaturesPermission) { - + } \ No newline at end of file From f9aba953dbbb1df741c79369a4d1beb474c8617d Mon Sep 17 00:00:00 2001 From: Engincan VESKE Date: Fri, 22 Jul 2022 10:25:07 +0300 Subject: [PATCH 14/84] Add missing Chinese localizations for base resource --- .../Base/Localization/Resources/en.json | 2 +- .../Base/Localization/Resources/zh-Hans.json | 9 ++++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json index 1db88983d9..6583ae731f 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json @@ -165,7 +165,7 @@ "ABPDiscordServer": "ABP Discord Server", "ABPCommunityTalks": "ABP Community Talks", "ABPCommunityPosts": "ABP Community Posts", - "BuyAndGetMonths": "BUY {0} MONTHS, GET 14 MONTHS!", + "BuyAndGetMonths": "BUY 12 MONTHS, GET 14 MONTHS!", "GetYourDeal": "Get Your Deal", "BuyOrRenewLicense": "Buy or Renew License Now and Get 2 Extra Months!", "BuyOrRenewLicenseToGetExtra2Months": "Buy or Renew License Now and Get 2 Extra Months! HURRY UP! ⏰ Last Day: {0}", diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/zh-Hans.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/zh-Hans.json index 2ea126df0f..11e780627e 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/zh-Hans.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/zh-Hans.json @@ -161,6 +161,13 @@ "Error_Page_500_Title": "好像出了什么问题!", "Error_Page_500_Description_1": "我们会自动跟踪这些错误,但如果问题仍然存在,请随时
联系我们。 与此同时,尝试刷新。", "Error_Page_500_Description_2": "通过
info@abp.io 与我们联系。", - "Books": "书籍" + "Books": "书籍", + "BuyAndGetMonths": "购买 12 个月,获得 14 个月!", + "GetYourDeal": "得到你的交易", + "BuyOrRenewLicense": "立即购买或续订许可证并额外获得 2 个月!", + "BuyOrRenewLicenseToGetExtra2Months": "立即购买或续订 ABP 商业许可证(适用于所有版本)并额外获得 2 个月!", + "HurryUp": "赶快下单!", + "LastDay": "活动截止日期: {0}", + "BuyNewLicenseBetweenDatesToGetBenefit": "在 {0} 和 {1} 之间购买一个新的许可证以获得额外 2 个月的收益!" } } \ No newline at end of file From 5fe97ae1ec0bd868e6bc53efc244bd1d5faacce4 Mon Sep 17 00:00:00 2001 From: selman koc <64414348+skoc10@users.noreply.github.com> Date: Fri, 22 Jul 2022 11:03:24 +0300 Subject: [PATCH 15/84] Update common.props --- common.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common.props b/common.props index e6c9c40c28..f8b7c620c2 100644 --- a/common.props +++ b/common.props @@ -1,7 +1,7 @@ latest - 6.0.0 + 7.0.0 $(NoWarn);CS1591;CS0436 https://abp.io/assets/abp_nupkg.png https://abp.io/ From fa0d8e57d58c3ed5600d0ad9d7ae6077724da593 Mon Sep 17 00:00:00 2001 From: Salih Date: Fri, 22 Jul 2022 11:28:15 +0300 Subject: [PATCH 16/84] Update en.json --- .../AbpIoLocalization/Admin/Localization/Resources/en.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json index 22ef0df894..a0be283b18 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json @@ -397,6 +397,8 @@ "BookDiscountDeletionConfirmationMessage": "Are you sure you want to delete this book discount?", "CustomPaymentFlexSwitchDescription": "With license", "AllowFeatureUpgradeOnLicenseExpire": "Allow feature upgrade on license expire", - "Deleted{0}": "[Deleted {0}]" + "Deleted{0}": "[Deleted {0}]", + "Tags": "Tags", + "SetTagsInfo": "Enter tags separated by commas. Example CSharp, Entity Framework" } } From 609c7178b1bdab09b80b12d018bdc99629920d7c Mon Sep 17 00:00:00 2001 From: Salih Date: Fri, 22 Jul 2022 11:31:28 +0300 Subject: [PATCH 17/84] Update en.json --- .../AbpIoLocalization/Community/Localization/Resources/en.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/en.json index 0ed3eda832..b8e8d9b135 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/en.json @@ -184,6 +184,7 @@ "Post_Index_Page_MetaDescription": "ABP Community's purpose is to create a contribution environment for developers who use the ABP framework.", "Layout_Title": "{0} | ABP Community", "Layout_MetaDescription": "ABP Community is an environment where people can share posts about ABP framework and follows the projects.", - "Index_Page_CommunityIntroduction": "This is a hub for ABP Framework, .NET and software development. You can read the articles, watch the video tutorials, get informed about ABP’s development progress and ABP-related events, help other developers and share your expertise with the ABP community." + "Index_Page_CommunityIntroduction": "This is a hub for ABP Framework, .NET and software development. You can read the articles, watch the video tutorials, get informed about ABP’s development progress and ABP-related events, help other developers and share your expertise with the ABP community.", + "TagsInArticle": "Tags in article" } } From ecd140a35f583e42f703568542beed1c88c95c98 Mon Sep 17 00:00:00 2001 From: malik masis Date: Fri, 22 Jul 2022 15:32:23 +0300 Subject: [PATCH 18/84] Moved PageDto from public to common --- .../Volo/CmsKit/Contents}/PageDto.cs | 11 +++++------ .../Volo/CmsKit/Public/Pages/IPagePublicAppService.cs | 1 + .../Public/PublicApplicationAutoMapperProfile.cs | 2 +- .../Volo/CmsKit/Public/Pages/PagesPublicController.cs | 1 + .../Pages/Public/CmsKit/Pages/Index.cshtml.cs | 1 + 5 files changed, 9 insertions(+), 7 deletions(-) rename modules/cms-kit/src/{Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Pages => Volo.CmsKit.Common.Application.Contracts/Volo/CmsKit/Contents}/PageDto.cs (74%) 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.Common.Application.Contracts/Volo/CmsKit/Contents/PageDto.cs similarity index 74% rename from modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Pages/PageDto.cs rename to modules/cms-kit/src/Volo.CmsKit.Common.Application.Contracts/Volo/CmsKit/Contents/PageDto.cs index a336844289..996a867fcf 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Pages/PageDto.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Common.Application.Contracts/Volo/CmsKit/Contents/PageDto.cs @@ -1,9 +1,8 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; +using System; using Volo.Abp.Application.Dtos; -using Volo.CmsKit.Contents; -namespace Volo.CmsKit.Public.Pages; +namespace Volo.CmsKit.Contents; [Serializable] public class PageDto : EntityDto @@ -13,10 +12,10 @@ public class PageDto : EntityDto public string Slug { get; set; } public string Content { get; set; } - + public List ContentFragments { get; set; } public string Script { get; set; } public string Style { get; set; } -} +} \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Pages/IPagePublicAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Pages/IPagePublicAppService.cs index 0b33a91236..230b8ded97 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Pages/IPagePublicAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Pages/IPagePublicAppService.cs @@ -1,6 +1,7 @@ using JetBrains.Annotations; using System.Threading.Tasks; using Volo.Abp.Application.Services; +using Volo.CmsKit.Contents; namespace Volo.CmsKit.Public.Pages; diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/PublicApplicationAutoMapperProfile.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/PublicApplicationAutoMapperProfile.cs index 704a03778c..fbd33195f6 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/PublicApplicationAutoMapperProfile.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/PublicApplicationAutoMapperProfile.cs @@ -2,13 +2,13 @@ using Volo.Abp.AutoMapper; using Volo.CmsKit.Blogs; using Volo.CmsKit.Comments; +using Volo.CmsKit.Contents; using Volo.CmsKit.GlobalResources; using Volo.CmsKit.Menus; using Volo.CmsKit.Pages; using Volo.CmsKit.Public.Blogs; using Volo.CmsKit.Public.Comments; using Volo.CmsKit.Public.GlobalResources; -using Volo.CmsKit.Public.Pages; using Volo.CmsKit.Public.Ratings; using Volo.CmsKit.Ratings; using Volo.CmsKit.Users; diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Pages/PagesPublicController.cs b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Pages/PagesPublicController.cs index 763fe7522d..cd65f84c26 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Pages/PagesPublicController.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Pages/PagesPublicController.cs @@ -2,6 +2,7 @@ using Microsoft.AspNetCore.Mvc; using Volo.Abp; using Volo.Abp.GlobalFeatures; +using Volo.CmsKit.Contents; using Volo.CmsKit.GlobalFeatures; namespace Volo.CmsKit.Public.Pages; diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Pages/Index.cshtml.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Pages/Index.cshtml.cs index 2ade3faee1..7ae92d7016 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Pages/Index.cshtml.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Pages/Index.cshtml.cs @@ -1,5 +1,6 @@ using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; +using Volo.CmsKit.Contents; using Volo.CmsKit.Public.Pages; using Volo.CmsKit.Web.Pages; From e1b5409bbf4ff1249039fd2db3267bd2291e7e74 Mon Sep 17 00:00:00 2001 From: malik masis Date: Fri, 22 Jul 2022 15:33:31 +0300 Subject: [PATCH 19/84] Copied render from public to common --- .../Renderers/IMarkdownToHtmlRenderer.cs | 8 ++ .../Renderers/MarkdownToHtmlRenderer.cs | 129 ++++++++++++++++++ .../Volo.CmsKit.Common.Web.csproj | 62 +++++---- 3 files changed, 169 insertions(+), 30 deletions(-) create mode 100644 modules/cms-kit/src/Volo.CmsKit.Common.Web/Renderers/IMarkdownToHtmlRenderer.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Common.Web/Renderers/MarkdownToHtmlRenderer.cs diff --git a/modules/cms-kit/src/Volo.CmsKit.Common.Web/Renderers/IMarkdownToHtmlRenderer.cs b/modules/cms-kit/src/Volo.CmsKit.Common.Web/Renderers/IMarkdownToHtmlRenderer.cs new file mode 100644 index 0000000000..98fcda1fac --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Common.Web/Renderers/IMarkdownToHtmlRenderer.cs @@ -0,0 +1,8 @@ +using System.Threading.Tasks; + +namespace Volo.CmsKit.Web.Renderers; + +public interface IMarkdownToHtmlRenderer +{ + Task RenderAsync(string rawMarkdown, bool preventXSS = true); +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Common.Web/Renderers/MarkdownToHtmlRenderer.cs b/modules/cms-kit/src/Volo.CmsKit.Common.Web/Renderers/MarkdownToHtmlRenderer.cs new file mode 100644 index 0000000000..639948e801 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Common.Web/Renderers/MarkdownToHtmlRenderer.cs @@ -0,0 +1,129 @@ +using System.Collections.Generic; +using System.Linq; +using System.Text.RegularExpressions; +using Markdig; +using System.Threading.Tasks; +using System.Web; +using Volo.Abp.DependencyInjection; +using Ganss.XSS; + +namespace Volo.CmsKit.Web.Renderers; + +public class MarkdownToHtmlRenderer : IMarkdownToHtmlRenderer, ITransientDependency +{ + private readonly HtmlSanitizer _htmlSanitizer; + protected MarkdownPipeline MarkdownPipeline { get; } + + public MarkdownToHtmlRenderer(MarkdownPipeline markdownPipeline) + { + MarkdownPipeline = markdownPipeline; + _htmlSanitizer = new HtmlSanitizer(); + } + + public async Task RenderAsync(string rawMarkdown, bool preventXSS = false) + { + if (preventXSS) + { + rawMarkdown = EncodeHtmlTags(rawMarkdown, true); + } + + var html = Markdown.ToHtml(rawMarkdown, MarkdownPipeline); + + if (preventXSS) + { + html = _htmlSanitizer.Sanitize(html); + } + + return html; + } + + + private static List GetCodeBlockIndices(string markdownText) + { + var regexObj = new Regex(@"```(\w)*|`(\w)*", RegexOptions.IgnoreCase | + RegexOptions.IgnorePatternWhitespace | + RegexOptions.Singleline | + RegexOptions.Multiline | + RegexOptions.ExplicitCapture); + + var matches = regexObj.Matches(markdownText); + var indices = new List(); + + for (var i = 0; i < matches.Count; i++) + { + if (!indices.Any() || indices.Last().EndIndex.HasValue) + { + indices.Add(new CodeBlockIndexPair(matches[i].Index)); + } + else + { + indices.Last().EndIndex = matches[i].Index; + } + } + + return indices; + } + + /// + /// Encodes html tags. + /// + private static string EncodeHtmlTags(string text, bool dontEncodeCodeBlocks = true) + { + List codeBlockIndices = null; + if (dontEncodeCodeBlocks) + { + codeBlockIndices = GetCodeBlockIndices(text); + } + + return Regex.Replace(text, @"<[^>]*>", match => + { + if (dontEncodeCodeBlocks && codeBlockIndices != null) + { + var isInCodeBlock = false; + foreach (var codeBlock in codeBlockIndices) + { + if (IsInCodeBlock(match.Index, codeBlock.StartIndex, codeBlock.EndIndex)) + { + isInCodeBlock = true; + break; + } + } + + if (isInCodeBlock) + { + return match.ToString(); + } + else + { + return HttpUtility.HtmlEncode(match.ToString()); + } + } + else + { + return HttpUtility.HtmlEncode(match.ToString()); + } + }); + } + + private static bool IsInCodeBlock(int currentIndex, int codeBlockStartIndex, int? codeBlockEndIndex) + { + if (codeBlockEndIndex.HasValue) + { + return (currentIndex >= codeBlockStartIndex && currentIndex <= codeBlockEndIndex); + } + + return currentIndex >= codeBlockStartIndex; + } + + private class CodeBlockIndexPair + { + public int StartIndex { get; private set; } + public int? EndIndex { get; set; } + + public CodeBlockIndexPair(int startIndex, int? endIndex = null) + { + StartIndex = startIndex; + EndIndex = endIndex; + } + } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Common.Web/Volo.CmsKit.Common.Web.csproj b/modules/cms-kit/src/Volo.CmsKit.Common.Web/Volo.CmsKit.Common.Web.csproj index 1ca9a78b27..e717f49be5 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Common.Web/Volo.CmsKit.Common.Web.csproj +++ b/modules/cms-kit/src/Volo.CmsKit.Common.Web/Volo.CmsKit.Common.Web.csproj @@ -1,38 +1,40 @@ - - + + - - net6.0 - $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; - true - Library - Volo.CmsKit.Web - true - + + net6.0 + $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; + true + Library + Volo.CmsKit.Web + true + - - - - - + + + + + - - - + + + + + - - - - - - - - - - - - + + + + + + + + + + + + From e470faa88f1ca3a12a661be10032ee338277f073 Mon Sep 17 00:00:00 2001 From: malik masis Date: Fri, 22 Jul 2022 15:40:43 +0300 Subject: [PATCH 20/84] Updated common proxy --- .../Volo/CmsKit/Contents/ContentController.cs | 62 +++++++++++++++++-- .../client-proxies/cms-kit-common-proxy.js | 11 +++- 2 files changed, 67 insertions(+), 6 deletions(-) diff --git a/modules/cms-kit/src/Volo.CmsKit.Common.HttpApi/Volo/CmsKit/Contents/ContentController.cs b/modules/cms-kit/src/Volo.CmsKit.Common.HttpApi/Volo/CmsKit/Contents/ContentController.cs index fd7ba47a44..5b535b29f9 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Common.HttpApi/Volo/CmsKit/Contents/ContentController.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Common.HttpApi/Volo/CmsKit/Contents/ContentController.cs @@ -1,6 +1,16 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; +using System.IO; +using System.Text.Encodings.Web; using System.Threading.Tasks; +using Microsoft.AspNetCore.Html; using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.Rendering; +using Microsoft.AspNetCore.Mvc.ViewComponents; +using Microsoft.AspNetCore.Mvc.ViewEngines; +using Microsoft.AspNetCore.Mvc.ViewFeatures; +using Microsoft.AspNetCore.Mvc.ViewFeatures.Buffers; +using Microsoft.Extensions.DependencyInjection; using Volo.Abp; using Volo.Abp.GlobalFeatures; using Volo.CmsKit.GlobalFeatures; @@ -11,7 +21,7 @@ namespace Volo.CmsKit.Contents; [RemoteService(Name = CmsKitCommonRemoteServiceConsts.RemoteServiceName)] [Area(CmsKitCommonRemoteServiceConsts.ModuleName)] [Route("api/cms-kit/contents")] -public class ContentController : CmsKitControllerBase, IContentAppService +public class ContentController : Controller, IContentAppService { protected IContentAppService ContentAppService { get; } @@ -21,9 +31,53 @@ public class ContentController : CmsKitControllerBase, IContentAppService } [HttpGet] - [Route("{parse}")] - public async Task> ParseAsync(string content) + [Route("{parseashtml}")] + public async Task ParseAsHtmlAsync(string content) + { + var fragments = await ParseAsync(content); + return await RenderViewComponent("ContentFragment", new PageDto() { ContentFragments = fragments }); + } + public virtual async Task> ParseAsync(string content) { return await ContentAppService.ParseAsync(content); } + + private async Task RenderViewComponent(string viewComponent, object args) + { + var sp = HttpContext.RequestServices; + + var helper = new DefaultViewComponentHelper( + sp.GetRequiredService(), + HtmlEncoder.Default, + sp.GetRequiredService(), + sp.GetRequiredService(), + sp.GetRequiredService()); + + using (var writer = new StringWriter()) + { + var context = new ViewContext(ControllerContext, NullView.Instance, ViewData, TempData, writer, new HtmlHelperOptions()); + helper.Contextualize(context); + var result = await helper.InvokeAsync(viewComponent, args); + result.WriteTo(writer, HtmlEncoder.Default); + await writer.FlushAsync(); + return writer.ToString(); + } + } + + internal class NullView : IView + { + public static readonly NullView Instance = new(); + + public string Path => string.Empty; + + public Task RenderAsync(ViewContext context) + { + if (context == null) + { + throw new ArgumentNullException(nameof(context)); + } + + return Task.CompletedTask; + } + } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Common.Web/wwwroot/client-proxies/cms-kit-common-proxy.js b/modules/cms-kit/src/Volo.CmsKit.Common.Web/wwwroot/client-proxies/cms-kit-common-proxy.js index e7a38d5af4..f255ec9d4c 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Common.Web/wwwroot/client-proxies/cms-kit-common-proxy.js +++ b/modules/cms-kit/src/Volo.CmsKit.Common.Web/wwwroot/client-proxies/cms-kit-common-proxy.js @@ -26,10 +26,17 @@ abp.utils.createNamespace(window, 'volo.cmsKit.contents.content'); - volo.cmsKit.contents.content.parse = function(content, parse, ajaxParams) { + volo.cmsKit.contents.content.parseAsHtml = function(content, parseashtml, ajaxParams) { return abp.ajax($.extend(true, { - url: abp.appPath + 'api/cms-kit/contents/' + parse + '' + abp.utils.buildQueryString([{ name: 'content', value: content }]) + '', + url: abp.appPath + 'api/cms-kit/contents/' + parseashtml + '' + abp.utils.buildQueryString([{ name: 'content', value: content }]) + '', type: 'GET' + }, { dataType: 'text' }, ajaxParams)); + }; + + volo.cmsKit.contents.content.parse = function(content, ajaxParams) { + return abp.ajax($.extend(true, { + url: abp.appPath + 'api/cms-kit/contents' + abp.utils.buildQueryString([{ name: 'content', value: content }]) + '', + type: 'POST' }, ajaxParams)); }; From e79f9402d571e5c8ea40403795cf3785b3acae4f Mon Sep 17 00:00:00 2001 From: malik masis Date: Fri, 22 Jul 2022 15:41:37 +0300 Subject: [PATCH 21/84] Added content fragment vc --- .../Contents/ContentFragment.cshtml | 20 ++++++++++++++ .../Contents/ContentFragmentViewComponent.cs | 26 +++++++++++++++++++ 2 files changed, 46 insertions(+) create mode 100644 modules/cms-kit/src/Volo.CmsKit.Common.Web/Contents/ContentFragment.cshtml create mode 100644 modules/cms-kit/src/Volo.CmsKit.Common.Web/Contents/ContentFragmentViewComponent.cs diff --git a/modules/cms-kit/src/Volo.CmsKit.Common.Web/Contents/ContentFragment.cshtml b/modules/cms-kit/src/Volo.CmsKit.Common.Web/Contents/ContentFragment.cshtml new file mode 100644 index 0000000000..994660600a --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Common.Web/Contents/ContentFragment.cshtml @@ -0,0 +1,20 @@ +@using Volo.CmsKit.Web.Contents; +@using System.Dynamic +@using Volo.Abp.Data +@using Volo.CmsKit.Web.Renderers; + +@model ContentFragmentViewComponent + +@inject IMarkdownToHtmlRenderer MarkdownRenderer + +@foreach (var contentFragment in Model.PageDto.ContentFragments) +{ + if (contentFragment.Type == "Markdown") + { + @Html.Raw(await MarkdownRenderer.RenderAsync(contentFragment.GetProperty("Content"))) + } + else if (contentFragment.Type == "Widget") + { + @await Component.InvokeAsync(contentFragment.GetProperty("Type"), contentFragment.ExtraProperties.ConvertToDynamicObject()) + } +} \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Common.Web/Contents/ContentFragmentViewComponent.cs b/modules/cms-kit/src/Volo.CmsKit.Common.Web/Contents/ContentFragmentViewComponent.cs new file mode 100644 index 0000000000..e6b7004940 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Common.Web/Contents/ContentFragmentViewComponent.cs @@ -0,0 +1,26 @@ +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc; +using Volo.Abp.AspNetCore.Mvc.UI.Widgets; +using Volo.CmsKit.Contents; + +namespace Volo.CmsKit.Web.Contents; + +[Widget( + AutoInitialize = true +)] +[ViewComponent(Name = "ContentFragment")] +public class ContentFragmentViewComponent : ViewComponent +{ + public PageDto PageDto { get; set; } + + public ContentFragmentViewComponent() + { + PageDto = new(); + } + + public virtual async Task InvokeAsync(PageDto pageDto) + { + return View("~/Contents/ContentFragment.cshtml", new ContentFragmentViewComponent() { PageDto = pageDto }); + } +} + From 1ffed21c8001812ec6103b2285c583ddbef31bc6 Mon Sep 17 00:00:00 2001 From: malik masis Date: Fri, 22 Jul 2022 15:42:30 +0300 Subject: [PATCH 22/84] Implemented content fragment vc for Page/Create --- .../Pages/CmsKit/Pages/create.js | 14 ++++++++++++-- .../Pages/Public/CmsKit/Pages/Index.cshtml | 18 +----------------- 2 files changed, 13 insertions(+), 19 deletions(-) diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/create.js b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/create.js index 46c5fa9e77..62d05abd4d 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/create.js +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/create.js @@ -1,6 +1,6 @@ $(function () { var l = abp.localization.getResource("CmsKit"); - + var $createForm = $('#form-page-create'); var $title = $('#ViewModel_Title'); var $slug = $('#ViewModel_Slug'); @@ -173,7 +173,17 @@ $(function () { $('.tab-item').on('click', function () { if ($(this).attr("aria-label") == 'Preview' && editor.isMarkdownMode()) { - editor.setMarkdown(editor.getMarkdown(), true); + + let content = editor.getMarkdown(); + localStorage.setItem('content', content); + + volo.cmsKit.contents.content.parseAsHtml(content).then(function (data) { + editor.setHTML(data); + }); + } + else if ($(this).attr("aria-label") == 'Write'){ + var retrievedObject = localStorage.getItem('content'); + editor.setMarkdown(retrievedObject); } }); diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Pages/Index.cshtml b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Pages/Index.cshtml index 2aa3c0ce8b..cc72b8b0c8 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Pages/Index.cshtml +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Pages/Index.cshtml @@ -2,17 +2,12 @@ @addTagHelper *, Volo.Abp.AspNetCore.Mvc.UI.Bootstrap @using Volo.CmsKit.Contents @using System.Dynamic -@using Volo.CmsKit.Public.Web.Renderers @using Volo.Abp.Data @using Volo.Abp.AspNetCore.Mvc.UI.Packages.HighlightJs; @using Volo.Abp.AspNetCore.Mvc.UI.Widgets; -@inject IMarkdownToHtmlRenderer MarkdownRenderer - - @model Volo.CmsKit.Public.Web.Pages.Public.CmsKit.Pages.IndexModel - @section styles{ @@ -30,18 +25,7 @@ - @foreach (ContentFragment contentFragment in Model.PageDto.ContentFragments) - { - if (contentFragment.Type == ContentConsts.Markdown) - { - @Html.Raw(await MarkdownRenderer.RenderAsync(contentFragment.GetProperty("Content"))) - } - else if (contentFragment.Type == ContentConsts.Widget) - { - @await Component.InvokeAsync(contentFragment.GetProperty("Type"), contentFragment.ExtraProperties.ConvertToDynamicObject()) - } - - } + @await Component.InvokeAsync("ContentFragment", new { pageDto = Model.PageDto }) From f19853315756a00fd6bef8b1e41b0dedd7004060 Mon Sep 17 00:00:00 2001 From: Salih Date: Fri, 22 Jul 2022 17:20:03 +0300 Subject: [PATCH 23/84] Update zh-Hans.json --- .../AbpIoLocalization/Base/Localization/Resources/zh-Hans.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/zh-Hans.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/zh-Hans.json index 11e780627e..c4aa5f4926 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/zh-Hans.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/zh-Hans.json @@ -162,7 +162,7 @@ "Error_Page_500_Description_1": "我们会自动跟踪这些错误,但如果问题仍然存在,请随时
联系我们。 与此同时,尝试刷新。", "Error_Page_500_Description_2": "通过 info@abp.io 与我们联系。", "Books": "书籍", - "BuyAndGetMonths": "购买 12 个月,获得 14 个月!", + "BuyAndGetMonths": "购买 12 个月,获得 14 个月!", "GetYourDeal": "得到你的交易", "BuyOrRenewLicense": "立即购买或续订许可证并额外获得 2 个月!", "BuyOrRenewLicenseToGetExtra2Months": "立即购买或续订 ABP 商业许可证(适用于所有版本)并额外获得 2 个月!", From e0b7e7bd1085740166ed325d7e3742170a13afbb Mon Sep 17 00:00:00 2001 From: maliming Date: Mon, 25 Jul 2022 10:40:13 +0800 Subject: [PATCH 24/84] Remove the setter from the auditing interfaces. Resolve #12229 --- .../Volo/Abp/Auditing/IDeletionAuditedObject.cs | 4 ++-- .../Volo/Abp/Auditing/IHasDeletionTime.cs | 2 +- .../Volo/Abp/Auditing/IHasModificationTime.cs | 2 +- .../Abp/Auditing/IModificationAuditedObject.cs | 4 ++-- .../Volo/Abp/Auditing/AuditPropertySetter.cs | 16 ++++++++-------- .../src/Volo.Abp.Core/Volo/Abp/ISoftDelete.cs | 4 ++-- .../Volo/Abp/EntityFrameworkCore/AbpDbContext.cs | 2 +- .../Repositories/MemoryDb/MemoryDbRepository.cs | 2 +- .../Repositories/MongoDB/MongoDbRepository.cs | 5 ++--- 9 files changed, 20 insertions(+), 21 deletions(-) diff --git a/framework/src/Volo.Abp.Auditing.Contracts/Volo/Abp/Auditing/IDeletionAuditedObject.cs b/framework/src/Volo.Abp.Auditing.Contracts/Volo/Abp/Auditing/IDeletionAuditedObject.cs index be59ea0431..a7be0c29a1 100644 --- a/framework/src/Volo.Abp.Auditing.Contracts/Volo/Abp/Auditing/IDeletionAuditedObject.cs +++ b/framework/src/Volo.Abp.Auditing.Contracts/Volo/Abp/Auditing/IDeletionAuditedObject.cs @@ -10,7 +10,7 @@ public interface IDeletionAuditedObject : IHasDeletionTime /// /// Id of the deleter user. /// - Guid? DeleterId { get; set; } + Guid? DeleterId { get; } } /// @@ -22,5 +22,5 @@ public interface IDeletionAuditedObject : IDeletionAuditedObject /// /// Reference to the deleter user. /// - TUser Deleter { get; set; } + TUser Deleter { get; } } diff --git a/framework/src/Volo.Abp.Auditing.Contracts/Volo/Abp/Auditing/IHasDeletionTime.cs b/framework/src/Volo.Abp.Auditing.Contracts/Volo/Abp/Auditing/IHasDeletionTime.cs index a84fc78c41..ef45b1b057 100644 --- a/framework/src/Volo.Abp.Auditing.Contracts/Volo/Abp/Auditing/IHasDeletionTime.cs +++ b/framework/src/Volo.Abp.Auditing.Contracts/Volo/Abp/Auditing/IHasDeletionTime.cs @@ -11,5 +11,5 @@ public interface IHasDeletionTime : ISoftDelete /// /// Deletion time. /// - DateTime? DeletionTime { get; set; } + DateTime? DeletionTime { get; } } diff --git a/framework/src/Volo.Abp.Auditing.Contracts/Volo/Abp/Auditing/IHasModificationTime.cs b/framework/src/Volo.Abp.Auditing.Contracts/Volo/Abp/Auditing/IHasModificationTime.cs index b7b7494081..001d07d617 100644 --- a/framework/src/Volo.Abp.Auditing.Contracts/Volo/Abp/Auditing/IHasModificationTime.cs +++ b/framework/src/Volo.Abp.Auditing.Contracts/Volo/Abp/Auditing/IHasModificationTime.cs @@ -10,5 +10,5 @@ public interface IHasModificationTime /// /// The last modified time for this entity. /// - DateTime? LastModificationTime { get; set; } + DateTime? LastModificationTime { get; } } diff --git a/framework/src/Volo.Abp.Auditing.Contracts/Volo/Abp/Auditing/IModificationAuditedObject.cs b/framework/src/Volo.Abp.Auditing.Contracts/Volo/Abp/Auditing/IModificationAuditedObject.cs index 5ba4fd1e02..48f26b6299 100644 --- a/framework/src/Volo.Abp.Auditing.Contracts/Volo/Abp/Auditing/IModificationAuditedObject.cs +++ b/framework/src/Volo.Abp.Auditing.Contracts/Volo/Abp/Auditing/IModificationAuditedObject.cs @@ -10,7 +10,7 @@ public interface IModificationAuditedObject : IHasModificationTime /// /// Last modifier user for this entity. /// - Guid? LastModifierId { get; set; } + Guid? LastModifierId { get; } } /// @@ -22,5 +22,5 @@ public interface IModificationAuditedObject : IModificationAuditedObject /// /// Reference to the last modifier user of this entity. /// - TUser LastModifier { get; set; } + TUser LastModifier { get; } } diff --git a/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AuditPropertySetter.cs b/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AuditPropertySetter.cs index d85bad82eb..16632420d7 100644 --- a/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AuditPropertySetter.cs +++ b/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AuditPropertySetter.cs @@ -99,7 +99,7 @@ public class AuditPropertySetter : IAuditPropertySetter, ITransientDependency { if (targetObject is IHasModificationTime objectWithModificationTime) { - objectWithModificationTime.LastModificationTime = Clock.Now; + ObjectHelper.TrySetProperty(objectWithModificationTime, x => x.LastModificationTime, () => Clock.Now); } } @@ -112,7 +112,7 @@ public class AuditPropertySetter : IAuditPropertySetter, ITransientDependency if (!CurrentUser.Id.HasValue) { - modificationAuditedObject.LastModifierId = null; + ObjectHelper.TrySetProperty(modificationAuditedObject, x => x.LastModifierId, () => null); return; } @@ -120,7 +120,7 @@ public class AuditPropertySetter : IAuditPropertySetter, ITransientDependency { if (multiTenantEntity.TenantId != CurrentUser.TenantId) { - modificationAuditedObject.LastModifierId = null; + ObjectHelper.TrySetProperty(modificationAuditedObject, x => x.LastModifierId, () => null); return; } } @@ -134,7 +134,7 @@ public class AuditPropertySetter : IAuditPropertySetter, ITransientDependency } */ - modificationAuditedObject.LastModifierId = CurrentUser.Id; + ObjectHelper.TrySetProperty(modificationAuditedObject, x => x.LastModifierId, () => CurrentUser.Id); } protected virtual void SetDeletionTime(object targetObject) @@ -143,7 +143,7 @@ public class AuditPropertySetter : IAuditPropertySetter, ITransientDependency { if (objectWithDeletionTime.DeletionTime == null) { - objectWithDeletionTime.DeletionTime = Clock.Now; + ObjectHelper.TrySetProperty(objectWithDeletionTime, x => x.DeletionTime, () => Clock.Now); } } } @@ -162,7 +162,7 @@ public class AuditPropertySetter : IAuditPropertySetter, ITransientDependency if (!CurrentUser.Id.HasValue) { - deletionAuditedObject.DeleterId = null; + ObjectHelper.TrySetProperty(deletionAuditedObject, x => x.DeleterId, () => null); return; } @@ -170,11 +170,11 @@ public class AuditPropertySetter : IAuditPropertySetter, ITransientDependency { if (multiTenantEntity.TenantId != CurrentUser.TenantId) { - deletionAuditedObject.DeleterId = null; + ObjectHelper.TrySetProperty(deletionAuditedObject, x => x.DeleterId, () => null); return; } } - deletionAuditedObject.DeleterId = CurrentUser.Id; + ObjectHelper.TrySetProperty(deletionAuditedObject, x => x.DeleterId, () => CurrentUser.Id); } } diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/ISoftDelete.cs b/framework/src/Volo.Abp.Core/Volo/Abp/ISoftDelete.cs index 1d7ba66d81..704dd3ba11 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/ISoftDelete.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/ISoftDelete.cs @@ -9,7 +9,7 @@ public interface ISoftDelete { /// - /// Used to mark an Entity as 'Deleted'. + /// Used to mark an Entity as 'Deleted'. /// - bool IsDeleted { get; set; } + bool IsDeleted { get; } } diff --git a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpDbContext.cs b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpDbContext.cs index 1f55bce770..3a8a24bf62 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpDbContext.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpDbContext.cs @@ -485,7 +485,7 @@ public abstract class AbpDbContext : DbContext, IAbpEfCoreDbContext, } entry.Reload(); - entry.Entity.As().IsDeleted = true; + ObjectHelper.TrySetProperty(entry.Entity.As(), x => x.IsDeleted, () => true); SetDeletionAuditProperties(entry); } diff --git a/framework/src/Volo.Abp.MemoryDb/Volo/Abp/Domain/Repositories/MemoryDb/MemoryDbRepository.cs b/framework/src/Volo.Abp.MemoryDb/Volo/Abp/Domain/Repositories/MemoryDb/MemoryDbRepository.cs index 4180121a9f..2bcfc1bad7 100644 --- a/framework/src/Volo.Abp.MemoryDb/Volo/Abp/Domain/Repositories/MemoryDb/MemoryDbRepository.cs +++ b/framework/src/Volo.Abp.MemoryDb/Volo/Abp/Domain/Repositories/MemoryDb/MemoryDbRepository.cs @@ -253,7 +253,7 @@ public class MemoryDbRepository : RepositoryBase x.IsDeleted, () => true); (await GetCollectionAsync()).Update(entity); } else diff --git a/framework/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/MongoDbRepository.cs b/framework/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/MongoDbRepository.cs index 0485dd74bc..25f6ce2f3f 100644 --- a/framework/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/MongoDbRepository.cs +++ b/framework/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/MongoDbRepository.cs @@ -294,7 +294,7 @@ public class MongoDbRepository if (typeof(ISoftDelete).IsAssignableFrom(typeof(TEntity)) && !IsHardDeleted(entity)) { - ((ISoftDelete)entity).IsDeleted = true; + ObjectHelper.TrySetProperty(((ISoftDelete)entity), x => x.IsDeleted, () => true); ApplyAbpConceptsForDeletedEntity(entity); ReplaceOneResult result; @@ -365,8 +365,7 @@ public class MongoDbRepository { if (typeof(ISoftDelete).IsAssignableFrom(typeof(TEntity)) && !IsHardDeleted(entity)) { - ((ISoftDelete)entity).IsDeleted = true; - + ObjectHelper.TrySetProperty(((ISoftDelete)entity), x => x.IsDeleted, () => true); softDeletedEntities.Add(entity, SetNewConcurrencyStamp(entity)); } else From f472d0e48da7649b9febd81e06f3f7a9c10e299e Mon Sep 17 00:00:00 2001 From: maliming Date: Mon, 25 Jul 2022 11:19:31 +0800 Subject: [PATCH 25/84] Add `Abp` prefix to `DbProperties` classes --- .../BackgroundJobsDbProperties.cs | 2 +- .../BackgroundJobsDbContext.cs | 2 +- ...undJobsDbContextModelCreatingExtensions.cs | 2 +- .../IBackgroundJobsDbContext.cs | 2 +- .../MongoDB/BackgroundJobsMongoDbContext.cs | 2 +- .../BackgroundJobsMongoDbContextExtensions.cs | 2 +- .../MongoDB/IBackgroundJobsMongoDbContext.cs | 2 +- .../BlobStoringDatabaseDbProperties.cs | 2 +- .../BlobStoringDbContext.cs | 2 +- ...StoringDbContextModelCreatingExtensions.cs | 4 +-- .../IBlobStoringDbContext.cs | 2 +- .../MongoDB/BlobStoringMongoDbContext.cs | 2 +- .../BlobStoringMongoDbContextExtensions.cs | 4 +-- .../MongoDB/IBlobStoringMongoDbContext.cs | 2 +- .../Volo/Blogging/BloggingDbProperties.cs | 2 +- .../EntityFrameworkCore/BloggingDbContext.cs | 2 +- ...BloggingDbContextModelBuilderExtensions.cs | 12 ++++----- .../EntityFrameworkCore/IBloggingDbContext.cs | 2 +- .../MongoDB/BloggingMongoDbContext.cs | 2 +- .../BloggingMongoDbContextExtensions.cs | 10 +++---- .../MongoDB/IBloggingMongoDbContext.cs | 2 +- .../Volo/CmsKit/CmsKitDbProperties.cs | 2 +- .../EntityFrameworkCore/CmsKitDbContext.cs | 2 +- .../CmsKitDbContextModelCreatingExtensions.cs | 26 +++++++++---------- .../EntityFrameworkCore/ICmsKitDbContext.cs | 2 +- .../CmsKit/MongoDB/CmsKitMongoDbContext.cs | 2 +- .../MongoDB/CmsKitMongoDbContextExtensions.cs | 26 +++++++++---------- .../CmsKit/MongoDB/ICmsKitMongoDbContext.cs | 2 +- .../Volo/Docs/DocsDbProperties.cs | 2 +- .../Docs/EntityFrameworkCore/DocsDbContext.cs | 2 +- .../DocsDbContextModelBuilderExtensions.cs | 6 ++--- .../EntityFrameworkCore/IDocsDbContext.cs | 2 +- .../Volo/Docs/MongoDB/DocsMongoDbContext.cs | 2 +- .../MongoDB/DocsMongoDbContextExtensions.cs | 4 +-- .../Volo/Docs/MongoDB/IDocsMongoDbContext.cs | 2 +- .../FeatureManagementDbProperties.cs | 2 +- .../FeatureManagementDbContext.cs | 2 +- ...agementDbContextModelCreatingExtensions.cs | 2 +- .../IFeatureManagementDbContext.cs | 2 +- .../FeatureManagementMongoDbContext.cs | 2 +- ...atureManagementMongoDbContextExtensions.cs | 2 +- .../IFeatureManagementMongoDbContext.cs | 2 +- 42 files changed, 80 insertions(+), 80 deletions(-) diff --git a/modules/background-jobs/src/Volo.Abp.BackgroundJobs.Domain/Volo/Abp/BackgroundJobs/BackgroundJobsDbProperties.cs b/modules/background-jobs/src/Volo.Abp.BackgroundJobs.Domain/Volo/Abp/BackgroundJobs/BackgroundJobsDbProperties.cs index 401aa379a7..85e44815a2 100644 --- a/modules/background-jobs/src/Volo.Abp.BackgroundJobs.Domain/Volo/Abp/BackgroundJobs/BackgroundJobsDbProperties.cs +++ b/modules/background-jobs/src/Volo.Abp.BackgroundJobs.Domain/Volo/Abp/BackgroundJobs/BackgroundJobsDbProperties.cs @@ -2,7 +2,7 @@ namespace Volo.Abp.BackgroundJobs; -public static class BackgroundJobsDbProperties +public static class AbpBackgroundJobsDbProperties { public static string DbTablePrefix { get; set; } = AbpCommonDbProperties.DbTablePrefix; diff --git a/modules/background-jobs/src/Volo.Abp.BackgroundJobs.EntityFrameworkCore/Volo/Abp/BackgroundJobs/EntityFrameworkCore/BackgroundJobsDbContext.cs b/modules/background-jobs/src/Volo.Abp.BackgroundJobs.EntityFrameworkCore/Volo/Abp/BackgroundJobs/EntityFrameworkCore/BackgroundJobsDbContext.cs index fb01736cfa..0beef8d3ea 100644 --- a/modules/background-jobs/src/Volo.Abp.BackgroundJobs.EntityFrameworkCore/Volo/Abp/BackgroundJobs/EntityFrameworkCore/BackgroundJobsDbContext.cs +++ b/modules/background-jobs/src/Volo.Abp.BackgroundJobs.EntityFrameworkCore/Volo/Abp/BackgroundJobs/EntityFrameworkCore/BackgroundJobsDbContext.cs @@ -6,7 +6,7 @@ using Volo.Abp.MultiTenancy; namespace Volo.Abp.BackgroundJobs.EntityFrameworkCore; [IgnoreMultiTenancy] -[ConnectionStringName(BackgroundJobsDbProperties.ConnectionStringName)] +[ConnectionStringName(AbpBackgroundJobsDbProperties.ConnectionStringName)] public class BackgroundJobsDbContext : AbpDbContext, IBackgroundJobsDbContext { public DbSet BackgroundJobs { get; set; } diff --git a/modules/background-jobs/src/Volo.Abp.BackgroundJobs.EntityFrameworkCore/Volo/Abp/BackgroundJobs/EntityFrameworkCore/BackgroundJobsDbContextModelCreatingExtensions.cs b/modules/background-jobs/src/Volo.Abp.BackgroundJobs.EntityFrameworkCore/Volo/Abp/BackgroundJobs/EntityFrameworkCore/BackgroundJobsDbContextModelCreatingExtensions.cs index bf9f8d5ea3..849ac3c5d5 100644 --- a/modules/background-jobs/src/Volo.Abp.BackgroundJobs.EntityFrameworkCore/Volo/Abp/BackgroundJobs/EntityFrameworkCore/BackgroundJobsDbContextModelCreatingExtensions.cs +++ b/modules/background-jobs/src/Volo.Abp.BackgroundJobs.EntityFrameworkCore/Volo/Abp/BackgroundJobs/EntityFrameworkCore/BackgroundJobsDbContextModelCreatingExtensions.cs @@ -18,7 +18,7 @@ public static class BackgroundJobsDbContextModelCreatingExtensions builder.Entity(b => { - b.ToTable(BackgroundJobsDbProperties.DbTablePrefix + "BackgroundJobs", BackgroundJobsDbProperties.DbSchema); + b.ToTable(AbpBackgroundJobsDbProperties.DbTablePrefix + "BackgroundJobs", AbpBackgroundJobsDbProperties.DbSchema); b.ConfigureByConvention(); diff --git a/modules/background-jobs/src/Volo.Abp.BackgroundJobs.EntityFrameworkCore/Volo/Abp/BackgroundJobs/EntityFrameworkCore/IBackgroundJobsDbContext.cs b/modules/background-jobs/src/Volo.Abp.BackgroundJobs.EntityFrameworkCore/Volo/Abp/BackgroundJobs/EntityFrameworkCore/IBackgroundJobsDbContext.cs index b091ac126a..a6276e37f8 100644 --- a/modules/background-jobs/src/Volo.Abp.BackgroundJobs.EntityFrameworkCore/Volo/Abp/BackgroundJobs/EntityFrameworkCore/IBackgroundJobsDbContext.cs +++ b/modules/background-jobs/src/Volo.Abp.BackgroundJobs.EntityFrameworkCore/Volo/Abp/BackgroundJobs/EntityFrameworkCore/IBackgroundJobsDbContext.cs @@ -6,7 +6,7 @@ using Volo.Abp.MultiTenancy; namespace Volo.Abp.BackgroundJobs.EntityFrameworkCore; [IgnoreMultiTenancy] -[ConnectionStringName(BackgroundJobsDbProperties.ConnectionStringName)] +[ConnectionStringName(AbpBackgroundJobsDbProperties.ConnectionStringName)] public interface IBackgroundJobsDbContext : IEfCoreDbContext { DbSet BackgroundJobs { get; } diff --git a/modules/background-jobs/src/Volo.Abp.BackgroundJobs.MongoDB/Volo/Abp/BackgroundJobs/MongoDB/BackgroundJobsMongoDbContext.cs b/modules/background-jobs/src/Volo.Abp.BackgroundJobs.MongoDB/Volo/Abp/BackgroundJobs/MongoDB/BackgroundJobsMongoDbContext.cs index 42b8a44f0d..8a94e26650 100644 --- a/modules/background-jobs/src/Volo.Abp.BackgroundJobs.MongoDB/Volo/Abp/BackgroundJobs/MongoDB/BackgroundJobsMongoDbContext.cs +++ b/modules/background-jobs/src/Volo.Abp.BackgroundJobs.MongoDB/Volo/Abp/BackgroundJobs/MongoDB/BackgroundJobsMongoDbContext.cs @@ -6,7 +6,7 @@ using Volo.Abp.MultiTenancy; namespace Volo.Abp.BackgroundJobs.MongoDB; [IgnoreMultiTenancy] -[ConnectionStringName(BackgroundJobsDbProperties.ConnectionStringName)] +[ConnectionStringName(AbpBackgroundJobsDbProperties.ConnectionStringName)] public class BackgroundJobsMongoDbContext : AbpMongoDbContext, IBackgroundJobsMongoDbContext { public IMongoCollection BackgroundJobs { get; set; } diff --git a/modules/background-jobs/src/Volo.Abp.BackgroundJobs.MongoDB/Volo/Abp/BackgroundJobs/MongoDB/BackgroundJobsMongoDbContextExtensions.cs b/modules/background-jobs/src/Volo.Abp.BackgroundJobs.MongoDB/Volo/Abp/BackgroundJobs/MongoDB/BackgroundJobsMongoDbContextExtensions.cs index b687bf8f90..a4f255c724 100644 --- a/modules/background-jobs/src/Volo.Abp.BackgroundJobs.MongoDB/Volo/Abp/BackgroundJobs/MongoDB/BackgroundJobsMongoDbContextExtensions.cs +++ b/modules/background-jobs/src/Volo.Abp.BackgroundJobs.MongoDB/Volo/Abp/BackgroundJobs/MongoDB/BackgroundJobsMongoDbContextExtensions.cs @@ -11,7 +11,7 @@ public static class BackgroundJobsMongoDbContextExtensions builder.Entity(b => { - b.CollectionName = BackgroundJobsDbProperties.DbTablePrefix + "BackgroundJobs"; + b.CollectionName = AbpBackgroundJobsDbProperties.DbTablePrefix + "BackgroundJobs"; }); } } diff --git a/modules/background-jobs/src/Volo.Abp.BackgroundJobs.MongoDB/Volo/Abp/BackgroundJobs/MongoDB/IBackgroundJobsMongoDbContext.cs b/modules/background-jobs/src/Volo.Abp.BackgroundJobs.MongoDB/Volo/Abp/BackgroundJobs/MongoDB/IBackgroundJobsMongoDbContext.cs index 4f93e1cbe5..d8a94b740d 100644 --- a/modules/background-jobs/src/Volo.Abp.BackgroundJobs.MongoDB/Volo/Abp/BackgroundJobs/MongoDB/IBackgroundJobsMongoDbContext.cs +++ b/modules/background-jobs/src/Volo.Abp.BackgroundJobs.MongoDB/Volo/Abp/BackgroundJobs/MongoDB/IBackgroundJobsMongoDbContext.cs @@ -6,7 +6,7 @@ using Volo.Abp.MultiTenancy; namespace Volo.Abp.BackgroundJobs.MongoDB; [IgnoreMultiTenancy] -[ConnectionStringName(BackgroundJobsDbProperties.ConnectionStringName)] +[ConnectionStringName(AbpBackgroundJobsDbProperties.ConnectionStringName)] public interface IBackgroundJobsMongoDbContext : IAbpMongoDbContext { IMongoCollection BackgroundJobs { get; } diff --git a/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Domain/Volo/Abp/BlobStoring/Database/BlobStoringDatabaseDbProperties.cs b/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Domain/Volo/Abp/BlobStoring/Database/BlobStoringDatabaseDbProperties.cs index a9689eb9fd..19985351de 100644 --- a/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Domain/Volo/Abp/BlobStoring/Database/BlobStoringDatabaseDbProperties.cs +++ b/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Domain/Volo/Abp/BlobStoring/Database/BlobStoringDatabaseDbProperties.cs @@ -2,7 +2,7 @@ namespace Volo.Abp.BlobStoring.Database; -public static class BlobStoringDatabaseDbProperties +public static class AbpBlobStoringDatabaseDbProperties { public static string DbTablePrefix { get; set; } = AbpCommonDbProperties.DbTablePrefix; diff --git a/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.EntityFrameworkCore/Volo/Abp/BlobStoring/Database/EntityFrameworkCore/BlobStoringDbContext.cs b/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.EntityFrameworkCore/Volo/Abp/BlobStoring/Database/EntityFrameworkCore/BlobStoringDbContext.cs index b20f5190c4..f3e7661366 100644 --- a/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.EntityFrameworkCore/Volo/Abp/BlobStoring/Database/EntityFrameworkCore/BlobStoringDbContext.cs +++ b/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.EntityFrameworkCore/Volo/Abp/BlobStoring/Database/EntityFrameworkCore/BlobStoringDbContext.cs @@ -4,7 +4,7 @@ using Volo.Abp.EntityFrameworkCore; namespace Volo.Abp.BlobStoring.Database.EntityFrameworkCore; -[ConnectionStringName(BlobStoringDatabaseDbProperties.ConnectionStringName)] +[ConnectionStringName(AbpBlobStoringDatabaseDbProperties.ConnectionStringName)] public class BlobStoringDbContext : AbpDbContext, IBlobStoringDbContext { public DbSet BlobContainers { get; set; } diff --git a/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.EntityFrameworkCore/Volo/Abp/BlobStoring/Database/EntityFrameworkCore/BlobStoringDbContextModelCreatingExtensions.cs b/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.EntityFrameworkCore/Volo/Abp/BlobStoring/Database/EntityFrameworkCore/BlobStoringDbContextModelCreatingExtensions.cs index e4fad62e37..6be009f3ec 100644 --- a/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.EntityFrameworkCore/Volo/Abp/BlobStoring/Database/EntityFrameworkCore/BlobStoringDbContextModelCreatingExtensions.cs +++ b/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.EntityFrameworkCore/Volo/Abp/BlobStoring/Database/EntityFrameworkCore/BlobStoringDbContextModelCreatingExtensions.cs @@ -12,7 +12,7 @@ public static class BlobStoringDbContextModelCreatingExtensions builder.Entity(b => { - b.ToTable(BlobStoringDatabaseDbProperties.DbTablePrefix + "BlobContainers", BlobStoringDatabaseDbProperties.DbSchema); + b.ToTable(AbpBlobStoringDatabaseDbProperties.DbTablePrefix + "BlobContainers", AbpBlobStoringDatabaseDbProperties.DbSchema); b.ConfigureByConvention(); @@ -27,7 +27,7 @@ public static class BlobStoringDbContextModelCreatingExtensions builder.Entity(b => { - b.ToTable(BlobStoringDatabaseDbProperties.DbTablePrefix + "Blobs", BlobStoringDatabaseDbProperties.DbSchema); + b.ToTable(AbpBlobStoringDatabaseDbProperties.DbTablePrefix + "Blobs", AbpBlobStoringDatabaseDbProperties.DbSchema); b.ConfigureByConvention(); diff --git a/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.EntityFrameworkCore/Volo/Abp/BlobStoring/Database/EntityFrameworkCore/IBlobStoringDbContext.cs b/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.EntityFrameworkCore/Volo/Abp/BlobStoring/Database/EntityFrameworkCore/IBlobStoringDbContext.cs index b36c0753d3..b139d8473b 100644 --- a/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.EntityFrameworkCore/Volo/Abp/BlobStoring/Database/EntityFrameworkCore/IBlobStoringDbContext.cs +++ b/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.EntityFrameworkCore/Volo/Abp/BlobStoring/Database/EntityFrameworkCore/IBlobStoringDbContext.cs @@ -4,7 +4,7 @@ using Volo.Abp.EntityFrameworkCore; namespace Volo.Abp.BlobStoring.Database.EntityFrameworkCore; -[ConnectionStringName(BlobStoringDatabaseDbProperties.ConnectionStringName)] +[ConnectionStringName(AbpBlobStoringDatabaseDbProperties.ConnectionStringName)] public interface IBlobStoringDbContext : IEfCoreDbContext { DbSet BlobContainers { get; } diff --git a/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.MongoDB/Volo/Abp/BlobStoring/Database/MongoDB/BlobStoringMongoDbContext.cs b/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.MongoDB/Volo/Abp/BlobStoring/Database/MongoDB/BlobStoringMongoDbContext.cs index d0be5f4973..108804fbb9 100644 --- a/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.MongoDB/Volo/Abp/BlobStoring/Database/MongoDB/BlobStoringMongoDbContext.cs +++ b/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.MongoDB/Volo/Abp/BlobStoring/Database/MongoDB/BlobStoringMongoDbContext.cs @@ -4,7 +4,7 @@ using Volo.Abp.MongoDB; namespace Volo.Abp.BlobStoring.Database.MongoDB; -[ConnectionStringName(BlobStoringDatabaseDbProperties.ConnectionStringName)] +[ConnectionStringName(AbpBlobStoringDatabaseDbProperties.ConnectionStringName)] public class BlobStoringMongoDbContext : AbpMongoDbContext, IBlobStoringMongoDbContext { public IMongoCollection BlobContainers => Collection(); diff --git a/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.MongoDB/Volo/Abp/BlobStoring/Database/MongoDB/BlobStoringMongoDbContextExtensions.cs b/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.MongoDB/Volo/Abp/BlobStoring/Database/MongoDB/BlobStoringMongoDbContextExtensions.cs index 7943215534..28c3bdde7f 100644 --- a/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.MongoDB/Volo/Abp/BlobStoring/Database/MongoDB/BlobStoringMongoDbContextExtensions.cs +++ b/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.MongoDB/Volo/Abp/BlobStoring/Database/MongoDB/BlobStoringMongoDbContextExtensions.cs @@ -11,12 +11,12 @@ public static class BlobStoringMongoDbContextExtensions builder.Entity(b => { - b.CollectionName = BlobStoringDatabaseDbProperties.DbTablePrefix + "BlobContainers"; + b.CollectionName = AbpBlobStoringDatabaseDbProperties.DbTablePrefix + "BlobContainers"; }); builder.Entity(b => { - b.CollectionName = BlobStoringDatabaseDbProperties.DbTablePrefix + "Blobs"; + b.CollectionName = AbpBlobStoringDatabaseDbProperties.DbTablePrefix + "Blobs"; }); } } diff --git a/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.MongoDB/Volo/Abp/BlobStoring/Database/MongoDB/IBlobStoringMongoDbContext.cs b/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.MongoDB/Volo/Abp/BlobStoring/Database/MongoDB/IBlobStoringMongoDbContext.cs index 1fcf61b146..803ed5171d 100644 --- a/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.MongoDB/Volo/Abp/BlobStoring/Database/MongoDB/IBlobStoringMongoDbContext.cs +++ b/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.MongoDB/Volo/Abp/BlobStoring/Database/MongoDB/IBlobStoringMongoDbContext.cs @@ -4,7 +4,7 @@ using Volo.Abp.MongoDB; namespace Volo.Abp.BlobStoring.Database.MongoDB; -[ConnectionStringName(BlobStoringDatabaseDbProperties.ConnectionStringName)] +[ConnectionStringName(AbpBlobStoringDatabaseDbProperties.ConnectionStringName)] public interface IBlobStoringMongoDbContext : IAbpMongoDbContext { IMongoCollection BlobContainers { get; } diff --git a/modules/blogging/src/Volo.Blogging.Domain/Volo/Blogging/BloggingDbProperties.cs b/modules/blogging/src/Volo.Blogging.Domain/Volo/Blogging/BloggingDbProperties.cs index 6f57d5f404..464ea2c348 100644 --- a/modules/blogging/src/Volo.Blogging.Domain/Volo/Blogging/BloggingDbProperties.cs +++ b/modules/blogging/src/Volo.Blogging.Domain/Volo/Blogging/BloggingDbProperties.cs @@ -1,6 +1,6 @@ namespace Volo.Blogging { - public static class BloggingDbProperties + public static class AbpBloggingDbProperties { /// /// Default value: "Blg". diff --git a/modules/blogging/src/Volo.Blogging.EntityFrameworkCore/Volo/Blogging/EntityFrameworkCore/BloggingDbContext.cs b/modules/blogging/src/Volo.Blogging.EntityFrameworkCore/Volo/Blogging/EntityFrameworkCore/BloggingDbContext.cs index 85c34aa996..9ccbe3aa3b 100644 --- a/modules/blogging/src/Volo.Blogging.EntityFrameworkCore/Volo/Blogging/EntityFrameworkCore/BloggingDbContext.cs +++ b/modules/blogging/src/Volo.Blogging.EntityFrameworkCore/Volo/Blogging/EntityFrameworkCore/BloggingDbContext.cs @@ -11,7 +11,7 @@ using Volo.Blogging.Users; namespace Volo.Blogging.EntityFrameworkCore { [IgnoreMultiTenancy] - [ConnectionStringName(BloggingDbProperties.ConnectionStringName)] + [ConnectionStringName(AbpBloggingDbProperties.ConnectionStringName)] public class BloggingDbContext : AbpDbContext, IBloggingDbContext { public DbSet Users { get; set; } diff --git a/modules/blogging/src/Volo.Blogging.EntityFrameworkCore/Volo/Blogging/EntityFrameworkCore/BloggingDbContextModelBuilderExtensions.cs b/modules/blogging/src/Volo.Blogging.EntityFrameworkCore/Volo/Blogging/EntityFrameworkCore/BloggingDbContextModelBuilderExtensions.cs index 3386da25a5..abf96ebcef 100644 --- a/modules/blogging/src/Volo.Blogging.EntityFrameworkCore/Volo/Blogging/EntityFrameworkCore/BloggingDbContextModelBuilderExtensions.cs +++ b/modules/blogging/src/Volo.Blogging.EntityFrameworkCore/Volo/Blogging/EntityFrameworkCore/BloggingDbContextModelBuilderExtensions.cs @@ -25,7 +25,7 @@ namespace Volo.Blogging.EntityFrameworkCore builder.Entity(b => { - b.ToTable(BloggingDbProperties.DbTablePrefix + "Users", BloggingDbProperties.DbSchema); + b.ToTable(AbpBloggingDbProperties.DbTablePrefix + "Users", AbpBloggingDbProperties.DbSchema); b.ConfigureByConvention(); b.ConfigureAbpUser(); @@ -35,7 +35,7 @@ namespace Volo.Blogging.EntityFrameworkCore builder.Entity(b => { - b.ToTable(BloggingDbProperties.DbTablePrefix + "Blogs", BloggingDbProperties.DbSchema); + b.ToTable(AbpBloggingDbProperties.DbTablePrefix + "Blogs", AbpBloggingDbProperties.DbSchema); b.ConfigureByConvention(); @@ -48,7 +48,7 @@ namespace Volo.Blogging.EntityFrameworkCore builder.Entity(b => { - b.ToTable(BloggingDbProperties.DbTablePrefix + "Posts", BloggingDbProperties.DbSchema); + b.ToTable(AbpBloggingDbProperties.DbTablePrefix + "Posts", AbpBloggingDbProperties.DbSchema); b.ConfigureByConvention(); @@ -68,7 +68,7 @@ namespace Volo.Blogging.EntityFrameworkCore builder.Entity(b => { - b.ToTable(BloggingDbProperties.DbTablePrefix + "Comments", BloggingDbProperties.DbSchema); + b.ToTable(AbpBloggingDbProperties.DbTablePrefix + "Comments", AbpBloggingDbProperties.DbSchema); b.ConfigureByConvention(); @@ -84,7 +84,7 @@ namespace Volo.Blogging.EntityFrameworkCore builder.Entity(b => { - b.ToTable(BloggingDbProperties.DbTablePrefix + "Tags", BloggingDbProperties.DbSchema); + b.ToTable(AbpBloggingDbProperties.DbTablePrefix + "Tags", AbpBloggingDbProperties.DbSchema); b.ConfigureByConvention(); @@ -99,7 +99,7 @@ namespace Volo.Blogging.EntityFrameworkCore builder.Entity(b => { - b.ToTable(BloggingDbProperties.DbTablePrefix + "PostTags", BloggingDbProperties.DbSchema); + b.ToTable(AbpBloggingDbProperties.DbTablePrefix + "PostTags", AbpBloggingDbProperties.DbSchema); b.ConfigureByConvention(); diff --git a/modules/blogging/src/Volo.Blogging.EntityFrameworkCore/Volo/Blogging/EntityFrameworkCore/IBloggingDbContext.cs b/modules/blogging/src/Volo.Blogging.EntityFrameworkCore/Volo/Blogging/EntityFrameworkCore/IBloggingDbContext.cs index 4eb8f35c03..ce63597029 100644 --- a/modules/blogging/src/Volo.Blogging.EntityFrameworkCore/Volo/Blogging/EntityFrameworkCore/IBloggingDbContext.cs +++ b/modules/blogging/src/Volo.Blogging.EntityFrameworkCore/Volo/Blogging/EntityFrameworkCore/IBloggingDbContext.cs @@ -11,7 +11,7 @@ using Volo.Blogging.Users; namespace Volo.Blogging.EntityFrameworkCore { [IgnoreMultiTenancy] - [ConnectionStringName(BloggingDbProperties.ConnectionStringName)] + [ConnectionStringName(AbpBloggingDbProperties.ConnectionStringName)] public interface IBloggingDbContext : IEfCoreDbContext { DbSet Users { get; } diff --git a/modules/blogging/src/Volo.Blogging.MongoDB/Volo/Blogging/MongoDB/BloggingMongoDbContext.cs b/modules/blogging/src/Volo.Blogging.MongoDB/Volo/Blogging/MongoDB/BloggingMongoDbContext.cs index 1f20ff1744..d782f0fb1b 100644 --- a/modules/blogging/src/Volo.Blogging.MongoDB/Volo/Blogging/MongoDB/BloggingMongoDbContext.cs +++ b/modules/blogging/src/Volo.Blogging.MongoDB/Volo/Blogging/MongoDB/BloggingMongoDbContext.cs @@ -10,7 +10,7 @@ using Volo.Blogging.Users; namespace Volo.Blogging.MongoDB { [IgnoreMultiTenancy] - [ConnectionStringName(BloggingDbProperties.ConnectionStringName)] + [ConnectionStringName(AbpBloggingDbProperties.ConnectionStringName)] public class BloggingMongoDbContext : AbpMongoDbContext, IBloggingMongoDbContext { public IMongoCollection Users => Collection(); diff --git a/modules/blogging/src/Volo.Blogging.MongoDB/Volo/Blogging/MongoDB/BloggingMongoDbContextExtensions.cs b/modules/blogging/src/Volo.Blogging.MongoDB/Volo/Blogging/MongoDB/BloggingMongoDbContextExtensions.cs index b04f0a74fc..1083169761 100644 --- a/modules/blogging/src/Volo.Blogging.MongoDB/Volo/Blogging/MongoDB/BloggingMongoDbContextExtensions.cs +++ b/modules/blogging/src/Volo.Blogging.MongoDB/Volo/Blogging/MongoDB/BloggingMongoDbContextExtensions.cs @@ -16,27 +16,27 @@ namespace Volo.Blogging.MongoDB builder.Entity(b => { - b.CollectionName = BloggingDbProperties.DbTablePrefix + "Users"; + b.CollectionName = AbpBloggingDbProperties.DbTablePrefix + "Users"; }); builder.Entity(b => { - b.CollectionName = BloggingDbProperties.DbTablePrefix + "Blogs"; + b.CollectionName = AbpBloggingDbProperties.DbTablePrefix + "Blogs"; }); builder.Entity(b => { - b.CollectionName = BloggingDbProperties.DbTablePrefix + "Posts"; + b.CollectionName = AbpBloggingDbProperties.DbTablePrefix + "Posts"; }); builder.Entity(b => { - b.CollectionName = BloggingDbProperties.DbTablePrefix + "Tags"; + b.CollectionName = AbpBloggingDbProperties.DbTablePrefix + "Tags"; }); builder.Entity(b => { - b.CollectionName = BloggingDbProperties.DbTablePrefix + "Comments"; + b.CollectionName = AbpBloggingDbProperties.DbTablePrefix + "Comments"; }); } } diff --git a/modules/blogging/src/Volo.Blogging.MongoDB/Volo/Blogging/MongoDB/IBloggingMongoDbContext.cs b/modules/blogging/src/Volo.Blogging.MongoDB/Volo/Blogging/MongoDB/IBloggingMongoDbContext.cs index 1dbf5eee92..d3c898a14d 100644 --- a/modules/blogging/src/Volo.Blogging.MongoDB/Volo/Blogging/MongoDB/IBloggingMongoDbContext.cs +++ b/modules/blogging/src/Volo.Blogging.MongoDB/Volo/Blogging/MongoDB/IBloggingMongoDbContext.cs @@ -10,7 +10,7 @@ using Volo.Blogging.Users; namespace Volo.Blogging.MongoDB { [IgnoreMultiTenancy] - [ConnectionStringName(BloggingDbProperties.ConnectionStringName)] + [ConnectionStringName(AbpBloggingDbProperties.ConnectionStringName)] public interface IBloggingMongoDbContext : IAbpMongoDbContext { IMongoCollection Users { get; } diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/CmsKitDbProperties.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/CmsKitDbProperties.cs index 6a29834233..1ce1fd8413 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/CmsKitDbProperties.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/CmsKitDbProperties.cs @@ -1,6 +1,6 @@ namespace Volo.CmsKit; -public static class CmsKitDbProperties +public static class AbpCmsKitDbProperties { public static string DbTablePrefix { get; set; } = "Cms"; diff --git a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContext.cs b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContext.cs index 8f501f4c98..265495f5bf 100644 --- a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContext.cs +++ b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContext.cs @@ -14,7 +14,7 @@ using Volo.CmsKit.Users; namespace Volo.CmsKit.EntityFrameworkCore; -[ConnectionStringName(CmsKitDbProperties.ConnectionStringName)] +[ConnectionStringName(AbpCmsKitDbProperties.ConnectionStringName)] public class CmsKitDbContext : AbpDbContext, ICmsKitDbContext { public DbSet Comments { get; set; } diff --git a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContextModelCreatingExtensions.cs b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContextModelCreatingExtensions.cs index 9ab103fefc..9a42f6c4b0 100644 --- a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContextModelCreatingExtensions.cs +++ b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContextModelCreatingExtensions.cs @@ -28,7 +28,7 @@ public static class CmsKitDbContextModelCreatingExtensions { builder.Entity(b => { - b.ToTable(CmsKitDbProperties.DbTablePrefix + "Users", CmsKitDbProperties.DbSchema); + b.ToTable(AbpCmsKitDbProperties.DbTablePrefix + "Users", AbpCmsKitDbProperties.DbSchema); b.ConfigureByConvention(); b.ConfigureAbpUser(); @@ -48,7 +48,7 @@ public static class CmsKitDbContextModelCreatingExtensions { builder.Entity(b => { - b.ToTable(CmsKitDbProperties.DbTablePrefix + "UserReactions", CmsKitDbProperties.DbSchema); + b.ToTable(AbpCmsKitDbProperties.DbTablePrefix + "UserReactions", AbpCmsKitDbProperties.DbSchema); b.ConfigureByConvention(); @@ -71,7 +71,7 @@ public static class CmsKitDbContextModelCreatingExtensions { builder.Entity(b => { - b.ToTable(CmsKitDbProperties.DbTablePrefix + "Comments", CmsKitDbProperties.DbSchema); + b.ToTable(AbpCmsKitDbProperties.DbTablePrefix + "Comments", AbpCmsKitDbProperties.DbSchema); b.ConfigureByConvention(); @@ -95,7 +95,7 @@ public static class CmsKitDbContextModelCreatingExtensions { builder.Entity(r => { - r.ToTable(CmsKitDbProperties.DbTablePrefix + "Ratings", CmsKitDbProperties.DbSchema); + r.ToTable(AbpCmsKitDbProperties.DbTablePrefix + "Ratings", AbpCmsKitDbProperties.DbSchema); r.ConfigureByConvention(); @@ -117,7 +117,7 @@ public static class CmsKitDbContextModelCreatingExtensions { builder.Entity(b => { - b.ToTable(CmsKitDbProperties.DbTablePrefix + "Tags", CmsKitDbProperties.DbSchema); + b.ToTable(AbpCmsKitDbProperties.DbTablePrefix + "Tags", AbpCmsKitDbProperties.DbSchema); b.ConfigureByConvention(); @@ -134,7 +134,7 @@ public static class CmsKitDbContextModelCreatingExtensions builder.Entity(b => { - b.ToTable(CmsKitDbProperties.DbTablePrefix + "EntityTags", CmsKitDbProperties.DbSchema); + b.ToTable(AbpCmsKitDbProperties.DbTablePrefix + "EntityTags", AbpCmsKitDbProperties.DbSchema); b.ConfigureByConvention(); @@ -158,7 +158,7 @@ public static class CmsKitDbContextModelCreatingExtensions { builder.Entity(b => { - b.ToTable(CmsKitDbProperties.DbTablePrefix + "Pages", CmsKitDbProperties.DbSchema); + b.ToTable(AbpCmsKitDbProperties.DbTablePrefix + "Pages", AbpCmsKitDbProperties.DbSchema); b.ConfigureByConvention(); @@ -180,7 +180,7 @@ public static class CmsKitDbContextModelCreatingExtensions { builder.Entity(b => { - b.ToTable(CmsKitDbProperties.DbTablePrefix + "Blogs", CmsKitDbProperties.DbSchema); + b.ToTable(AbpCmsKitDbProperties.DbTablePrefix + "Blogs", AbpCmsKitDbProperties.DbSchema); b.ConfigureByConvention(); @@ -193,7 +193,7 @@ public static class CmsKitDbContextModelCreatingExtensions builder.Entity(b => { - b.ToTable(CmsKitDbProperties.DbTablePrefix + "BlogPosts", CmsKitDbProperties.DbSchema); + b.ToTable(AbpCmsKitDbProperties.DbTablePrefix + "BlogPosts", AbpCmsKitDbProperties.DbSchema); b.ConfigureByConvention(); @@ -210,7 +210,7 @@ public static class CmsKitDbContextModelCreatingExtensions builder.Entity(b => { - b.ToTable(CmsKitDbProperties.DbTablePrefix + "BlogFeatures", CmsKitDbProperties.DbSchema); + b.ToTable(AbpCmsKitDbProperties.DbTablePrefix + "BlogFeatures", AbpCmsKitDbProperties.DbSchema); b.ConfigureByConvention(); @@ -230,7 +230,7 @@ public static class CmsKitDbContextModelCreatingExtensions { builder.Entity(b => { - b.ToTable(CmsKitDbProperties.DbTablePrefix + "MediaDescriptors", CmsKitDbProperties.DbSchema); + b.ToTable(AbpCmsKitDbProperties.DbTablePrefix + "MediaDescriptors", AbpCmsKitDbProperties.DbSchema); b.ConfigureByConvention(); @@ -251,7 +251,7 @@ public static class CmsKitDbContextModelCreatingExtensions { builder.Entity(b => { - b.ToTable(CmsKitDbProperties.DbTablePrefix + "MenuItems", CmsKitDbProperties.DbSchema); + b.ToTable(AbpCmsKitDbProperties.DbTablePrefix + "MenuItems", AbpCmsKitDbProperties.DbSchema); b.ConfigureByConvention(); @@ -269,7 +269,7 @@ public static class CmsKitDbContextModelCreatingExtensions { builder.Entity(b => { - b.ToTable(CmsKitDbProperties.DbTablePrefix + "GlobalResources", CmsKitDbProperties.DbSchema); + b.ToTable(AbpCmsKitDbProperties.DbTablePrefix + "GlobalResources", AbpCmsKitDbProperties.DbSchema); b.ConfigureByConvention(); diff --git a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/ICmsKitDbContext.cs b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/ICmsKitDbContext.cs index fca31f2d73..8b6edc1cbe 100644 --- a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/ICmsKitDbContext.cs +++ b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/ICmsKitDbContext.cs @@ -14,7 +14,7 @@ using Volo.CmsKit.Users; namespace Volo.CmsKit.EntityFrameworkCore; -[ConnectionStringName(CmsKitDbProperties.ConnectionStringName)] +[ConnectionStringName(AbpCmsKitDbProperties.ConnectionStringName)] public interface ICmsKitDbContext : IEfCoreDbContext { DbSet Comments { get; } diff --git a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/CmsKitMongoDbContext.cs b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/CmsKitMongoDbContext.cs index 36c9cf882c..c6a97dfbef 100644 --- a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/CmsKitMongoDbContext.cs +++ b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/CmsKitMongoDbContext.cs @@ -15,7 +15,7 @@ using Tag = Volo.CmsKit.Tags.Tag; namespace Volo.CmsKit.MongoDB; -[ConnectionStringName(CmsKitDbProperties.ConnectionStringName)] +[ConnectionStringName(AbpCmsKitDbProperties.ConnectionStringName)] public class CmsKitMongoDbContext : AbpMongoDbContext, ICmsKitMongoDbContext { public IMongoCollection Comments => Collection(); diff --git a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/CmsKitMongoDbContextExtensions.cs b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/CmsKitMongoDbContextExtensions.cs index 7b7edcce0d..b6127ab125 100644 --- a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/CmsKitMongoDbContextExtensions.cs +++ b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/CmsKitMongoDbContextExtensions.cs @@ -22,67 +22,67 @@ public static class CmsKitMongoDbContextExtensions builder.Entity(x => { - x.CollectionName = CmsKitDbProperties.DbTablePrefix + "Users"; + x.CollectionName = AbpCmsKitDbProperties.DbTablePrefix + "Users"; }); builder.Entity(x => { - x.CollectionName = CmsKitDbProperties.DbTablePrefix + "UserReactions"; + x.CollectionName = AbpCmsKitDbProperties.DbTablePrefix + "UserReactions"; }); builder.Entity(x => { - x.CollectionName = CmsKitDbProperties.DbTablePrefix + "Comments"; + x.CollectionName = AbpCmsKitDbProperties.DbTablePrefix + "Comments"; }); builder.Entity(x => { - x.CollectionName = CmsKitDbProperties.DbTablePrefix + "Ratings"; + x.CollectionName = AbpCmsKitDbProperties.DbTablePrefix + "Ratings"; }); builder.Entity(x => { - x.CollectionName = CmsKitDbProperties.DbTablePrefix + "Tags"; + x.CollectionName = AbpCmsKitDbProperties.DbTablePrefix + "Tags"; }); builder.Entity(x => { - x.CollectionName = CmsKitDbProperties.DbTablePrefix + "EntityTags"; + x.CollectionName = AbpCmsKitDbProperties.DbTablePrefix + "EntityTags"; }); builder.Entity(x => { - x.CollectionName = CmsKitDbProperties.DbTablePrefix + "Pages"; + x.CollectionName = AbpCmsKitDbProperties.DbTablePrefix + "Pages"; }); builder.Entity(x => { - x.CollectionName = CmsKitDbProperties.DbTablePrefix + "Blogs"; + x.CollectionName = AbpCmsKitDbProperties.DbTablePrefix + "Blogs"; }); builder.Entity(x => { - x.CollectionName = CmsKitDbProperties.DbTablePrefix + "BlogPosts"; + x.CollectionName = AbpCmsKitDbProperties.DbTablePrefix + "BlogPosts"; }); builder.Entity(x => { - x.CollectionName = CmsKitDbProperties.DbTablePrefix + "BlogFeatures"; + x.CollectionName = AbpCmsKitDbProperties.DbTablePrefix + "BlogFeatures"; }); builder.Entity(x => { - x.CollectionName = CmsKitDbProperties.DbTablePrefix + "MediaDescriptors"; + x.CollectionName = AbpCmsKitDbProperties.DbTablePrefix + "MediaDescriptors"; }); builder.Entity(x => { - x.CollectionName = CmsKitDbProperties.DbTablePrefix + "MenuItems"; + x.CollectionName = AbpCmsKitDbProperties.DbTablePrefix + "MenuItems"; }); builder.Entity(x => { - x.CollectionName = CmsKitDbProperties.DbTablePrefix + "GlobalResources"; + x.CollectionName = AbpCmsKitDbProperties.DbTablePrefix + "GlobalResources"; }); } } diff --git a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/ICmsKitMongoDbContext.cs b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/ICmsKitMongoDbContext.cs index a2dff419e2..e220aff46e 100644 --- a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/ICmsKitMongoDbContext.cs +++ b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/ICmsKitMongoDbContext.cs @@ -15,7 +15,7 @@ using Tag = Volo.CmsKit.Tags.Tag; namespace Volo.CmsKit.MongoDB; -[ConnectionStringName(CmsKitDbProperties.ConnectionStringName)] +[ConnectionStringName(AbpCmsKitDbProperties.ConnectionStringName)] public interface ICmsKitMongoDbContext : IAbpMongoDbContext { IMongoCollection UserReactions { get; } diff --git a/modules/docs/src/Volo.Docs.Domain/Volo/Docs/DocsDbProperties.cs b/modules/docs/src/Volo.Docs.Domain/Volo/Docs/DocsDbProperties.cs index 7f534d4305..093bf477a6 100644 --- a/modules/docs/src/Volo.Docs.Domain/Volo/Docs/DocsDbProperties.cs +++ b/modules/docs/src/Volo.Docs.Domain/Volo/Docs/DocsDbProperties.cs @@ -1,6 +1,6 @@ namespace Volo.Docs { - public static class DocsDbProperties + public static class AbpDocsDbProperties { public static string DbTablePrefix { get; set; } = "Docs"; diff --git a/modules/docs/src/Volo.Docs.EntityFrameworkCore/Volo/Docs/EntityFrameworkCore/DocsDbContext.cs b/modules/docs/src/Volo.Docs.EntityFrameworkCore/Volo/Docs/EntityFrameworkCore/DocsDbContext.cs index 911db81a15..9ce0c59dc3 100644 --- a/modules/docs/src/Volo.Docs.EntityFrameworkCore/Volo/Docs/EntityFrameworkCore/DocsDbContext.cs +++ b/modules/docs/src/Volo.Docs.EntityFrameworkCore/Volo/Docs/EntityFrameworkCore/DocsDbContext.cs @@ -8,7 +8,7 @@ using Volo.Docs.Projects; namespace Volo.Docs.EntityFrameworkCore { [IgnoreMultiTenancy] - [ConnectionStringName(DocsDbProperties.ConnectionStringName)] + [ConnectionStringName(AbpDocsDbProperties.ConnectionStringName)] public class DocsDbContext: AbpDbContext, IDocsDbContext { public DbSet Projects { get; set; } diff --git a/modules/docs/src/Volo.Docs.EntityFrameworkCore/Volo/Docs/EntityFrameworkCore/DocsDbContextModelBuilderExtensions.cs b/modules/docs/src/Volo.Docs.EntityFrameworkCore/Volo/Docs/EntityFrameworkCore/DocsDbContextModelBuilderExtensions.cs index f3a5997048..745b822f17 100644 --- a/modules/docs/src/Volo.Docs.EntityFrameworkCore/Volo/Docs/EntityFrameworkCore/DocsDbContextModelBuilderExtensions.cs +++ b/modules/docs/src/Volo.Docs.EntityFrameworkCore/Volo/Docs/EntityFrameworkCore/DocsDbContextModelBuilderExtensions.cs @@ -21,7 +21,7 @@ namespace Volo.Docs.EntityFrameworkCore builder.Entity(b => { - b.ToTable(DocsDbProperties.DbTablePrefix + "Projects", DocsDbProperties.DbSchema); + b.ToTable(AbpDocsDbProperties.DbTablePrefix + "Projects", AbpDocsDbProperties.DbSchema); b.ConfigureByConvention(); @@ -37,7 +37,7 @@ namespace Volo.Docs.EntityFrameworkCore builder.Entity(b => { - b.ToTable(DocsDbProperties.DbTablePrefix + "Documents", DocsDbProperties.DbSchema); + b.ToTable(AbpDocsDbProperties.DbTablePrefix + "Documents", AbpDocsDbProperties.DbSchema); b.ConfigureByConvention(); @@ -61,7 +61,7 @@ namespace Volo.Docs.EntityFrameworkCore builder.Entity(b => { - b.ToTable(DocsDbProperties.DbTablePrefix + "DocumentContributors", DocsDbProperties.DbSchema); + b.ToTable(AbpDocsDbProperties.DbTablePrefix + "DocumentContributors", AbpDocsDbProperties.DbSchema); b.ConfigureByConvention(); diff --git a/modules/docs/src/Volo.Docs.EntityFrameworkCore/Volo/Docs/EntityFrameworkCore/IDocsDbContext.cs b/modules/docs/src/Volo.Docs.EntityFrameworkCore/Volo/Docs/EntityFrameworkCore/IDocsDbContext.cs index 4d79609718..e85f9b4aa5 100644 --- a/modules/docs/src/Volo.Docs.EntityFrameworkCore/Volo/Docs/EntityFrameworkCore/IDocsDbContext.cs +++ b/modules/docs/src/Volo.Docs.EntityFrameworkCore/Volo/Docs/EntityFrameworkCore/IDocsDbContext.cs @@ -8,7 +8,7 @@ using Volo.Docs.Projects; namespace Volo.Docs.EntityFrameworkCore { [IgnoreMultiTenancy] - [ConnectionStringName(DocsDbProperties.ConnectionStringName)] + [ConnectionStringName(AbpDocsDbProperties.ConnectionStringName)] public interface IDocsDbContext : IEfCoreDbContext { DbSet Projects { get; } diff --git a/modules/docs/src/Volo.Docs.MongoDB/Volo/Docs/MongoDB/DocsMongoDbContext.cs b/modules/docs/src/Volo.Docs.MongoDB/Volo/Docs/MongoDB/DocsMongoDbContext.cs index 3bfb5df491..b566801631 100644 --- a/modules/docs/src/Volo.Docs.MongoDB/Volo/Docs/MongoDB/DocsMongoDbContext.cs +++ b/modules/docs/src/Volo.Docs.MongoDB/Volo/Docs/MongoDB/DocsMongoDbContext.cs @@ -8,7 +8,7 @@ using Volo.Docs.Documents; namespace Volo.Docs.MongoDB { [IgnoreMultiTenancy] - [ConnectionStringName(DocsDbProperties.ConnectionStringName)] + [ConnectionStringName(AbpDocsDbProperties.ConnectionStringName)] public class DocsMongoDbContext : AbpMongoDbContext, IDocsMongoDbContext { public IMongoCollection Projects => Collection(); diff --git a/modules/docs/src/Volo.Docs.MongoDB/Volo/Docs/MongoDB/DocsMongoDbContextExtensions.cs b/modules/docs/src/Volo.Docs.MongoDB/Volo/Docs/MongoDB/DocsMongoDbContextExtensions.cs index 56d367c651..436fb1b527 100644 --- a/modules/docs/src/Volo.Docs.MongoDB/Volo/Docs/MongoDB/DocsMongoDbContextExtensions.cs +++ b/modules/docs/src/Volo.Docs.MongoDB/Volo/Docs/MongoDB/DocsMongoDbContextExtensions.cs @@ -14,12 +14,12 @@ namespace Volo.Docs.MongoDB builder.Entity(b => { - b.CollectionName = DocsDbProperties.DbTablePrefix + "Projects"; + b.CollectionName = AbpDocsDbProperties.DbTablePrefix + "Projects"; }); builder.Entity(b => { - b.CollectionName = DocsDbProperties.DbTablePrefix + "DocumentS"; + b.CollectionName = AbpDocsDbProperties.DbTablePrefix + "DocumentS"; }); } } diff --git a/modules/docs/src/Volo.Docs.MongoDB/Volo/Docs/MongoDB/IDocsMongoDbContext.cs b/modules/docs/src/Volo.Docs.MongoDB/Volo/Docs/MongoDB/IDocsMongoDbContext.cs index f6b748611c..ecc8267fd8 100644 --- a/modules/docs/src/Volo.Docs.MongoDB/Volo/Docs/MongoDB/IDocsMongoDbContext.cs +++ b/modules/docs/src/Volo.Docs.MongoDB/Volo/Docs/MongoDB/IDocsMongoDbContext.cs @@ -8,7 +8,7 @@ using Volo.Docs.Projects; namespace Volo.Docs.MongoDB { [IgnoreMultiTenancy] - [ConnectionStringName(DocsDbProperties.ConnectionStringName)] + [ConnectionStringName(AbpDocsDbProperties.ConnectionStringName)] public interface IDocsMongoDbContext : IAbpMongoDbContext { IMongoCollection Projects { get; } diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/FeatureManagementDbProperties.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/FeatureManagementDbProperties.cs index 6b7418351a..ee34d0523f 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/FeatureManagementDbProperties.cs +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/FeatureManagementDbProperties.cs @@ -2,7 +2,7 @@ namespace Volo.Abp.FeatureManagement; -public static class FeatureManagementDbProperties +public static class AbpFeatureManagementDbProperties { public static string DbTablePrefix { get; set; } = AbpCommonDbProperties.DbTablePrefix; diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.EntityFrameworkCore/Volo/Abp/FeatureManagement/EntityFrameworkCore/FeatureManagementDbContext.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.EntityFrameworkCore/Volo/Abp/FeatureManagement/EntityFrameworkCore/FeatureManagementDbContext.cs index 28c2ebe49f..1999a11984 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.EntityFrameworkCore/Volo/Abp/FeatureManagement/EntityFrameworkCore/FeatureManagementDbContext.cs +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.EntityFrameworkCore/Volo/Abp/FeatureManagement/EntityFrameworkCore/FeatureManagementDbContext.cs @@ -6,7 +6,7 @@ using Volo.Abp.MultiTenancy; namespace Volo.Abp.FeatureManagement.EntityFrameworkCore; [IgnoreMultiTenancy] -[ConnectionStringName(FeatureManagementDbProperties.ConnectionStringName)] +[ConnectionStringName(AbpFeatureManagementDbProperties.ConnectionStringName)] public class FeatureManagementDbContext : AbpDbContext, IFeatureManagementDbContext { public DbSet FeatureValues { get; set; } diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.EntityFrameworkCore/Volo/Abp/FeatureManagement/EntityFrameworkCore/FeatureManagementDbContextModelCreatingExtensions.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.EntityFrameworkCore/Volo/Abp/FeatureManagement/EntityFrameworkCore/FeatureManagementDbContextModelCreatingExtensions.cs index 1994d670aa..97a9ba83d7 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.EntityFrameworkCore/Volo/Abp/FeatureManagement/EntityFrameworkCore/FeatureManagementDbContextModelCreatingExtensions.cs +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.EntityFrameworkCore/Volo/Abp/FeatureManagement/EntityFrameworkCore/FeatureManagementDbContextModelCreatingExtensions.cs @@ -17,7 +17,7 @@ public static class FeatureManagementDbContextModelCreatingExtensions builder.Entity(b => { - b.ToTable(FeatureManagementDbProperties.DbTablePrefix + "FeatureValues", FeatureManagementDbProperties.DbSchema); + b.ToTable(AbpFeatureManagementDbProperties.DbTablePrefix + "FeatureValues", AbpFeatureManagementDbProperties.DbSchema); b.ConfigureByConvention(); diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.EntityFrameworkCore/Volo/Abp/FeatureManagement/EntityFrameworkCore/IFeatureManagementDbContext.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.EntityFrameworkCore/Volo/Abp/FeatureManagement/EntityFrameworkCore/IFeatureManagementDbContext.cs index 47c600330c..7848f56cab 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.EntityFrameworkCore/Volo/Abp/FeatureManagement/EntityFrameworkCore/IFeatureManagementDbContext.cs +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.EntityFrameworkCore/Volo/Abp/FeatureManagement/EntityFrameworkCore/IFeatureManagementDbContext.cs @@ -6,7 +6,7 @@ using Volo.Abp.MultiTenancy; namespace Volo.Abp.FeatureManagement.EntityFrameworkCore; [IgnoreMultiTenancy] -[ConnectionStringName(FeatureManagementDbProperties.ConnectionStringName)] +[ConnectionStringName(AbpFeatureManagementDbProperties.ConnectionStringName)] public interface IFeatureManagementDbContext : IEfCoreDbContext { DbSet FeatureValues { get; } diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.MongoDB/Volo/Abp/FeatureManagement/MongoDB/FeatureManagementMongoDbContext.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.MongoDB/Volo/Abp/FeatureManagement/MongoDB/FeatureManagementMongoDbContext.cs index 466c412cfc..37273a3dcc 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.MongoDB/Volo/Abp/FeatureManagement/MongoDB/FeatureManagementMongoDbContext.cs +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.MongoDB/Volo/Abp/FeatureManagement/MongoDB/FeatureManagementMongoDbContext.cs @@ -6,7 +6,7 @@ using Volo.Abp.MultiTenancy; namespace Volo.Abp.FeatureManagement.MongoDB; [IgnoreMultiTenancy] -[ConnectionStringName(FeatureManagementDbProperties.ConnectionStringName)] +[ConnectionStringName(AbpFeatureManagementDbProperties.ConnectionStringName)] public class FeatureManagementMongoDbContext : AbpMongoDbContext, IFeatureManagementMongoDbContext { public IMongoCollection FeatureValues => Collection(); diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.MongoDB/Volo/Abp/FeatureManagement/MongoDB/FeatureManagementMongoDbContextExtensions.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.MongoDB/Volo/Abp/FeatureManagement/MongoDB/FeatureManagementMongoDbContextExtensions.cs index 9922aa220b..8d263bb71e 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.MongoDB/Volo/Abp/FeatureManagement/MongoDB/FeatureManagementMongoDbContextExtensions.cs +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.MongoDB/Volo/Abp/FeatureManagement/MongoDB/FeatureManagementMongoDbContextExtensions.cs @@ -11,7 +11,7 @@ public static class FeatureManagementMongoDbContextExtensions builder.Entity(b => { - b.CollectionName = FeatureManagementDbProperties.DbTablePrefix + "FeatureValues"; + b.CollectionName = AbpFeatureManagementDbProperties.DbTablePrefix + "FeatureValues"; }); } } diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.MongoDB/Volo/Abp/FeatureManagement/MongoDB/IFeatureManagementMongoDbContext.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.MongoDB/Volo/Abp/FeatureManagement/MongoDB/IFeatureManagementMongoDbContext.cs index fc1e848c08..1fefaf67cf 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.MongoDB/Volo/Abp/FeatureManagement/MongoDB/IFeatureManagementMongoDbContext.cs +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.MongoDB/Volo/Abp/FeatureManagement/MongoDB/IFeatureManagementMongoDbContext.cs @@ -6,7 +6,7 @@ using Volo.Abp.MultiTenancy; namespace Volo.Abp.FeatureManagement.MongoDB; [IgnoreMultiTenancy] -[ConnectionStringName(FeatureManagementDbProperties.ConnectionStringName)] +[ConnectionStringName(AbpFeatureManagementDbProperties.ConnectionStringName)] public interface IFeatureManagementMongoDbContext : IAbpMongoDbContext { IMongoCollection FeatureValues { get; } From f4d544c40b1c790d76b896de7bab36f635637888 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Mon, 25 Jul 2022 16:56:48 +0800 Subject: [PATCH 26/84] Enhance RabbitMQ to set PrefetchCount --- docs/en/Background-Jobs-RabbitMq.md | 12 +++++++++--- .../en/Distributed-Event-Bus-RabbitMQ-Integration.md | 3 ++- docs/zh-Hans/Background-Jobs-RabbitMq.md | 10 ++++++++-- .../Distributed-Event-Bus-RabbitMQ-Integration.md | 3 ++- .../RabbitMQ/AbpRabbitMqBackgroundJobOptions.cs | 2 ++ .../Volo/Abp/BackgroundJobs/RabbitMQ/JobQueue.cs | 8 +++++++- .../BackgroundJobs/RabbitMQ/JobQueueConfiguration.cs | 6 ++++-- .../EventBus/RabbitMq/AbpRabbitMqEventBusOptions.cs | 2 ++ .../EventBus/RabbitMq/RabbitMqDistributedEventBus.cs | 3 ++- .../Volo/Abp/RabbitMQ/QueueDeclareConfiguration.cs | 6 +++++- .../Volo/Abp/RabbitMQ/RabbitMqMessageConsumer.cs | 5 +++++ 11 files changed, 48 insertions(+), 12 deletions(-) diff --git a/docs/en/Background-Jobs-RabbitMq.md b/docs/en/Background-Jobs-RabbitMq.md index 16b8b0981a..8eec3733fb 100644 --- a/docs/en/Background-Jobs-RabbitMq.md +++ b/docs/en/Background-Jobs-RabbitMq.md @@ -126,25 +126,31 @@ By default, all the job types use the `Default` RabbitMQ connection. Configure(options => { options.DefaultQueueNamePrefix = "my_app_jobs."; + options.DefaultDelayedQueueNamePrefix = "my_app_jobs.delayed" + options.PrefetchCount = 1; options.JobQueues[typeof(EmailSendingArgs)] = new JobQueueConfiguration( typeof(EmailSendingArgs), queueName: "my_app_jobs.emails", - connectionName: "SecondConnection" + connectionName: "SecondConnection", + delayedQueueName:"my_app_jobs.emails.delayed" ); }); ```` -* This example sets the default queue name prefix to `my_app_jobs.`. If different applications use the same RabbitMQ server, it would be important to use different prefixes for each application to not consume jobs of each other. +* This example sets the default queue name prefix to `my_app_jobs.` and default delayed queue name prefix to `my_app_jobs.delayed`. If different applications use the same RabbitMQ server, it would be important to use different prefixes for each application to not consume jobs of each other. +* Sets `PrefetchCount` for all queues. * Also specifies a different connection string for the `EmailSendingArgs`. `JobQueueConfiguration` class has some additional options in its constructor; * `queueName`: The queue name that is used for this job. The prefix is not added, so you need to specify the full name of the queue. +* `DelayedQueueName`: The delayed queue name that is used for delayed execution of job. The prefix is not added, so you need to specify the full name of the queue. * `connectionName`: The RabbitMQ connection name (see the connection configuration above). This is optional and the default value is `Default`. * `durable` (optional, default: `true`). * `exclusive` (optional, default: `false`). -* `autoDelete` (optional, default: `false`) +* `autoDelete` (optional, default: `false`). +* `PrefetchCount` (optional, default: null) See the RabbitMQ documentation if you want to understand the `durable`, `exclusive` and `autoDelete` options better, while most of the times the default configuration is what you want. diff --git a/docs/en/Distributed-Event-Bus-RabbitMQ-Integration.md b/docs/en/Distributed-Event-Bus-RabbitMQ-Integration.md index 3d99e1e3cf..1961726b8f 100644 --- a/docs/en/Distributed-Event-Bus-RabbitMQ-Integration.md +++ b/docs/en/Distributed-Event-Bus-RabbitMQ-Integration.md @@ -141,13 +141,14 @@ Configure(options => }); ```` -**Example: Configure the client and exchange names** +**Example: Configure the client, exchange names and prefetchCount** ````csharp Configure(options => { options.ClientName = "TestApp1"; options.ExchangeName = "TestMessages"; + options.PrefetchCount = 1; }); ```` diff --git a/docs/zh-Hans/Background-Jobs-RabbitMq.md b/docs/zh-Hans/Background-Jobs-RabbitMq.md index 0f9fb21d8a..8bf61846e7 100644 --- a/docs/zh-Hans/Background-Jobs-RabbitMq.md +++ b/docs/zh-Hans/Background-Jobs-RabbitMq.md @@ -126,25 +126,31 @@ Configure(options => Configure(options => { options.DefaultQueueNamePrefix = "my_app_jobs."; + options.DefaultDelayedQueueNamePrefix = "my_app_jobs.delayed" + options.PrefetchCount = 1; options.JobQueues[typeof(EmailSendingArgs)] = new JobQueueConfiguration( typeof(EmailSendingArgs), queueName: "my_app_jobs.emails", - connectionName: "SecondConnection" + connectionName: "SecondConnection", + delayedQueueName:"my_app_jobs.emails.delayed" ); }); ``` -- 这个示例将默认的队列名前缀设置为 `my_app_jobs.`,如果多个项目都使用的同一个 RabbitMQ 服务,设置不同的前缀可以避免执行其他项目的后台作业. +- 这个示例将默认的队列名前缀设置为 `my_app_jobs.`并且设置默认的延迟队列名为 `my_app_jobs.delayed`,如果多个项目都使用的同一个 RabbitMQ 服务,设置不同的前缀可以避免执行其他项目的后台作业. +- 设置了预取数量, 用于所有队列. - 这里还设置了 `EmailSendingArgs` 绑定的 RabbitMQ 连接. `JobQueueConfiguration` 类的构造函数中,还有一些其他的可选参数. - `queueName`: 指定后台作业对应的队列名称(全名). +* `DelayedQueueName`: 指定后台延迟执行的作业对于的队列名称(全名). - `connectionName`: 后台作业对应的 RabbitMQ 连接名称,默认是 `Default`. - `durable`: 可选参数,默认为 `true`. - `exclusive`: 可选参数,默认为 `false`. - `autoDelete`: 可选参数,默认为 `false`. +* `PrefetchCount` (可选参数, 默认为: null) 如果你想要更多地了解 `durable`,`exclusive`,`autoDelete` 的用法,请阅读 RabbitMQ 提供的文档. diff --git a/docs/zh-Hans/Distributed-Event-Bus-RabbitMQ-Integration.md b/docs/zh-Hans/Distributed-Event-Bus-RabbitMQ-Integration.md index 1cd6b5b9dd..f45d4d90bf 100644 --- a/docs/zh-Hans/Distributed-Event-Bus-RabbitMQ-Integration.md +++ b/docs/zh-Hans/Distributed-Event-Bus-RabbitMQ-Integration.md @@ -141,13 +141,14 @@ Configure(options => }); ```` -**示例: 配置客户端和交换机名称** +**示例: 配置客户端,交换机名称和预取数量** ````csharp Configure(options => { options.ClientName = "TestApp1"; options.ExchangeName = "TestMessages"; + options.PrefetchCount = 1; }); ```` diff --git a/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/AbpRabbitMqBackgroundJobOptions.cs b/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/AbpRabbitMqBackgroundJobOptions.cs index 83efe8ff31..540d848412 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/AbpRabbitMqBackgroundJobOptions.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/AbpRabbitMqBackgroundJobOptions.cs @@ -19,6 +19,8 @@ public class AbpRabbitMqBackgroundJobOptions /// Default value: "AbpBackgroundJobsDelayed." /// public string DefaultDelayedQueueNamePrefix { get; set; } + + public ushort? PrefetchCount { get; set; } public AbpRabbitMqBackgroundJobOptions() { diff --git a/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/JobQueue.cs b/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/JobQueue.cs index 208d7ecd9f..59481840aa 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/JobQueue.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/JobQueue.cs @@ -66,7 +66,8 @@ public class JobQueue : IJobQueue new JobQueueConfiguration( typeof(TArgs), AbpRabbitMqBackgroundJobOptions.DefaultQueueNamePrefix + JobConfiguration.JobName, - AbpRabbitMqBackgroundJobOptions.DefaultDelayedQueueNamePrefix + JobConfiguration.JobName + AbpRabbitMqBackgroundJobOptions.DefaultDelayedQueueNamePrefix + JobConfiguration.JobName, + prefetchCount: AbpRabbitMqBackgroundJobOptions.PrefetchCount ); } @@ -143,6 +144,11 @@ public class JobQueue : IJobQueue Consumer = new AsyncEventingBasicConsumer(ChannelAccessor.Channel); Consumer.Received += MessageReceived; + if (QueueConfiguration.PrefetchCount.HasValue) + { + ChannelAccessor.Channel.BasicQos(0, QueueConfiguration.PrefetchCount.Value, false); + } + //TODO: What BasicConsume returns? ChannelAccessor.Channel.BasicConsume( queue: QueueConfiguration.QueueName, diff --git a/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/JobQueueConfiguration.cs b/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/JobQueueConfiguration.cs index 792eb9815e..ee706ab864 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/JobQueueConfiguration.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/JobQueueConfiguration.cs @@ -20,12 +20,14 @@ public class JobQueueConfiguration : QueueDeclareConfiguration string connectionName = null, bool durable = true, bool exclusive = false, - bool autoDelete = false) + bool autoDelete = false, + ushort? prefetchCount = null) : base( queueName, durable, exclusive, - autoDelete) + autoDelete, + prefetchCount) { JobArgsType = jobArgsType; ConnectionName = connectionName; diff --git a/framework/src/Volo.Abp.EventBus.RabbitMQ/Volo/Abp/EventBus/RabbitMq/AbpRabbitMqEventBusOptions.cs b/framework/src/Volo.Abp.EventBus.RabbitMQ/Volo/Abp/EventBus/RabbitMq/AbpRabbitMqEventBusOptions.cs index addbc49171..bac9bdf0c9 100644 --- a/framework/src/Volo.Abp.EventBus.RabbitMQ/Volo/Abp/EventBus/RabbitMq/AbpRabbitMqEventBusOptions.cs +++ b/framework/src/Volo.Abp.EventBus.RabbitMQ/Volo/Abp/EventBus/RabbitMq/AbpRabbitMqEventBusOptions.cs @@ -13,6 +13,8 @@ public class AbpRabbitMqEventBusOptions public string ExchangeName { get; set; } public string ExchangeType { get; set; } + + public ushort? PrefetchCount { get; set; } public string GetExchangeTypeOrDefault() { diff --git a/framework/src/Volo.Abp.EventBus.RabbitMQ/Volo/Abp/EventBus/RabbitMq/RabbitMqDistributedEventBus.cs b/framework/src/Volo.Abp.EventBus.RabbitMQ/Volo/Abp/EventBus/RabbitMq/RabbitMqDistributedEventBus.cs index c9ec49bc7e..7e352ca530 100644 --- a/framework/src/Volo.Abp.EventBus.RabbitMQ/Volo/Abp/EventBus/RabbitMq/RabbitMqDistributedEventBus.cs +++ b/framework/src/Volo.Abp.EventBus.RabbitMQ/Volo/Abp/EventBus/RabbitMq/RabbitMqDistributedEventBus.cs @@ -78,7 +78,8 @@ public class RabbitMqDistributedEventBus : DistributedEventBusBase, ISingletonDe AbpRabbitMqEventBusOptions.ClientName, durable: true, exclusive: false, - autoDelete: false + autoDelete: false, + prefetchCount: AbpRabbitMqEventBusOptions.PrefetchCount ), AbpRabbitMqEventBusOptions.ConnectionName ); diff --git a/framework/src/Volo.Abp.RabbitMQ/Volo/Abp/RabbitMQ/QueueDeclareConfiguration.cs b/framework/src/Volo.Abp.RabbitMQ/Volo/Abp/RabbitMQ/QueueDeclareConfiguration.cs index 36f638668c..4b03c788c6 100644 --- a/framework/src/Volo.Abp.RabbitMQ/Volo/Abp/RabbitMQ/QueueDeclareConfiguration.cs +++ b/framework/src/Volo.Abp.RabbitMQ/Volo/Abp/RabbitMQ/QueueDeclareConfiguration.cs @@ -13,6 +13,8 @@ public class QueueDeclareConfiguration public bool Exclusive { get; set; } public bool AutoDelete { get; set; } + + public ushort? PrefetchCount { get; set; } public IDictionary Arguments { get; } @@ -20,13 +22,15 @@ public class QueueDeclareConfiguration [NotNull] string queueName, bool durable = true, bool exclusive = false, - bool autoDelete = false) + bool autoDelete = false, + ushort? prefetchCount = null) { QueueName = queueName; Durable = durable; Exclusive = exclusive; AutoDelete = autoDelete; Arguments = new Dictionary(); + PrefetchCount = prefetchCount; } public virtual QueueDeclareOk Declare(IModel channel) diff --git a/framework/src/Volo.Abp.RabbitMQ/Volo/Abp/RabbitMQ/RabbitMqMessageConsumer.cs b/framework/src/Volo.Abp.RabbitMQ/Volo/Abp/RabbitMQ/RabbitMqMessageConsumer.cs index 8ce184295a..c6a61b5da2 100644 --- a/framework/src/Volo.Abp.RabbitMQ/Volo/Abp/RabbitMQ/RabbitMqMessageConsumer.cs +++ b/framework/src/Volo.Abp.RabbitMQ/Volo/Abp/RabbitMQ/RabbitMqMessageConsumer.cs @@ -168,6 +168,11 @@ public class RabbitMqMessageConsumer : IRabbitMqMessageConsumer, ITransientDepen var consumer = new AsyncEventingBasicConsumer(Channel); consumer.Received += HandleIncomingMessageAsync; + if (Queue.PrefetchCount.HasValue) + { + Channel.BasicQos(0, Queue.PrefetchCount.Value, false); + } + Channel.BasicConsume( queue: Queue.QueueName, autoAck: false, From f4dee528fb4a761b8dfc7df14d4f1a0dfea9cb7c Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Mon, 25 Jul 2022 17:01:12 +0800 Subject: [PATCH 27/84] Improve --- .../Volo/Abp/BackgroundJobs/RabbitMQ/JobQueue.cs | 6 +++--- .../Volo/Abp/RabbitMQ/RabbitMqMessageConsumer.cs | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/JobQueue.cs b/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/JobQueue.cs index 59481840aa..9c3bf26e62 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/JobQueue.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/JobQueue.cs @@ -141,14 +141,14 @@ public class JobQueue : IJobQueue if (AbpBackgroundJobOptions.IsJobExecutionEnabled) { - Consumer = new AsyncEventingBasicConsumer(ChannelAccessor.Channel); - Consumer.Received += MessageReceived; - if (QueueConfiguration.PrefetchCount.HasValue) { ChannelAccessor.Channel.BasicQos(0, QueueConfiguration.PrefetchCount.Value, false); } + Consumer = new AsyncEventingBasicConsumer(ChannelAccessor.Channel); + Consumer.Received += MessageReceived; + //TODO: What BasicConsume returns? ChannelAccessor.Channel.BasicConsume( queue: QueueConfiguration.QueueName, diff --git a/framework/src/Volo.Abp.RabbitMQ/Volo/Abp/RabbitMQ/RabbitMqMessageConsumer.cs b/framework/src/Volo.Abp.RabbitMQ/Volo/Abp/RabbitMQ/RabbitMqMessageConsumer.cs index c6a61b5da2..5c45b6aefc 100644 --- a/framework/src/Volo.Abp.RabbitMQ/Volo/Abp/RabbitMQ/RabbitMqMessageConsumer.cs +++ b/framework/src/Volo.Abp.RabbitMQ/Volo/Abp/RabbitMQ/RabbitMqMessageConsumer.cs @@ -165,14 +165,14 @@ public class RabbitMqMessageConsumer : IRabbitMqMessageConsumer, ITransientDepen arguments: Queue.Arguments ); - var consumer = new AsyncEventingBasicConsumer(Channel); - consumer.Received += HandleIncomingMessageAsync; - if (Queue.PrefetchCount.HasValue) { Channel.BasicQos(0, Queue.PrefetchCount.Value, false); } - + + var consumer = new AsyncEventingBasicConsumer(Channel); + consumer.Received += HandleIncomingMessageAsync; + Channel.BasicConsume( queue: Queue.QueueName, autoAck: false, From 7f2f9d91cb96c42ddb162d06cacc8b216c6d2c40 Mon Sep 17 00:00:00 2001 From: maliming Date: Mon, 25 Jul 2022 17:18:42 +0800 Subject: [PATCH 28/84] Rename class files. --- ...groundJobsDbProperties.cs => AbpBackgroundJobsDbProperties.cs} | 0 ...abaseDbProperties.cs => AbpBlobStoringDatabaseDbProperties.cs} | 0 .../{BloggingDbProperties.cs => AbpBloggingDbProperties.cs} | 0 .../CmsKit/{CmsKitDbProperties.cs => AbpCmsKitDbProperties.cs} | 0 .../Volo/Docs/{DocsDbProperties.cs => AbpDocsDbProperties.cs} | 0 ...agementDbProperties.cs => AbpFeatureManagementDbProperties.cs} | 0 6 files changed, 0 insertions(+), 0 deletions(-) rename modules/background-jobs/src/Volo.Abp.BackgroundJobs.Domain/Volo/Abp/BackgroundJobs/{BackgroundJobsDbProperties.cs => AbpBackgroundJobsDbProperties.cs} (100%) rename modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Domain/Volo/Abp/BlobStoring/Database/{BlobStoringDatabaseDbProperties.cs => AbpBlobStoringDatabaseDbProperties.cs} (100%) rename modules/blogging/src/Volo.Blogging.Domain/Volo/Blogging/{BloggingDbProperties.cs => AbpBloggingDbProperties.cs} (100%) rename modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/{CmsKitDbProperties.cs => AbpCmsKitDbProperties.cs} (100%) rename modules/docs/src/Volo.Docs.Domain/Volo/Docs/{DocsDbProperties.cs => AbpDocsDbProperties.cs} (100%) rename modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/{FeatureManagementDbProperties.cs => AbpFeatureManagementDbProperties.cs} (100%) diff --git a/modules/background-jobs/src/Volo.Abp.BackgroundJobs.Domain/Volo/Abp/BackgroundJobs/BackgroundJobsDbProperties.cs b/modules/background-jobs/src/Volo.Abp.BackgroundJobs.Domain/Volo/Abp/BackgroundJobs/AbpBackgroundJobsDbProperties.cs similarity index 100% rename from modules/background-jobs/src/Volo.Abp.BackgroundJobs.Domain/Volo/Abp/BackgroundJobs/BackgroundJobsDbProperties.cs rename to modules/background-jobs/src/Volo.Abp.BackgroundJobs.Domain/Volo/Abp/BackgroundJobs/AbpBackgroundJobsDbProperties.cs diff --git a/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Domain/Volo/Abp/BlobStoring/Database/BlobStoringDatabaseDbProperties.cs b/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Domain/Volo/Abp/BlobStoring/Database/AbpBlobStoringDatabaseDbProperties.cs similarity index 100% rename from modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Domain/Volo/Abp/BlobStoring/Database/BlobStoringDatabaseDbProperties.cs rename to modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Domain/Volo/Abp/BlobStoring/Database/AbpBlobStoringDatabaseDbProperties.cs diff --git a/modules/blogging/src/Volo.Blogging.Domain/Volo/Blogging/BloggingDbProperties.cs b/modules/blogging/src/Volo.Blogging.Domain/Volo/Blogging/AbpBloggingDbProperties.cs similarity index 100% rename from modules/blogging/src/Volo.Blogging.Domain/Volo/Blogging/BloggingDbProperties.cs rename to modules/blogging/src/Volo.Blogging.Domain/Volo/Blogging/AbpBloggingDbProperties.cs diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/CmsKitDbProperties.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/AbpCmsKitDbProperties.cs similarity index 100% rename from modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/CmsKitDbProperties.cs rename to modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/AbpCmsKitDbProperties.cs diff --git a/modules/docs/src/Volo.Docs.Domain/Volo/Docs/DocsDbProperties.cs b/modules/docs/src/Volo.Docs.Domain/Volo/Docs/AbpDocsDbProperties.cs similarity index 100% rename from modules/docs/src/Volo.Docs.Domain/Volo/Docs/DocsDbProperties.cs rename to modules/docs/src/Volo.Docs.Domain/Volo/Docs/AbpDocsDbProperties.cs diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/FeatureManagementDbProperties.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/AbpFeatureManagementDbProperties.cs similarity index 100% rename from modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/FeatureManagementDbProperties.cs rename to modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/AbpFeatureManagementDbProperties.cs From d39838be93ea0aa258e214c7adbf8e5104e4910f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alper=20Ebi=C3=A7o=C4=9Flu?= <9526587+ebicoglu@users.noreply.github.com> Date: Mon, 25 Jul 2022 12:29:31 +0300 Subject: [PATCH 29/84] Update en.json --- .../AbpIoLocalization/Admin/Localization/Resources/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json index a0be283b18..7a064a8ce7 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json @@ -399,6 +399,6 @@ "AllowFeatureUpgradeOnLicenseExpire": "Allow feature upgrade on license expire", "Deleted{0}": "[Deleted {0}]", "Tags": "Tags", - "SetTagsInfo": "Enter tags separated by commas. Example CSharp, Entity Framework" + "SetTagsInfo": "Tags should be comma-separated. Eg: CSharp, Entity Framework" } } From ed85f58a62351c4bc7a147e4a1af70bf798d37be Mon Sep 17 00:00:00 2001 From: TotPeRo Date: Mon, 25 Jul 2022 04:15:32 -0700 Subject: [PATCH 30/84] fix ro translated some translation fixes --- .../Localization/Resources/AbpUi/ro-RO.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/ro-RO.json b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/ro-RO.json index 94e56a66f3..7064064671 100644 --- a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/ro-RO.json +++ b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/ro-RO.json @@ -31,14 +31,14 @@ "PagerPrevious": "Anterior", "PagerFirst": "Primul", "PagerLast": "Ultimul", - "PagerInfo": "Afişate _START_ to _END_ of _TOTAL_ înregistrări", - "PagerInfo{0}{1}{2}": "Afişate {0} to {1} of {2} înregistrări", - "PagerInfoEmpty": "Afişate 0 to 0 of 0 înregistrări", + "PagerInfo": "Afişate de la _START_ la _END_ din _TOTAL_ înregistrări", + "PagerInfo{0}{1}{2}": "Afişate de la {0} la {1} din {2} înregistrări", + "PagerInfoEmpty": "Afişate 0 din 0 înregistrări", "PagerInfoFiltered": "(filtrate de la _MAX_ înregistrări totale)", "NoDataAvailableInDatatable": "Nicio informaţie disponibilă", "Total": "total", "Selected": "selectate", - "PagerShowMenuEntries": "Arată _MENU_ intrări", + "PagerShowMenuEntries": "Afişează _MENU_ intrări", "DatatableActionDropdownDefaultText": "Acţiuni", "ChangePassword": "Schimbă parola", "PersonalInfo": "Profilul meu", @@ -50,4 +50,4 @@ "ItemWillBeDeletedMessage": "Acest articol va fi şters!", "ManageYourAccount": "Administraţi-vă contul" } -} \ No newline at end of file +} From c1ab01258388a317992779eef087f2535442d15b Mon Sep 17 00:00:00 2001 From: malik masis Date: Tue, 26 Jul 2022 14:30:36 +0300 Subject: [PATCH 31/84] Added virtual keyword --- .../Volo/CmsKit/Contents/ContentController.cs | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/modules/cms-kit/src/Volo.CmsKit.Common.HttpApi/Volo/CmsKit/Contents/ContentController.cs b/modules/cms-kit/src/Volo.CmsKit.Common.HttpApi/Volo/CmsKit/Contents/ContentController.cs index 5b535b29f9..e0bcf5586a 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Common.HttpApi/Volo/CmsKit/Contents/ContentController.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Common.HttpApi/Volo/CmsKit/Contents/ContentController.cs @@ -3,7 +3,6 @@ using System.Collections.Generic; using System.IO; using System.Text.Encodings.Web; using System.Threading.Tasks; -using Microsoft.AspNetCore.Html; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Rendering; using Microsoft.AspNetCore.Mvc.ViewComponents; @@ -32,14 +31,14 @@ public class ContentController : Controller, IContentAppService [HttpGet] [Route("{parseashtml}")] - public async Task ParseAsHtmlAsync(string content) + public virtual async Task ParseAsHtmlAsync(string content) { var fragments = await ParseAsync(content); return await RenderViewComponent("ContentFragment", new PageDto() { ContentFragments = fragments }); } - public virtual async Task> ParseAsync(string content) + public virtual Task> ParseAsync(string content) { - return await ContentAppService.ParseAsync(content); + return ContentAppService.ParseAsync(content); } private async Task RenderViewComponent(string viewComponent, object args) From ecdf48a98c5217ce656338cc0791515a6e063b8b Mon Sep 17 00:00:00 2001 From: malik masis Date: Tue, 26 Jul 2022 14:30:49 +0300 Subject: [PATCH 32/84] Update CmsKitWebUnifiedModule.cs --- .../CmsKitWebUnifiedModule.cs | 27 +++++++++---------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/CmsKitWebUnifiedModule.cs b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/CmsKitWebUnifiedModule.cs index 4a07c92ca8..e3094a7da8 100644 --- a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/CmsKitWebUnifiedModule.cs +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/CmsKitWebUnifiedModule.cs @@ -1,11 +1,7 @@ using System.IO; -using System.Linq; using Microsoft.AspNetCore.Builder; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; -using Volo.CmsKit.EntityFrameworkCore; -using Volo.CmsKit.MultiTenancy; -using Volo.CmsKit.Web; using Microsoft.OpenApi.Models; using Volo.Abp; using Volo.Abp.Account; @@ -19,8 +15,8 @@ using Volo.Abp.BlobStoring.Database.EntityFrameworkCore; using Volo.Abp.Data; using Volo.Abp.EntityFrameworkCore; using Volo.Abp.EntityFrameworkCore.SqlServer; -using Volo.Abp.FeatureManagement.EntityFrameworkCore; using Volo.Abp.FeatureManagement; +using Volo.Abp.FeatureManagement.EntityFrameworkCore; using Volo.Abp.Identity; using Volo.Abp.Identity.EntityFrameworkCore; using Volo.Abp.Identity.Web; @@ -29,6 +25,7 @@ using Volo.Abp.Modularity; using Volo.Abp.MultiTenancy; using Volo.Abp.PermissionManagement; using Volo.Abp.PermissionManagement.EntityFrameworkCore; +using Volo.Abp.PermissionManagement.HttpApi; using Volo.Abp.PermissionManagement.Identity; using Volo.Abp.SettingManagement.EntityFrameworkCore; using Volo.Abp.Swashbuckle; @@ -38,15 +35,16 @@ using Volo.Abp.TenantManagement.Web; using Volo.Abp.Threading; using Volo.Abp.VirtualFileSystem; using Volo.CmsKit.Admin.Web; -using Volo.CmsKit.Public.Web; -using System; -using Volo.Abp.PermissionManagement.HttpApi; -using Volo.CmsKit.Tags; using Volo.CmsKit.Comments; +using Volo.CmsKit.Contents; +using Volo.CmsKit.EntityFrameworkCore; using Volo.CmsKit.MediaDescriptors; -using Volo.CmsKit.Reactions; +using Volo.CmsKit.MultiTenancy; +using Volo.CmsKit.Public.Web; using Volo.CmsKit.Ratings; -using Volo.CmsKit.Contents; +using Volo.CmsKit.Reactions; +using Volo.CmsKit.Tags; +using Volo.CmsKit.Web; namespace Volo.CmsKit; @@ -93,9 +91,8 @@ public class CmsKitWebUnifiedModule : AbpModule public override void ConfigureServices(ServiceConfigurationContext context) { var hostingEnvironment = context.Services.GetHostingEnvironment(); - var configuration = context.Services.GetConfiguration(); - ConfigureCmsKit(context); + ConfigureCmsKit(); Configure(options => { @@ -156,11 +153,11 @@ public class CmsKitWebUnifiedModule : AbpModule Configure(options => { - options.AddWidget("ExComment", "CommentDate"); + options.AddWidget("ExComment", "CommentDate", "DecisionCommentDate"); }); } - private void ConfigureCmsKit(ServiceConfigurationContext context) + private void ConfigureCmsKit() { Configure(options => { From e8494c5b65303ec8bfb6e5ae052901b83198c40d Mon Sep 17 00:00:00 2001 From: Engincan VESKE Date: Tue, 26 Jul 2022 14:33:52 +0300 Subject: [PATCH 33/84] Add new localizations for abp.io website --- .../AbpIoLocalization/Www/AbpIoWwwResource.cs | 5 ++++- .../AbpIoLocalization/Www/Localization/Resources/en.json | 9 ++++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Www/AbpIoWwwResource.cs b/abp_io/AbpIoLocalization/AbpIoLocalization/Www/AbpIoWwwResource.cs index 552b5949e1..f64552be30 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Www/AbpIoWwwResource.cs +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Www/AbpIoWwwResource.cs @@ -1,5 +1,8 @@ -namespace AbpIoLocalization.Www +using Volo.Abp.Localization; + +namespace AbpIoLocalization.Www { + [LocalizationResourceName("AbpIoWww")] public class AbpIoWwwResource { diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json index 41eda60de6..7f851fd632 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json @@ -372,6 +372,13 @@ "MasteringAbpFramework_Book_What_You_Will_Learn_8": "Write unit, integration, and UI tests using ABP Framework.", "MasteringAbpFramework_Book_WhoIsThisBookFor": "Who's this book for", "MasteringAbpFramework_Book_WhoIsThisBookFor_Description": "This book is for web developers who want to learn software architectures and best practices for building\n maintainable web-based solutions using Microsoft technologies and ABP Framework. Basic knowledge of C#\n and ASP.NET Core is necessary to get started with this book.", - "ComputersAndTechnology": "Computers & Technology" + "ComputersAndTechnology": "Computers & Technology", + "SelectUITheme": "Select UI Theme", + "LeptonXLiteTheme": "LeptonX Lite Theme", + "BasicTheme": "Basic Theme", + "LeptonXLiteThemeInfo": " A modern and stylish Bootstrap UI theme. Ideal if you want to have a production ready UI theme. This is the newest theme and is the default.", + "BasicThemeInfo": "Minimalist UI theme with plain Bootstrap colors and styles. Ideal if you will build your own UI theme.", + "SeeDocumentation": "See documentation.", + "SeeFullScreen": "🖼️ See full screen" } } From e0e576a4ba67ff9279b4cd30e9ead572245da580 Mon Sep 17 00:00:00 2001 From: malik masis Date: Tue, 26 Jul 2022 18:29:47 +0300 Subject: [PATCH 34/84] Removed render folder from public --- .../Renderers/IMarkdownToHtmlRenderer.cs | 8 -- .../Renderers/MarkdownToHtmlRenderer.cs | 129 ------------------ 2 files changed, 137 deletions(-) delete mode 100644 modules/cms-kit/src/Volo.CmsKit.Public.Web/Renderers/IMarkdownToHtmlRenderer.cs delete mode 100644 modules/cms-kit/src/Volo.CmsKit.Public.Web/Renderers/MarkdownToHtmlRenderer.cs diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Renderers/IMarkdownToHtmlRenderer.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Renderers/IMarkdownToHtmlRenderer.cs deleted file mode 100644 index d11e76f6dd..0000000000 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Renderers/IMarkdownToHtmlRenderer.cs +++ /dev/null @@ -1,8 +0,0 @@ -using System.Threading.Tasks; - -namespace Volo.CmsKit.Public.Web.Renderers; - -public interface IMarkdownToHtmlRenderer -{ - Task RenderAsync(string rawMarkdown, bool preventXSS = true); -} diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Renderers/MarkdownToHtmlRenderer.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Renderers/MarkdownToHtmlRenderer.cs deleted file mode 100644 index b6fab3c008..0000000000 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Renderers/MarkdownToHtmlRenderer.cs +++ /dev/null @@ -1,129 +0,0 @@ -using System.Collections.Generic; -using System.Linq; -using System.Text.RegularExpressions; -using Markdig; -using System.Threading.Tasks; -using System.Web; -using Volo.Abp.DependencyInjection; -using Ganss.XSS; - -namespace Volo.CmsKit.Public.Web.Renderers; - -public class MarkdownToHtmlRenderer : IMarkdownToHtmlRenderer, ITransientDependency -{ - private readonly HtmlSanitizer _htmlSanitizer; - protected MarkdownPipeline MarkdownPipeline { get; } - - public MarkdownToHtmlRenderer(MarkdownPipeline markdownPipeline) - { - MarkdownPipeline = markdownPipeline; - _htmlSanitizer = new HtmlSanitizer(); - } - - public async Task RenderAsync(string rawMarkdown, bool preventXSS = false) - { - if (preventXSS) - { - rawMarkdown = EncodeHtmlTags(rawMarkdown, true); - } - - var html = Markdown.ToHtml(rawMarkdown, MarkdownPipeline); - - if (preventXSS) - { - html = _htmlSanitizer.Sanitize(html); - } - - return html; - } - - - private static List GetCodeBlockIndices(string markdownText) - { - var regexObj = new Regex(@"```(\w)*|`(\w)*", RegexOptions.IgnoreCase | - RegexOptions.IgnorePatternWhitespace | - RegexOptions.Singleline | - RegexOptions.Multiline | - RegexOptions.ExplicitCapture); - - var matches = regexObj.Matches(markdownText); - var indices = new List(); - - for (var i = 0; i < matches.Count; i++) - { - if (!indices.Any() || indices.Last().EndIndex.HasValue) - { - indices.Add(new CodeBlockIndexPair(matches[i].Index)); - } - else - { - indices.Last().EndIndex = matches[i].Index; - } - } - - return indices; - } - - /// - /// Encodes html tags. - /// - private static string EncodeHtmlTags(string text, bool dontEncodeCodeBlocks = true) - { - List codeBlockIndices = null; - if (dontEncodeCodeBlocks) - { - codeBlockIndices = GetCodeBlockIndices(text); - } - - return Regex.Replace(text, @"<[^>]*>", match => - { - if (dontEncodeCodeBlocks && codeBlockIndices != null) - { - var isInCodeBlock = false; - foreach (var codeBlock in codeBlockIndices) - { - if (IsInCodeBlock(match.Index, codeBlock.StartIndex, codeBlock.EndIndex)) - { - isInCodeBlock = true; - break; - } - } - - if (isInCodeBlock) - { - return match.ToString(); - } - else - { - return HttpUtility.HtmlEncode(match.ToString()); - } - } - else - { - return HttpUtility.HtmlEncode(match.ToString()); - } - }); - } - - private static bool IsInCodeBlock(int currentIndex, int codeBlockStartIndex, int? codeBlockEndIndex) - { - if (codeBlockEndIndex.HasValue) - { - return (currentIndex >= codeBlockStartIndex && currentIndex <= codeBlockEndIndex); - } - - return currentIndex >= codeBlockStartIndex; - } - - private class CodeBlockIndexPair - { - public int StartIndex { get; private set; } - public int? EndIndex { get; set; } - - public CodeBlockIndexPair(int startIndex, int? endIndex = null) - { - StartIndex = startIndex; - EndIndex = endIndex; - } - } -} From d7714c90d7c39a15bf122aa8e896b7d981e9efb5 Mon Sep 17 00:00:00 2001 From: malik masis Date: Tue, 26 Jul 2022 18:31:21 +0300 Subject: [PATCH 35/84] Moved BlogPostPublicDto --- .../CmsKit/Contents}/BlogPostPublicDto.cs | 7 +- .../Public/Blogs/IBlogPostPublicAppService.cs | 6 +- .../BlogPostPublicClientProxy.Generated.cs | 4 +- .../PagesPublicClientProxy.Generated.cs | 6 +- .../Public/Blogs/BlogPostPublicController.cs | 7 +- .../Commenting/CommentingViewComponent.cs | 2 +- .../Pages/Public/CmsKit/Blogs/BlogPost.cshtml | 90 +++++++++---------- .../Public/CmsKit/Blogs/BlogPost.cshtml.cs | 1 + .../Pages/Public/CmsKit/Blogs/Index.cshtml.cs | 8 +- .../Pages/Public/CmsKit/Pages/Index.cshtml | 2 +- 10 files changed, 58 insertions(+), 75 deletions(-) rename modules/cms-kit/src/{Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs => Volo.CmsKit.Common.Application.Contracts/Volo/CmsKit/Contents}/BlogPostPublicDto.cs (80%) 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.Common.Application.Contracts/Volo/CmsKit/Contents/BlogPostPublicDto.cs similarity index 80% rename from modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/BlogPostPublicDto.cs rename to modules/cms-kit/src/Volo.CmsKit.Common.Application.Contracts/Volo/CmsKit/Contents/BlogPostPublicDto.cs index 695f50836e..d00a6364f1 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/BlogPostPublicDto.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Common.Application.Contracts/Volo/CmsKit/Contents/BlogPostPublicDto.cs @@ -1,13 +1,12 @@ using System; using System.Collections.Generic; using Volo.Abp.Application.Dtos; -using Volo.CmsKit.Contents; using Volo.CmsKit.Users; -namespace Volo.CmsKit.Public.Blogs; +namespace Volo.CmsKit.Contents; [Serializable] -public class BlogPostPublicDto : AuditedEntityDto +public class BlogPostPublicDto : AuditedEntityDto, IContent { public Guid BlogId { get; set; } @@ -24,4 +23,4 @@ public class BlogPostPublicDto : AuditedEntityDto public Guid? CoverImageMediaId { get; set; } public CmsUserDto Author { get; set; } -} +} \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/IBlogPostPublicAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/IBlogPostPublicAppService.cs index 42161f884c..b60b500cfe 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/IBlogPostPublicAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/IBlogPostPublicAppService.cs @@ -1,10 +1,10 @@ -using System.Collections.Generic; -using JetBrains.Annotations; +using System; using System.Threading.Tasks; +using JetBrains.Annotations; using Volo.Abp.Application.Dtos; using Volo.Abp.Application.Services; +using Volo.CmsKit.Contents; using Volo.CmsKit.Users; -using System; namespace Volo.CmsKit.Public.Blogs; diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/BlogPostPublicClientProxy.Generated.cs b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/BlogPostPublicClientProxy.Generated.cs index b1bbf6be07..8d66adc208 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/BlogPostPublicClientProxy.Generated.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/BlogPostPublicClientProxy.Generated.cs @@ -2,11 +2,9 @@ using System; using System.Threading.Tasks; using Volo.Abp.Application.Dtos; -using Volo.Abp.Http.Client; -using Volo.Abp.Http.Modeling; using Volo.Abp.DependencyInjection; using Volo.Abp.Http.Client.ClientProxying; -using Volo.CmsKit.Public.Blogs; +using Volo.CmsKit.Contents; using Volo.CmsKit.Users; // ReSharper disable once CheckNamespace diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/PagesPublicClientProxy.Generated.cs b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/PagesPublicClientProxy.Generated.cs index 9ecf6cb387..f992bb3dbf 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/PagesPublicClientProxy.Generated.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/PagesPublicClientProxy.Generated.cs @@ -1,12 +1,8 @@ // This file is automatically generated by ABP framework to use MVC Controllers from CSharp -using System; using System.Threading.Tasks; -using Volo.Abp.Application.Dtos; -using Volo.Abp.Http.Client; -using Volo.Abp.Http.Modeling; using Volo.Abp.DependencyInjection; using Volo.Abp.Http.Client.ClientProxying; -using Volo.CmsKit.Public.Pages; +using Volo.CmsKit.Contents; // ReSharper disable once CheckNamespace namespace Volo.CmsKit.Public.Pages.ClientProxies; diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Blogs/BlogPostPublicController.cs b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Blogs/BlogPostPublicController.cs index 9f43d65766..c068c4b5e6 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Blogs/BlogPostPublicController.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Blogs/BlogPostPublicController.cs @@ -1,11 +1,10 @@ -using Microsoft.AspNetCore.Mvc; -using System; -using System.Collections.Generic; +using System; using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc; using Volo.Abp; using Volo.Abp.Application.Dtos; -using Volo.Abp.Content; using Volo.Abp.GlobalFeatures; +using Volo.CmsKit.Contents; using Volo.CmsKit.GlobalFeatures; using Volo.CmsKit.Users; diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Commenting/CommentingViewComponent.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Commenting/CommentingViewComponent.cs index 0a608740e9..03b040f2e9 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Commenting/CommentingViewComponent.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Commenting/CommentingViewComponent.cs @@ -8,7 +8,7 @@ using Volo.Abp.AspNetCore.Mvc; using Volo.Abp.AspNetCore.Mvc.UI; using Volo.Abp.AspNetCore.Mvc.UI.Widgets; using Volo.CmsKit.Public.Comments; -using Volo.CmsKit.Public.Web.Renderers; +using Volo.CmsKit.Web.Renderers; namespace Volo.CmsKit.Public.Web.Pages.CmsKit.Shared.Components.Commenting; diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/BlogPost.cshtml b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/BlogPost.cshtml index 2cff5c9072..fe9227f194 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/BlogPost.cshtml +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/BlogPost.cshtml @@ -9,9 +9,9 @@ @using Volo.CmsKit.Public.Web.Pages.CmsKit.Shared.Components.ReactionSelection @using Volo.CmsKit.Public.Web.Pages.CmsKit.Shared.Components.Rating @using Volo.CmsKit.Public.Web.Pages.CmsKit.Shared.Components.Tags -@using Volo.CmsKit.Public.Web.Renderers @using Volo.Abp.AspNetCore.Mvc.UI.Packages.HighlightJs @using Volo.CmsKit.Contents +@using Volo.CmsKit.Web.Renderers @inherits CmsKitPublicPageBase @@ -32,13 +32,14 @@ } + } - @section scripts{ +@section scripts{ @if (isScrollIndexEnabled) { @@ -54,49 +55,39 @@ } -
-
- - - - -
-

@Model.BlogPost.Title

-

- - @@@Model.BlogPost.Author?.UserName - - @Model.BlogPost.CreationTime -

- @foreach (var contentFragment in Model.BlogPost.ContentFragments) +
+
+ + + + +
+

@Model.BlogPost.Title

+

+ + @@@Model.BlogPost.Author?.UserName + + @Model.BlogPost.CreationTime +

+ @await Component.InvokeAsync("ContentFragment", new { contentDto = Model.BlogPost }) +

+ @if (Model.BlogPost.LastModificationTime != null) { - if (contentFragment.Type == ContentConsts.Markdown) - { - @Html.Raw(await MarkdownRenderer.RenderAsync(contentFragment.GetProperty("Content"))) - } - else if (contentFragment.Type == ContentConsts.Widget) - { - @await Component.InvokeAsync(contentFragment.GetProperty("Type"), contentFragment.ExtraProperties.ConvertToDynamicObject()) - } + @L["LastModification"].Value : @Model.BlogPost.LastModificationTime } -

- @if (Model.BlogPost.LastModificationTime != null) - { - @L["LastModification"].Value : @Model.BlogPost.LastModificationTime - } -

-
+

+
- @if (GlobalFeatureManager.Instance.IsEnabled()) + @if (GlobalFeatureManager.Instance.IsEnabled()) + { + if (Model.TagsFeature?.IsEnabled == true) { - if (Model.TagsFeature?.IsEnabled == true) + @await Component.InvokeAsync(typeof(TagViewComponent), new { - @await Component.InvokeAsync(typeof(TagViewComponent), new - { - entityType = Volo.CmsKit.Blogs.BlogPostConsts.EntityType, - entityId = Model.BlogPost.Id.ToString(), - urlFormat = $"/blogs/{Model.BlogSlug}?tagId={{TagId}}" - }) + entityType = Volo.CmsKit.Blogs.BlogPostConsts.EntityType, + entityId = Model.BlogPost.Id.ToString(), + urlFormat = $"/blogs/{Model.BlogSlug}?tagId={{TagId}}" + }) } }
@@ -109,10 +100,10 @@ if (Model.ReactionsFeature?.IsEnabled == true) { @await Component.InvokeAsync(typeof(ReactionSelectionViewComponent), new - { - entityType = Volo.CmsKit.Blogs.BlogPostConsts.EntityType, - entityId = Model.BlogPost.Id.ToString() - }) + { + entityType = Volo.CmsKit.Blogs.BlogPostConsts.EntityType, + entityId = Model.BlogPost.Id.ToString() + }) } } @@ -122,10 +113,10 @@ if (Model.RatingsFeature?.IsEnabled == true) { @await Component.InvokeAsync(typeof(RatingViewComponent), new - { - entityType = Volo.CmsKit.Blogs.BlogPostConsts.EntityType, - entityId = Model.BlogPost.Id.ToString() - }) + { + entityType = Volo.CmsKit.Blogs.BlogPostConsts.EntityType, + entityId = Model.BlogPost.Id.ToString() + }) } } @@ -133,6 +124,7 @@
+ @if (isScrollIndexEnabled) {
@@ -140,7 +132,7 @@
@L["InThisDocument"]
- +
diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/BlogPost.cshtml.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/BlogPost.cshtml.cs index 6227190ab8..f81f9fca7f 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/BlogPost.cshtml.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/BlogPost.cshtml.cs @@ -2,6 +2,7 @@ using Microsoft.AspNetCore.Mvc; using Volo.Abp.GlobalFeatures; using Volo.CmsKit.Blogs; +using Volo.CmsKit.Contents; using Volo.CmsKit.GlobalFeatures; using Volo.CmsKit.Public.Blogs; diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/Index.cshtml.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/Index.cshtml.cs index f5f2cc2f7a..c40fe4d116 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/Index.cshtml.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/Index.cshtml.cs @@ -1,11 +1,9 @@ -using Microsoft.AspNetCore.Mvc; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; +using System; using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc; using Volo.Abp.Application.Dtos; using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Pagination; +using Volo.CmsKit.Contents; using Volo.CmsKit.Public.Blogs; using Volo.CmsKit.Users; diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Pages/Index.cshtml b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Pages/Index.cshtml index cc72b8b0c8..250303177b 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Pages/Index.cshtml +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Pages/Index.cshtml @@ -25,7 +25,7 @@ - @await Component.InvokeAsync("ContentFragment", new { pageDto = Model.PageDto }) + @await Component.InvokeAsync("ContentFragment", new { contentDto = Model.PageDto }) From 5cbc145271889e32f5ff5ecda4088d4605aa029d Mon Sep 17 00:00:00 2001 From: malik masis Date: Tue, 26 Jul 2022 18:32:24 +0300 Subject: [PATCH 36/84] Decreased the duplication --- .../Volo/CmsKit/Contents/IContent.cs | 7 +++++++ .../Volo/CmsKit/Contents/PageDto.cs | 2 +- .../Contents/ContentFragment.cshtml | 2 +- .../Contents/ContentFragmentViewComponent.cs | 16 ++++++---------- 4 files changed, 15 insertions(+), 12 deletions(-) create mode 100644 modules/cms-kit/src/Volo.CmsKit.Common.Application.Contracts/Volo/CmsKit/Contents/IContent.cs diff --git a/modules/cms-kit/src/Volo.CmsKit.Common.Application.Contracts/Volo/CmsKit/Contents/IContent.cs b/modules/cms-kit/src/Volo.CmsKit.Common.Application.Contracts/Volo/CmsKit/Contents/IContent.cs new file mode 100644 index 0000000000..2a393e0a14 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Common.Application.Contracts/Volo/CmsKit/Contents/IContent.cs @@ -0,0 +1,7 @@ +using System.Collections.Generic; + +namespace Volo.CmsKit.Contents; +public interface IContent +{ + public List ContentFragments { get; set; } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Common.Application.Contracts/Volo/CmsKit/Contents/PageDto.cs b/modules/cms-kit/src/Volo.CmsKit.Common.Application.Contracts/Volo/CmsKit/Contents/PageDto.cs index 996a867fcf..0b573be372 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Common.Application.Contracts/Volo/CmsKit/Contents/PageDto.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Common.Application.Contracts/Volo/CmsKit/Contents/PageDto.cs @@ -5,7 +5,7 @@ using Volo.Abp.Application.Dtos; namespace Volo.CmsKit.Contents; [Serializable] -public class PageDto : EntityDto +public class PageDto : EntityDto, IContent { public string Title { get; set; } diff --git a/modules/cms-kit/src/Volo.CmsKit.Common.Web/Contents/ContentFragment.cshtml b/modules/cms-kit/src/Volo.CmsKit.Common.Web/Contents/ContentFragment.cshtml index 994660600a..f0dce03b75 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Common.Web/Contents/ContentFragment.cshtml +++ b/modules/cms-kit/src/Volo.CmsKit.Common.Web/Contents/ContentFragment.cshtml @@ -7,7 +7,7 @@ @inject IMarkdownToHtmlRenderer MarkdownRenderer -@foreach (var contentFragment in Model.PageDto.ContentFragments) +@foreach (var contentFragment in Model.ContentDto.ContentFragments) { if (contentFragment.Type == "Markdown") { diff --git a/modules/cms-kit/src/Volo.CmsKit.Common.Web/Contents/ContentFragmentViewComponent.cs b/modules/cms-kit/src/Volo.CmsKit.Common.Web/Contents/ContentFragmentViewComponent.cs index e6b7004940..6deeb90e22 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Common.Web/Contents/ContentFragmentViewComponent.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Common.Web/Contents/ContentFragmentViewComponent.cs @@ -1,26 +1,22 @@ using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; +using Volo.Abp.AspNetCore.Mvc; using Volo.Abp.AspNetCore.Mvc.UI.Widgets; using Volo.CmsKit.Contents; namespace Volo.CmsKit.Web.Contents; +[ViewComponent(Name = "ContentFragment")] [Widget( AutoInitialize = true )] -[ViewComponent(Name = "ContentFragment")] -public class ContentFragmentViewComponent : ViewComponent +public class ContentFragmentViewComponent : AbpViewComponent { - public PageDto PageDto { get; set; } - - public ContentFragmentViewComponent() - { - PageDto = new(); - } + public IContent ContentDto { get; set; } - public virtual async Task InvokeAsync(PageDto pageDto) + public virtual async Task InvokeAsync(IContent contentDto) { - return View("~/Contents/ContentFragment.cshtml", new ContentFragmentViewComponent() { PageDto = pageDto }); + return View("~/Contents/ContentFragment.cshtml", new ContentFragmentViewComponent() { ContentDto = contentDto }); } } From 8a56adf86e33c13497081a6eb0eaccfd233f2d01 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Wed, 27 Jul 2022 10:02:23 +0800 Subject: [PATCH 37/84] Update Volo.Abp.FeatureManagement.csproj --- .../Volo.Abp.FeatureManagement.Web.csproj | 4 ---- 1 file changed, 4 deletions(-) diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Volo.Abp.FeatureManagement.Web.csproj b/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Volo.Abp.FeatureManagement.Web.csproj index 4b1394c27d..f9e1bdb16e 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Volo.Abp.FeatureManagement.Web.csproj +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Volo.Abp.FeatureManagement.Web.csproj @@ -37,8 +37,4 @@ - - <_ContentIncludedByDefault Remove="Pages\Components\FeatureSettingGroup\Default.cshtml" /> - - From 873bbbb544e5e6c2477297bdaece75571b6562ed Mon Sep 17 00:00:00 2001 From: JRoger Date: Wed, 27 Jul 2022 10:08:02 +0800 Subject: [PATCH 38/84] chore(test): disable auto generator launchSettings.json --- .../Volo.Abp.AspNetCore.Mvc.PlugIn.csproj | 1 + 1 file changed, 1 insertion(+) diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.PlugIn/Volo.Abp.AspNetCore.Mvc.PlugIn.csproj b/framework/test/Volo.Abp.AspNetCore.Mvc.PlugIn/Volo.Abp.AspNetCore.Mvc.PlugIn.csproj index 91ca2b1312..d917afa97f 100644 --- a/framework/test/Volo.Abp.AspNetCore.Mvc.PlugIn/Volo.Abp.AspNetCore.Mvc.PlugIn.csproj +++ b/framework/test/Volo.Abp.AspNetCore.Mvc.PlugIn/Volo.Abp.AspNetCore.Mvc.PlugIn.csproj @@ -4,6 +4,7 @@ net6.0 Library true + true From 93e82598a5b65094c9926f4c93e1c7ffc720b88d Mon Sep 17 00:00:00 2001 From: JRoger Date: Wed, 27 Jul 2022 10:09:47 +0800 Subject: [PATCH 39/84] chore(test): disable auto generator launchSettings.json --- framework/test/Volo.Abp.TestApp/Volo.Abp.TestApp.csproj | 1 + 1 file changed, 1 insertion(+) diff --git a/framework/test/Volo.Abp.TestApp/Volo.Abp.TestApp.csproj b/framework/test/Volo.Abp.TestApp/Volo.Abp.TestApp.csproj index 0664ad2b7b..5a6382eb80 100644 --- a/framework/test/Volo.Abp.TestApp/Volo.Abp.TestApp.csproj +++ b/framework/test/Volo.Abp.TestApp/Volo.Abp.TestApp.csproj @@ -5,6 +5,7 @@ net6.0 + true From e47e6973137d363d5e2fb7f3a7a535572285edaa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alper=20Ebi=C3=A7o=C4=9Flu?= <9526587+ebicoglu@users.noreply.github.com> Date: Wed, 27 Jul 2022 11:39:59 +0300 Subject: [PATCH 40/84] Update en.json --- .../AbpIoLocalization/Www/Localization/Resources/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json index 7f851fd632..c4098bab35 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json @@ -379,6 +379,6 @@ "LeptonXLiteThemeInfo": " A modern and stylish Bootstrap UI theme. Ideal if you want to have a production ready UI theme. This is the newest theme and is the default.", "BasicThemeInfo": "Minimalist UI theme with plain Bootstrap colors and styles. Ideal if you will build your own UI theme.", "SeeDocumentation": "See documentation.", - "SeeFullScreen": "🖼️ See full screen" + "SeeFullScreen": "🖼️ See the screenshot" } } From c267c6db7333f4771e44be11abb952e40a0cd996 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=B0smail=20=C3=87A=C4=9EDA=C5=9E?= Date: Thu, 28 Jul 2022 15:46:50 +0300 Subject: [PATCH 41/84] Rename angular.md to Angular.md --- docs/en/Themes/LeptonXLite/{angular.md => Angular.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename docs/en/Themes/LeptonXLite/{angular.md => Angular.md} (100%) diff --git a/docs/en/Themes/LeptonXLite/angular.md b/docs/en/Themes/LeptonXLite/Angular.md similarity index 100% rename from docs/en/Themes/LeptonXLite/angular.md rename to docs/en/Themes/LeptonXLite/Angular.md From de20d36151567a126c7467a83ef4a8d0d3cbda05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=B0smail=20=C3=87A=C4=9EDA=C5=9E?= Date: Thu, 28 Jul 2022 15:47:00 +0300 Subject: [PATCH 42/84] Rename blazor.md to Blazor.md --- docs/en/Themes/LeptonXLite/{blazor.md => Blazor.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename docs/en/Themes/LeptonXLite/{blazor.md => Blazor.md} (100%) diff --git a/docs/en/Themes/LeptonXLite/blazor.md b/docs/en/Themes/LeptonXLite/Blazor.md similarity index 100% rename from docs/en/Themes/LeptonXLite/blazor.md rename to docs/en/Themes/LeptonXLite/Blazor.md From 93b07d076fa737f7369c5380bdaba3164cbb6947 Mon Sep 17 00:00:00 2001 From: Enis Necipoglu Date: Thu, 28 Jul 2022 16:18:25 +0300 Subject: [PATCH 43/84] Move content preview to Web layer and add style support to preview --- .../Pages/CmsKit/Pages/create.js | 13 ++- .../Volo/CmsKit/Contents/DefaultContentDto.cs | 8 ++ .../Volo/CmsKit/Contents/ContentController.cs | 82 ------------------- .../CmsKitCommonWidgetsController.cs | 14 ++++ .../ContentPreview/ContentPreviewDto.cs | 9 ++ .../ContentPreviewViewComponent.cs | 30 +++++++ .../Components/ContentPreview/Default.cshtml | 10 +++ .../Contents/ContentFragment.cshtml | 4 +- .../Contents/ContentFragmentViewComponent.cs | 7 +- .../Components}/Contents/IContentRenderer.cs | 2 +- .../Contents/PlainTextContentRenderer.cs | 2 +- 11 files changed, 88 insertions(+), 93 deletions(-) create mode 100644 modules/cms-kit/src/Volo.CmsKit.Common.Application.Contracts/Volo/CmsKit/Contents/DefaultContentDto.cs delete mode 100644 modules/cms-kit/src/Volo.CmsKit.Common.HttpApi/Volo/CmsKit/Contents/ContentController.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Common.Web/Controllers/CmsKitCommonWidgetsController.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Common.Web/Pages/CmsKit/Components/ContentPreview/ContentPreviewDto.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Common.Web/Pages/CmsKit/Components/ContentPreview/ContentPreviewViewComponent.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Common.Web/Pages/CmsKit/Components/ContentPreview/Default.cshtml rename modules/cms-kit/src/Volo.CmsKit.Common.Web/{ => Pages/CmsKit/Components}/Contents/ContentFragment.cshtml (87%) rename modules/cms-kit/src/Volo.CmsKit.Common.Web/{ => Pages/CmsKit/Components}/Contents/ContentFragmentViewComponent.cs (68%) rename modules/cms-kit/src/Volo.CmsKit.Common.Web/{ => Pages/CmsKit/Components}/Contents/IContentRenderer.cs (66%) rename modules/cms-kit/src/Volo.CmsKit.Common.Web/{ => Pages/CmsKit/Components}/Contents/PlainTextContentRenderer.cs (80%) diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/create.js b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/create.js index 62d05abd4d..51c405e03f 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/create.js +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/create.js @@ -176,9 +176,16 @@ $(function () { let content = editor.getMarkdown(); localStorage.setItem('content', content); - - volo.cmsKit.contents.content.parseAsHtml(content).then(function (data) { - editor.setHTML(data); + + $.post("/CmsKitCommonWidgets/ContentPreview", { content: content }, function (result) { + + let style = styleEditor.getValue(); + + $('#editor-preview-style').remove(); + + $('head').append(''); + + editor.setHTML(result); }); } else if ($(this).attr("aria-label") == 'Write'){ diff --git a/modules/cms-kit/src/Volo.CmsKit.Common.Application.Contracts/Volo/CmsKit/Contents/DefaultContentDto.cs b/modules/cms-kit/src/Volo.CmsKit.Common.Application.Contracts/Volo/CmsKit/Contents/DefaultContentDto.cs new file mode 100644 index 0000000000..731e346df4 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Common.Application.Contracts/Volo/CmsKit/Contents/DefaultContentDto.cs @@ -0,0 +1,8 @@ +using System.Collections.Generic; + +namespace Volo.CmsKit.Contents; + +public class DefaultContentDto : IContent +{ + public List ContentFragments { get; set; } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Common.HttpApi/Volo/CmsKit/Contents/ContentController.cs b/modules/cms-kit/src/Volo.CmsKit.Common.HttpApi/Volo/CmsKit/Contents/ContentController.cs deleted file mode 100644 index e0bcf5586a..0000000000 --- a/modules/cms-kit/src/Volo.CmsKit.Common.HttpApi/Volo/CmsKit/Contents/ContentController.cs +++ /dev/null @@ -1,82 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Text.Encodings.Web; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Mvc; -using Microsoft.AspNetCore.Mvc.Rendering; -using Microsoft.AspNetCore.Mvc.ViewComponents; -using Microsoft.AspNetCore.Mvc.ViewEngines; -using Microsoft.AspNetCore.Mvc.ViewFeatures; -using Microsoft.AspNetCore.Mvc.ViewFeatures.Buffers; -using Microsoft.Extensions.DependencyInjection; -using Volo.Abp; -using Volo.Abp.GlobalFeatures; -using Volo.CmsKit.GlobalFeatures; - -namespace Volo.CmsKit.Contents; - -[RequiresGlobalFeature(typeof(PagesFeature))] -[RemoteService(Name = CmsKitCommonRemoteServiceConsts.RemoteServiceName)] -[Area(CmsKitCommonRemoteServiceConsts.ModuleName)] -[Route("api/cms-kit/contents")] -public class ContentController : Controller, IContentAppService -{ - protected IContentAppService ContentAppService { get; } - - public ContentController(IContentAppService contentAppService) - { - ContentAppService = contentAppService; - } - - [HttpGet] - [Route("{parseashtml}")] - public virtual async Task ParseAsHtmlAsync(string content) - { - var fragments = await ParseAsync(content); - return await RenderViewComponent("ContentFragment", new PageDto() { ContentFragments = fragments }); - } - public virtual Task> ParseAsync(string content) - { - return ContentAppService.ParseAsync(content); - } - - private async Task RenderViewComponent(string viewComponent, object args) - { - var sp = HttpContext.RequestServices; - - var helper = new DefaultViewComponentHelper( - sp.GetRequiredService(), - HtmlEncoder.Default, - sp.GetRequiredService(), - sp.GetRequiredService(), - sp.GetRequiredService()); - - using (var writer = new StringWriter()) - { - var context = new ViewContext(ControllerContext, NullView.Instance, ViewData, TempData, writer, new HtmlHelperOptions()); - helper.Contextualize(context); - var result = await helper.InvokeAsync(viewComponent, args); - result.WriteTo(writer, HtmlEncoder.Default); - await writer.FlushAsync(); - return writer.ToString(); - } - } - - internal class NullView : IView - { - public static readonly NullView Instance = new(); - - public string Path => string.Empty; - - public Task RenderAsync(ViewContext context) - { - if (context == null) - { - throw new ArgumentNullException(nameof(context)); - } - - return Task.CompletedTask; - } - } -} diff --git a/modules/cms-kit/src/Volo.CmsKit.Common.Web/Controllers/CmsKitCommonWidgetsController.cs b/modules/cms-kit/src/Volo.CmsKit.Common.Web/Controllers/CmsKitCommonWidgetsController.cs new file mode 100644 index 0000000000..8e226a31f2 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Common.Web/Controllers/CmsKitCommonWidgetsController.cs @@ -0,0 +1,14 @@ +using Microsoft.AspNetCore.Mvc; +using Volo.Abp.AspNetCore.Mvc; +using Volo.CmsKit.Web.Pages.CmsKit.Components.ContentPreview; + +namespace Volo.CmsKit.Web.Controllers; + +public class CmsKitCommonWidgetsController : AbpController +{ + [HttpPost] + public IActionResult ContentPreview(ContentPreviewDto dto) + { + return ViewComponent(typeof(ContentPreviewViewComponent), new { content = dto.Content }); + } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Common.Web/Pages/CmsKit/Components/ContentPreview/ContentPreviewDto.cs b/modules/cms-kit/src/Volo.CmsKit.Common.Web/Pages/CmsKit/Components/ContentPreview/ContentPreviewDto.cs new file mode 100644 index 0000000000..9c01a325bf --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Common.Web/Pages/CmsKit/Components/ContentPreview/ContentPreviewDto.cs @@ -0,0 +1,9 @@ +using System; + +namespace Volo.CmsKit.Web.Pages.CmsKit.Components.ContentPreview; + +[Serializable] +public class ContentPreviewDto +{ + public string Content { get; set; } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Common.Web/Pages/CmsKit/Components/ContentPreview/ContentPreviewViewComponent.cs b/modules/cms-kit/src/Volo.CmsKit.Common.Web/Pages/CmsKit/Components/ContentPreview/ContentPreviewViewComponent.cs new file mode 100644 index 0000000000..987c404e31 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Common.Web/Pages/CmsKit/Components/ContentPreview/ContentPreviewViewComponent.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc; +using Volo.Abp.AspNetCore.Mvc; +using Volo.CmsKit.Contents; + +namespace Volo.CmsKit.Web.Pages.CmsKit.Components.ContentPreview; + +public class ContentPreviewViewComponent : AbpViewComponent +{ + protected IContentAppService ContentAppService { get; } + + public ContentPreviewViewComponent(IContentAppService contentAppService) + { + ContentAppService = contentAppService; + } + + public virtual async Task InvokeAsync(string content) + { + var fragments = await ContentAppService.ParseAsync(content); + + return View("~/Pages/CmsKit/Components/ContentPreview/Default.cshtml", new DefaultContentDto + { + ContentFragments = fragments + }); + } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Common.Web/Pages/CmsKit/Components/ContentPreview/Default.cshtml b/modules/cms-kit/src/Volo.CmsKit.Common.Web/Pages/CmsKit/Components/ContentPreview/Default.cshtml new file mode 100644 index 0000000000..6baf41716e --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Common.Web/Pages/CmsKit/Components/ContentPreview/Default.cshtml @@ -0,0 +1,10 @@ +@using Volo.CmsKit.Contents +@using Volo.CmsKit.Web.Pages.CmsKit.Components.Contents + +@model DefaultContentDto + +
+ + @await Component.InvokeAsync(typeof(ContentFragmentViewComponent), Model) + +
\ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Common.Web/Contents/ContentFragment.cshtml b/modules/cms-kit/src/Volo.CmsKit.Common.Web/Pages/CmsKit/Components/Contents/ContentFragment.cshtml similarity index 87% rename from modules/cms-kit/src/Volo.CmsKit.Common.Web/Contents/ContentFragment.cshtml rename to modules/cms-kit/src/Volo.CmsKit.Common.Web/Pages/CmsKit/Components/Contents/ContentFragment.cshtml index f0dce03b75..0fa7d59064 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Common.Web/Contents/ContentFragment.cshtml +++ b/modules/cms-kit/src/Volo.CmsKit.Common.Web/Pages/CmsKit/Components/Contents/ContentFragment.cshtml @@ -1,7 +1,7 @@ -@using Volo.CmsKit.Web.Contents; -@using System.Dynamic +@using System.Dynamic @using Volo.Abp.Data @using Volo.CmsKit.Web.Renderers; +@using Volo.CmsKit.Web.Pages.CmsKit.Components.Contents; @model ContentFragmentViewComponent diff --git a/modules/cms-kit/src/Volo.CmsKit.Common.Web/Contents/ContentFragmentViewComponent.cs b/modules/cms-kit/src/Volo.CmsKit.Common.Web/Pages/CmsKit/Components/Contents/ContentFragmentViewComponent.cs similarity index 68% rename from modules/cms-kit/src/Volo.CmsKit.Common.Web/Contents/ContentFragmentViewComponent.cs rename to modules/cms-kit/src/Volo.CmsKit.Common.Web/Pages/CmsKit/Components/Contents/ContentFragmentViewComponent.cs index 6deeb90e22..d276165982 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Common.Web/Contents/ContentFragmentViewComponent.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Common.Web/Pages/CmsKit/Components/Contents/ContentFragmentViewComponent.cs @@ -4,7 +4,7 @@ using Volo.Abp.AspNetCore.Mvc; using Volo.Abp.AspNetCore.Mvc.UI.Widgets; using Volo.CmsKit.Contents; -namespace Volo.CmsKit.Web.Contents; +namespace Volo.CmsKit.Web.Pages.CmsKit.Components.Contents; [ViewComponent(Name = "ContentFragment")] [Widget( @@ -16,7 +16,6 @@ public class ContentFragmentViewComponent : AbpViewComponent public virtual async Task InvokeAsync(IContent contentDto) { - return View("~/Contents/ContentFragment.cshtml", new ContentFragmentViewComponent() { ContentDto = contentDto }); + return View("~/Pages/CmsKit/Components/Contents/ContentFragment.cshtml", new ContentFragmentViewComponent() { ContentDto = contentDto }); } -} - +} \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Common.Web/Contents/IContentRenderer.cs b/modules/cms-kit/src/Volo.CmsKit.Common.Web/Pages/CmsKit/Components/Contents/IContentRenderer.cs similarity index 66% rename from modules/cms-kit/src/Volo.CmsKit.Common.Web/Contents/IContentRenderer.cs rename to modules/cms-kit/src/Volo.CmsKit.Common.Web/Pages/CmsKit/Components/Contents/IContentRenderer.cs index 879b27cda7..b33c044392 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Common.Web/Contents/IContentRenderer.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Common.Web/Pages/CmsKit/Components/Contents/IContentRenderer.cs @@ -1,6 +1,6 @@ using System.Threading.Tasks; -namespace Volo.CmsKit.Web.Contents; +namespace Volo.CmsKit.Web.Pages.CmsKit.Components.Contents; public interface IContentRenderer { diff --git a/modules/cms-kit/src/Volo.CmsKit.Common.Web/Contents/PlainTextContentRenderer.cs b/modules/cms-kit/src/Volo.CmsKit.Common.Web/Pages/CmsKit/Components/Contents/PlainTextContentRenderer.cs similarity index 80% rename from modules/cms-kit/src/Volo.CmsKit.Common.Web/Contents/PlainTextContentRenderer.cs rename to modules/cms-kit/src/Volo.CmsKit.Common.Web/Pages/CmsKit/Components/Contents/PlainTextContentRenderer.cs index cf68e25e15..3fcc78f658 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Common.Web/Contents/PlainTextContentRenderer.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Common.Web/Pages/CmsKit/Components/Contents/PlainTextContentRenderer.cs @@ -1,7 +1,7 @@ using System.Threading.Tasks; using Volo.Abp.DependencyInjection; -namespace Volo.CmsKit.Web.Contents; +namespace Volo.CmsKit.Web.Pages.CmsKit.Components.Contents; public class PlainTextContentRenderer : IContentRenderer, ITransientDependency { From 30bd5caf2eb7c82866efe745421ab40e65df94eb Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Fri, 29 Jul 2022 11:22:02 +0800 Subject: [PATCH 44/84] Remove EntityCreatingEventData, EntityUpdatingEventData, EntityDeletingEventData and EntityChangingEventData --- .../Events/EntityChangeEventHelper.cs | 227 ------------------ .../Events/EntityChangingEventData.cs | 23 -- .../Events/EntityCreatingEventData.cs | 22 -- .../Events/EntityDeletingEventData.cs | 22 -- .../Events/EntityUpdatingEventData.cs | 22 -- .../Testing/EntityChangeEvents_Tests.cs | 19 +- 6 files changed, 1 insertion(+), 334 deletions(-) delete mode 100644 framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/EntityChangeEventHelper.cs delete mode 100644 framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/EntityChangingEventData.cs delete mode 100644 framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/EntityCreatingEventData.cs delete mode 100644 framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/EntityDeletingEventData.cs delete mode 100644 framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/EntityUpdatingEventData.cs diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/EntityChangeEventHelper.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/EntityChangeEventHelper.cs deleted file mode 100644 index 8f9be2318f..0000000000 --- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/EntityChangeEventHelper.cs +++ /dev/null @@ -1,227 +0,0 @@ -using System; -using System.Collections.Generic; -using Microsoft.Extensions.Logging; -using Microsoft.Extensions.Logging.Abstractions; -using Microsoft.Extensions.Options; -using Volo.Abp.DependencyInjection; -using Volo.Abp.Domain.Entities.Events.Distributed; -using Volo.Abp.DynamicProxy; -using Volo.Abp.EventBus; -using Volo.Abp.EventBus.Distributed; -using Volo.Abp.EventBus.Local; -using Volo.Abp.Uow; - -namespace Volo.Abp.Domain.Entities.Events; - -/// -/// Used to trigger entity change events. -/// -public class EntityChangeEventHelper : IEntityChangeEventHelper, ITransientDependency -{ - private const string UnitOfWorkEventRecordEntityPropName = "_Abp_Entity"; - - public ILogger Logger { get; set; } - public ILocalEventBus LocalEventBus { get; set; } - public IDistributedEventBus DistributedEventBus { get; set; } - - protected IUnitOfWorkManager UnitOfWorkManager { get; } - protected IEntityToEtoMapper EntityToEtoMapper { get; } - protected AbpDistributedEntityEventOptions DistributedEntityEventOptions { get; } - - public EntityChangeEventHelper( - IUnitOfWorkManager unitOfWorkManager, - IEntityToEtoMapper entityToEtoMapper, - IOptions distributedEntityEventOptions) - { - UnitOfWorkManager = unitOfWorkManager; - EntityToEtoMapper = entityToEtoMapper; - DistributedEntityEventOptions = distributedEntityEventOptions.Value; - - LocalEventBus = NullLocalEventBus.Instance; - DistributedEventBus = NullDistributedEventBus.Instance; - Logger = NullLogger.Instance; - } - - public virtual void PublishEntityCreatingEvent(object entity) - { - TriggerEventWithEntity( - LocalEventBus, -#pragma warning disable 618 - typeof(EntityCreatingEventData<>), -#pragma warning restore 618 - entity, - entity - ); - } - - public virtual void PublishEntityCreatedEvent(object entity) - { - TriggerEventWithEntity( - LocalEventBus, - typeof(EntityCreatedEventData<>), - entity, - entity - ); - - if (ShouldPublishDistributedEventForEntity(entity)) - { - var eto = EntityToEtoMapper.Map(entity); - if (eto != null) - { - TriggerEventWithEntity( - DistributedEventBus, - typeof(EntityCreatedEto<>), - eto, - entity - ); - } - } - } - - private bool ShouldPublishDistributedEventForEntity(object entity) - { - return DistributedEntityEventOptions - .AutoEventSelectors - .IsMatch( - ProxyHelper - .UnProxy(entity) - .GetType() - ); - } - - public virtual void PublishEntityUpdatingEvent(object entity) - { - TriggerEventWithEntity( - LocalEventBus, -#pragma warning disable 618 - typeof(EntityUpdatingEventData<>), -#pragma warning restore 618 - entity, - entity - ); - } - - public virtual void PublishEntityUpdatedEvent(object entity) - { - TriggerEventWithEntity( - LocalEventBus, - typeof(EntityUpdatedEventData<>), - entity, - entity - ); - - if (ShouldPublishDistributedEventForEntity(entity)) - { - var eto = EntityToEtoMapper.Map(entity); - if (eto != null) - { - TriggerEventWithEntity( - DistributedEventBus, - typeof(EntityUpdatedEto<>), - eto, - entity - ); - } - } - } - - public virtual void PublishEntityDeletingEvent(object entity) - { - TriggerEventWithEntity( - LocalEventBus, -#pragma warning disable 618 - typeof(EntityDeletingEventData<>), -#pragma warning restore 618 - entity, - entity - ); - } - - public virtual void PublishEntityDeletedEvent(object entity) - { - TriggerEventWithEntity( - LocalEventBus, - typeof(EntityDeletedEventData<>), - entity, - entity - ); - - if (ShouldPublishDistributedEventForEntity(entity)) - { - var eto = EntityToEtoMapper.Map(entity); - if (eto != null) - { - TriggerEventWithEntity( - DistributedEventBus, - typeof(EntityDeletedEto<>), - eto, - entity - ); - } - } - } - - protected virtual void TriggerEventWithEntity( - IEventBus eventPublisher, - Type genericEventType, - object entityOrEto, - object originalEntity) - { - var entityType = ProxyHelper.UnProxy(entityOrEto).GetType(); - var eventType = genericEventType.MakeGenericType(entityType); - var eventData = Activator.CreateInstance(eventType, entityOrEto); - var currentUow = UnitOfWorkManager.Current; - - if (currentUow == null) - { - Logger.LogWarning("UnitOfWorkManager.Current is null! Can not publish the event."); - return; - } - - var eventRecord = new UnitOfWorkEventRecord(eventType, eventData, EventOrderGenerator.GetNext()) - { - Properties = - { - { UnitOfWorkEventRecordEntityPropName, originalEntity }, - } - }; - - /* We are trying to eliminate same events for the same entity. - * In this way, for example, we don't trigger update event for an entity multiple times - * even if it is updated multiple times in the current UOW. - */ - - if (eventPublisher == DistributedEventBus) - { - currentUow.AddOrReplaceDistributedEvent( - eventRecord, - otherRecord => IsSameEntityEventRecord(eventRecord, otherRecord) - ); - } - else - { - currentUow.AddOrReplaceLocalEvent( - eventRecord, - otherRecord => IsSameEntityEventRecord(eventRecord, otherRecord) - ); - } - } - - public bool IsSameEntityEventRecord(UnitOfWorkEventRecord record1, UnitOfWorkEventRecord record2) - { - if (record1.EventType != record2.EventType) - { - return false; - } - - var record1OriginalEntity = record1.Properties.GetOrDefault(UnitOfWorkEventRecordEntityPropName) as IEntity; - var record2OriginalEntity = record2.Properties.GetOrDefault(UnitOfWorkEventRecordEntityPropName) as IEntity; - - if (record1OriginalEntity == null || record2OriginalEntity == null) - { - return false; - } - - return EntityHelper.EntityEquals(record1OriginalEntity, record2OriginalEntity); - } -} diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/EntityChangingEventData.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/EntityChangingEventData.cs deleted file mode 100644 index ae24163966..0000000000 --- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/EntityChangingEventData.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System; - -namespace Volo.Abp.Domain.Entities.Events; - -/// -/// Used to pass data for an event when an entity () is being changed (creating, updating or deleting). -/// See , and classes. -/// -/// Entity type -[Serializable] -[Obsolete("This event is no longer needed and identical to EntityChangedEventData. Please use EntityChangedEventData instead.")] -public class EntityChangingEventData : EntityEventData -{ - /// - /// Constructor. - /// - /// Changing entity in this event - public EntityChangingEventData(TEntity entity) - : base(entity) - { - - } -} diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/EntityCreatingEventData.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/EntityCreatingEventData.cs deleted file mode 100644 index 914c8ca7c7..0000000000 --- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/EntityCreatingEventData.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System; - -namespace Volo.Abp.Domain.Entities.Events; - -/// -/// This type of event is used to notify just before creation of an Entity. -/// -/// Entity type -[Serializable] -[Obsolete("This event is no longer needed and identical to EntityCreatedEventData. Please use EntityCreatedEventData instead.")] -public class EntityCreatingEventData : EntityChangingEventData -{ - /// - /// Constructor. - /// - /// The entity which is being created - public EntityCreatingEventData(TEntity entity) - : base(entity) - { - - } -} diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/EntityDeletingEventData.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/EntityDeletingEventData.cs deleted file mode 100644 index af0d1218f7..0000000000 --- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/EntityDeletingEventData.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System; - -namespace Volo.Abp.Domain.Entities.Events; - -/// -/// This type of event is used to notify just before deletion of an Entity. -/// -/// Entity type -[Serializable] -[Obsolete("This event is no longer needed and identical to EntityDeletedEventData. Please use EntityDeletedEventData instead.")] -public class EntityDeletingEventData : EntityChangingEventData -{ - /// - /// Constructor. - /// - /// The entity which is being deleted - public EntityDeletingEventData(TEntity entity) - : base(entity) - { - - } -} diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/EntityUpdatingEventData.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/EntityUpdatingEventData.cs deleted file mode 100644 index 703304fefb..0000000000 --- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/EntityUpdatingEventData.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System; - -namespace Volo.Abp.Domain.Entities.Events; - -/// -/// This type of event is used to notify just before update of an Entity. -/// -/// Entity type -[Serializable] -[Obsolete("This event is no longer needed and identical to EntityUpdatedEventData. Please use EntityUpdatedEventData instead.")] -public class EntityUpdatingEventData : EntityChangingEventData -{ - /// - /// Constructor. - /// - /// The entity which is being updated - public EntityUpdatingEventData(TEntity entity) - : base(entity) - { - - } -} diff --git a/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Testing/EntityChangeEvents_Tests.cs b/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Testing/EntityChangeEvents_Tests.cs index a94c722faf..c6ffa48d37 100644 --- a/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Testing/EntityChangeEvents_Tests.cs +++ b/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Testing/EntityChangeEvents_Tests.cs @@ -38,23 +38,6 @@ public abstract class EntityChangeEvents_Tests : TestAppTestBase using (var uow = GetRequiredService().Begin()) { -#pragma warning disable 618 - LocalEventBus.Subscribe>(data => -#pragma warning restore 618 - { - creatingEventTriggered.ShouldBeFalse(); - createdEventTriggered.ShouldBeFalse(); - - creatingEventTriggered = true; - - data.Entity.Name.ShouldBe(personName); - - /* Want to change age from 15 to 18 */ - data.Entity.Age.ShouldBe(15); - data.Entity.Age = 18; - return Task.CompletedTask; - }); - LocalEventBus.Subscribe>(data => { creatingEventTriggered.ShouldBeTrue(); @@ -62,7 +45,7 @@ public abstract class EntityChangeEvents_Tests : TestAppTestBase createdEventTriggered = true; - data.Entity.Age.ShouldBe(18); + data.Entity.Age.ShouldBe(15); data.Entity.Name.ShouldBe(personName); return Task.CompletedTask; From 300cde89c28e3759e01bf713b3c3647b4843a497 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Fri, 29 Jul 2022 11:27:39 +0800 Subject: [PATCH 45/84] Update EntityChangeEventHelper.cs --- .../Events/EntityChangeEventHelper.cs | 191 ++++++++++++++++++ 1 file changed, 191 insertions(+) create mode 100644 framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/EntityChangeEventHelper.cs diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/EntityChangeEventHelper.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/EntityChangeEventHelper.cs new file mode 100644 index 0000000000..20556f16ff --- /dev/null +++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/EntityChangeEventHelper.cs @@ -0,0 +1,191 @@ +using System; +using System.Collections.Generic; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Logging.Abstractions; +using Microsoft.Extensions.Options; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Domain.Entities.Events.Distributed; +using Volo.Abp.DynamicProxy; +using Volo.Abp.EventBus; +using Volo.Abp.EventBus.Distributed; +using Volo.Abp.EventBus.Local; +using Volo.Abp.Uow; + +namespace Volo.Abp.Domain.Entities.Events; + +/// +/// Used to trigger entity change events. +/// +public class EntityChangeEventHelper : IEntityChangeEventHelper, ITransientDependency +{ + private const string UnitOfWorkEventRecordEntityPropName = "_Abp_Entity"; + + public ILogger Logger { get; set; } + public ILocalEventBus LocalEventBus { get; set; } + public IDistributedEventBus DistributedEventBus { get; set; } + + protected IUnitOfWorkManager UnitOfWorkManager { get; } + protected IEntityToEtoMapper EntityToEtoMapper { get; } + protected AbpDistributedEntityEventOptions DistributedEntityEventOptions { get; } + + public EntityChangeEventHelper( + IUnitOfWorkManager unitOfWorkManager, + IEntityToEtoMapper entityToEtoMapper, + IOptions distributedEntityEventOptions) + { + UnitOfWorkManager = unitOfWorkManager; + EntityToEtoMapper = entityToEtoMapper; + DistributedEntityEventOptions = distributedEntityEventOptions.Value; + + LocalEventBus = NullLocalEventBus.Instance; + DistributedEventBus = NullDistributedEventBus.Instance; + Logger = NullLogger.Instance; + } + + public virtual void PublishEntityCreatedEvent(object entity) + { + TriggerEventWithEntity( + LocalEventBus, + typeof(EntityCreatedEventData<>), + entity, + entity + ); + + if (ShouldPublishDistributedEventForEntity(entity)) + { + var eto = EntityToEtoMapper.Map(entity); + if (eto != null) + { + TriggerEventWithEntity( + DistributedEventBus, + typeof(EntityCreatedEto<>), + eto, + entity + ); + } + } + } + + private bool ShouldPublishDistributedEventForEntity(object entity) + { + return DistributedEntityEventOptions + .AutoEventSelectors + .IsMatch( + ProxyHelper + .UnProxy(entity) + .GetType() + ); + } + + public virtual void PublishEntityUpdatedEvent(object entity) + { + TriggerEventWithEntity( + LocalEventBus, + typeof(EntityUpdatedEventData<>), + entity, + entity + ); + + if (ShouldPublishDistributedEventForEntity(entity)) + { + var eto = EntityToEtoMapper.Map(entity); + if (eto != null) + { + TriggerEventWithEntity( + DistributedEventBus, + typeof(EntityUpdatedEto<>), + eto, + entity + ); + } + } + } + + public virtual void PublishEntityDeletedEvent(object entity) + { + TriggerEventWithEntity( + LocalEventBus, + typeof(EntityDeletedEventData<>), + entity, + entity + ); + + if (ShouldPublishDistributedEventForEntity(entity)) + { + var eto = EntityToEtoMapper.Map(entity); + if (eto != null) + { + TriggerEventWithEntity( + DistributedEventBus, + typeof(EntityDeletedEto<>), + eto, + entity + ); + } + } + } + + protected virtual void TriggerEventWithEntity( + IEventBus eventPublisher, + Type genericEventType, + object entityOrEto, + object originalEntity) + { + var entityType = ProxyHelper.UnProxy(entityOrEto).GetType(); + var eventType = genericEventType.MakeGenericType(entityType); + var eventData = Activator.CreateInstance(eventType, entityOrEto); + var currentUow = UnitOfWorkManager.Current; + + if (currentUow == null) + { + Logger.LogWarning("UnitOfWorkManager.Current is null! Can not publish the event."); + return; + } + + var eventRecord = new UnitOfWorkEventRecord(eventType, eventData, EventOrderGenerator.GetNext()) + { + Properties = + { + { UnitOfWorkEventRecordEntityPropName, originalEntity }, + } + }; + + /* We are trying to eliminate same events for the same entity. + * In this way, for example, we don't trigger update event for an entity multiple times + * even if it is updated multiple times in the current UOW. + */ + + if (eventPublisher == DistributedEventBus) + { + currentUow.AddOrReplaceDistributedEvent( + eventRecord, + otherRecord => IsSameEntityEventRecord(eventRecord, otherRecord) + ); + } + else + { + currentUow.AddOrReplaceLocalEvent( + eventRecord, + otherRecord => IsSameEntityEventRecord(eventRecord, otherRecord) + ); + } + } + + public bool IsSameEntityEventRecord(UnitOfWorkEventRecord record1, UnitOfWorkEventRecord record2) + { + if (record1.EventType != record2.EventType) + { + return false; + } + + var record1OriginalEntity = record1.Properties.GetOrDefault(UnitOfWorkEventRecordEntityPropName) as IEntity; + var record2OriginalEntity = record2.Properties.GetOrDefault(UnitOfWorkEventRecordEntityPropName) as IEntity; + + if (record1OriginalEntity == null || record2OriginalEntity == null) + { + return false; + } + + return EntityHelper.EntityEquals(record1OriginalEntity, record2OriginalEntity); + } +} From f9e903b43b3adf437f9607f5e4350e0dd5639370 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Fri, 29 Jul 2022 11:44:29 +0800 Subject: [PATCH 46/84] Improve --- .../Entities/Events/IEntityChangeEventHelper.cs | 3 --- .../Entities/Events/NullEntityChangeEventHelper.cs | 12 ------------ .../Volo/Abp/EntityFrameworkCore/AbpDbContext.cs | 4 ---- .../Repositories/MemoryDb/MemoryDbRepository.cs | 3 --- .../Domain/Repositories/MongoDB/MongoDbRepository.cs | 3 --- 5 files changed, 25 deletions(-) diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/IEntityChangeEventHelper.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/IEntityChangeEventHelper.cs index db580a0682..aa63c7e3c9 100644 --- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/IEntityChangeEventHelper.cs +++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/IEntityChangeEventHelper.cs @@ -5,12 +5,9 @@ namespace Volo.Abp.Domain.Entities.Events; ///
public interface IEntityChangeEventHelper { - void PublishEntityCreatingEvent(object entity); void PublishEntityCreatedEvent(object entity); - void PublishEntityUpdatingEvent(object entity); void PublishEntityUpdatedEvent(object entity); - void PublishEntityDeletingEvent(object entity); void PublishEntityDeletedEvent(object entity); } diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/NullEntityChangeEventHelper.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/NullEntityChangeEventHelper.cs index d428f84d6f..4d849f2f27 100644 --- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/NullEntityChangeEventHelper.cs +++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/NullEntityChangeEventHelper.cs @@ -14,26 +14,14 @@ public class NullEntityChangeEventHelper : IEntityChangeEventHelper { } - public void PublishEntityCreatingEvent(object entity) - { - } - public void PublishEntityCreatedEvent(object entity) { } - public void PublishEntityUpdatingEvent(object entity) - { - } - public void PublishEntityUpdatedEvent(object entity) { } - public void PublishEntityDeletingEvent(object entity) - { - } - public void PublishEntityDeletedEvent(object entity) { } diff --git a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpDbContext.cs b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpDbContext.cs index 3a8a24bf62..fd998510af 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpDbContext.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpDbContext.cs @@ -292,7 +292,6 @@ public abstract class AbpDbContext : DbContext, IAbpEfCoreDbContext, { case EntityState.Added: ApplyAbpConceptsForAddedEntity(entry); - EntityChangeEventHelper.PublishEntityCreatingEvent(entry.Entity); EntityChangeEventHelper.PublishEntityCreatedEvent(entry.Entity); break; case EntityState.Modified: @@ -301,12 +300,10 @@ public abstract class AbpDbContext : DbContext, IAbpEfCoreDbContext, { if (entry.Entity is ISoftDelete && entry.Entity.As().IsDeleted) { - EntityChangeEventHelper.PublishEntityDeletingEvent(entry.Entity); EntityChangeEventHelper.PublishEntityDeletedEvent(entry.Entity); } else { - EntityChangeEventHelper.PublishEntityUpdatingEvent(entry.Entity); EntityChangeEventHelper.PublishEntityUpdatedEvent(entry.Entity); } } @@ -314,7 +311,6 @@ public abstract class AbpDbContext : DbContext, IAbpEfCoreDbContext, break; case EntityState.Deleted: ApplyAbpConceptsForDeletedEntity(entry); - EntityChangeEventHelper.PublishEntityDeletingEvent(entry.Entity); EntityChangeEventHelper.PublishEntityDeletedEvent(entry.Entity); break; } diff --git a/framework/src/Volo.Abp.MemoryDb/Volo/Abp/Domain/Repositories/MemoryDb/MemoryDbRepository.cs b/framework/src/Volo.Abp.MemoryDb/Volo/Abp/Domain/Repositories/MemoryDb/MemoryDbRepository.cs index 2bcfc1bad7..61bb9745e2 100644 --- a/framework/src/Volo.Abp.MemoryDb/Volo/Abp/Domain/Repositories/MemoryDb/MemoryDbRepository.cs +++ b/framework/src/Volo.Abp.MemoryDb/Volo/Abp/Domain/Repositories/MemoryDb/MemoryDbRepository.cs @@ -159,19 +159,16 @@ public class MemoryDbRepository : RepositoryBase private void TriggerEntityCreateEvents(TEntity entity) { - EntityChangeEventHelper.PublishEntityCreatingEvent(entity); EntityChangeEventHelper.PublishEntityCreatedEvent(entity); } protected virtual void TriggerEntityUpdateEvents(TEntity entity) { - EntityChangeEventHelper.PublishEntityUpdatingEvent(entity); EntityChangeEventHelper.PublishEntityUpdatedEvent(entity); } @@ -616,7 +614,6 @@ public class MongoDbRepository protected virtual void TriggerEntityDeleteEvents(TEntity entity) { - EntityChangeEventHelper.PublishEntityDeletingEvent(entity); EntityChangeEventHelper.PublishEntityDeletedEvent(entity); } From 03e7412e9aece512dd1da0665fe2c15fa0a3ce7a Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Fri, 29 Jul 2022 11:46:57 +0800 Subject: [PATCH 47/84] Update EntityChangeEvents_Tests.cs --- .../Volo/Abp/TestApp/Testing/EntityChangeEvents_Tests.cs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Testing/EntityChangeEvents_Tests.cs b/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Testing/EntityChangeEvents_Tests.cs index c6ffa48d37..12b3fa01c0 100644 --- a/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Testing/EntityChangeEvents_Tests.cs +++ b/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Testing/EntityChangeEvents_Tests.cs @@ -32,7 +32,6 @@ public abstract class EntityChangeEvents_Tests : TestAppTestBase { var personName = Guid.NewGuid().ToString("N"); - var creatingEventTriggered = false; var createdEventTriggered = false; var createdEtoTriggered = false; @@ -40,7 +39,6 @@ public abstract class EntityChangeEvents_Tests : TestAppTestBase { LocalEventBus.Subscribe>(data => { - creatingEventTriggered.ShouldBeTrue(); createdEventTriggered.ShouldBeFalse(); createdEventTriggered = true; @@ -64,8 +62,7 @@ public abstract class EntityChangeEvents_Tests : TestAppTestBase await uow.CompleteAsync(); } - - creatingEventTriggered.ShouldBeTrue(); + createdEventTriggered.ShouldBeTrue(); createdEtoTriggered.ShouldBeTrue(); } From a5c18c0151e9590441a515924db26e79e883997e Mon Sep 17 00:00:00 2001 From: Engincan VESKE Date: Fri, 29 Jul 2022 14:36:59 +0300 Subject: [PATCH 48/84] Add new localizations for commercial.abp.io --- .../Commercial/Localization/Resources/en.json | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json index caf4a9dbbe..64cefef9af 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json @@ -735,6 +735,14 @@ "ConfirmedEmailAddressRequiredToStartTrial": "You should have a confirmed email address in order to start a trial license.", "EmailVerificationMailNotSent": "Email verification mail couldn't send.", "GetConfirmationEmail": "Click here to get a confirmation email if you haven't got it before.", - "WhichLicenseTypeYouAreInterestedIn": "Which license type you are interested in?" + "WhichLicenseTypeYouAreInterestedIn": "Which license type you are interested in?", + "DontTakeOurWordForIt": "Don't take our word for it...", + "ReadAbpCommercialUsersWantYouToKnow": "Read what ABP Commercial users want you to know", + "Testimonial_ShortDescription_1": "The modularity of ABP made it possible for the team to deliver in time.", + "Testimonial_ShortDescription_2": "Build new features faster than before.", + "Testimonial_ShortDescription_3": "We start from out-of-the-box features and just focus on what we really need to write.", + "Testimonial_ShortDescription_4": "ABP Commercial was the best fit for our needs.", + "OnlineReviewersOnAbpCommercial": "Online Reviews on ABP Commercial", + "SeeWhatToldAboutAbpCommercial": "See what has been told about ABP Commercial and write your thoughts if you want." } } From cab8f9ea20e8daa5c6e005a95303c93bcd2d1003 Mon Sep 17 00:00:00 2001 From: Engincan VESKE Date: Fri, 29 Jul 2022 15:32:57 +0300 Subject: [PATCH 49/84] Update en.json --- .../AbpIoLocalization/Www/Localization/Resources/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json index 826d093ea3..931202033b 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json @@ -374,7 +374,7 @@ "MasteringAbpFramework_Book_WhoIsThisBookFor_Description": "This book is for web developers who want to learn software architectures and best practices for building\n maintainable web-based solutions using Microsoft technologies and ABP Framework. Basic knowledge of C#\n and ASP.NET Core is necessary to get started with this book.", "ComputersAndTechnology": "Computers & Technology", "BuildingMicroserviceSolutions": "Building Microservice Solutions", - "MicroserviceBookPracticalGuide": "This book is a reference guide for developing and managing microservice-based applications using the ABP Framework. It references the .*NET Microservice Sample Rerefence Application*: eShopOnContainers and discusses the architectural design and implementation approaches using the ABP Framework. Moreover, you will learn the working implementation of an e-shop process like adding products, completing the purchase using PayPal, updating the basket cart item in real-time, shipping a purchased product, and more. Written by the main contributors of the ABP Framework, this book will help you understand how the ABP modularity is used like lego pieces to become a running distributed system. It will discuss the decisions to create a microservice environment and how to develop an application rapidly.By the end of this book, you'll learn how ABP approaches the common microservice complexities such as authorization, distributed transactions, inter-microservice communications, deployment, etc. ", + "MicroserviceBookPracticalGuide": "This book is a reference guide for developing and managing microservice-based applications using the ABP Framework. It references the .NET Microservice Sample Reference Application: eShopOnContainers and discusses the architectural design and implementation approaches using the ABP Framework. By the end of this book, you'll learn how ABP approaches the common microservice complexities such as authorization, distributed transactions, inter-microservice communications, deployment, etc.", "IntroducingMicroservice": "Introducing Microservice", "RunningTheSolution": "Running the Solution", "UnderstandingTheAuthenticationSystem": "Understanding the Authentication System", From 73774eb12b31a7b045178f2caf3f19ff6756993e Mon Sep 17 00:00:00 2001 From: Engincan VESKE Date: Fri, 29 Jul 2022 15:39:33 +0300 Subject: [PATCH 50/84] Update en.json --- .../AbpIoLocalization/Www/Localization/Resources/en.json | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json index 931202033b..2a5f9a2584 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json @@ -375,15 +375,9 @@ "ComputersAndTechnology": "Computers & Technology", "BuildingMicroserviceSolutions": "Building Microservice Solutions", "MicroserviceBookPracticalGuide": "This book is a reference guide for developing and managing microservice-based applications using the ABP Framework. It references the .NET Microservice Sample Reference Application: eShopOnContainers and discusses the architectural design and implementation approaches using the ABP Framework. By the end of this book, you'll learn how ABP approaches the common microservice complexities such as authorization, distributed transactions, inter-microservice communications, deployment, etc.", - "IntroducingMicroservice": "Introducing Microservice", + "IntroducingTheSolution": "Introducing the eShopOnAbp Solution", "RunningTheSolution": "Running the Solution", "UnderstandingTheAuthenticationSystem": "Understanding the Authentication System", - "ExploringTheApplications": "Exploring the Applications", - "UnderstandingTheAPIGateways": "Understanding the API Gateways", - "DevelopingTheMicroservices": "Developing the Microservices", - "UnderstandingTheInfrastructure": "Understanding the Infrastructure", - "DiggingInTheUseCases": "Digging in the Use Cases", - "DeployingTheSolution": "Deploying the Solution", "Authors": "Authors", "MicroserviceEBook": "Microservice E-Book", "SelectUITheme": "Select UI Theme", From 6fe6f7ae9b2c0fac46dbafa46931d520622eb785 Mon Sep 17 00:00:00 2001 From: malik masis Date: Fri, 29 Jul 2022 18:39:26 +0300 Subject: [PATCH 51/84] Applied the preview implementation to Page/Update --- .../Pages/CmsKit/Pages/update.js | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/update.js b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/update.js index 565f758552..7f5a54c798 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/update.js +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/update.js @@ -140,6 +140,29 @@ $(function () { var txt = $('#GeneratedWidgetText').val(); editor.insertText(txt); }); + + $('.tab-item').on('click', function () { + if ($(this).attr("aria-label") == 'Preview' && editor.isMarkdownMode()) { + + let content = editor.getMarkdown(); + localStorage.setItem('content', content); + + $.post("/CmsKitCommonWidgets/ContentPreview", { content: content }, function (result) { + + let style = styleEditor.getValue(); + + $('#editor-preview-style').remove(); + + $('head').append(''); + + editor.setHTML(result); + }); + } + else if ($(this).attr("aria-label") == 'Write') { + var retrievedObject = localStorage.getItem('content'); + editor.setMarkdown(retrievedObject); + } + }); function createAddWidgetButton() { const button = document.createElement('button'); From 23fc4b896a748d158eaafb258565a22e66dc186c Mon Sep 17 00:00:00 2001 From: malik masis Date: Fri, 29 Jul 2022 18:39:38 +0300 Subject: [PATCH 52/84] Applied the preview implementation to BlogPost --- .../Pages/CmsKit/BlogPosts/create.js | 16 ++++++++++++++++ .../Pages/CmsKit/BlogPosts/update.js | 16 ++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/create.js b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/create.js index 375b7ad41b..d81dcd9f06 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/create.js +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/create.js @@ -334,6 +334,22 @@ $(function () { editor.insertText(txt); }); + $('.tab-item').on('click', function () { + if ($(this).attr("aria-label") == 'Preview' && editor.isMarkdownMode()) { + + let content = editor.getMarkdown(); + localStorage.setItem('content', content); + + $.post("/CmsKitCommonWidgets/ContentPreview", { content: content }, function (result) { + editor.setHTML(result); + }); + } + else if ($(this).attr("aria-label") == 'Write') { + var retrievedObject = localStorage.getItem('content'); + editor.setMarkdown(retrievedObject); + } + }); + function createAddWidgetButton() { const button = document.createElement('button'); diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/update.js b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/update.js index 51e3eda96c..292535034d 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/update.js +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/update.js @@ -255,6 +255,22 @@ $(function () { editor.insertText(txt); }); + $('.tab-item').on('click', function () { + if ($(this).attr("aria-label") == 'Preview' && editor.isMarkdownMode()) { + + let content = editor.getMarkdown(); + localStorage.setItem('content', content); + + $.post("/CmsKitCommonWidgets/ContentPreview", { content: content }, function (result) { + editor.setHTML(result); + }); + } + else if ($(this).attr("aria-label") == 'Write') { + var retrievedObject = localStorage.getItem('content'); + editor.setMarkdown(retrievedObject); + } + }); + function createAddWidgetButton() { const button = document.createElement('button'); From 025d691c1a40bc94917041894f73d0733ea1bfcc Mon Sep 17 00:00:00 2001 From: malik masis Date: Sat, 30 Jul 2022 19:26:30 +0300 Subject: [PATCH 53/84] Update cms-kit-common-proxy.js --- .../client-proxies/cms-kit-common-proxy.js | 22 ------------------- 1 file changed, 22 deletions(-) diff --git a/modules/cms-kit/src/Volo.CmsKit.Common.Web/wwwroot/client-proxies/cms-kit-common-proxy.js b/modules/cms-kit/src/Volo.CmsKit.Common.Web/wwwroot/client-proxies/cms-kit-common-proxy.js index f255ec9d4c..27aa1d819e 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Common.Web/wwwroot/client-proxies/cms-kit-common-proxy.js +++ b/modules/cms-kit/src/Volo.CmsKit.Common.Web/wwwroot/client-proxies/cms-kit-common-proxy.js @@ -20,28 +20,6 @@ })(); - // controller volo.cmsKit.contents.content - - (function(){ - - abp.utils.createNamespace(window, 'volo.cmsKit.contents.content'); - - volo.cmsKit.contents.content.parseAsHtml = function(content, parseashtml, ajaxParams) { - return abp.ajax($.extend(true, { - url: abp.appPath + 'api/cms-kit/contents/' + parseashtml + '' + abp.utils.buildQueryString([{ name: 'content', value: content }]) + '', - type: 'GET' - }, { dataType: 'text' }, ajaxParams)); - }; - - volo.cmsKit.contents.content.parse = function(content, ajaxParams) { - return abp.ajax($.extend(true, { - url: abp.appPath + 'api/cms-kit/contents' + abp.utils.buildQueryString([{ name: 'content', value: content }]) + '', - type: 'POST' - }, ajaxParams)); - }; - - })(); - // controller volo.cmsKit.blogs.blogFeature (function(){ From 592df6e218f2861c5f5c07222a18870e007d3272 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alper=20Ebi=C3=A7o=C4=9Flu?= <9526587+ebicoglu@users.noreply.github.com> Date: Sun, 31 Jul 2022 10:26:12 +0300 Subject: [PATCH 54/84] Update ar.json --- .../Localization/MyProjectName/ar.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/Localization/MyProjectName/ar.json b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/Localization/MyProjectName/ar.json index 1ee94530fb..153f571276 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/Localization/MyProjectName/ar.json +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/Localization/MyProjectName/ar.json @@ -3,6 +3,6 @@ "texts": { "Welcome_Title": "مرحبا", "Welcome_Text": "هذا هو قالب بدء تشغيل تطبيق ذو طبقة واحدة مبسط لإطار عمل ABP.", - "Menu:Home": "الرئيسية" + "Menu:Home": "الصفحة الرئيسية" } } From 05ac35914f9c5a2bcc0c19c0e173c2e0c672cd1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alper=20Ebi=C3=A7o=C4=9Flu?= <9526587+ebicoglu@users.noreply.github.com> Date: Sun, 31 Jul 2022 10:26:22 +0300 Subject: [PATCH 55/84] Update ar.json --- .../Localization/MyProjectName/ar.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/Localization/MyProjectName/ar.json b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/Localization/MyProjectName/ar.json index 1ee94530fb..153f571276 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/Localization/MyProjectName/ar.json +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/Localization/MyProjectName/ar.json @@ -3,6 +3,6 @@ "texts": { "Welcome_Title": "مرحبا", "Welcome_Text": "هذا هو قالب بدء تشغيل تطبيق ذو طبقة واحدة مبسط لإطار عمل ABP.", - "Menu:Home": "الرئيسية" + "Menu:Home": "الصفحة الرئيسية" } } From 935bd2b6e8261c793ab8407e952b14d96ced9075 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alper=20Ebi=C3=A7o=C4=9Flu?= <9526587+ebicoglu@users.noreply.github.com> Date: Sun, 31 Jul 2022 10:26:31 +0300 Subject: [PATCH 56/84] Update ar.json --- .../Localization/MyProjectName/ar.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Localization/MyProjectName/ar.json b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Localization/MyProjectName/ar.json index 1ee94530fb..153f571276 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Localization/MyProjectName/ar.json +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Localization/MyProjectName/ar.json @@ -3,6 +3,6 @@ "texts": { "Welcome_Title": "مرحبا", "Welcome_Text": "هذا هو قالب بدء تشغيل تطبيق ذو طبقة واحدة مبسط لإطار عمل ABP.", - "Menu:Home": "الرئيسية" + "Menu:Home": "الصفحة الرئيسية" } } From d917fdf78e8105680f9fa0d5fb1279c444f0e052 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alper=20Ebi=C3=A7o=C4=9Flu?= <9526587+ebicoglu@users.noreply.github.com> Date: Sun, 31 Jul 2022 10:26:38 +0300 Subject: [PATCH 57/84] Update ar.json --- .../Localization/MyProjectName/ar.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Localization/MyProjectName/ar.json b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Localization/MyProjectName/ar.json index 1ee94530fb..153f571276 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Localization/MyProjectName/ar.json +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Localization/MyProjectName/ar.json @@ -3,6 +3,6 @@ "texts": { "Welcome_Title": "مرحبا", "Welcome_Text": "هذا هو قالب بدء تشغيل تطبيق ذو طبقة واحدة مبسط لإطار عمل ABP.", - "Menu:Home": "الرئيسية" + "Menu:Home": "الصفحة الرئيسية" } } From 973b68242353c8ddaa831a15b010c21adab96e2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alper=20Ebi=C3=A7o=C4=9Flu?= <9526587+ebicoglu@users.noreply.github.com> Date: Sun, 31 Jul 2022 10:26:46 +0300 Subject: [PATCH 58/84] Update ar.json --- .../Localization/MyProjectName/ar.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc.Mongo/Localization/MyProjectName/ar.json b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc.Mongo/Localization/MyProjectName/ar.json index 1ee94530fb..153f571276 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc.Mongo/Localization/MyProjectName/ar.json +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc.Mongo/Localization/MyProjectName/ar.json @@ -3,6 +3,6 @@ "texts": { "Welcome_Title": "مرحبا", "Welcome_Text": "هذا هو قالب بدء تشغيل تطبيق ذو طبقة واحدة مبسط لإطار عمل ABP.", - "Menu:Home": "الرئيسية" + "Menu:Home": "الصفحة الرئيسية" } } From 4741da1bd91b6ab14df30945c21bc407dc2eb246 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alper=20Ebi=C3=A7o=C4=9Flu?= <9526587+ebicoglu@users.noreply.github.com> Date: Sun, 31 Jul 2022 10:26:53 +0300 Subject: [PATCH 59/84] Update ar.json --- .../Localization/MyProjectName/ar.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Localization/MyProjectName/ar.json b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Localization/MyProjectName/ar.json index 1ee94530fb..153f571276 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Localization/MyProjectName/ar.json +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Localization/MyProjectName/ar.json @@ -3,6 +3,6 @@ "texts": { "Welcome_Title": "مرحبا", "Welcome_Text": "هذا هو قالب بدء تشغيل تطبيق ذو طبقة واحدة مبسط لإطار عمل ABP.", - "Menu:Home": "الرئيسية" + "Menu:Home": "الصفحة الرئيسية" } } From 8bda138296aedc15bd21247822cc1ef0c42ea7b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alper=20Ebi=C3=A7o=C4=9Flu?= <9526587+ebicoglu@users.noreply.github.com> Date: Sun, 31 Jul 2022 10:27:19 +0300 Subject: [PATCH 60/84] Fix welcome text for Arabic language --- .../Localization/MyProjectName/ar.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/Localization/MyProjectName/ar.json b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/Localization/MyProjectName/ar.json index 3e5227a915..96bbf80b40 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/Localization/MyProjectName/ar.json +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/Localization/MyProjectName/ar.json @@ -2,7 +2,7 @@ "culture": "ar", "texts": { "Menu:Home": "الرئيسية", - "Welcome": "مرحبا", + "Menu:Home": "الصفحة الرئيسية", "LongWelcomeMessage": "مرحبا بكم في التطبيق. هذا مشروع بدء تشغيل يعتمد على إطار عمل ABP. لمزيد من المعلومات ، يرجى زيارة abp.io." } -} \ No newline at end of file +} From c4e9defaff510d1ccf0cbfbbc0f9296167031f39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alper=20Ebi=C3=A7o=C4=9Flu?= <9526587+ebicoglu@users.noreply.github.com> Date: Sun, 31 Jul 2022 10:29:58 +0300 Subject: [PATCH 61/84] fix SaaS text for Arabic language --- .../Commercial/Localization/Resources/ar.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/ar.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/ar.json index 1a9aa7cba2..c7b91a99a0 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/ar.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/ar.json @@ -89,7 +89,7 @@ "Blogging": "التدوين", "Identity": "هوية", "IdentityServer": "خادم الهوية", - "Saas": "ساس", + "Saas": "البرمجيات كخدمة", "LanguageManagement": "إدارة اللغة", "TextTemplateManagement": "إدارة قالب النص", "See All Modules": "انظر جميع الوحدات", @@ -382,4 +382,4 @@ "RenewLicenseEarly": "إذا قمت بتجديد رخصتي في وقت مبكر ، هل سأحصل على السنة كاملة؟", "RenewLicenseEarylExplanation": "عند تجديد الترخيص الخاص بك قبل تاريخ انتهاء الترخيص الخاص بك ، ستتم إضافة سنة واحدة إلى تاريخ انتهاء الترخيص الخاص بك. على سبيل المثال ، إذا انتهت صلاحية ترخيصك في {0} -06-06 وقمت بتجديده في {0} -01-01 ، فسيكون تاريخ انتهاء صلاحية الترخيص الجديد {1} -06-06." } -} \ No newline at end of file +} From 8a12403acab81c8e4c018ad120de993e6dfa979a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alper=20Ebi=C3=A7o=C4=9Flu?= <9526587+ebicoglu@users.noreply.github.com> Date: Sun, 31 Jul 2022 10:31:34 +0300 Subject: [PATCH 62/84] fix Actions text for Arabic languge --- .../src/Volo.Abp.UI/Localization/Resources/AbpUi/ar.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/ar.json b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/ar.json index 7e667c1bbc..4717b1fe9b 100644 --- a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/ar.json +++ b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/ar.json @@ -11,7 +11,7 @@ "Close": "أغلق", "Save": "حفظ", "SavingWithThreeDot": "حفظ...", - "Actions": "أجراءات", + "Actions": "الإجراءات", "Delete": "حذف", "SuccessfullyDeleted": "تم الحذف بنجاح", "Edit": "تعديل", @@ -50,4 +50,4 @@ "ItemWillBeDeletedMessage": "سوف يتم حذف هذا البند!", "ManageYourAccount": "إدارة حسابك" } -} \ No newline at end of file +} From e90bd47ce0d9f3f224980b1bbb8b80238cb35a14 Mon Sep 17 00:00:00 2001 From: malik masis Date: Mon, 1 Aug 2022 08:23:14 +0300 Subject: [PATCH 63/84] Update generic csharp proxy for public --- .../BlogPostPublicClientProxy.Generated.cs | 8 +-- .../ClientProxies/cms-kit-generate-proxy.json | 63 ++----------------- 2 files changed, 10 insertions(+), 61 deletions(-) diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/BlogPostPublicClientProxy.Generated.cs b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/BlogPostPublicClientProxy.Generated.cs index 8d66adc208..f26816e88d 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/BlogPostPublicClientProxy.Generated.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/BlogPostPublicClientProxy.Generated.cs @@ -14,18 +14,18 @@ namespace Volo.CmsKit.Public.Blogs.ClientProxies; [ExposeServices(typeof(IBlogPostPublicAppService), typeof(BlogPostPublicClientProxy))] public partial class BlogPostPublicClientProxy : ClientProxyBase, IBlogPostPublicAppService { - public virtual async Task GetAsync(string blogSlug, string blogPostSlug) + public virtual async Task GetAsync(string blogSlug, string blogPostSlug) { - return await RequestAsync(nameof(GetAsync), new ClientProxyRequestTypeValue + return await RequestAsync(nameof(GetAsync), new ClientProxyRequestTypeValue { { typeof(string), blogSlug }, { typeof(string), blogPostSlug } }); } - public virtual async Task> GetListAsync(string blogSlug, BlogPostGetListInput input) + public virtual async Task> GetListAsync(string blogSlug, BlogPostGetListInput input) { - return await RequestAsync>(nameof(GetListAsync), new ClientProxyRequestTypeValue + return await RequestAsync>(nameof(GetListAsync), new ClientProxyRequestTypeValue { { typeof(string), blogSlug }, { typeof(BlogPostGetListInput), input } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/cms-kit-generate-proxy.json b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/cms-kit-generate-proxy.json index 626dce7ff2..e3b3802ee9 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/cms-kit-generate-proxy.json +++ b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/cms-kit-generate-proxy.json @@ -505,57 +505,6 @@ } } }, - "Volo.CmsKit.Public.Polls.PollViewComponentController": { - "controllerName": "PollViewComponent", - "controllerGroupName": "PollViewComponent", - "isRemoteService": true, - "apiVersion": null, - "type": "Volo.CmsKit.Public.Polls.PollViewComponentController", - "interfaces": [ - { - "type": "Volo.CmsKit.Public.Polls.IPollViewComponentAppService" - } - ], - "actions": { - "ParseAsyncByContent": { - "uniqueName": "ParseAsyncByContent", - "name": "ParseAsync", - "httpMethod": "GET", - "url": "api/cms-kit-public/polls/{content}", - "supportedVersions": [], - "parametersOnMethod": [ - { - "name": "content", - "typeAsString": "System.String, System.Private.CoreLib", - "type": "System.String", - "typeSimple": "string", - "isOptional": false, - "defaultValue": null - } - ], - "parameters": [ - { - "nameOnMethod": "content", - "name": "content", - "jsonName": null, - "type": "System.String", - "typeSimple": "string", - "isOptional": false, - "defaultValue": null, - "constraintTypes": [], - "bindingSourceId": "Path", - "descriptorName": "" - } - ], - "returnValue": { - "type": "System.Collections.Generic.List", - "typeSimple": "[Volo.CmsKit.Polls.ContentFragment]" - }, - "allowAnonymous": null, - "implementFrom": "Volo.CmsKit.Public.Polls.IPollViewComponentAppService" - } - } - }, "Volo.CmsKit.Public.Pages.PagesPublicController": { "controllerName": "PagesPublic", "controllerGroupName": "PagesPublic", @@ -599,8 +548,8 @@ } ], "returnValue": { - "type": "Volo.CmsKit.Public.Pages.PageDto", - "typeSimple": "Volo.CmsKit.Public.Pages.PageDto" + "type": "Volo.CmsKit.Contents.PageDto", + "typeSimple": "Volo.CmsKit.Contents.PageDto" }, "allowAnonymous": null, "implementFrom": "Volo.CmsKit.Public.Pages.IPagePublicAppService" @@ -985,8 +934,8 @@ } ], "returnValue": { - "type": "Volo.CmsKit.Public.Blogs.BlogPostPublicDto", - "typeSimple": "Volo.CmsKit.Public.Blogs.BlogPostPublicDto" + "type": "Volo.CmsKit.Contents.BlogPostCommonDto", + "typeSimple": "Volo.CmsKit.Contents.BlogPostCommonDto" }, "allowAnonymous": null, "implementFrom": "Volo.CmsKit.Public.Blogs.IBlogPostPublicAppService" @@ -1090,8 +1039,8 @@ } ], "returnValue": { - "type": "Volo.Abp.Application.Dtos.PagedResultDto", - "typeSimple": "Volo.Abp.Application.Dtos.PagedResultDto" + "type": "Volo.Abp.Application.Dtos.PagedResultDto", + "typeSimple": "Volo.Abp.Application.Dtos.PagedResultDto" }, "allowAnonymous": null, "implementFrom": "Volo.CmsKit.Public.Blogs.IBlogPostPublicAppService" From 845402fc3bde40418da365b7ad0451452d2e3a4e Mon Sep 17 00:00:00 2001 From: malik masis Date: Mon, 1 Aug 2022 08:23:50 +0300 Subject: [PATCH 64/84] Renamed BlogPostPublic to BlogPostCommonDto --- .../{BlogPostPublicDto.cs => BlogPostCommonDto.cs} | 2 +- .../CmsKit/Public/Blogs/IBlogPostPublicAppService.cs | 4 ++-- .../CmsKit/Public/Blogs/BlogPostPublicAppService.cs | 10 +++++----- .../Public/PublicApplicationAutoMapperProfile.cs | 2 +- .../CmsKit/Public/Blogs/BlogPostPublicController.cs | 4 ++-- .../Pages/Public/CmsKit/Blogs/BlogPost.cshtml.cs | 2 +- .../Pages/Public/CmsKit/Blogs/Index.cshtml.cs | 2 +- 7 files changed, 13 insertions(+), 13 deletions(-) rename modules/cms-kit/src/Volo.CmsKit.Common.Application.Contracts/Volo/CmsKit/Contents/{BlogPostPublicDto.cs => BlogPostCommonDto.cs} (89%) diff --git a/modules/cms-kit/src/Volo.CmsKit.Common.Application.Contracts/Volo/CmsKit/Contents/BlogPostPublicDto.cs b/modules/cms-kit/src/Volo.CmsKit.Common.Application.Contracts/Volo/CmsKit/Contents/BlogPostCommonDto.cs similarity index 89% rename from modules/cms-kit/src/Volo.CmsKit.Common.Application.Contracts/Volo/CmsKit/Contents/BlogPostPublicDto.cs rename to modules/cms-kit/src/Volo.CmsKit.Common.Application.Contracts/Volo/CmsKit/Contents/BlogPostCommonDto.cs index d00a6364f1..c2b2373d9c 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Common.Application.Contracts/Volo/CmsKit/Contents/BlogPostPublicDto.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Common.Application.Contracts/Volo/CmsKit/Contents/BlogPostCommonDto.cs @@ -6,7 +6,7 @@ using Volo.CmsKit.Users; namespace Volo.CmsKit.Contents; [Serializable] -public class BlogPostPublicDto : AuditedEntityDto, IContent +public class BlogPostCommonDto : AuditedEntityDto, IContent { public Guid BlogId { get; set; } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/IBlogPostPublicAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/IBlogPostPublicAppService.cs index b60b500cfe..a6462d937c 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/IBlogPostPublicAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/IBlogPostPublicAppService.cs @@ -10,9 +10,9 @@ namespace Volo.CmsKit.Public.Blogs; public interface IBlogPostPublicAppService : IApplicationService { - Task> GetListAsync([NotNull] string blogSlug, BlogPostGetListInput input); + Task> GetListAsync([NotNull] string blogSlug, BlogPostGetListInput input); - Task GetAsync([NotNull] string blogSlug, [NotNull] string blogPostSlug); + Task GetAsync([NotNull] string blogSlug, [NotNull] string blogPostSlug); Task> GetAuthorsHasBlogPostsAsync(BlogPostFilteredPagedAndSortedResultRequestDto input); diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Blogs/BlogPostPublicAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Blogs/BlogPostPublicAppService.cs index ebdda3d293..80185f7bea 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Blogs/BlogPostPublicAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Blogs/BlogPostPublicAppService.cs @@ -29,20 +29,20 @@ public class BlogPostPublicAppService : CmsKitPublicAppServiceBase, IBlogPostPub ContentParser = contentParser; } - public virtual async Task GetAsync( + public virtual async Task GetAsync( [NotNull] string blogSlug, [NotNull] string blogPostSlug) { var blog = await BlogRepository.GetBySlugAsync(blogSlug); var blogPost = await BlogPostRepository.GetBySlugAsync(blog.Id, blogPostSlug); - var blogPostDto = ObjectMapper.Map(blogPost); + var blogPostDto = ObjectMapper.Map(blogPost); blogPostDto.ContentFragments = await ContentParser.ParseAsync(blogPost.Content); return blogPostDto; } - public virtual async Task> GetListAsync([NotNull] string blogSlug, BlogPostGetListInput input) + public virtual async Task> GetListAsync([NotNull] string blogSlug, BlogPostGetListInput input) { var blog = await BlogRepository.GetBySlugAsync(blogSlug); @@ -50,10 +50,10 @@ public class BlogPostPublicAppService : CmsKitPublicAppServiceBase, IBlogPostPub BlogPostStatus.Published, input.MaxResultCount, input.SkipCount, input.Sorting); - return new PagedResultDto( + return new PagedResultDto( await BlogPostRepository.GetCountAsync(blogId: blog.Id, tagId: input.TagId, statusFilter: BlogPostStatus.Published, authorId: input.AuthorId), - ObjectMapper.Map, List>(blogPosts)); + ObjectMapper.Map, List>(blogPosts)); } public virtual async Task> GetAuthorsHasBlogPostsAsync(BlogPostFilteredPagedAndSortedResultRequestDto input) diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/PublicApplicationAutoMapperProfile.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/PublicApplicationAutoMapperProfile.cs index fbd33195f6..bd0c6d5e6c 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/PublicApplicationAutoMapperProfile.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/PublicApplicationAutoMapperProfile.cs @@ -33,7 +33,7 @@ public class PublicApplicationAutoMapperProfile : Profile CreateMap() .Ignore(x => x.ContentFragments); - CreateMap() + CreateMap() .Ignore(x => x.ContentFragments); CreateMap(); diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Blogs/BlogPostPublicController.cs b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Blogs/BlogPostPublicController.cs index c068c4b5e6..be28afa6a4 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Blogs/BlogPostPublicController.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Blogs/BlogPostPublicController.cs @@ -25,14 +25,14 @@ public class BlogPostPublicController : CmsKitPublicControllerBase, IBlogPostPub [HttpGet] [Route("{blogSlug}/{blogPostSlug}")] - public virtual Task GetAsync(string blogSlug, string blogPostSlug) + public virtual Task GetAsync(string blogSlug, string blogPostSlug) { return BlogPostPublicAppService.GetAsync(blogSlug, blogPostSlug); } [HttpGet] [Route("{blogSlug}")] - public virtual Task> GetListAsync(string blogSlug, BlogPostGetListInput input) + public virtual Task> GetListAsync(string blogSlug, BlogPostGetListInput input) { return BlogPostPublicAppService.GetListAsync(blogSlug, input); } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/BlogPost.cshtml.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/BlogPost.cshtml.cs index f81f9fca7f..e1d9a3b0f7 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/BlogPost.cshtml.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/BlogPost.cshtml.cs @@ -16,7 +16,7 @@ public class BlogPostModel : CmsKitPublicPageModelBase [BindProperty(SupportsGet = true)] public string BlogPostSlug { get; set; } - public BlogPostPublicDto BlogPost { get; private set; } + public BlogPostCommonDto BlogPost { get; private set; } public BlogFeatureDto CommentsFeature { get; private set; } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/Index.cshtml.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/Index.cshtml.cs index c40fe4d116..736fba5e9e 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/Index.cshtml.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/Index.cshtml.cs @@ -25,7 +25,7 @@ public class IndexModel : CmsKitPublicPageModelBase [BindProperty(SupportsGet = true)] public Guid? TagId { get; set; } - public PagedResultDto Blogs { get; private set; } + public PagedResultDto Blogs { get; private set; } public PagerModel PagerModel => new PagerModel(Blogs.TotalCount, Blogs.Items.Count, CurrentPage, PageSize, Request.Path.ToString()); From 2dda3ef86a4e48aa09fcd56ac7b53ea4d6d8e0c0 Mon Sep 17 00:00:00 2001 From: TotPeRo Date: Sun, 31 Jul 2022 23:47:29 -0700 Subject: [PATCH 65/84] Fix incorrect romanian translation of "Surname" Surname => Nume de familie --- .../Volo/Abp/Account/Localization/Resources/ro-RO.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/ro-RO.json b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/ro-RO.json index c753009bb0..149ad71d95 100644 --- a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/ro-RO.json +++ b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/ro-RO.json @@ -27,7 +27,7 @@ "DisplayName:UserName": "Nume de utilizator", "DisplayName:Email": "Email", "DisplayName:Name": "Nume", - "DisplayName:Surname": "Surname", + "DisplayName:Surname": "Nume de familie", "DisplayName:Password": "Parolă", "DisplayName:EmailAddress": "Adresa de email", "DisplayName:PhoneNumber": "Număr de telefon", From 7c4da46f46954dc1b912f8f522d138bc84c1f6ee Mon Sep 17 00:00:00 2001 From: TotPeRo Date: Sun, 31 Jul 2022 23:48:18 -0700 Subject: [PATCH 66/84] Fix incorrect romanian translation of "Surname" Surname => Nume de familie --- .../Volo/Abp/Identity/Localization/ro-RO.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/ro-RO.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/ro-RO.json index d08702a356..f9c49a7d42 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/ro-RO.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/ro-RO.json @@ -21,7 +21,7 @@ "DisplayName:RoleName": "Nume rol", "DisplayName:UserName": "Nume de utilizator", "DisplayName:Name": "Nume", - "DisplayName:Surname": "Nume", + "DisplayName:Surname": "Nume de familie", "DisplayName:Password": "Parola", "DisplayName:Email": "Adresa de email", "DisplayName:PhoneNumber": "Număr de telefon", @@ -110,4 +110,4 @@ "Description:Abp.Identity.User.IsUserNameUpdateEnabled": "Dacă numele de utilizator poate fi actualizat de către utilizator.", "Description:Abp.Identity.User.IsEmailUpdateEnabled": "Dacă emailul poate fi actualizat de către utilizator." } -} \ No newline at end of file +} From 765e4f3d4a0e7b18392b6f2f4a5463937bfe539f Mon Sep 17 00:00:00 2001 From: TotPeRo Date: Sun, 31 Jul 2022 23:52:59 -0700 Subject: [PATCH 67/84] Fix incorrect romanian translation of "Surname" Surname => Nume de familie --- .../AbpIoLocalization/Www/Localization/Resources/ro-RO.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/ro-RO.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/ro-RO.json index bd04ba7f49..a1ff5f58ad 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/ro-RO.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/ro-RO.json @@ -253,18 +253,18 @@ "Or": "Sau", "TellUsAboutYourself": "Spuneţi-ne un pic despre dumneavoastră", "Name": "Nume", - "Surname": "Nume", + "Surname": "Nume de familie", "CompanyName": "Nume companie", "DoYouAgreePrivacyPolicy": "Sunt de acord cu Termenii & condiţiile şi Politica de confidenţialitate.", "Free": "Gratuit", "DDDEBook": "E-book DDD", "PracticalGuideForImplementingDDD": "Această carte este un ghid practic pentru implementarea Domain Driven Design în framework-ul ABP.", "IntroducingDDD": "Introducere în Domain Driven Design", - "DDDLayersAndCleanArchitecture": "Straturile DDD & Arhitectură curată", + "DDDLayersAndCleanArchitecture": "Straturile DDD şi Arhitectură curată", "LayeringOfADotnetSolution": "Stratificarea unei soluţii .NET", "ImplementingDDDBuildingBlocks": "Implementând DDD Building Blocks", "DomainVsApplicationLogic": "Domain Logic vs Application Logic", - "SamplesAndDiscussions": "Exemple & Discuţii", + "SamplesAndDiscussions": "Exemple şi Discuţii", "EmailNotValid": "Vă rugăm să introduceţi o adresa de email validă.", "WeWillSendYouADownloadLink": "Un link care conţine e-book-ul a fost trimis către {0}. Verificaţi-vă folderele de inbox, junk sau spam!", "GoHome": "Pagina principală", From 4a47df4aa25534c13c7e3b4507ba319ee7a433c9 Mon Sep 17 00:00:00 2001 From: TotPeRo Date: Sun, 31 Jul 2022 23:55:38 -0700 Subject: [PATCH 68/84] Fix incorrect romanian translation of "Surname" Surname => Nume de familie --- .../Admin/Localization/Resources/ro-RO.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/ro-RO.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/ro-RO.json index 44ac964263..409ab816a5 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/ro-RO.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/ro-RO.json @@ -30,7 +30,7 @@ "NugetPackageDeletionWarningMessage": "Sunteţi sigur(ă) că doriţi să ştergeţi acest pachet de tip Nuget?", "ModuleDeletionWarningMessage": "Sunteţi sigur(ă) că doriţi să ştergeţi acest modul?", "Name": "Nume", - "DisplayName": "Nume de afişare", + "DisplayName": "Nume afişat", "ShortDescription": "Descriere scurtă", "NameFilter": "Nume", "CreationTime": "Data şi ora creării", @@ -317,7 +317,7 @@ "TrialLicenseStartDateFilter": "Data de început", "TrialLicenseEndDateFilter": "Data de încheiere", "FirsName": "Nume", - "LastName": "Nume", + "LastName": "Nume de familie", "StartDate": "Data de început", "EndDate": "Data de încheiere", "PurchasedDate": "Data achiziției", @@ -350,4 +350,4 @@ "Volo.AbpIo.Commercial:030010": "Pentru a achiziționa licența de probă, mai întâi trebuie să vă activați licența de probă!", "Volo.AbpIo.Commercial:030011": "Nu puteți șterge o licență de probă atunci când este achiziționată!" } -} \ No newline at end of file +} From 23ce2fa8a287dd1baf7a834f7f4f773e0dd37cd8 Mon Sep 17 00:00:00 2001 From: TotPeRo Date: Sun, 31 Jul 2022 23:56:56 -0700 Subject: [PATCH 69/84] Fix incorrect romanian translation of "Surname" Surname => Nume de familie --- .../Commercial/Localization/Resources/ro-RO.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/ro-RO.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/ro-RO.json index 44b6f66037..be56afbb43 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/ro-RO.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/ro-RO.json @@ -341,7 +341,7 @@ "SignIn": "Autentificare", "Or": "Sau", "TellUsAboutYourself": "Spuneţi-ne despre dumneavoastră", - "Surname": "Nume", + "Surname": "Nume de familie", "DoYouAgreePrivacyPolicy": "Sunt de acord cu Termenii şi condiţiile şi Politica de confidenţialitate.", "VolosoftMarketingInformationMessage": "Sunt de acord să primesc informaţii, sfaturi şi oferte despre soluţii pentru afaceri şi organizaţii şi alte produse şi servicii Volosoft.", "VolosoftSharingInformationMessage": "Sunt de acord ca Volosoft să partajeze informaţiile mele cu partenerii selectaţi astfel încât să primesc informaţii relevante despre produsele şi serviciile lor.", @@ -380,4 +380,4 @@ "TrialLicenseExpiredInfo": "Perioada de licență de probă a expirat!", "CommercialNewsletterConfirmationMessage": "Sunt de acord cu Termenii și condițiile și cu Politica de confidențialitate ." } -} \ No newline at end of file +} From 216083550710cf591da165a3890ece70fed5be3d Mon Sep 17 00:00:00 2001 From: malik masis Date: Mon, 1 Aug 2022 10:06:15 +0300 Subject: [PATCH 70/84] Removed the highlight class once clicking Preview --- .../Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/create.js | 3 +++ .../Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/update.js | 3 +++ .../src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/create.js | 3 +++ .../src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/update.js | 5 ++++- 4 files changed, 13 insertions(+), 1 deletion(-) diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/create.js b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/create.js index d81dcd9f06..a101635d73 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/create.js +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/create.js @@ -342,6 +342,9 @@ $(function () { $.post("/CmsKitCommonWidgets/ContentPreview", { content: content }, function (result) { editor.setHTML(result); + + var highllightedText = $('#ContentEditor').find('.toastui-editor-md-preview-highlight'); + highllightedText.removeClass('toastui-editor-md-preview-highlight'); }); } else if ($(this).attr("aria-label") == 'Write') { diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/update.js b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/update.js index 292535034d..d14194ecb5 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/update.js +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/update.js @@ -263,6 +263,9 @@ $(function () { $.post("/CmsKitCommonWidgets/ContentPreview", { content: content }, function (result) { editor.setHTML(result); + + var highllightedText = $('#ContentEditor').find('.toastui-editor-md-preview-highlight'); + highllightedText.removeClass('toastui-editor-md-preview-highlight'); }); } else if ($(this).attr("aria-label") == 'Write') { diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/create.js b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/create.js index 51c405e03f..ee6c7b7f9f 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/create.js +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/create.js @@ -186,6 +186,9 @@ $(function () { $('head').append(''); editor.setHTML(result); + + var highllightedText = $('#ContentEditor').find('.toastui-editor-md-preview-highlight'); + highllightedText.removeClass('toastui-editor-md-preview-highlight'); }); } else if ($(this).attr("aria-label") == 'Write'){ diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/update.js b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/update.js index 7f5a54c798..c46f1c274c 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/update.js +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/update.js @@ -156,6 +156,9 @@ $(function () { $('head').append(''); editor.setHTML(result); + + var highllightedText = $('#ContentEditor').find('.toastui-editor-md-preview-highlight'); + highllightedText.removeClass('toastui-editor-md-preview-highlight'); }); } else if ($(this).attr("aria-label") == 'Write') { @@ -163,7 +166,7 @@ $(function () { editor.setMarkdown(retrievedObject); } }); - + function createAddWidgetButton() { const button = document.createElement('button'); From 1e1873b965f39599721d9a655d5ce2a0cefbceed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alper=20Ebi=C3=A7o=C4=9Flu?= <9526587+ebicoglu@users.noreply.github.com> Date: Tue, 2 Aug 2022 12:25:02 +0300 Subject: [PATCH 71/84] rename to projects --- .../Volo.Docs.Domain/Volo/Docs/Localization/Domain/en.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Localization/Domain/en.json b/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Localization/Domain/en.json index bc5c7cf826..236589ee3c 100644 --- a/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Localization/Domain/en.json +++ b/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Localization/Domain/en.json @@ -19,7 +19,7 @@ "SuccessfullyReIndexAllProject": "Successfully reindexed all projects", "InThisDocument": "In this document", "GoToTop": "Go to top", - "Projects": "Project(s)", + "Projects": "Projects", "NoProjectWarning": "There are no projects yet!", "DocumentNotFound": "Oops, the requested document was not found!", "ProjectNotFound": "Oops, the requested project was not found!", @@ -38,4 +38,4 @@ "Search": "Search", "SearchResults": "Search Results" } -} \ No newline at end of file +} From 11860424fafe0a146de30e293854a5773d41aa28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alper=20Ebi=C3=A7o=C4=9Flu?= <9526587+ebicoglu@users.noreply.github.com> Date: Tue, 2 Aug 2022 12:25:22 +0300 Subject: [PATCH 72/84] rename to projects --- .../Volo.Docs.Domain/Volo/Docs/Localization/Domain/en-GB.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Localization/Domain/en-GB.json b/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Localization/Domain/en-GB.json index 02026775d7..a8cf1c6627 100644 --- a/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Localization/Domain/en-GB.json +++ b/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Localization/Domain/en-GB.json @@ -19,7 +19,7 @@ "SuccessfullyReIndexAllProject": "Successfully reindexed all projects", "InThisDocument": "In this document", "GoToTop": "Go to top", - "Projects": "Project(s)", + "Projects": "Projects", "NoProjectWarning": "There are no Projects yet!", "DocumentNotFound": "Oops, the requested document was not found!", "ProjectNotFound": "Oops, the requested project was not found!", @@ -36,4 +36,4 @@ "Volo.Docs.Domain:010002": "ShortName {ShortName} already exists.", "Preview": "preview" } -} \ No newline at end of file +} From b8003e5f4739af8cc045c6711e8f65155ae20a67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alper=20Ebi=C3=A7o=C4=9Flu?= <9526587+ebicoglu@users.noreply.github.com> Date: Tue, 2 Aug 2022 12:25:38 +0300 Subject: [PATCH 73/84] Update tr.json --- .../Volo.Docs.Domain/Volo/Docs/Localization/Domain/tr.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Localization/Domain/tr.json b/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Localization/Domain/tr.json index ca6128638f..384fe5fcd3 100644 --- a/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Localization/Domain/tr.json +++ b/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Localization/Domain/tr.json @@ -19,7 +19,7 @@ "SuccessfullyReIndexAllProject": "Tüm projeler başarıyla yeniden indekslendi", "InThisDocument": "Bu dökümanda", "GoToTop": "En üste çık", - "Projects": "Proje(ler)", + "Projects": "Projeler", "NoProjectWarning": "Hiç proje yok!", "DocumentNotFound": "Aradığınız döküman bulunamadı!", "ProjectNotFound": "Talep edilen proje bulunamadı!", @@ -38,4 +38,4 @@ "Search": "Arama", "SearchResults": "Arama Sonuçları" } -} \ No newline at end of file +} From 914552ee2fc2397f27fbaa221003f49e669790cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Can=20Y=C4=B1lmaz?= Date: Wed, 3 Aug 2022 15:14:07 +0300 Subject: [PATCH 74/84] upgrade package to next version --- npm/ng-packs/package.json | 2 +- npm/ng-packs/packages/theme-shared/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/npm/ng-packs/package.json b/npm/ng-packs/package.json index aa558afada..2491ff401c 100644 --- a/npm/ng-packs/package.json +++ b/npm/ng-packs/package.json @@ -80,7 +80,7 @@ "@nrwl/linter": "13.10.3", "@nrwl/workspace": "13.10.3", "@schematics/angular": "~12.2.0", - "@swimlane/ngx-datatable": "^19.0.0", + "@swimlane/ngx-datatable": "^20.0.0", "@types/jest": "27.0.2", "@types/node": "14.14.33", "@typescript-eslint/eslint-plugin": "5.18.0", diff --git a/npm/ng-packs/packages/theme-shared/package.json b/npm/ng-packs/packages/theme-shared/package.json index f8e650ba6c..124caec215 100644 --- a/npm/ng-packs/packages/theme-shared/package.json +++ b/npm/ng-packs/packages/theme-shared/package.json @@ -12,7 +12,7 @@ "@ng-bootstrap/ng-bootstrap": "~12.0.0-beta.4", "@ngx-validate/core": "^0.1.2", "@popperjs/core": "~2.11.2", - "@swimlane/ngx-datatable": "^19.0.0", + "@swimlane/ngx-datatable": "^20.0.0", "bootstrap": "^5.1.1", "tslib": "^2.0.0" }, From 42ea0410a734246e389b2c0a82069e7585e56789 Mon Sep 17 00:00:00 2001 From: malik masis Date: Thu, 4 Aug 2022 15:00:35 +0300 Subject: [PATCH 75/84] Removed the FileName filter --- .../Pages/Docs/Admin/Documents/Index.cshtml | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Documents/Index.cshtml b/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Documents/Index.cshtml index 5873afc279..a1301e4a47 100644 --- a/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Documents/Index.cshtml +++ b/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Documents/Index.cshtml @@ -66,18 +66,6 @@ - -
-
-
@L["FileName"].Value
- - -
-
-
@L["Format"].Value
From 9c1691c5ce4bf6b17fc91c4c4f860cc93cc62241 Mon Sep 17 00:00:00 2001 From: malik masis Date: Thu, 4 Aug 2022 17:04:27 +0300 Subject: [PATCH 76/84] Added project to the lang files --- .../Docs/ApplicationContracts/ar.json | 3 +- .../Docs/ApplicationContracts/cs.json | 3 +- .../Docs/ApplicationContracts/de-DE.json | 3 +- .../Docs/ApplicationContracts/de.json | 3 +- .../Docs/ApplicationContracts/el.json | 3 +- .../Docs/ApplicationContracts/en-GB.json | 3 +- .../Docs/ApplicationContracts/en.json | 3 +- .../Docs/ApplicationContracts/es.json | 3 +- .../Docs/ApplicationContracts/fi.json | 3 +- .../Docs/ApplicationContracts/fr.json | 3 +- .../Docs/ApplicationContracts/hi.json | 3 +- .../Docs/ApplicationContracts/hu.json | 118 +++++++++--------- .../Docs/ApplicationContracts/is.json | 3 +- .../Docs/ApplicationContracts/it.json | 3 +- .../Docs/ApplicationContracts/nl.json | 3 +- .../Docs/ApplicationContracts/pl-PL.json | 3 +- .../Docs/ApplicationContracts/pt-BR.json | 3 +- .../Docs/ApplicationContracts/ro-RO.json | 3 +- .../Docs/ApplicationContracts/ru.json | 3 +- .../Docs/ApplicationContracts/sk.json | 3 +- .../Docs/ApplicationContracts/sl.json | 3 +- .../Docs/ApplicationContracts/tr.json | 5 +- .../Docs/ApplicationContracts/vi.json | 3 +- .../Docs/ApplicationContracts/zh-Hans.json | 3 +- .../Docs/ApplicationContracts/zh-Hant.json | 3 +- 25 files changed, 108 insertions(+), 84 deletions(-) diff --git a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/ar.json b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/ar.json index 4849da66e5..ada739b4d7 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/ar.json +++ b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/ar.json @@ -54,6 +54,7 @@ "Version": "إصدار", "LanguageCode": "رمز اللغة", "FileName": "اسم الملف", - "LastCachedTime": "وقت ذاكرة التخزين" + "LastCachedTime": "وقت ذاكرة التخزين", + "Project": "مشروع " } } diff --git a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/cs.json b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/cs.json index 57dd3c75d5..c593147804 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/cs.json +++ b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/cs.json @@ -54,6 +54,7 @@ "Version": "Verze", "LanguageCode": "Kód jazyka", "FileName": "Název souboru", - "LastCachedTime": "Čas uložení v mezipaměti" + "LastCachedTime": "Čas uložení v mezipaměti", + "Project": "Projekt" } } diff --git a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/de-DE.json b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/de-DE.json index 28d5f53f47..4d92840132 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/de-DE.json +++ b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/de-DE.json @@ -54,6 +54,7 @@ "Version": "Version", "LanguageCode": "Sprachcode", "FileName": "Dateiname", - "LastCachedTime": "Cache-Zeit" + "LastCachedTime": "Cache-Zeit", + "Project": "Projekt" } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/de.json b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/de.json index 2eccecb715..7939e4a8f1 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/de.json +++ b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/de.json @@ -32,6 +32,7 @@ "DisplayName:GitHubUserAgent": "GitHub-Benutzer-Agent", "DisplayName:All": "Pull all", "DisplayName:LanguageCode": "Sprachcode", - "DisplayName:Version": "Version" + "DisplayName:Version": "Version", + "Project": "Projekt" } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/el.json b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/el.json index d44ba001db..bacdfd56de 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/el.json +++ b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/el.json @@ -54,6 +54,7 @@ "Version": "Εκδοχή", "LanguageCode": "Κωδικός γλώσσας", "FileName": "Όνομα αρχείου", - "LastCachedTime": "Χρόνος προσωρινής αποθήκευσης" + "LastCachedTime": "Χρόνος προσωρινής αποθήκευσης", + "Project": "Εργο" } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/en-GB.json b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/en-GB.json index 1e3339963a..8b830e7aa9 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/en-GB.json +++ b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/en-GB.json @@ -54,6 +54,7 @@ "Version": "Version", "LanguageCode": "Language code", "FileName": "File name", - "LastCachedTime": "Cache time" + "LastCachedTime": "Cache time", + "Project": "Project" } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/en.json b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/en.json index d19bef7adf..3439dc62d4 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/en.json +++ b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/en.json @@ -54,6 +54,7 @@ "Version": "Version", "LanguageCode": "Language code", "FileName": "File name", - "LastCachedTime": "Cache time" + "LastCachedTime": "Cache time", + "Project": "Project" } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/es.json b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/es.json index f09eb5386b..9858f9d94a 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/es.json +++ b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/es.json @@ -54,6 +54,7 @@ "Version": "Versión", "LanguageCode": "Código de idioma", "FileName": "Nombre de fichero", - "LastCachedTime": "Última actualización de caché" + "LastCachedTime": "Última actualización de caché", + "Project": "Proyecto" } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/fi.json b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/fi.json index 0d0f7de507..58befd658c 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/fi.json +++ b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/fi.json @@ -54,6 +54,7 @@ "Version": "Versio", "LanguageCode": "Kielikoodi", "FileName": "Tiedoston nimi", - "LastCachedTime": "Välimuistin aika" + "LastCachedTime": "Välimuistin aika", + "Project": "Projekti" } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/fr.json b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/fr.json index f00ce0a5c9..7a6d6a89cf 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/fr.json +++ b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/fr.json @@ -54,6 +54,7 @@ "Version": "Version", "LanguageCode": "Code de langue", "FileName": "Nom de fichier", - "LastCachedTime": "Temps de cache" + "LastCachedTime": "Temps de cache", + "Project": "Projet" } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/hi.json b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/hi.json index d2a0e11876..a7d357e83e 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/hi.json +++ b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/hi.json @@ -54,6 +54,7 @@ "Version": "संस्करण", "LanguageCode": "भाषा कोड", "FileName": "फ़ाइल का नाम", - "LastCachedTime": "कैश समय" + "LastCachedTime": "कैश समय", + "Project": "परियोजना" } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/hu.json b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/hu.json index 10d1611838..b10e721550 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/hu.json +++ b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/hu.json @@ -1,61 +1,61 @@ { - "culture": "hu", - "texts": { - "Permission:DocumentManagement": "Dokumentum kezelés", - "Permission:Projects": "Projektek", - "Permission:Edit": "Szerkesztés", - "Permission:Delete": "Törlés", - "Permission:Create": "Létrehozás", - "Permission:Documents": "Dokumentumok", - "Menu:Documents": "Dokumentumok", - "Menu:DocumentManagement": "Dokumentumok", - "Menu:ProjectManagement": "Projektek", - "CreateANewProject": "Új projekt létrehozása", - "Edit": "Szerkesztés", - "Create": "Létrehozás", - "Pull": "Pull", - "Projects": "Projektek", - "Name": "Név", - "ShortName": "Rövid név", - "DocumentStoreType": "Dokumentumtároló típus", - "Format": "Formátum", - "ShortNameInfoText": "Használjon egyedi URL-t.", - "DisplayName:Name": "Név", - "DisplayName:ShortName": "Rövid név", - "DisplayName:Format": "Formátum", - "DisplayName:DefaultDocumentName": "Alapértlemezett dokumentum név", - "DisplayName:NavigationDocumentName": "Navigációs dokumentum neve", - "DisplayName:MinimumVersion": "Minimális verzió", - "DisplayName:MainWebsiteUrl": "A fő webhely URL-je", - "DisplayName:LatestVersionBranchName": "Az utolsó verzió branch neve", - "DisplayName:GitHubRootUrl": "GitHub root URL", - "DisplayName:GitHubAccessToken": "GitHub access token", - "DisplayName:GitHubUserAgent": "GitHub user agent", - "DisplayName:GithubVersionProviderSource": "GitHub version provider source", - "DisplayName:VersionBranchPrefix": "Version branch prefix", - "DisplayName:All": "Pull all", - "DisplayName:LanguageCode": "Nyelv kódja", - "DisplayName:Version": "Verzió", - "Documents": "Dokumentumok", - "RemoveFromCache": "Távolítsa el a gyorsítótárból", - "Reindex": "Újraindexálás", - "ReindexCompleted": "Újraindexálás teljes.", - "RemovedFromCache": "Távolítsa el a gyorsítótárból", - "RemoveFromCacheConfirmation": "Biztosan eltávolítja ezt az elemet a gyorsítótárból?", - "ReIndexDocumentConfirmation": "Biztosan újraindexeli ezt az elemet?", - "DeleteDocumentFromDbConfirmation": "Biztosan törli ezt az elemet az adatbázisból?", - "DeleteFromDatabase": "Törlés az adatbázisból", - "Deleted": "Törölt", - "Search": "Keresés", - "StartDate": "Indulási dátum", - "EndDate": "Befejezés dátuma", - "CreationTime": "Létrehozás ideje", - "LastUpdateTime": "Utolsó módosítás ideje", - "LastSignificantUpdateTime": "Utolsó jelentős frissítés", - "Version": "Verzió", - "LanguageCode": "Nyelv kódja", - "FileName": "Filenév", - "LastCachedTime": "Cache idő" - } + "culture": "hu", + "texts": { + "Permission:DocumentManagement": "Dokumentum kezelés", + "Permission:Projects": "Projektek", + "Permission:Edit": "Szerkesztés", + "Permission:Delete": "Törlés", + "Permission:Create": "Létrehozás", + "Permission:Documents": "Dokumentumok", + "Menu:Documents": "Dokumentumok", + "Menu:DocumentManagement": "Dokumentumok", + "Menu:ProjectManagement": "Projektek", + "CreateANewProject": "Új projekt létrehozása", + "Edit": "Szerkesztés", + "Create": "Létrehozás", + "Pull": "Pull", + "Projects": "Projektek", + "Name": "Név", + "ShortName": "Rövid név", + "DocumentStoreType": "Dokumentumtároló típus", + "Format": "Formátum", + "ShortNameInfoText": "Használjon egyedi URL-t.", + "DisplayName:Name": "Név", + "DisplayName:ShortName": "Rövid név", + "DisplayName:Format": "Formátum", + "DisplayName:DefaultDocumentName": "Alapértlemezett dokumentum név", + "DisplayName:NavigationDocumentName": "Navigációs dokumentum neve", + "DisplayName:MinimumVersion": "Minimális verzió", + "DisplayName:MainWebsiteUrl": "A fő webhely URL-je", + "DisplayName:LatestVersionBranchName": "Az utolsó verzió branch neve", + "DisplayName:GitHubRootUrl": "GitHub root URL", + "DisplayName:GitHubAccessToken": "GitHub access token", + "DisplayName:GitHubUserAgent": "GitHub user agent", + "DisplayName:GithubVersionProviderSource": "GitHub version provider source", + "DisplayName:VersionBranchPrefix": "Version branch prefix", + "DisplayName:All": "Pull all", + "DisplayName:LanguageCode": "Nyelv kódja", + "DisplayName:Version": "Verzió", + "Documents": "Dokumentumok", + "RemoveFromCache": "Távolítsa el a gyorsítótárból", + "Reindex": "Újraindexálás", + "ReindexCompleted": "Újraindexálás teljes.", + "RemovedFromCache": "Távolítsa el a gyorsítótárból", + "RemoveFromCacheConfirmation": "Biztosan eltávolítja ezt az elemet a gyorsítótárból?", + "ReIndexDocumentConfirmation": "Biztosan újraindexeli ezt az elemet?", + "DeleteDocumentFromDbConfirmation": "Biztosan törli ezt az elemet az adatbázisból?", + "DeleteFromDatabase": "Törlés az adatbázisból", + "Deleted": "Törölt", + "Search": "Keresés", + "StartDate": "Indulási dátum", + "EndDate": "Befejezés dátuma", + "CreationTime": "Létrehozás ideje", + "LastUpdateTime": "Utolsó módosítás ideje", + "LastSignificantUpdateTime": "Utolsó jelentős frissítés", + "Version": "Verzió", + "LanguageCode": "Nyelv kódja", + "FileName": "File név", + "LastCachedTime": "Cache idő", + "Project": "Projekt" } - \ No newline at end of file +} diff --git a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/is.json b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/is.json index 101aab8182..c7d13791d0 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/is.json +++ b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/is.json @@ -54,6 +54,7 @@ "Version": "Útgáfa", "LanguageCode": "Túngumála kóði", "FileName": "Skráar nafn", - "LastCachedTime": "Tími geymt í skyndiminni" + "LastCachedTime": "Tími geymt í skyndiminni", + "Project": "Verkefni" } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/it.json b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/it.json index 1a4d8e3f4c..b6c95e5b58 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/it.json +++ b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/it.json @@ -54,6 +54,7 @@ "Version": "Versione", "LanguageCode": "Codice della lingua", "FileName": "Nome del file", - "LastCachedTime": "Tempo di cache" + "LastCachedTime": "Tempo di cache", + "Project": "Progetto" } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/nl.json b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/nl.json index 6451eed41e..e8cd5d730a 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/nl.json +++ b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/nl.json @@ -54,6 +54,7 @@ "Version": "Versie", "LanguageCode": "Taalcode", "FileName": "Bestandsnaam", - "LastCachedTime": "Cache tijd" + "LastCachedTime": "Cache tijd", + "Project": "Project" } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/pl-PL.json b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/pl-PL.json index 26e4b8bc7f..5f1025a9a6 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/pl-PL.json +++ b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/pl-PL.json @@ -54,6 +54,7 @@ "Version": "Wersja", "LanguageCode": "Kod języka", "FileName": "Nazwa pliku", - "LastCachedTime": "Czas w pamięci podręcznej" + "LastCachedTime": "Czas w pamięci podręcznej", + "Project": "Projekt" } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/pt-BR.json b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/pt-BR.json index 7daa4964b3..06ee0a6dfc 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/pt-BR.json +++ b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/pt-BR.json @@ -54,6 +54,7 @@ "Version": "Versão", "LanguageCode": "Código de idioma", "FileName": "Nome do arquivo", - "LastCachedTime": "Tempo de cache" + "LastCachedTime": "Tempo de cache", + "Project": "Projeto" } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/ro-RO.json b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/ro-RO.json index 02198cb96c..b236915665 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/ro-RO.json +++ b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/ro-RO.json @@ -54,6 +54,7 @@ "Version": "Versiune", "LanguageCode": "Codul limbii", "FileName": "Nume fişier", - "LastCachedTime": "Durată cache" + "LastCachedTime": "Durată cache", + "Project": "Proiect" } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/ru.json b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/ru.json index 1b7082d189..16102717c2 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/ru.json +++ b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/ru.json @@ -54,6 +54,7 @@ "Version": "Версия", "LanguageCode": "Код языка", "FileName": "Имя файла", - "LastCachedTime": "Время кеширования" + "LastCachedTime": "Время кеширования", + "Project": "Проект" } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/sk.json b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/sk.json index ab0bc3e008..8041e796f0 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/sk.json +++ b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/sk.json @@ -54,6 +54,7 @@ "Version": "Verzia", "LanguageCode": "Kód jazyka", "FileName": "Názov súboru", - "LastCachedTime": "Čas vyrovnávacej pamäte" + "LastCachedTime": "Čas vyrovnávacej pamäte", + "Project": "Projekt" } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/sl.json b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/sl.json index f2061a9fd5..a3445dc87b 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/sl.json +++ b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/sl.json @@ -54,6 +54,7 @@ "Version": "Različica", "LanguageCode": "Jezikovna koda", "FileName": "Ime datoteke", - "LastCachedTime": "Čas predpomnilnika" + "LastCachedTime": "Čas pred pomnilnika", + "Project": "Projekt" } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/tr.json b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/tr.json index 57c72b6db5..3f9d229f1e 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/tr.json +++ b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/tr.json @@ -51,9 +51,10 @@ "CreationTime": "oluşturma zamanı", "LastUpdateTime": "Son Güncelleme", "LastSignificantUpdateTime": "Son önemli güncelleme", - "Version": "sürüm", + "Version": "Sürüm", "LanguageCode": "Dil kodu", "FileName": "Dosya adı", - "LastCachedTime": "Önbellek süresi" + "LastCachedTime": "Önbellek süresi", + "Project": "Proje" } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/vi.json b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/vi.json index 350d995cfe..c44d2feb8f 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/vi.json +++ b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/vi.json @@ -54,6 +54,7 @@ "Version": "Phiên bản", "LanguageCode": "Mật ngữ", "FileName": "Tên tệp", - "LastCachedTime": "Thời gian lưu vào bộ nhớ đệm" + "LastCachedTime": "Thời gian lưu vào bộ nhớ đệm", + "Project": "Dự án" } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/zh-Hans.json b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/zh-Hans.json index c0985f956a..f81333d38e 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/zh-Hans.json +++ b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/zh-Hans.json @@ -54,6 +54,7 @@ "Version": "版本", "LanguageCode": "语言代码", "FileName": "文件名称", - "LastCachedTime": "缓存项" + "LastCachedTime": "缓存项", + "Project": "项目" } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/zh-Hant.json b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/zh-Hant.json index cc76f54510..54d86eca33 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/zh-Hant.json +++ b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/zh-Hant.json @@ -54,6 +54,7 @@ "Version": "版本", "LanguageCode": "語言代碼", "FileName": "文檔名稱", - "LastCachedTime": "緩存時間" + "LastCachedTime": "緩存時間", + "Project": "项目" } } \ No newline at end of file From 445cc1c62d849ec1ea39d19341da521cff6f8f3a Mon Sep 17 00:00:00 2001 From: malik masis Date: Thu, 4 Aug 2022 17:09:18 +0300 Subject: [PATCH 77/84] Added project filter --- .../Pages/Docs/Admin/Documents/Index.cshtml | 13 ++++++++++++- .../Pages/Docs/Admin/Documents/Index.cshtml.cs | 16 ++++++---------- .../Pages/Docs/Admin/Documents/index.js | 1 - 3 files changed, 18 insertions(+), 12 deletions(-) diff --git a/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Documents/Index.cshtml b/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Documents/Index.cshtml index a1301e4a47..0532ae0d70 100644 --- a/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Documents/Index.cshtml +++ b/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Documents/Index.cshtml @@ -33,6 +33,18 @@
+ +
+
+
@L["Project"].Value
+ + +
+
+
@L["Name"].Value
@@ -77,7 +89,6 @@
-
@L["CreationTime"].Value
diff --git a/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Documents/Index.cshtml.cs b/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Documents/Index.cshtml.cs index 559eaab5eb..5c45d1a9a7 100644 --- a/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Documents/Index.cshtml.cs +++ b/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Documents/Index.cshtml.cs @@ -1,18 +1,14 @@ -using System; -using System.ComponentModel.DataAnnotations; using System.Threading.Tasks; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; -using Volo.Docs.Documents; -namespace Volo.Docs.Admin.Pages.Docs.Admin.Documents +namespace Volo.Docs.Admin.Pages.Docs.Admin.Documents; + +[Authorize(DocsAdminPermissions.Projects.Default)] +public class IndexModel : DocsAdminPageModel { - [Authorize(DocsAdminPermissions.Projects.Default)] - public class IndexModel : DocsAdminPageModel + public virtual Task OnGet() { - public virtual Task OnGet() - { - return Task.FromResult(Page()); - } + return Task.FromResult(Page()); } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Documents/index.js b/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Documents/index.js index 928990e160..e19132cfc1 100644 --- a/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Documents/index.js +++ b/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Documents/index.js @@ -12,7 +12,6 @@ $(function () { name: $('#Name').val(), version: $('#Version').val(), languageCode: $('#LanguageCode').val(), - fileName: $('#FileName').val(), format: $('#Format').val(), creationTimeMin: getFormattedDate($('#CreationTimeMin')), creationTimeMax: getFormattedDate($('#CreationTimeMax')), From c2bcdf14b398e8a4054f351aa0a6eeb4fecac880 Mon Sep 17 00:00:00 2001 From: malik masis Date: Thu, 4 Aug 2022 18:01:55 +0300 Subject: [PATCH 78/84] Added Advanced filters --- .../Pages/Docs/Admin/Documents/Index.cshtml | 120 ++++++++++-------- .../Pages/Docs/Admin/Documents/index.js | 4 + 2 files changed, 68 insertions(+), 56 deletions(-) diff --git a/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Documents/Index.cshtml b/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Documents/Index.cshtml index 0532ae0d70..c826454c9a 100644 --- a/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Documents/Index.cshtml +++ b/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Documents/Index.cshtml @@ -33,26 +33,26 @@
- +
@L["Project"].Value
+ id="ProjectId" + name="ProjectId" + class="form-control me-sm-2">
- +
@L["Name"].Value
+ id="Name" + name="Name" + class="form-control me-sm-2">
@@ -61,112 +61,120 @@
@L["Version"].Value
+ id="Version" + name="Version" + class="form-control me-sm-2">
- +
@L["LanguageCode"].Value
+ id="LanguageCode" + name="LanguageCode" + class="form-control me-sm-2">
-
-
-
@L["Format"].Value
+ + + @L["SeeAdvancedFilters"] + + +
-
-
-
-
@L["CreationTime"].Value
+
+
+
@L["CreationTime"].Value
- - + - - - - + - + +
-
-
-
-
@L["LastUpdateTime"].Value
- - +
+
@L["LastUpdateTime"].Value
+ + - - - - + - + +
-
-
-
-
@L["LastSignificantUpdateTime"].Value
+
+
+
@L["LastSignificantUpdateTime"].Value
- - + - - - - + - + +
-
-
-
-
@L["LastCachedTime"].Value
+
+
+
@L["LastCachedTime"].Value
- - + - - - - + - + +
-
+
diff --git a/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Documents/index.js b/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Documents/index.js index e19132cfc1..5f4dc9b8d7 100644 --- a/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Documents/index.js +++ b/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Documents/index.js @@ -157,4 +157,8 @@ $(function () { e.preventDefault(); dataTable.ajax.reload(); }); + + $("#AdvancedFilterSectionToggler").click(function (e) { + $("#AdvancedFilterSection").toggle(); + }); }); From faee9249cc4f2a43879e9b570bee1637945fb7e4 Mon Sep 17 00:00:00 2001 From: malik masis Date: Thu, 4 Aug 2022 18:36:34 +0300 Subject: [PATCH 79/84] Made smaller some inputs --- .../Pages/Docs/Admin/Documents/Index.cshtml | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Documents/Index.cshtml b/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Documents/Index.cshtml index c826454c9a..3f2a52b97a 100644 --- a/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Documents/Index.cshtml +++ b/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Documents/Index.cshtml @@ -32,7 +32,7 @@ -
+
@@ -56,27 +56,27 @@
-
+
@L["Version"].Value
+ class="form-control">
-
+ -
+
@L["LanguageCode"].Value
+ class="form-control">
-
+ @@ -85,16 +85,16 @@
@@ -193,7 +199,7 @@ @L["FileName"] @L["Format"] @L["CreationTime"] - @L["LastUpdatedTime"] + @L["LastUpdateTime"] @L["LastSignificantUpdateTime"] @L["LastCachedTime"] From 4d1026a3fabe7b811ef1668785f84ec55be74671 Mon Sep 17 00:00:00 2001 From: malik masis Date: Fri, 5 Aug 2022 16:28:12 +0300 Subject: [PATCH 82/84] Made some changes for the better UI --- .../Pages/Docs/Admin/Documents/Index.cshtml | 92 +++++++++---------- 1 file changed, 41 insertions(+), 51 deletions(-) diff --git a/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Documents/Index.cshtml b/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Documents/Index.cshtml index 345217ee09..738327def9 100644 --- a/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Documents/Index.cshtml +++ b/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Documents/Index.cshtml @@ -34,27 +34,27 @@ -
+
@L["Project"].Value
+ class="form-control">
-
+ -
+
@L["Name"].Value
+ class="form-control">
-
+
@@ -85,67 +85,27 @@
From 1d6a114ae24f1a4baf3b5992eba44e53cfba7ec4 Mon Sep 17 00:00:00 2001 From: Berin Iwlew Date: Sat, 6 Aug 2022 17:08:59 -0400 Subject: [PATCH 83/84] To compound assignment --- .../AspNetCore/Hosting/AbpHostingEnvironmentExtensions.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/Hosting/AbpHostingEnvironmentExtensions.cs b/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/Hosting/AbpHostingEnvironmentExtensions.cs index a6569d001b..15c1d74ccb 100644 --- a/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/Hosting/AbpHostingEnvironmentExtensions.cs +++ b/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/Hosting/AbpHostingEnvironmentExtensions.cs @@ -9,7 +9,7 @@ public static class AbpHostingEnvironmentExtensions this IWebHostEnvironment env, AbpConfigurationBuilderOptions options = null) { - options = options ?? new AbpConfigurationBuilderOptions(); + options ??= new AbpConfigurationBuilderOptions(); if (options.BasePath.IsNullOrEmpty()) { From 997da7e89cbba4d1e8b34c69e48f3f8bca3791d1 Mon Sep 17 00:00:00 2001 From: maliming Date: Sun, 7 Aug 2022 10:01:27 +0800 Subject: [PATCH 84/84] Update ConfigurationHelper.cs --- .../Microsoft/Extensions/Configuration/ConfigurationHelper.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/src/Volo.Abp.Core/Microsoft/Extensions/Configuration/ConfigurationHelper.cs b/framework/src/Volo.Abp.Core/Microsoft/Extensions/Configuration/ConfigurationHelper.cs index a4dfa48db8..8a14528e03 100644 --- a/framework/src/Volo.Abp.Core/Microsoft/Extensions/Configuration/ConfigurationHelper.cs +++ b/framework/src/Volo.Abp.Core/Microsoft/Extensions/Configuration/ConfigurationHelper.cs @@ -9,7 +9,7 @@ public static class ConfigurationHelper AbpConfigurationBuilderOptions options = null, Action builderAction = null) { - options = options ?? new AbpConfigurationBuilderOptions(); + options ??= new AbpConfigurationBuilderOptions(); if (options.BasePath.IsNullOrEmpty()) {