From 8714c3488afe9a328a2664b7568754cbcb51af22 Mon Sep 17 00:00:00 2001 From: Alper Ebicoglu Date: Fri, 30 Nov 2018 13:57:16 +0300 Subject: [PATCH 01/60] added app_offline.htm to publish-ignore.json --- .../publish-ignore.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/publish-ignore.json b/framework/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/publish-ignore.json index 1797133380..e3b8137a6f 100644 --- a/framework/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/publish-ignore.json +++ b/framework/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/publish-ignore.json @@ -1,3 +1,3 @@ { - -} + "app_offline.htm": {} +} \ No newline at end of file From 70039b49202d146850f5cbcc843fbec1602d6266 Mon Sep 17 00:00:00 2001 From: Marcelo Mohr Maciel Date: Sat, 1 Dec 2018 19:42:51 -0200 Subject: [PATCH 02/60] Update pt-BR.json --- .../Localization/TestResources/Base/CountryNames/pt-BR.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/TestResources/Base/CountryNames/pt-BR.json b/framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/TestResources/Base/CountryNames/pt-BR.json index a55b5f0237..39122588cd 100644 --- a/framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/TestResources/Base/CountryNames/pt-BR.json +++ b/framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/TestResources/Base/CountryNames/pt-BR.json @@ -1,7 +1,7 @@ { - "culture": "pt", + "culture": "pt-BR", "texts": { "USA": "Estados Unidos da América", "Brazil": "Brasil" } -} \ No newline at end of file +} From 6dabb4bc8c30a841737339a35d30e096deca4861 Mon Sep 17 00:00:00 2001 From: Marcelo Mohr Maciel Date: Sat, 1 Dec 2018 19:43:05 -0200 Subject: [PATCH 03/60] Update pt-BR.json --- .../Abp/Localization/TestResources/Base/Validation/pt-BR.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/TestResources/Base/Validation/pt-BR.json b/framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/TestResources/Base/Validation/pt-BR.json index 16a0cdbc2d..d30db38152 100644 --- a/framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/TestResources/Base/Validation/pt-BR.json +++ b/framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/TestResources/Base/Validation/pt-BR.json @@ -1,7 +1,7 @@ { - "culture": "pt", + "culture": "pt-BR", "texts": { "ThisFieldIsRequired": "Este campo é obrigatório", "MaxLenghtErrorMessage": "Este campo pode ser no máximo de '{0}' caracteres" } -} \ No newline at end of file +} From bb4a84f36f6583b28df6ce161c2b6c1748bc1c25 Mon Sep 17 00:00:00 2001 From: Marcelo Mohr Maciel Date: Sat, 1 Dec 2018 19:43:38 -0200 Subject: [PATCH 04/60] Update pt-BR.json --- .../Volo/Abp/Localization/TestResources/Source/pt-BR.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/TestResources/Source/pt-BR.json b/framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/TestResources/Source/pt-BR.json index ff89fdb9ea..65b1f69a03 100644 --- a/framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/TestResources/Source/pt-BR.json +++ b/framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/TestResources/Source/pt-BR.json @@ -1,5 +1,5 @@ { - "culture": "pt", + "culture": "pt-BR", "texts": { "Hello {0}.": "Olá {0}.", "Car": "Carro", @@ -7,4 +7,4 @@ "MaxLenghtErrorMessage": "O comprimento deste campo pode ser no máximo de '{0}' caracteres", "Universe": "Universo" } -} \ No newline at end of file +} From df1be9948714b6cfce02935258f7f840d7b48520 Mon Sep 17 00:00:00 2001 From: Marcelo Mohr Maciel Date: Sat, 1 Dec 2018 19:43:52 -0200 Subject: [PATCH 05/60] Update pt-BR.json --- .../Volo/Abp/Localization/TestResources/SourceExt/pt-BR.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/TestResources/SourceExt/pt-BR.json b/framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/TestResources/SourceExt/pt-BR.json index ca17b637f0..495fb6e0ef 100644 --- a/framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/TestResources/SourceExt/pt-BR.json +++ b/framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/TestResources/SourceExt/pt-BR.json @@ -1,6 +1,6 @@ { - "culture": "pt", + "culture": "pt-BR", "texts": { "SeeYou": "Até logo" } -} \ No newline at end of file +} From 71cdde8a3c972f80c67b0692eecc4ef5913d8436 Mon Sep 17 00:00:00 2001 From: Halil ibrahim Kalkan Date: Mon, 3 Dec 2018 09:53:08 +0300 Subject: [PATCH 06/60] Introduced IHybridServiceScopeFactory --- .../AspNetCore/Mvc/AbpAspNetCoreMvcModule.cs | 1 + .../HttpContextServiceScopeFactory.cs | 53 +++++++++++++++++++ .../DefaultServiceScopeFactory.cs | 23 ++++++++ .../IHybridServiceScopeFactory.cs | 9 ++++ .../EventBus/TransientEventHandlerFactory.cs | 2 +- .../HybridServiceScopeFactory_Tests.cs | 41 ++++++++++++++ 6 files changed, 128 insertions(+), 1 deletion(-) create mode 100644 framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/DependencyInjection/HttpContextServiceScopeFactory.cs create mode 100644 framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/DefaultServiceScopeFactory.cs create mode 100644 framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/IHybridServiceScopeFactory.cs create mode 100644 framework/test/Volo.Abp.Core.Tests/Volo/Abp/DependencyInjection/HybridServiceScopeFactory_Tests.cs diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcModule.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcModule.cs index f9a07ac3a4..8d4536fec9 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcModule.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcModule.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Linq; using System.Reflection; +using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc.ApplicationParts; using Microsoft.AspNetCore.Mvc.Razor; using Microsoft.Extensions.DependencyInjection; 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 new file mode 100644 index 0000000000..64952c3f97 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/DependencyInjection/HttpContextServiceScopeFactory.cs @@ -0,0 +1,53 @@ +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() + { + + } + } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/DefaultServiceScopeFactory.cs b/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/DefaultServiceScopeFactory.cs new file mode 100644 index 0000000000..36af7a210a --- /dev/null +++ b/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/DefaultServiceScopeFactory.cs @@ -0,0 +1,23 @@ +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(); + } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/IHybridServiceScopeFactory.cs b/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/IHybridServiceScopeFactory.cs new file mode 100644 index 0000000000..207d7d33c2 --- /dev/null +++ b/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/IHybridServiceScopeFactory.cs @@ -0,0 +1,9 @@ +using Microsoft.Extensions.DependencyInjection; + +namespace Volo.Abp.DependencyInjection +{ + public interface IHybridServiceScopeFactory : IServiceScopeFactory + { + + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/TransientEventHandlerFactory.cs b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/TransientEventHandlerFactory.cs index fe5bf8892e..6cacc3522d 100644 --- a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/TransientEventHandlerFactory.cs +++ b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/TransientEventHandlerFactory.cs @@ -9,7 +9,7 @@ namespace Volo.Abp.EventBus /// /// This class always creates a new transient instance of handler. /// - internal class TransientEventHandlerFactory : IEventHandlerFactory + public class TransientEventHandlerFactory : IEventHandlerFactory where THandler : IEventHandler, new() { /// 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 new file mode 100644 index 0000000000..42bb7bb800 --- /dev/null +++ b/framework/test/Volo.Abp.Core.Tests/Volo/Abp/DependencyInjection/HybridServiceScopeFactory_Tests.cs @@ -0,0 +1,41 @@ +using System; +using Microsoft.Extensions.DependencyInjection; +using Shouldly; +using Volo.Abp.Modularity; +using Xunit; + +namespace Volo.Abp.DependencyInjection +{ + public class HybridServiceScopeFactory_Tests + { + [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 MyService : ITransientDependency, IDisposable + { + public static int DisposeCount { get; private set; } + + public void Dispose() + { + ++DisposeCount; + } + } + } +} From dfa3fba82f4dcf8a91a0c7295baf21b9920363eb Mon Sep 17 00:00:00 2001 From: Halil ibrahim Kalkan Date: Mon, 3 Dec 2018 10:01:21 +0300 Subject: [PATCH 07/60] Use IHybridServiceScopeFactory for IocEventHandlerFactory --- .../RabbitMq/RabbitMqDistributedEventBus.cs | 8 ++++---- .../EventBus/Distributed/LocalDistributedEventBus.cs | 10 +++++----- .../Volo/Abp/EventBus/IocEventHandlerFactory.cs | 8 +++----- .../Volo/Abp/EventBus/Local/LocalEventBus.cs | 8 ++++---- 4 files changed, 16 insertions(+), 18 deletions(-) diff --git a/framework/src/Volo.Abp.EventBus.Distributed.RabbitMQ/Volo/Abp/EventBus/Distributed/RabbitMq/RabbitMqDistributedEventBus.cs b/framework/src/Volo.Abp.EventBus.Distributed.RabbitMQ/Volo/Abp/EventBus/Distributed/RabbitMq/RabbitMqDistributedEventBus.cs index 3cd7cfbe03..4bf615a998 100644 --- a/framework/src/Volo.Abp.EventBus.Distributed.RabbitMQ/Volo/Abp/EventBus/Distributed/RabbitMq/RabbitMqDistributedEventBus.cs +++ b/framework/src/Volo.Abp.EventBus.Distributed.RabbitMQ/Volo/Abp/EventBus/Distributed/RabbitMq/RabbitMqDistributedEventBus.cs @@ -30,18 +30,18 @@ namespace Volo.Abp.EventBus.Distributed.RabbitMq protected ConcurrentDictionary> HandlerFactories { get; } //TODO: Accessing to the List may not be thread-safe! protected ConcurrentDictionary EventTypes { get; } protected IModel ConsumerChannel; - protected IServiceProvider ServiceProvider { get; } + protected IHybridServiceScopeFactory ServiceScopeFactory { get; } public RabbitMqDistributedEventBus( IOptions options, IConnectionPool connectionPool, IRabbitMqSerializer serializer, - IServiceProvider serviceProvider, + IHybridServiceScopeFactory serviceScopeFactory, IOptions distributedEventBusOptions) { ConnectionPool = connectionPool; Serializer = serializer; - ServiceProvider = serviceProvider; + ServiceScopeFactory = serviceScopeFactory; DistributedEventBusOptions = distributedEventBusOptions.Value; RabbitMqDistributedEventBusOptions = options.Value; @@ -67,7 +67,7 @@ namespace Volo.Abp.EventBus.Distributed.RabbitMq var genericArgs = @interface.GetGenericArguments(); if (genericArgs.Length == 1) { - Subscribe(genericArgs[0], new IocEventHandlerFactory(ServiceProvider, handler)); + Subscribe(genericArgs[0], new IocEventHandlerFactory(ServiceScopeFactory, handler)); } } } diff --git a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/LocalDistributedEventBus.cs b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/LocalDistributedEventBus.cs index 30278c6b21..0f609c6aaa 100644 --- a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/LocalDistributedEventBus.cs +++ b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/LocalDistributedEventBus.cs @@ -13,16 +13,16 @@ namespace Volo.Abp.EventBus.Distributed public class LocalDistributedEventBus : IDistributedEventBus, ITransientDependency { private readonly ILocalEventBus _localEventBus; - protected IServiceProvider ServiceProvider { get; } + protected IHybridServiceScopeFactory ServiceScopeFactory { get; } protected DistributedEventBusOptions DistributedEventBusOptions { get; } public LocalDistributedEventBus( - ILocalEventBus localEventBus, - IServiceProvider serviceProvider, + ILocalEventBus localEventBus, + IHybridServiceScopeFactory serviceScopeFactory, IOptions distributedEventBusOptions) { _localEventBus = localEventBus; - ServiceProvider = serviceProvider; + ServiceScopeFactory = serviceScopeFactory; DistributedEventBusOptions = distributedEventBusOptions.Value; Subscribe(distributedEventBusOptions.Value.Handlers); } @@ -42,7 +42,7 @@ namespace Volo.Abp.EventBus.Distributed var genericArgs = @interface.GetGenericArguments(); if (genericArgs.Length == 1) { - Subscribe(genericArgs[0], new IocEventHandlerFactory(ServiceProvider, handler)); + Subscribe(genericArgs[0], new IocEventHandlerFactory(ServiceScopeFactory, handler)); } } } diff --git a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/IocEventHandlerFactory.cs b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/IocEventHandlerFactory.cs index 9d388bae74..d944afae42 100644 --- a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/IocEventHandlerFactory.cs +++ b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/IocEventHandlerFactory.cs @@ -1,5 +1,6 @@ using System; using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.DependencyInjection; namespace Volo.Abp.EventBus { @@ -13,13 +14,10 @@ namespace Volo.Abp.EventBus protected IServiceScope ServiceScope { get; } - //TODO: Consider to inject IServiceScopeFactory instead - public IocEventHandlerFactory(IServiceProvider serviceProvider, Type handlerType) + public IocEventHandlerFactory(IHybridServiceScopeFactory scopeFactory, Type handlerType) { HandlerType = handlerType; - ServiceScope = serviceProvider - .GetRequiredService() - .CreateScope(); + ServiceScope = scopeFactory.CreateScope(); } /// diff --git a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Local/LocalEventBus.cs b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Local/LocalEventBus.cs index 07a9e609e5..31238961ae 100644 --- a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Local/LocalEventBus.cs +++ b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Local/LocalEventBus.cs @@ -28,13 +28,13 @@ namespace Volo.Abp.EventBus.Local protected ConcurrentDictionary> HandlerFactories { get; } - protected IServiceProvider ServiceProvider { get; } + protected IHybridServiceScopeFactory ServiceScopeFactory { get; } public LocalEventBus( IOptions options, - IServiceProvider serviceProvider) + IHybridServiceScopeFactory serviceScopeFactory) { - ServiceProvider = serviceProvider; + ServiceScopeFactory = serviceScopeFactory; Options = options.Value; Logger = NullLogger.Instance; @@ -57,7 +57,7 @@ namespace Volo.Abp.EventBus.Local var genericArgs = @interface.GetGenericArguments(); if (genericArgs.Length == 1) { - Subscribe(genericArgs[0], new IocEventHandlerFactory(ServiceProvider, handler)); + Subscribe(genericArgs[0], new IocEventHandlerFactory(ServiceScopeFactory, handler)); } } } From 589b0fa39faac33a282ee354d3f7f186755f4963 Mon Sep 17 00:00:00 2001 From: Yunus Emre Kalkan Date: Mon, 3 Dec 2018 10:11:11 +0300 Subject: [PATCH 08/60] Resolved #450 : Use Configure instead of context.Services.Configure in module classes --- docs/en/AspNetCore/Bundling-Minification.md | 4 ++-- docs/en/Localization.md | 4 ++-- docs/en/Module-Development-Basics.md | 2 +- docs/en/Multi-Tenancy.md | 8 ++++---- docs/en/Virtual-File-System.md | 4 ++-- docs/zh-Hans/AspNetCore/Bundling-Minification.md | 4 ++-- docs/zh-Hans/Localization.md | 4 ++-- docs/zh-Hans/Module-Development-Basics.md | 2 +- docs/zh-Hans/Multi-Tenancy.md | 8 ++++---- docs/zh-Hans/Virtual-File-System.md | 4 ++-- .../MultiTenancy/AbpAspNetCoreMultiTenancyModule.cs | 2 +- .../AbpAspNetCoreMvcUiBootstrapModule.cs | 2 +- .../AbpAspNetCoreMvcUIBasicThemeModule.cs | 8 ++++---- .../AbpAspNetCoreMvcUiThemeSharedModule.cs | 4 ++-- .../Volo/Abp/AspNetCore/AbpAspNetCoreModule.cs | 2 +- .../Volo/Abp/Authorization/AbpAuthorizationModule.cs | 2 +- .../Volo/Abp/Application/AbpDddApplicationModule.cs | 2 +- .../Volo/Abp/Emailing/AbpEmailingModule.cs | 6 +++--- .../AbpEntityFrameworkCoreModule.cs | 2 +- .../src/Volo.Abp.Http/Volo/Abp/Http/AbpHttpModule.cs | 2 +- .../Volo/Abp/Localization/AbpLocalizationModule.cs | 6 +++--- .../MultiTenancy/AbpMultiTenancyAbstractionsModule.cs | 2 +- framework/src/Volo.Abp.UI/Volo/Abp/Ui/AbpUiModule.cs | 4 ++-- .../Volo/Abp/AspNetCore/App/AppModule.cs | 2 +- .../Abp/AspNetCore/Mvc/AbpAspNetCoreMvcTestModule.cs | 8 ++++---- .../Versioning/AbpAspNetCoreMvcVersioningTestModule.cs | 4 ++-- .../Abp/Authorization/AbpAuthorizationTestModule.cs | 2 +- .../AutoMapper_ConfigurationValidation_Tests.cs | 2 +- .../Volo/Abp/AutoMapper/AutofacTestModule.cs | 2 +- .../Volo/Abp/Data/ConnectionStringResolver_Tests.cs | 2 +- .../Volo/Abp/Emailing/AbpEmailingTestModule.cs | 4 ++-- .../AbpEntityFrameworkCoreTestModule.cs | 2 +- .../Volo/Abp/Http/AbpHttpTestModule.cs | 2 +- .../Volo/Abp/Localization/AbpLocalization_Tests.cs | 4 ++-- .../Volo/Abp/Localization/TemplateLocalizer_Tests.cs | 4 ++-- .../Volo/Abp/MemoryDb/AbpMemoryDbTestModule.cs | 2 +- .../Volo/Abp/MongoDB/AbpMongoDbTestModule.cs | 2 +- .../Volo/Abp/Ui/Navigation/MenuManager_Tests.cs | 2 +- .../Abp/VirtualFileSystem/VirtualFileProvider_Tests.cs | 2 +- .../src/Volo.Abp.Account.Web/AbpAccountWebModule.cs | 10 +++++----- .../AuditLogging/AbpAuditLoggingDomainSharedModule.cs | 2 +- .../AbpAuditLoggingEntityFrameworkCoreTestModule.cs | 2 +- .../MongoDB/AbpAuditLoggingMongoDbTestModule.cs | 2 +- .../Volo.Abp.BackgroundJobs.DemoApp/DemoAppModule.cs | 6 +++--- .../Abp/BackgroundJobs/BackgroundJobsDomainModule.cs | 2 +- .../BackgroundJobsEntityFrameworkCoreTestModule.cs | 2 +- .../MongoDB/BackgroundJobsMongoDbTestModule.cs | 2 +- .../Abp/BackgroundJobs/BackgroundJobsTestBaseModule.cs | 2 +- .../app/Volo.BloggingTestApp/BloggingTestAppModule.cs | 10 +++++----- .../Blogging/BloggingApplicationContractsModule.cs | 4 ++-- .../Volo/Blogging/BloggingApplicationModule.cs | 4 ++-- .../Volo/Blogging/BloggingDomainSharedModule.cs | 2 +- .../BloggingEntityFrameworkCoreTestModule.cs | 2 +- modules/docs/app/Volo.DocsTestApp/DocsTestAppModule.cs | 10 +++++----- .../Volo/Docs/DocsApplicationModule.cs | 2 +- .../Volo/Docs/DocsDomainSharedModule.cs | 2 +- .../src/Volo.Docs.Domain/Volo/Docs/DocsDomainModule.cs | 4 ++-- .../Identity/AbpIdentityApplicationContractsModule.cs | 6 +++--- .../Volo/Abp/Identity/AbpIdentityApplicationModule.cs | 2 +- .../Volo/Abp/Identity/AbpIdentityDomainSharedModule.cs | 2 +- .../src/Volo.Abp.Identity.Web/AbpIdentityWebModule.cs | 10 +++++----- .../Volo/Abp/Identity/AbpIdentityDomainTestModule.cs | 2 +- .../AbpIdentityEntityFrameworkCoreTestModule.cs | 2 +- .../Identity/MongoDB/AbpIdentityMongoDbTestModule.cs | 2 +- .../AbpIdentityServerDomainSharedModule.cs | 2 +- .../IdentityServer/AbpIdentityServerDomainModule.cs | 2 +- .../AbpIdentityServerTestEntityFrameworkCoreModule.cs | 4 ++-- .../AbpIdentityServerMongoDbTestModule.cs | 2 +- .../AbpPermissionManagementWebModule.cs | 6 +++--- ...ermissionManagementEntityFrameworkCoreTestModule.cs | 4 ++-- .../AbpPermissionManagementMongoDbTestModule.cs | 2 +- .../AbpPermissionManagementTestBaseModule.cs | 2 +- .../AbpPermissionManagementTestModule.cs | 4 ++-- ...bpSettingManagementEntityFrameworkCoreTestModule.cs | 2 +- .../MongoDB/AbpSettingManagementMongoDbTestModule.cs | 2 +- .../AbpSettingManagementTestBaseModule.cs | 2 +- .../AbpTenantManagementApplicationContractsModule.cs | 6 +++--- .../AbpTenantManagementApplicationModule.cs | 2 +- .../AbpTenantManagementDomainSharedModule.cs | 2 +- .../AbpTenantManagementDomainModule.cs | 2 +- .../AbpTenantManagementWebModule.cs | 10 +++++----- ...AbpTenantManagementEntityFrameworkCoreTestModule.cs | 4 ++-- .../MongoDb/AbpTenantManagementMongoDbTestModule.cs | 2 +- .../Volo/Abp/Users/AbpUsersAbstractionModule.cs | 2 +- .../BookStoreApplicationModule.cs | 4 ++-- .../src/Acme.BookStore.Domain/BookStoreDomainModule.cs | 6 +++--- .../DemoAppModule.cs | 8 ++++---- .../MyProjectNameApplicationContractsModule.cs | 6 +++--- .../MyProjectName/MyProjectNameApplicationModule.cs | 4 ++-- .../MyProjectName/MyProjectNameDomainSharedModule.cs | 2 +- .../MyProjectName/MyProjectNameDomainModule.cs | 6 +++--- .../MyProjectNameWebModule.cs | 10 +++++----- .../MyProjectNameEntityFrameworkCoreTestModule.cs | 2 +- .../MongoDB/MyProjectNameMongoDbTestModule.cs | 2 +- .../MyProjectNameApplicationModule.cs | 4 ++-- .../MyProjectNameDomainModule.cs | 6 +++--- .../IdentityServerHost/IdentityServerHostModule.cs | 6 +++--- .../MyCompanyName.MyProjectName.Host/DemoAppModule.cs | 8 ++++---- .../MyProjectNameApplicationContractsModule.cs | 6 +++--- .../MyProjectName/MyProjectNameApplicationModule.cs | 4 ++-- .../MyProjectName/MyProjectNameDomainSharedModule.cs | 2 +- .../MyProjectName/MyProjectNameDomainModule.cs | 6 +++--- .../MyProjectNameEntityFrameworkCoreTestModule.cs | 2 +- .../MongoDB/MyProjectNameMongoDbTestModule.cs | 2 +- 104 files changed, 195 insertions(+), 195 deletions(-) diff --git a/docs/en/AspNetCore/Bundling-Minification.md b/docs/en/AspNetCore/Bundling-Minification.md index af92d91243..b8d70d8624 100644 --- a/docs/en/AspNetCore/Bundling-Minification.md +++ b/docs/en/AspNetCore/Bundling-Minification.md @@ -114,7 +114,7 @@ public class MyWebModule : AbpModule { public override void ConfigureServices(ServiceConfigurationContext context) { - context.Services.Configure(options => + Configure(options => { options .ScriptBundles @@ -152,7 +152,7 @@ public class MyWebExtensionModule : AbpModule { public override void ConfigureServices(ServiceConfigurationContext context) { - context.Services.Configure(options => + Configure(options => { options .ScriptBundles diff --git a/docs/en/Localization.md b/docs/en/Localization.md index ba7bf04238..b6d27cc9ce 100644 --- a/docs/en/Localization.md +++ b/docs/en/Localization.md @@ -46,12 +46,12 @@ public class MyModule : AbpModule { public override void ConfigureServices(ServiceConfigurationContext context) { - context.Services.Configure(options => + Configure(options => { options.FileSets.AddEmbedded(); }); - context.Services.Configure(options => + Configure(options => { options.Resources .Add("en") diff --git a/docs/en/Module-Development-Basics.md b/docs/en/Module-Development-Basics.md index bb193b613e..6e1c724669 100644 --- a/docs/en/Module-Development-Basics.md +++ b/docs/en/Module-Development-Basics.md @@ -42,7 +42,7 @@ public class BlogModule : AbpModule public override void ConfigureServices(ServiceConfigurationContext context) { //Configure default connection string for the application - context.Services.Configure(options => + Configure(options => { options.ConnectionStrings.Default = "......"; }); diff --git a/docs/en/Multi-Tenancy.md b/docs/en/Multi-Tenancy.md index 6697e10124..d8c52f38fe 100644 --- a/docs/en/Multi-Tenancy.md +++ b/docs/en/Multi-Tenancy.md @@ -138,7 +138,7 @@ namespace MyCompany.MyProject { public override void ConfigureServices(ServiceConfigurationContext context) { - context.Services.Configure(options => + Configure(options => { options.TenantResolvers.Add(new MyCustomTenantResolver()); }); @@ -194,7 +194,7 @@ namespace MyCompany.MyProject { public override void ConfigureServices(ServiceConfigurationContext context) { - context.Services.Configure(options => + Configure(options => { options.Tenants = new[] { @@ -240,7 +240,7 @@ namespace MyCompany.MyProject { var configuration = BuildConfiguration(); - context.Services.Configure(configuration); + Configure(configuration); } private static IConfigurationRoot BuildConfiguration() @@ -361,7 +361,7 @@ namespace MyCompany.MyProject { public override void ConfigureServices(ServiceConfigurationContext context) { - context.Services.Configure(options => + Configure(options => { //Subdomain format: {0}.mydomain.com (adding as the highest priority resolver) options.TenantResolvers.Insert(0, new DomainTenantResolver("{0}.mydomain.com")); diff --git a/docs/en/Virtual-File-System.md b/docs/en/Virtual-File-System.md index 9ee0e106d4..9a27f3c426 100644 --- a/docs/en/Virtual-File-System.md +++ b/docs/en/Virtual-File-System.md @@ -58,7 +58,7 @@ namespace MyCompany.MyProject { public override void ConfigureServices(ServiceConfigurationContext context) { - context.Services.Configure(options => + Configure(options => { //Register all embedded files of this assembly to the virtual file system options.FileSets.AddEmbedded(); @@ -122,7 +122,7 @@ public class MyWebAppModule : AbpModule if (hostingEnvironment.IsDevelopment()) //only for development time { - context.Services.Configure(options => + Configure(options => { //ReplaceEmbeddedByPyhsical gets the root folder of the MyModule project options.FileSets.ReplaceEmbeddedByPyhsical( diff --git a/docs/zh-Hans/AspNetCore/Bundling-Minification.md b/docs/zh-Hans/AspNetCore/Bundling-Minification.md index 4dc6d69c35..7454bd3c17 100644 --- a/docs/zh-Hans/AspNetCore/Bundling-Minification.md +++ b/docs/zh-Hans/AspNetCore/Bundling-Minification.md @@ -115,7 +115,7 @@ public class MyWebModule : AbpModule { public override void ConfigureServices(ServiceConfigurationContext context) { - context.Services.Configure(options => + Configure(options => { options .ScriptBundles @@ -153,7 +153,7 @@ public class MyWebExtensionModule : AbpModule { public override void ConfigureServices(ServiceConfigurationContext context) { - context.Services.Configure(options => + Configure(options => { options .ScriptBundles diff --git a/docs/zh-Hans/Localization.md b/docs/zh-Hans/Localization.md index b98163b66d..d47d353f2d 100644 --- a/docs/zh-Hans/Localization.md +++ b/docs/zh-Hans/Localization.md @@ -46,12 +46,12 @@ public class MyModule : AbpModule { public override void ConfigureServices(ServiceConfigurationContext context) { - context.Services.Configure(options => + Configure(options => { options.FileSets.AddEmbedded(); }); - context.Services.Configure(options => + Configure(options => { options.Resources .Add("en") diff --git a/docs/zh-Hans/Module-Development-Basics.md b/docs/zh-Hans/Module-Development-Basics.md index 5c9d8b11a3..044016e17a 100644 --- a/docs/zh-Hans/Module-Development-Basics.md +++ b/docs/zh-Hans/Module-Development-Basics.md @@ -42,7 +42,7 @@ public class BlogModule : AbpModule public override void ConfigureServices(ServiceConfigurationContext context) { //为应用程序配置默认的连接字符串 - context.Services.Configure(options => + Configure(options => { options.ConnectionStrings.Default = "......"; }); diff --git a/docs/zh-Hans/Multi-Tenancy.md b/docs/zh-Hans/Multi-Tenancy.md index a28b2e7fad..11b729e79f 100644 --- a/docs/zh-Hans/Multi-Tenancy.md +++ b/docs/zh-Hans/Multi-Tenancy.md @@ -139,7 +139,7 @@ namespace MyCompany.MyProject { public override void ConfigureServices(ServiceConfigurationContext context) { - context.Services.Configure(options => + Configure(options => { options.TenantResolvers.Add(new MyCustomTenantResolver()); }); @@ -194,7 +194,7 @@ namespace MyCompany.MyProject { public override void ConfigureServices(ServiceConfigurationContext context) { - context.Services.Configure(options => + Configure(options => { options.Tenants = new[] { @@ -240,7 +240,7 @@ namespace MyCompany.MyProject { var configuration = BuildConfiguration(); - context.Services.Configure(configuration); + Configure(configuration); } private static IConfigurationRoot BuildConfiguration() @@ -362,7 +362,7 @@ namespace MyCompany.MyProject { public override void ConfigureServices(ServiceConfigurationContext context) { - context.Services.Configure(options => + Configure(options => { //子域名格式: {0}.mydomain.com (作为最高优先级解析器添加) options.TenantResolvers.Insert(0, new DomainTenantResolver("{0}.mydomain.com")); diff --git a/docs/zh-Hans/Virtual-File-System.md b/docs/zh-Hans/Virtual-File-System.md index 9207940952..e25d7f61b4 100644 --- a/docs/zh-Hans/Virtual-File-System.md +++ b/docs/zh-Hans/Virtual-File-System.md @@ -59,7 +59,7 @@ namespace MyCompany.MyProject { public override void ConfigureServices(ServiceConfigurationContext context) { - context.Services.Configure(options => + Configure(options => { //Register all embedded files of this assembly to the virtual file system options.FileSets.AddEmbedded(); @@ -123,7 +123,7 @@ public class MyWebAppModule : AbpModule if (hostingEnvironment.IsDevelopment()) //only for development time { - context.Services.Configure(options => + Configure(options => { //ReplaceEmbeddedByPyhsical gets the root folder of the MyModule project options.FileSets.ReplaceEmbeddedByPyhsical( diff --git a/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/AbpAspNetCoreMultiTenancyModule.cs b/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/AbpAspNetCoreMultiTenancyModule.cs index bb9d7bac7c..7f00a58069 100644 --- a/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/AbpAspNetCoreMultiTenancyModule.cs +++ b/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/AbpAspNetCoreMultiTenancyModule.cs @@ -12,7 +12,7 @@ namespace Volo.Abp.AspNetCore.MultiTenancy { public override void ConfigureServices(ServiceConfigurationContext context) { - context.Services.Configure(options => + Configure(options => { options.TenantResolvers.Add(new QueryStringTenantResolveContributer()); options.TenantResolvers.Add(new RouteTenantResolveContributer()); diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/AbpAspNetCoreMvcUiBootstrapModule.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/AbpAspNetCoreMvcUiBootstrapModule.cs index bc0171a7d5..44a00808f8 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/AbpAspNetCoreMvcUiBootstrapModule.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/AbpAspNetCoreMvcUiBootstrapModule.cs @@ -9,7 +9,7 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap { public override void ConfigureServices(ServiceConfigurationContext context) { - context.Services.Configure(options => + Configure(options => { options.FileSets.AddEmbedded("Volo.Abp.AspNetCore.Mvc.UI.Bootstrap"); }); diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/AbpAspNetCoreMvcUIBasicThemeModule.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/AbpAspNetCoreMvcUIBasicThemeModule.cs index 3cbb2d1030..f68df35d1f 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/AbpAspNetCoreMvcUIBasicThemeModule.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/AbpAspNetCoreMvcUIBasicThemeModule.cs @@ -18,7 +18,7 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic { public override void ConfigureServices(ServiceConfigurationContext context) { - context.Services.Configure(options => + Configure(options => { options.Themes.Add(); @@ -28,17 +28,17 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic } }); - context.Services.Configure(options => + Configure(options => { options.FileSets.AddEmbedded("Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic"); }); - context.Services.Configure(options => + Configure(options => { options.Contributors.Add(new BasicThemeMainTopToolbarContributor()); }); - context.Services.Configure(options => + Configure(options => { options .StyleBundles diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/AbpAspNetCoreMvcUiThemeSharedModule.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/AbpAspNetCoreMvcUiThemeSharedModule.cs index 4cf742b699..57a03d0d75 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/AbpAspNetCoreMvcUiThemeSharedModule.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/AbpAspNetCoreMvcUiThemeSharedModule.cs @@ -16,12 +16,12 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared { public override void ConfigureServices(ServiceConfigurationContext context) { - context.Services.Configure(options => + Configure(options => { options.FileSets.AddEmbedded("Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared"); }); - context.Services.Configure(options => + Configure(options => { options .StyleBundles diff --git a/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/AbpAspNetCoreModule.cs b/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/AbpAspNetCoreModule.cs index 7bd3cf8267..7bf8d305b3 100644 --- a/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/AbpAspNetCoreModule.cs +++ b/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/AbpAspNetCoreModule.cs @@ -32,7 +32,7 @@ namespace Volo.Abp.AspNetCore { public override void ConfigureServices(ServiceConfigurationContext context) { - context.Services.Configure(options => + Configure(options => { options.Contributors.Add(new AspNetCoreAuditLogContributor()); }); diff --git a/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/AbpAuthorizationModule.cs b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/AbpAuthorizationModule.cs index 51150244e7..5649503563 100644 --- a/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/AbpAuthorizationModule.cs +++ b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/AbpAuthorizationModule.cs @@ -24,7 +24,7 @@ namespace Volo.Abp.Authorization context.Services.AddSingleton(); - context.Services.Configure(options => + Configure(options => { options.ValueProviders.Add(); options.ValueProviders.Add(); diff --git a/framework/src/Volo.Abp.Ddd.Application/Volo/Abp/Application/AbpDddApplicationModule.cs b/framework/src/Volo.Abp.Ddd.Application/Volo/Abp/Application/AbpDddApplicationModule.cs index bf26793a01..838050c067 100644 --- a/framework/src/Volo.Abp.Ddd.Application/Volo/Abp/Application/AbpDddApplicationModule.cs +++ b/framework/src/Volo.Abp.Ddd.Application/Volo/Abp/Application/AbpDddApplicationModule.cs @@ -23,7 +23,7 @@ namespace Volo.Abp.Application { public override void ConfigureServices(ServiceConfigurationContext context) { - context.Services.Configure(options => + Configure(options => { options.IgnoredInterfaces.AddIfNotContains(typeof(IRemoteService)); options.IgnoredInterfaces.AddIfNotContains(typeof(IApplicationService)); diff --git a/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/AbpEmailingModule.cs b/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/AbpEmailingModule.cs index 629052f631..4a23ecae9a 100644 --- a/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/AbpEmailingModule.cs +++ b/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/AbpEmailingModule.cs @@ -19,12 +19,12 @@ namespace Volo.Abp.Emailing { public override void ConfigureServices(ServiceConfigurationContext context) { - context.Services.Configure(options => + Configure(options => { options.DefinitionProviders.Add(); }); - context.Services.Configure(options => + Configure(options => { options.FileSets.AddEmbedded(); }); @@ -34,7 +34,7 @@ namespace Volo.Abp.Emailing options.AddJob(); }); - context.Services.Configure(options => + Configure(options => { options.Templates .Add( diff --git a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpEntityFrameworkCoreModule.cs b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpEntityFrameworkCoreModule.cs index 8616b2ca64..d6efe467bc 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpEntityFrameworkCoreModule.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpEntityFrameworkCoreModule.cs @@ -12,7 +12,7 @@ namespace Volo.Abp.EntityFrameworkCore { public override void ConfigureServices(ServiceConfigurationContext context) { - context.Services.Configure(options => + Configure(options => { options.PreConfigure(abpDbContextConfigurationContext => { diff --git a/framework/src/Volo.Abp.Http/Volo/Abp/Http/AbpHttpModule.cs b/framework/src/Volo.Abp.Http/Volo/Abp/Http/AbpHttpModule.cs index 689980f03f..3f53ccbb1c 100644 --- a/framework/src/Volo.Abp.Http/Volo/Abp/Http/AbpHttpModule.cs +++ b/framework/src/Volo.Abp.Http/Volo/Abp/Http/AbpHttpModule.cs @@ -12,7 +12,7 @@ namespace Volo.Abp.Http { public override void ConfigureServices(ServiceConfigurationContext context) { - context.Services.Configure(options => + Configure(options => { options.Generators[JQueryProxyScriptGenerator.Name] = typeof(JQueryProxyScriptGenerator); }); diff --git a/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/AbpLocalizationModule.cs b/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/AbpLocalizationModule.cs index ede10efaf1..c94d881030 100644 --- a/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/AbpLocalizationModule.cs +++ b/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/AbpLocalizationModule.cs @@ -16,19 +16,19 @@ namespace Volo.Abp.Localization { AbpStringLocalizerFactory.Replace(context.Services); - context.Services.Configure(options => + Configure(options => { options.FileSets.AddEmbedded("Volo.Abp", "Volo/Abp"); }); - context.Services.Configure(options => + Configure(options => { options.Resources .Add("en") .AddVirtualJson("/Localization/Resources/AbpValidation"); }); - context.Services.Configure(options => + Configure(options => { options.DefinitionProviders.Add(); }); diff --git a/framework/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/AbpMultiTenancyAbstractionsModule.cs b/framework/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/AbpMultiTenancyAbstractionsModule.cs index f68440da9f..05fc338c67 100644 --- a/framework/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/AbpMultiTenancyAbstractionsModule.cs +++ b/framework/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/AbpMultiTenancyAbstractionsModule.cs @@ -11,7 +11,7 @@ namespace Volo.Abp.MultiTenancy { public override void ConfigureServices(ServiceConfigurationContext context) { - context.Services.Configure(options => + Configure(options => { options.ValueProviders.Add(); }); diff --git a/framework/src/Volo.Abp.UI/Volo/Abp/Ui/AbpUiModule.cs b/framework/src/Volo.Abp.UI/Volo/Abp/Ui/AbpUiModule.cs index 9198e6be6c..fb173ee882 100644 --- a/framework/src/Volo.Abp.UI/Volo/Abp/Ui/AbpUiModule.cs +++ b/framework/src/Volo.Abp.UI/Volo/Abp/Ui/AbpUiModule.cs @@ -13,12 +13,12 @@ namespace Volo.Abp.UI { public override void ConfigureServices(ServiceConfigurationContext context) { - context.Services.Configure(options => + Configure(options => { options.FileSets.AddEmbedded(); }); - context.Services.Configure(options => + Configure(options => { options.Resources.Add("en").AddVirtualJson("/Localization/Resources/AbpUi"); }); diff --git a/framework/test/Volo.Abp.AspNetCore.MultiTenancy.Tests/Volo/Abp/AspNetCore/App/AppModule.cs b/framework/test/Volo.Abp.AspNetCore.MultiTenancy.Tests/Volo/Abp/AspNetCore/App/AppModule.cs index ccdb332aef..ffc03b5ff2 100644 --- a/framework/test/Volo.Abp.AspNetCore.MultiTenancy.Tests/Volo/Abp/AspNetCore/App/AppModule.cs +++ b/framework/test/Volo.Abp.AspNetCore.MultiTenancy.Tests/Volo/Abp/AspNetCore/App/AppModule.cs @@ -19,7 +19,7 @@ namespace Volo.Abp.AspNetCore.App { public override void ConfigureServices(ServiceConfigurationContext context) { - context.Services.Configure(options => + Configure(options => { options.AddDomainTenantResolver("{0}.abp.io"); }); diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcTestModule.cs b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcTestModule.cs index 65595b1b48..ad2b532816 100644 --- a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcTestModule.cs +++ b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcTestModule.cs @@ -45,7 +45,7 @@ namespace Volo.Abp.AspNetCore.Mvc }); }); - context.Services.Configure(options => + Configure(options => { options.ConventionalControllers.Create(typeof(TestAppModule).Assembly, opts => { @@ -56,17 +56,17 @@ namespace Volo.Abp.AspNetCore.Mvc }); }); - context.Services.Configure(options => + Configure(options => { options.DefinitionProviders.Add(); }); - context.Services.Configure(options => + Configure(options => { options.FileSets.AddEmbedded(); }); - context.Services.Configure(options => + Configure(options => { options.Resources .Add("en") diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.Versioning.Tests/Volo/Abp/AspNetCore/Mvc/Versioning/AbpAspNetCoreMvcVersioningTestModule.cs b/framework/test/Volo.Abp.AspNetCore.Mvc.Versioning.Tests/Volo/Abp/AspNetCore/Mvc/Versioning/AbpAspNetCoreMvcVersioningTestModule.cs index 1c0f3feea6..2a4a399d28 100644 --- a/framework/test/Volo.Abp.AspNetCore.Mvc.Versioning.Tests/Volo/Abp/AspNetCore/Mvc/Versioning/AbpAspNetCoreMvcVersioningTestModule.cs +++ b/framework/test/Volo.Abp.AspNetCore.Mvc.Versioning.Tests/Volo/Abp/AspNetCore/Mvc/Versioning/AbpAspNetCoreMvcVersioningTestModule.cs @@ -19,7 +19,7 @@ namespace Volo.Abp.AspNetCore.Mvc.Versioning { public override void ConfigureServices(ServiceConfigurationContext context) { - context.Services.Configure(options => + Configure(options => { //2.0 Version options.ConventionalControllers.Create(typeof(AbpAspNetCoreMvcVersioningTestModule).Assembly, opts => @@ -49,7 +49,7 @@ namespace Volo.Abp.AspNetCore.Mvc.Versioning context.Services.AddHttpClientProxies(typeof(AbpAspNetCoreMvcVersioningTestModule).Assembly); - context.Services.Configure(options => + Configure(options => { options.RemoteServices.Default = new RemoteServiceConfiguration("/"); }); diff --git a/framework/test/Volo.Abp.Authorization.Tests/Volo/Abp/Authorization/AbpAuthorizationTestModule.cs b/framework/test/Volo.Abp.Authorization.Tests/Volo/Abp/Authorization/AbpAuthorizationTestModule.cs index 5f563e8384..9b539e85be 100644 --- a/framework/test/Volo.Abp.Authorization.Tests/Volo/Abp/Authorization/AbpAuthorizationTestModule.cs +++ b/framework/test/Volo.Abp.Authorization.Tests/Volo/Abp/Authorization/AbpAuthorizationTestModule.cs @@ -23,7 +23,7 @@ namespace Volo.Abp.Authorization public override void ConfigureServices(ServiceConfigurationContext context) { - context.Services.Configure(options => + Configure(options => { options.DefinitionProviders.TryAdd(); }); diff --git a/framework/test/Volo.Abp.AutoMapper.Tests/Volo/Abp/AutoMapper/AutoMapper_ConfigurationValidation_Tests.cs b/framework/test/Volo.Abp.AutoMapper.Tests/Volo/Abp/AutoMapper/AutoMapper_ConfigurationValidation_Tests.cs index 76861a5389..b0ecff941a 100644 --- a/framework/test/Volo.Abp.AutoMapper.Tests/Volo/Abp/AutoMapper/AutoMapper_ConfigurationValidation_Tests.cs +++ b/framework/test/Volo.Abp.AutoMapper.Tests/Volo/Abp/AutoMapper/AutoMapper_ConfigurationValidation_Tests.cs @@ -28,7 +28,7 @@ namespace Volo.Abp.AutoMapper { public override void ConfigureServices(ServiceConfigurationContext context) { - context.Services.Configure(options => + Configure(options => { options.UseStaticMapper = false; diff --git a/framework/test/Volo.Abp.AutoMapper.Tests/Volo/Abp/AutoMapper/AutofacTestModule.cs b/framework/test/Volo.Abp.AutoMapper.Tests/Volo/Abp/AutoMapper/AutofacTestModule.cs index 19bb8aa5c8..86eade5db8 100644 --- a/framework/test/Volo.Abp.AutoMapper.Tests/Volo/Abp/AutoMapper/AutofacTestModule.cs +++ b/framework/test/Volo.Abp.AutoMapper.Tests/Volo/Abp/AutoMapper/AutofacTestModule.cs @@ -8,7 +8,7 @@ namespace Volo.Abp.AutoMapper { public override void ConfigureServices(ServiceConfigurationContext context) { - context.Services.Configure(options => + Configure(options => { options.UseStaticMapper = false; }); diff --git a/framework/test/Volo.Abp.Data.Tests/Volo/Abp/Data/ConnectionStringResolver_Tests.cs b/framework/test/Volo.Abp.Data.Tests/Volo/Abp/Data/ConnectionStringResolver_Tests.cs index 023e8d2e97..82a00d8edc 100644 --- a/framework/test/Volo.Abp.Data.Tests/Volo/Abp/Data/ConnectionStringResolver_Tests.cs +++ b/framework/test/Volo.Abp.Data.Tests/Volo/Abp/Data/ConnectionStringResolver_Tests.cs @@ -42,7 +42,7 @@ namespace Volo.Abp.Data { public override void ConfigureServices(ServiceConfigurationContext context) { - context.Services.Configure(options => + Configure(options => { options.ConnectionStrings.Default = DefaultConnString; options.ConnectionStrings[Database1Name] = Database1ConnString; diff --git a/framework/test/Volo.Abp.Emailing.Tests/Volo/Abp/Emailing/AbpEmailingTestModule.cs b/framework/test/Volo.Abp.Emailing.Tests/Volo/Abp/Emailing/AbpEmailingTestModule.cs index d45fab7d32..a36c664e8a 100644 --- a/framework/test/Volo.Abp.Emailing.Tests/Volo/Abp/Emailing/AbpEmailingTestModule.cs +++ b/framework/test/Volo.Abp.Emailing.Tests/Volo/Abp/Emailing/AbpEmailingTestModule.cs @@ -13,12 +13,12 @@ namespace Volo.Abp.Emailing { public override void ConfigureServices(ServiceConfigurationContext context) { - context.Services.Configure(options => + Configure(options => { options.FileSets.AddEmbedded(); }); - context.Services.Configure(options => + Configure(options => { options.Templates["template1"] = new EmailTemplateDefinition("template1") diff --git a/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/AbpEntityFrameworkCoreTestModule.cs b/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/AbpEntityFrameworkCoreTestModule.cs index f955a7fa14..b1b92ab5b2 100644 --- a/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/AbpEntityFrameworkCoreTestModule.cs +++ b/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/AbpEntityFrameworkCoreTestModule.cs @@ -34,7 +34,7 @@ namespace Volo.Abp.EntityFrameworkCore var sqliteConnection = CreateDatabaseAndGetConnection(); - context.Services.Configure(options => + Configure(options => { options.Configure(abpDbContextConfigurationContext => { diff --git a/framework/test/Volo.Abp.Http.Client.Tests/Volo/Abp/Http/AbpHttpTestModule.cs b/framework/test/Volo.Abp.Http.Client.Tests/Volo/Abp/Http/AbpHttpTestModule.cs index b6237a12ad..4ee13e7dc7 100644 --- a/framework/test/Volo.Abp.Http.Client.Tests/Volo/Abp/Http/AbpHttpTestModule.cs +++ b/framework/test/Volo.Abp.Http.Client.Tests/Volo/Abp/Http/AbpHttpTestModule.cs @@ -15,7 +15,7 @@ namespace Volo.Abp.Http context.Services.AddHttpClientProxies(typeof(TestAppModule).Assembly); context.Services.AddHttpClientProxy(); - context.Services.Configure(options => + Configure(options => { options.RemoteServices.Default = new RemoteServiceConfiguration("/"); }); diff --git a/framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/AbpLocalization_Tests.cs b/framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/AbpLocalization_Tests.cs index 70f3531754..ea6ce3e242 100644 --- a/framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/AbpLocalization_Tests.cs +++ b/framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/AbpLocalization_Tests.cs @@ -110,12 +110,12 @@ namespace Volo.Abp.Localization { public override void ConfigureServices(ServiceConfigurationContext context) { - context.Services.Configure(options => + Configure(options => { options.FileSets.AddEmbedded(); }); - context.Services.Configure(options => + Configure(options => { options.Resources.Add("en").AddVirtualJson("/Volo/Abp/Localization/TestResources/Base/Validation"); options.Resources.Add("en").AddVirtualJson("/Volo/Abp/Localization/TestResources/Base/CountryNames"); diff --git a/framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/TemplateLocalizer_Tests.cs b/framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/TemplateLocalizer_Tests.cs index 2f8fd66726..9b2366119b 100644 --- a/framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/TemplateLocalizer_Tests.cs +++ b/framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/TemplateLocalizer_Tests.cs @@ -45,12 +45,12 @@ namespace Volo.Abp.Localization { public override void ConfigureServices(ServiceConfigurationContext context) { - context.Services.Configure(options => + Configure(options => { options.FileSets.AddEmbedded(); }); - context.Services.Configure(options => + Configure(options => { options.Resources .Add("en") diff --git a/framework/test/Volo.Abp.MemoryDb.Tests/Volo/Abp/MemoryDb/AbpMemoryDbTestModule.cs b/framework/test/Volo.Abp.MemoryDb.Tests/Volo/Abp/MemoryDb/AbpMemoryDbTestModule.cs index e9527a3763..c7f5d38bbe 100644 --- a/framework/test/Volo.Abp.MemoryDb.Tests/Volo/Abp/MemoryDb/AbpMemoryDbTestModule.cs +++ b/framework/test/Volo.Abp.MemoryDb.Tests/Volo/Abp/MemoryDb/AbpMemoryDbTestModule.cs @@ -19,7 +19,7 @@ namespace Volo.Abp.MemoryDb { var connStr = Guid.NewGuid().ToString(); - context.Services.Configure(options => + Configure(options => { options.ConnectionStrings.Default = connStr; }); diff --git a/framework/test/Volo.Abp.MongoDB.Tests/Volo/Abp/MongoDB/AbpMongoDbTestModule.cs b/framework/test/Volo.Abp.MongoDB.Tests/Volo/Abp/MongoDB/AbpMongoDbTestModule.cs index e1cbefa59f..7e50a930df 100644 --- a/framework/test/Volo.Abp.MongoDB.Tests/Volo/Abp/MongoDB/AbpMongoDbTestModule.cs +++ b/framework/test/Volo.Abp.MongoDB.Tests/Volo/Abp/MongoDB/AbpMongoDbTestModule.cs @@ -20,7 +20,7 @@ namespace Volo.Abp.MongoDB { _mongoDbRunner = MongoDbRunner.Start(); - context.Services.Configure(options => + Configure(options => { options.ConnectionStrings.Default = _mongoDbRunner.ConnectionString; }); diff --git a/framework/test/Volo.Abp.UI.Navigation.Tests/Volo/Abp/Ui/Navigation/MenuManager_Tests.cs b/framework/test/Volo.Abp.UI.Navigation.Tests/Volo/Abp/Ui/Navigation/MenuManager_Tests.cs index 7b49fc9971..8b06afd001 100644 --- a/framework/test/Volo.Abp.UI.Navigation.Tests/Volo/Abp/Ui/Navigation/MenuManager_Tests.cs +++ b/framework/test/Volo.Abp.UI.Navigation.Tests/Volo/Abp/Ui/Navigation/MenuManager_Tests.cs @@ -36,7 +36,7 @@ namespace Volo.Abp.UI.Navigation { public override void ConfigureServices(ServiceConfigurationContext context) { - context.Services.Configure(options => + Configure(options => { options.MenuContributors.Add(new TestMenuContributer1()); options.MenuContributors.Add(new TestMenuContributer2()); diff --git a/framework/test/Volo.Abp.VirtualFileSystem.Tests/Volo/Abp/VirtualFileSystem/VirtualFileProvider_Tests.cs b/framework/test/Volo.Abp.VirtualFileSystem.Tests/Volo/Abp/VirtualFileSystem/VirtualFileProvider_Tests.cs index de05114301..2c853e3a19 100644 --- a/framework/test/Volo.Abp.VirtualFileSystem.Tests/Volo/Abp/VirtualFileSystem/VirtualFileProvider_Tests.cs +++ b/framework/test/Volo.Abp.VirtualFileSystem.Tests/Volo/Abp/VirtualFileSystem/VirtualFileProvider_Tests.cs @@ -37,7 +37,7 @@ namespace Volo.Abp.VirtualFileSystem { public override void ConfigureServices(ServiceConfigurationContext context) { - context.Services.Configure(options => + Configure(options => { options.FileSets.AddEmbedded("Volo.Abp.VirtualFileSystem.MyResources"); }); diff --git a/modules/account/src/Volo.Abp.Account.Web/AbpAccountWebModule.cs b/modules/account/src/Volo.Abp.Account.Web/AbpAccountWebModule.cs index c54cbf8e00..a6c597aa3e 100644 --- a/modules/account/src/Volo.Abp.Account.Web/AbpAccountWebModule.cs +++ b/modules/account/src/Volo.Abp.Account.Web/AbpAccountWebModule.cs @@ -29,22 +29,22 @@ namespace Volo.Abp.Account.Web public override void ConfigureServices(ServiceConfigurationContext context) { - context.Services.Configure(options => + Configure(options => { options.DefinitionProviders.Add(); }); - context.Services.Configure(options => + Configure(options => { options.FileSets.AddEmbedded("Volo.Abp.Account.Web"); }); - context.Services.Configure(options => + Configure(options => { options.MenuContributors.Add(new AbpAccountUserMenuContributor()); }); - context.Services.Configure(options => + Configure(options => { options.Resources .Add("en") @@ -52,7 +52,7 @@ namespace Volo.Abp.Account.Web .AddBaseTypes(typeof(AbpUiResource), typeof(AbpValidationResource)); }); - context.Services.Configure(options => + Configure(options => { options.Contributors.Add(new AccountModuleToolbarContributor()); }); diff --git a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/AbpAuditLoggingDomainSharedModule.cs b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/AbpAuditLoggingDomainSharedModule.cs index 4d6c2d93a9..efa043efd1 100644 --- a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/AbpAuditLoggingDomainSharedModule.cs +++ b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/AbpAuditLoggingDomainSharedModule.cs @@ -9,7 +9,7 @@ namespace Volo.Abp.AuditLogging { public override void ConfigureServices(ServiceConfigurationContext context) { - context.Services.Configure(options => + Configure(options => { options.Resources.Add("en"); }); diff --git a/modules/audit-logging/test/Volo.Abp.AuditLogging.EntityFrameworkCore.Tests/Volo/Abp/AuditLogging/EntityFrameworkCore/AbpAuditLoggingEntityFrameworkCoreTestModule.cs b/modules/audit-logging/test/Volo.Abp.AuditLogging.EntityFrameworkCore.Tests/Volo/Abp/AuditLogging/EntityFrameworkCore/AbpAuditLoggingEntityFrameworkCoreTestModule.cs index c050853021..442aa50c8e 100644 --- a/modules/audit-logging/test/Volo.Abp.AuditLogging.EntityFrameworkCore.Tests/Volo/Abp/AuditLogging/EntityFrameworkCore/AbpAuditLoggingEntityFrameworkCoreTestModule.cs +++ b/modules/audit-logging/test/Volo.Abp.AuditLogging.EntityFrameworkCore.Tests/Volo/Abp/AuditLogging/EntityFrameworkCore/AbpAuditLoggingEntityFrameworkCoreTestModule.cs @@ -18,7 +18,7 @@ namespace Volo.Abp.AuditLogging.EntityFrameworkCore { var sqliteConnection = CreateDatabaseAndGetConnection(); - context.Services.Configure(options => + Configure(options => { options.Configure(abpDbContextConfigurationContext => { diff --git a/modules/audit-logging/test/Volo.Abp.AuditLogging.MongoDB.Tests/Volo/Abp/AuditLogging/MongoDB/AbpAuditLoggingMongoDbTestModule.cs b/modules/audit-logging/test/Volo.Abp.AuditLogging.MongoDB.Tests/Volo/Abp/AuditLogging/MongoDB/AbpAuditLoggingMongoDbTestModule.cs index 546f9b274e..dcfc69866e 100644 --- a/modules/audit-logging/test/Volo.Abp.AuditLogging.MongoDB.Tests/Volo/Abp/AuditLogging/MongoDB/AbpAuditLoggingMongoDbTestModule.cs +++ b/modules/audit-logging/test/Volo.Abp.AuditLogging.MongoDB.Tests/Volo/Abp/AuditLogging/MongoDB/AbpAuditLoggingMongoDbTestModule.cs @@ -17,7 +17,7 @@ namespace Volo.Abp.AuditLogging.MongoDB { _mongoDbRunner = MongoDbRunner.Start(); - context.Services.Configure(options => + Configure(options => { options.ConnectionStrings.Default = _mongoDbRunner.ConnectionString; }); diff --git a/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp/DemoAppModule.cs b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp/DemoAppModule.cs index acdba328a3..4f01d40c70 100644 --- a/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp/DemoAppModule.cs +++ b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp/DemoAppModule.cs @@ -25,12 +25,12 @@ namespace Volo.Abp.BackgroundJobs.DemoApp context.Services.SetConfiguration(configuration); - context.Services.Configure(options => + Configure(options => { options.ConnectionStrings.Default = configuration.GetConnectionString("Default"); }); - context.Services.Configure(options => + Configure(options => { options.Configure(opts => { @@ -38,7 +38,7 @@ namespace Volo.Abp.BackgroundJobs.DemoApp }); }); - context.Services.Configure(options => + Configure(options => { //Configure for fast running options.JobPollPeriod = 1000; diff --git a/modules/background-jobs/src/Volo.Abp.BackgroundJobs.Domain/Volo/Abp/BackgroundJobs/BackgroundJobsDomainModule.cs b/modules/background-jobs/src/Volo.Abp.BackgroundJobs.Domain/Volo/Abp/BackgroundJobs/BackgroundJobsDomainModule.cs index 61ec4ceb88..2ef1477d87 100644 --- a/modules/background-jobs/src/Volo.Abp.BackgroundJobs.Domain/Volo/Abp/BackgroundJobs/BackgroundJobsDomainModule.cs +++ b/modules/background-jobs/src/Volo.Abp.BackgroundJobs.Domain/Volo/Abp/BackgroundJobs/BackgroundJobsDomainModule.cs @@ -13,7 +13,7 @@ namespace Volo.Abp.BackgroundJobs { public override void ConfigureServices(ServiceConfigurationContext context) { - context.Services.Configure(options => + Configure(options => { options.AddProfile(validate: true); }); diff --git a/modules/background-jobs/test/Volo.Abp.BackgroundJobs.EntityFrameworkCore.Tests/Volo/Abp/BackgroundJobs/EntityFrameworkCore/BackgroundJobsEntityFrameworkCoreTestModule.cs b/modules/background-jobs/test/Volo.Abp.BackgroundJobs.EntityFrameworkCore.Tests/Volo/Abp/BackgroundJobs/EntityFrameworkCore/BackgroundJobsEntityFrameworkCoreTestModule.cs index 876dc20810..70318c1e7a 100644 --- a/modules/background-jobs/test/Volo.Abp.BackgroundJobs.EntityFrameworkCore.Tests/Volo/Abp/BackgroundJobs/EntityFrameworkCore/BackgroundJobsEntityFrameworkCoreTestModule.cs +++ b/modules/background-jobs/test/Volo.Abp.BackgroundJobs.EntityFrameworkCore.Tests/Volo/Abp/BackgroundJobs/EntityFrameworkCore/BackgroundJobsEntityFrameworkCoreTestModule.cs @@ -18,7 +18,7 @@ namespace Volo.Abp.BackgroundJobs.EntityFrameworkCore { var sqliteConnection = CreateDatabaseAndGetConnection(); - context.Services.Configure(options => + Configure(options => { options.Configure(abpDbContextConfigurationContext => { diff --git a/modules/background-jobs/test/Volo.Abp.BackgroundJobs.MongoDB.Tests/Volo/Abp/BackgroundJobs/MongoDB/BackgroundJobsMongoDbTestModule.cs b/modules/background-jobs/test/Volo.Abp.BackgroundJobs.MongoDB.Tests/Volo/Abp/BackgroundJobs/MongoDB/BackgroundJobsMongoDbTestModule.cs index a1ec5d8be7..bcbc591a0f 100644 --- a/modules/background-jobs/test/Volo.Abp.BackgroundJobs.MongoDB.Tests/Volo/Abp/BackgroundJobs/MongoDB/BackgroundJobsMongoDbTestModule.cs +++ b/modules/background-jobs/test/Volo.Abp.BackgroundJobs.MongoDB.Tests/Volo/Abp/BackgroundJobs/MongoDB/BackgroundJobsMongoDbTestModule.cs @@ -17,7 +17,7 @@ namespace Volo.Abp.BackgroundJobs.MongoDB { _mongoDbRunner = MongoDbRunner.Start(); - context.Services.Configure(options => + Configure(options => { options.ConnectionStrings.Default = _mongoDbRunner.ConnectionString; }); diff --git a/modules/background-jobs/test/Volo.Abp.BackgroundJobs.TestBase/Volo/Abp/BackgroundJobs/BackgroundJobsTestBaseModule.cs b/modules/background-jobs/test/Volo.Abp.BackgroundJobs.TestBase/Volo/Abp/BackgroundJobs/BackgroundJobsTestBaseModule.cs index 30ba72c427..d38b3ceac5 100644 --- a/modules/background-jobs/test/Volo.Abp.BackgroundJobs.TestBase/Volo/Abp/BackgroundJobs/BackgroundJobsTestBaseModule.cs +++ b/modules/background-jobs/test/Volo.Abp.BackgroundJobs.TestBase/Volo/Abp/BackgroundJobs/BackgroundJobsTestBaseModule.cs @@ -13,7 +13,7 @@ namespace Volo.Abp.BackgroundJobs { public override void ConfigureServices(ServiceConfigurationContext context) { - context.Services.Configure(options => + Configure(options => { options.IsJobExecutionEnabled = false; }); diff --git a/modules/blogging/app/Volo.BloggingTestApp/BloggingTestAppModule.cs b/modules/blogging/app/Volo.BloggingTestApp/BloggingTestAppModule.cs index 9b0f17cf11..b6c69741b7 100644 --- a/modules/blogging/app/Volo.BloggingTestApp/BloggingTestAppModule.cs +++ b/modules/blogging/app/Volo.BloggingTestApp/BloggingTestAppModule.cs @@ -55,7 +55,7 @@ namespace Volo.BloggingTestApp var hostingEnvironment = context.Services.GetHostingEnvironment(); var configuration = context.Services.BuildConfiguration(); - context.Services.Configure(options => + Configure(options => { #if MONGODB const string connStringName = "MongoDb"; @@ -66,14 +66,14 @@ namespace Volo.BloggingTestApp }); #if !MONGODB - context.Services.Configure(options => + Configure(options => { options.UseSqlServer(); }); #endif if (hostingEnvironment.IsDevelopment()) { - context.Services.Configure(options => + Configure(options => { options.FileSets.ReplaceEmbeddedByPyhsical(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}..{0}..{0}framework{0}src{0}Volo.Abp.UI", Path.DirectorySeparatorChar))); options.FileSets.ReplaceEmbeddedByPyhsical(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}..{0}..{0}framework{0}src{0}Volo.Abp.AspNetCore.Mvc.UI", Path.DirectorySeparatorChar))); @@ -93,14 +93,14 @@ namespace Volo.BloggingTestApp }); var cultures = new List { new CultureInfo("en"), new CultureInfo("tr") }; - context.Services.Configure(options => + Configure(options => { options.DefaultRequestCulture = new RequestCulture("en"); options.SupportedCultures = cultures; options.SupportedUICultures = cultures; }); - context.Services.Configure(options => + Configure(options => { options.DefaultThemeName = BasicTheme.Name; }); diff --git a/modules/blogging/src/Volo.Blogging.Application.Contracts/Volo/Blogging/BloggingApplicationContractsModule.cs b/modules/blogging/src/Volo.Blogging.Application.Contracts/Volo/Blogging/BloggingApplicationContractsModule.cs index 83f66a2278..29deef3457 100644 --- a/modules/blogging/src/Volo.Blogging.Application.Contracts/Volo/Blogging/BloggingApplicationContractsModule.cs +++ b/modules/blogging/src/Volo.Blogging.Application.Contracts/Volo/Blogging/BloggingApplicationContractsModule.cs @@ -12,12 +12,12 @@ namespace Volo.Blogging { public override void ConfigureServices(ServiceConfigurationContext context) { - context.Services.Configure(options => + Configure(options => { options.DefinitionProviders.Add(); }); - context.Services.Configure(options => + Configure(options => { options.FileSets.AddEmbedded(); }); diff --git a/modules/blogging/src/Volo.Blogging.Application/Volo/Blogging/BloggingApplicationModule.cs b/modules/blogging/src/Volo.Blogging.Application/Volo/Blogging/BloggingApplicationModule.cs index fd956ebc67..460f573d1d 100644 --- a/modules/blogging/src/Volo.Blogging.Application/Volo/Blogging/BloggingApplicationModule.cs +++ b/modules/blogging/src/Volo.Blogging.Application/Volo/Blogging/BloggingApplicationModule.cs @@ -17,14 +17,14 @@ namespace Volo.Blogging { public override void ConfigureServices(ServiceConfigurationContext context) { - context.Services.Configure(options => + Configure(options => { options.AddProfile(validate: true); }); - context.Services.Configure(options => + Configure(options => { //TODO: Rename UpdatePolicy/DeletePolicy since it's candidate to conflicts with other modules! options.AddPolicy("BloggingUpdatePolicy", policy => policy.Requirements.Add(CommonOperations.Update)); diff --git a/modules/blogging/src/Volo.Blogging.Domain.Shared/Volo/Blogging/BloggingDomainSharedModule.cs b/modules/blogging/src/Volo.Blogging.Domain.Shared/Volo/Blogging/BloggingDomainSharedModule.cs index 5061ce3b59..7fd98515a2 100644 --- a/modules/blogging/src/Volo.Blogging.Domain.Shared/Volo/Blogging/BloggingDomainSharedModule.cs +++ b/modules/blogging/src/Volo.Blogging.Domain.Shared/Volo/Blogging/BloggingDomainSharedModule.cs @@ -10,7 +10,7 @@ namespace Volo.Blogging { public override void ConfigureServices(ServiceConfigurationContext context) { - context.Services.Configure(options => + Configure(options => { options.Resources.Add("en"); }); diff --git a/modules/blogging/test/Volo.Blogging.EntityFrameworkCore.Tests/Volo/Blogging/EntityFrameworkCore/BloggingEntityFrameworkCoreTestModule.cs b/modules/blogging/test/Volo.Blogging.EntityFrameworkCore.Tests/Volo/Blogging/EntityFrameworkCore/BloggingEntityFrameworkCoreTestModule.cs index ef8986bfc6..67c5f7ce8b 100644 --- a/modules/blogging/test/Volo.Blogging.EntityFrameworkCore.Tests/Volo/Blogging/EntityFrameworkCore/BloggingEntityFrameworkCoreTestModule.cs +++ b/modules/blogging/test/Volo.Blogging.EntityFrameworkCore.Tests/Volo/Blogging/EntityFrameworkCore/BloggingEntityFrameworkCoreTestModule.cs @@ -21,7 +21,7 @@ namespace Volo.Blogging.EntityFrameworkCore { _sqliteConnection = CreateDatabaseAndGetConnection(); - context.Services.Configure(options => + Configure(options => { options.Configure(abpDbContextConfigurationContext => { diff --git a/modules/docs/app/Volo.DocsTestApp/DocsTestAppModule.cs b/modules/docs/app/Volo.DocsTestApp/DocsTestAppModule.cs index 407e8543b5..4458a443ec 100644 --- a/modules/docs/app/Volo.DocsTestApp/DocsTestAppModule.cs +++ b/modules/docs/app/Volo.DocsTestApp/DocsTestAppModule.cs @@ -40,20 +40,20 @@ namespace Volo.DocsTestApp var hostingEnvironment = context.Services.GetHostingEnvironment(); var configuration = context.Services.GetConfiguration(); - context.Services.Configure(options => + Configure(options => { const string connStringName = "SqlServer"; options.ConnectionStrings.Default = configuration.GetConnectionString(connStringName); }); - context.Services.Configure(options => + Configure(options => { options.UseSqlServer(); }); if (hostingEnvironment.IsDevelopment()) { - context.Services.Configure(options => + Configure(options => { options.FileSets.ReplaceEmbeddedByPyhsical(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}..{0}..{0}framework{0}src{0}Volo.Abp.UI", Path.DirectorySeparatorChar))); options.FileSets.ReplaceEmbeddedByPyhsical(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}..{0}..{0}framework{0}src{0}Volo.Abp.AspNetCore.Mvc.UI", Path.DirectorySeparatorChar))); @@ -74,14 +74,14 @@ namespace Volo.DocsTestApp var cultures = new List { new CultureInfo("en"), new CultureInfo("tr") }; - context.Services.Configure(options => + Configure(options => { options.DefaultRequestCulture = new RequestCulture("en"); options.SupportedCultures = cultures; options.SupportedUICultures = cultures; }); - context.Services.Configure(options => + Configure(options => { options.DefaultThemeName = BasicTheme.Name; }); diff --git a/modules/docs/src/Volo.Docs.Application/Volo/Docs/DocsApplicationModule.cs b/modules/docs/src/Volo.Docs.Application/Volo/Docs/DocsApplicationModule.cs index 09e4de45bf..c3fc2a3efc 100644 --- a/modules/docs/src/Volo.Docs.Application/Volo/Docs/DocsApplicationModule.cs +++ b/modules/docs/src/Volo.Docs.Application/Volo/Docs/DocsApplicationModule.cs @@ -14,7 +14,7 @@ namespace Volo.Docs { public override void ConfigureServices(ServiceConfigurationContext context) { - context.Services.Configure(options => + Configure(options => { options.AddProfile(validate: true); }); diff --git a/modules/docs/src/Volo.Docs.Domain.Shared/Volo/Docs/DocsDomainSharedModule.cs b/modules/docs/src/Volo.Docs.Domain.Shared/Volo/Docs/DocsDomainSharedModule.cs index 82496e10e4..f60ea4a7b8 100644 --- a/modules/docs/src/Volo.Docs.Domain.Shared/Volo/Docs/DocsDomainSharedModule.cs +++ b/modules/docs/src/Volo.Docs.Domain.Shared/Volo/Docs/DocsDomainSharedModule.cs @@ -10,7 +10,7 @@ namespace Volo.Docs { public override void ConfigureServices(ServiceConfigurationContext context) { - context.Services.Configure(options => + Configure(options => { options.Resources.Add("en"); }); diff --git a/modules/docs/src/Volo.Docs.Domain/Volo/Docs/DocsDomainModule.cs b/modules/docs/src/Volo.Docs.Domain/Volo/Docs/DocsDomainModule.cs index f9c170cd54..6837bbae16 100644 --- a/modules/docs/src/Volo.Docs.Domain/Volo/Docs/DocsDomainModule.cs +++ b/modules/docs/src/Volo.Docs.Domain/Volo/Docs/DocsDomainModule.cs @@ -15,12 +15,12 @@ namespace Volo.Docs { public override void ConfigureServices(ServiceConfigurationContext context) { - context.Services.Configure(options => + Configure(options => { options.FileSets.AddEmbedded(); }); - context.Services.Configure(options => + Configure(options => { options.Resources.Get().AddVirtualJson("/Volo/Docs/Localization/Domain"); }); diff --git a/modules/identity/src/Volo.Abp.Identity.Application.Contracts/Volo/Abp/Identity/AbpIdentityApplicationContractsModule.cs b/modules/identity/src/Volo.Abp.Identity.Application.Contracts/Volo/Abp/Identity/AbpIdentityApplicationContractsModule.cs index 5530de9521..88fdbcfec3 100644 --- a/modules/identity/src/Volo.Abp.Identity.Application.Contracts/Volo/Abp/Identity/AbpIdentityApplicationContractsModule.cs +++ b/modules/identity/src/Volo.Abp.Identity.Application.Contracts/Volo/Abp/Identity/AbpIdentityApplicationContractsModule.cs @@ -18,17 +18,17 @@ namespace Volo.Abp.Identity { public override void ConfigureServices(ServiceConfigurationContext context) { - context.Services.Configure(options => + Configure(options => { options.DefinitionProviders.Add(); }); - context.Services.Configure(options => + Configure(options => { options.FileSets.AddEmbedded(); }); - context.Services.Configure(options => + Configure(options => { options.Resources .Get() diff --git a/modules/identity/src/Volo.Abp.Identity.Application/Volo/Abp/Identity/AbpIdentityApplicationModule.cs b/modules/identity/src/Volo.Abp.Identity.Application/Volo/Abp/Identity/AbpIdentityApplicationModule.cs index 964c402fb8..4abdda3796 100644 --- a/modules/identity/src/Volo.Abp.Identity.Application/Volo/Abp/Identity/AbpIdentityApplicationModule.cs +++ b/modules/identity/src/Volo.Abp.Identity.Application/Volo/Abp/Identity/AbpIdentityApplicationModule.cs @@ -15,7 +15,7 @@ namespace Volo.Abp.Identity { public override void ConfigureServices(ServiceConfigurationContext context) { - context.Services.Configure(options => + Configure(options => { options.AddProfile(); }); diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/AbpIdentityDomainSharedModule.cs b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/AbpIdentityDomainSharedModule.cs index 584d9881cc..bc45febd8d 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/AbpIdentityDomainSharedModule.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/AbpIdentityDomainSharedModule.cs @@ -12,7 +12,7 @@ namespace Volo.Abp.Identity { public override void ConfigureServices(ServiceConfigurationContext context) { - context.Services.Configure(options => + Configure(options => { options.Resources.Add("en"); }); diff --git a/modules/identity/src/Volo.Abp.Identity.Web/AbpIdentityWebModule.cs b/modules/identity/src/Volo.Abp.Identity.Web/AbpIdentityWebModule.cs index 934d0460b2..be24e1b3bb 100644 --- a/modules/identity/src/Volo.Abp.Identity.Web/AbpIdentityWebModule.cs +++ b/modules/identity/src/Volo.Abp.Identity.Web/AbpIdentityWebModule.cs @@ -35,17 +35,17 @@ namespace Volo.Abp.Identity.Web public override void ConfigureServices(ServiceConfigurationContext context) { - context.Services.Configure(options => + Configure(options => { options.MenuContributors.Add(new AbpIdentityWebMainMenuContributor()); }); - context.Services.Configure(options => + Configure(options => { options.FileSets.AddEmbedded("Volo.Abp.Identity.Web"); }); - context.Services.Configure(options => + Configure(options => { options.Resources .Get() @@ -55,12 +55,12 @@ namespace Volo.Abp.Identity.Web ).AddVirtualJson("/Localization/Resources/AbpIdentity"); }); - context.Services.Configure(options => + Configure(options => { options.AddProfile(validate: true); }); - context.Services.Configure(options => + Configure(options => { options.Conventions.AuthorizePage("/Identity/Users/Index", IdentityPermissions.Users.Default); options.Conventions.AuthorizePage("/Identity/Users/CreateModal", IdentityPermissions.Users.Create); diff --git a/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/AbpIdentityDomainTestModule.cs b/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/AbpIdentityDomainTestModule.cs index d6ad85fdef..fc8cb447be 100644 --- a/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/AbpIdentityDomainTestModule.cs +++ b/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/AbpIdentityDomainTestModule.cs @@ -10,7 +10,7 @@ namespace Volo.Abp.Identity { public override void ConfigureServices(ServiceConfigurationContext context) { - context.Services.Configure(options => + Configure(options => { options.DefinitionProviders.Add(); }); diff --git a/modules/identity/test/Volo.Abp.Identity.EntityFrameworkCore.Tests/Volo/Abp/Identity/EntityFrameworkCore/AbpIdentityEntityFrameworkCoreTestModule.cs b/modules/identity/test/Volo.Abp.Identity.EntityFrameworkCore.Tests/Volo/Abp/Identity/EntityFrameworkCore/AbpIdentityEntityFrameworkCoreTestModule.cs index ee30b29844..9eb9fbd6d5 100644 --- a/modules/identity/test/Volo.Abp.Identity.EntityFrameworkCore.Tests/Volo/Abp/Identity/EntityFrameworkCore/AbpIdentityEntityFrameworkCoreTestModule.cs +++ b/modules/identity/test/Volo.Abp.Identity.EntityFrameworkCore.Tests/Volo/Abp/Identity/EntityFrameworkCore/AbpIdentityEntityFrameworkCoreTestModule.cs @@ -20,7 +20,7 @@ namespace Volo.Abp.Identity.EntityFrameworkCore { var sqliteConnection = CreateDatabaseAndGetConnection(); - context.Services.Configure(options => + Configure(options => { options.Configure(abpDbContextConfigurationContext => { diff --git a/modules/identity/test/Volo.Abp.Identity.MongoDB.Tests/Volo/Abp/Identity/MongoDB/AbpIdentityMongoDbTestModule.cs b/modules/identity/test/Volo.Abp.Identity.MongoDB.Tests/Volo/Abp/Identity/MongoDB/AbpIdentityMongoDbTestModule.cs index 3e08bab640..7228b07aa0 100644 --- a/modules/identity/test/Volo.Abp.Identity.MongoDB.Tests/Volo/Abp/Identity/MongoDB/AbpIdentityMongoDbTestModule.cs +++ b/modules/identity/test/Volo.Abp.Identity.MongoDB.Tests/Volo/Abp/Identity/MongoDB/AbpIdentityMongoDbTestModule.cs @@ -19,7 +19,7 @@ namespace Volo.Abp.Identity.MongoDB { _mongoDbRunner = MongoDbRunner.Start(); - context.Services.Configure(options => + Configure(options => { options.ConnectionStrings.Default = _mongoDbRunner.ConnectionString; }); diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/AbpIdentityServerDomainSharedModule.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/AbpIdentityServerDomainSharedModule.cs index 6d74c7420a..77ad2c698a 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/AbpIdentityServerDomainSharedModule.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/AbpIdentityServerDomainSharedModule.cs @@ -10,7 +10,7 @@ namespace Volo.Abp.IdentityServer public override void ConfigureServices(ServiceConfigurationContext context) { - context.Services.Configure(options => + Configure(options => { options.Resources.Add("en"); }); diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AbpIdentityServerDomainModule.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AbpIdentityServerDomainModule.cs index fccf60ddf0..e47f16a8b3 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AbpIdentityServerDomainModule.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AbpIdentityServerDomainModule.cs @@ -17,7 +17,7 @@ namespace Volo.Abp.IdentityServer { public override void ConfigureServices(ServiceConfigurationContext context) { - context.Services.Configure(options => + Configure(options => { options.AddProfile(validate: true); }); diff --git a/modules/identityserver/test/Volo.Abp.IdentityServer.EntityFrameworkCore.Tests/Volo/Abp/IdentityServer/AbpIdentityServerTestEntityFrameworkCoreModule.cs b/modules/identityserver/test/Volo.Abp.IdentityServer.EntityFrameworkCore.Tests/Volo/Abp/IdentityServer/AbpIdentityServerTestEntityFrameworkCoreModule.cs index 8f0122673d..95d3c78a2e 100644 --- a/modules/identityserver/test/Volo.Abp.IdentityServer.EntityFrameworkCore.Tests/Volo/Abp/IdentityServer/AbpIdentityServerTestEntityFrameworkCoreModule.cs +++ b/modules/identityserver/test/Volo.Abp.IdentityServer.EntityFrameworkCore.Tests/Volo/Abp/IdentityServer/AbpIdentityServerTestEntityFrameworkCoreModule.cs @@ -21,7 +21,7 @@ namespace Volo.Abp.IdentityServer var databaseName = Guid.NewGuid().ToString(); - context.Services.Configure(options => + Configure(options => { options.Configure(abpDbContextConfigurationContext => { @@ -29,7 +29,7 @@ namespace Volo.Abp.IdentityServer }); }); - context.Services.Configure(options => + Configure(options => { options.TransactionBehavior = UnitOfWorkTransactionBehavior.Disabled; //EF in-memory database does not support transactions }); diff --git a/modules/identityserver/test/Volo.Abp.IdentityServer.MongoDB.Tests/Volo/Abp/IdentityServer/AbpIdentityServerMongoDbTestModule.cs b/modules/identityserver/test/Volo.Abp.IdentityServer.MongoDB.Tests/Volo/Abp/IdentityServer/AbpIdentityServerMongoDbTestModule.cs index f1e81bf21f..cbaf71585e 100644 --- a/modules/identityserver/test/Volo.Abp.IdentityServer.MongoDB.Tests/Volo/Abp/IdentityServer/AbpIdentityServerMongoDbTestModule.cs +++ b/modules/identityserver/test/Volo.Abp.IdentityServer.MongoDB.Tests/Volo/Abp/IdentityServer/AbpIdentityServerMongoDbTestModule.cs @@ -19,7 +19,7 @@ namespace Volo.Abp.IdentityServer { _mongoDbRunner = MongoDbRunner.Start(); - context.Services.Configure(options => + Configure(options => { options.ConnectionStrings.Default = _mongoDbRunner.ConnectionString; }); diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Web/AbpPermissionManagementWebModule.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.Web/AbpPermissionManagementWebModule.cs index cc94bc7f56..c417da1775 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Web/AbpPermissionManagementWebModule.cs +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Web/AbpPermissionManagementWebModule.cs @@ -24,19 +24,19 @@ namespace Volo.Abp.PermissionManagement.Web public override void ConfigureServices(ServiceConfigurationContext context) { - context.Services.Configure(options => + Configure(options => { options.FileSets.AddEmbedded("Volo.Abp.PermissionManagement.Web"); }); - context.Services.Configure(options => + Configure(options => { options.Resources .Add("en") .AddVirtualJson("/Localization/Resources/AbpPermissionManagement"); }); - context.Services.Configure(options => + Configure(options => { options.AddProfile(validate: true); }); diff --git a/modules/permission-management/test/Volo.Abp.PermissionManagement.EntityFrameworkCore.Tests/Volo/Abp/PermissionManagement/EntityFrameworkCore/AbpPermissionManagementEntityFrameworkCoreTestModule.cs b/modules/permission-management/test/Volo.Abp.PermissionManagement.EntityFrameworkCore.Tests/Volo/Abp/PermissionManagement/EntityFrameworkCore/AbpPermissionManagementEntityFrameworkCoreTestModule.cs index f20a916853..9f122fc17c 100644 --- a/modules/permission-management/test/Volo.Abp.PermissionManagement.EntityFrameworkCore.Tests/Volo/Abp/PermissionManagement/EntityFrameworkCore/AbpPermissionManagementEntityFrameworkCoreTestModule.cs +++ b/modules/permission-management/test/Volo.Abp.PermissionManagement.EntityFrameworkCore.Tests/Volo/Abp/PermissionManagement/EntityFrameworkCore/AbpPermissionManagementEntityFrameworkCoreTestModule.cs @@ -18,7 +18,7 @@ namespace Volo.Abp.PermissionManagement.EntityFrameworkCore var databaseName = Guid.NewGuid().ToString(); - context.Services.Configure(options => + Configure(options => { options.Configure(abpDbContextConfigurationContext => { @@ -26,7 +26,7 @@ namespace Volo.Abp.PermissionManagement.EntityFrameworkCore }); }); - context.Services.Configure(options => + Configure(options => { options.TransactionBehavior = UnitOfWorkTransactionBehavior.Disabled; //EF in-memory database does not support transactions }); diff --git a/modules/permission-management/test/Volo.Abp.PermissionManagement.MongoDB.Tests/Volo/Abp/PermissionManagement/MongoDb/AbpPermissionManagementMongoDbTestModule.cs b/modules/permission-management/test/Volo.Abp.PermissionManagement.MongoDB.Tests/Volo/Abp/PermissionManagement/MongoDb/AbpPermissionManagementMongoDbTestModule.cs index a440ad5ac0..9811911eed 100644 --- a/modules/permission-management/test/Volo.Abp.PermissionManagement.MongoDB.Tests/Volo/Abp/PermissionManagement/MongoDb/AbpPermissionManagementMongoDbTestModule.cs +++ b/modules/permission-management/test/Volo.Abp.PermissionManagement.MongoDB.Tests/Volo/Abp/PermissionManagement/MongoDb/AbpPermissionManagementMongoDbTestModule.cs @@ -17,7 +17,7 @@ namespace Volo.Abp.PermissionManagement.MongoDb { _mongoDbRunner = MongoDbRunner.Start(); - context.Services.Configure(options => + Configure(options => { options.ConnectionStrings.Default = _mongoDbRunner.ConnectionString; }); diff --git a/modules/permission-management/test/Volo.Abp.PermissionManagement.TestBase/Volo/Abp/PermissionManagement/AbpPermissionManagementTestBaseModule.cs b/modules/permission-management/test/Volo.Abp.PermissionManagement.TestBase/Volo/Abp/PermissionManagement/AbpPermissionManagementTestBaseModule.cs index ef433cb287..b5a616d1c4 100644 --- a/modules/permission-management/test/Volo.Abp.PermissionManagement.TestBase/Volo/Abp/PermissionManagement/AbpPermissionManagementTestBaseModule.cs +++ b/modules/permission-management/test/Volo.Abp.PermissionManagement.TestBase/Volo/Abp/PermissionManagement/AbpPermissionManagementTestBaseModule.cs @@ -14,7 +14,7 @@ namespace Volo.Abp.PermissionManagement { public override void ConfigureServices(ServiceConfigurationContext context) { - context.Services.Configure(options => + Configure(options => { options.DefinitionProviders.Add(); }); diff --git a/modules/permission-management/test/Volo.Abp.PermissionManagement.Tests/Volo/Abp/PermissionManagement/AbpPermissionManagementTestModule.cs b/modules/permission-management/test/Volo.Abp.PermissionManagement.Tests/Volo/Abp/PermissionManagement/AbpPermissionManagementTestModule.cs index 5e48a98862..42894b5eb9 100644 --- a/modules/permission-management/test/Volo.Abp.PermissionManagement.Tests/Volo/Abp/PermissionManagement/AbpPermissionManagementTestModule.cs +++ b/modules/permission-management/test/Volo.Abp.PermissionManagement.Tests/Volo/Abp/PermissionManagement/AbpPermissionManagementTestModule.cs @@ -19,7 +19,7 @@ namespace Volo.Abp.PermissionManagement var databaseName = Guid.NewGuid().ToString(); - context.Services.Configure(options => + Configure(options => { options.Configure(abpDbContextConfigurationContext => { @@ -27,7 +27,7 @@ namespace Volo.Abp.PermissionManagement }); }); - context.Services.Configure(options => + Configure(options => { options.TransactionBehavior = UnitOfWorkTransactionBehavior.Disabled; //EF in-memory database does not support transactions }); diff --git a/modules/setting-management/test/Volo.Abp.SettingManagement.EntityFrameworkCore.Tests/Volo/Abp/SettingManagement/EntityFrameworkCore/AbpSettingManagementEntityFrameworkCoreTestModule.cs b/modules/setting-management/test/Volo.Abp.SettingManagement.EntityFrameworkCore.Tests/Volo/Abp/SettingManagement/EntityFrameworkCore/AbpSettingManagementEntityFrameworkCoreTestModule.cs index 07b264dfd7..c392f1da64 100644 --- a/modules/setting-management/test/Volo.Abp.SettingManagement.EntityFrameworkCore.Tests/Volo/Abp/SettingManagement/EntityFrameworkCore/AbpSettingManagementEntityFrameworkCoreTestModule.cs +++ b/modules/setting-management/test/Volo.Abp.SettingManagement.EntityFrameworkCore.Tests/Volo/Abp/SettingManagement/EntityFrameworkCore/AbpSettingManagementEntityFrameworkCoreTestModule.cs @@ -18,7 +18,7 @@ namespace Volo.Abp.SettingManagement.EntityFrameworkCore { var sqliteConnection = CreateDatabaseAndGetConnection(); - context.Services.Configure(options => + Configure(options => { options.Configure(abpDbContextConfigurationContext => { diff --git a/modules/setting-management/test/Volo.Abp.SettingManagement.MongoDB.Tests/Volo/Abp/SettingManagement/MongoDB/AbpSettingManagementMongoDbTestModule.cs b/modules/setting-management/test/Volo.Abp.SettingManagement.MongoDB.Tests/Volo/Abp/SettingManagement/MongoDB/AbpSettingManagementMongoDbTestModule.cs index 2b9b22523c..4bdf5fadd0 100644 --- a/modules/setting-management/test/Volo.Abp.SettingManagement.MongoDB.Tests/Volo/Abp/SettingManagement/MongoDB/AbpSettingManagementMongoDbTestModule.cs +++ b/modules/setting-management/test/Volo.Abp.SettingManagement.MongoDB.Tests/Volo/Abp/SettingManagement/MongoDB/AbpSettingManagementMongoDbTestModule.cs @@ -17,7 +17,7 @@ namespace Volo.Abp.SettingManagement.MongoDB { _mongoDbRunner = MongoDbRunner.Start(); - context.Services.Configure(options => + Configure(options => { options.ConnectionStrings.Default = _mongoDbRunner.ConnectionString; }); diff --git a/modules/setting-management/test/Volo.Abp.SettingManagement.TestBase/Volo/Abp/SettingManagement/AbpSettingManagementTestBaseModule.cs b/modules/setting-management/test/Volo.Abp.SettingManagement.TestBase/Volo/Abp/SettingManagement/AbpSettingManagementTestBaseModule.cs index 93b9efa58d..ca7be601f1 100644 --- a/modules/setting-management/test/Volo.Abp.SettingManagement.TestBase/Volo/Abp/SettingManagement/AbpSettingManagementTestBaseModule.cs +++ b/modules/setting-management/test/Volo.Abp.SettingManagement.TestBase/Volo/Abp/SettingManagement/AbpSettingManagementTestBaseModule.cs @@ -13,7 +13,7 @@ namespace Volo.Abp.SettingManagement { public override void ConfigureServices(ServiceConfigurationContext context) { - context.Services.Configure(options => + Configure(options => { options.DefinitionProviders.Add(); }); diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Application.Contracts/Volo/Abp/TenantManagement/AbpTenantManagementApplicationContractsModule.cs b/modules/tenant-management/src/Volo.Abp.TenantManagement.Application.Contracts/Volo/Abp/TenantManagement/AbpTenantManagementApplicationContractsModule.cs index 6329c58ae5..24af59cda2 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Application.Contracts/Volo/Abp/TenantManagement/AbpTenantManagementApplicationContractsModule.cs +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Application.Contracts/Volo/Abp/TenantManagement/AbpTenantManagementApplicationContractsModule.cs @@ -14,17 +14,17 @@ namespace Volo.Abp.TenantManagement { public override void ConfigureServices(ServiceConfigurationContext context) { - context.Services.Configure(options => + Configure(options => { options.DefinitionProviders.Add(); }); - context.Services.Configure(options => + Configure(options => { options.FileSets.AddEmbedded(); }); - context.Services.Configure(options => + Configure(options => { options.Resources .Get() diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Application/Volo/Abp/TenantManagement/AbpTenantManagementApplicationModule.cs b/modules/tenant-management/src/Volo.Abp.TenantManagement.Application/Volo/Abp/TenantManagement/AbpTenantManagementApplicationModule.cs index 00a0e594ab..ab00b0dc80 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Application/Volo/Abp/TenantManagement/AbpTenantManagementApplicationModule.cs +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Application/Volo/Abp/TenantManagement/AbpTenantManagementApplicationModule.cs @@ -10,7 +10,7 @@ namespace Volo.Abp.TenantManagement { public override void ConfigureServices(ServiceConfigurationContext context) { - context.Services.Configure(options => + Configure(options => { options.AddProfile(validate: true); }); diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/AbpTenantManagementDomainSharedModule.cs b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/AbpTenantManagementDomainSharedModule.cs index c7ef81e55a..06dc2a4c51 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/AbpTenantManagementDomainSharedModule.cs +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/AbpTenantManagementDomainSharedModule.cs @@ -9,7 +9,7 @@ namespace Volo.Abp.TenantManagement { public override void ConfigureServices(ServiceConfigurationContext context) { - context.Services.Configure(options => + Configure(options => { options.Resources.Add("en"); }); diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain/Volo/Abp/TenantManagement/AbpTenantManagementDomainModule.cs b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain/Volo/Abp/TenantManagement/AbpTenantManagementDomainModule.cs index 4e29bf081c..eb587b980a 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain/Volo/Abp/TenantManagement/AbpTenantManagementDomainModule.cs +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain/Volo/Abp/TenantManagement/AbpTenantManagementDomainModule.cs @@ -18,7 +18,7 @@ namespace Volo.Abp.TenantManagement { public override void ConfigureServices(ServiceConfigurationContext context) { - context.Services.Configure(options => + Configure(options => { options.AddProfile(validate: true); }); 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 0c40cdf8af..2267539b09 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/AbpTenantManagementWebModule.cs +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/AbpTenantManagementWebModule.cs @@ -29,17 +29,17 @@ namespace Volo.Abp.TenantManagement.Web public override void ConfigureServices(ServiceConfigurationContext context) { - context.Services.Configure(options => + Configure(options => { options.MenuContributors.Add(new AbpTenantManagementWebMainMenuContributor()); }); - context.Services.Configure(options => + Configure(options => { options.FileSets.AddEmbedded("Volo.Abp.TenantManagement.Web"); }); - context.Services.Configure(options => + Configure(options => { options.Resources .Get() @@ -49,12 +49,12 @@ namespace Volo.Abp.TenantManagement.Web ).AddVirtualJson("/Localization/Resources/AbpTenantManagement/Web"); }); - context.Services.Configure(options => + Configure(options => { options.AddProfile(validate: true); }); - context.Services.Configure(options => + Configure(options => { options.Conventions.AuthorizePage("/TenantManagement/Tenants/Index", TenantManagementPermissions.Tenants.Default); options.Conventions.AuthorizePage("/TenantManagement/Tenants/CreateModal", TenantManagementPermissions.Tenants.Create); diff --git a/modules/tenant-management/test/Volo.Abp.TenantManagement.EntityFrameworkCore.Tests/Volo/Abp/TenantManagement/EntityFrameworkCore/AbpTenantManagementEntityFrameworkCoreTestModule.cs b/modules/tenant-management/test/Volo.Abp.TenantManagement.EntityFrameworkCore.Tests/Volo/Abp/TenantManagement/EntityFrameworkCore/AbpTenantManagementEntityFrameworkCoreTestModule.cs index 24bfcf4903..fac45a1b9a 100644 --- a/modules/tenant-management/test/Volo.Abp.TenantManagement.EntityFrameworkCore.Tests/Volo/Abp/TenantManagement/EntityFrameworkCore/AbpTenantManagementEntityFrameworkCoreTestModule.cs +++ b/modules/tenant-management/test/Volo.Abp.TenantManagement.EntityFrameworkCore.Tests/Volo/Abp/TenantManagement/EntityFrameworkCore/AbpTenantManagementEntityFrameworkCoreTestModule.cs @@ -19,7 +19,7 @@ namespace Volo.Abp.TenantManagement.EntityFrameworkCore var databaseName = Guid.NewGuid().ToString(); - context.Services.Configure(options => + Configure(options => { options.Configure(abpDbContextConfigurationContext => { @@ -27,7 +27,7 @@ namespace Volo.Abp.TenantManagement.EntityFrameworkCore }); }); - context.Services.Configure(options => + Configure(options => { options.TransactionBehavior = UnitOfWorkTransactionBehavior.Disabled; //EF in-memory database does not support transactions }); diff --git a/modules/tenant-management/test/Volo.Abp.TenantManagement.MongoDB.Tests/Volo/Abp/TenantManagement/MongoDb/AbpTenantManagementMongoDbTestModule.cs b/modules/tenant-management/test/Volo.Abp.TenantManagement.MongoDB.Tests/Volo/Abp/TenantManagement/MongoDb/AbpTenantManagementMongoDbTestModule.cs index 18da74eab9..b390abc613 100644 --- a/modules/tenant-management/test/Volo.Abp.TenantManagement.MongoDB.Tests/Volo/Abp/TenantManagement/MongoDb/AbpTenantManagementMongoDbTestModule.cs +++ b/modules/tenant-management/test/Volo.Abp.TenantManagement.MongoDB.Tests/Volo/Abp/TenantManagement/MongoDb/AbpTenantManagementMongoDbTestModule.cs @@ -17,7 +17,7 @@ namespace Volo.Abp.TenantManagement.MongoDb { _mongoDbRunner = MongoDbRunner.Start(); - context.Services.Configure(options => + Configure(options => { options.ConnectionStrings.Default = _mongoDbRunner.ConnectionString; }); diff --git a/modules/users/src/Volo.Abp.Users.Abstractions/Volo/Abp/Users/AbpUsersAbstractionModule.cs b/modules/users/src/Volo.Abp.Users.Abstractions/Volo/Abp/Users/AbpUsersAbstractionModule.cs index b0e598dbfe..f27813e04b 100644 --- a/modules/users/src/Volo.Abp.Users.Abstractions/Volo/Abp/Users/AbpUsersAbstractionModule.cs +++ b/modules/users/src/Volo.Abp.Users.Abstractions/Volo/Abp/Users/AbpUsersAbstractionModule.cs @@ -16,7 +16,7 @@ namespace Volo.Abp.Users { public override void ConfigureServices(ServiceConfigurationContext context) { - context.Services.Configure(options => + Configure(options => { options.ValueProviders.Add(); }); diff --git a/samples/BookStore/src/Acme.BookStore.Application/BookStoreApplicationModule.cs b/samples/BookStore/src/Acme.BookStore.Application/BookStoreApplicationModule.cs index 01607ebdc5..e02c84a71d 100644 --- a/samples/BookStore/src/Acme.BookStore.Application/BookStoreApplicationModule.cs +++ b/samples/BookStore/src/Acme.BookStore.Application/BookStoreApplicationModule.cs @@ -14,12 +14,12 @@ namespace Acme.BookStore { public override void ConfigureServices(ServiceConfigurationContext context) { - context.Services.Configure(options => + Configure(options => { options.DefinitionProviders.Add(); }); - context.Services.Configure(options => + Configure(options => { options.AddProfile(); }); diff --git a/samples/BookStore/src/Acme.BookStore.Domain/BookStoreDomainModule.cs b/samples/BookStore/src/Acme.BookStore.Domain/BookStoreDomainModule.cs index b31e3b8bb1..06d11fd737 100644 --- a/samples/BookStore/src/Acme.BookStore.Domain/BookStoreDomainModule.cs +++ b/samples/BookStore/src/Acme.BookStore.Domain/BookStoreDomainModule.cs @@ -15,12 +15,12 @@ namespace Acme.BookStore { public override void ConfigureServices(ServiceConfigurationContext context) { - context.Services.Configure(options => + Configure(options => { options.FileSets.AddEmbedded(); }); - context.Services.Configure(options => + Configure(options => { options.Resources .Add("en") @@ -28,7 +28,7 @@ namespace Acme.BookStore .AddVirtualJson("/Localization/BookStore"); }); - context.Services.Configure(options => + Configure(options => { options.DefinitionProviders.Add(); }); diff --git a/templates/module/app/MyCompanyName.MyProjectName.DemoApp/DemoAppModule.cs b/templates/module/app/MyCompanyName.MyProjectName.DemoApp/DemoAppModule.cs index c06f3c1f8a..3f7284fc4c 100644 --- a/templates/module/app/MyCompanyName.MyProjectName.DemoApp/DemoAppModule.cs +++ b/templates/module/app/MyCompanyName.MyProjectName.DemoApp/DemoAppModule.cs @@ -50,19 +50,19 @@ namespace MyCompanyName.MyProjectName.DemoApp var hostingEnvironment = context.Services.GetHostingEnvironment(); var configuration = context.Services.BuildConfiguration(); - context.Services.Configure(options => + Configure(options => { options.ConnectionStrings.Default = configuration.GetConnectionString("Default"); }); - context.Services.Configure(options => + Configure(options => { options.UseSqlServer(); }); if (hostingEnvironment.IsDevelopment()) { - context.Services.Configure(options => + Configure(options => { options.FileSets.ReplaceEmbeddedByPyhsical(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}src{0}MyCompanyName.MyProjectName.Web", Path.DirectorySeparatorChar))); options.FileSets.ReplaceEmbeddedByPyhsical(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}src{0}MyCompanyName.MyProjectName.Domain", Path.DirectorySeparatorChar))); @@ -78,7 +78,7 @@ namespace MyCompanyName.MyProjectName.DemoApp options.DocInclusionPredicate((docName, description) => true); }); - context.Services.Configure(options => + Configure(options => { options.Languages.Add(new LanguageInfo("en", "en", "English")); //...add other languages diff --git a/templates/module/src/MyCompanyName.MyProjectName.Application.Contracts/MyCompanyName/MyProjectName/MyProjectNameApplicationContractsModule.cs b/templates/module/src/MyCompanyName.MyProjectName.Application.Contracts/MyCompanyName/MyProjectName/MyProjectNameApplicationContractsModule.cs index 785150737d..6d4c99a263 100644 --- a/templates/module/src/MyCompanyName.MyProjectName.Application.Contracts/MyCompanyName/MyProjectName/MyProjectNameApplicationContractsModule.cs +++ b/templates/module/src/MyCompanyName.MyProjectName.Application.Contracts/MyCompanyName/MyProjectName/MyProjectNameApplicationContractsModule.cs @@ -16,17 +16,17 @@ namespace MyCompanyName.MyProjectName { public override void ConfigureServices(ServiceConfigurationContext context) { - context.Services.Configure(options => + Configure(options => { options.DefinitionProviders.Add(); }); - context.Services.Configure(options => + Configure(options => { options.FileSets.AddEmbedded(); }); - context.Services.Configure(options => + Configure(options => { options.Resources .Get() diff --git a/templates/module/src/MyCompanyName.MyProjectName.Application/MyCompanyName/MyProjectName/MyProjectNameApplicationModule.cs b/templates/module/src/MyCompanyName.MyProjectName.Application/MyCompanyName/MyProjectName/MyProjectNameApplicationModule.cs index e8b2b6bc9e..f62329d534 100644 --- a/templates/module/src/MyCompanyName.MyProjectName.Application/MyCompanyName/MyProjectName/MyProjectNameApplicationModule.cs +++ b/templates/module/src/MyCompanyName.MyProjectName.Application/MyCompanyName/MyProjectName/MyProjectNameApplicationModule.cs @@ -14,12 +14,12 @@ namespace MyCompanyName.MyProjectName { public override void ConfigureServices(ServiceConfigurationContext context) { - context.Services.Configure(options => + Configure(options => { options.AddProfile(validate: true); }); - context.Services.Configure(options => + Configure(options => { options.DefinitionProviders.Add(); }); diff --git a/templates/module/src/MyCompanyName.MyProjectName.Domain.Shared/MyCompanyName/MyProjectName/MyProjectNameDomainSharedModule.cs b/templates/module/src/MyCompanyName.MyProjectName.Domain.Shared/MyCompanyName/MyProjectName/MyProjectNameDomainSharedModule.cs index 476f3eb2e0..98c279b543 100644 --- a/templates/module/src/MyCompanyName.MyProjectName.Domain.Shared/MyCompanyName/MyProjectName/MyProjectNameDomainSharedModule.cs +++ b/templates/module/src/MyCompanyName.MyProjectName.Domain.Shared/MyCompanyName/MyProjectName/MyProjectNameDomainSharedModule.cs @@ -12,7 +12,7 @@ namespace MyCompanyName.MyProjectName { public override void ConfigureServices(ServiceConfigurationContext context) { - context.Services.Configure(options => + Configure(options => { options.Resources.Add("en"); }); diff --git a/templates/module/src/MyCompanyName.MyProjectName.Domain/MyCompanyName/MyProjectName/MyProjectNameDomainModule.cs b/templates/module/src/MyCompanyName.MyProjectName.Domain/MyCompanyName/MyProjectName/MyProjectNameDomainModule.cs index fe5d952515..81f815a022 100644 --- a/templates/module/src/MyCompanyName.MyProjectName.Domain/MyCompanyName/MyProjectName/MyProjectNameDomainModule.cs +++ b/templates/module/src/MyCompanyName.MyProjectName.Domain/MyCompanyName/MyProjectName/MyProjectNameDomainModule.cs @@ -14,17 +14,17 @@ namespace MyCompanyName.MyProjectName { public override void ConfigureServices(ServiceConfigurationContext context) { - context.Services.Configure(options => + Configure(options => { options.FileSets.AddEmbedded(); }); - context.Services.Configure(options => + Configure(options => { options.Resources.Get().AddVirtualJson("/MyCompanyName/MyProjectName/Localization/Domain"); }); - context.Services.Configure(options => + Configure(options => { options.MapCodeNamespace("MyProjectName", typeof(MyProjectNameResource)); }); diff --git a/templates/module/src/MyCompanyName.MyProjectName.Web/MyProjectNameWebModule.cs b/templates/module/src/MyCompanyName.MyProjectName.Web/MyProjectNameWebModule.cs index 7787dd4d96..ab6fd865bd 100644 --- a/templates/module/src/MyCompanyName.MyProjectName.Web/MyProjectNameWebModule.cs +++ b/templates/module/src/MyCompanyName.MyProjectName.Web/MyProjectNameWebModule.cs @@ -28,17 +28,17 @@ namespace MyCompanyName.MyProjectName public override void ConfigureServices(ServiceConfigurationContext context) { - context.Services.Configure(options => + Configure(options => { options.MenuContributors.Add(new MyProjectNameMenuContributor()); }); - context.Services.Configure(options => + Configure(options => { options.FileSets.AddEmbedded("MyCompanyName.MyProjectName"); }); - context.Services.Configure(options => + Configure(options => { options.Resources .Get() @@ -48,12 +48,12 @@ namespace MyCompanyName.MyProjectName ).AddVirtualJson("/Localization/Resources/MyProjectName"); }); - context.Services.Configure(options => + Configure(options => { options.AddProfile(validate: true); }); - context.Services.Configure(options => + Configure(options => { //Configure authorization. }); diff --git a/templates/module/test/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests/MyCompanyName/MyProjectName/EntityFrameworkCore/MyProjectNameEntityFrameworkCoreTestModule.cs b/templates/module/test/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests/MyCompanyName/MyProjectName/EntityFrameworkCore/MyProjectNameEntityFrameworkCoreTestModule.cs index 8ae09ec66c..9c555de7a6 100644 --- a/templates/module/test/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests/MyCompanyName/MyProjectName/EntityFrameworkCore/MyProjectNameEntityFrameworkCoreTestModule.cs +++ b/templates/module/test/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests/MyCompanyName/MyProjectName/EntityFrameworkCore/MyProjectNameEntityFrameworkCoreTestModule.cs @@ -18,7 +18,7 @@ namespace MyCompanyName.MyProjectName.EntityFrameworkCore { var sqliteConnection = CreateDatabaseAndGetConnection(); - context.Services.Configure(options => + Configure(options => { options.Configure(abpDbContextConfigurationContext => { diff --git a/templates/module/test/MyCompanyName.MyProjectName.MongoDB.Tests/MyCompanyName/MyProjectName/MongoDB/MyProjectNameMongoDbTestModule.cs b/templates/module/test/MyCompanyName.MyProjectName.MongoDB.Tests/MyCompanyName/MyProjectName/MongoDB/MyProjectNameMongoDbTestModule.cs index 083d2bbe64..e1cc8a627a 100644 --- a/templates/module/test/MyCompanyName.MyProjectName.MongoDB.Tests/MyCompanyName/MyProjectName/MongoDB/MyProjectNameMongoDbTestModule.cs +++ b/templates/module/test/MyCompanyName.MyProjectName.MongoDB.Tests/MyCompanyName/MyProjectName/MongoDB/MyProjectNameMongoDbTestModule.cs @@ -18,7 +18,7 @@ namespace MyCompanyName.MyProjectName.MongoDB { _mongoDbRunner = MongoDbRunner.Start(); - context.Services.Configure(options => + Configure(options => { options.ConnectionStrings.Default = _mongoDbRunner.ConnectionString; }); diff --git a/templates/mvc/src/MyCompanyName.MyProjectName.Application/MyProjectNameApplicationModule.cs b/templates/mvc/src/MyCompanyName.MyProjectName.Application/MyProjectNameApplicationModule.cs index 3f84f66302..464e982a1e 100644 --- a/templates/mvc/src/MyCompanyName.MyProjectName.Application/MyProjectNameApplicationModule.cs +++ b/templates/mvc/src/MyCompanyName.MyProjectName.Application/MyProjectNameApplicationModule.cs @@ -14,12 +14,12 @@ namespace MyCompanyName.MyProjectName { public override void ConfigureServices(ServiceConfigurationContext context) { - context.Services.Configure(options => + Configure(options => { options.DefinitionProviders.Add(); }); - context.Services.Configure(options => + Configure(options => { options.AddProfile(); }); diff --git a/templates/mvc/src/MyCompanyName.MyProjectName.Domain/MyProjectNameDomainModule.cs b/templates/mvc/src/MyCompanyName.MyProjectName.Domain/MyProjectNameDomainModule.cs index 0f73dce755..9435598068 100644 --- a/templates/mvc/src/MyCompanyName.MyProjectName.Domain/MyProjectNameDomainModule.cs +++ b/templates/mvc/src/MyCompanyName.MyProjectName.Domain/MyProjectNameDomainModule.cs @@ -23,12 +23,12 @@ namespace MyCompanyName.MyProjectName { public override void ConfigureServices(ServiceConfigurationContext context) { - context.Services.Configure(options => + Configure(options => { options.FileSets.AddEmbedded(); }); - context.Services.Configure(options => + Configure(options => { options.Resources .Add("en") @@ -36,7 +36,7 @@ namespace MyCompanyName.MyProjectName .AddVirtualJson("/Localization/MyProjectName"); }); - context.Services.Configure(options => + Configure(options => { options.DefinitionProviders.Add(); }); diff --git a/templates/service/host/IdentityServerHost/IdentityServerHostModule.cs b/templates/service/host/IdentityServerHost/IdentityServerHostModule.cs index a7c3380246..8883c8848b 100644 --- a/templates/service/host/IdentityServerHost/IdentityServerHostModule.cs +++ b/templates/service/host/IdentityServerHost/IdentityServerHostModule.cs @@ -28,17 +28,17 @@ namespace IdentityServerHost var hostingEnvironment = context.Services.GetHostingEnvironment(); var configuration = context.Services.BuildConfiguration(); - context.Services.Configure(options => + Configure(options => { options.ConnectionStrings.Default = configuration.GetConnectionString("Default"); }); - context.Services.Configure(options => + Configure(options => { options.UseSqlServer(); }); - context.Services.Configure(iis => + Configure(iis => { iis.AuthenticationDisplayName = "Windows"; iis.AutomaticAuthentication = false; diff --git a/templates/service/host/MyCompanyName.MyProjectName.Host/DemoAppModule.cs b/templates/service/host/MyCompanyName.MyProjectName.Host/DemoAppModule.cs index 1c727bdc3c..712f12159f 100644 --- a/templates/service/host/MyCompanyName.MyProjectName.Host/DemoAppModule.cs +++ b/templates/service/host/MyCompanyName.MyProjectName.Host/DemoAppModule.cs @@ -38,19 +38,19 @@ namespace MyCompanyName.MyProjectName.Host var hostingEnvironment = context.Services.GetHostingEnvironment(); var configuration = context.Services.BuildConfiguration(); - context.Services.Configure(options => + Configure(options => { options.ConnectionStrings.Default = configuration.GetConnectionString("Default"); }); - context.Services.Configure(options => + Configure(options => { options.UseSqlServer(); }); if (hostingEnvironment.IsDevelopment()) { - context.Services.Configure(options => + Configure(options => { options.FileSets.ReplaceEmbeddedByPyhsical(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}src{0}MyCompanyName.MyProjectName.Domain", Path.DirectorySeparatorChar))); options.FileSets.ReplaceEmbeddedByPyhsical(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}src{0}MyCompanyName.MyProjectName.Application", Path.DirectorySeparatorChar))); @@ -65,7 +65,7 @@ namespace MyCompanyName.MyProjectName.Host options.DocInclusionPredicate((docName, description) => true); }); - context.Services.Configure(options => + Configure(options => { options.Languages.Add(new LanguageInfo("en", "en", "English")); //...add other languages diff --git a/templates/service/src/MyCompanyName.MyProjectName.Application.Contracts/MyCompanyName/MyProjectName/MyProjectNameApplicationContractsModule.cs b/templates/service/src/MyCompanyName.MyProjectName.Application.Contracts/MyCompanyName/MyProjectName/MyProjectNameApplicationContractsModule.cs index 785150737d..6d4c99a263 100644 --- a/templates/service/src/MyCompanyName.MyProjectName.Application.Contracts/MyCompanyName/MyProjectName/MyProjectNameApplicationContractsModule.cs +++ b/templates/service/src/MyCompanyName.MyProjectName.Application.Contracts/MyCompanyName/MyProjectName/MyProjectNameApplicationContractsModule.cs @@ -16,17 +16,17 @@ namespace MyCompanyName.MyProjectName { public override void ConfigureServices(ServiceConfigurationContext context) { - context.Services.Configure(options => + Configure(options => { options.DefinitionProviders.Add(); }); - context.Services.Configure(options => + Configure(options => { options.FileSets.AddEmbedded(); }); - context.Services.Configure(options => + Configure(options => { options.Resources .Get() diff --git a/templates/service/src/MyCompanyName.MyProjectName.Application/MyCompanyName/MyProjectName/MyProjectNameApplicationModule.cs b/templates/service/src/MyCompanyName.MyProjectName.Application/MyCompanyName/MyProjectName/MyProjectNameApplicationModule.cs index e8b2b6bc9e..f62329d534 100644 --- a/templates/service/src/MyCompanyName.MyProjectName.Application/MyCompanyName/MyProjectName/MyProjectNameApplicationModule.cs +++ b/templates/service/src/MyCompanyName.MyProjectName.Application/MyCompanyName/MyProjectName/MyProjectNameApplicationModule.cs @@ -14,12 +14,12 @@ namespace MyCompanyName.MyProjectName { public override void ConfigureServices(ServiceConfigurationContext context) { - context.Services.Configure(options => + Configure(options => { options.AddProfile(validate: true); }); - context.Services.Configure(options => + Configure(options => { options.DefinitionProviders.Add(); }); diff --git a/templates/service/src/MyCompanyName.MyProjectName.Domain.Shared/MyCompanyName/MyProjectName/MyProjectNameDomainSharedModule.cs b/templates/service/src/MyCompanyName.MyProjectName.Domain.Shared/MyCompanyName/MyProjectName/MyProjectNameDomainSharedModule.cs index 476f3eb2e0..98c279b543 100644 --- a/templates/service/src/MyCompanyName.MyProjectName.Domain.Shared/MyCompanyName/MyProjectName/MyProjectNameDomainSharedModule.cs +++ b/templates/service/src/MyCompanyName.MyProjectName.Domain.Shared/MyCompanyName/MyProjectName/MyProjectNameDomainSharedModule.cs @@ -12,7 +12,7 @@ namespace MyCompanyName.MyProjectName { public override void ConfigureServices(ServiceConfigurationContext context) { - context.Services.Configure(options => + Configure(options => { options.Resources.Add("en"); }); diff --git a/templates/service/src/MyCompanyName.MyProjectName.Domain/MyCompanyName/MyProjectName/MyProjectNameDomainModule.cs b/templates/service/src/MyCompanyName.MyProjectName.Domain/MyCompanyName/MyProjectName/MyProjectNameDomainModule.cs index fe5d952515..81f815a022 100644 --- a/templates/service/src/MyCompanyName.MyProjectName.Domain/MyCompanyName/MyProjectName/MyProjectNameDomainModule.cs +++ b/templates/service/src/MyCompanyName.MyProjectName.Domain/MyCompanyName/MyProjectName/MyProjectNameDomainModule.cs @@ -14,17 +14,17 @@ namespace MyCompanyName.MyProjectName { public override void ConfigureServices(ServiceConfigurationContext context) { - context.Services.Configure(options => + Configure(options => { options.FileSets.AddEmbedded(); }); - context.Services.Configure(options => + Configure(options => { options.Resources.Get().AddVirtualJson("/MyCompanyName/MyProjectName/Localization/Domain"); }); - context.Services.Configure(options => + Configure(options => { options.MapCodeNamespace("MyProjectName", typeof(MyProjectNameResource)); }); diff --git a/templates/service/test/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests/MyCompanyName/MyProjectName/EntityFrameworkCore/MyProjectNameEntityFrameworkCoreTestModule.cs b/templates/service/test/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests/MyCompanyName/MyProjectName/EntityFrameworkCore/MyProjectNameEntityFrameworkCoreTestModule.cs index 8ae09ec66c..9c555de7a6 100644 --- a/templates/service/test/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests/MyCompanyName/MyProjectName/EntityFrameworkCore/MyProjectNameEntityFrameworkCoreTestModule.cs +++ b/templates/service/test/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests/MyCompanyName/MyProjectName/EntityFrameworkCore/MyProjectNameEntityFrameworkCoreTestModule.cs @@ -18,7 +18,7 @@ namespace MyCompanyName.MyProjectName.EntityFrameworkCore { var sqliteConnection = CreateDatabaseAndGetConnection(); - context.Services.Configure(options => + Configure(options => { options.Configure(abpDbContextConfigurationContext => { diff --git a/templates/service/test/MyCompanyName.MyProjectName.MongoDB.Tests/MyCompanyName/MyProjectName/MongoDB/MyProjectNameMongoDbTestModule.cs b/templates/service/test/MyCompanyName.MyProjectName.MongoDB.Tests/MyCompanyName/MyProjectName/MongoDB/MyProjectNameMongoDbTestModule.cs index 083d2bbe64..e1cc8a627a 100644 --- a/templates/service/test/MyCompanyName.MyProjectName.MongoDB.Tests/MyCompanyName/MyProjectName/MongoDB/MyProjectNameMongoDbTestModule.cs +++ b/templates/service/test/MyCompanyName.MyProjectName.MongoDB.Tests/MyCompanyName/MyProjectName/MongoDB/MyProjectNameMongoDbTestModule.cs @@ -18,7 +18,7 @@ namespace MyCompanyName.MyProjectName.MongoDB { _mongoDbRunner = MongoDbRunner.Start(); - context.Services.Configure(options => + Configure(options => { options.ConnectionStrings.Default = _mongoDbRunner.ConnectionString; }); From b804755ef7b718b37ddfcf019322d0a96962aa34 Mon Sep 17 00:00:00 2001 From: Yunus Emre Kalkan Date: Mon, 3 Dec 2018 10:11:49 +0300 Subject: [PATCH 09/60] #450 --- .../Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcModule.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcModule.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcModule.cs index 8d4536fec9..df5d127d98 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcModule.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcModule.cs @@ -57,14 +57,14 @@ namespace Volo.Abp.AspNetCore.Mvc ) ); - context.Services.Configure(options => + Configure(options => { options.IgnoredInterfaces.AddIfNotContains(typeof(IAsyncActionFilter)); options.IgnoredInterfaces.AddIfNotContains(typeof(IFilterMetadata)); options.IgnoredInterfaces.AddIfNotContains(typeof(IActionFilter)); }); - context.Services.Configure(options => + Configure(options => { options.ConventionalControllers.Create(typeof(AbpAspNetCoreMvcModule).Assembly, o => { @@ -106,7 +106,7 @@ namespace Volo.Abp.AspNetCore.Mvc partManager.FeatureProviders.Add(new AbpConventionalControllerFeatureProvider(application)); - context.Services.Configure(mvcOptions => + Configure(mvcOptions => { mvcOptions.AddAbp(context.Services); }); From d678b5f29db930245c4546904722e0489ca96800 Mon Sep 17 00:00:00 2001 From: Halil ibrahim Kalkan Date: Mon, 3 Dec 2018 10:17:07 +0300 Subject: [PATCH 10/60] Refactored eventbus --- .../Events/EntityChangeEventHelper.cs | 2 +- .../Volo/Abp/EventBus/AbpEventBusModule.cs | 12 +- .../Volo/Abp/EventBus/ActionEventHandler.cs | 4 +- ...tions.cs => DistributedEventBusOptions.cs} | 0 .../Distributed/LocalDistributedEventBus.cs | 4 +- ...EventBus.cs => NullDistributedEventBus.cs} | 4 +- .../Volo/Abp/EventBus/EventBusBase.cs | 14 +- .../Volo/Abp/EventBus/IEventBus.cs | 123 +++++++++++++++++- .../Volo/Abp/EventBus/IEventHandler.cs | 17 +-- .../Volo/Abp/EventBus/IEventPublisher.cs | 25 ---- .../Volo/Abp/EventBus/IEventSubscriber.cs | 111 ---------------- .../Abp/EventBus/Local/ILocalEventHandler.cs | 13 ++ .../Abp/EventBus/Local/NullLocalEventBus.cs | 4 +- .../Local/EventBus_MultipleHandle_Test.cs | 4 +- .../Local/MySimpleEventDataHandler.cs | 2 +- .../Local/MySimpleTransientEventHandler.cs | 2 +- 16 files changed, 162 insertions(+), 179 deletions(-) rename framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/{LocalEventBusOptions.cs => DistributedEventBusOptions.cs} (100%) rename framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/{NullLocalEventBus.cs => NullDistributedEventBus.cs} (92%) delete mode 100644 framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/IEventPublisher.cs delete mode 100644 framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/IEventSubscriber.cs create mode 100644 framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Local/ILocalEventHandler.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 index b236e6f7e4..dc4edea364 100644 --- 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 @@ -126,7 +126,7 @@ namespace Volo.Abp.Domain.Entities.Events } } - protected virtual async Task TriggerEventWithEntity(IEventPublisher eventPublisher, Type genericEventType, object entity, bool triggerInCurrentUnitOfWork) + protected virtual async Task TriggerEventWithEntity(IEventBus eventPublisher, Type genericEventType, object entity, bool triggerInCurrentUnitOfWork) { var entityType = ProxyHelper.UnProxy(entity).GetType(); var eventType = genericEventType.MakeGenericType(entityType); diff --git a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/AbpEventBusModule.cs b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/AbpEventBusModule.cs index f17fd05446..3729b48b61 100644 --- a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/AbpEventBusModule.cs +++ b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/AbpEventBusModule.cs @@ -1,7 +1,6 @@ using Microsoft.Extensions.DependencyInjection; using System; using System.Collections.Generic; -using System.Linq; using Volo.Abp.EventBus.Distributed; using Volo.Abp.EventBus.Local; using Volo.Abp.Modularity; @@ -23,15 +22,14 @@ namespace Volo.Abp.EventBus services.OnRegistred(context => { - if (ReflectionHelper.IsAssignableToGenericType(context.ImplementationType, typeof(IEventHandler<>))) + if (ReflectionHelper.IsAssignableToGenericType(context.ImplementationType, typeof(ILocalEventHandler<>))) { localHandlers.Add(context.ImplementationType); } - //TODO: Distrbiuted event bus is disabled since it's not properly working yet for v0.8 release - //else if (ReflectionHelper.IsAssignableToGenericType(context.ImplementationType, typeof(IDistributedEventHandler<>))) - //{ - // distributedHandlers.Add(context.ImplementationType); - //} + else if (ReflectionHelper.IsAssignableToGenericType(context.ImplementationType, typeof(IDistributedEventHandler<>))) + { + distributedHandlers.Add(context.ImplementationType); + } }); services.Configure(options => diff --git a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/ActionEventHandler.cs b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/ActionEventHandler.cs index 995ce39356..a8763edd89 100644 --- a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/ActionEventHandler.cs +++ b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/ActionEventHandler.cs @@ -5,11 +5,11 @@ using Volo.Abp.DependencyInjection; namespace Volo.Abp.EventBus { /// - /// This event handler is an adapter to be able to use an action as implementation. + /// This event handler is an adapter to be able to use an action as implementation. /// /// Event type public class ActionEventHandler : - IEventHandler, + ILocalEventHandler, ITransientDependency { /// diff --git a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/LocalEventBusOptions.cs b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/DistributedEventBusOptions.cs similarity index 100% rename from framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/LocalEventBusOptions.cs rename to framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/DistributedEventBusOptions.cs diff --git a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/LocalDistributedEventBus.cs b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/LocalDistributedEventBus.cs index 0f609c6aaa..cfbf7b0211 100644 --- a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/LocalDistributedEventBus.cs +++ b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/LocalDistributedEventBus.cs @@ -53,7 +53,7 @@ namespace Volo.Abp.EventBus.Distributed return _localEventBus.Subscribe(action); } - public IDisposable Subscribe(IEventHandler handler) where TEvent : class + public IDisposable Subscribe(ILocalEventHandler handler) where TEvent : class { return _localEventBus.Subscribe(handler); } @@ -83,7 +83,7 @@ namespace Volo.Abp.EventBus.Distributed _localEventBus.Unsubscribe(action); } - public void Unsubscribe(IEventHandler handler) where TEvent : class + public void Unsubscribe(ILocalEventHandler handler) where TEvent : class { _localEventBus.Unsubscribe(handler); } diff --git a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/NullLocalEventBus.cs b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/NullDistributedEventBus.cs similarity index 92% rename from framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/NullLocalEventBus.cs rename to framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/NullDistributedEventBus.cs index cc59b9a24b..8df6455d52 100644 --- a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/NullLocalEventBus.cs +++ b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/NullDistributedEventBus.cs @@ -17,7 +17,7 @@ namespace Volo.Abp.EventBus.Distributed return NullDisposable.Instance; } - public IDisposable Subscribe(IEventHandler handler) where TEvent : class + public IDisposable Subscribe(ILocalEventHandler handler) where TEvent : class { return NullDisposable.Instance; } @@ -47,7 +47,7 @@ namespace Volo.Abp.EventBus.Distributed } - public void Unsubscribe(IEventHandler handler) where TEvent : class + public void Unsubscribe(ILocalEventHandler handler) where TEvent : class { } diff --git a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/EventBusBase.cs b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/EventBusBase.cs index e0c0340f15..04f5b0f79d 100644 --- a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/EventBusBase.cs +++ b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/EventBusBase.cs @@ -8,7 +8,7 @@ using System.Threading.Tasks; using Volo.Abp.EventBus.Distributed; using Volo.Abp.Reflection; -namespace Volo.Abp.EventBus.Local +namespace Volo.Abp.EventBus { public abstract class EventBusBase : IEventBus { @@ -19,7 +19,7 @@ namespace Volo.Abp.EventBus.Local } /// - public virtual IDisposable Subscribe(IEventHandler handler) where TEvent : class + public virtual IDisposable Subscribe(ILocalEventHandler handler) where TEvent : class { return Subscribe(typeof(TEvent), handler); } @@ -49,7 +49,7 @@ namespace Volo.Abp.EventBus.Local public abstract void Unsubscribe(Func action) where TEvent : class; /// - public virtual void Unsubscribe(IEventHandler handler) where TEvent : class + public virtual void Unsubscribe(ILocalEventHandler handler) where TEvent : class { Unsubscribe(typeof(TEvent), handler); } @@ -138,12 +138,12 @@ namespace Volo.Abp.EventBus.Local { var handlerType = eventHandlerWrapper.EventHandler.GetType(); - if (ReflectionHelper.IsAssignableToGenericType(handlerType, typeof(IEventHandler<>))) + if (ReflectionHelper.IsAssignableToGenericType(handlerType, typeof(ILocalEventHandler<>))) { - var method = typeof(IEventHandler<>) //TODO: to a static field + var method = typeof(ILocalEventHandler<>) .MakeGenericType(eventType) .GetMethod( - nameof(IEventHandler.HandleEventAsync), + nameof(ILocalEventHandler.HandleEventAsync), new[] { eventType } ); @@ -151,7 +151,7 @@ namespace Volo.Abp.EventBus.Local } else if (ReflectionHelper.IsAssignableToGenericType(handlerType, typeof(IDistributedEventHandler<>))) { - var method = typeof(IDistributedEventHandler<>) //TODO: to a static field + var method = typeof(IDistributedEventHandler<>) .MakeGenericType(eventType) .GetMethod( nameof(IDistributedEventHandler.HandleEventAsync), diff --git a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/IEventBus.cs b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/IEventBus.cs index a5d1c27a15..0ffd4cad91 100644 --- a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/IEventBus.cs +++ b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/IEventBus.cs @@ -1,7 +1,128 @@ +using System; +using System.Threading.Tasks; + namespace Volo.Abp.EventBus { - public interface IEventBus : IEventSubscriber, IEventPublisher + public interface IEventBus { + /// + /// Triggers an event asynchronously. + /// + /// Event type + /// Related data for the event + /// The task to handle async operation + Task PublishAsync(TEvent eventData) + where TEvent : class; + + /// + /// Triggers an event asynchronously. + /// + /// Event type + /// Related data for the event + /// The task to handle async operation + Task PublishAsync(Type eventType, object eventData); + + /// + /// Registers to an event. + /// Given action is called for all event occurrences. + /// + /// Action to handle events + /// Event type + IDisposable Subscribe(Func action) + where TEvent : class; + + /// + /// Registers to an event. + /// Same (given) instance of the handler is used for all event occurrences. + /// + /// Event type + /// Object to handle the event + IDisposable Subscribe(ILocalEventHandler handler) + where TEvent : class; + + /// + /// Registers to an event. + /// A new instance of object is created for every event occurrence. + /// + /// Event type + /// Type of the event handler + IDisposable Subscribe() + where TEvent : class + where THandler : IEventHandler, new(); + + /// + /// Registers to an event. + /// Same (given) instance of the handler is used for all event occurrences. + /// + /// Event type + /// Object to handle the event + IDisposable Subscribe(Type eventType, IEventHandler handler); + + /// + /// Registers to an event. + /// Given factory is used to create/release handlers + /// + /// Event type + /// A factory to create/release handlers + IDisposable Subscribe(IEventHandlerFactory factory) + where TEvent : class; + + /// + /// Registers to an event. + /// + /// Event type + /// A factory to create/release handlers + IDisposable Subscribe(Type eventType, IEventHandlerFactory factory); + + /// + /// Unregisters from an event. + /// + /// Event type + /// + void Unsubscribe(Func action) + where TEvent : class; + + /// + /// Unregisters from an event. + /// + /// Event type + /// Handler object that is registered before + void Unsubscribe(ILocalEventHandler handler) + where TEvent : class; + + /// + /// Unregisters from an event. + /// + /// Event type + /// Handler object that is registered before + void Unsubscribe(Type eventType, IEventHandler handler); + + /// + /// Unregisters from an event. + /// + /// Event type + /// Factory object that is registered before + void Unsubscribe(IEventHandlerFactory factory) + where TEvent : class; + + /// + /// Unregisters from an event. + /// + /// Event type + /// Factory object that is registered before + void Unsubscribe(Type eventType, IEventHandlerFactory factory); + + /// + /// Unregisters all event handlers of given event type. + /// + /// Event type + void UnsubscribeAll() + where TEvent : class; + /// + /// Unregisters all event handlers of given event type. + /// + /// Event type + void UnsubscribeAll(Type eventType); } } \ No newline at end of file diff --git a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/IEventHandler.cs b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/IEventHandler.cs index ca3993c6bc..6397813637 100644 --- a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/IEventHandler.cs +++ b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/IEventHandler.cs @@ -1,26 +1,13 @@ -using System.Threading.Tasks; +using Volo.Abp.EventBus.Distributed; namespace Volo.Abp.EventBus { /// /// Undirect base interface for all event handlers. - /// Implement instead of this one. + /// Implement or instead of this one. /// public interface IEventHandler { } - - /// - /// Defines an interface of a class that handles events asynchrounously of type . - /// - /// Event type to handle - public interface IEventHandler : IEventHandler - { - /// - /// Handler handles the event by implementing this method. - /// - /// Event data - Task HandleEventAsync(TEvent eventData); - } } \ No newline at end of file diff --git a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/IEventPublisher.cs b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/IEventPublisher.cs deleted file mode 100644 index 0192522304..0000000000 --- a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/IEventPublisher.cs +++ /dev/null @@ -1,25 +0,0 @@ -using System; -using System.Threading.Tasks; - -namespace Volo.Abp.EventBus -{ - public interface IEventPublisher - { - /// - /// Triggers an event asynchronously. - /// - /// Event type - /// Related data for the event - /// The task to handle async operation - Task PublishAsync(TEvent eventData) - where TEvent : class; - - /// - /// Triggers an event asynchronously. - /// - /// Event type - /// Related data for the event - /// The task to handle async operation - Task PublishAsync(Type eventType, object eventData); - } -} \ No newline at end of file diff --git a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/IEventSubscriber.cs b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/IEventSubscriber.cs deleted file mode 100644 index 86330433ea..0000000000 --- a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/IEventSubscriber.cs +++ /dev/null @@ -1,111 +0,0 @@ -using System; -using System.Threading.Tasks; - -namespace Volo.Abp.EventBus -{ - public interface IEventSubscriber - { - /// - /// Registers to an event. - /// Given action is called for all event occurrences. - /// - /// Action to handle events - /// Event type - IDisposable Subscribe(Func action) - where TEvent : class; - - /// - /// Registers to an event. - /// Same (given) instance of the handler is used for all event occurrences. - /// - /// Event type - /// Object to handle the event - IDisposable Subscribe(IEventHandler handler) - where TEvent : class; - - /// - /// Registers to an event. - /// A new instance of object is created for every event occurrence. - /// - /// Event type - /// Type of the event handler - IDisposable Subscribe() - where TEvent : class - where THandler : IEventHandler, new(); - - /// - /// Registers to an event. - /// Same (given) instance of the handler is used for all event occurrences. - /// - /// Event type - /// Object to handle the event - IDisposable Subscribe(Type eventType, IEventHandler handler); - - /// - /// Registers to an event. - /// Given factory is used to create/release handlers - /// - /// Event type - /// A factory to create/release handlers - IDisposable Subscribe(IEventHandlerFactory factory) - where TEvent : class; - - /// - /// Registers to an event. - /// - /// Event type - /// A factory to create/release handlers - IDisposable Subscribe(Type eventType, IEventHandlerFactory factory); - - /// - /// Unregisters from an event. - /// - /// Event type - /// - void Unsubscribe(Func action) - where TEvent : class; - - /// - /// Unregisters from an event. - /// - /// Event type - /// Handler object that is registered before - void Unsubscribe(IEventHandler handler) - where TEvent : class; - - /// - /// Unregisters from an event. - /// - /// Event type - /// Handler object that is registered before - void Unsubscribe(Type eventType, IEventHandler handler); - - /// - /// Unregisters from an event. - /// - /// Event type - /// Factory object that is registered before - void Unsubscribe(IEventHandlerFactory factory) - where TEvent : class; - - /// - /// Unregisters from an event. - /// - /// Event type - /// Factory object that is registered before - void Unsubscribe(Type eventType, IEventHandlerFactory factory); - - /// - /// Unregisters all event handlers of given event type. - /// - /// Event type - void UnsubscribeAll() - where TEvent : class; - - /// - /// Unregisters all event handlers of given event type. - /// - /// Event type - void UnsubscribeAll(Type eventType); - } -} \ No newline at end of file diff --git a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Local/ILocalEventHandler.cs b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Local/ILocalEventHandler.cs new file mode 100644 index 0000000000..e3501294be --- /dev/null +++ b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Local/ILocalEventHandler.cs @@ -0,0 +1,13 @@ +using System.Threading.Tasks; + +namespace Volo.Abp.EventBus +{ + public interface ILocalEventHandler : IEventHandler + { + /// + /// Handler handles the event by implementing this method. + /// + /// Event data + Task HandleEventAsync(TEvent eventData); + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Local/NullLocalEventBus.cs b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Local/NullLocalEventBus.cs index 494db3edd1..5c74af2195 100644 --- a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Local/NullLocalEventBus.cs +++ b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Local/NullLocalEventBus.cs @@ -17,7 +17,7 @@ namespace Volo.Abp.EventBus.Local return NullDisposable.Instance; } - public IDisposable Subscribe(IEventHandler handler) where TEvent : class + public IDisposable Subscribe(ILocalEventHandler handler) where TEvent : class { return NullDisposable.Instance; } @@ -47,7 +47,7 @@ namespace Volo.Abp.EventBus.Local } - public void Unsubscribe(IEventHandler handler) where TEvent : class + public void Unsubscribe(ILocalEventHandler handler) where TEvent : class { } diff --git a/framework/test/Volo.Abp.EventBus.Tests/Volo/Abp/EventBus/Local/EventBus_MultipleHandle_Test.cs b/framework/test/Volo.Abp.EventBus.Tests/Volo/Abp/EventBus/Local/EventBus_MultipleHandle_Test.cs index b8dfe43e17..d20692fa01 100644 --- a/framework/test/Volo.Abp.EventBus.Tests/Volo/Abp/EventBus/Local/EventBus_MultipleHandle_Test.cs +++ b/framework/test/Volo.Abp.EventBus.Tests/Volo/Abp/EventBus/Local/EventBus_MultipleHandle_Test.cs @@ -31,8 +31,8 @@ namespace Volo.Abp.EventBus.Local } public class MyEventHandler : - IEventHandler>, - IEventHandler> + ILocalEventHandler>, + ILocalEventHandler> { public int EntityChangedEventCount { get; set; } public int EntityCreatedEventCount { get; set; } diff --git a/framework/test/Volo.Abp.EventBus.Tests/Volo/Abp/EventBus/Local/MySimpleEventDataHandler.cs b/framework/test/Volo.Abp.EventBus.Tests/Volo/Abp/EventBus/Local/MySimpleEventDataHandler.cs index ac725f2ae3..66a48a60bb 100644 --- a/framework/test/Volo.Abp.EventBus.Tests/Volo/Abp/EventBus/Local/MySimpleEventDataHandler.cs +++ b/framework/test/Volo.Abp.EventBus.Tests/Volo/Abp/EventBus/Local/MySimpleEventDataHandler.cs @@ -3,7 +3,7 @@ using Volo.Abp.DependencyInjection; namespace Volo.Abp.EventBus.Local { - public class MySimpleEventDataHandler : IEventHandler, ISingletonDependency + public class MySimpleEventDataHandler : ILocalEventHandler, ISingletonDependency { public int TotalData { get; private set; } diff --git a/framework/test/Volo.Abp.EventBus.Tests/Volo/Abp/EventBus/Local/MySimpleTransientEventHandler.cs b/framework/test/Volo.Abp.EventBus.Tests/Volo/Abp/EventBus/Local/MySimpleTransientEventHandler.cs index 6adf34b51b..2c33c8e32c 100644 --- a/framework/test/Volo.Abp.EventBus.Tests/Volo/Abp/EventBus/Local/MySimpleTransientEventHandler.cs +++ b/framework/test/Volo.Abp.EventBus.Tests/Volo/Abp/EventBus/Local/MySimpleTransientEventHandler.cs @@ -3,7 +3,7 @@ using System.Threading.Tasks; namespace Volo.Abp.EventBus.Local { - public class MySimpleTransientEventHandler : IEventHandler, IDisposable + public class MySimpleTransientEventHandler : ILocalEventHandler, IDisposable { public static int HandleCount { get; set; } From 40ea123451f62b2decfc7833fc7701c77603266b Mon Sep 17 00:00:00 2001 From: Halil ibrahim Kalkan Date: Mon, 3 Dec 2018 10:25:49 +0300 Subject: [PATCH 11/60] IEventBus.Subscribe should be separated. --- .../RabbitMq/RabbitMqDistributedEventBus.cs | 5 +++++ .../EventBus/Distributed/IDistributedEventBus.cs | 13 +++++++++++-- .../Distributed/LocalDistributedEventBus.cs | 6 ++++++ .../EventBus/Distributed/NullDistributedEventBus.cs | 2 +- .../Volo/Abp/EventBus/EventBusBase.cs | 6 ------ .../Volo/Abp/EventBus/IEventBus.cs | 9 --------- .../Volo/Abp/EventBus/Local/ILocalEventBus.cs | 11 ++++++++++- .../Volo/Abp/EventBus/Local/LocalEventBus.cs | 6 ++++++ 8 files changed, 39 insertions(+), 19 deletions(-) diff --git a/framework/src/Volo.Abp.EventBus.Distributed.RabbitMQ/Volo/Abp/EventBus/Distributed/RabbitMq/RabbitMqDistributedEventBus.cs b/framework/src/Volo.Abp.EventBus.Distributed.RabbitMQ/Volo/Abp/EventBus/Distributed/RabbitMq/RabbitMqDistributedEventBus.cs index 4bf615a998..99173ee333 100644 --- a/framework/src/Volo.Abp.EventBus.Distributed.RabbitMQ/Volo/Abp/EventBus/Distributed/RabbitMq/RabbitMqDistributedEventBus.cs +++ b/framework/src/Volo.Abp.EventBus.Distributed.RabbitMQ/Volo/Abp/EventBus/Distributed/RabbitMq/RabbitMqDistributedEventBus.cs @@ -124,6 +124,11 @@ namespace Volo.Abp.EventBus.Distributed.RabbitMq channel.BasicAck(ea.DeliveryTag, multiple: false); } + public IDisposable Subscribe(IDistributedEventHandler handler) where TEvent : class + { + return Subscribe(typeof(TEvent), handler); + } + public override IDisposable Subscribe(Type eventType, IEventHandlerFactory factory) { var handlerFactories = GetOrCreateHandlerFactories(eventType); diff --git a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/IDistributedEventBus.cs b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/IDistributedEventBus.cs index 88cbf721b3..e406f7069b 100644 --- a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/IDistributedEventBus.cs +++ b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/IDistributedEventBus.cs @@ -1,7 +1,16 @@ -namespace Volo.Abp.EventBus.Distributed +using System; + +namespace Volo.Abp.EventBus.Distributed { public interface IDistributedEventBus : IEventBus { - + /// + /// Registers to an event. + /// Same (given) instance of the handler is used for all event occurrences. + /// + /// Event type + /// Object to handle the event + IDisposable Subscribe(IDistributedEventHandler handler) + where TEvent : class; } } diff --git a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/LocalDistributedEventBus.cs b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/LocalDistributedEventBus.cs index cfbf7b0211..c7b0cef7b1 100644 --- a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/LocalDistributedEventBus.cs +++ b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/LocalDistributedEventBus.cs @@ -48,6 +48,12 @@ namespace Volo.Abp.EventBus.Distributed } } + /// + public virtual IDisposable Subscribe(IDistributedEventHandler handler) where TEvent : class + { + return Subscribe(typeof(TEvent), handler); + } + public IDisposable Subscribe(Func action) where TEvent : class { return _localEventBus.Subscribe(action); diff --git a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/NullDistributedEventBus.cs b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/NullDistributedEventBus.cs index 8df6455d52..cfec832893 100644 --- a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/NullDistributedEventBus.cs +++ b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/NullDistributedEventBus.cs @@ -17,7 +17,7 @@ namespace Volo.Abp.EventBus.Distributed return NullDisposable.Instance; } - public IDisposable Subscribe(ILocalEventHandler handler) where TEvent : class + public IDisposable Subscribe(IDistributedEventHandler handler) where TEvent : class { return NullDisposable.Instance; } diff --git a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/EventBusBase.cs b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/EventBusBase.cs index 04f5b0f79d..c700f46532 100644 --- a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/EventBusBase.cs +++ b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/EventBusBase.cs @@ -18,12 +18,6 @@ namespace Volo.Abp.EventBus return Subscribe(typeof(TEvent), new ActionEventHandler(action)); } - /// - public virtual IDisposable Subscribe(ILocalEventHandler handler) where TEvent : class - { - return Subscribe(typeof(TEvent), handler); - } - /// public virtual IDisposable Subscribe() where TEvent : class diff --git a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/IEventBus.cs b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/IEventBus.cs index 0ffd4cad91..4526c1f3b4 100644 --- a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/IEventBus.cs +++ b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/IEventBus.cs @@ -31,15 +31,6 @@ namespace Volo.Abp.EventBus IDisposable Subscribe(Func action) where TEvent : class; - /// - /// Registers to an event. - /// Same (given) instance of the handler is used for all event occurrences. - /// - /// Event type - /// Object to handle the event - IDisposable Subscribe(ILocalEventHandler handler) - where TEvent : class; - /// /// Registers to an event. /// A new instance of object is created for every event occurrence. diff --git a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Local/ILocalEventBus.cs b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Local/ILocalEventBus.cs index 7e81a363af..5640a4c17b 100644 --- a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Local/ILocalEventBus.cs +++ b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Local/ILocalEventBus.cs @@ -1,3 +1,5 @@ +using System; + namespace Volo.Abp.EventBus.Local { /// @@ -5,6 +7,13 @@ namespace Volo.Abp.EventBus.Local /// public interface ILocalEventBus : IEventBus { - + /// + /// Registers to an event. + /// Same (given) instance of the handler is used for all event occurrences. + /// + /// Event type + /// Object to handle the event + IDisposable Subscribe(ILocalEventHandler handler) + where TEvent : class; } } \ No newline at end of file diff --git a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Local/LocalEventBus.cs b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Local/LocalEventBus.cs index 31238961ae..ae1041c9e2 100644 --- a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Local/LocalEventBus.cs +++ b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Local/LocalEventBus.cs @@ -63,6 +63,12 @@ namespace Volo.Abp.EventBus.Local } } + /// + public virtual IDisposable Subscribe(ILocalEventHandler handler) where TEvent : class + { + return Subscribe(typeof(TEvent), handler); + } + /// public override IDisposable Subscribe(Type eventType, IEventHandlerFactory factory) { From faa014220a775f1cb9c626845525688580a03368 Mon Sep 17 00:00:00 2001 From: Halil ibrahim Kalkan Date: Mon, 3 Dec 2018 11:14:19 +0300 Subject: [PATCH 12/60] Added test counter. --- .../Volo/Abp/Testing/Utils/ITestCounter.cs | 13 ++++++ .../Volo/Abp/Testing/Utils/TestCounter.cs | 43 +++++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 framework/src/Volo.Abp.TestBase/Volo/Abp/Testing/Utils/ITestCounter.cs create mode 100644 framework/src/Volo.Abp.TestBase/Volo/Abp/Testing/Utils/TestCounter.cs diff --git a/framework/src/Volo.Abp.TestBase/Volo/Abp/Testing/Utils/ITestCounter.cs b/framework/src/Volo.Abp.TestBase/Volo/Abp/Testing/Utils/ITestCounter.cs new file mode 100644 index 0000000000..2764dcb24e --- /dev/null +++ b/framework/src/Volo.Abp.TestBase/Volo/Abp/Testing/Utils/ITestCounter.cs @@ -0,0 +1,13 @@ +namespace Volo.Abp.Testing.Utils +{ + public interface ITestCounter + { + int Add(string name, int count); + + int Decrement(string name); + + int Increment(string name); + + int GetValue(string name); + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.TestBase/Volo/Abp/Testing/Utils/TestCounter.cs b/framework/src/Volo.Abp.TestBase/Volo/Abp/Testing/Utils/TestCounter.cs new file mode 100644 index 0000000000..651a16836e --- /dev/null +++ b/framework/src/Volo.Abp.TestBase/Volo/Abp/Testing/Utils/TestCounter.cs @@ -0,0 +1,43 @@ +using System.Collections.Generic; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.Testing.Utils +{ + public class TestCounter : ITestCounter, ISingletonDependency + { + private readonly Dictionary _values; + + public TestCounter() + { + _values = new Dictionary(); + } + + public int Increment(string name) + { + return Add(name, 1); + } + + public int Decrement(string name) + { + return Add(name, -1); + } + + public int Add(string name, int count) + { + lock (_values) + { + var newValue = _values.GetOrDefault(name) + count; + _values[name] = newValue; + return newValue; + } + } + + public int GetValue(string name) + { + lock (_values) + { + return _values.GetOrDefault(name); + } + } + } +} From 08f50d0ff21df42ea3218a9bd30a7abebd326953 Mon Sep 17 00:00:00 2001 From: Halil ibrahim Kalkan Date: Mon, 3 Dec 2018 11:48:19 +0300 Subject: [PATCH 13/60] Refactor event bus and fix breaking code. --- .../Distributed/LocalDistributedEventBus.cs | 2 +- .../Volo/Abp/AbpIntegratedTest.cs | 2 + .../Volo/Abp/AbpTestBaseModule.cs | 8 +-- .../LocalDistributedEventBusTestBase.cs | 4 +- .../LocalDistributedEventBus_Test.cs | 8 +-- .../Volo/Abp/Identity/ProfileAppService.cs | 15 ++---- .../AbpIdentitySettingDefinitionProvider.cs | 4 +- .../Shared/PersonalSettingsModal.cshtml | 7 +-- .../Abp/Identity/ProfileAppService_Tests.cs | 2 - .../Identity/DistributedUserUpdateHandler.cs | 29 ++++++++++ .../Distributed_User_Change_Event_Tests.cs | 53 +++++++++++++++++++ ...bpIdentityEntityFrameworkCoreTestModule.cs | 1 - .../Identity/IdentityRoleRepository_Tests.cs | 1 - .../PermissionGrantCacheItemInvalidator.cs | 2 +- 14 files changed, 102 insertions(+), 36 deletions(-) create mode 100644 modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/DistributedUserUpdateHandler.cs create mode 100644 modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/Distributed_User_Change_Event_Tests.cs diff --git a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/LocalDistributedEventBus.cs b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/LocalDistributedEventBus.cs index c7b0cef7b1..ab23119642 100644 --- a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/LocalDistributedEventBus.cs +++ b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/LocalDistributedEventBus.cs @@ -10,7 +10,7 @@ namespace Volo.Abp.EventBus.Distributed { [Dependency(TryRegister = true)] [ExposeServices(typeof(IDistributedEventBus), typeof(LocalDistributedEventBus))] - public class LocalDistributedEventBus : IDistributedEventBus, ITransientDependency + public class LocalDistributedEventBus : IDistributedEventBus, ISingletonDependency { private readonly ILocalEventBus _localEventBus; protected IHybridServiceScopeFactory ServiceScopeFactory { get; } diff --git a/framework/src/Volo.Abp.TestBase/Volo/Abp/AbpIntegratedTest.cs b/framework/src/Volo.Abp.TestBase/Volo/Abp/AbpIntegratedTest.cs index ac969fd06b..587d0d52db 100644 --- a/framework/src/Volo.Abp.TestBase/Volo/Abp/AbpIntegratedTest.cs +++ b/framework/src/Volo.Abp.TestBase/Volo/Abp/AbpIntegratedTest.cs @@ -4,6 +4,8 @@ using Volo.Abp.Modularity; namespace Volo.Abp { + //TODO: Move to "Testing" namespace + public abstract class AbpIntegratedTest : AbpTestBaseWithServiceProvider, IDisposable where TStartupModule : IAbpModule { diff --git a/framework/src/Volo.Abp.TestBase/Volo/Abp/AbpTestBaseModule.cs b/framework/src/Volo.Abp.TestBase/Volo/Abp/AbpTestBaseModule.cs index d956149842..fc262f5447 100644 --- a/framework/src/Volo.Abp.TestBase/Volo/Abp/AbpTestBaseModule.cs +++ b/framework/src/Volo.Abp.TestBase/Volo/Abp/AbpTestBaseModule.cs @@ -1,13 +1,9 @@ -using Microsoft.Extensions.DependencyInjection; -using Volo.Abp.Modularity; +using Volo.Abp.Modularity; namespace Volo.Abp { public class AbpTestBaseModule : AbpModule { - public override void ConfigureServices(ServiceConfigurationContext context) - { - - } + } } diff --git a/framework/test/Volo.Abp.EventBus.Tests/Volo/Abp/EventBus/Distributed/LocalDistributedEventBusTestBase.cs b/framework/test/Volo.Abp.EventBus.Tests/Volo/Abp/EventBus/Distributed/LocalDistributedEventBusTestBase.cs index 45671715a3..d4e8df71aa 100644 --- a/framework/test/Volo.Abp.EventBus.Tests/Volo/Abp/EventBus/Distributed/LocalDistributedEventBusTestBase.cs +++ b/framework/test/Volo.Abp.EventBus.Tests/Volo/Abp/EventBus/Distributed/LocalDistributedEventBusTestBase.cs @@ -2,11 +2,11 @@ namespace Volo.Abp.EventBus.Distributed { public abstract class LocalDistributedEventBusTestBase : AbpIntegratedTest { - protected LocalDistributedEventBus LocalEventBus; + protected IDistributedEventBus DistributedEventBus; protected LocalDistributedEventBusTestBase() { - LocalEventBus = GetRequiredService(); + DistributedEventBus = GetRequiredService(); } protected override void SetAbpApplicationCreationOptions(AbpApplicationCreationOptions options) diff --git a/framework/test/Volo.Abp.EventBus.Tests/Volo/Abp/EventBus/Distributed/LocalDistributedEventBus_Test.cs b/framework/test/Volo.Abp.EventBus.Tests/Volo/Abp/EventBus/Distributed/LocalDistributedEventBus_Test.cs index 24dfbf357f..47649ad3c3 100644 --- a/framework/test/Volo.Abp.EventBus.Tests/Volo/Abp/EventBus/Distributed/LocalDistributedEventBus_Test.cs +++ b/framework/test/Volo.Abp.EventBus.Tests/Volo/Abp/EventBus/Distributed/LocalDistributedEventBus_Test.cs @@ -8,11 +8,11 @@ namespace Volo.Abp.EventBus.Distributed [Fact] public async Task Should_Call_Handler_AndDispose() { - LocalEventBus.Subscribe(); + DistributedEventBus.Subscribe(); - await LocalEventBus.PublishAsync(new MySimpleEventData(1)); - await LocalEventBus.PublishAsync(new MySimpleEventData(2)); - await LocalEventBus.PublishAsync(new MySimpleEventData(3)); + await DistributedEventBus.PublishAsync(new MySimpleEventData(1)); + await DistributedEventBus.PublishAsync(new MySimpleEventData(2)); + await DistributedEventBus.PublishAsync(new MySimpleEventData(3)); Assert.Equal(3, MySimpleDistributedTransientEventHandler.HandleCount); Assert.Equal(3, MySimpleDistributedTransientEventHandler.DisposeCount); diff --git a/modules/identity/src/Volo.Abp.Identity.Application/Volo/Abp/Identity/ProfileAppService.cs b/modules/identity/src/Volo.Abp.Identity.Application/Volo/Abp/Identity/ProfileAppService.cs index 444ccb34b1..5152738794 100644 --- a/modules/identity/src/Volo.Abp.Identity.Application/Volo/Abp/Identity/ProfileAppService.cs +++ b/modules/identity/src/Volo.Abp.Identity.Application/Volo/Abp/Identity/ProfileAppService.cs @@ -1,8 +1,8 @@ -using System; -using System.Threading.Tasks; +using System.Threading.Tasks; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Identity; using Volo.Abp.Identity.Settings; +using Volo.Abp.Settings; using Volo.Abp.Users; namespace Volo.Abp.Identity @@ -28,19 +28,12 @@ namespace Volo.Abp.Identity { var user = await _userManager.GetByIdAsync(CurrentUser.GetId()); - - var isUsernameUpdateEnabled = string.Equals(await (SettingManager.GetOrNullAsync(IdentitySettingNames.User.IsUserNameUpdateEnabled)), - "true", StringComparison.OrdinalIgnoreCase); - - if (isUsernameUpdateEnabled) + if (await SettingManager.IsTrueAsync(IdentitySettingNames.User.IsUserNameUpdateEnabled)) { (await _userManager.SetUserNameAsync(user, input.UserName)).CheckErrors(); } - var isEmailUpdateEnabled = !string.Equals(await (SettingManager.GetOrNullAsync(IdentitySettingNames.User.IsEmailUpdateEnabled)), - "true", StringComparison.OrdinalIgnoreCase); - - if (isEmailUpdateEnabled) + if (await SettingManager.IsTrueAsync(IdentitySettingNames.User.IsEmailUpdateEnabled)) { (await _userManager.SetEmailAsync(user, input.Email)).CheckErrors(); } diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/AbpIdentitySettingDefinitionProvider.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/AbpIdentitySettingDefinitionProvider.cs index 472dca8784..c5cbb16a1f 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/AbpIdentitySettingDefinitionProvider.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/AbpIdentitySettingDefinitionProvider.cs @@ -23,8 +23,8 @@ namespace Volo.Abp.Identity new SettingDefinition(IdentitySettingNames.SignIn.RequireConfirmedEmail), new SettingDefinition(IdentitySettingNames.SignIn.RequireConfirmedPhoneNumber), - new SettingDefinition(IdentitySettingNames.User.IsUserNameUpdateEnabled), - new SettingDefinition(IdentitySettingNames.User.IsEmailUpdateEnabled) + new SettingDefinition(IdentitySettingNames.User.IsUserNameUpdateEnabled, "true"), + new SettingDefinition(IdentitySettingNames.User.IsEmailUpdateEnabled, "true") ); } diff --git a/modules/identity/src/Volo.Abp.Identity.Web/Pages/Identity/Shared/PersonalSettingsModal.cshtml b/modules/identity/src/Volo.Abp.Identity.Web/Pages/Identity/Shared/PersonalSettingsModal.cshtml index 9da2cfe074..29a0600148 100644 --- a/modules/identity/src/Volo.Abp.Identity.Web/Pages/Identity/Shared/PersonalSettingsModal.cshtml +++ b/modules/identity/src/Volo.Abp.Identity.Web/Pages/Identity/Shared/PersonalSettingsModal.cshtml @@ -10,11 +10,8 @@ @inject ISettingManager SettingManager @{ Layout = null; - var isUserNameUpdateEnabled = string.Equals(await SettingManager.GetOrNullAsync(IdentitySettingNames.User.IsUserNameUpdateEnabled), "true", - StringComparison.OrdinalIgnoreCase); - - var isEmailUpdateEnabled = string.Equals(await SettingManager.GetOrNullAsync(IdentitySettingNames.User.IsEmailUpdateEnabled), "true", - StringComparison.OrdinalIgnoreCase); + var isUserNameUpdateEnabled = await SettingManager.IsTrueAsync(IdentitySettingNames.User.IsUserNameUpdateEnabled); + var isEmailUpdateEnabled = await SettingManager.IsTrueAsync(IdentitySettingNames.User.IsEmailUpdateEnabled); }
diff --git a/modules/identity/test/Volo.Abp.Identity.Application.Tests/Volo/Abp/Identity/ProfileAppService_Tests.cs b/modules/identity/test/Volo.Abp.Identity.Application.Tests/Volo/Abp/Identity/ProfileAppService_Tests.cs index 70f626ccbc..c1f0518b49 100644 --- a/modules/identity/test/Volo.Abp.Identity.Application.Tests/Volo/Abp/Identity/ProfileAppService_Tests.cs +++ b/modules/identity/test/Volo.Abp.Identity.Application.Tests/Volo/Abp/Identity/ProfileAppService_Tests.cs @@ -53,8 +53,6 @@ namespace Volo.Abp.Identity [Fact] public async Task UpdateAsync() { - //Arrange - //Arrange _currentUser.Id.Returns(_testData.UserJohnId); _currentUser.IsAuthenticated.Returns(true); diff --git a/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/DistributedUserUpdateHandler.cs b/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/DistributedUserUpdateHandler.cs new file mode 100644 index 0000000000..bf9a0260e9 --- /dev/null +++ b/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/DistributedUserUpdateHandler.cs @@ -0,0 +1,29 @@ +using System.Threading.Tasks; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Domain.Entities.Events.Distributed; +using Volo.Abp.EventBus.Distributed; +using Volo.Abp.Testing.Utils; +using Volo.Abp.Users; + +namespace Volo.Abp.Identity +{ + public class DistributedUserUpdateHandler : IDistributedEventHandler>, ITransientDependency + { + private readonly ITestCounter _testCounter; + + public DistributedUserUpdateHandler(ITestCounter testCounter) + { + _testCounter = testCounter; + } + + public Task HandleEventAsync(EntityUpdatedEto eventData) + { + if (eventData.Entity.UserName == "john.nash") + { + _testCounter.Increment("EntityUpdatedEto"); + } + + return Task.CompletedTask; + } + } +} \ No newline at end of file diff --git a/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/Distributed_User_Change_Event_Tests.cs b/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/Distributed_User_Change_Event_Tests.cs new file mode 100644 index 0000000000..221adca6d5 --- /dev/null +++ b/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/Distributed_User_Change_Event_Tests.cs @@ -0,0 +1,53 @@ +using System.Threading.Tasks; +using Microsoft.AspNetCore.Identity; +using Microsoft.Extensions.Options; +using Shouldly; +using Volo.Abp.EventBus.Distributed; +using Volo.Abp.Testing.Utils; +using Volo.Abp.Uow; +using Volo.Abp.Users; +using Xunit; + +namespace Volo.Abp.Identity +{ + public class Distributed_User_Change_Event_Tests : AbpIdentityDomainTestBase + { + private readonly IIdentityUserRepository _userRepository; + private readonly ILookupNormalizer _lookupNormalizer; + private readonly IdentityUserManager _userManager; + private readonly IUnitOfWorkManager _unitOfWorkManager; + private readonly ITestCounter _testCounter; + + public Distributed_User_Change_Event_Tests() + { + _userRepository = GetRequiredService(); + _userManager = GetRequiredService(); + _lookupNormalizer = GetRequiredService(); + _unitOfWorkManager = GetRequiredService(); + _testCounter = GetRequiredService(); + } + + [Fact] + public async Task Should_Register_Handler() + { + var options = GetRequiredService>().Value; + options.EtoMappings.ShouldContain(m => m.Key == typeof(IdentityUser) && m.Value == typeof(UserEto)); + options.Handlers.ShouldContain(h => h == typeof(DistributedUserUpdateHandler)); + } + + [Fact] + public async Task Should_Trigger_Distributed_EntityUpdated_Event() + { + using (var uow = _unitOfWorkManager.Begin()) + { + var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash")); + await _userManager.SetEmailAsync(user, "john.nash_UPDATED@abp.io"); + + _testCounter.GetValue("EntityUpdatedEto").ShouldBe(0); + await uow.CompleteAsync(); + } + + _testCounter.GetValue("EntityUpdatedEto").ShouldBe(1); + } + } +} diff --git a/modules/identity/test/Volo.Abp.Identity.EntityFrameworkCore.Tests/Volo/Abp/Identity/EntityFrameworkCore/AbpIdentityEntityFrameworkCoreTestModule.cs b/modules/identity/test/Volo.Abp.Identity.EntityFrameworkCore.Tests/Volo/Abp/Identity/EntityFrameworkCore/AbpIdentityEntityFrameworkCoreTestModule.cs index 9eb9fbd6d5..322f07e995 100644 --- a/modules/identity/test/Volo.Abp.Identity.EntityFrameworkCore.Tests/Volo/Abp/Identity/EntityFrameworkCore/AbpIdentityEntityFrameworkCoreTestModule.cs +++ b/modules/identity/test/Volo.Abp.Identity.EntityFrameworkCore.Tests/Volo/Abp/Identity/EntityFrameworkCore/AbpIdentityEntityFrameworkCoreTestModule.cs @@ -2,7 +2,6 @@ using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Storage; -using Microsoft.Extensions.DependencyInjection; using Volo.Abp.EntityFrameworkCore; using Volo.Abp.Modularity; using Volo.Abp.PermissionManagement.EntityFrameworkCore; diff --git a/modules/identity/test/Volo.Abp.Identity.TestBase/Volo/Abp/Identity/IdentityRoleRepository_Tests.cs b/modules/identity/test/Volo.Abp.Identity.TestBase/Volo/Abp/Identity/IdentityRoleRepository_Tests.cs index 5b06b4ae73..c753c1958b 100644 --- a/modules/identity/test/Volo.Abp.Identity.TestBase/Volo/Abp/Identity/IdentityRoleRepository_Tests.cs +++ b/modules/identity/test/Volo.Abp.Identity.TestBase/Volo/Abp/Identity/IdentityRoleRepository_Tests.cs @@ -4,7 +4,6 @@ using Microsoft.AspNetCore.Identity; using Microsoft.Extensions.DependencyInjection; using Shouldly; using Volo.Abp.Modularity; -using Volo.Abp.Uow; using Xunit; namespace Volo.Abp.Identity diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionGrantCacheItemInvalidator.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionGrantCacheItemInvalidator.cs index ea12b461fd..9e73e59b79 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionGrantCacheItemInvalidator.cs +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionGrantCacheItemInvalidator.cs @@ -7,7 +7,7 @@ using Volo.Abp.MultiTenancy; namespace Volo.Abp.PermissionManagement { - public class PermissionGrantCacheItemInvalidator : IEventHandler>, ITransientDependency + public class PermissionGrantCacheItemInvalidator : ILocalEventHandler>, ITransientDependency { protected ICurrentTenant CurrentTenant { get; } From 6a8832a8ab12e8d6d8c1dd2da79b24c6ed0fe4ba Mon Sep 17 00:00:00 2001 From: Halil ibrahim Kalkan Date: Mon, 3 Dec 2018 15:28:58 +0300 Subject: [PATCH 14/60] Improve UOW event order and add tests --- .../Volo/Abp/Uow/ChildUnitOfWork.cs | 4 ++ .../Volo.Abp.Uow/Volo/Abp/Uow/IUnitOfWork.cs | 4 ++ .../Volo.Abp.Uow/Volo/Abp/Uow/UnitOfWork.cs | 22 +++++----- .../Volo/Abp/Uow/UnitOfWorkManager.cs | 7 ++-- .../EntityFrameworkCoreTestBase.cs | 7 +--- .../Uow/Uow_Completed_Tests.cs | 9 +++++ .../Abp/MongoDB/Uow/Uow_Completed_Tests.cs | 9 +++++ .../TestApp/Testing/Uow_Completed_Tests.cs | 40 +++++++++++++++++++ 8 files changed, 84 insertions(+), 18 deletions(-) create mode 100644 framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/Uow/Uow_Completed_Tests.cs create mode 100644 framework/test/Volo.Abp.MongoDB.Tests/Volo/Abp/MongoDB/Uow/Uow_Completed_Tests.cs create mode 100644 framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Testing/Uow_Completed_Tests.cs diff --git a/framework/src/Volo.Abp.Uow/Volo/Abp/Uow/ChildUnitOfWork.cs b/framework/src/Volo.Abp.Uow/Volo/Abp/Uow/ChildUnitOfWork.cs index d46893d590..508fb1db4f 100644 --- a/framework/src/Volo.Abp.Uow/Volo/Abp/Uow/ChildUnitOfWork.cs +++ b/framework/src/Volo.Abp.Uow/Volo/Abp/Uow/ChildUnitOfWork.cs @@ -15,6 +15,10 @@ namespace Volo.Abp.Uow public bool IsReserved => _parent.IsReserved; + public bool IsDisposed => _parent.IsDisposed; + + public bool IsCompleted => _parent.IsCompleted; + public string ReservationName => _parent.ReservationName; public event EventHandler Failed; diff --git a/framework/src/Volo.Abp.Uow/Volo/Abp/Uow/IUnitOfWork.cs b/framework/src/Volo.Abp.Uow/Volo/Abp/Uow/IUnitOfWork.cs index 6fe2546965..cdf1a505b8 100644 --- a/framework/src/Volo.Abp.Uow/Volo/Abp/Uow/IUnitOfWork.cs +++ b/framework/src/Volo.Abp.Uow/Volo/Abp/Uow/IUnitOfWork.cs @@ -20,6 +20,10 @@ namespace Volo.Abp.Uow bool IsReserved { get; } + bool IsDisposed { get; } + + bool IsCompleted { get; } + string ReservationName { get; } void SetOuter([CanBeNull] IUnitOfWork outer); diff --git a/framework/src/Volo.Abp.Uow/Volo/Abp/Uow/UnitOfWork.cs b/framework/src/Volo.Abp.Uow/Volo/Abp/Uow/UnitOfWork.cs index 3f5a9cebf7..f6501ae833 100644 --- a/framework/src/Volo.Abp.Uow/Volo/Abp/Uow/UnitOfWork.cs +++ b/framework/src/Volo.Abp.Uow/Volo/Abp/Uow/UnitOfWork.cs @@ -18,6 +18,10 @@ namespace Volo.Abp.Uow public bool IsReserved { get; set; } + public bool IsDisposed { get; private set; } + + public bool IsCompleted { get; private set; } + public string ReservationName { get; set; } protected List> CompletedHandlers { get; } = new List>(); @@ -32,8 +36,7 @@ namespace Volo.Abp.Uow private readonly UnitOfWorkDefaultOptions _defaultOptions; private Exception _exception; - private bool _isCompleted; - private bool _isDisposed; + private bool _isCompleting; private bool _isRolledback; public UnitOfWork(IServiceProvider serviceProvider, IOptions options) @@ -101,8 +104,10 @@ namespace Volo.Abp.Uow try { + _isCompleting = true; SaveChanges(); CommitTransactions(); + IsCompleted = true; OnCompleted(); } catch (Exception ex) @@ -123,8 +128,10 @@ namespace Volo.Abp.Uow try { + _isCompleting = true; await SaveChangesAsync(cancellationToken); await CommitTransactionsAsync(); + IsCompleted = true; await OnCompletedAsync(); } catch (Exception ex) @@ -250,16 +257,16 @@ namespace Volo.Abp.Uow public virtual void Dispose() { - if (_isDisposed) + if (IsDisposed) { return; } - _isDisposed = true; + IsDisposed = true; DisposeTransactions(); - if (!_isCompleted || _exception != null) + if (!IsCompleted || _exception != null) { OnFailed(); } @@ -283,15 +290,12 @@ namespace Volo.Abp.Uow private void PreventMultipleComplete() { - if (_isCompleted) + if (IsCompleted || _isCompleting) { throw new AbpException("Complete is called before!"); } - - _isCompleted = true; } - protected virtual void RollbackAll() { foreach (var databaseApi in _databaseApis.Values) diff --git a/framework/src/Volo.Abp.Uow/Volo/Abp/Uow/UnitOfWorkManager.cs b/framework/src/Volo.Abp.Uow/Volo/Abp/Uow/UnitOfWorkManager.cs index 447a6c182e..4523f8f8f7 100644 --- a/framework/src/Volo.Abp.Uow/Volo/Abp/Uow/UnitOfWorkManager.cs +++ b/framework/src/Volo.Abp.Uow/Volo/Abp/Uow/UnitOfWorkManager.cs @@ -23,9 +23,10 @@ namespace Volo.Abp.Uow { Check.NotNull(options, nameof(options)); - if (!requiresNew && _ambientUnitOfWork.UnitOfWork != null && !_ambientUnitOfWork.UnitOfWork.IsReserved) + var currentUow = Current; + if (currentUow != null && !requiresNew) { - return new ChildUnitOfWork(_ambientUnitOfWork.UnitOfWork); + return new ChildUnitOfWork(currentUow); } var unitOfWork = CreateNewUnitOfWork(); @@ -86,7 +87,7 @@ namespace Volo.Abp.Uow var uow = _ambientUnitOfWork.UnitOfWork; //Skip reserved unit of work - while (uow != null && uow.IsReserved) + while (uow != null && (uow.IsReserved || uow.IsDisposed || uow.IsCompleted)) { uow = uow.Outer; } diff --git a/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/EntityFrameworkCoreTestBase.cs b/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/EntityFrameworkCoreTestBase.cs index 17480a6f48..87bd7cfc28 100644 --- a/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/EntityFrameworkCoreTestBase.cs +++ b/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/EntityFrameworkCoreTestBase.cs @@ -1,9 +1,4 @@ -using System; -using System.Threading.Tasks; -using Microsoft.Extensions.DependencyInjection; -using Volo.Abp.Uow; - -namespace Volo.Abp.EntityFrameworkCore +namespace Volo.Abp.EntityFrameworkCore { public abstract class EntityFrameworkCoreTestBase : AbpIntegratedTest { diff --git a/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/Uow/Uow_Completed_Tests.cs b/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/Uow/Uow_Completed_Tests.cs new file mode 100644 index 0000000000..f7e5019467 --- /dev/null +++ b/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/Uow/Uow_Completed_Tests.cs @@ -0,0 +1,9 @@ +using Volo.Abp.TestApp.Testing; + +namespace Volo.Abp.EntityFrameworkCore.Uow +{ + public class Uow_Completed_Tests : Uow_Completed_Tests + { + + } +} \ No newline at end of file diff --git a/framework/test/Volo.Abp.MongoDB.Tests/Volo/Abp/MongoDB/Uow/Uow_Completed_Tests.cs b/framework/test/Volo.Abp.MongoDB.Tests/Volo/Abp/MongoDB/Uow/Uow_Completed_Tests.cs new file mode 100644 index 0000000000..4773644885 --- /dev/null +++ b/framework/test/Volo.Abp.MongoDB.Tests/Volo/Abp/MongoDB/Uow/Uow_Completed_Tests.cs @@ -0,0 +1,9 @@ +using Volo.Abp.TestApp.Testing; + +namespace Volo.Abp.MongoDB.Uow +{ + public class Uow_Completed_Tests : Uow_Completed_Tests + { + + } +} \ No newline at end of file diff --git a/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Testing/Uow_Completed_Tests.cs b/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Testing/Uow_Completed_Tests.cs new file mode 100644 index 0000000000..1b169bbe97 --- /dev/null +++ b/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Testing/Uow_Completed_Tests.cs @@ -0,0 +1,40 @@ +using System; +using System.Threading.Tasks; +using Volo.Abp.Modularity; +using Volo.Abp.TestApp.Domain; +using Volo.Abp.Uow; +using Xunit; + +namespace Volo.Abp.TestApp.Testing +{ + public abstract class Uow_Completed_Tests : TestAppTestBase + where TStartupModule : IAbpModule + { + private readonly IUnitOfWorkManager _unitOfWorkManager; + private readonly ICityRepository _cityRepository; + + protected Uow_Completed_Tests() + { + _unitOfWorkManager = GetRequiredService(); + _cityRepository = GetRequiredService(); + } + + [Fact] + public async Task Should_Be_Able_To_Perform_Database_Operation_On_Uow_Complete() + { + using (var uow = _unitOfWorkManager.Begin()) + { + //Perform an arbitrary database operation + await _cityRepository.InsertAsync(new City(Guid.NewGuid(), Guid.NewGuid().ToString())); + + uow.OnCompleted(async () => + { + //Perform another database operation inside the OnCompleted handler + await _cityRepository.InsertAsync(new City(Guid.NewGuid(), Guid.NewGuid().ToString())); + }); + + await uow.CompleteAsync(); + } + } + } +} From 6501b4d8117d056a533c1004ede4f20d40a640f5 Mon Sep 17 00:00:00 2001 From: Halil ibrahim Kalkan Date: Mon, 3 Dec 2018 16:34:18 +0300 Subject: [PATCH 15/60] Resolved #590: Memory leak while checking background jobs periodically. --- .../BackgroundJobs/BackgroundJobExecuter.cs | 58 +++++++-------- .../Abp/BackgroundJobs/JobExecutionContext.cs | 8 +- .../Hangfire/HangfireBackgroundJobManager.cs | 13 +++- .../Hangfire/HangfireJobExecutionAdapter.cs | 19 +++-- .../Abp/BackgroundJobs/RabbitMQ/JobQueue.cs | 46 +++++++----- .../Abp/BackgroundJobs/BackgroundJobWorker.cs | 74 ++++++++++--------- .../BackgroundJobExecuter_Tests.cs | 1 + 7 files changed, 125 insertions(+), 94 deletions(-) diff --git a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobExecuter.cs b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobExecuter.cs index fb66702186..59352bc892 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobExecuter.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobExecuter.cs @@ -1,8 +1,7 @@ -using System; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Options; +using System; using Volo.Abp.DependencyInjection; namespace Volo.Abp.BackgroundJobs @@ -11,14 +10,10 @@ namespace Volo.Abp.BackgroundJobs { public ILogger Logger { protected get; set; } - protected IServiceProvider ServiceProvider { get; } protected BackgroundJobOptions Options { get; } - public BackgroundJobExecuter( - IServiceProvider serviceProvider, - IOptions options) + public BackgroundJobExecuter(IOptions options) { - ServiceProvider = serviceProvider; Options = options.Value; Logger = NullLogger.Instance; @@ -26,34 +21,31 @@ namespace Volo.Abp.BackgroundJobs public virtual void Execute(JobExecutionContext context) { - using (var scope = ServiceProvider.CreateScope()) + var job = context.ServiceProvider.GetService(context.JobType); + if (job == null) { - var job = scope.ServiceProvider.GetService(context.JobType); - if (job == null) - { - throw new AbpException("The job type is not registered to DI: " + context.JobType); - } + throw new AbpException("The job type is not registered to DI: " + context.JobType); + } - var jobExecuteMethod = context.JobType.GetMethod(nameof(IBackgroundJob.Execute)); - if (jobExecuteMethod == null) - { - throw new AbpException($"Given job type does not implement {typeof(IBackgroundJob<>).Name}. The job type was: " + context.JobType); - } - - try - { - jobExecuteMethod.Invoke(job, new[] { context.JobArgs }); - } - catch (Exception ex) + var jobExecuteMethod = context.JobType.GetMethod(nameof(IBackgroundJob.Execute)); + if (jobExecuteMethod == null) + { + throw new AbpException($"Given job type does not implement {typeof(IBackgroundJob<>).Name}. The job type was: " + context.JobType); + } + + try + { + jobExecuteMethod.Invoke(job, new[] { context.JobArgs }); + } + catch (Exception ex) + { + Logger.LogException(ex); + + throw new BackgroundJobExecutionException("A background job execution is failed. See inner exception for details.", ex) { - Logger.LogException(ex); - - throw new BackgroundJobExecutionException("A background job execution is failed. See inner exception for details.", ex) - { - JobType = context.JobType.AssemblyQualifiedName, - JobArgs = context.JobArgs - }; - } + JobType = context.JobType.AssemblyQualifiedName, + JobArgs = context.JobArgs + }; } } } diff --git a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/JobExecutionContext.cs b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/JobExecutionContext.cs index 7cdeed85bf..0f00b2ca36 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/JobExecutionContext.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/JobExecutionContext.cs @@ -1,15 +1,19 @@ using System; +using Volo.Abp.DependencyInjection; namespace Volo.Abp.BackgroundJobs { - public class JobExecutionContext + public class JobExecutionContext : IServiceProviderAccessor { + public IServiceProvider ServiceProvider { get; } + public Type JobType { get; } public object JobArgs { get; } - public JobExecutionContext(Type jobType, object jobArgs) + public JobExecutionContext(IServiceProvider serviceProvider, Type jobType, object jobArgs) { + ServiceProvider = serviceProvider; JobType = jobType; JobArgs = jobArgs; } diff --git a/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/HangfireBackgroundJobManager.cs b/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/HangfireBackgroundJobManager.cs index 2813aa92a1..48b2dea666 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/HangfireBackgroundJobManager.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/HangfireBackgroundJobManager.cs @@ -13,11 +13,20 @@ namespace Volo.Abp.BackgroundJobs.Hangfire { if (!delay.HasValue) { - return Task.FromResult(BackgroundJob.Enqueue>(adapter => adapter.Execute(args))); + return Task.FromResult( + BackgroundJob.Enqueue>( + adapter => adapter.Execute(args) + ) + ); } else { - return Task.FromResult(BackgroundJob.Schedule>(adapter => adapter.Execute(args), delay.Value)); + return Task.FromResult( + BackgroundJob.Schedule>( + adapter => adapter.Execute(args), + delay.Value + ) + ); } } } diff --git a/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/HangfireJobExecutionAdapter.cs b/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/HangfireJobExecutionAdapter.cs index c1858dc2b7..96c3b1ee0b 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/HangfireJobExecutionAdapter.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/HangfireJobExecutionAdapter.cs @@ -1,23 +1,32 @@ -using Microsoft.Extensions.Options; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Options; namespace Volo.Abp.BackgroundJobs.Hangfire { public class HangfireJobExecutionAdapter { protected BackgroundJobOptions Options { get; } + protected IServiceScopeFactory ServiceScopeFactory { get; } protected IBackgroundJobExecuter JobExecuter { get; } - public HangfireJobExecutionAdapter(IOptions options, IBackgroundJobExecuter jobExecuter) + public HangfireJobExecutionAdapter( + IOptions options, + IBackgroundJobExecuter jobExecuter, + IServiceScopeFactory serviceScopeFactory) { JobExecuter = jobExecuter; + ServiceScopeFactory = serviceScopeFactory; Options = options.Value; } public void Execute(TArgs args) { - var jobType = Options.GetJob(typeof(TArgs)).JobType; - var context = new JobExecutionContext(jobType, args); - JobExecuter.Execute(context); + using (var scope = ServiceScopeFactory.CreateScope()) + { + var jobType = Options.GetJob(typeof(TArgs)).JobType; + var context = new JobExecutionContext(scope.ServiceProvider, jobType, args); + JobExecuter.Execute(context); + } } } } 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 38a9b2a121..e1f5da512c 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 @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Options; @@ -28,6 +29,7 @@ namespace Volo.Abp.BackgroundJobs.RabbitMQ protected IChannelPool ChannelPool { get; } protected IRabbitMqSerializer Serializer { get; } protected IBackgroundJobExecuter JobExecuter { get; } + protected IServiceScopeFactory ServiceScopeFactory { get; } protected AsyncLock SyncObj = new AsyncLock(); protected bool IsDiposed { get; private set; } @@ -37,12 +39,14 @@ namespace Volo.Abp.BackgroundJobs.RabbitMQ IOptions rabbitMqBackgroundJobOptions, IChannelPool channelPool, IRabbitMqSerializer serializer, - IBackgroundJobExecuter jobExecuter) + IBackgroundJobExecuter jobExecuter, + IServiceScopeFactory serviceScopeFactory) { BackgroundJobOptions = backgroundJobOptions.Value; RabbitMqBackgroundJobOptions = rabbitMqBackgroundJobOptions.Value; Serializer = serializer; JobExecuter = jobExecuter; + ServiceScopeFactory = serviceScopeFactory; ChannelPool = channelPool; JobConfiguration = BackgroundJobOptions.GetJob(typeof(TArgs)); @@ -167,25 +171,29 @@ namespace Volo.Abp.BackgroundJobs.RabbitMQ protected virtual void MessageReceived(object sender, BasicDeliverEventArgs ea) { - var context = new JobExecutionContext( - JobConfiguration.JobType, - Serializer.Deserialize(ea.Body, typeof(TArgs)) - ); - - try - { - JobExecuter.Execute(context); - ChannelAccessor.Channel.BasicAck(deliveryTag: ea.DeliveryTag, multiple: false); - } - catch (BackgroundJobExecutionException) + using (var scope = ServiceScopeFactory.CreateScope()) { - //TODO: Reject like that? - ChannelAccessor.Channel.BasicReject(deliveryTag: ea.DeliveryTag, requeue: true); - } - catch (Exception) - { - //TODO: Reject like that? - ChannelAccessor.Channel.BasicReject(deliveryTag: ea.DeliveryTag, requeue: false); + var context = new JobExecutionContext( + scope.ServiceProvider, + JobConfiguration.JobType, + Serializer.Deserialize(ea.Body, typeof(TArgs)) + ); + + try + { + JobExecuter.Execute(context); + ChannelAccessor.Channel.BasicAck(deliveryTag: ea.DeliveryTag, multiple: false); + } + catch (BackgroundJobExecutionException) + { + //TODO: Reject like that? + ChannelAccessor.Channel.BasicReject(deliveryTag: ea.DeliveryTag, requeue: true); + } + catch (Exception) + { + //TODO: Reject like that? + ChannelAccessor.Channel.BasicReject(deliveryTag: ea.DeliveryTag, requeue: false); + } } } diff --git a/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/BackgroundJobWorker.cs b/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/BackgroundJobWorker.cs index 964f076714..6aeead724d 100644 --- a/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/BackgroundJobWorker.cs +++ b/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/BackgroundJobWorker.cs @@ -1,4 +1,5 @@ using System; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Volo.Abp.BackgroundWorkers; @@ -11,26 +12,26 @@ namespace Volo.Abp.BackgroundJobs public class BackgroundJobWorker : PeriodicBackgroundWorkerBase, IBackgroundJobWorker, ISingletonDependency { protected IBackgroundJobExecuter JobExecuter { get; } - protected IBackgroundJobStore Store { get; } protected BackgroundJobOptions JobOptions { get; } protected BackgroundJobWorkerOptions WorkerOptions { get; } protected IClock Clock { get; } protected IBackgroundJobSerializer Serializer { get; } + protected IServiceScopeFactory ServiceScopeFactory { get; } public BackgroundJobWorker( - IBackgroundJobStore store, AbpTimer timer, IBackgroundJobExecuter jobExecuter, IBackgroundJobSerializer serializer, IOptions jobOptions, IOptions workerOptions, - IClock clock) + IClock clock, + IServiceScopeFactory serviceScopeFactory) : base(timer) { JobExecuter = jobExecuter; Serializer = serializer; Clock = clock; - Store = store; + ServiceScopeFactory = serviceScopeFactory; WorkerOptions = workerOptions.Value; JobOptions = jobOptions.Value; Timer.Period = WorkerOptions.JobPollPeriod; @@ -38,53 +39,60 @@ namespace Volo.Abp.BackgroundJobs protected override void DoWork() { - var waitingJobs = AsyncHelper.RunSync(() => Store.GetWaitingJobsAsync(WorkerOptions.MaxJobFetchCount)); - - foreach (var jobInfo in waitingJobs) + using (var scope = ServiceScopeFactory.CreateScope()) { - jobInfo.TryCount++; - jobInfo.LastTryTime = Clock.Now; + var store = scope.ServiceProvider.GetRequiredService(); + + var waitingJobs = AsyncHelper.RunSync( + () => store.GetWaitingJobsAsync(WorkerOptions.MaxJobFetchCount) + ); - try + foreach (var jobInfo in waitingJobs) { - var jobConfiguration = JobOptions.GetJob(jobInfo.JobName); - var jobArgs = Serializer.Deserialize(jobInfo.JobArgs, jobConfiguration.ArgsType); - var context = new JobExecutionContext(jobConfiguration.JobType, jobArgs); + jobInfo.TryCount++; + jobInfo.LastTryTime = Clock.Now; try { - JobExecuter.Execute(context); - AsyncHelper.RunSync(() => Store.DeleteAsync(jobInfo.Id)); - } - catch (BackgroundJobExecutionException) - { - var nextTryTime = CalculateNextTryTime(jobInfo); - if (nextTryTime.HasValue) + var jobConfiguration = JobOptions.GetJob(jobInfo.JobName); + var jobArgs = Serializer.Deserialize(jobInfo.JobArgs, jobConfiguration.ArgsType); + var context = new JobExecutionContext(scope.ServiceProvider, jobConfiguration.JobType, jobArgs); + + try { - jobInfo.NextTryTime = nextTryTime.Value; + JobExecuter.Execute(context); + AsyncHelper.RunSync(() => store.DeleteAsync(jobInfo.Id)); } - else + catch (BackgroundJobExecutionException) { - jobInfo.IsAbandoned = true; - } + var nextTryTime = CalculateNextTryTime(jobInfo); + if (nextTryTime.HasValue) + { + jobInfo.NextTryTime = nextTryTime.Value; + } + else + { + jobInfo.IsAbandoned = true; + } - TryUpdate(jobInfo); + TryUpdate(store, jobInfo); + } + } + catch (Exception ex) + { + Logger.LogException(ex); + jobInfo.IsAbandoned = true; + TryUpdate(store, jobInfo); } - } - catch (Exception ex) - { - Logger.LogException(ex); - jobInfo.IsAbandoned = true; - TryUpdate(jobInfo); } } } - protected virtual void TryUpdate(BackgroundJobInfo jobInfo) + protected virtual void TryUpdate(IBackgroundJobStore store, BackgroundJobInfo jobInfo) { try { - Store.UpdateAsync(jobInfo); + store.UpdateAsync(jobInfo); } catch (Exception updateEx) { diff --git a/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/BackgroundJobExecuter_Tests.cs b/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/BackgroundJobExecuter_Tests.cs index 2affc47d97..566c69c318 100644 --- a/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/BackgroundJobExecuter_Tests.cs +++ b/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/BackgroundJobExecuter_Tests.cs @@ -25,6 +25,7 @@ namespace Volo.Abp.BackgroundJobs _backgroundJobExecuter.Execute( new JobExecutionContext( + ServiceProvider, typeof(MyJob), new MyJobArgs("42") ) From 59b5e68eeb5a9f150219f8e072669b3f1704537b Mon Sep 17 00:00:00 2001 From: Halil ibrahim Kalkan Date: Tue, 4 Dec 2018 09:15:26 +0300 Subject: [PATCH 16/60] Upgrade BookStore to v0.8.0. --- .../Acme.BookStore.Application.csproj | 2 +- .../BookAppService.cs | 15 +++ .../Acme.BookStore.Domain.csproj | 2 +- .../Acme.BookStore.EntityFrameworkCore.csproj | 13 ++- ....cs => 20181204060805_Initial.Designer.cs} | 65 ++++++++--- ...4_Initial.cs => 20181204060805_Initial.cs} | 40 ++++++- ...204060902_Created_Book_Entity.Designer.cs} | 104 ++++++++++++++++-- ... => 20181204060902_Created_Book_Entity.cs} | 0 .../BookStoreDbContextModelSnapshot.cs | 65 ++++++++++- .../Acme.BookStore.Web.csproj | 8 +- .../Acme.BookStore.Application.Tests.csproj | 4 +- .../Acme.BookStore.Web.Tests.csproj | 2 +- 12 files changed, 277 insertions(+), 43 deletions(-) rename samples/BookStore/src/Acme.BookStore.EntityFrameworkCore/Migrations/{20180703184727_Created_Book_Entity.Designer.cs => 20181204060805_Initial.Designer.cs} (88%) rename samples/BookStore/src/Acme.BookStore.EntityFrameworkCore/Migrations/{20180528221424_Initial.cs => 20181204060805_Initial.cs} (85%) rename samples/BookStore/src/Acme.BookStore.EntityFrameworkCore/Migrations/{20180528221424_Initial.Designer.cs => 20181204060902_Created_Book_Entity.Designer.cs} (78%) rename samples/BookStore/src/Acme.BookStore.EntityFrameworkCore/Migrations/{20180703184727_Created_Book_Entity.cs => 20181204060902_Created_Book_Entity.cs} (100%) diff --git a/samples/BookStore/src/Acme.BookStore.Application/Acme.BookStore.Application.csproj b/samples/BookStore/src/Acme.BookStore.Application/Acme.BookStore.Application.csproj index 0a0bac1ff4..7f8acd52f5 100644 --- a/samples/BookStore/src/Acme.BookStore.Application/Acme.BookStore.Application.csproj +++ b/samples/BookStore/src/Acme.BookStore.Application/Acme.BookStore.Application.csproj @@ -7,7 +7,7 @@ - + diff --git a/samples/BookStore/src/Acme.BookStore.Application/BookAppService.cs b/samples/BookStore/src/Acme.BookStore.Application/BookAppService.cs index 1d5e844f30..9534ab7f12 100644 --- a/samples/BookStore/src/Acme.BookStore.Application/BookAppService.cs +++ b/samples/BookStore/src/Acme.BookStore.Application/BookAppService.cs @@ -1,4 +1,5 @@ using System; +using System.Threading.Tasks; using Volo.Abp.Application.Dtos; using Volo.Abp.Application.Services; using Volo.Abp.Domain.Repositories; @@ -15,5 +16,19 @@ namespace Acme.BookStore { } + + public override async Task UpdateAsync(Guid id, CreateUpdateBookDto input) + { + await CheckUpdatePolicyAsync(); + + var entity = await GetEntityByIdAsync(id); + + //TODO: Check if input has id different than given id and normalize if it's default value, throw ex otherwise + + MapToEntity(input, entity); + await CurrentUnitOfWork.SaveChangesAsync(); + + return MapToEntityDto(entity); + } } } \ No newline at end of file diff --git a/samples/BookStore/src/Acme.BookStore.Domain/Acme.BookStore.Domain.csproj b/samples/BookStore/src/Acme.BookStore.Domain/Acme.BookStore.Domain.csproj index cc4a6a3931..87a8e297b3 100644 --- a/samples/BookStore/src/Acme.BookStore.Domain/Acme.BookStore.Domain.csproj +++ b/samples/BookStore/src/Acme.BookStore.Domain/Acme.BookStore.Domain.csproj @@ -6,7 +6,7 @@ - + diff --git a/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore/Acme.BookStore.EntityFrameworkCore.csproj b/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore/Acme.BookStore.EntityFrameworkCore.csproj index 2fd61caefe..44fb8928f6 100644 --- a/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore/Acme.BookStore.EntityFrameworkCore.csproj +++ b/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore/Acme.BookStore.EntityFrameworkCore.csproj @@ -5,6 +5,11 @@ Acme.BookStore + + + + + @@ -12,10 +17,10 @@ - - - - + + + + diff --git a/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore/Migrations/20180703184727_Created_Book_Entity.Designer.cs b/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore/Migrations/20181204060805_Initial.Designer.cs similarity index 88% rename from samples/BookStore/src/Acme.BookStore.EntityFrameworkCore/Migrations/20180703184727_Created_Book_Entity.Designer.cs rename to samples/BookStore/src/Acme.BookStore.EntityFrameworkCore/Migrations/20181204060805_Initial.Designer.cs index 417f22f978..c9ae3e5b0a 100644 --- a/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore/Migrations/20180703184727_Created_Book_Entity.Designer.cs +++ b/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore/Migrations/20181204060805_Initial.Designer.cs @@ -10,8 +10,8 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion; namespace Acme.BookStore.Migrations { [DbContext(typeof(BookStoreDbContext))] - [Migration("20180703184727_Created_Book_Entity")] - partial class Created_Book_Entity + [Migration("20181204060805_Initial")] + partial class Initial { protected override void BuildTargetModel(ModelBuilder modelBuilder) { @@ -21,32 +21,33 @@ namespace Acme.BookStore.Migrations .HasAnnotation("Relational:MaxIdentifierLength", 128) .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); - modelBuilder.Entity("Acme.BookStore.Book", b => + modelBuilder.Entity("Volo.Abp.Identity.IdentityClaimType", b => { b.Property("Id") .ValueGeneratedOnAdd(); - b.Property("CreationTime"); - - b.Property("CreatorId"); - - b.Property("LastModificationTime"); + b.Property("Description") + .HasMaxLength(256); - b.Property("LastModifierId"); + b.Property("IsStatic"); b.Property("Name") .IsRequired() - .HasMaxLength(128); + .HasMaxLength(256); - b.Property("Price"); + b.Property("Regex") + .HasMaxLength(512); - b.Property("PublishDate"); + b.Property("RegexDescription") + .HasMaxLength(128); + + b.Property("Required"); - b.Property("Type"); + b.Property("ValueType"); b.HasKey("Id"); - b.ToTable("Books"); + b.ToTable("AbpClaimTypes"); }); modelBuilder.Entity("Volo.Abp.Identity.IdentityRole", b => @@ -56,6 +57,15 @@ namespace Acme.BookStore.Migrations b.Property("ConcurrencyStamp"); + b.Property("IsDefault") + .HasColumnName("IsDefault"); + + b.Property("IsPublic") + .HasColumnName("IsPublic"); + + b.Property("IsStatic") + .HasColumnName("IsStatic"); + b.Property("Name") .IsRequired() .HasMaxLength(256); @@ -111,6 +121,14 @@ namespace Acme.BookStore.Migrations .HasColumnName("ConcurrencyStamp") .HasMaxLength(256); + b.Property("CreationTime"); + + b.Property("CreatorId"); + + b.Property("DeleterId"); + + b.Property("DeletionTime"); + b.Property("Email") .HasColumnName("Email") .HasMaxLength(256); @@ -123,6 +141,12 @@ namespace Acme.BookStore.Migrations b.Property("ExtraProperties") .HasColumnName("ExtraProperties"); + b.Property("IsDeleted"); + + b.Property("LastModificationTime"); + + b.Property("LastModifierId"); + b.Property("LockoutEnabled") .ValueGeneratedOnAdd() .HasColumnName("LockoutEnabled") @@ -130,6 +154,10 @@ namespace Acme.BookStore.Migrations b.Property("LockoutEnd"); + b.Property("Name") + .HasColumnName("Name") + .HasMaxLength(64); + b.Property("NormalizedEmail") .HasColumnName("NormalizedEmail") .HasMaxLength(256); @@ -157,6 +185,10 @@ namespace Acme.BookStore.Migrations .HasColumnName("SecurityStamp") .HasMaxLength(256); + b.Property("Surname") + .HasColumnName("Surname") + .HasMaxLength(64); + b.Property("TenantId") .HasColumnName("TenantId"); @@ -249,9 +281,10 @@ namespace Acme.BookStore.Migrations b.Property("UserId"); b.Property("LoginProvider") - .HasMaxLength(128); + .HasMaxLength(64); - b.Property("Name"); + b.Property("Name") + .HasMaxLength(128); b.Property("TenantId"); diff --git a/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore/Migrations/20180528221424_Initial.cs b/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore/Migrations/20181204060805_Initial.cs similarity index 85% rename from samples/BookStore/src/Acme.BookStore.EntityFrameworkCore/Migrations/20180528221424_Initial.cs rename to samples/BookStore/src/Acme.BookStore.EntityFrameworkCore/Migrations/20181204060805_Initial.cs index 7722e7bd64..237dc43192 100644 --- a/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore/Migrations/20180528221424_Initial.cs +++ b/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore/Migrations/20181204060805_Initial.cs @@ -1,5 +1,4 @@ using System; -using System.Collections.Generic; using Microsoft.EntityFrameworkCore.Migrations; namespace Acme.BookStore.Migrations @@ -8,6 +7,24 @@ namespace Acme.BookStore.Migrations { protected override void Up(MigrationBuilder migrationBuilder) { + migrationBuilder.CreateTable( + name: "AbpClaimTypes", + columns: table => new + { + Id = table.Column(nullable: false), + Name = table.Column(maxLength: 256, nullable: false), + Required = table.Column(nullable: false), + IsStatic = table.Column(nullable: false), + Regex = table.Column(maxLength: 512, nullable: true), + RegexDescription = table.Column(maxLength: 128, nullable: true), + Description = table.Column(maxLength: 256, nullable: true), + ValueType = table.Column(nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpClaimTypes", x => x.Id); + }); + migrationBuilder.CreateTable( name: "AbpPermissionGrants", columns: table => new @@ -31,7 +48,10 @@ namespace Acme.BookStore.Migrations TenantId = table.Column(nullable: true), Name = table.Column(maxLength: 256, nullable: false), NormalizedName = table.Column(maxLength: 256, nullable: false), - ConcurrencyStamp = table.Column(nullable: true) + ConcurrencyStamp = table.Column(nullable: true), + IsDefault = table.Column(nullable: false), + IsStatic = table.Column(nullable: false), + IsPublic = table.Column(nullable: false) }, constraints: table => { @@ -58,9 +78,18 @@ namespace Acme.BookStore.Migrations columns: table => new { Id = table.Column(nullable: false), + CreationTime = table.Column(nullable: false), + CreatorId = table.Column(nullable: true), + LastModificationTime = table.Column(nullable: true), + LastModifierId = table.Column(nullable: true), + IsDeleted = table.Column(nullable: false), + DeleterId = table.Column(nullable: true), + DeletionTime = table.Column(nullable: true), TenantId = table.Column(nullable: true), UserName = table.Column(maxLength: 256, nullable: false), NormalizedUserName = table.Column(maxLength: 256, nullable: false), + Name = table.Column(maxLength: 64, nullable: true), + Surname = table.Column(maxLength: 64, nullable: true), Email = table.Column(maxLength: 256, nullable: true), NormalizedEmail = table.Column(maxLength: 256, nullable: true), EmailConfirmed = table.Column(nullable: false, defaultValue: false), @@ -174,8 +203,8 @@ namespace Acme.BookStore.Migrations { TenantId = table.Column(nullable: true), UserId = table.Column(nullable: false), - LoginProvider = table.Column(maxLength: 128, nullable: false), - Name = table.Column(nullable: false), + LoginProvider = table.Column(maxLength: 64, nullable: false), + Name = table.Column(maxLength: 128, nullable: false), Value = table.Column(nullable: true) }, constraints: table => @@ -247,6 +276,9 @@ namespace Acme.BookStore.Migrations protected override void Down(MigrationBuilder migrationBuilder) { + migrationBuilder.DropTable( + name: "AbpClaimTypes"); + migrationBuilder.DropTable( name: "AbpPermissionGrants"); diff --git a/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore/Migrations/20180528221424_Initial.Designer.cs b/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore/Migrations/20181204060902_Created_Book_Entity.Designer.cs similarity index 78% rename from samples/BookStore/src/Acme.BookStore.EntityFrameworkCore/Migrations/20180528221424_Initial.Designer.cs rename to samples/BookStore/src/Acme.BookStore.EntityFrameworkCore/Migrations/20181204060902_Created_Book_Entity.Designer.cs index 89843d2d16..5e6cc3ac1e 100644 --- a/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore/Migrations/20180528221424_Initial.Designer.cs +++ b/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore/Migrations/20181204060902_Created_Book_Entity.Designer.cs @@ -1,27 +1,83 @@ // using System; -using System.Collections.Generic; +using Acme.BookStore.EntityFrameworkCore; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Metadata; -using Microsoft.EntityFrameworkCore.Metadata.Internal; using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Acme.BookStore.EntityFrameworkCore; namespace Acme.BookStore.Migrations { [DbContext(typeof(BookStoreDbContext))] - [Migration("20180528221424_Initial")] - partial class Initial + [Migration("20181204060902_Created_Book_Entity")] + partial class Created_Book_Entity { protected override void BuildTargetModel(ModelBuilder modelBuilder) { #pragma warning disable 612, 618 modelBuilder - .HasAnnotation("ProductVersion", "2.1.0-preview2-30571") + .HasAnnotation("ProductVersion", "2.1.1-rtm-30846") + .HasAnnotation("Relational:MaxIdentifierLength", 128) .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + modelBuilder.Entity("Acme.BookStore.Book", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("CreationTime"); + + b.Property("CreatorId"); + + b.Property("LastModificationTime"); + + b.Property("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128); + + b.Property("Price"); + + b.Property("PublishDate"); + + b.Property("Type"); + + b.HasKey("Id"); + + b.ToTable("Books"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityClaimType", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Description") + .HasMaxLength(256); + + b.Property("IsStatic"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(256); + + b.Property("Regex") + .HasMaxLength(512); + + b.Property("RegexDescription") + .HasMaxLength(128); + + b.Property("Required"); + + b.Property("ValueType"); + + b.HasKey("Id"); + + b.ToTable("AbpClaimTypes"); + }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityRole", b => { b.Property("Id") @@ -29,6 +85,15 @@ namespace Acme.BookStore.Migrations b.Property("ConcurrencyStamp"); + b.Property("IsDefault") + .HasColumnName("IsDefault"); + + b.Property("IsPublic") + .HasColumnName("IsPublic"); + + b.Property("IsStatic") + .HasColumnName("IsStatic"); + b.Property("Name") .IsRequired() .HasMaxLength(256); @@ -84,6 +149,14 @@ namespace Acme.BookStore.Migrations .HasColumnName("ConcurrencyStamp") .HasMaxLength(256); + b.Property("CreationTime"); + + b.Property("CreatorId"); + + b.Property("DeleterId"); + + b.Property("DeletionTime"); + b.Property("Email") .HasColumnName("Email") .HasMaxLength(256); @@ -96,6 +169,12 @@ namespace Acme.BookStore.Migrations b.Property("ExtraProperties") .HasColumnName("ExtraProperties"); + b.Property("IsDeleted"); + + b.Property("LastModificationTime"); + + b.Property("LastModifierId"); + b.Property("LockoutEnabled") .ValueGeneratedOnAdd() .HasColumnName("LockoutEnabled") @@ -103,6 +182,10 @@ namespace Acme.BookStore.Migrations b.Property("LockoutEnd"); + b.Property("Name") + .HasColumnName("Name") + .HasMaxLength(64); + b.Property("NormalizedEmail") .HasColumnName("NormalizedEmail") .HasMaxLength(256); @@ -130,6 +213,10 @@ namespace Acme.BookStore.Migrations .HasColumnName("SecurityStamp") .HasMaxLength(256); + b.Property("Surname") + .HasColumnName("Surname") + .HasMaxLength(64); + b.Property("TenantId") .HasColumnName("TenantId"); @@ -222,9 +309,10 @@ namespace Acme.BookStore.Migrations b.Property("UserId"); b.Property("LoginProvider") - .HasMaxLength(128); + .HasMaxLength(64); - b.Property("Name"); + b.Property("Name") + .HasMaxLength(128); b.Property("TenantId"); diff --git a/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore/Migrations/20180703184727_Created_Book_Entity.cs b/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore/Migrations/20181204060902_Created_Book_Entity.cs similarity index 100% rename from samples/BookStore/src/Acme.BookStore.EntityFrameworkCore/Migrations/20180703184727_Created_Book_Entity.cs rename to samples/BookStore/src/Acme.BookStore.EntityFrameworkCore/Migrations/20181204060902_Created_Book_Entity.cs diff --git a/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore/Migrations/BookStoreDbContextModelSnapshot.cs b/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore/Migrations/BookStoreDbContextModelSnapshot.cs index 122a306295..e3bd17d745 100644 --- a/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore/Migrations/BookStoreDbContextModelSnapshot.cs +++ b/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore/Migrations/BookStoreDbContextModelSnapshot.cs @@ -47,6 +47,35 @@ namespace Acme.BookStore.Migrations b.ToTable("Books"); }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityClaimType", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Description") + .HasMaxLength(256); + + b.Property("IsStatic"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(256); + + b.Property("Regex") + .HasMaxLength(512); + + b.Property("RegexDescription") + .HasMaxLength(128); + + b.Property("Required"); + + b.Property("ValueType"); + + b.HasKey("Id"); + + b.ToTable("AbpClaimTypes"); + }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityRole", b => { b.Property("Id") @@ -54,6 +83,15 @@ namespace Acme.BookStore.Migrations b.Property("ConcurrencyStamp"); + b.Property("IsDefault") + .HasColumnName("IsDefault"); + + b.Property("IsPublic") + .HasColumnName("IsPublic"); + + b.Property("IsStatic") + .HasColumnName("IsStatic"); + b.Property("Name") .IsRequired() .HasMaxLength(256); @@ -109,6 +147,14 @@ namespace Acme.BookStore.Migrations .HasColumnName("ConcurrencyStamp") .HasMaxLength(256); + b.Property("CreationTime"); + + b.Property("CreatorId"); + + b.Property("DeleterId"); + + b.Property("DeletionTime"); + b.Property("Email") .HasColumnName("Email") .HasMaxLength(256); @@ -121,6 +167,12 @@ namespace Acme.BookStore.Migrations b.Property("ExtraProperties") .HasColumnName("ExtraProperties"); + b.Property("IsDeleted"); + + b.Property("LastModificationTime"); + + b.Property("LastModifierId"); + b.Property("LockoutEnabled") .ValueGeneratedOnAdd() .HasColumnName("LockoutEnabled") @@ -128,6 +180,10 @@ namespace Acme.BookStore.Migrations b.Property("LockoutEnd"); + b.Property("Name") + .HasColumnName("Name") + .HasMaxLength(64); + b.Property("NormalizedEmail") .HasColumnName("NormalizedEmail") .HasMaxLength(256); @@ -155,6 +211,10 @@ namespace Acme.BookStore.Migrations .HasColumnName("SecurityStamp") .HasMaxLength(256); + b.Property("Surname") + .HasColumnName("Surname") + .HasMaxLength(64); + b.Property("TenantId") .HasColumnName("TenantId"); @@ -247,9 +307,10 @@ namespace Acme.BookStore.Migrations b.Property("UserId"); b.Property("LoginProvider") - .HasMaxLength(128); + .HasMaxLength(64); - b.Property("Name"); + b.Property("Name") + .HasMaxLength(128); b.Property("TenantId"); diff --git a/samples/BookStore/src/Acme.BookStore.Web/Acme.BookStore.Web.csproj b/samples/BookStore/src/Acme.BookStore.Web/Acme.BookStore.Web.csproj index 148c445622..5cfa52f2c8 100644 --- a/samples/BookStore/src/Acme.BookStore.Web/Acme.BookStore.Web.csproj +++ b/samples/BookStore/src/Acme.BookStore.Web/Acme.BookStore.Web.csproj @@ -27,10 +27,10 @@ - - - - + + + + diff --git a/samples/BookStore/test/Acme.BookStore.Application.Tests/Acme.BookStore.Application.Tests.csproj b/samples/BookStore/test/Acme.BookStore.Application.Tests/Acme.BookStore.Application.Tests.csproj index 7a1b5d1ae9..fe3b577dc5 100644 --- a/samples/BookStore/test/Acme.BookStore.Application.Tests/Acme.BookStore.Application.Tests.csproj +++ b/samples/BookStore/test/Acme.BookStore.Application.Tests/Acme.BookStore.Application.Tests.csproj @@ -8,8 +8,8 @@ - - + + diff --git a/samples/BookStore/test/Acme.BookStore.Web.Tests/Acme.BookStore.Web.Tests.csproj b/samples/BookStore/test/Acme.BookStore.Web.Tests/Acme.BookStore.Web.Tests.csproj index d5b5e468b4..c10970a304 100644 --- a/samples/BookStore/test/Acme.BookStore.Web.Tests/Acme.BookStore.Web.Tests.csproj +++ b/samples/BookStore/test/Acme.BookStore.Web.Tests/Acme.BookStore.Web.Tests.csproj @@ -15,7 +15,7 @@ - + From 89fe6f20cdae55f63d301cac232b1ffbe2c15b1a Mon Sep 17 00:00:00 2001 From: Halil ibrahim Kalkan Date: Tue, 4 Dec 2018 09:27:20 +0300 Subject: [PATCH 17/60] Resolved #579: Remove disabling ChangeTracker.AutoDetectChangesEnabled --- .../Volo/Abp/EntityFrameworkCore/AbpDbContext.cs | 8 -------- 1 file changed, 8 deletions(-) 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 87c9ec6153..b5860824cc 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpDbContext.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpDbContext.cs @@ -84,12 +84,8 @@ namespace Volo.Abp.EntityFrameworkCore //TODO: Reduce duplications with SaveChangesAsync //TODO: Instead of adding entity changes to audit log, write them to uow and add to audit log only if uow succeed - ChangeTracker.DetectChanges(); - try { - ChangeTracker.AutoDetectChangesEnabled = false; //TODO: Why this is needed? - var auditLog = AuditingManager?.Current?.Log; List entityChangeList = null; @@ -124,12 +120,8 @@ namespace Volo.Abp.EntityFrameworkCore public override async Task SaveChangesAsync(bool acceptAllChangesOnSuccess, CancellationToken cancellationToken = default) { - ChangeTracker.DetectChanges(); - try { - ChangeTracker.AutoDetectChangesEnabled = false; //TODO: Why this is needed? - var auditLog = AuditingManager?.Current?.Log; List entityChangeList = null; From 1a8076cc605db10a0060a9e22a81334b27489d62 Mon Sep 17 00:00:00 2001 From: Halil ibrahim Kalkan Date: Tue, 4 Dec 2018 10:50:40 +0300 Subject: [PATCH 18/60] Added MVC validation test. --- .../Volo/Abp/Validation/AbpValidationException.cs | 2 +- .../Volo/Abp/Validation/IHasValidationErrors.cs | 2 +- .../Abp/AspNetCore/Mvc/AbpAspNetCoreMvcTestModule.cs | 8 +++++++- .../Abp/AspNetCore/Mvc/Localization/Resource/en.json | 3 ++- .../Abp/AspNetCore/Mvc/Localization/Resource/tr.json | 3 ++- .../Mvc/Validation/ValidationTestController_Tests.cs | 12 ++++++++++++ 6 files changed, 25 insertions(+), 5 deletions(-) diff --git a/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/AbpValidationException.cs b/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/AbpValidationException.cs index 57d4202aa2..8ef50ce9f7 100644 --- a/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/AbpValidationException.cs +++ b/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/AbpValidationException.cs @@ -20,7 +20,7 @@ namespace Volo.Abp.Validation /// /// Detailed list of validation errors for this exception. /// - public IList ValidationErrors { get; set; } + public IList ValidationErrors { get; } /// /// Exception severity. diff --git a/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/IHasValidationErrors.cs b/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/IHasValidationErrors.cs index 67cbbc908d..f7d4b2fe92 100644 --- a/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/IHasValidationErrors.cs +++ b/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/IHasValidationErrors.cs @@ -5,6 +5,6 @@ namespace Volo.Abp.Validation { public interface IHasValidationErrors { - IList ValidationErrors { get; set; } + IList ValidationErrors { get; } } } \ No newline at end of file diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcTestModule.cs b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcTestModule.cs index ad2b532816..94e020a365 100644 --- a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcTestModule.cs +++ b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcTestModule.cs @@ -1,4 +1,5 @@ using System; +using Localization.Resources.AbpUi; using Microsoft.AspNetCore.Builder; using Microsoft.Extensions.DependencyInjection; using Volo.Abp.AspNetCore.Modularity; @@ -9,9 +10,11 @@ using Volo.Abp.AspNetCore.TestBase; using Volo.Abp.Authorization.Permissions; using Volo.Abp.Autofac; using Volo.Abp.Localization; +using Volo.Abp.Localization.Resources.AbpValidation; using Volo.Abp.MemoryDb; using Volo.Abp.Modularity; using Volo.Abp.TestApp; +using Volo.Abp.UI; using Volo.Abp.VirtualFileSystem; namespace Volo.Abp.AspNetCore.Mvc @@ -70,7 +73,10 @@ namespace Volo.Abp.AspNetCore.Mvc { options.Resources .Add("en") - .AddVirtualJson("/Volo/Abp/AspNetCore/Mvc/Localization/Resource"); + .AddBaseTypes( + typeof(AbpUiResource), + typeof(AbpValidationResource) + ).AddVirtualJson("/Volo/Abp/AspNetCore/Mvc/Localization/Resource"); }); } diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Localization/Resource/en.json b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Localization/Resource/en.json index fb353b16d6..2451c1b294 100644 --- a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Localization/Resource/en.json +++ b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Localization/Resource/en.json @@ -1,6 +1,7 @@ { "culture": "en", "texts": { - "BirthDate": "Birth date" + "BirthDate": "Birth date", + "Value1": "Value One" } } \ No newline at end of file diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Localization/Resource/tr.json b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Localization/Resource/tr.json index 21c274bd42..546e672ede 100644 --- a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Localization/Resource/tr.json +++ b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Localization/Resource/tr.json @@ -1,6 +1,7 @@ { "culture": "tr", "texts": { - "BirthDate": "Dogum gunu" + "BirthDate": "Dogum gunu", + "Value1": "Değer Bir" } } \ No newline at end of file diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Validation/ValidationTestController_Tests.cs b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Validation/ValidationTestController_Tests.cs index fb9381babc..19a4bcd608 100644 --- a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Validation/ValidationTestController_Tests.cs +++ b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Validation/ValidationTestController_Tests.cs @@ -2,6 +2,7 @@ using System.Threading.Tasks; using Shouldly; using Volo.Abp.Http; +using Volo.Abp.Localization; using Xunit; namespace Volo.Abp.AspNetCore.Mvc.Validation @@ -22,6 +23,17 @@ namespace Volo.Abp.AspNetCore.Mvc.Validation result.Error.ValidationErrors.Length.ShouldBeGreaterThan(0); } + [Fact] + public async Task Should_Return_Localized_Validation_Errors() + { + using (AbpCultureHelper.Use("tr")) + { + var result = await GetResponseAsObjectAsync("/api/validation-test/object-result-action?value1=a", HttpStatusCode.BadRequest); //value1 has min length of 2 chars. + result.Error.ValidationErrors.Length.ShouldBeGreaterThan(0); + result.Error.ValidationErrors[0].Message.ShouldBe("Değer Bir alanı en az '2' uzunluğunda bir metin ya da dizi olmalıdır."); + } + } + [Fact] public async Task Should_Not_Validate_Action_Result_Success() { From 399e46e36153d9e8c52c8a17bcbd3d33383c871a Mon Sep 17 00:00:00 2001 From: Halil ibrahim Kalkan Date: Tue, 4 Dec 2018 11:19:18 +0300 Subject: [PATCH 19/60] Add AbpController.ValidateModel() --- .../Volo/Abp/AspNetCore/Mvc/AbpController.cs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AbpController.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AbpController.cs index 2202e70cd1..e9e535c4be 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AbpController.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AbpController.cs @@ -4,6 +4,7 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; using Volo.Abp.Aspects; +using Volo.Abp.AspNetCore.Mvc.Validation; using Volo.Abp.Guids; using Volo.Abp.MultiTenancy; using Volo.Abp.ObjectMapping; @@ -31,8 +32,15 @@ namespace Volo.Abp.AspNetCore.Mvc public IClock Clock { get; set; } + public IModelStateValidator ModelValidator { get; set; } + public List AppliedCrossCuttingConcerns { get; } = new List(); + protected virtual void ValidateModel() + { + ModelValidator?.Validate(ModelState); + } + protected ILogger Logger => _lazyLogger.Value; private Lazy _lazyLogger => new Lazy(() => LoggerFactory?.CreateLogger(GetType().FullName) ?? NullLogger.Instance, true); } From 5a1c67a5542954fd5e1fe52e2b64b99c9ebda131 Mon Sep 17 00:00:00 2001 From: Halil ibrahim Kalkan Date: Tue, 4 Dec 2018 14:40:47 +0300 Subject: [PATCH 20/60] Created AbpSettingManagementWebModule --- .../Volo.Abp.SettingManagement.sln | 15 +++++--- .../AbpSettingManagementWebModule.cs | 13 +++++++ .../ISettingPageContributor.cs | 9 +++++ .../Pages/SettingManagement/Index.cshtml | 9 +++++ .../Pages/SettingManagement/Index.cshtml.cs | 28 +++++++++++++++ .../SettingManagementPageOptions.cs | 14 ++++++++ .../SettingPageCreationContext.cs | 14 ++++++++ .../SettingManagement/SettingPageGroup.cs | 36 +++++++++++++++++++ .../Properties/launchSettings.json | 27 ++++++++++++++ .../Volo.Abp.SettingManagement.Web.csproj | 13 +++++++ 10 files changed, 174 insertions(+), 4 deletions(-) create mode 100644 modules/setting-management/src/Volo.Abp.SettingManagement.Web/AbpSettingManagementWebModule.cs create mode 100644 modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/ISettingPageContributor.cs create mode 100644 modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/Index.cshtml create mode 100644 modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/Index.cshtml.cs create mode 100644 modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/SettingManagementPageOptions.cs create mode 100644 modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/SettingPageCreationContext.cs create mode 100644 modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/SettingPageGroup.cs create mode 100644 modules/setting-management/src/Volo.Abp.SettingManagement.Web/Properties/launchSettings.json create mode 100644 modules/setting-management/src/Volo.Abp.SettingManagement.Web/Volo.Abp.SettingManagement.Web.csproj diff --git a/modules/setting-management/Volo.Abp.SettingManagement.sln b/modules/setting-management/Volo.Abp.SettingManagement.sln index fc870e1e80..54a63cb48a 100644 --- a/modules/setting-management/Volo.Abp.SettingManagement.sln +++ b/modules/setting-management/Volo.Abp.SettingManagement.sln @@ -15,13 +15,15 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{7E8D2943-A EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.SettingManagement.Tests", "test\Volo.Abp.SettingManagement.Tests\Volo.Abp.SettingManagement.Tests.csproj", "{E8335ADC-D09E-4B74-8190-45A9FAF962CA}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.SettingManagement.MongoDB", "src\Volo.Abp.SettingManagement.MongoDB\Volo.Abp.SettingManagement.MongoDB.csproj", "{7615D255-FB8F-49F0-81C0-F2E69F7F0CB7}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.SettingManagement.MongoDB", "src\Volo.Abp.SettingManagement.MongoDB\Volo.Abp.SettingManagement.MongoDB.csproj", "{7615D255-FB8F-49F0-81C0-F2E69F7F0CB7}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.SettingManagement.TestBase", "test\Volo.Abp.SettingManagement.TestBase\Volo.Abp.SettingManagement.TestBase.csproj", "{D4A2DCB2-FA6A-43DC-9469-B6CDAA7EB489}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.SettingManagement.TestBase", "test\Volo.Abp.SettingManagement.TestBase\Volo.Abp.SettingManagement.TestBase.csproj", "{D4A2DCB2-FA6A-43DC-9469-B6CDAA7EB489}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.SettingManagement.EntityFrameworkCore.Tests", "test\Volo.Abp.SettingManagement.EntityFrameworkCore.Tests\Volo.Abp.SettingManagement.EntityFrameworkCore.Tests.csproj", "{AFF6A7B6-A80B-4569-9F6B-CD6C72EAB6D4}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.SettingManagement.EntityFrameworkCore.Tests", "test\Volo.Abp.SettingManagement.EntityFrameworkCore.Tests\Volo.Abp.SettingManagement.EntityFrameworkCore.Tests.csproj", "{AFF6A7B6-A80B-4569-9F6B-CD6C72EAB6D4}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.SettingManagement.MongoDB.Tests", "test\Volo.Abp.SettingManagement.MongoDB.Tests\Volo.Abp.SettingManagement.MongoDB.Tests.csproj", "{DF76DE74-1029-4FEA-8ADF-3C5636944757}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.SettingManagement.MongoDB.Tests", "test\Volo.Abp.SettingManagement.MongoDB.Tests\Volo.Abp.SettingManagement.MongoDB.Tests.csproj", "{DF76DE74-1029-4FEA-8ADF-3C5636944757}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.SettingManagement.Web", "src\Volo.Abp.SettingManagement.Web\Volo.Abp.SettingManagement.Web.csproj", "{AF6BE46D-AC88-4DEF-BBEC-F60A00847D43}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -61,6 +63,10 @@ Global {DF76DE74-1029-4FEA-8ADF-3C5636944757}.Debug|Any CPU.Build.0 = Debug|Any CPU {DF76DE74-1029-4FEA-8ADF-3C5636944757}.Release|Any CPU.ActiveCfg = Release|Any CPU {DF76DE74-1029-4FEA-8ADF-3C5636944757}.Release|Any CPU.Build.0 = Release|Any CPU + {AF6BE46D-AC88-4DEF-BBEC-F60A00847D43}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AF6BE46D-AC88-4DEF-BBEC-F60A00847D43}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AF6BE46D-AC88-4DEF-BBEC-F60A00847D43}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AF6BE46D-AC88-4DEF-BBEC-F60A00847D43}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -74,6 +80,7 @@ Global {D4A2DCB2-FA6A-43DC-9469-B6CDAA7EB489} = {7E8D2943-ADE7-4C89-8048-0780CE07E0E0} {AFF6A7B6-A80B-4569-9F6B-CD6C72EAB6D4} = {7E8D2943-ADE7-4C89-8048-0780CE07E0E0} {DF76DE74-1029-4FEA-8ADF-3C5636944757} = {7E8D2943-ADE7-4C89-8048-0780CE07E0E0} + {AF6BE46D-AC88-4DEF-BBEC-F60A00847D43} = {F1BE945B-F0CF-4712-BC2B-9AF8C02059EA} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {24B3A486-E7CA-4AA5-B76F-27D351A97E59} diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Web/AbpSettingManagementWebModule.cs b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/AbpSettingManagementWebModule.cs new file mode 100644 index 0000000000..387c7c3de9 --- /dev/null +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/AbpSettingManagementWebModule.cs @@ -0,0 +1,13 @@ +using Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared; +using Volo.Abp.Modularity; + +namespace Volo.Abp.SettingManagement.Web +{ + [DependsOn( + typeof(AbpAspNetCoreMvcUiThemeSharedModule) + )] + public class AbpSettingManagementWebModule : AbpModule + { + + } +} diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/ISettingPageContributor.cs b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/ISettingPageContributor.cs new file mode 100644 index 0000000000..e641ee2ade --- /dev/null +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/ISettingPageContributor.cs @@ -0,0 +1,9 @@ +using System.Threading.Tasks; + +namespace Volo.Abp.SettingManagement.Web.Pages.SettingManagement +{ + public interface ISettingPageContributor + { + Task ConfigureAsync(SettingPageCreationContext context); + } +} \ No newline at end of file diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/Index.cshtml b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/Index.cshtml new file mode 100644 index 0000000000..19ac5145a7 --- /dev/null +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/Index.cshtml @@ -0,0 +1,9 @@ +@page +@model Volo.Abp.SettingManagement.Web.Pages.SettingManagement.IndexModel +@foreach (var group in Model.SettingPageCreationContext.Groups) +{ +

@group.DisplayName

+
+ @await Component.InvokeAsync(group.ComponentType) +
+} \ No newline at end of file diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/Index.cshtml.cs b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/Index.cshtml.cs new file mode 100644 index 0000000000..057d929ebf --- /dev/null +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/Index.cshtml.cs @@ -0,0 +1,28 @@ +using System.Threading.Tasks; +using Microsoft.Extensions.Options; +using Volo.Abp.AspNetCore.Mvc.UI.RazorPages; + +namespace Volo.Abp.SettingManagement.Web.Pages.SettingManagement +{ + public class IndexModel : AbpPageModel + { + public SettingPageCreationContext SettingPageCreationContext { get; private set; } + + private readonly SettingManagementPageOptions _options; + + public IndexModel(IOptions options) + { + _options = options.Value; + } + + public async Task OnGetAsync() + { + SettingPageCreationContext = new SettingPageCreationContext(); + + foreach (var contributor in _options.Contributors) + { + await contributor.ConfigureAsync(SettingPageCreationContext); + } + } + } +} \ No newline at end of file diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/SettingManagementPageOptions.cs b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/SettingManagementPageOptions.cs new file mode 100644 index 0000000000..7dc50af16f --- /dev/null +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/SettingManagementPageOptions.cs @@ -0,0 +1,14 @@ +using System.Collections.Generic; + +namespace Volo.Abp.SettingManagement.Web.Pages.SettingManagement +{ + public class SettingManagementPageOptions + { + public List Contributors { get; } + + public SettingManagementPageOptions() + { + Contributors = new List(); + } + } +} diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/SettingPageCreationContext.cs b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/SettingPageCreationContext.cs new file mode 100644 index 0000000000..f67eda6e2c --- /dev/null +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/SettingPageCreationContext.cs @@ -0,0 +1,14 @@ +using System.Collections.Generic; + +namespace Volo.Abp.SettingManagement.Web.Pages.SettingManagement +{ + public class SettingPageCreationContext + { + public List Groups { get; } + + public SettingPageCreationContext() + { + Groups = new List(); + } + } +} \ No newline at end of file diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/SettingPageGroup.cs b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/SettingPageGroup.cs new file mode 100644 index 0000000000..5acd284267 --- /dev/null +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/SettingPageGroup.cs @@ -0,0 +1,36 @@ +using System; +using JetBrains.Annotations; + +namespace Volo.Abp.SettingManagement.Web.Pages.SettingManagement +{ + public class SettingPageGroup + { + public string Id + { + get => _id; + set => _id = Check.NotNullOrWhiteSpace(value, nameof(Id)); + } + private string _id; + + public string DisplayName + { + get => _displayName; + set => _displayName = Check.NotNullOrWhiteSpace(value, nameof(DisplayName)); + } + private string _displayName; + + public Type ComponentType + { + get => _componentType; + set => _componentType = Check.NotNull(value, nameof(ComponentType)); + } + private Type _componentType; + + public SettingPageGroup([NotNull] string id, [NotNull] string displayName, [NotNull] Type componentType) + { + Id = id; + DisplayName = displayName; + ComponentType = componentType; + } + } +} \ No newline at end of file diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Properties/launchSettings.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Properties/launchSettings.json new file mode 100644 index 0000000000..844334b642 --- /dev/null +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Properties/launchSettings.json @@ -0,0 +1,27 @@ +{ + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:62272/", + "sslPort": 0 + } + }, + "profiles": { + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "Volo.Abp.SettingManagement.Web": { + "commandName": "Project", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + }, + "applicationUrl": "http://localhost:62273/" + } + } +} \ No newline at end of file diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Volo.Abp.SettingManagement.Web.csproj b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Volo.Abp.SettingManagement.Web.csproj new file mode 100644 index 0000000000..310ac9056a --- /dev/null +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Volo.Abp.SettingManagement.Web.csproj @@ -0,0 +1,13 @@ + + + + netstandard2.0 + Library + true + + + + + + + From 39d2b6c685f25994efb901bc31510b51823b63b9 Mon Sep 17 00:00:00 2001 From: Halil ibrahim Kalkan Date: Tue, 4 Dec 2018 15:21:58 +0300 Subject: [PATCH 21/60] Setting management web page initial version --- .../AbpSettingManagementWebModule.cs | 14 ++++++++ .../SettingManagementMainMenuContributor.cs | 33 +++++++++++++++++++ .../Pages/SettingManagement/Index.cshtml.cs | 9 +++-- .../SettingPageCreationContext.cs | 12 +++++-- .../Volo.Abp.SettingManagement.Web.csproj | 15 +++++++++ 5 files changed, 78 insertions(+), 5 deletions(-) create mode 100644 modules/setting-management/src/Volo.Abp.SettingManagement.Web/Navigation/SettingManagementMainMenuContributor.cs diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Web/AbpSettingManagementWebModule.cs b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/AbpSettingManagementWebModule.cs index 387c7c3de9..b10d3c69c3 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Web/AbpSettingManagementWebModule.cs +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/AbpSettingManagementWebModule.cs @@ -1,5 +1,8 @@ using Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared; using Volo.Abp.Modularity; +using Volo.Abp.SettingManagement.Web.Navigation; +using Volo.Abp.UI.Navigation; +using Volo.Abp.VirtualFileSystem; namespace Volo.Abp.SettingManagement.Web { @@ -8,6 +11,17 @@ namespace Volo.Abp.SettingManagement.Web )] public class AbpSettingManagementWebModule : AbpModule { + public override void ConfigureServices(ServiceConfigurationContext context) + { + Configure(options => + { + options.MenuContributors.Add(new SettingManagementMainMenuContributor()); + }); + Configure(options => + { + options.FileSets.AddEmbedded("Volo.Abp.SettingManagement.Web"); + }); + } } } diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Navigation/SettingManagementMainMenuContributor.cs b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Navigation/SettingManagementMainMenuContributor.cs new file mode 100644 index 0000000000..9706ec4d15 --- /dev/null +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Navigation/SettingManagementMainMenuContributor.cs @@ -0,0 +1,33 @@ +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Options; +using System.Linq; +using System.Threading.Tasks; +using Volo.Abp.SettingManagement.Web.Pages.SettingManagement; +using Volo.Abp.UI.Navigation; + +namespace Volo.Abp.SettingManagement.Web.Navigation +{ + public class SettingManagementMainMenuContributor : IMenuContributor + { + public Task ConfigureMenuAsync(MenuConfigurationContext context) + { + if (context.Menu.Name != StandardMenus.Main) + { + return Task.CompletedTask; + } + + var settingManagementPageOptions = context.ServiceProvider.GetRequiredService>().Value; + if (!settingManagementPageOptions.Contributors.Any()) + { + return Task.CompletedTask; + } + + //TODO: Localize + //var l = context.ServiceProvider.GetRequiredService>(); + + context.Menu.AddItem(new ApplicationMenuItem("Volo.Abp.SettingManagement", "Settings", "/SettingManagement", icon: "fa fa-cog", order: int.MaxValue - 1000)); + + return Task.CompletedTask; + } + } +} diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/Index.cshtml.cs b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/Index.cshtml.cs index 057d929ebf..1fdba05707 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/Index.cshtml.cs +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/Index.cshtml.cs @@ -1,3 +1,4 @@ +using System; using System.Threading.Tasks; using Microsoft.Extensions.Options; using Volo.Abp.AspNetCore.Mvc.UI.RazorPages; @@ -9,15 +10,19 @@ namespace Volo.Abp.SettingManagement.Web.Pages.SettingManagement public SettingPageCreationContext SettingPageCreationContext { get; private set; } private readonly SettingManagementPageOptions _options; + private readonly IServiceProvider _serviceProvider; - public IndexModel(IOptions options) + public IndexModel( + IOptions options, + IServiceProvider serviceProvider) { + _serviceProvider = serviceProvider; _options = options.Value; } public async Task OnGetAsync() { - SettingPageCreationContext = new SettingPageCreationContext(); + SettingPageCreationContext = new SettingPageCreationContext(_serviceProvider); foreach (var contributor in _options.Contributors) { diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/SettingPageCreationContext.cs b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/SettingPageCreationContext.cs index f67eda6e2c..b8979e9299 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/SettingPageCreationContext.cs +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/SettingPageCreationContext.cs @@ -1,13 +1,19 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; +using Volo.Abp.DependencyInjection; namespace Volo.Abp.SettingManagement.Web.Pages.SettingManagement { - public class SettingPageCreationContext + public class SettingPageCreationContext : IServiceProviderAccessor { + public IServiceProvider ServiceProvider { get; } + public List Groups { get; } - public SettingPageCreationContext() + public SettingPageCreationContext(IServiceProvider serviceProvider) { + ServiceProvider = serviceProvider; + Groups = new List(); } } diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Volo.Abp.SettingManagement.Web.csproj b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Volo.Abp.SettingManagement.Web.csproj index 310ac9056a..d6398d1391 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Volo.Abp.SettingManagement.Web.csproj +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Volo.Abp.SettingManagement.Web.csproj @@ -10,4 +10,19 @@ + + + + + + + + + + + + + + + From a50f1341f11ebf154af83e63ea16e528393d8118 Mon Sep 17 00:00:00 2001 From: Halil ibrahim Kalkan Date: Tue, 4 Dec 2018 16:34:37 +0300 Subject: [PATCH 22/60] Added js to setting management page --- .../Pages/SettingManagement/Index.cshtml | 8 +++++++- .../Pages/SettingManagement/Index.js | 7 +++++++ .../Pages/SettingManagement/_ViewImports.cshtml | 4 ++++ 3 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/Index.js create mode 100644 modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/_ViewImports.cshtml diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/Index.cshtml b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/Index.cshtml index 19ac5145a7..283c926a9a 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/Index.cshtml +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/Index.cshtml @@ -1,5 +1,11 @@ @page -@model Volo.Abp.SettingManagement.Web.Pages.SettingManagement.IndexModel +@using Volo.Abp.SettingManagement.Web.Pages.SettingManagement +@model IndexModel +@section scripts { + + + +} @foreach (var group in Model.SettingPageCreationContext.Groups) {

@group.DisplayName

diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/Index.js b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/Index.js new file mode 100644 index 0000000000..bda42b30c0 --- /dev/null +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/Index.js @@ -0,0 +1,7 @@ +(function($) { + + $(function() { + console.log('loaded setting management page'); + }); + +})(jQuery); \ No newline at end of file diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/_ViewImports.cshtml b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/_ViewImports.cshtml new file mode 100644 index 0000000000..c1da1f5f10 --- /dev/null +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/_ViewImports.cshtml @@ -0,0 +1,4 @@ +@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers +@addTagHelper *, Volo.Abp.AspNetCore.Mvc.UI +@addTagHelper *, Volo.Abp.AspNetCore.Mvc.UI.Bootstrap +@addTagHelper *, Volo.Abp.AspNetCore.Mvc.UI.Bundling \ No newline at end of file From 765183b7adc4536b7668613747deca1b338d1402 Mon Sep 17 00:00:00 2001 From: Halil ibrahim Kalkan Date: Tue, 4 Dec 2018 16:46:45 +0300 Subject: [PATCH 23/60] Set default values for Identity settings --- .../AbpIdentitySettingDefinitionProvider.cs | 24 +++++++++---------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/AbpIdentitySettingDefinitionProvider.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/AbpIdentitySettingDefinitionProvider.cs index c5cbb16a1f..d63db23c61 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/AbpIdentitySettingDefinitionProvider.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/AbpIdentitySettingDefinitionProvider.cs @@ -8,24 +8,22 @@ namespace Volo.Abp.Identity public override void Define(ISettingDefinitionContext context) { context.Add( + new SettingDefinition(IdentitySettingNames.Password.RequiredLength, "6"), + new SettingDefinition(IdentitySettingNames.Password.RequiredUniqueChars, "1"), + new SettingDefinition(IdentitySettingNames.Password.RequireNonAlphanumeric, "true"), + new SettingDefinition(IdentitySettingNames.Password.RequireLowercase, "true"), + new SettingDefinition(IdentitySettingNames.Password.RequireUppercase, "true"), + new SettingDefinition(IdentitySettingNames.Password.RequireDigit, "true"), - new SettingDefinition(IdentitySettingNames.Password.RequiredLength), - new SettingDefinition(IdentitySettingNames.Password.RequiredUniqueChars), - new SettingDefinition(IdentitySettingNames.Password.RequireNonAlphanumeric), - new SettingDefinition(IdentitySettingNames.Password.RequireLowercase), - new SettingDefinition(IdentitySettingNames.Password.RequireUppercase), - new SettingDefinition(IdentitySettingNames.Password.RequireDigit), + new SettingDefinition(IdentitySettingNames.Lockout.AllowedForNewUsers, "true"), + new SettingDefinition(IdentitySettingNames.Lockout.LockoutDuration, "300"), + new SettingDefinition(IdentitySettingNames.Lockout.MaxFailedAccessAttempts, "5"), - new SettingDefinition(IdentitySettingNames.Lockout.AllowedForNewUsers), - new SettingDefinition(IdentitySettingNames.Lockout.LockoutDuration), - new SettingDefinition(IdentitySettingNames.Lockout.MaxFailedAccessAttempts), - - new SettingDefinition(IdentitySettingNames.SignIn.RequireConfirmedEmail), - new SettingDefinition(IdentitySettingNames.SignIn.RequireConfirmedPhoneNumber), + new SettingDefinition(IdentitySettingNames.SignIn.RequireConfirmedEmail, "false"), + new SettingDefinition(IdentitySettingNames.SignIn.RequireConfirmedPhoneNumber, "false"), new SettingDefinition(IdentitySettingNames.User.IsUserNameUpdateEnabled, "true"), new SettingDefinition(IdentitySettingNames.User.IsEmailUpdateEnabled, "true") - ); } } From ba7a9b61d3fc4d9fc0ceb1f4af973d5e9a178c21 Mon Sep 17 00:00:00 2001 From: Halil ibrahim Kalkan Date: Tue, 4 Dec 2018 16:54:32 +0300 Subject: [PATCH 24/60] Update AbpIdentitySettingDefinitionProvider.cs --- .../AbpIdentitySettingDefinitionProvider.cs | 24 ++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/AbpIdentitySettingDefinitionProvider.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/AbpIdentitySettingDefinitionProvider.cs index d63db23c61..c5cbb16a1f 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/AbpIdentitySettingDefinitionProvider.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/AbpIdentitySettingDefinitionProvider.cs @@ -8,22 +8,24 @@ namespace Volo.Abp.Identity public override void Define(ISettingDefinitionContext context) { context.Add( - new SettingDefinition(IdentitySettingNames.Password.RequiredLength, "6"), - new SettingDefinition(IdentitySettingNames.Password.RequiredUniqueChars, "1"), - new SettingDefinition(IdentitySettingNames.Password.RequireNonAlphanumeric, "true"), - new SettingDefinition(IdentitySettingNames.Password.RequireLowercase, "true"), - new SettingDefinition(IdentitySettingNames.Password.RequireUppercase, "true"), - new SettingDefinition(IdentitySettingNames.Password.RequireDigit, "true"), - new SettingDefinition(IdentitySettingNames.Lockout.AllowedForNewUsers, "true"), - new SettingDefinition(IdentitySettingNames.Lockout.LockoutDuration, "300"), - new SettingDefinition(IdentitySettingNames.Lockout.MaxFailedAccessAttempts, "5"), + new SettingDefinition(IdentitySettingNames.Password.RequiredLength), + new SettingDefinition(IdentitySettingNames.Password.RequiredUniqueChars), + new SettingDefinition(IdentitySettingNames.Password.RequireNonAlphanumeric), + new SettingDefinition(IdentitySettingNames.Password.RequireLowercase), + new SettingDefinition(IdentitySettingNames.Password.RequireUppercase), + new SettingDefinition(IdentitySettingNames.Password.RequireDigit), - new SettingDefinition(IdentitySettingNames.SignIn.RequireConfirmedEmail, "false"), - new SettingDefinition(IdentitySettingNames.SignIn.RequireConfirmedPhoneNumber, "false"), + new SettingDefinition(IdentitySettingNames.Lockout.AllowedForNewUsers), + new SettingDefinition(IdentitySettingNames.Lockout.LockoutDuration), + new SettingDefinition(IdentitySettingNames.Lockout.MaxFailedAccessAttempts), + + new SettingDefinition(IdentitySettingNames.SignIn.RequireConfirmedEmail), + new SettingDefinition(IdentitySettingNames.SignIn.RequireConfirmedPhoneNumber), new SettingDefinition(IdentitySettingNames.User.IsUserNameUpdateEnabled, "true"), new SettingDefinition(IdentitySettingNames.User.IsEmailUpdateEnabled, "true") + ); } } From d88d63a4e49e8d0baeb86bd77a3d1ae507bf7d36 Mon Sep 17 00:00:00 2001 From: Yunus Emre Kalkan Date: Wed, 5 Dec 2018 16:57:05 +0300 Subject: [PATCH 25/60] settings page --- .../Pages/SettingManagement/Index.cshtml | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/Index.cshtml b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/Index.cshtml index 283c926a9a..37beb37169 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/Index.cshtml +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/Index.cshtml @@ -6,10 +6,14 @@ } + + @foreach (var group in Model.SettingPageCreationContext.Groups) { -

@group.DisplayName

-
+ + +

@group.DisplayName

@await Component.InvokeAsync(group.ComponentType) -
-} \ No newline at end of file + +} +
\ No newline at end of file From 93cd75ef401a09bd44cdf65b0c344cbee3960001 Mon Sep 17 00:00:00 2001 From: Halil ibrahim Kalkan Date: Wed, 5 Dec 2018 18:34:21 +0300 Subject: [PATCH 26/60] Refactor docs domain layer. --- .../Volo/Docs/DocsDomainSharedModule.cs | 3 +-- .../Volo/Docs/DocumentNotFoundException.cs | 2 +- .../docs/src/Volo.Docs.Domain/Volo.Docs.Domain.csproj | 6 ++---- .../src/Volo.Docs.Domain/Volo/Docs/DocsDomainModule.cs | 10 ++++++---- 4 files changed, 10 insertions(+), 11 deletions(-) diff --git a/modules/docs/src/Volo.Docs.Domain.Shared/Volo/Docs/DocsDomainSharedModule.cs b/modules/docs/src/Volo.Docs.Domain.Shared/Volo/Docs/DocsDomainSharedModule.cs index f60ea4a7b8..6c12059eff 100644 --- a/modules/docs/src/Volo.Docs.Domain.Shared/Volo/Docs/DocsDomainSharedModule.cs +++ b/modules/docs/src/Volo.Docs.Domain.Shared/Volo/Docs/DocsDomainSharedModule.cs @@ -1,5 +1,4 @@ -using Microsoft.Extensions.DependencyInjection; -using Volo.Abp.Localization; +using Volo.Abp.Localization; using Volo.Abp.Modularity; using Volo.Docs.Localization; diff --git a/modules/docs/src/Volo.Docs.Domain.Shared/Volo/Docs/DocumentNotFoundException.cs b/modules/docs/src/Volo.Docs.Domain.Shared/Volo/Docs/DocumentNotFoundException.cs index 877452c260..aa7bafd284 100644 --- a/modules/docs/src/Volo.Docs.Domain.Shared/Volo/Docs/DocumentNotFoundException.cs +++ b/modules/docs/src/Volo.Docs.Domain.Shared/Volo/Docs/DocumentNotFoundException.cs @@ -2,7 +2,7 @@ using System.Runtime.Serialization; using Volo.Abp; -namespace Volo.Docs.Documents +namespace Volo.Docs { [Serializable] public class DocumentNotFoundException : BusinessException diff --git a/modules/docs/src/Volo.Docs.Domain/Volo.Docs.Domain.csproj b/modules/docs/src/Volo.Docs.Domain/Volo.Docs.Domain.csproj index edeb3f7d1a..6c9597c822 100644 --- a/modules/docs/src/Volo.Docs.Domain/Volo.Docs.Domain.csproj +++ b/modules/docs/src/Volo.Docs.Domain/Volo.Docs.Domain.csproj @@ -10,13 +10,11 @@ - - + - - + diff --git a/modules/docs/src/Volo.Docs.Domain/Volo/Docs/DocsDomainModule.cs b/modules/docs/src/Volo.Docs.Domain/Volo/Docs/DocsDomainModule.cs index 6837bbae16..f58eb638e6 100644 --- a/modules/docs/src/Volo.Docs.Domain/Volo/Docs/DocsDomainModule.cs +++ b/modules/docs/src/Volo.Docs.Domain/Volo/Docs/DocsDomainModule.cs @@ -1,5 +1,4 @@ -using Microsoft.Extensions.DependencyInjection; -using Volo.Abp.Domain; +using Volo.Abp.Domain; using Volo.Abp.Localization; using Volo.Abp.Modularity; using Volo.Abp.VirtualFileSystem; @@ -17,12 +16,15 @@ namespace Volo.Docs { Configure(options => { - options.FileSets.AddEmbedded(); + options.FileSets + .AddEmbedded(); }); Configure(options => { - options.Resources.Get().AddVirtualJson("/Volo/Docs/Localization/Domain"); + options.Resources + .Get() + .AddVirtualJson("/Volo/Docs/Localization/Domain"); }); } } From 57dbe34e2970d34dfb048222053b2dcc1177aae3 Mon Sep 17 00:00:00 2001 From: Halil ibrahim Kalkan Date: Wed, 5 Dec 2018 18:42:10 +0300 Subject: [PATCH 27/60] Removed GoogleCustomSearchId --- ...3_Removed_GoogleCustomSearchId.Designer.cs | 66 +++++++++++++++++++ ...1205154143_Removed_GoogleCustomSearchId.cs | 22 +++++++ .../DocsTestAppDbContextModelSnapshot.cs | 4 +- .../Volo/Docs/Projects/Project.cs | 2 - 4 files changed, 89 insertions(+), 5 deletions(-) create mode 100644 modules/docs/app/Volo.DocsTestApp.EntityFrameworkCore/Migrations/20181205154143_Removed_GoogleCustomSearchId.Designer.cs create mode 100644 modules/docs/app/Volo.DocsTestApp.EntityFrameworkCore/Migrations/20181205154143_Removed_GoogleCustomSearchId.cs diff --git a/modules/docs/app/Volo.DocsTestApp.EntityFrameworkCore/Migrations/20181205154143_Removed_GoogleCustomSearchId.Designer.cs b/modules/docs/app/Volo.DocsTestApp.EntityFrameworkCore/Migrations/20181205154143_Removed_GoogleCustomSearchId.Designer.cs new file mode 100644 index 0000000000..5a94075bd6 --- /dev/null +++ b/modules/docs/app/Volo.DocsTestApp.EntityFrameworkCore/Migrations/20181205154143_Removed_GoogleCustomSearchId.Designer.cs @@ -0,0 +1,66 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Volo.DocsTestApp.EntityFrameworkCore; + +namespace Volo.DocsTestApp.EntityFrameworkCore.Migrations +{ + [DbContext(typeof(DocsTestAppDbContext))] + [Migration("20181205154143_Removed_GoogleCustomSearchId")] + partial class Removed_GoogleCustomSearchId + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "2.1.1-rtm-30846") + .HasAnnotation("Relational:MaxIdentifierLength", 128) + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + modelBuilder.Entity("Volo.Docs.Projects.Project", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("DefaultDocumentName") + .IsRequired() + .HasMaxLength(128); + + b.Property("DocumentStoreType"); + + b.Property("ExtraProperties") + .HasColumnName("ExtraProperties"); + + b.Property("Format"); + + b.Property("LatestVersionBranchName") + .HasMaxLength(128); + + b.Property("MainWebsiteUrl"); + + b.Property("MinimumVersion"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128); + + b.Property("NavigationDocumentName") + .IsRequired() + .HasMaxLength(128); + + b.Property("ShortName") + .IsRequired() + .HasMaxLength(32); + + b.HasKey("Id"); + + b.ToTable("DocsProjects"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/modules/docs/app/Volo.DocsTestApp.EntityFrameworkCore/Migrations/20181205154143_Removed_GoogleCustomSearchId.cs b/modules/docs/app/Volo.DocsTestApp.EntityFrameworkCore/Migrations/20181205154143_Removed_GoogleCustomSearchId.cs new file mode 100644 index 0000000000..577b28bda1 --- /dev/null +++ b/modules/docs/app/Volo.DocsTestApp.EntityFrameworkCore/Migrations/20181205154143_Removed_GoogleCustomSearchId.cs @@ -0,0 +1,22 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +namespace Volo.DocsTestApp.EntityFrameworkCore.Migrations +{ + public partial class Removed_GoogleCustomSearchId : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "GoogleCustomSearchId", + table: "DocsProjects"); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "GoogleCustomSearchId", + table: "DocsProjects", + nullable: true); + } + } +} diff --git a/modules/docs/app/Volo.DocsTestApp.EntityFrameworkCore/Migrations/DocsTestAppDbContextModelSnapshot.cs b/modules/docs/app/Volo.DocsTestApp.EntityFrameworkCore/Migrations/DocsTestAppDbContextModelSnapshot.cs index eea0c9b857..9c1f4f448c 100644 --- a/modules/docs/app/Volo.DocsTestApp.EntityFrameworkCore/Migrations/DocsTestAppDbContextModelSnapshot.cs +++ b/modules/docs/app/Volo.DocsTestApp.EntityFrameworkCore/Migrations/DocsTestAppDbContextModelSnapshot.cs @@ -15,7 +15,7 @@ namespace Volo.DocsTestApp.EntityFrameworkCore.Migrations { #pragma warning disable 612, 618 modelBuilder - .HasAnnotation("ProductVersion", "2.1.4-rtm-31024") + .HasAnnotation("ProductVersion", "2.1.1-rtm-30846") .HasAnnotation("Relational:MaxIdentifierLength", 128) .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); @@ -35,8 +35,6 @@ namespace Volo.DocsTestApp.EntityFrameworkCore.Migrations b.Property("Format"); - b.Property("GoogleCustomSearchId"); - b.Property("LatestVersionBranchName") .HasMaxLength(128); diff --git a/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Projects/Project.cs b/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Projects/Project.cs index 7a8cb5bf69..b5c5c784f0 100644 --- a/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Projects/Project.cs +++ b/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Projects/Project.cs @@ -41,8 +41,6 @@ namespace Volo.Docs.Projects ///
public virtual string DocumentStoreType { get; protected set; } - public virtual string GoogleCustomSearchId { get; set; } - public virtual Dictionary ExtraProperties { get; protected set; } public virtual string MainWebsiteUrl { get; set; } From 04392b2b47e7c12d0b544785cbba479a0e4ccbc3 Mon Sep 17 00:00:00 2001 From: Halil ibrahim Kalkan Date: Wed, 5 Dec 2018 19:04:38 +0300 Subject: [PATCH 28/60] Refactor document app service interface. --- .../Docs/Documents/GetDefaultDocumentInput.cs | 15 +++ .../Volo/Docs/Documents/GetDocumentInput.cs | 19 ++++ .../Documents/GetNavigationDocumentInput.cs | 15 +++ .../Docs/Documents/IDocumentAppService.cs | 23 +---- .../Volo/Docs/Projects/IProjectAppService.cs | 5 + .../Volo/Docs/Documents/DocumentAppService.cs | 93 +++---------------- .../Volo/Docs/Projects/ProjectAppService.cs | 64 ++++++++++++- .../Volo/Docs/Documents/DocumentConsts.cs | 7 ++ .../Volo/Docs/Projects/ProjectConsts.cs | 1 + .../Pages/Documents/Project/Index.cshtml.cs | 37 ++++++-- 10 files changed, 165 insertions(+), 114 deletions(-) create mode 100644 modules/docs/src/Volo.Docs.Application.Contracts/Volo/Docs/Documents/GetDefaultDocumentInput.cs create mode 100644 modules/docs/src/Volo.Docs.Application.Contracts/Volo/Docs/Documents/GetDocumentInput.cs create mode 100644 modules/docs/src/Volo.Docs.Application.Contracts/Volo/Docs/Documents/GetNavigationDocumentInput.cs create mode 100644 modules/docs/src/Volo.Docs.Domain.Shared/Volo/Docs/Documents/DocumentConsts.cs diff --git a/modules/docs/src/Volo.Docs.Application.Contracts/Volo/Docs/Documents/GetDefaultDocumentInput.cs b/modules/docs/src/Volo.Docs.Application.Contracts/Volo/Docs/Documents/GetDefaultDocumentInput.cs new file mode 100644 index 0000000000..ea52f1c7cc --- /dev/null +++ b/modules/docs/src/Volo.Docs.Application.Contracts/Volo/Docs/Documents/GetDefaultDocumentInput.cs @@ -0,0 +1,15 @@ +using System; +using System.ComponentModel.DataAnnotations; +using Volo.Docs.Projects; + +namespace Volo.Docs.Documents +{ + public class GetDefaultDocumentInput + { + public Guid ProjectId { get; set; } + + [Required] + [StringLength(ProjectConsts.MaxVersionNameLength)] + public string Version { get; set; } + } +} \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Application.Contracts/Volo/Docs/Documents/GetDocumentInput.cs b/modules/docs/src/Volo.Docs.Application.Contracts/Volo/Docs/Documents/GetDocumentInput.cs new file mode 100644 index 0000000000..c189eab90d --- /dev/null +++ b/modules/docs/src/Volo.Docs.Application.Contracts/Volo/Docs/Documents/GetDocumentInput.cs @@ -0,0 +1,19 @@ +using System; +using System.ComponentModel.DataAnnotations; +using Volo.Docs.Projects; + +namespace Volo.Docs.Documents +{ + public class GetDocumentInput + { + public Guid ProjectId { get; set; } + + [Required] + [StringLength(DocumentConsts.MaxNameLength)] + public string Name { get; set; } + + [Required] + [StringLength(ProjectConsts.MaxVersionNameLength)] + public string Version { get; set; } + } +} \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Application.Contracts/Volo/Docs/Documents/GetNavigationDocumentInput.cs b/modules/docs/src/Volo.Docs.Application.Contracts/Volo/Docs/Documents/GetNavigationDocumentInput.cs new file mode 100644 index 0000000000..e049e83255 --- /dev/null +++ b/modules/docs/src/Volo.Docs.Application.Contracts/Volo/Docs/Documents/GetNavigationDocumentInput.cs @@ -0,0 +1,15 @@ +using System; +using System.ComponentModel.DataAnnotations; +using Volo.Docs.Projects; + +namespace Volo.Docs.Documents +{ + public class GetNavigationDocumentInput + { + public Guid ProjectId { get; set; } + + [Required] + [StringLength(ProjectConsts.MaxVersionNameLength)] + public string Version { get; set; } + } +} \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Application.Contracts/Volo/Docs/Documents/IDocumentAppService.cs b/modules/docs/src/Volo.Docs.Application.Contracts/Volo/Docs/Documents/IDocumentAppService.cs index 1c4f37ec00..c374f142cc 100644 --- a/modules/docs/src/Volo.Docs.Application.Contracts/Volo/Docs/Documents/IDocumentAppService.cs +++ b/modules/docs/src/Volo.Docs.Application.Contracts/Volo/Docs/Documents/IDocumentAppService.cs @@ -1,4 +1,3 @@ -using System.Collections.Generic; using System.Threading.Tasks; using Volo.Abp.Application.Services; @@ -6,26 +5,10 @@ namespace Volo.Docs.Documents { public interface IDocumentAppService : IApplicationService { - //TODO: Create input DTOs for methods and add validation annotations. + Task GetAsync(GetDocumentInput input); - Task GetByNameAsync( - string projectShortName, - string documentName, - string version, - bool normalize); + Task GetDefaultAsync(GetDefaultDocumentInput input); - Task GetDefaultAsync( - string projectShortName, - string version, - bool normalize); - - Task GetNavigationDocumentAsync( - string projectShortName, - string version, - bool normalize); - - Task> GetVersions( - string projectShortName - ); + Task GetNavigationDocumentAsync(GetNavigationDocumentInput input); } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Application.Contracts/Volo/Docs/Projects/IProjectAppService.cs b/modules/docs/src/Volo.Docs.Application.Contracts/Volo/Docs/Projects/IProjectAppService.cs index 6884bdc90e..a052365d35 100644 --- a/modules/docs/src/Volo.Docs.Application.Contracts/Volo/Docs/Projects/IProjectAppService.cs +++ b/modules/docs/src/Volo.Docs.Application.Contracts/Volo/Docs/Projects/IProjectAppService.cs @@ -1,6 +1,9 @@ +using System; +using System.Collections.Generic; using System.Threading.Tasks; using Volo.Abp.Application.Dtos; using Volo.Abp.Application.Services; +using Volo.Docs.Documents; namespace Volo.Docs.Projects { @@ -9,5 +12,7 @@ namespace Volo.Docs.Projects Task> GetListAsync(); Task GetByShortNameAsync(string shortName); + + Task> GetVersionsAsync(Guid projectId); } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Application/Volo/Docs/Documents/DocumentAppService.cs b/modules/docs/src/Volo.Docs.Application/Volo/Docs/Documents/DocumentAppService.cs index 61fed0ee2d..8174868051 100644 --- a/modules/docs/src/Volo.Docs.Application/Volo/Docs/Documents/DocumentAppService.cs +++ b/modules/docs/src/Volo.Docs.Application/Volo/Docs/Documents/DocumentAppService.cs @@ -1,10 +1,5 @@ -using System; -using System.Collections.Generic; -using System.Linq; using System.Threading.Tasks; -using Microsoft.Extensions.Caching.Distributed; using Volo.Abp.Application.Services; -using Volo.Abp.Caching; using Volo.Docs.Projects; namespace Volo.Docs.Documents @@ -12,59 +7,43 @@ namespace Volo.Docs.Documents public class DocumentAppService : ApplicationService, IDocumentAppService { private readonly IProjectRepository _projectRepository; - private readonly IDistributedCache> _distributedCache; private readonly IDocumentStoreFactory _documentStoreFactory; public DocumentAppService( IProjectRepository projectRepository, - IDistributedCache> distributedCache, IDocumentStoreFactory documentStoreFactory) { _projectRepository = projectRepository; - _distributedCache = distributedCache; _documentStoreFactory = documentStoreFactory; } - public async Task GetByNameAsync( - string projectShortName, - string documentName, - string version, - bool normalize) + public async Task GetAsync(GetDocumentInput input) { - var project = await _projectRepository.GetByShortNameAsync(projectShortName); + var project = await _projectRepository.GetAsync(input.ProjectId); return await GetDocumentWithDetailsDto( project, - documentName, - version, - normalize + input.Name, + input.Version ); } - public async Task GetDefaultAsync( - string projectShortName, - string version, - bool normalize) + public async Task GetDefaultAsync(GetDefaultDocumentInput input) { - var project = await _projectRepository.GetByShortNameAsync(projectShortName); + var project = await _projectRepository.GetAsync(input.ProjectId); return await GetDocumentWithDetailsDto( project, project.DefaultDocumentName, - version, - normalize + input.Version ); } - public virtual async Task GetNavigationDocumentAsync( - string projectShortName, - string version, - bool normalize) + public virtual async Task GetNavigationDocumentAsync(GetNavigationDocumentInput input) { - var project = await _projectRepository.GetByShortNameAsync(projectShortName); + var project = await _projectRepository.GetAsync(input.ProjectId); var documentDto = await GetDocumentWithDetailsDto( project, project.NavigationDocumentName, - version, - normalize + input.Version ); return ObjectMapper.Map(documentDto); @@ -73,8 +52,7 @@ namespace Volo.Docs.Documents protected virtual async Task GetDocumentWithDetailsDto( Project project, string documentName, - string version, - bool normalize) + string version) { var documentStore = _documentStoreFactory.Create(project.DocumentStoreType); var document = await documentStore.Find(project, documentName, version); @@ -84,54 +62,5 @@ namespace Volo.Docs.Documents return dto; } - - public async Task> GetVersions(string projectShortName) - { - //TODO: What if there is no version? - - var project = await _projectRepository.GetByShortNameAsync(projectShortName); - var documentStore = _documentStoreFactory.Create(project.DocumentStoreType); - - //TODO: Why not use GetOrAddAsync - var versions = await GetVersionsFromCache(projectShortName); - if (versions == null) - { - versions = await documentStore.GetVersions(project); - await SetVersionsToCache(projectShortName, versions); - } - - if (!project.MinimumVersion.IsNullOrEmpty()) - { - var minVersionIndex = versions.FindIndex(v => v.Name == project.MinimumVersion); - if (minVersionIndex > -1) - { - versions = versions.GetRange(0, minVersionIndex + 1); - } - } - - if (!string.IsNullOrEmpty(project.LatestVersionBranchName)) - { - versions.First().Name = project.LatestVersionBranchName; - } - - return versions; - } - - private async Task> GetVersionsFromCache(string projectShortName) - { - return await _distributedCache.GetAsync(projectShortName); - } - - private async Task SetVersionsToCache(string projectShortName, List versions) - { - await _distributedCache.SetAsync( - projectShortName, - versions, - new DistributedCacheEntryOptions - { - SlidingExpiration = TimeSpan.FromDays(1) - } - ); - } } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Application/Volo/Docs/Projects/ProjectAppService.cs b/modules/docs/src/Volo.Docs.Application/Volo/Docs/Projects/ProjectAppService.cs index 494064d925..ddd2325d14 100644 --- a/modules/docs/src/Volo.Docs.Application/Volo/Docs/Projects/ProjectAppService.cs +++ b/modules/docs/src/Volo.Docs.Application/Volo/Docs/Projects/ProjectAppService.cs @@ -1,18 +1,29 @@ +using System; using System.Collections.Generic; +using System.Linq; using System.Threading.Tasks; +using Microsoft.Extensions.Caching.Distributed; using Volo.Abp.Application.Dtos; using Volo.Abp.Application.Services; -using Volo.Abp.Domain.Entities; +using Volo.Abp.Caching; +using Volo.Docs.Documents; namespace Volo.Docs.Projects { public class ProjectAppService : ApplicationService, IProjectAppService { private readonly IProjectRepository _projectRepository; + private readonly IDistributedCache> _distributedCache; + private readonly IDocumentStoreFactory _documentStoreFactory; - public ProjectAppService(IProjectRepository projectRepository) + public ProjectAppService( + IProjectRepository projectRepository, + IDistributedCache> distributedCache, + IDocumentStoreFactory documentStoreFactory) { _projectRepository = projectRepository; + _distributedCache = distributedCache; + _documentStoreFactory = documentStoreFactory; } public async Task> GetListAsync() @@ -30,5 +41,54 @@ namespace Volo.Docs.Projects return ObjectMapper.Map(project); } + + public async Task> GetVersionsAsync(Guid id) + { + //TODO: What if there is no version? + + var project = await _projectRepository.GetAsync(id); + var documentStore = _documentStoreFactory.Create(project.DocumentStoreType); + + //TODO: Why not use GetOrAddAsync + var versions = await GetVersionsFromCache(project.ShortName); + if (versions == null) + { + versions = await documentStore.GetVersions(project); + await SetVersionsToCache(project.ShortName, versions); + } + + if (!project.MinimumVersion.IsNullOrEmpty()) + { + var minVersionIndex = versions.FindIndex(v => v.Name == project.MinimumVersion); + if (minVersionIndex > -1) + { + versions = versions.GetRange(0, minVersionIndex + 1); + } + } + + if (!string.IsNullOrEmpty(project.LatestVersionBranchName)) + { + versions.First().Name = project.LatestVersionBranchName; + } + + return versions; + } + + private async Task> GetVersionsFromCache(string projectShortName) + { + return await _distributedCache.GetAsync(projectShortName); + } + + private async Task SetVersionsToCache(string projectShortName, List versions) + { + await _distributedCache.SetAsync( + projectShortName, + versions, + new DistributedCacheEntryOptions + { + SlidingExpiration = TimeSpan.FromDays(1) + } + ); + } } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Domain.Shared/Volo/Docs/Documents/DocumentConsts.cs b/modules/docs/src/Volo.Docs.Domain.Shared/Volo/Docs/Documents/DocumentConsts.cs new file mode 100644 index 0000000000..04371e3dff --- /dev/null +++ b/modules/docs/src/Volo.Docs.Domain.Shared/Volo/Docs/Documents/DocumentConsts.cs @@ -0,0 +1,7 @@ +namespace Volo.Docs.Documents +{ + public static class DocumentConsts + { + public const int MaxNameLength = 255; + } +} diff --git a/modules/docs/src/Volo.Docs.Domain.Shared/Volo/Docs/Projects/ProjectConsts.cs b/modules/docs/src/Volo.Docs.Domain.Shared/Volo/Docs/Projects/ProjectConsts.cs index 717158a166..57f3c17112 100644 --- a/modules/docs/src/Volo.Docs.Domain.Shared/Volo/Docs/Projects/ProjectConsts.cs +++ b/modules/docs/src/Volo.Docs.Domain.Shared/Volo/Docs/Projects/ProjectConsts.cs @@ -7,5 +7,6 @@ public const int MaxDefaultDocumentNameLength = 128; public const int MaxNavigationDocumentNameLength = 128; public const int MaxLatestVersionBranchNameLength = 128; + public const int MaxVersionNameLength = 128; } } diff --git a/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml.cs b/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml.cs index 59f0524308..582813f7b0 100644 --- a/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml.cs +++ b/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml.cs @@ -60,17 +60,21 @@ namespace Volo.Docs.Pages.Documents.Project SetPageParams(project); await SetVersionAsync(project); - - await SetDocumentAsync(); - - await SetNavigationAsync(); + await SetDocumentAsync(project); + await SetNavigationAsync(project); } - private async Task SetNavigationAsync() + private async Task SetNavigationAsync(ProjectDto project) { try { - Navigation = await _documentAppService.GetNavigationDocumentAsync(ProjectName, Version, false); + Navigation = await _documentAppService.GetNavigationDocumentAsync( + new GetNavigationDocumentInput + { + ProjectId = project.Id, + Version = Version + } + ); } catch (DocumentNotFoundException) //TODO: What if called on a remote service which may return 404 { @@ -95,7 +99,7 @@ namespace Volo.Docs.Pages.Documents.Project private async Task SetVersionAsync(ProjectDto project) { - var versionInfoDtos = await _documentAppService.GetVersions(project.ShortName); + var versionInfoDtos = await _projectAppService.GetVersionsAsync(project.Id); Versions = versionInfoDtos.Select(v => new VersionInfo(v.DisplayName, v.Name)).ToList(); @@ -168,17 +172,30 @@ namespace Volo.Docs.Pages.Documents.Project Document.Version; } - private async Task SetDocumentAsync() + private async Task SetDocumentAsync(ProjectDto project) { try { if (DocumentNameWithExtension.IsNullOrWhiteSpace()) { - Document = await _documentAppService.GetDefaultAsync(ProjectName, Version, true); + Document = await _documentAppService.GetDefaultAsync( + new GetDefaultDocumentInput + { + ProjectId = project.Id, + Version = Version + } + ); } else { - Document = await _documentAppService.GetByNameAsync(ProjectName, DocumentNameWithExtension, Version, true); + Document = await _documentAppService.GetAsync( + new GetDocumentInput + { + ProjectId = project.Id, + Name = DocumentNameWithExtension, + Version = Version + } + ); } } catch (DocumentNotFoundException) From 187a8ae486b1bda749d08025306ae98d8d763da8 Mon Sep 17 00:00:00 2001 From: Halil ibrahim Kalkan Date: Wed, 5 Dec 2018 19:15:35 +0300 Subject: [PATCH 29/60] Refactor application and web layers. --- .../Volo/Docs/DocsApplicationContractsModule.cs | 8 ++++++-- .../Volo/Docs/Documents/IDocumentAppService.cs | 2 +- .../Volo/Docs/Projects/IProjectAppService.cs | 2 +- .../Volo/Docs/DocsApplicationAutoMapperProfile.cs | 3 --- .../Volo/Docs/DocsApplicationModule.cs | 3 +-- .../Volo/Docs/Documents/DocumentAppService.cs | 6 ++---- .../src/Volo.Docs.Web/DocsWebAutoMapperProfile.cs | 15 +++++++++++++++ modules/docs/src/Volo.Docs.Web/DocsWebModule.cs | 6 ++++++ .../Models}/NavigationNode.cs | 0 .../Models}/NavigationWithDetailsDto.cs | 0 .../Pages/Documents/Project/Index.cshtml.cs | 7 +++++-- 11 files changed, 37 insertions(+), 15 deletions(-) create mode 100644 modules/docs/src/Volo.Docs.Web/DocsWebAutoMapperProfile.cs rename modules/docs/src/{Volo.Docs.Application.Contracts/Volo/Docs/Documents => Volo.Docs.Web/Models}/NavigationNode.cs (100%) rename modules/docs/src/{Volo.Docs.Application.Contracts/Volo/Docs/Documents => Volo.Docs.Web/Models}/NavigationWithDetailsDto.cs (100%) diff --git a/modules/docs/src/Volo.Docs.Application.Contracts/Volo/Docs/DocsApplicationContractsModule.cs b/modules/docs/src/Volo.Docs.Application.Contracts/Volo/Docs/DocsApplicationContractsModule.cs index 79179c23d9..60f9cce39a 100644 --- a/modules/docs/src/Volo.Docs.Application.Contracts/Volo/Docs/DocsApplicationContractsModule.cs +++ b/modules/docs/src/Volo.Docs.Application.Contracts/Volo/Docs/DocsApplicationContractsModule.cs @@ -1,8 +1,12 @@ -using Volo.Abp.Modularity; +using Volo.Abp.Application; +using Volo.Abp.Modularity; namespace Volo.Docs { - [DependsOn(typeof(DocsDomainSharedModule))] + [DependsOn( + typeof(DocsDomainSharedModule), + typeof(AbpDddApplicationModule) + )] public class DocsApplicationContractsModule : AbpModule { diff --git a/modules/docs/src/Volo.Docs.Application.Contracts/Volo/Docs/Documents/IDocumentAppService.cs b/modules/docs/src/Volo.Docs.Application.Contracts/Volo/Docs/Documents/IDocumentAppService.cs index c374f142cc..0580075623 100644 --- a/modules/docs/src/Volo.Docs.Application.Contracts/Volo/Docs/Documents/IDocumentAppService.cs +++ b/modules/docs/src/Volo.Docs.Application.Contracts/Volo/Docs/Documents/IDocumentAppService.cs @@ -9,6 +9,6 @@ namespace Volo.Docs.Documents Task GetDefaultAsync(GetDefaultDocumentInput input); - Task GetNavigationDocumentAsync(GetNavigationDocumentInput input); + Task GetNavigationDocumentAsync(GetNavigationDocumentInput input); } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Application.Contracts/Volo/Docs/Projects/IProjectAppService.cs b/modules/docs/src/Volo.Docs.Application.Contracts/Volo/Docs/Projects/IProjectAppService.cs index a052365d35..1c14d6e9fd 100644 --- a/modules/docs/src/Volo.Docs.Application.Contracts/Volo/Docs/Projects/IProjectAppService.cs +++ b/modules/docs/src/Volo.Docs.Application.Contracts/Volo/Docs/Projects/IProjectAppService.cs @@ -13,6 +13,6 @@ namespace Volo.Docs.Projects Task GetByShortNameAsync(string shortName); - Task> GetVersionsAsync(Guid projectId); + Task> GetVersionsAsync(Guid id); } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Application/Volo/Docs/DocsApplicationAutoMapperProfile.cs b/modules/docs/src/Volo.Docs.Application/Volo/Docs/DocsApplicationAutoMapperProfile.cs index 943be96d56..334fe6bfdd 100644 --- a/modules/docs/src/Volo.Docs.Application/Volo/Docs/DocsApplicationAutoMapperProfile.cs +++ b/modules/docs/src/Volo.Docs.Application/Volo/Docs/DocsApplicationAutoMapperProfile.cs @@ -12,9 +12,6 @@ namespace Volo.Docs CreateMap(); CreateMap() .Ignore(x => x.Project); - - CreateMap() - .Ignore(x => x.RootNode); } } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Application/Volo/Docs/DocsApplicationModule.cs b/modules/docs/src/Volo.Docs.Application/Volo/Docs/DocsApplicationModule.cs index c3fc2a3efc..66bbf0544b 100644 --- a/modules/docs/src/Volo.Docs.Application/Volo/Docs/DocsApplicationModule.cs +++ b/modules/docs/src/Volo.Docs.Application/Volo/Docs/DocsApplicationModule.cs @@ -1,5 +1,4 @@ -using Microsoft.Extensions.DependencyInjection; -using Volo.Abp.AutoMapper; +using Volo.Abp.AutoMapper; using Volo.Abp.Caching; using Volo.Abp.Modularity; diff --git a/modules/docs/src/Volo.Docs.Application/Volo/Docs/Documents/DocumentAppService.cs b/modules/docs/src/Volo.Docs.Application/Volo/Docs/Documents/DocumentAppService.cs index 8174868051..6ec8451e6b 100644 --- a/modules/docs/src/Volo.Docs.Application/Volo/Docs/Documents/DocumentAppService.cs +++ b/modules/docs/src/Volo.Docs.Application/Volo/Docs/Documents/DocumentAppService.cs @@ -37,16 +37,14 @@ namespace Volo.Docs.Documents ); } - public virtual async Task GetNavigationDocumentAsync(GetNavigationDocumentInput input) + public virtual async Task GetNavigationDocumentAsync(GetNavigationDocumentInput input) { var project = await _projectRepository.GetAsync(input.ProjectId); - var documentDto = await GetDocumentWithDetailsDto( + return await GetDocumentWithDetailsDto( project, project.NavigationDocumentName, input.Version ); - - return ObjectMapper.Map(documentDto); } protected virtual async Task GetDocumentWithDetailsDto( diff --git a/modules/docs/src/Volo.Docs.Web/DocsWebAutoMapperProfile.cs b/modules/docs/src/Volo.Docs.Web/DocsWebAutoMapperProfile.cs new file mode 100644 index 0000000000..4a25c94370 --- /dev/null +++ b/modules/docs/src/Volo.Docs.Web/DocsWebAutoMapperProfile.cs @@ -0,0 +1,15 @@ +using AutoMapper; +using Volo.Abp.AutoMapper; +using Volo.Docs.Documents; + +namespace Volo.Docs +{ + public class DocsWebAutoMapperProfile : Profile + { + public DocsWebAutoMapperProfile() + { + CreateMap() + .Ignore(x => x.RootNode); + } + } +} diff --git a/modules/docs/src/Volo.Docs.Web/DocsWebModule.cs b/modules/docs/src/Volo.Docs.Web/DocsWebModule.cs index cbda4d697f..c583215be9 100644 --- a/modules/docs/src/Volo.Docs.Web/DocsWebModule.cs +++ b/modules/docs/src/Volo.Docs.Web/DocsWebModule.cs @@ -2,6 +2,7 @@ using Microsoft.Extensions.DependencyInjection; using Volo.Abp.AspNetCore.Mvc.Localization; using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap; +using Volo.Abp.AutoMapper; using Volo.Abp.Modularity; using Volo.Abp.VirtualFileSystem; using Volo.Docs.Localization; @@ -34,6 +35,11 @@ namespace Volo.Docs //TODO: Make configurable! options.Conventions.AddPageRoute("/Documents/Project/Index", "documents/{projectName}/{version}/{*documentName}"); }); + + Configure(options => + { + options.AddProfile(validate: true); + }); } } } diff --git a/modules/docs/src/Volo.Docs.Application.Contracts/Volo/Docs/Documents/NavigationNode.cs b/modules/docs/src/Volo.Docs.Web/Models/NavigationNode.cs similarity index 100% rename from modules/docs/src/Volo.Docs.Application.Contracts/Volo/Docs/Documents/NavigationNode.cs rename to modules/docs/src/Volo.Docs.Web/Models/NavigationNode.cs diff --git a/modules/docs/src/Volo.Docs.Application.Contracts/Volo/Docs/Documents/NavigationWithDetailsDto.cs b/modules/docs/src/Volo.Docs.Web/Models/NavigationWithDetailsDto.cs similarity index 100% rename from modules/docs/src/Volo.Docs.Application.Contracts/Volo/Docs/Documents/NavigationWithDetailsDto.cs rename to modules/docs/src/Volo.Docs.Web/Models/NavigationWithDetailsDto.cs diff --git a/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml.cs b/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml.cs index 582813f7b0..bbc4078ab1 100644 --- a/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml.cs +++ b/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml.cs @@ -5,6 +5,7 @@ using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; using Microsoft.AspNetCore.Mvc.Rendering; +using Volo.Abp.AspNetCore.Mvc.UI.RazorPages; using Volo.Docs.Documents; using Volo.Docs.Formatting; using Volo.Docs.Models; @@ -12,7 +13,7 @@ using Volo.Docs.Projects; namespace Volo.Docs.Pages.Documents.Project { - public class IndexModel : PageModel + public class IndexModel : AbpPageModel { [BindProperty(SupportsGet = true)] public string ProjectName { get; set; } @@ -68,13 +69,15 @@ namespace Volo.Docs.Pages.Documents.Project { try { - Navigation = await _documentAppService.GetNavigationDocumentAsync( + var document = await _documentAppService.GetNavigationDocumentAsync( new GetNavigationDocumentInput { ProjectId = project.Id, Version = Version } ); + + Navigation = ObjectMapper.Map(document); } catch (DocumentNotFoundException) //TODO: What if called on a remote service which may return 404 { From 7f5365b585649eaa54e8efbed95a16a38c606fbf Mon Sep 17 00:00:00 2001 From: Halil ibrahim Kalkan Date: Wed, 5 Dec 2018 19:27:08 +0300 Subject: [PATCH 30/60] Move document store to domain layer --- .../Volo/Docs/Projects/IProjectAppService.cs | 1 - .../Docs/{Documents => Projects}/VersionInfoDto.cs | 7 ++----- .../Volo.Docs.Application.csproj | 4 ---- .../Volo/Docs/DocsApplicationAutoMapperProfile.cs | 1 + .../Volo/Docs/Documents/DocumentAppService.cs | 2 +- .../Volo/Docs/Projects/ProjectAppService.cs | 10 +++++----- .../src/Volo.Docs.Domain/Volo.Docs.Domain.csproj | 4 ++++ .../Volo/Docs/Documents/Document.cs | 0 .../Volo/Docs/Documents/DocumentStoreFactory.cs | 0 .../Volo/Docs/Documents/GithubDocumentStore.cs | 9 +++++---- .../Volo/Docs/Documents/IDocumentStore.cs | 10 ++-------- .../Volo/Docs/Documents/IDocumentStoreFactory.cs | 2 -- .../Volo/Docs/Documents/ProjectGithubExtensions.cs | 0 .../Volo/Docs/Projects/VersionInfo.cs | 12 ++++++++++++ 14 files changed, 32 insertions(+), 30 deletions(-) rename modules/docs/src/Volo.Docs.Application.Contracts/Volo/Docs/{Documents => Projects}/VersionInfoDto.cs (67%) rename modules/docs/src/{Volo.Docs.Application => Volo.Docs.Domain}/Volo/Docs/Documents/Document.cs (100%) rename modules/docs/src/{Volo.Docs.Application => Volo.Docs.Domain}/Volo/Docs/Documents/DocumentStoreFactory.cs (100%) rename modules/docs/src/{Volo.Docs.Application => Volo.Docs.Domain}/Volo/Docs/Documents/GithubDocumentStore.cs (94%) rename modules/docs/src/{Volo.Docs.Application => Volo.Docs.Domain}/Volo/Docs/Documents/IDocumentStore.cs (50%) rename modules/docs/src/{Volo.Docs.Application => Volo.Docs.Domain}/Volo/Docs/Documents/IDocumentStoreFactory.cs (83%) rename modules/docs/src/{Volo.Docs.Application => Volo.Docs.Domain}/Volo/Docs/Documents/ProjectGithubExtensions.cs (100%) create mode 100644 modules/docs/src/Volo.Docs.Domain/Volo/Docs/Projects/VersionInfo.cs diff --git a/modules/docs/src/Volo.Docs.Application.Contracts/Volo/Docs/Projects/IProjectAppService.cs b/modules/docs/src/Volo.Docs.Application.Contracts/Volo/Docs/Projects/IProjectAppService.cs index 1c14d6e9fd..0866fc75e1 100644 --- a/modules/docs/src/Volo.Docs.Application.Contracts/Volo/Docs/Projects/IProjectAppService.cs +++ b/modules/docs/src/Volo.Docs.Application.Contracts/Volo/Docs/Projects/IProjectAppService.cs @@ -3,7 +3,6 @@ using System.Collections.Generic; using System.Threading.Tasks; using Volo.Abp.Application.Dtos; using Volo.Abp.Application.Services; -using Volo.Docs.Documents; namespace Volo.Docs.Projects { diff --git a/modules/docs/src/Volo.Docs.Application.Contracts/Volo/Docs/Documents/VersionInfoDto.cs b/modules/docs/src/Volo.Docs.Application.Contracts/Volo/Docs/Projects/VersionInfoDto.cs similarity index 67% rename from modules/docs/src/Volo.Docs.Application.Contracts/Volo/Docs/Documents/VersionInfoDto.cs rename to modules/docs/src/Volo.Docs.Application.Contracts/Volo/Docs/Projects/VersionInfoDto.cs index 4cd34bc082..32ac7bb1c4 100644 --- a/modules/docs/src/Volo.Docs.Application.Contracts/Volo/Docs/Documents/VersionInfoDto.cs +++ b/modules/docs/src/Volo.Docs.Application.Contracts/Volo/Docs/Projects/VersionInfoDto.cs @@ -1,12 +1,9 @@ -using System; - -namespace Volo.Docs.Documents +namespace Volo.Docs.Projects { - [Serializable] public class VersionInfoDto { public string DisplayName { get; set; } public string Name { get; set; } } -} \ No newline at end of file +} diff --git a/modules/docs/src/Volo.Docs.Application/Volo.Docs.Application.csproj b/modules/docs/src/Volo.Docs.Application/Volo.Docs.Application.csproj index 656d75dd9e..1d2f977806 100644 --- a/modules/docs/src/Volo.Docs.Application/Volo.Docs.Application.csproj +++ b/modules/docs/src/Volo.Docs.Application/Volo.Docs.Application.csproj @@ -16,8 +16,4 @@
- - - - diff --git a/modules/docs/src/Volo.Docs.Application/Volo/Docs/DocsApplicationAutoMapperProfile.cs b/modules/docs/src/Volo.Docs.Application/Volo/Docs/DocsApplicationAutoMapperProfile.cs index 334fe6bfdd..50824df088 100644 --- a/modules/docs/src/Volo.Docs.Application/Volo/Docs/DocsApplicationAutoMapperProfile.cs +++ b/modules/docs/src/Volo.Docs.Application/Volo/Docs/DocsApplicationAutoMapperProfile.cs @@ -10,6 +10,7 @@ namespace Volo.Docs public DocsApplicationAutoMapperProfile() { CreateMap(); + CreateMap(); CreateMap() .Ignore(x => x.Project); } diff --git a/modules/docs/src/Volo.Docs.Application/Volo/Docs/Documents/DocumentAppService.cs b/modules/docs/src/Volo.Docs.Application/Volo/Docs/Documents/DocumentAppService.cs index 6ec8451e6b..42b0759c59 100644 --- a/modules/docs/src/Volo.Docs.Application/Volo/Docs/Documents/DocumentAppService.cs +++ b/modules/docs/src/Volo.Docs.Application/Volo/Docs/Documents/DocumentAppService.cs @@ -53,7 +53,7 @@ namespace Volo.Docs.Documents string version) { var documentStore = _documentStoreFactory.Create(project.DocumentStoreType); - var document = await documentStore.Find(project, documentName, version); + var document = await documentStore.FindDocument(project, documentName, version); var dto = ObjectMapper.Map(document); dto.Project = ObjectMapper.Map(project); diff --git a/modules/docs/src/Volo.Docs.Application/Volo/Docs/Projects/ProjectAppService.cs b/modules/docs/src/Volo.Docs.Application/Volo/Docs/Projects/ProjectAppService.cs index ddd2325d14..09fe1c3994 100644 --- a/modules/docs/src/Volo.Docs.Application/Volo/Docs/Projects/ProjectAppService.cs +++ b/modules/docs/src/Volo.Docs.Application/Volo/Docs/Projects/ProjectAppService.cs @@ -13,12 +13,12 @@ namespace Volo.Docs.Projects public class ProjectAppService : ApplicationService, IProjectAppService { private readonly IProjectRepository _projectRepository; - private readonly IDistributedCache> _distributedCache; + private readonly IDistributedCache> _distributedCache; private readonly IDocumentStoreFactory _documentStoreFactory; public ProjectAppService( IProjectRepository projectRepository, - IDistributedCache> distributedCache, + IDistributedCache> distributedCache, IDocumentStoreFactory documentStoreFactory) { _projectRepository = projectRepository; @@ -71,15 +71,15 @@ namespace Volo.Docs.Projects versions.First().Name = project.LatestVersionBranchName; } - return versions; + return ObjectMapper.Map, List>(versions); } - private async Task> GetVersionsFromCache(string projectShortName) + private async Task> GetVersionsFromCache(string projectShortName) { return await _distributedCache.GetAsync(projectShortName); } - private async Task SetVersionsToCache(string projectShortName, List versions) + private async Task SetVersionsToCache(string projectShortName, List versions) { await _distributedCache.SetAsync( projectShortName, diff --git a/modules/docs/src/Volo.Docs.Domain/Volo.Docs.Domain.csproj b/modules/docs/src/Volo.Docs.Domain/Volo.Docs.Domain.csproj index 6c9597c822..ac37f6eebc 100644 --- a/modules/docs/src/Volo.Docs.Domain/Volo.Docs.Domain.csproj +++ b/modules/docs/src/Volo.Docs.Domain/Volo.Docs.Domain.csproj @@ -17,6 +17,10 @@
+ + + + diff --git a/modules/docs/src/Volo.Docs.Application/Volo/Docs/Documents/Document.cs b/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Documents/Document.cs similarity index 100% rename from modules/docs/src/Volo.Docs.Application/Volo/Docs/Documents/Document.cs rename to modules/docs/src/Volo.Docs.Domain/Volo/Docs/Documents/Document.cs diff --git a/modules/docs/src/Volo.Docs.Application/Volo/Docs/Documents/DocumentStoreFactory.cs b/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Documents/DocumentStoreFactory.cs similarity index 100% rename from modules/docs/src/Volo.Docs.Application/Volo/Docs/Documents/DocumentStoreFactory.cs rename to modules/docs/src/Volo.Docs.Domain/Volo/Docs/Documents/DocumentStoreFactory.cs diff --git a/modules/docs/src/Volo.Docs.Application/Volo/Docs/Documents/GithubDocumentStore.cs b/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Documents/GithubDocumentStore.cs similarity index 94% rename from modules/docs/src/Volo.Docs.Application/Volo/Docs/Documents/GithubDocumentStore.cs rename to modules/docs/src/Volo.Docs.Domain/Volo/Docs/Documents/GithubDocumentStore.cs index 061909fd4a..adc570940b 100644 --- a/modules/docs/src/Volo.Docs.Application/Volo/Docs/Documents/GithubDocumentStore.cs +++ b/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Documents/GithubDocumentStore.cs @@ -7,6 +7,7 @@ using System.Linq; using System.Net; using System.Threading.Tasks; using Volo.Abp.Domain.Services; +using Volo.Docs.Projects; using ProductHeaderValue = Octokit.ProductHeaderValue; namespace Volo.Docs.Documents @@ -15,7 +16,7 @@ namespace Volo.Docs.Documents { public const string Type = "Github"; //TODO: Convert to "github" - public Task Find( + public Task FindDocument( Projects.Project project, string documentName, string version) @@ -81,7 +82,7 @@ namespace Volo.Docs.Documents } } - public async Task> GetVersions(Volo.Docs.Projects.Project project) + public async Task> GetVersions(Volo.Docs.Projects.Project project) { try { @@ -97,12 +98,12 @@ namespace Volo.Docs.Documents GetGithubRepositoryNameFromUrl(url) ); - return releases.OrderByDescending(r => r.PublishedAt).Select(r => new VersionInfoDto { Name = r.TagName, DisplayName = r.TagName }).ToList(); + return releases.OrderByDescending(r => r.PublishedAt).Select(r => new VersionInfo { Name = r.TagName, DisplayName = r.TagName }).ToList(); } catch (Exception ex) { Logger.LogError(ex.Message, ex); - return new List(); + return new List(); } } diff --git a/modules/docs/src/Volo.Docs.Application/Volo/Docs/Documents/IDocumentStore.cs b/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Documents/IDocumentStore.cs similarity index 50% rename from modules/docs/src/Volo.Docs.Application/Volo/Docs/Documents/IDocumentStore.cs rename to modules/docs/src/Volo.Docs.Domain/Volo/Docs/Documents/IDocumentStore.cs index 7508e54eff..65a411d44a 100644 --- a/modules/docs/src/Volo.Docs.Application/Volo/Docs/Documents/IDocumentStore.cs +++ b/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Documents/IDocumentStore.cs @@ -7,14 +7,8 @@ namespace Volo.Docs.Documents { public interface IDocumentStore : IDomainService { - Task Find( - Project project, - string documentName, - string version - ); + Task FindDocument(Project project, string documentName, string version); - Task> GetVersions( - Project project - ); + Task> GetVersions(Project project); } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Application/Volo/Docs/Documents/IDocumentStoreFactory.cs b/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Documents/IDocumentStoreFactory.cs similarity index 83% rename from modules/docs/src/Volo.Docs.Application/Volo/Docs/Documents/IDocumentStoreFactory.cs rename to modules/docs/src/Volo.Docs.Domain/Volo/Docs/Documents/IDocumentStoreFactory.cs index aaada0e7fe..7711c3d0d7 100644 --- a/modules/docs/src/Volo.Docs.Application/Volo/Docs/Documents/IDocumentStoreFactory.cs +++ b/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Documents/IDocumentStoreFactory.cs @@ -1,5 +1,3 @@ -using Volo.Docs.Projects; - namespace Volo.Docs.Documents { public interface IDocumentStoreFactory diff --git a/modules/docs/src/Volo.Docs.Application/Volo/Docs/Documents/ProjectGithubExtensions.cs b/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Documents/ProjectGithubExtensions.cs similarity index 100% rename from modules/docs/src/Volo.Docs.Application/Volo/Docs/Documents/ProjectGithubExtensions.cs rename to modules/docs/src/Volo.Docs.Domain/Volo/Docs/Documents/ProjectGithubExtensions.cs diff --git a/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Projects/VersionInfo.cs b/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Projects/VersionInfo.cs new file mode 100644 index 0000000000..c10781e508 --- /dev/null +++ b/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Projects/VersionInfo.cs @@ -0,0 +1,12 @@ +using System; + +namespace Volo.Docs.Projects +{ + [Serializable] //Serialization needed because this object is stored in cache + public class VersionInfo + { + public string DisplayName { get; set; } + + public string Name { get; set; } + } +} \ No newline at end of file From cd01234f0020a05f80b1e116463aed193d0efa45 Mon Sep 17 00:00:00 2001 From: Halil ibrahim Kalkan Date: Wed, 5 Dec 2018 19:50:09 +0300 Subject: [PATCH 31/60] Refactor store factory, create options. --- .../Volo/Docs/DocsDomainModule.cs | 7 +++ .../Docs/Documents/DocumentStoreFactory.cs | 26 ++++++----- .../Docs/Documents/DocumentStoreOptions.cs | 15 +++++++ .../Docs/Documents/IDocumentStoreFactory.cs | 2 +- .../Docs/Documents/ProjectGithubExtensions.cs | 28 ------------ .../Documents/GithubDocumentStore.cs | 25 +++++------ .../Projects/ProjectGithubExtensions.cs | 45 +++++++++++++++++++ 7 files changed, 95 insertions(+), 53 deletions(-) create mode 100644 modules/docs/src/Volo.Docs.Domain/Volo/Docs/Documents/DocumentStoreOptions.cs delete mode 100644 modules/docs/src/Volo.Docs.Domain/Volo/Docs/Documents/ProjectGithubExtensions.cs rename modules/docs/src/Volo.Docs.Domain/Volo/Docs/{ => GitHub}/Documents/GithubDocumentStore.cs (88%) create mode 100644 modules/docs/src/Volo.Docs.Domain/Volo/Docs/GitHub/Projects/ProjectGithubExtensions.cs diff --git a/modules/docs/src/Volo.Docs.Domain/Volo/Docs/DocsDomainModule.cs b/modules/docs/src/Volo.Docs.Domain/Volo/Docs/DocsDomainModule.cs index f58eb638e6..6453dfe5aa 100644 --- a/modules/docs/src/Volo.Docs.Domain/Volo/Docs/DocsDomainModule.cs +++ b/modules/docs/src/Volo.Docs.Domain/Volo/Docs/DocsDomainModule.cs @@ -2,6 +2,8 @@ using Volo.Abp.Localization; using Volo.Abp.Modularity; using Volo.Abp.VirtualFileSystem; +using Volo.Docs.Documents; +using Volo.Docs.GitHub.Documents; using Volo.Docs.Localization; namespace Volo.Docs @@ -26,6 +28,11 @@ namespace Volo.Docs .Get() .AddVirtualJson("/Volo/Docs/Localization/Domain"); }); + + Configure(options => + { + options.Stores[GithubDocumentStore.Type] = typeof(GithubDocumentStore); + }); } } } diff --git a/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Documents/DocumentStoreFactory.cs b/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Documents/DocumentStoreFactory.cs index 387d4b2d83..0cd2b75f7f 100644 --- a/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Documents/DocumentStoreFactory.cs +++ b/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Documents/DocumentStoreFactory.cs @@ -1,29 +1,33 @@ using System; +using System.Collections.Generic; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Options; using Volo.Abp.DependencyInjection; namespace Volo.Docs.Documents { public class DocumentStoreFactory : IDocumentStoreFactory, ITransientDependency { - private readonly IServiceProvider _serviceProvider; + protected DocumentStoreOptions Options { get; } + protected IServiceProvider ServiceProvider { get; } - public DocumentStoreFactory(IServiceProvider serviceProvider) + public DocumentStoreFactory( + IServiceProvider serviceProvider, + IOptions options) { - _serviceProvider = serviceProvider; + Options = options.Value; + ServiceProvider = serviceProvider; } - public virtual IDocumentStore Create(string documentStoreType) + public virtual IDocumentStore Create(string storeType) { - //TODO: Should be extensible - - switch (documentStoreType) + var serviceType = Options.Stores.GetOrDefault(storeType); + if (serviceType == null) { - case GithubDocumentStore.Type: - return _serviceProvider.GetRequiredService(); - default: - throw new ApplicationException($"Undefined document store: {documentStoreType}"); + throw new ApplicationException($"Undefined document store: {storeType}"); } + + return (IDocumentStore) ServiceProvider.GetRequiredService(serviceType); } } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Documents/DocumentStoreOptions.cs b/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Documents/DocumentStoreOptions.cs new file mode 100644 index 0000000000..fcc5781d98 --- /dev/null +++ b/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Documents/DocumentStoreOptions.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; + +namespace Volo.Docs.Documents +{ + public class DocumentStoreOptions + { + public Dictionary Stores { get; set; } + + public DocumentStoreOptions() + { + Stores = new Dictionary(); + } + } +} diff --git a/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Documents/IDocumentStoreFactory.cs b/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Documents/IDocumentStoreFactory.cs index 7711c3d0d7..3a997eb26d 100644 --- a/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Documents/IDocumentStoreFactory.cs +++ b/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Documents/IDocumentStoreFactory.cs @@ -2,6 +2,6 @@ namespace Volo.Docs.Documents { public interface IDocumentStoreFactory { - IDocumentStore Create(string documentStoreType); + IDocumentStore Create(string storeType); } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Documents/ProjectGithubExtensions.cs b/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Documents/ProjectGithubExtensions.cs deleted file mode 100644 index efe53e2de1..0000000000 --- a/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Documents/ProjectGithubExtensions.cs +++ /dev/null @@ -1,28 +0,0 @@ -using System; -using Volo.Docs.Projects; - -namespace Volo.Docs.Documents -{ - public static class ProjectGithubExtensions - { - public static string GetGithubUrl(this Projects.Project project) - { - CheckGithubProject(project); - return project.ExtraProperties["GithubRootUrl"] as string; - } - - public static void SetGithubUrl(this Projects.Project project, string value) - { - CheckGithubProject(project); - project.ExtraProperties["GithubRootUrl"] = value; - } - - private static void CheckGithubProject(Project project) - { - if (project.DocumentStoreType != GithubDocumentStore.Type) - { - throw new ApplicationException("Given project has not a Github document store!"); - } - } - } -} \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Documents/GithubDocumentStore.cs b/modules/docs/src/Volo.Docs.Domain/Volo/Docs/GitHub/Documents/GithubDocumentStore.cs similarity index 88% rename from modules/docs/src/Volo.Docs.Domain/Volo/Docs/Documents/GithubDocumentStore.cs rename to modules/docs/src/Volo.Docs.Domain/Volo/Docs/GitHub/Documents/GithubDocumentStore.cs index adc570940b..fb109a941e 100644 --- a/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Documents/GithubDocumentStore.cs +++ b/modules/docs/src/Volo.Docs.Domain/Volo/Docs/GitHub/Documents/GithubDocumentStore.cs @@ -1,27 +1,26 @@ -using Microsoft.Extensions.Logging; -using Octokit; -using Octokit.Internal; using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Threading.Tasks; +using Microsoft.Extensions.Logging; +using Octokit; +using Octokit.Internal; using Volo.Abp.Domain.Services; +using Volo.Docs.Documents; +using Volo.Docs.GitHub.Projects; using Volo.Docs.Projects; using ProductHeaderValue = Octokit.ProductHeaderValue; -namespace Volo.Docs.Documents +namespace Volo.Docs.GitHub.Documents { public class GithubDocumentStore : DomainService, IDocumentStore { - public const string Type = "Github"; //TODO: Convert to "github" + public const string Type = "GitHub"; - public Task FindDocument( - Projects.Project project, - string documentName, - string version) + public Task FindDocument(Docs.Projects.Project project, string documentName, string version) { - var rootUrl = project.GetGithubUrl() + var rootUrl = project.GetGitHubUrl() .Replace("_version_/", version + "/") .Replace("www.", ""); //TODO: Can be a problem? @@ -43,7 +42,7 @@ namespace Volo.Docs.Documents ); } - var token = project.ExtraProperties["GithubAccessToken"]?.ToString(); //TODO: Define GetGithubAccessToken extension method + var token = project.GetGitHubAccessTokenOrNull(); var document = new Document { @@ -86,13 +85,13 @@ namespace Volo.Docs.Documents { try { - var token = project.ExtraProperties["GithubAccessToken"]?.ToString(); + var token = project.GetGitHubAccessTokenOrNull(); var gitHubClient = token.IsNullOrWhiteSpace() ? new GitHubClient(new ProductHeaderValue("AbpWebSite")) : new GitHubClient(new ProductHeaderValue("AbpWebSite"), new InMemoryCredentialStore(new Credentials(token))); - var url = project.ExtraProperties["GithubRootUrl"].ToString(); + var url = project.GetGitHubUrl(); var releases = await gitHubClient.Repository.Release.GetAll( GetGithubOrganizationNameFromUrl(url), GetGithubRepositoryNameFromUrl(url) diff --git a/modules/docs/src/Volo.Docs.Domain/Volo/Docs/GitHub/Projects/ProjectGithubExtensions.cs b/modules/docs/src/Volo.Docs.Domain/Volo/Docs/GitHub/Projects/ProjectGithubExtensions.cs new file mode 100644 index 0000000000..7504d8be86 --- /dev/null +++ b/modules/docs/src/Volo.Docs.Domain/Volo/Docs/GitHub/Projects/ProjectGithubExtensions.cs @@ -0,0 +1,45 @@ +using System; +using JetBrains.Annotations; +using Volo.Abp; +using Volo.Docs.GitHub.Documents; +using Volo.Docs.Projects; + +namespace Volo.Docs.GitHub.Projects +{ + public static class ProjectGithubExtensions + { + public static string GetGitHubUrl([NotNull] this Project project) + { + CheckGitHubProject(project); + return project.ExtraProperties["GitHubRootUrl"] as string; + } + + public static void SetGitHubUrl([NotNull] this Project project, string value) + { + CheckGitHubProject(project); + project.ExtraProperties["GitHubRootUrl"] = value; + } + + public static string GetGitHubAccessTokenOrNull([NotNull] this Project project) + { + CheckGitHubProject(project); + return project.ExtraProperties["GitHubAccessToken"] as string; + } + + public static void SetGitHubAccessToken([NotNull] this Project project, string value) + { + CheckGitHubProject(project); + project.ExtraProperties["GitHubAccessToken"] = value; + } + + private static void CheckGitHubProject(Project project) + { + Check.NotNull(project, nameof(project)); + + if (project.DocumentStoreType != GithubDocumentStore.Type) + { + throw new ApplicationException("Given project has not a Github document store!"); + } + } + } +} \ No newline at end of file From 2a784037f51b352ab784008703292370500db995 Mon Sep 17 00:00:00 2001 From: Halil ibrahim Kalkan Date: Wed, 5 Dec 2018 20:01:45 +0300 Subject: [PATCH 32/60] Added string.ReplaceFirst extension method. --- .../src/Volo.Abp.Core/System/AbpStringExtensions.cs | 13 +++++++++++++ .../System/StringExtensions_Tests.cs | 8 ++++++++ 2 files changed, 21 insertions(+) diff --git a/framework/src/Volo.Abp.Core/System/AbpStringExtensions.cs b/framework/src/Volo.Abp.Core/System/AbpStringExtensions.cs index 3fb7573858..a7cf7c763e 100644 --- a/framework/src/Volo.Abp.Core/System/AbpStringExtensions.cs +++ b/framework/src/Volo.Abp.Core/System/AbpStringExtensions.cs @@ -192,6 +192,19 @@ namespace System return str; } + public static string ReplaceFirst(this string str, string search, string replace, StringComparison comparisonType = StringComparison.Ordinal) + { + Check.NotNull(str, nameof(str)); + + var pos = str.IndexOf(search, comparisonType); + if (pos < 0) + { + return str; + } + + return str.Substring(0, pos) + replace + str.Substring(pos + search.Length); + } + /// /// Gets a substring of a string from end of the string. /// diff --git a/framework/test/Volo.Abp.Core.Tests/System/StringExtensions_Tests.cs b/framework/test/Volo.Abp.Core.Tests/System/StringExtensions_Tests.cs index 503abf7156..8a818a75cb 100644 --- a/framework/test/Volo.Abp.Core.Tests/System/StringExtensions_Tests.cs +++ b/framework/test/Volo.Abp.Core.Tests/System/StringExtensions_Tests.cs @@ -187,6 +187,14 @@ namespace System "Https://abp.io".RemovePreFix(StringComparison.OrdinalIgnoreCase, "https://").ShouldBe("abp.io"); } + [Fact] + public void ReplaceFirst_Tests() + { + "Test string".ReplaceFirst("s", "X").ShouldBe("TeXt string"); + "Test test test".ReplaceFirst("test", "XX").ShouldBe("Test XX test"); + "Test test test".ReplaceFirst("test", "XX", StringComparison.OrdinalIgnoreCase).ShouldBe("XX test test"); + } + [Fact] public void ToEnum_Test() { From 9e8a3922ce1bb10207c33471c4e1305b62289a3f Mon Sep 17 00:00:00 2001 From: Halil ibrahim Kalkan Date: Wed, 5 Dec 2018 20:17:57 +0300 Subject: [PATCH 33/60] Refactor GithubDocumentStore --- .../GitHub/Documents/GithubDocumentStore.cs | 98 ++++++++++--------- .../Projects/ProjectGithubExtensions.cs | 7 ++ 2 files changed, 60 insertions(+), 45 deletions(-) diff --git a/modules/docs/src/Volo.Docs.Domain/Volo/Docs/GitHub/Documents/GithubDocumentStore.cs b/modules/docs/src/Volo.Docs.Domain/Volo/Docs/GitHub/Documents/GithubDocumentStore.cs index fb109a941e..b533b5e509 100644 --- a/modules/docs/src/Volo.Docs.Domain/Volo/Docs/GitHub/Documents/GithubDocumentStore.cs +++ b/modules/docs/src/Volo.Docs.Domain/Volo/Docs/GitHub/Documents/GithubDocumentStore.cs @@ -11,6 +11,7 @@ using Volo.Docs.Documents; using Volo.Docs.GitHub.Projects; using Volo.Docs.Projects; using ProductHeaderValue = Octokit.ProductHeaderValue; +using Project = Volo.Docs.Projects.Project; namespace Volo.Docs.GitHub.Documents { @@ -18,33 +19,22 @@ namespace Volo.Docs.GitHub.Documents { public const string Type = "GitHub"; - public Task FindDocument(Docs.Projects.Project project, string documentName, string version) + public virtual async Task FindDocument(Project project, string documentName, string version) { - var rootUrl = project.GetGitHubUrl() - .Replace("_version_/", version + "/") - .Replace("www.", ""); //TODO: Can be a problem? - - var rawRootUrl = rootUrl - .Replace("github.com", "raw.githubusercontent.com") - .Replace("/tree/", "/"); //TODO: Replacing this can be a problem if I have a tree folder inside the repository - - var rawUrl = rawRootUrl + documentName; - var editLink = rootUrl.Replace("/tree/", "/blob/") + documentName; + var rootUrl = project.GetGitHubUrl(version); + var rawRootUrl = CalculateRawRootUrl(rootUrl); + var rawDocumentUrl = rawRootUrl + documentName; + var editLink = rootUrl.ReplaceFirst("/tree/", "/blob/") + documentName; var localDirectory = ""; var fileName = documentName; if (documentName.Contains("/")) { localDirectory = documentName.Substring(0, documentName.LastIndexOf('/')); - fileName = documentName.Substring( - documentName.LastIndexOf('/') + 1, - documentName.Length - documentName.LastIndexOf('/') - 1 - ); + fileName = documentName.Substring(documentName.LastIndexOf('/') + 1); } - var token = project.GetGitHubAccessTokenOrNull(); - - var document = new Document + return new Document { Title = documentName, EditLink = editLink, @@ -54,13 +44,18 @@ namespace Volo.Docs.GitHub.Documents LocalDirectory = localDirectory, FileName = fileName, Version = version, - Content = DownloadWebContent(rawUrl, token) + Content = await DownloadWebContentAsync(rawDocumentUrl, project.GetGitHubAccessTokenOrNull()) }; + } - return Task.FromResult(document); + private static string CalculateRawRootUrl(string rootUrl) + { + return rootUrl + .Replace("github.com", "raw.githubusercontent.com") + .ReplaceFirst("/tree/", "/"); } - private string DownloadWebContent(string rawUrl, string token) + private async Task DownloadWebContentAsync(string rawUrl, string token) { try { @@ -71,33 +66,28 @@ namespace Volo.Docs.GitHub.Documents webClient.Headers.Add("Authorization", "token " + token); } - return webClient.DownloadString(rawUrl); + return await webClient.DownloadStringTaskAsync(new Uri(rawUrl)); } } - catch (Exception ex) //TODO: Only handle when document is really not available + catch (Exception ex) { + //TODO: Only handle when document is really not available Logger.LogWarning(ex.Message, ex); throw new DocumentNotFoundException(rawUrl); } } - public async Task> GetVersions(Volo.Docs.Projects.Project project) + public async Task> GetVersions(Project project) { try { - var token = project.GetGitHubAccessTokenOrNull(); - - var gitHubClient = token.IsNullOrWhiteSpace() - ? new GitHubClient(new ProductHeaderValue("AbpWebSite")) - : new GitHubClient(new ProductHeaderValue("AbpWebSite"), new InMemoryCredentialStore(new Credentials(token))); - - var url = project.GetGitHubUrl(); - var releases = await gitHubClient.Repository.Release.GetAll( - GetGithubOrganizationNameFromUrl(url), - GetGithubRepositoryNameFromUrl(url) - ); - - return releases.OrderByDescending(r => r.PublishedAt).Select(r => new VersionInfo { Name = r.TagName, DisplayName = r.TagName }).ToList(); + return (await GetReleasesAsync(project)) + .OrderByDescending(r => r.PublishedAt) + .Select(r => new VersionInfo + { + Name = r.TagName, + DisplayName = r.TagName + }).ToList(); } catch (Exception ex) { @@ -106,12 +96,32 @@ namespace Volo.Docs.GitHub.Documents } } - private static string GetGithubOrganizationNameFromUrl(string url) + private async Task> GetReleasesAsync(Project project) + { + var url = project.GetGitHubUrl(); + var ownerName = GetOwnerNameFromUrl(url); + var repositoryName = GetRepositoryNameFromUrl(url); + var gitHubClient = CreateGitHubClient(project.GetGitHubAccessTokenOrNull()); + + return await gitHubClient + .Repository + .Release + .GetAll(ownerName, repositoryName); + } + + private static GitHubClient CreateGitHubClient(string token = null) + { + //TODO: Why hard-coded "abpframework"? Should be configurable? + return token.IsNullOrWhiteSpace() + ? new GitHubClient(new ProductHeaderValue("abpframework")) + : new GitHubClient(new ProductHeaderValue("abpframework"), new InMemoryCredentialStore(new Credentials(token))); + } + + protected virtual string GetOwnerNameFromUrl(string url) { try { - var urlStartingAfterFirstSlash = - url.Substring(url.IndexOf("github.com/", StringComparison.OrdinalIgnoreCase) + "github.com/".Length); + var urlStartingAfterFirstSlash = url.Substring(url.IndexOf("github.com/",StringComparison.OrdinalIgnoreCase) + "github.com/".Length); return urlStartingAfterFirstSlash.Substring(0, urlStartingAfterFirstSlash.IndexOf('/')); } catch (Exception) @@ -120,14 +130,12 @@ namespace Volo.Docs.GitHub.Documents } } - private string GetGithubRepositoryNameFromUrl(string url) + protected virtual string GetRepositoryNameFromUrl(string url) { try { - var urlStartingAfterFirstSlash = - url.Substring(url.IndexOf("github.com/", StringComparison.OrdinalIgnoreCase) + "github.com/".Length); - var urlStartingAfterSecondSlash = - urlStartingAfterFirstSlash.Substring(urlStartingAfterFirstSlash.IndexOf('/') + 1); + var urlStartingAfterFirstSlash = url.Substring(url.IndexOf("github.com/", StringComparison.OrdinalIgnoreCase) + "github.com/".Length); + var urlStartingAfterSecondSlash = urlStartingAfterFirstSlash.Substring(urlStartingAfterFirstSlash.IndexOf('/') + 1); return urlStartingAfterSecondSlash.Substring(0, urlStartingAfterSecondSlash.IndexOf('/')); } catch (Exception) diff --git a/modules/docs/src/Volo.Docs.Domain/Volo/Docs/GitHub/Projects/ProjectGithubExtensions.cs b/modules/docs/src/Volo.Docs.Domain/Volo/Docs/GitHub/Projects/ProjectGithubExtensions.cs index 7504d8be86..ae9ab10c18 100644 --- a/modules/docs/src/Volo.Docs.Domain/Volo/Docs/GitHub/Projects/ProjectGithubExtensions.cs +++ b/modules/docs/src/Volo.Docs.Domain/Volo/Docs/GitHub/Projects/ProjectGithubExtensions.cs @@ -14,6 +14,13 @@ namespace Volo.Docs.GitHub.Projects return project.ExtraProperties["GitHubRootUrl"] as string; } + public static string GetGitHubUrl([NotNull] this Project project, string version) + { + return project + .GetGitHubUrl() + .Replace("{version}", version); + } + public static void SetGitHubUrl([NotNull] this Project project, string value) { CheckGitHubProject(project); From 1751ecfa00eca9c13b7e552a59f88701166d942a Mon Sep 17 00:00:00 2001 From: Halil ibrahim Kalkan Date: Thu, 6 Dec 2018 09:04:31 +0300 Subject: [PATCH 34/60] Allow to pass DistributedCacheEntryOptions on IDistributedCache.GetOrAdd --- .../Volo/Abp/Caching/DistributedCache.cs | 16 +++++++++++----- .../Volo/Abp/Caching/IDistributedCache.cs | 4 +++- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/framework/src/Volo.Abp.Caching/Volo/Abp/Caching/DistributedCache.cs b/framework/src/Volo.Abp.Caching/Volo/Abp/Caching/DistributedCache.cs index b8b897068f..c897a20e3a 100644 --- a/framework/src/Volo.Abp.Caching/Volo/Abp/Caching/DistributedCache.cs +++ b/framework/src/Volo.Abp.Caching/Volo/Abp/Caching/DistributedCache.cs @@ -63,7 +63,10 @@ namespace Volo.Abp.Caching return ObjectSerializer.Deserialize(cachedBytes); } - public TCacheItem GetOrAdd(string key, Func factory) + public TCacheItem GetOrAdd( + string key, + Func factory, + Func optionsFactory = null) { var value = Get(key); if (value != null) @@ -80,14 +83,17 @@ namespace Volo.Abp.Caching } value = factory(); - Set(key, value); - + Set(key, value, optionsFactory?.Invoke()); } return value; } - public async Task GetOrAddAsync(string key, Func> factory, CancellationToken token = default) + public async Task GetOrAddAsync( + string key, + Func> factory, + Func optionsFactory = null, + CancellationToken token = default) { var value = await GetAsync(key, token); if (value != null) @@ -104,7 +110,7 @@ namespace Volo.Abp.Caching } value = await factory(); - await SetAsync(key, value, token: token); + await SetAsync(key, value, optionsFactory?.Invoke(), token); } return value; diff --git a/framework/src/Volo.Abp.Caching/Volo/Abp/Caching/IDistributedCache.cs b/framework/src/Volo.Abp.Caching/Volo/Abp/Caching/IDistributedCache.cs index 5fd6d2d84f..1e21d3a3a6 100644 --- a/framework/src/Volo.Abp.Caching/Volo/Abp/Caching/IDistributedCache.cs +++ b/framework/src/Volo.Abp.Caching/Volo/Abp/Caching/IDistributedCache.cs @@ -20,12 +20,14 @@ namespace Volo.Abp.Caching TCacheItem GetOrAdd( string key, - Func factory + Func factory, + Func optionsFactory = null ); Task GetOrAddAsync( [NotNull] string key, Func> factory, + Func optionsFactory = null, CancellationToken token = default ); From 96dcfe94ed7257af6de1a119990f38b7f8b71217 Mon Sep 17 00:00:00 2001 From: Halil ibrahim Kalkan Date: Thu, 6 Dec 2018 09:15:05 +0300 Subject: [PATCH 35/60] Refactor application layer --- .../Volo/Docs/Documents/DocumentAppService.cs | 21 +++++--- .../Volo/Docs/Projects/ProjectAppService.cs | 54 +++++++++---------- .../GitHub/Documents/GithubDocumentStore.cs | 1 + 3 files changed, 39 insertions(+), 37 deletions(-) diff --git a/modules/docs/src/Volo.Docs.Application/Volo/Docs/Documents/DocumentAppService.cs b/modules/docs/src/Volo.Docs.Application/Volo/Docs/Documents/DocumentAppService.cs index 42b0759c59..2877748272 100644 --- a/modules/docs/src/Volo.Docs.Application/Volo/Docs/Documents/DocumentAppService.cs +++ b/modules/docs/src/Volo.Docs.Application/Volo/Docs/Documents/DocumentAppService.cs @@ -17,9 +17,10 @@ namespace Volo.Docs.Documents _documentStoreFactory = documentStoreFactory; } - public async Task GetAsync(GetDocumentInput input) + public virtual async Task GetAsync(GetDocumentInput input) { var project = await _projectRepository.GetAsync(input.ProjectId); + return await GetDocumentWithDetailsDto( project, input.Name, @@ -27,9 +28,10 @@ namespace Volo.Docs.Documents ); } - public async Task GetDefaultAsync(GetDefaultDocumentInput input) + public virtual async Task GetDefaultAsync(GetDefaultDocumentInput input) { var project = await _projectRepository.GetAsync(input.ProjectId); + return await GetDocumentWithDetailsDto( project, project.DefaultDocumentName, @@ -40,6 +42,7 @@ namespace Volo.Docs.Documents public virtual async Task GetNavigationDocumentAsync(GetNavigationDocumentInput input) { var project = await _projectRepository.GetAsync(input.ProjectId); + return await GetDocumentWithDetailsDto( project, project.NavigationDocumentName, @@ -52,13 +55,17 @@ namespace Volo.Docs.Documents string documentName, string version) { - var documentStore = _documentStoreFactory.Create(project.DocumentStoreType); - var document = await documentStore.FindDocument(project, documentName, version); + var store = _documentStoreFactory.Create(project.DocumentStoreType); + var document = await store.FindDocument(project, documentName, version); - var dto = ObjectMapper.Map(document); - dto.Project = ObjectMapper.Map(project); + return CreateDocumentWithDetailsDto(project, document); + } - return dto; + protected virtual DocumentWithDetailsDto CreateDocumentWithDetailsDto(Project project, Document document) + { + var documentDto = ObjectMapper.Map(document); + documentDto.Project = ObjectMapper.Map(project); + return documentDto; } } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Application/Volo/Docs/Projects/ProjectAppService.cs b/modules/docs/src/Volo.Docs.Application/Volo/Docs/Projects/ProjectAppService.cs index 09fe1c3994..2c7e5265ae 100644 --- a/modules/docs/src/Volo.Docs.Application/Volo/Docs/Projects/ProjectAppService.cs +++ b/modules/docs/src/Volo.Docs.Application/Volo/Docs/Projects/ProjectAppService.cs @@ -13,16 +13,16 @@ namespace Volo.Docs.Projects public class ProjectAppService : ApplicationService, IProjectAppService { private readonly IProjectRepository _projectRepository; - private readonly IDistributedCache> _distributedCache; + private readonly IDistributedCache> _versionCache; private readonly IDocumentStoreFactory _documentStoreFactory; public ProjectAppService( IProjectRepository projectRepository, - IDistributedCache> distributedCache, + IDistributedCache> versionCache, IDocumentStoreFactory documentStoreFactory) { _projectRepository = projectRepository; - _distributedCache = distributedCache; + _versionCache = versionCache; _documentStoreFactory = documentStoreFactory; } @@ -44,17 +44,28 @@ namespace Volo.Docs.Projects public async Task> GetVersionsAsync(Guid id) { - //TODO: What if there is no version? - var project = await _projectRepository.GetAsync(id); - var documentStore = _documentStoreFactory.Create(project.DocumentStoreType); - //TODO: Why not use GetOrAddAsync - var versions = await GetVersionsFromCache(project.ShortName); - if (versions == null) + var versions = await _versionCache.GetOrAddAsync( + project.ShortName, + () => GetVersionsAsync(project), + () => new DistributedCacheEntryOptions + { + SlidingExpiration = TimeSpan.FromDays(2) + } + ); + + return ObjectMapper.Map, List>(versions); + } + + protected virtual async Task> GetVersionsAsync(Project project) + { + var store = _documentStoreFactory.Create(project.DocumentStoreType); + var versions = await store.GetVersions(project); + + if (!versions.Any()) { - versions = await documentStore.GetVersions(project); - await SetVersionsToCache(project.ShortName, versions); + return versions; } if (!project.MinimumVersion.IsNullOrEmpty()) @@ -66,29 +77,12 @@ namespace Volo.Docs.Projects } } - if (!string.IsNullOrEmpty(project.LatestVersionBranchName)) + if (versions.Any() && !string.IsNullOrEmpty(project.LatestVersionBranchName)) { versions.First().Name = project.LatestVersionBranchName; } - return ObjectMapper.Map, List>(versions); - } - - private async Task> GetVersionsFromCache(string projectShortName) - { - return await _distributedCache.GetAsync(projectShortName); - } - - private async Task SetVersionsToCache(string projectShortName, List versions) - { - await _distributedCache.SetAsync( - projectShortName, - versions, - new DistributedCacheEntryOptions - { - SlidingExpiration = TimeSpan.FromDays(1) - } - ); + return versions; } } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Domain/Volo/Docs/GitHub/Documents/GithubDocumentStore.cs b/modules/docs/src/Volo.Docs.Domain/Volo/Docs/GitHub/Documents/GithubDocumentStore.cs index b533b5e509..0bd4c1bd7d 100644 --- a/modules/docs/src/Volo.Docs.Domain/Volo/Docs/GitHub/Documents/GithubDocumentStore.cs +++ b/modules/docs/src/Volo.Docs.Domain/Volo/Docs/GitHub/Documents/GithubDocumentStore.cs @@ -91,6 +91,7 @@ namespace Volo.Docs.GitHub.Documents } catch (Exception ex) { + //TODO: It may not be a good idea to hide the error! Logger.LogError(ex.Message, ex); return new List(); } From afa0fd882927ae457b7c2cbf1e6497e1f3ed0cdc Mon Sep 17 00:00:00 2001 From: Halil ibrahim Kalkan Date: Thu, 6 Dec 2018 10:17:02 +0300 Subject: [PATCH 36/60] Refactor markdown document formatting --- .../Docs/Documents/DocumentStoreFactory.cs | 2 +- .../docs/src/Volo.Docs.Web/DocsWebModule.cs | 7 ++++ .../Formatting/DocumentConverterFactory.cs | 27 --------------- .../Formatting/IDocumentConverter.cs | 9 ----- .../Formatting/IDocumentConverterFactory.cs | 7 ---- .../DocumentToHtmlConverterFactory.cs | 33 +++++++++++++++++++ .../DocumentToHtmlConverterOptions.cs | 15 +++++++++ .../IDocumentToHtmlConverter.cs | 14 ++++++++ .../IDocumentToHtmlConverterFactory.cs | 7 ++++ .../MarkdownDocumentToHtmlConverter.cs} | 9 ++--- .../Pages/Documents/Project/Index.cshtml.cs | 10 +++--- 11 files changed, 87 insertions(+), 53 deletions(-) delete mode 100644 modules/docs/src/Volo.Docs.Web/Formatting/DocumentConverterFactory.cs delete mode 100644 modules/docs/src/Volo.Docs.Web/Formatting/IDocumentConverter.cs delete mode 100644 modules/docs/src/Volo.Docs.Web/Formatting/IDocumentConverterFactory.cs create mode 100644 modules/docs/src/Volo.Docs.Web/HtmlConverting/DocumentToHtmlConverterFactory.cs create mode 100644 modules/docs/src/Volo.Docs.Web/HtmlConverting/DocumentToHtmlConverterOptions.cs create mode 100644 modules/docs/src/Volo.Docs.Web/HtmlConverting/IDocumentToHtmlConverter.cs create mode 100644 modules/docs/src/Volo.Docs.Web/HtmlConverting/IDocumentToHtmlConverterFactory.cs rename modules/docs/src/Volo.Docs.Web/{Formatting/MarkdownDocumentConverter.cs => Markdown/MarkdownDocumentToHtmlConverter.cs} (95%) diff --git a/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Documents/DocumentStoreFactory.cs b/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Documents/DocumentStoreFactory.cs index 0cd2b75f7f..9e13dd2fd8 100644 --- a/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Documents/DocumentStoreFactory.cs +++ b/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Documents/DocumentStoreFactory.cs @@ -24,7 +24,7 @@ namespace Volo.Docs.Documents var serviceType = Options.Stores.GetOrDefault(storeType); if (serviceType == null) { - throw new ApplicationException($"Undefined document store: {storeType}"); + throw new ApplicationException($"Unknown document store: {storeType}"); } return (IDocumentStore) ServiceProvider.GetRequiredService(serviceType); diff --git a/modules/docs/src/Volo.Docs.Web/DocsWebModule.cs b/modules/docs/src/Volo.Docs.Web/DocsWebModule.cs index c583215be9..1791463fb3 100644 --- a/modules/docs/src/Volo.Docs.Web/DocsWebModule.cs +++ b/modules/docs/src/Volo.Docs.Web/DocsWebModule.cs @@ -5,7 +5,9 @@ using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap; using Volo.Abp.AutoMapper; using Volo.Abp.Modularity; using Volo.Abp.VirtualFileSystem; +using Volo.Docs.HtmlConverting; using Volo.Docs.Localization; +using Volo.Docs.Markdown; namespace Volo.Docs { @@ -40,6 +42,11 @@ namespace Volo.Docs { options.AddProfile(validate: true); }); + + Configure(options => + { + options.Converters[MarkdownDocumentToHtmlConverter.Type] = typeof(MarkdownDocumentToHtmlConverter); + }); } } } diff --git a/modules/docs/src/Volo.Docs.Web/Formatting/DocumentConverterFactory.cs b/modules/docs/src/Volo.Docs.Web/Formatting/DocumentConverterFactory.cs deleted file mode 100644 index 74c73590c2..0000000000 --- a/modules/docs/src/Volo.Docs.Web/Formatting/DocumentConverterFactory.cs +++ /dev/null @@ -1,27 +0,0 @@ -using System; -using Microsoft.Extensions.DependencyInjection; -using Volo.Abp.DependencyInjection; - -namespace Volo.Docs.Formatting -{ - public class DocumentConverterFactory : IDocumentConverterFactory, ITransientDependency - { - private readonly IServiceProvider _serviceProvider; - - public DocumentConverterFactory(IServiceProvider serviceProvider) - { - _serviceProvider = serviceProvider; - } - - public IDocumentConverter Create(string format) - { - switch (format.ToLowerInvariant()) - { - case MarkdownDocumentConverter.Type: - return _serviceProvider.GetRequiredService(); - default: - throw new ApplicationException($"Undefined document formatting: {format}"); - } - } - } -} \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Web/Formatting/IDocumentConverter.cs b/modules/docs/src/Volo.Docs.Web/Formatting/IDocumentConverter.cs deleted file mode 100644 index ef11fc6851..0000000000 --- a/modules/docs/src/Volo.Docs.Web/Formatting/IDocumentConverter.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace Volo.Docs.Formatting -{ - public interface IDocumentConverter - { - string Convert(string content); - - string NormalizeLinks(string content, string projectShortName, string version, string documentLocalDirectory); - } -} \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Web/Formatting/IDocumentConverterFactory.cs b/modules/docs/src/Volo.Docs.Web/Formatting/IDocumentConverterFactory.cs deleted file mode 100644 index 20fe67f142..0000000000 --- a/modules/docs/src/Volo.Docs.Web/Formatting/IDocumentConverterFactory.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace Volo.Docs.Formatting -{ - public interface IDocumentConverterFactory - { - IDocumentConverter Create(string format); - } -} \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Web/HtmlConverting/DocumentToHtmlConverterFactory.cs b/modules/docs/src/Volo.Docs.Web/HtmlConverting/DocumentToHtmlConverterFactory.cs new file mode 100644 index 0000000000..a6a7978eee --- /dev/null +++ b/modules/docs/src/Volo.Docs.Web/HtmlConverting/DocumentToHtmlConverterFactory.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Options; +using Volo.Abp.DependencyInjection; + +namespace Volo.Docs.HtmlConverting +{ + public class DocumentToHtmlConverterFactory : IDocumentToHtmlConverterFactory, ITransientDependency + { + protected DocumentToHtmlConverterOptions Options { get; } + protected IServiceProvider ServiceProvider { get; } + + public DocumentToHtmlConverterFactory( + IServiceProvider serviceProvider, + IOptions options) + { + ServiceProvider = serviceProvider; + Options = options.Value; + } + + public virtual IDocumentToHtmlConverter Create(string format) + { + var serviceType = Options.Converters.GetOrDefault(format); + if (serviceType == null) + { + throw new ApplicationException($"Unknown document format: {format}"); + } + + return (IDocumentToHtmlConverter)ServiceProvider.GetRequiredService(serviceType); + } + } +} \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Web/HtmlConverting/DocumentToHtmlConverterOptions.cs b/modules/docs/src/Volo.Docs.Web/HtmlConverting/DocumentToHtmlConverterOptions.cs new file mode 100644 index 0000000000..f332f6f58a --- /dev/null +++ b/modules/docs/src/Volo.Docs.Web/HtmlConverting/DocumentToHtmlConverterOptions.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; + +namespace Volo.Docs.HtmlConverting +{ + public class DocumentToHtmlConverterOptions + { + public Dictionary Converters { get; set; } + + public DocumentToHtmlConverterOptions() + { + Converters = new Dictionary(); + } + } +} diff --git a/modules/docs/src/Volo.Docs.Web/HtmlConverting/IDocumentToHtmlConverter.cs b/modules/docs/src/Volo.Docs.Web/HtmlConverting/IDocumentToHtmlConverter.cs new file mode 100644 index 0000000000..8948c39942 --- /dev/null +++ b/modules/docs/src/Volo.Docs.Web/HtmlConverting/IDocumentToHtmlConverter.cs @@ -0,0 +1,14 @@ +namespace Volo.Docs.HtmlConverting +{ + public interface IDocumentToHtmlConverter + { + string Convert(string content); + + string NormalizeLinks( + string content, + string projectShortName, + string version, + string documentLocalDirectory + ); + } +} \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Web/HtmlConverting/IDocumentToHtmlConverterFactory.cs b/modules/docs/src/Volo.Docs.Web/HtmlConverting/IDocumentToHtmlConverterFactory.cs new file mode 100644 index 0000000000..9cdca43a8f --- /dev/null +++ b/modules/docs/src/Volo.Docs.Web/HtmlConverting/IDocumentToHtmlConverterFactory.cs @@ -0,0 +1,7 @@ +namespace Volo.Docs.HtmlConverting +{ + public interface IDocumentToHtmlConverterFactory + { + IDocumentToHtmlConverter Create(string format); + } +} \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Web/Formatting/MarkdownDocumentConverter.cs b/modules/docs/src/Volo.Docs.Web/Markdown/MarkdownDocumentToHtmlConverter.cs similarity index 95% rename from modules/docs/src/Volo.Docs.Web/Formatting/MarkdownDocumentConverter.cs rename to modules/docs/src/Volo.Docs.Web/Markdown/MarkdownDocumentToHtmlConverter.cs index c2189f2d72..01d1c92667 100644 --- a/modules/docs/src/Volo.Docs.Web/Formatting/MarkdownDocumentConverter.cs +++ b/modules/docs/src/Volo.Docs.Web/Markdown/MarkdownDocumentToHtmlConverter.cs @@ -1,13 +1,14 @@ -using CommonMark; -using System; +using System; using System.Text; using System.Text.RegularExpressions; +using CommonMark; using Volo.Abp.DependencyInjection; +using Volo.Docs.HtmlConverting; using Volo.Docs.Utils; -namespace Volo.Docs.Formatting +namespace Volo.Docs.Markdown { - public class MarkdownDocumentConverter : IDocumentConverter, ITransientDependency + public class MarkdownDocumentToHtmlConverter : IDocumentToHtmlConverter, ITransientDependency { public const string Type = "md"; diff --git a/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml.cs b/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml.cs index bbc4078ab1..f7c8a9ffdc 100644 --- a/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml.cs +++ b/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml.cs @@ -7,7 +7,7 @@ using Microsoft.AspNetCore.Mvc.RazorPages; using Microsoft.AspNetCore.Mvc.Rendering; using Volo.Abp.AspNetCore.Mvc.UI.RazorPages; using Volo.Docs.Documents; -using Volo.Docs.Formatting; +using Volo.Docs.HtmlConverting; using Volo.Docs.Models; using Volo.Docs.Projects; @@ -41,16 +41,16 @@ namespace Volo.Docs.Pages.Documents.Project public VersionInfo LatestVersionInfo { get; private set; } private readonly IDocumentAppService _documentAppService; - private readonly IDocumentConverterFactory _documentConverterFactory; + private readonly IDocumentToHtmlConverterFactory _documentToHtmlConverterFactory; private readonly IProjectAppService _projectAppService; public IndexModel( IDocumentAppService documentAppService, - IDocumentConverterFactory documentConverterFactory, + IDocumentToHtmlConverterFactory documentToHtmlConverterFactory, IProjectAppService projectAppService) { _documentAppService = documentAppService; - _documentConverterFactory = documentConverterFactory; + _documentToHtmlConverterFactory = documentToHtmlConverterFactory; _projectAppService = projectAppService; } @@ -206,7 +206,7 @@ namespace Volo.Docs.Pages.Documents.Project return; } - var converter = _documentConverterFactory.Create(Document.Format ?? ProjectFormat); + var converter = _documentToHtmlConverterFactory.Create(Document.Format ?? ProjectFormat); var content = converter.NormalizeLinks(Document.Content, Document.Project.ShortName, GetSpecificVersionOrLatest(), Document.LocalDirectory); content = converter.Convert(content); From 48056e55ad97db3ec4ad9630d134027c4364682a Mon Sep 17 00:00:00 2001 From: Halil ibrahim Kalkan Date: Thu, 6 Dec 2018 10:38:09 +0300 Subject: [PATCH 37/60] unify and cleanup scss files --- .../Pages/Documents/Index.cshtml.cs | 1 + .../Volo.Docs.Web/Pages/Documents/_docs.css | 433 ---------- .../Pages/Documents/_docs.min.css | 1 - .../Volo.Docs.Web/Pages/Documents/_docs.scss | 730 ---------------- .../Pages/Documents/_responsive.css | 79 -- .../Pages/Documents/_responsive.min.css | 1 - .../Pages/Documents/_responsive.scss | 91 -- .../src/Volo.Docs.Web/Pages/Documents/vs.css | 16 - .../src/Volo.Docs.Web/Pages/Documents/vs.js | 9 - .../Volo.Docs.Web/Pages/Documents/vs.min.css | 2 +- .../src/Volo.Docs.Web/Pages/Documents/vs.scss | 811 +++++++++++++++++- .../src/Volo.Docs.Web/compilerconfig.json | 8 - 12 files changed, 810 insertions(+), 1372 deletions(-) delete mode 100644 modules/docs/src/Volo.Docs.Web/Pages/Documents/_docs.css delete mode 100644 modules/docs/src/Volo.Docs.Web/Pages/Documents/_docs.min.css delete mode 100644 modules/docs/src/Volo.Docs.Web/Pages/Documents/_docs.scss delete mode 100644 modules/docs/src/Volo.Docs.Web/Pages/Documents/_responsive.css delete mode 100644 modules/docs/src/Volo.Docs.Web/Pages/Documents/_responsive.min.css delete mode 100644 modules/docs/src/Volo.Docs.Web/Pages/Documents/_responsive.scss diff --git a/modules/docs/src/Volo.Docs.Web/Pages/Documents/Index.cshtml.cs b/modules/docs/src/Volo.Docs.Web/Pages/Documents/Index.cshtml.cs index 97a2c85747..552aa0c21d 100644 --- a/modules/docs/src/Volo.Docs.Web/Pages/Documents/Index.cshtml.cs +++ b/modules/docs/src/Volo.Docs.Web/Pages/Documents/Index.cshtml.cs @@ -32,6 +32,7 @@ namespace Volo.Docs.Pages.Documents } Projects = listResult.Items; + return Page(); } } diff --git a/modules/docs/src/Volo.Docs.Web/Pages/Documents/_docs.css b/modules/docs/src/Volo.Docs.Web/Pages/Documents/_docs.css deleted file mode 100644 index 7f4a05c75d..0000000000 --- a/modules/docs/src/Volo.Docs.Web/Pages/Documents/_docs.css +++ /dev/null @@ -1,433 +0,0 @@ -body { - position: relative; } - -.docs-page { - background: #f5f7f9; } - .docs-page .anchorjs-link { - transition: all .25s linear; } - .docs-page *:hover > .anchorjs-link { - margin-left: -1.125em !important; - transition: color .25s linear; - color: gray; } - .docs-page .anchorjs-link:hover { - color: #007bff; - text-decoration: none; } - .docs-page .docs-sidebar { - background: #f5f7f9; - padding-right: 1rem; - position: relative; - top: 0px; - left: 0; - position: fixed; } - .docs-page .docs-sidebar .docs-sidebar-wrapper { - width: 270px; - float: right; } - .docs-page .docs-sidebar .docs-sidebar-wrapper input.form-control { - background: none; - padding-left: 36px; - width: 100%; - background: #e9ecef; - border: 0; } - .docs-page .docs-sidebar .docs-sidebar-wrapper input.form-control:focus, .docs-page .docs-sidebar .docs-sidebar-wrapper input.form-control:active, .docs-page .docs-sidebar .docs-sidebar-wrapper input.form-control:hover, .docs-page .docs-sidebar .docs-sidebar-wrapper input.form-control:visited { - box-shadow: none; } - .docs-page .docs-sidebar .docs-sidebar-wrapper .docs-version { - position: relative; - padding: 0 1rem; - margin: .5rem 0 1rem; } - .docs-page .docs-sidebar .docs-sidebar-wrapper .docs-version .version-select { - border-radius: 8px; } - .docs-page .docs-sidebar .docs-sidebar-wrapper .docs-version .version-select .input-group-text { - border: 0; } - .docs-page .docs-sidebar .docs-sidebar-wrapper .docs-version .version-select select.form-control { - line-height: 1; - border-top-left-radius: 0; - border-bottom-left-radius: 0; - padding: .3em .5em .5em; - border: 0; } - .docs-page .docs-sidebar .docs-sidebar-wrapper .docs-version .version-select select.form-control:focus, .docs-page .docs-sidebar .docs-sidebar-wrapper .docs-version .version-select select.form-control:active, .docs-page .docs-sidebar .docs-sidebar-wrapper .docs-version .version-select select.form-control:hover, .docs-page .docs-sidebar .docs-sidebar-wrapper .docs-version .version-select select.form-control:visited { - box-shadow: none; } - .docs-page .docs-sidebar .docs-sidebar-wrapper .docs-filter { - position: relative; - padding: 0 1rem; - margin: .5rem 0; - font-size: .9em; } - .docs-page .docs-sidebar .docs-sidebar-wrapper .docs-filter .filter-icon { - position: absolute; - top: 0px; - padding: 8px 10px; - line-height: 1; - left: 16px; - background: none; - padding: 0.375rem 0.75rem; - font-size: 1rem; - line-height: 1.5; } - .docs-page .docs-sidebar .docs-sidebar-wrapper .docs-filter .filter-icon i.fa { - color: #ddd; } - .docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list { - height: 100vh; } - .docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list > ul { - display: block; - height: calc(100vh - 210px); } - .docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul { - font-size: .935em; - list-style: none; - padding: 0 1rem; - margin: 0; } - .docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li { - margin-left: 0px; - padding-left: 24px; - display: block; - width: 100%; - position: relative; } - .docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li a { - color: #999; - font-weight: 700; - padding: 7px 0; - display: block; - border-bottom: 1px solid #eeeff3; } - .docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li a:hover { - color: #000; } - .docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li a.last-link { - top: 11px; - color: #aaa; } - .docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li span.tree-toggle { - color: #999; - padding: 7px 0; - display: block; - border-bottom: 1px solid #eeeff3; } - .docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li .plus-icon { - font-size: .85em; - transition: .3s; - width: 18px; - height: 18px; - text-align: center; - padding: 0; - line-height: 1; - border-radius: 50%; - margin-right: 4px; - position: absolute; - left: 2px; - top: 11px; - color: #aaa; - cursor: default; } - .docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li .plus-icon .fa-long-arrow-right.no-link { - color: #555; } - .docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li .plus-icon .fa-chevron-right { - cursor: pointer; } - .docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li ul { - padding: 0; } - .docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li ul li a { - font-weight: 400; } - .docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li ul li ul { - padding: 0; } - .docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li ul li ul li a { - font-weight: 300; } - .docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li.selected-tree > a { - color: #000; - transition: .4s; } - .docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li.selected-tree > span .fa { - transform: rotate(90deg); - color: #007bff; } - .docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li.selected-tree.last-link > span .fa { - transform: rotate(0deg); } - .docs-page .docs-sidebar .docs-top .navbar-logo .navbar-brand { - font-size: 1.5rem; - color: #000; - font-weight: 700; - padding: 20px 0 10px; - line-height: 1; } - .docs-page .docs-sidebar .docs-top .navbar-logo .navbar-brand strong { - font-weight: 300; - text-transform: uppercase; - font-size: .9rem; - opacity: .6; } - .docs-page .docs-sidebar .docs-top .navbar-logo .go-back-site { - color: #000; - opacity: .15; - transition: .4s; - font-size: .75rem; - font-weight: 300; } - .docs-page .docs-sidebar .docs-top .navbar-logo .go-back-site:hover { - text-decoration: none; - opacity: .5; } - .docs-page .docs-sidebar .docs-top .navbar-logo .navbar-logo-desc { - font-size: .85em; } - .docs-page .docs-sidebar .docs-top .navbar-logo .navbar-logo-desc strong { - display: block; } - .docs-page .docs-content .docs-link-btns { - border-bottom: 1px solid #f4f5f7; - background: #fdfdfd; - padding: 10px 20px; - margin: 0 -15px; - text-align: right; - font-size: .8em; } - .docs-page .docs-content .docs-link-btns a { - color: #999; } - .docs-page .docs-content .docs-link-btns a:hover { - color: #444; - text-decoration: none; } - .docs-page .docs-content .docs-text-field { - padding: 2rem; } - .docs-page .docs-content article.docs-body h1 { - padding-top: 2rem; - font-size: 2.25rem; - padding-bottom: 10px; } - .docs-page .docs-content article.docs-body h2 { - padding-top: 2rem; - padding-bottom: 10px; - font-size: 2rem; } - .docs-page .docs-content article.docs-body h3, .docs-page .docs-content article.docs-body h4, .docs-page .docs-content article.docs-body h5, .docs-page .docs-content article.docs-body h6 { - padding-top: 20px; - padding-bottom: 5px; - font-size: 1.5rem; } - .docs-page .docs-content article.docs-body h1, .docs-page .docs-content article.docs-body h2, .docs-page .docs-content article.docs-body h3, .docs-page .docs-content article.docs-body h4, .docs-page .docs-content article.docs-body h5, .docs-page .docs-content article.docs-body h6 { - position: relative; } - .docs-page .docs-content article.docs-body h1 .anchor, .docs-page .docs-content article.docs-body h2 .anchor, .docs-page .docs-content article.docs-body h3 .anchor, .docs-page .docs-content article.docs-body h4 .anchor, .docs-page .docs-content article.docs-body h5 .anchor, .docs-page .docs-content article.docs-body h6 .anchor { - position: absolute; - right: -26px; - font-size: 18px; - bottom: 5px; - color: #999; - opacity: 0; - transition: .5s; } - .docs-page .docs-content article.docs-body h1:hover .anchor, .docs-page .docs-content article.docs-body h2:hover .anchor, .docs-page .docs-content article.docs-body h3:hover .anchor, .docs-page .docs-content article.docs-body h4:hover .anchor, .docs-page .docs-content article.docs-body h5:hover .anchor, .docs-page .docs-content article.docs-body h6:hover .anchor { - opacity: 1; } - .docs-page .docs-content article.docs-body img { - max-width: 100%; - border: 1px solid #f4f5f7; - margin: 15px 0 25px; - box-shadow: 0 0 45px #f8f9fa; - border-radius: 6px; } - .docs-page .docs-page-index { - min-height: 100vh; } - .docs-page .docs-page-index #scroll-index { - max-height: 100vh; } - .docs-page .docs-page-index .docs-inner-anchors { - position: fixed; - top: 0px; - /* max-width: 270px; */ - padding: 10px; - font-size: .90em; - /* height: 100vh; */ } - .docs-page .docs-page-index .docs-inner-anchors .navbar .nav-pills { - font-size: .92em; - margin-left: 15px; - border-left: 1px solid #eee; } - .docs-page .docs-page-index .docs-inner-anchors .navbar .nav-pills .nav-link { - padding: 3px 14px 4px; - color: #aaa; - line-height: 1.2; - position: relative; - border-left: 1px solid #eee; - border-radius: 0; - margin-left: -1px; - margin-top: 1px; - margin-bottom: 1px; - transition: .2s; } - .docs-page .docs-page-index .docs-inner-anchors .navbar .nav-pills .nav-link.active { - border-left: 2px solid #007bff; - background: none; - color: #007bff; } - .docs-page .docs-page-index .docs-inner-anchors .navbar .nav-pills .nav-pills .nav-link.active { - color: #007bff; } - .docs-page .docs-page-index .docs-inner-anchors .navbar .nav-pills .nav-pills .nav-pills .nav-link.active { - color: #007bff; } - .docs-page .docs-page-index .docs-inner-anchors .index-scroll { - margin-left: -30px; } - .docs-page .docs-page-index .docs-inner-anchors .docs-anchors-wrapper { - max-width: 300px; - float: left; } - .docs-page .docs-page-index .scroll-top-btn { - display: none; - font-size: .85em; - color: #aaa; - text-decoration: none; - padding-left: 18px; } - .docs-page .docs-page-index .scroll-top-btn.showup { - display: block; } - -@media (min-width: 1100px) { - .container { - max-width: 1080px; } - .docs-page .docs-sidebar.dark-sidebar { - background: #191919; } - .docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-version .version-select select.form-control { - background: #333; - border-color: #333; - color: #999; } - .docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-version .version-select label { - background: #444; - border-color: #444; - color: #ddd; } - .docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-filter .form-control { - background: #333; - color: #999; } - .docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-filter select { - border: 0; - border-radius: 6px; } - .docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-filter .filter-icon i.fa { - color: #aaa; } - .docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-tree-list ul li a { - color: #aaa; - border-bottom: 1px solid #333; } - .docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-tree-list ul li a:hover { - color: #fff; } - .docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-tree-list ul li a .plus-icon { - font-size: .85em; - transition: .3s; - width: 18px; - height: 18px; - text-align: center; - padding: 0; - line-height: 1; - border-radius: 50%; - margin-right: 4px; - position: absolute; - left: 2px; - top: 11px; - color: #aaa; - cursor: default; } - .docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-tree-list ul li a .plus-icon .fa-long-arrow-right.no-link { - color: #555; } - .docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-tree-list ul li a .plus-icon .fa-chevron-right { - cursor: pointer; } - .docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-tree-list ul li a .plus-icon.last-link { - top: 11px; } - .docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-tree-list ul li span.tree-toggle { - color: #555; - padding: 7px 0; - display: block; - border-bottom: 1px solid #333; } - .docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-tree-list ul li.selected-tree > a { - color: #fff; - transition: .4s; } - .docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-tree-list ul li.selected-tree > a span .fa { - color: #fff; } - .docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-tree-list ul li.selected-tree > a span:not(.last-link) .fa { - transform: rotate(90deg); - color: #fff; } - .docs-page .docs-sidebar.dark-sidebar .docs-top .navbar-logo .navbar-brand { - color: #fff; - text-transform: uppercase; } - .docs-page .docs-sidebar.dark-sidebar .docs-top .navbar-logo .go-back-site { - color: #fff; } - .docs-page .docs-sidebar.dark-sidebar .docs-top .navbar-logo .navbar-logo-desc { - color: #ddd; } } - -@media (min-width: 1366px) { - .container { - max-width: 1340px; } } - -@media (min-width: 1440px) { - .container { - max-width: 1400px; } } - -@media (max-width: 767px) { - .docs-page .docs-content article.docs-body h1 { - padding-top: 1.5rem; } - .docs-page { - background: #f5f7f9; } - .docs-page > .container-fluid { - display: block; } - .docs-page > .container-fluid > .row { - display: block; } - .docs-page .docs-sidebar { - position: fixed; - max-width: 100%; - width: 100%; - display: block; - padding: 0 !important; - top: 0; - left: 0; - z-index: 100; - right: 0; } - .docs-page .docs-sidebar .docs-sidebar-wrapper { - max-width: 100%; - width: 100%; - top: 0px; - position: relative; - margin: 0 !important; - height: 72px; } - .docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list { - padding: .5rem 1.5rem 2rem 1.5rem; - position: fixed; - top: 70px; - font-size: 17px; - left: 0; - width: 100%; - z-index: 100; - background: #f5f7f9; - display: none; } - .docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list .docs-filter { - position: relative; - padding: 0 0 1rem !important; } - .docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list .docs-filter .filter-icon { - left: 0px; } - .docs-page .docs-sidebar .docs-top .navbar-logo { - padding: 0rem; - padding-top: .3rem; - display: block; - text-align: center; } - .docs-page .docs-sidebar .docs-top .navbar-logo .navbar-brand { - font-size: 1.5rem; - font-weight: 700; - display: block; - margin-right: 0em; - padding: 7px 0 10px; - text-transform: uppercase; } - .docs-page .docs-sidebar .docs-top .navbar-logo .navbar-brand .docs-logo { - width: 110px; } - .docs-page .docs-sidebar .docs-top .navbar-logo .go-back-site { - display: none; } - .docs-page .docs-sidebar .docs-top .navbar-logo .navbar-logo-desc { - font-size: 1em; - display: none; } - .docs-page .docs-sidebar .docs-top .open-dmenu { - position: absolute; - top: 10px; - left: 20px; } - .docs-page .docs-content { - padding-top: 72px; - max-width: 100%; - display: block !important; } - .docs-page .docs-content .docs-text-field { - padding: 1rem 1.5rem; } - .docs-page .docs-page-index { - display: none; } } - -.for-mobile { - display: none; } - -.for-desktop { - display: inline-block; } - -pre[class*="language-"] { - padding: 1.4em 2em !important; - margin: 15px 0 25px !important; - border-radius: 6px; } - -code { - padding: 0.2em 0.4em; - margin: 0; - font-size: 82%; - background-color: #f0f1f3; - border-radius: 3px; - color: #28a745; } - -pre code { - padding: 0; } - -pre .token.keyword { - color: #569cd6; } - -pre .token.atrule, pre .token.attr-value, pre .token.function, pre .token.class-name { - color: #d69d85; } - -:not(pre) > code[class*="language-"], pre[class*="language-"] { - background: #191919 !important; } - -div.code-toolbar > .toolbar span { - cursor: default; } - -div.code-toolbar > .toolbar a { - cursor: copy; } diff --git a/modules/docs/src/Volo.Docs.Web/Pages/Documents/_docs.min.css b/modules/docs/src/Volo.Docs.Web/Pages/Documents/_docs.min.css deleted file mode 100644 index d45859a5eb..0000000000 --- a/modules/docs/src/Volo.Docs.Web/Pages/Documents/_docs.min.css +++ /dev/null @@ -1 +0,0 @@ -body{position:relative;}.docs-page{background:#f5f7f9;}.docs-page .anchorjs-link{transition:all .25s linear;}.docs-page *:hover>.anchorjs-link{margin-left:-1.125em !important;transition:color .25s linear;color:#808080;}.docs-page .anchorjs-link:hover{color:#007bff;text-decoration:none;}.docs-page .docs-sidebar{background:#f5f7f9;padding-right:1rem;position:relative;top:0;left:0;position:fixed;}.docs-page .docs-sidebar .docs-sidebar-wrapper{width:270px;float:right;}.docs-page .docs-sidebar .docs-sidebar-wrapper input.form-control{background:none;padding-left:36px;width:100%;background:#e9ecef;border:0;}.docs-page .docs-sidebar .docs-sidebar-wrapper input.form-control:focus,.docs-page .docs-sidebar .docs-sidebar-wrapper input.form-control:active,.docs-page .docs-sidebar .docs-sidebar-wrapper input.form-control:hover,.docs-page .docs-sidebar .docs-sidebar-wrapper input.form-control:visited{box-shadow:none;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-version{position:relative;padding:0 1rem;margin:.5rem 0 1rem;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-version .version-select{border-radius:8px;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-version .version-select .input-group-text{border:0;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-version .version-select select.form-control{line-height:1;border-top-left-radius:0;border-bottom-left-radius:0;padding:.3em .5em .5em;border:0;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-version .version-select select.form-control:focus,.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-version .version-select select.form-control:active,.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-version .version-select select.form-control:hover,.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-version .version-select select.form-control:visited{box-shadow:none;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-filter{position:relative;padding:0 1rem;margin:.5rem 0;font-size:.9em;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-filter .filter-icon{position:absolute;top:0;padding:8px 10px;line-height:1;left:16px;background:none;padding:.375rem .75rem;font-size:1rem;line-height:1.5;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-filter .filter-icon i.fa{color:#ddd;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list{height:100vh;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list>ul{display:block;height:calc(100vh - 210px);}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul{font-size:.935em;list-style:none;padding:0 1rem;margin:0;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li{margin-left:0;padding-left:24px;display:block;width:100%;position:relative;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li a{color:#999;font-weight:700;padding:7px 0;display:block;border-bottom:1px solid #eeeff3;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li a:hover{color:#000;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li a.last-link{top:11px;color:#aaa;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li span.tree-toggle{color:#999;padding:7px 0;display:block;border-bottom:1px solid #eeeff3;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li .plus-icon{font-size:.85em;transition:.3s;width:18px;height:18px;text-align:center;padding:0;line-height:1;border-radius:50%;margin-right:4px;position:absolute;left:2px;top:11px;color:#aaa;cursor:default;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li .plus-icon .fa-long-arrow-right.no-link{color:#555;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li .plus-icon .fa-chevron-right{cursor:pointer;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li ul{padding:0;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li ul li a{font-weight:400;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li ul li ul{padding:0;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li ul li ul li a{font-weight:300;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li.selected-tree>a{color:#000;transition:.4s;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li.selected-tree>span .fa{transform:rotate(90deg);color:#007bff;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li.selected-tree.last-link>span .fa{transform:rotate(0deg);}.docs-page .docs-sidebar .docs-top .navbar-logo .navbar-brand{font-size:1.5rem;color:#000;font-weight:700;padding:20px 0 10px;line-height:1;}.docs-page .docs-sidebar .docs-top .navbar-logo .navbar-brand strong{font-weight:300;text-transform:uppercase;font-size:.9rem;opacity:.6;}.docs-page .docs-sidebar .docs-top .navbar-logo .go-back-site{color:#000;opacity:.15;transition:.4s;font-size:.75rem;font-weight:300;}.docs-page .docs-sidebar .docs-top .navbar-logo .go-back-site:hover{text-decoration:none;opacity:.5;}.docs-page .docs-sidebar .docs-top .navbar-logo .navbar-logo-desc{font-size:.85em;}.docs-page .docs-sidebar .docs-top .navbar-logo .navbar-logo-desc strong{display:block;}.docs-page .docs-content .docs-link-btns{border-bottom:1px solid #f4f5f7;background:#fdfdfd;padding:10px 20px;margin:0 -15px;text-align:right;font-size:.8em;}.docs-page .docs-content .docs-link-btns a{color:#999;}.docs-page .docs-content .docs-link-btns a:hover{color:#444;text-decoration:none;}.docs-page .docs-content .docs-text-field{padding:2rem;}.docs-page .docs-content article.docs-body h1{padding-top:2rem;font-size:2.25rem;padding-bottom:10px;}.docs-page .docs-content article.docs-body h2{padding-top:2rem;padding-bottom:10px;font-size:2rem;}.docs-page .docs-content article.docs-body h3,.docs-page .docs-content article.docs-body h4,.docs-page .docs-content article.docs-body h5,.docs-page .docs-content article.docs-body h6{padding-top:20px;padding-bottom:5px;font-size:1.5rem;}.docs-page .docs-content article.docs-body h1,.docs-page .docs-content article.docs-body h2,.docs-page .docs-content article.docs-body h3,.docs-page .docs-content article.docs-body h4,.docs-page .docs-content article.docs-body h5,.docs-page .docs-content article.docs-body h6{position:relative;}.docs-page .docs-content article.docs-body h1 .anchor,.docs-page .docs-content article.docs-body h2 .anchor,.docs-page .docs-content article.docs-body h3 .anchor,.docs-page .docs-content article.docs-body h4 .anchor,.docs-page .docs-content article.docs-body h5 .anchor,.docs-page .docs-content article.docs-body h6 .anchor{position:absolute;right:-26px;font-size:18px;bottom:5px;color:#999;opacity:0;transition:.5s;}.docs-page .docs-content article.docs-body h1:hover .anchor,.docs-page .docs-content article.docs-body h2:hover .anchor,.docs-page .docs-content article.docs-body h3:hover .anchor,.docs-page .docs-content article.docs-body h4:hover .anchor,.docs-page .docs-content article.docs-body h5:hover .anchor,.docs-page .docs-content article.docs-body h6:hover .anchor{opacity:1;}.docs-page .docs-content article.docs-body img{max-width:100%;border:1px solid #f4f5f7;margin:15px 0 25px;box-shadow:0 0 45px #f8f9fa;border-radius:6px;}.docs-page .docs-page-index{min-height:100vh;}.docs-page .docs-page-index #scroll-index{max-height:100vh;}.docs-page .docs-page-index .docs-inner-anchors{position:fixed;top:0;padding:10px;font-size:.9em;}.docs-page .docs-page-index .docs-inner-anchors .navbar .nav-pills{font-size:.92em;margin-left:15px;border-left:1px solid #eee;}.docs-page .docs-page-index .docs-inner-anchors .navbar .nav-pills .nav-link{padding:3px 14px 4px;color:#aaa;line-height:1.2;position:relative;border-left:1px solid #eee;border-radius:0;margin-left:-1px;margin-top:1px;margin-bottom:1px;transition:.2s;}.docs-page .docs-page-index .docs-inner-anchors .navbar .nav-pills .nav-link.active{border-left:2px solid #007bff;background:none;color:#007bff;}.docs-page .docs-page-index .docs-inner-anchors .navbar .nav-pills .nav-pills .nav-link.active{color:#007bff;}.docs-page .docs-page-index .docs-inner-anchors .navbar .nav-pills .nav-pills .nav-pills .nav-link.active{color:#007bff;}.docs-page .docs-page-index .docs-inner-anchors .index-scroll{margin-left:-30px;}.docs-page .docs-page-index .docs-inner-anchors .docs-anchors-wrapper{max-width:300px;float:left;}.docs-page .docs-page-index .scroll-top-btn{display:none;font-size:.85em;color:#aaa;text-decoration:none;padding-left:18px;}.docs-page .docs-page-index .scroll-top-btn.showup{display:block;}@media(min-width:1100px){.container{max-width:1080px;}.docs-page .docs-sidebar.dark-sidebar{background:#191919;}.docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-version .version-select select.form-control{background:#333;border-color:#333;color:#999;}.docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-version .version-select label{background:#444;border-color:#444;color:#ddd;}.docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-filter .form-control{background:#333;color:#999;}.docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-filter select{border:0;border-radius:6px;}.docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-filter .filter-icon i.fa{color:#aaa;}.docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-tree-list ul li a{color:#aaa;border-bottom:1px solid #333;}.docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-tree-list ul li a:hover{color:#fff;}.docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-tree-list ul li a .plus-icon{font-size:.85em;transition:.3s;width:18px;height:18px;text-align:center;padding:0;line-height:1;border-radius:50%;margin-right:4px;position:absolute;left:2px;top:11px;color:#aaa;cursor:default;}.docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-tree-list ul li a .plus-icon .fa-long-arrow-right.no-link{color:#555;}.docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-tree-list ul li a .plus-icon .fa-chevron-right{cursor:pointer;}.docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-tree-list ul li a .plus-icon.last-link{top:11px;}.docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-tree-list ul li span.tree-toggle{color:#555;padding:7px 0;display:block;border-bottom:1px solid #333;}.docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-tree-list ul li.selected-tree>a{color:#fff;transition:.4s;}.docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-tree-list ul li.selected-tree>a span .fa{color:#fff;}.docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-tree-list ul li.selected-tree>a span:not(.last-link) .fa{transform:rotate(90deg);color:#fff;}.docs-page .docs-sidebar.dark-sidebar .docs-top .navbar-logo .navbar-brand{color:#fff;text-transform:uppercase;}.docs-page .docs-sidebar.dark-sidebar .docs-top .navbar-logo .go-back-site{color:#fff;}.docs-page .docs-sidebar.dark-sidebar .docs-top .navbar-logo .navbar-logo-desc{color:#ddd;}}@media(min-width:1366px){.container{max-width:1340px;}}@media(min-width:1440px){.container{max-width:1400px;}}@media(max-width:767px){.docs-page .docs-content article.docs-body h1{padding-top:1.5rem;}.docs-page{background:#f5f7f9;}.docs-page>.container-fluid{display:block;}.docs-page>.container-fluid>.row{display:block;}.docs-page .docs-sidebar{position:fixed;max-width:100%;width:100%;display:block;padding:0 !important;top:0;left:0;z-index:100;right:0;}.docs-page .docs-sidebar .docs-sidebar-wrapper{max-width:100%;width:100%;top:0;position:relative;margin:0 !important;height:72px;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list{padding:.5rem 1.5rem 2rem 1.5rem;position:fixed;top:70px;font-size:17px;left:0;width:100%;z-index:100;background:#f5f7f9;display:none;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list .docs-filter{position:relative;padding:0 0 1rem !important;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list .docs-filter .filter-icon{left:0;}.docs-page .docs-sidebar .docs-top .navbar-logo{padding:0;padding-top:.3rem;display:block;text-align:center;}.docs-page .docs-sidebar .docs-top .navbar-logo .navbar-brand{font-size:1.5rem;font-weight:700;display:block;margin-right:0;padding:7px 0 10px;text-transform:uppercase;}.docs-page .docs-sidebar .docs-top .navbar-logo .navbar-brand .docs-logo{width:110px;}.docs-page .docs-sidebar .docs-top .navbar-logo .go-back-site{display:none;}.docs-page .docs-sidebar .docs-top .navbar-logo .navbar-logo-desc{font-size:1em;display:none;}.docs-page .docs-sidebar .docs-top .open-dmenu{position:absolute;top:10px;left:20px;}.docs-page .docs-content{padding-top:72px;max-width:100%;display:block !important;}.docs-page .docs-content .docs-text-field{padding:1rem 1.5rem;}.docs-page .docs-page-index{display:none;}}.for-mobile{display:none;}.for-desktop{display:inline-block;}pre[class*="language-"]{padding:1.4em 2em !important;margin:15px 0 25px !important;border-radius:6px;}code{padding:.2em .4em;margin:0;font-size:82%;background-color:#f0f1f3;border-radius:3px;color:#28a745;}pre code{padding:0;}pre .token.keyword{color:#569cd6;}pre .token.atrule,pre .token.attr-value,pre .token.function,pre .token.class-name{color:#d69d85;}:not(pre)>code[class*="language-"],pre[class*="language-"]{background:#191919 !important;}div.code-toolbar>.toolbar span{cursor:default;}div.code-toolbar>.toolbar a{cursor:copy;} \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Web/Pages/Documents/_docs.scss b/modules/docs/src/Volo.Docs.Web/Pages/Documents/_docs.scss deleted file mode 100644 index ecb140ec1e..0000000000 --- a/modules/docs/src/Volo.Docs.Web/Pages/Documents/_docs.scss +++ /dev/null @@ -1,730 +0,0 @@ -body { - position: relative; -} -.docs-page { - background: rgb(245, 247, 249); - - .anchorjs-link { - transition: all .25s linear; - } - - *:hover > .anchorjs-link { - margin-left: -1.125em !important; - transition: color .25s linear; - color: gray; - } - - .anchorjs-link:hover { - color: #007bff; - text-decoration: none; - } - - .docs-sidebar { - background: #f5f7f9; - padding-right: 1rem; - position: relative; - top: 0px; - left: 0; - position: fixed; - - .docs-sidebar-wrapper { - width: 270px; - float: right; - - input.form-control { - background: none; - padding-left: 36px; - width: 100%; - background: #e9ecef; - border: 0; - - &:focus, &:active, &:hover, &:visited { - box-shadow: none; - } - } - - .docs-version { - position: relative; - padding: 0 1rem; - margin: .5rem 0 1rem; - - .version-select { - border-radius: 8px; - - .input-group-text { - border: 0; - } - - select.form-control { - line-height: 1; - border-top-left-radius: 0; - border-bottom-left-radius: 0; - padding: .3em .5em .5em; - border: 0; - - - &:focus, &:active, &:hover, &:visited { - box-shadow: none; - } - } - - label { - } - } - } - - .docs-filter { - position: relative; - padding: 0 1rem; - margin: .5rem 0; - font-size: .9em; - - .filter-icon { - position: absolute; - top: 0px; - padding: 8px 10px; - line-height: 1; - left: 16px; - background: none; - padding: 0.375rem 0.75rem; - font-size: 1rem; - line-height: 1.5; - - i.fa { - color: #ddd; - } - } - } - - .docs-tree-list { - height: 100vh; - - > ul { - display: block; - height: calc(100vh - 210px); - } - - ul { - font-size: .935em; - list-style: none; - padding: 0 1rem; - margin: 0; - - li { - margin-left: 0px; - padding-left: 24px; - display: block; - width: 100%; - position: relative; - - - a { - color: #999; - font-weight: 700; - padding: 7px 0; - display: block; - border-bottom: 1px solid #eeeff3; - - &:hover { - color: #000; - } - - &.last-link { - top: 11px; - color: #aaa; - } - } - - span.tree-toggle { - color: #999; - padding: 7px 0; - display: block; - border-bottom: 1px solid #eeeff3; - } - - .plus-icon { - font-size: .85em; - transition: .3s; - width: 18px; - height: 18px; - text-align: center; - padding: 0; - line-height: 1; - border-radius: 50%; - margin-right: 4px; - position: absolute; - left: 2px; - top: 11px; - color: #aaa; - cursor: default; - - .fa-long-arrow-right { - &.no-link { - color: #555; - } - } - - .fa-chevron-right { - cursor: pointer; - } - } - - ul { - padding: 0; - - li { - - a { - font-weight: 400; - } - - ul { - padding: 0; - - li { - a { - font-weight: 300; - } - } - } - } - } - - &.selected-tree { - > a { - color: #000; - transition: .4s; - } - - > span { - .fa { - transform: rotate(90deg); - color: #007bff; - } - } - - &.last-link { - > span { - .fa { - transform: rotate(0deg); - } - } - } - } - } - } - } - } - - .docs-top { - .navbar-logo { - .navbar-brand { - font-size: 1.5rem; - color: #000; - font-weight: 700; - padding: 20px 0 10px; - line-height: 1; - - strong { - font-weight: 300; - text-transform: uppercase; - font-size: .9rem; - opacity: .6; - } - } - - .go-back-site { - color: #000; - opacity: .15; - transition: .4s; - font-size: .75rem; - font-weight: 300; - - &:hover { - text-decoration: none; - opacity: .5; - } - } - - .navbar-logo-desc { - font-size: .85em; - - strong { - display: block; - } - } - } - } - } - - .docs-content { - .docs-link-btns { - border-bottom: 1px solid #f4f5f7; - background: #fdfdfd; - padding: 10px 20px; - margin: 0 -15px; - text-align: right; - font-size: .8em; - - a { - color: #999; - - &:hover { - color: #444; - text-decoration: none; - } - } - } - - .docs-text-field { - padding: 2rem; - } - - article.docs-body { - h1 { - padding-top: 2rem; - font-size: 2.25rem; - padding-bottom: 10px; - } - - h2 { - padding-top: 2rem; - padding-bottom: 10px; - font-size: 2rem; - } - - h3, h4, h5, h6 { - padding-top: 20px; - padding-bottom: 5px; - font-size: 1.5rem; - } - - h1, h2, h3, h4, h5, h6 { - position: relative; - - .anchor { - position: absolute; - right: -26px; - font-size: 18px; - bottom: 5px; - color: #999; - opacity: 0; - transition: .5s; - } - - &:hover { - .anchor { - opacity: 1; - } - } - } - - img { - max-width: 100%; - border: 1px solid #f4f5f7; - margin: 15px 0 25px; - box-shadow: 0 0 45px #f8f9fa; - border-radius: 6px; - } - } - } - - .docs-page-index { - min-height: 100vh; - - #scroll-index { - max-height: 100vh; - } - - .docs-inner-anchors { - position: fixed; - top: 0px; - /* max-width: 270px; */ - padding: 10px; - font-size: .90em; - /* height: 100vh; */ - .navbar { - .nav-pills { - font-size: .92em; - margin-left: 15px; - border-left: 1px solid #eee; - - .nav-link { - padding: 3px 14px 4px; - color: #aaa; - line-height: 1.2; - position: relative; - border-left: 1px solid #eee; - border-radius: 0; - margin-left: -1px; - margin-top: 1px; - margin-bottom: 1px; - transition: .2s; - - &.active { - border-left: 2px solid #007bff; - background: none; - color: #007bff; - } - } - - .nav-pills { - .nav-link { - &.active { - color: #007bff; - } - } - - .nav-pills { - .nav-link { - &.active { - color: #007bff; - } - } - } - } - } - } - - .index-scroll { - margin-left: -30px; - } - - .docs-anchors-wrapper { - max-width: 300px; - float: left; - } - } - - .scroll-top-btn { - display: none; - font-size: .85em; - color: #aaa; - text-decoration: none; - padding-left: 18px; - - &.showup { - display: block; - } - } - } -} - - -@media (min-width: 1100px) { - .container { - max-width: 1080px; - } - - .docs-page { - .docs-sidebar { - &.dark-sidebar { - background: #191919; - - .docs-sidebar-wrapper { - - .docs-version { - .version-select { - select.form-control { - background: #333; - border-color: #333; - color: #999; - } - - label { - background: #444; - border-color: #444; - color: #ddd; - } - } - } - - .docs-filter { - .form-control { - background: #333; - color: #999; - } - - select { - border: 0; - border-radius: 6px; - } - - .filter-icon { - i.fa { - color: #aaa; - } - } - } - - .docs-tree-list { - ul { - li { - - - a { - color: #aaa; - border-bottom: 1px solid #333; - - &:hover { - color: #fff; - } - - .plus-icon { - font-size: .85em; - transition: .3s; - width: 18px; - height: 18px; - text-align: center; - padding: 0; - line-height: 1; - border-radius: 50%; - margin-right: 4px; - position: absolute; - left: 2px; - top: 11px; - color: #aaa; - cursor: default; - - .fa-long-arrow-right { - &.no-link { - color: #555; - } - } - - .fa-chevron-right { - cursor: pointer; - } - - &.last-link { - top: 11px; - } - } - } - - - span.tree-toggle { - color: #555; - padding: 7px 0; - display: block; - border-bottom: 1px solid #333; - } - - - &.selected-tree { - > a { - color: #fff; - transition: .4s; - - span { - .fa { - color: #fff; - } - - &:not(.last-link) .fa { - transform: rotate(90deg); - color: #fff; - } - } - } - } - } - } - } - } - - .docs-top { - .navbar-logo { - .navbar-brand { - color: #fff; - text-transform: uppercase; - } - - .go-back-site { - color: #fff; - } - - .navbar-logo-desc { - color: #ddd; - } - } - } - } - } - } -} - -@media (min-width: 1366px) { - .container { - max-width: 1340px; - } -} - -@media (min-width: 1440px) { - .container { - max-width: 1400px; - } -} - -@media (max-width: 767px) { - .docs-page .docs-content article.docs-body h1 { - padding-top: 1.5rem; - } - - .docs-page { - > .container-fluid { - display: block; - - > .row { - display: block; - } - } - - background: rgb(245, 247, 249); - - .docs-sidebar { - position: fixed; - max-width: 100%; - width: 100%; - display: block; - padding: 0 !important; - top: 0; - left: 0; - z-index: 100; - right: 0; - - .docs-sidebar-wrapper { - max-width: 100%; - width: 100%; - top: 0px; - position: relative; - margin: 0 !important; - height: 72px; - - .docs-tree-list { - padding: .5rem 1.5rem 2rem 1.5rem; - position: fixed; - top: 70px; - font-size: 17px; - left: 0; - width: 100%; - z-index: 100; - background: #f5f7f9; - display: none; - - .docs-filter { - position: relative; - padding: 0 0 1rem !important; - - .filter-icon { - left: 0px; - } - } - } - } - - .docs-top { - .navbar-logo { - padding: 0rem; - padding-top: .3rem; - display: block; - text-align: center; - - .navbar-brand { - font-size: 1.5rem; - font-weight: 700; - display: block; - margin-right: 0em; - padding: 7px 0 10px; - text-transform: uppercase; - - .docs-logo { - width: 110px; - } - } - - .go-back-site { - display: none; - } - - .navbar-logo-desc { - font-size: 1em; - display: none; - } - } - - .open-dmenu { - position: absolute; - top: 10px; - left: 20px; - - .navbar-toggler-icon { - } - } - } - } - - .docs-content { - padding-top: 72px; - max-width: 100%; - display: block !important; - - .docs-text-field { - padding: 1rem 1.5rem; - } - } - - .docs-page-index { - display: none; - } - } -} - - -.for-mobile { - display: none; -} - -.for-desktop { - display: inline-block; -} - -pre[class*="language-"] { - padding: 1.4em 2em !important; - margin: 15px 0 25px !important; - border-radius: 6px; -} - -code { - padding: 0.2em 0.4em; - margin: 0; - font-size: 82%; - background-color: #f0f1f3; - border-radius: 3px; - color: #28a745; -} -pre { - code { - padding: 0; - } - - .token.keyword { - color: #569cd6; - } - - .token.atrule, .token.attr-value, .token.function, .token.class-name { - color: #d69d85; - } -} -:not(pre) > code[class*="language-"], pre[class*="language-"] { - background: #191919 !important; -} - - -div.code-toolbar > .toolbar span { - cursor: default; -} - -div.code-toolbar > .toolbar a { - cursor: copy; -} \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Web/Pages/Documents/_responsive.css b/modules/docs/src/Volo.Docs.Web/Pages/Documents/_responsive.css deleted file mode 100644 index ea46f1f37f..0000000000 --- a/modules/docs/src/Volo.Docs.Web/Pages/Documents/_responsive.css +++ /dev/null @@ -1,79 +0,0 @@ -body { - font-size: 14px; } - -.for-mobile { - display: inline-block; } - -.for-desktop { - display: none; } - -.close-mmenu, .close-dmenu { - position: absolute; - top: -78px; - left: 25px; - color: #fff; - font-size: 68px; - background: #fff; - opacity: 0; } - -.navbar { - padding: .5rem 1.75rem; } - .navbar .navbar-collapse { - background: #38003d; - position: fixed; - top: 86px; - left: 0; - width: 100%; - height: 100vh; - height: calc(100vh - 86px); - z-index: 100 !important; } - .navbar .navbar-collapse .navbar-nav { - height: 100vh; - padding: 20px 30px; - overflow: auto; } - .navbar .navbar-collapse .navbar-nav .nav-link { - padding: 1.2rem !important; } - .navbar .navbar-toggler { - padding: .5rem .75rem; - font-size: 1.5rem; - line-height: 1; - background-color: transparent; - border: 0; - border-radius: .25rem; - color: #fff !important; - margin-left: -1rem; } - -.jumbotron .btn, footer .btn { - display: block; - margin-bottom: 10px; } - -.multi-tenancy { - text-align: center !important; } - -.section-with-logos img { - margin: 15px; - opacity: 1; - -webkit-filter: grayscale(0%); - filter: grayscale(0%); } - -.jumbotron { - padding-top: 160px; - margin-top: -160px; - border-radius: 0; - padding-bottom: 40px; - margin-bottom: 0; - font-size: .85em; - padding-left: 45px; - padding-right: 45px; } - .jumbotron .jumbotron-logo { - display: none; } - -span.code-arrow { - padding: 0px 0 0px; - display: block; - transform: rotate(90deg); - font-size: 2em; } - -.mb-5, .my-5 { - margin-bottom: 2rem !important; } - diff --git a/modules/docs/src/Volo.Docs.Web/Pages/Documents/_responsive.min.css b/modules/docs/src/Volo.Docs.Web/Pages/Documents/_responsive.min.css deleted file mode 100644 index f990e0d7f0..0000000000 --- a/modules/docs/src/Volo.Docs.Web/Pages/Documents/_responsive.min.css +++ /dev/null @@ -1 +0,0 @@ -body{font-size:14px;}.for-mobile{display:inline-block;}.for-desktop{display:none;}.close-mmenu,.close-dmenu{position:absolute;top:-78px;left:25px;color:#fff;font-size:68px;background:#fff;opacity:0;}.navbar{padding:.5rem 1.75rem;}.navbar .navbar-collapse{background:#38003d;position:fixed;top:86px;left:0;width:100%;height:100vh;height:calc(100vh - 86px);z-index:100 !important;}.navbar .navbar-collapse .navbar-nav{height:100vh;padding:20px 30px;overflow:auto;}.navbar .navbar-collapse .navbar-nav .nav-link{padding:1.2rem !important;}.navbar .navbar-toggler{padding:.5rem .75rem;font-size:1.5rem;line-height:1;background-color:transparent;border:0;border-radius:.25rem;color:#fff !important;margin-left:-1rem;}.jumbotron .btn,footer .btn{display:block;margin-bottom:10px;}.multi-tenancy{text-align:center !important;}.section-with-logos img{margin:15px;opacity:1;-webkit-filter:grayscale(0%);filter:grayscale(0%);}.jumbotron{padding-top:160px;margin-top:-160px;border-radius:0;padding-bottom:40px;margin-bottom:0;font-size:.85em;padding-left:45px;padding-right:45px;}.jumbotron .jumbotron-logo{display:none;}span.code-arrow{padding:0 0 0;display:block;transform:rotate(90deg);font-size:2em;}.mb-5,.my-5{margin-bottom:2rem !important;} \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Web/Pages/Documents/_responsive.scss b/modules/docs/src/Volo.Docs.Web/Pages/Documents/_responsive.scss deleted file mode 100644 index 1dbc28608c..0000000000 --- a/modules/docs/src/Volo.Docs.Web/Pages/Documents/_responsive.scss +++ /dev/null @@ -1,91 +0,0 @@ - body { - font-size: 14px; - } -.for-mobile { - display: inline-block; -} -.for-desktop { - display: none; -} - -.close-mmenu, .close-dmenu { - position: absolute; - top: -78px; - left: 25px; - color: #fff; - font-size: 68px; - background: #fff; - opacity: 0; -} -.navbar { - padding: .5rem 1.75rem; - .navbar-collapse { - background: rgb(56, 0, 61); - position: fixed; - top: 86px; - left: 0; - width: 100%; - height: 100vh; - height: calc(100vh - 86px); - z-index: 100 !important; - .navbar-nav { - height: 100vh; - padding: 20px 30px; - overflow: auto; - .nav-link { - padding: 1.2rem !important; - } - } - } - - .navbar-toggler { - padding: .5rem .75rem; - font-size: 1.5rem; - line-height: 1; - background-color: transparent; - border: 0; - border-radius: .25rem; - color:#fff!important; - margin-left: -1rem; - } -} -.jumbotron, footer { - .btn { - display: block; - margin-bottom: 10px; - } -} -.multi-tenancy { - text-align: center !important; -} - -.section-with-logos img { - margin: 15px; - opacity: 1; - -webkit-filter: grayscale(0%); - filter: grayscale(0%); -} - -.jumbotron { - padding-top: 160px; - margin-top: -160px; - border-radius: 0; - padding-bottom: 40px; - margin-bottom: 0; - font-size: .85em; - - padding-left: 45px; - padding-right: 45px; - .jumbotron-logo { - display:none; - } -} -span.code-arrow { - padding: 0px 0 0px; - display: block; - transform: rotate(90deg); - font-size: 2em; -} -.mb-5, .my-5 { - margin-bottom: 2rem!important; -} diff --git a/modules/docs/src/Volo.Docs.Web/Pages/Documents/vs.css b/modules/docs/src/Volo.Docs.Web/Pages/Documents/vs.css index 5573b0147e..d41426ff3a 100644 --- a/modules/docs/src/Volo.Docs.Web/Pages/Documents/vs.css +++ b/modules/docs/src/Volo.Docs.Web/Pages/Documents/vs.css @@ -473,27 +473,11 @@ div.code-toolbar > .toolbar a { border-radius: .25rem; color: #fff !important; margin-left: -1rem; } - .jumbotron .btn, footer .btn { - display: block; - margin-bottom: 10px; } - .multi-tenancy { - text-align: center !important; } .section-with-logos img { margin: 15px; opacity: 1; -webkit-filter: grayscale(0%); filter: grayscale(0%); } - .jumbotron { - padding-top: 160px; - margin-top: -160px; - border-radius: 0; - padding-bottom: 40px; - margin-bottom: 0; - font-size: .85em; - padding-left: 45px; - padding-right: 45px; } - .jumbotron .jumbotron-logo { - display: none; } span.code-arrow { padding: 0px 0 0px; display: block; diff --git a/modules/docs/src/Volo.Docs.Web/Pages/Documents/vs.js b/modules/docs/src/Volo.Docs.Web/Pages/Documents/vs.js index 3cbc901467..4620a7b483 100644 --- a/modules/docs/src/Volo.Docs.Web/Pages/Documents/vs.js +++ b/modules/docs/src/Volo.Docs.Web/Pages/Documents/vs.js @@ -4,15 +4,6 @@ $('li:not(.last-link) a.tree-toggle').click(function () { }); $('li:not(.last-link) span.plus-icon i.fa-chevron-right').click(function () { - //var hasLink = $(this).parent().find("a").length > 0; - //if (!hasLink) { - // return; - //} - - ////if ($(this).find("i.fa-long-arrow-right").length > 0) { - //// return; - ////} - var $element = $(this).parent(); $element.parent().children('ul.tree').toggle(100); diff --git a/modules/docs/src/Volo.Docs.Web/Pages/Documents/vs.min.css b/modules/docs/src/Volo.Docs.Web/Pages/Documents/vs.min.css index 7d9af3836e..24185d8161 100644 --- a/modules/docs/src/Volo.Docs.Web/Pages/Documents/vs.min.css +++ b/modules/docs/src/Volo.Docs.Web/Pages/Documents/vs.min.css @@ -1 +1 @@ -body{position:relative;}.docs-page{background:#f5f7f9;}.docs-page .anchorjs-link{transition:all .25s linear;}.docs-page *:hover>.anchorjs-link{margin-left:-1.125em !important;transition:color .25s linear;color:#808080;}.docs-page .anchorjs-link:hover{color:#007bff;text-decoration:none;}.docs-page .docs-sidebar{background:#f5f7f9;padding-right:1rem;position:relative;top:0;left:0;position:fixed;}.docs-page .docs-sidebar .docs-sidebar-wrapper{width:270px;float:right;}.docs-page .docs-sidebar .docs-sidebar-wrapper input.form-control{background:none;padding-left:36px;width:100%;background:#e9ecef;border:0;}.docs-page .docs-sidebar .docs-sidebar-wrapper input.form-control:focus,.docs-page .docs-sidebar .docs-sidebar-wrapper input.form-control:active,.docs-page .docs-sidebar .docs-sidebar-wrapper input.form-control:hover,.docs-page .docs-sidebar .docs-sidebar-wrapper input.form-control:visited{box-shadow:none;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-version{position:relative;padding:0 1rem;margin:.5rem 0 1rem;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-version .version-select{border-radius:8px;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-version .version-select .input-group-text{border:0;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-version .version-select select.form-control{line-height:1;border-top-left-radius:0;border-bottom-left-radius:0;padding:.3em .5em .5em;border:0;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-version .version-select select.form-control:focus,.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-version .version-select select.form-control:active,.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-version .version-select select.form-control:hover,.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-version .version-select select.form-control:visited{box-shadow:none;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-filter{position:relative;padding:0 1rem;margin:.5rem 0;font-size:.9em;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-filter .filter-icon{position:absolute;top:0;padding:8px 10px;line-height:1;left:16px;background:none;padding:.375rem .75rem;font-size:1rem;line-height:1.5;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-filter .filter-icon i.fa{color:#ddd;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list{height:100vh;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list>ul{display:block;height:calc(100vh - 210px);}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul{font-size:.935em;list-style:none;padding:0 1rem;margin:0;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li{margin-left:0;padding-left:24px;display:block;width:100%;position:relative;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li a{color:#999;font-weight:700;padding:7px 0;display:block;border-bottom:1px solid #eeeff3;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li a:hover{color:#000;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li a.last-link{top:11px;color:#aaa;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li span.tree-toggle{color:#999;padding:7px 0;display:block;border-bottom:1px solid #eeeff3;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li .plus-icon{font-size:.85em;transition:.3s;width:18px;height:18px;text-align:center;padding:0;line-height:1;border-radius:50%;margin-right:4px;position:absolute;left:2px;top:11px;color:#aaa;cursor:default;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li .plus-icon .fa-long-arrow-right.no-link{color:#555;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li .plus-icon .fa-chevron-right{cursor:pointer;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li ul{padding:0;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li ul li a{font-weight:400;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li ul li ul{padding:0;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li ul li ul li a{font-weight:300;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li.selected-tree>a{color:#000;transition:.4s;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li.selected-tree>span .fa{transform:rotate(90deg);color:#007bff;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li.selected-tree.last-link>span .fa{transform:rotate(0deg);}.docs-page .docs-sidebar .docs-top .navbar-logo .navbar-brand{font-size:1.5rem;color:#000;font-weight:700;padding:20px 0 10px;line-height:1;}.docs-page .docs-sidebar .docs-top .navbar-logo .navbar-brand strong{font-weight:300;text-transform:uppercase;font-size:.9rem;opacity:.6;}.docs-page .docs-sidebar .docs-top .navbar-logo .go-back-site{color:#000;opacity:.15;transition:.4s;font-size:.75rem;font-weight:300;}.docs-page .docs-sidebar .docs-top .navbar-logo .go-back-site:hover{text-decoration:none;opacity:.5;}.docs-page .docs-sidebar .docs-top .navbar-logo .navbar-logo-desc{font-size:.85em;}.docs-page .docs-sidebar .docs-top .navbar-logo .navbar-logo-desc strong{display:block;}.docs-page .docs-content .docs-link-btns{border-bottom:1px solid #f4f5f7;background:#fdfdfd;padding:10px 20px;margin:0 -15px;text-align:right;font-size:.8em;}.docs-page .docs-content .docs-link-btns a{color:#999;}.docs-page .docs-content .docs-link-btns a:hover{color:#444;text-decoration:none;}.docs-page .docs-content .docs-text-field{padding:2rem;}.docs-page .docs-content article.docs-body h1{padding-top:2rem;font-size:2.25rem;padding-bottom:10px;}.docs-page .docs-content article.docs-body h2{padding-top:2rem;padding-bottom:10px;font-size:2rem;}.docs-page .docs-content article.docs-body h3,.docs-page .docs-content article.docs-body h4,.docs-page .docs-content article.docs-body h5,.docs-page .docs-content article.docs-body h6{padding-top:20px;padding-bottom:5px;font-size:1.5rem;}.docs-page .docs-content article.docs-body h1,.docs-page .docs-content article.docs-body h2,.docs-page .docs-content article.docs-body h3,.docs-page .docs-content article.docs-body h4,.docs-page .docs-content article.docs-body h5,.docs-page .docs-content article.docs-body h6{position:relative;}.docs-page .docs-content article.docs-body h1 .anchor,.docs-page .docs-content article.docs-body h2 .anchor,.docs-page .docs-content article.docs-body h3 .anchor,.docs-page .docs-content article.docs-body h4 .anchor,.docs-page .docs-content article.docs-body h5 .anchor,.docs-page .docs-content article.docs-body h6 .anchor{position:absolute;right:-26px;font-size:18px;bottom:5px;color:#999;opacity:0;transition:.5s;}.docs-page .docs-content article.docs-body h1:hover .anchor,.docs-page .docs-content article.docs-body h2:hover .anchor,.docs-page .docs-content article.docs-body h3:hover .anchor,.docs-page .docs-content article.docs-body h4:hover .anchor,.docs-page .docs-content article.docs-body h5:hover .anchor,.docs-page .docs-content article.docs-body h6:hover .anchor{opacity:1;}.docs-page .docs-content article.docs-body img{max-width:100%;border:1px solid #f4f5f7;margin:15px 0 25px;box-shadow:0 0 45px #f8f9fa;border-radius:6px;}.docs-page .docs-page-index{min-height:100vh;}.docs-page .docs-page-index #scroll-index{max-height:100vh;}.docs-page .docs-page-index .docs-inner-anchors{position:fixed;top:0;padding:10px;font-size:.9em;}.docs-page .docs-page-index .docs-inner-anchors .navbar .nav-pills{font-size:.92em;margin-left:15px;border-left:1px solid #eee;}.docs-page .docs-page-index .docs-inner-anchors .navbar .nav-pills .nav-link{padding:3px 14px 4px;color:#aaa;line-height:1.2;position:relative;border-left:1px solid #eee;border-radius:0;margin-left:-1px;margin-top:1px;margin-bottom:1px;transition:.2s;}.docs-page .docs-page-index .docs-inner-anchors .navbar .nav-pills .nav-link.active{border-left:2px solid #007bff;background:none;color:#007bff;}.docs-page .docs-page-index .docs-inner-anchors .navbar .nav-pills .nav-pills .nav-link.active{color:#007bff;}.docs-page .docs-page-index .docs-inner-anchors .navbar .nav-pills .nav-pills .nav-pills .nav-link.active{color:#007bff;}.docs-page .docs-page-index .docs-inner-anchors .index-scroll{margin-left:-30px;}.docs-page .docs-page-index .docs-inner-anchors .docs-anchors-wrapper{max-width:300px;float:left;}.docs-page .docs-page-index .scroll-top-btn{display:none;font-size:.85em;color:#aaa;text-decoration:none;padding-left:18px;}.docs-page .docs-page-index .scroll-top-btn.showup{display:block;}@media(min-width:1100px){.container{max-width:1080px;}.docs-page .docs-sidebar.dark-sidebar{background:#191919;}.docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-version .version-select select.form-control{background:#333;border-color:#333;color:#999;}.docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-version .version-select label{background:#444;border-color:#444;color:#ddd;}.docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-filter .form-control{background:#333;color:#999;}.docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-filter select{border:0;border-radius:6px;}.docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-filter .filter-icon i.fa{color:#aaa;}.docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-tree-list ul li a{color:#aaa;border-bottom:1px solid #333;}.docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-tree-list ul li a:hover{color:#fff;}.docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-tree-list ul li a .plus-icon{font-size:.85em;transition:.3s;width:18px;height:18px;text-align:center;padding:0;line-height:1;border-radius:50%;margin-right:4px;position:absolute;left:2px;top:11px;color:#aaa;cursor:default;}.docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-tree-list ul li a .plus-icon .fa-long-arrow-right.no-link{color:#555;}.docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-tree-list ul li a .plus-icon .fa-chevron-right{cursor:pointer;}.docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-tree-list ul li a .plus-icon.last-link{top:11px;}.docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-tree-list ul li span.tree-toggle{color:#555;padding:7px 0;display:block;border-bottom:1px solid #333;}.docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-tree-list ul li.selected-tree>a{color:#fff;transition:.4s;}.docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-tree-list ul li.selected-tree>a span .fa{color:#fff;}.docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-tree-list ul li.selected-tree>a span:not(.last-link) .fa{transform:rotate(90deg);color:#fff;}.docs-page .docs-sidebar.dark-sidebar .docs-top .navbar-logo .navbar-brand{color:#fff;text-transform:uppercase;}.docs-page .docs-sidebar.dark-sidebar .docs-top .navbar-logo .go-back-site{color:#fff;}.docs-page .docs-sidebar.dark-sidebar .docs-top .navbar-logo .navbar-logo-desc{color:#ddd;}}@media(min-width:1366px){.container{max-width:1340px;}}@media(min-width:1440px){.container{max-width:1400px;}}@media(max-width:767px){.docs-page .docs-content article.docs-body h1{padding-top:1.5rem;}.docs-page{background:#f5f7f9;}.docs-page>.container-fluid{display:block;}.docs-page>.container-fluid>.row{display:block;}.docs-page .docs-sidebar{position:fixed;max-width:100%;width:100%;display:block;padding:0 !important;top:0;left:0;z-index:100;right:0;}.docs-page .docs-sidebar .docs-sidebar-wrapper{max-width:100%;width:100%;top:0;position:relative;margin:0 !important;height:72px;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list{padding:.5rem 1.5rem 2rem 1.5rem;position:fixed;top:70px;font-size:17px;left:0;width:100%;z-index:100;background:#f5f7f9;display:none;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list .docs-filter{position:relative;padding:0 0 1rem !important;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list .docs-filter .filter-icon{left:0;}.docs-page .docs-sidebar .docs-top .navbar-logo{padding:0;padding-top:.3rem;display:block;text-align:center;}.docs-page .docs-sidebar .docs-top .navbar-logo .navbar-brand{font-size:1.5rem;font-weight:700;display:block;margin-right:0;padding:7px 0 10px;text-transform:uppercase;}.docs-page .docs-sidebar .docs-top .navbar-logo .navbar-brand .docs-logo{width:110px;}.docs-page .docs-sidebar .docs-top .navbar-logo .go-back-site{display:none;}.docs-page .docs-sidebar .docs-top .navbar-logo .navbar-logo-desc{font-size:1em;display:none;}.docs-page .docs-sidebar .docs-top .open-dmenu{position:absolute;top:10px;left:20px;}.docs-page .docs-content{padding-top:72px;max-width:100%;display:block !important;}.docs-page .docs-content .docs-text-field{padding:1rem 1.5rem;}.docs-page .docs-page-index{display:none;}}.for-mobile{display:none;}.for-desktop{display:inline-block;}pre[class*="language-"]{padding:1.4em 2em !important;margin:15px 0 25px !important;border-radius:6px;}code{padding:.2em .4em;margin:0;font-size:82%;background-color:#f0f1f3;border-radius:3px;color:#28a745;}pre code{padding:0;}pre .token.keyword{color:#569cd6;}pre .token.atrule,pre .token.attr-value,pre .token.function,pre .token.class-name{color:#d69d85;}:not(pre)>code[class*="language-"],pre[class*="language-"]{background:#191919 !important;}div.code-toolbar>.toolbar span{cursor:default;}div.code-toolbar>.toolbar a{cursor:copy;}@media(max-width:767px){body{font-size:14px;}.for-mobile{display:inline-block;}.for-desktop{display:none;}.close-mmenu,.close-dmenu{position:absolute;top:-78px;left:25px;color:#fff;font-size:68px;background:#fff;opacity:0;}.navbar{padding:.5rem 1.75rem;}.navbar .navbar-collapse{background:#38003d;position:fixed;top:86px;left:0;width:100%;height:100vh;height:calc(100vh - 86px);z-index:100 !important;}.navbar .navbar-collapse .navbar-nav{height:100vh;padding:20px 30px;overflow:auto;}.navbar .navbar-collapse .navbar-nav .nav-link{padding:1.2rem !important;}.navbar .navbar-toggler{padding:.5rem .75rem;font-size:1.5rem;line-height:1;background-color:transparent;border:0;border-radius:.25rem;color:#fff !important;margin-left:-1rem;}.jumbotron .btn,footer .btn{display:block;margin-bottom:10px;}.multi-tenancy{text-align:center !important;}.section-with-logos img{margin:15px;opacity:1;-webkit-filter:grayscale(0%);filter:grayscale(0%);}.jumbotron{padding-top:160px;margin-top:-160px;border-radius:0;padding-bottom:40px;margin-bottom:0;font-size:.85em;padding-left:45px;padding-right:45px;}.jumbotron .jumbotron-logo{display:none;}span.code-arrow{padding:0 0 0;display:block;transform:rotate(90deg);font-size:2em;}.mb-5,.my-5{margin-bottom:2rem !important;}} \ No newline at end of file +body{position:relative;}.docs-page{background:#f5f7f9;}.docs-page .anchorjs-link{transition:all .25s linear;}.docs-page *:hover>.anchorjs-link{margin-left:-1.125em !important;transition:color .25s linear;color:#808080;}.docs-page .anchorjs-link:hover{color:#007bff;text-decoration:none;}.docs-page .docs-sidebar{background:#f5f7f9;padding-right:1rem;position:relative;top:0;left:0;position:fixed;}.docs-page .docs-sidebar .docs-sidebar-wrapper{width:270px;float:right;}.docs-page .docs-sidebar .docs-sidebar-wrapper input.form-control{background:none;padding-left:36px;width:100%;background:#e9ecef;border:0;}.docs-page .docs-sidebar .docs-sidebar-wrapper input.form-control:focus,.docs-page .docs-sidebar .docs-sidebar-wrapper input.form-control:active,.docs-page .docs-sidebar .docs-sidebar-wrapper input.form-control:hover,.docs-page .docs-sidebar .docs-sidebar-wrapper input.form-control:visited{box-shadow:none;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-version{position:relative;padding:0 1rem;margin:.5rem 0 1rem;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-version .version-select{border-radius:8px;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-version .version-select .input-group-text{border:0;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-version .version-select select.form-control{line-height:1;border-top-left-radius:0;border-bottom-left-radius:0;padding:.3em .5em .5em;border:0;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-version .version-select select.form-control:focus,.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-version .version-select select.form-control:active,.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-version .version-select select.form-control:hover,.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-version .version-select select.form-control:visited{box-shadow:none;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-filter{position:relative;padding:0 1rem;margin:.5rem 0;font-size:.9em;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-filter .filter-icon{position:absolute;top:0;padding:8px 10px;line-height:1;left:16px;background:none;padding:.375rem .75rem;font-size:1rem;line-height:1.5;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-filter .filter-icon i.fa{color:#ddd;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list{height:100vh;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list>ul{display:block;height:calc(100vh - 210px);}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul{font-size:.935em;list-style:none;padding:0 1rem;margin:0;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li{margin-left:0;padding-left:24px;display:block;width:100%;position:relative;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li a{color:#999;font-weight:700;padding:7px 0;display:block;border-bottom:1px solid #eeeff3;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li a:hover{color:#000;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li a.last-link{top:11px;color:#aaa;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li span.tree-toggle{color:#999;padding:7px 0;display:block;border-bottom:1px solid #eeeff3;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li .plus-icon{font-size:.85em;transition:.3s;width:18px;height:18px;text-align:center;padding:0;line-height:1;border-radius:50%;margin-right:4px;position:absolute;left:2px;top:11px;color:#aaa;cursor:default;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li .plus-icon .fa-long-arrow-right.no-link{color:#555;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li .plus-icon .fa-chevron-right{cursor:pointer;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li ul{padding:0;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li ul li a{font-weight:400;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li ul li ul{padding:0;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li ul li ul li a{font-weight:300;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li.selected-tree>a{color:#000;transition:.4s;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li.selected-tree>span .fa{transform:rotate(90deg);color:#007bff;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li.selected-tree.last-link>span .fa{transform:rotate(0deg);}.docs-page .docs-sidebar .docs-top .navbar-logo .navbar-brand{font-size:1.5rem;color:#000;font-weight:700;padding:20px 0 10px;line-height:1;}.docs-page .docs-sidebar .docs-top .navbar-logo .navbar-brand strong{font-weight:300;text-transform:uppercase;font-size:.9rem;opacity:.6;}.docs-page .docs-sidebar .docs-top .navbar-logo .go-back-site{color:#000;opacity:.15;transition:.4s;font-size:.75rem;font-weight:300;}.docs-page .docs-sidebar .docs-top .navbar-logo .go-back-site:hover{text-decoration:none;opacity:.5;}.docs-page .docs-sidebar .docs-top .navbar-logo .navbar-logo-desc{font-size:.85em;}.docs-page .docs-sidebar .docs-top .navbar-logo .navbar-logo-desc strong{display:block;}.docs-page .docs-content .docs-link-btns{border-bottom:1px solid #f4f5f7;background:#fdfdfd;padding:10px 20px;margin:0 -15px;text-align:right;font-size:.8em;}.docs-page .docs-content .docs-link-btns a{color:#999;}.docs-page .docs-content .docs-link-btns a:hover{color:#444;text-decoration:none;}.docs-page .docs-content .docs-text-field{padding:2rem;}.docs-page .docs-content article.docs-body h1{padding-top:2rem;font-size:2.25rem;padding-bottom:10px;}.docs-page .docs-content article.docs-body h2{padding-top:2rem;padding-bottom:10px;font-size:2rem;}.docs-page .docs-content article.docs-body h3,.docs-page .docs-content article.docs-body h4,.docs-page .docs-content article.docs-body h5,.docs-page .docs-content article.docs-body h6{padding-top:20px;padding-bottom:5px;font-size:1.5rem;}.docs-page .docs-content article.docs-body h1,.docs-page .docs-content article.docs-body h2,.docs-page .docs-content article.docs-body h3,.docs-page .docs-content article.docs-body h4,.docs-page .docs-content article.docs-body h5,.docs-page .docs-content article.docs-body h6{position:relative;}.docs-page .docs-content article.docs-body h1 .anchor,.docs-page .docs-content article.docs-body h2 .anchor,.docs-page .docs-content article.docs-body h3 .anchor,.docs-page .docs-content article.docs-body h4 .anchor,.docs-page .docs-content article.docs-body h5 .anchor,.docs-page .docs-content article.docs-body h6 .anchor{position:absolute;right:-26px;font-size:18px;bottom:5px;color:#999;opacity:0;transition:.5s;}.docs-page .docs-content article.docs-body h1:hover .anchor,.docs-page .docs-content article.docs-body h2:hover .anchor,.docs-page .docs-content article.docs-body h3:hover .anchor,.docs-page .docs-content article.docs-body h4:hover .anchor,.docs-page .docs-content article.docs-body h5:hover .anchor,.docs-page .docs-content article.docs-body h6:hover .anchor{opacity:1;}.docs-page .docs-content article.docs-body img{max-width:100%;border:1px solid #f4f5f7;margin:15px 0 25px;box-shadow:0 0 45px #f8f9fa;border-radius:6px;}.docs-page .docs-page-index{min-height:100vh;}.docs-page .docs-page-index #scroll-index{max-height:100vh;}.docs-page .docs-page-index .docs-inner-anchors{position:fixed;top:0;padding:10px;font-size:.9em;}.docs-page .docs-page-index .docs-inner-anchors .navbar .nav-pills{font-size:.92em;margin-left:15px;border-left:1px solid #eee;}.docs-page .docs-page-index .docs-inner-anchors .navbar .nav-pills .nav-link{padding:3px 14px 4px;color:#aaa;line-height:1.2;position:relative;border-left:1px solid #eee;border-radius:0;margin-left:-1px;margin-top:1px;margin-bottom:1px;transition:.2s;}.docs-page .docs-page-index .docs-inner-anchors .navbar .nav-pills .nav-link.active{border-left:2px solid #007bff;background:none;color:#007bff;}.docs-page .docs-page-index .docs-inner-anchors .navbar .nav-pills .nav-pills .nav-link.active{color:#007bff;}.docs-page .docs-page-index .docs-inner-anchors .navbar .nav-pills .nav-pills .nav-pills .nav-link.active{color:#007bff;}.docs-page .docs-page-index .docs-inner-anchors .index-scroll{margin-left:-30px;}.docs-page .docs-page-index .docs-inner-anchors .docs-anchors-wrapper{max-width:300px;float:left;}.docs-page .docs-page-index .scroll-top-btn{display:none;font-size:.85em;color:#aaa;text-decoration:none;padding-left:18px;}.docs-page .docs-page-index .scroll-top-btn.showup{display:block;}@media(min-width:1100px){.container{max-width:1080px;}.docs-page .docs-sidebar.dark-sidebar{background:#191919;}.docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-version .version-select select.form-control{background:#333;border-color:#333;color:#999;}.docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-version .version-select label{background:#444;border-color:#444;color:#ddd;}.docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-filter .form-control{background:#333;color:#999;}.docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-filter select{border:0;border-radius:6px;}.docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-filter .filter-icon i.fa{color:#aaa;}.docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-tree-list ul li a{color:#aaa;border-bottom:1px solid #333;}.docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-tree-list ul li a:hover{color:#fff;}.docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-tree-list ul li a .plus-icon{font-size:.85em;transition:.3s;width:18px;height:18px;text-align:center;padding:0;line-height:1;border-radius:50%;margin-right:4px;position:absolute;left:2px;top:11px;color:#aaa;cursor:default;}.docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-tree-list ul li a .plus-icon .fa-long-arrow-right.no-link{color:#555;}.docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-tree-list ul li a .plus-icon .fa-chevron-right{cursor:pointer;}.docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-tree-list ul li a .plus-icon.last-link{top:11px;}.docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-tree-list ul li span.tree-toggle{color:#555;padding:7px 0;display:block;border-bottom:1px solid #333;}.docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-tree-list ul li.selected-tree>a{color:#fff;transition:.4s;}.docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-tree-list ul li.selected-tree>a span .fa{color:#fff;}.docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-tree-list ul li.selected-tree>a span:not(.last-link) .fa{transform:rotate(90deg);color:#fff;}.docs-page .docs-sidebar.dark-sidebar .docs-top .navbar-logo .navbar-brand{color:#fff;text-transform:uppercase;}.docs-page .docs-sidebar.dark-sidebar .docs-top .navbar-logo .go-back-site{color:#fff;}.docs-page .docs-sidebar.dark-sidebar .docs-top .navbar-logo .navbar-logo-desc{color:#ddd;}}@media(min-width:1366px){.container{max-width:1340px;}}@media(min-width:1440px){.container{max-width:1400px;}}@media(max-width:767px){.docs-page .docs-content article.docs-body h1{padding-top:1.5rem;}.docs-page{background:#f5f7f9;}.docs-page>.container-fluid{display:block;}.docs-page>.container-fluid>.row{display:block;}.docs-page .docs-sidebar{position:fixed;max-width:100%;width:100%;display:block;padding:0 !important;top:0;left:0;z-index:100;right:0;}.docs-page .docs-sidebar .docs-sidebar-wrapper{max-width:100%;width:100%;top:0;position:relative;margin:0 !important;height:72px;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list{padding:.5rem 1.5rem 2rem 1.5rem;position:fixed;top:70px;font-size:17px;left:0;width:100%;z-index:100;background:#f5f7f9;display:none;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list .docs-filter{position:relative;padding:0 0 1rem !important;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list .docs-filter .filter-icon{left:0;}.docs-page .docs-sidebar .docs-top .navbar-logo{padding:0;padding-top:.3rem;display:block;text-align:center;}.docs-page .docs-sidebar .docs-top .navbar-logo .navbar-brand{font-size:1.5rem;font-weight:700;display:block;margin-right:0;padding:7px 0 10px;text-transform:uppercase;}.docs-page .docs-sidebar .docs-top .navbar-logo .navbar-brand .docs-logo{width:110px;}.docs-page .docs-sidebar .docs-top .navbar-logo .go-back-site{display:none;}.docs-page .docs-sidebar .docs-top .navbar-logo .navbar-logo-desc{font-size:1em;display:none;}.docs-page .docs-sidebar .docs-top .open-dmenu{position:absolute;top:10px;left:20px;}.docs-page .docs-content{padding-top:72px;max-width:100%;display:block !important;}.docs-page .docs-content .docs-text-field{padding:1rem 1.5rem;}.docs-page .docs-page-index{display:none;}}.for-mobile{display:none;}.for-desktop{display:inline-block;}pre[class*="language-"]{padding:1.4em 2em !important;margin:15px 0 25px !important;border-radius:6px;}code{padding:.2em .4em;margin:0;font-size:82%;background-color:#f0f1f3;border-radius:3px;color:#28a745;}pre code{padding:0;}pre .token.keyword{color:#569cd6;}pre .token.atrule,pre .token.attr-value,pre .token.function,pre .token.class-name{color:#d69d85;}:not(pre)>code[class*="language-"],pre[class*="language-"]{background:#191919 !important;}div.code-toolbar>.toolbar span{cursor:default;}div.code-toolbar>.toolbar a{cursor:copy;}@media(max-width:767px){body{font-size:14px;}.for-mobile{display:inline-block;}.for-desktop{display:none;}.close-mmenu,.close-dmenu{position:absolute;top:-78px;left:25px;color:#fff;font-size:68px;background:#fff;opacity:0;}.navbar{padding:.5rem 1.75rem;}.navbar .navbar-collapse{background:#38003d;position:fixed;top:86px;left:0;width:100%;height:100vh;height:calc(100vh - 86px);z-index:100 !important;}.navbar .navbar-collapse .navbar-nav{height:100vh;padding:20px 30px;overflow:auto;}.navbar .navbar-collapse .navbar-nav .nav-link{padding:1.2rem !important;}.navbar .navbar-toggler{padding:.5rem .75rem;font-size:1.5rem;line-height:1;background-color:transparent;border:0;border-radius:.25rem;color:#fff !important;margin-left:-1rem;}.section-with-logos img{margin:15px;opacity:1;-webkit-filter:grayscale(0%);filter:grayscale(0%);}span.code-arrow{padding:0 0 0;display:block;transform:rotate(90deg);font-size:2em;}.mb-5,.my-5{margin-bottom:2rem !important;}} \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Web/Pages/Documents/vs.scss b/modules/docs/src/Volo.Docs.Web/Pages/Documents/vs.scss index 022a4d96bd..19ba230906 100644 --- a/modules/docs/src/Volo.Docs.Web/Pages/Documents/vs.scss +++ b/modules/docs/src/Volo.Docs.Web/Pages/Documents/vs.scss @@ -1,6 +1,811 @@ -@import "_docs.scss"; -@media (max-width: 767px) { - @import "_responsive.scss"; +body { + position: relative; +} +.docs-page { + background: rgb(245, 247, 249); + .anchorjs-link { + transition: all .25s linear; + } + + *:hover > .anchorjs-link { + margin-left: -1.125em !important; + transition: color .25s linear; + color: gray; + } + + .anchorjs-link:hover { + color: #007bff; + text-decoration: none; + } + + .docs-sidebar { + background: #f5f7f9; + padding-right: 1rem; + position: relative; + top: 0px; + left: 0; + position: fixed; + + .docs-sidebar-wrapper { + width: 270px; + float: right; + + input.form-control { + background: none; + padding-left: 36px; + width: 100%; + background: #e9ecef; + border: 0; + + &:focus, &:active, &:hover, &:visited { + box-shadow: none; + } + } + + .docs-version { + position: relative; + padding: 0 1rem; + margin: .5rem 0 1rem; + + .version-select { + border-radius: 8px; + + .input-group-text { + border: 0; + } + + select.form-control { + line-height: 1; + border-top-left-radius: 0; + border-bottom-left-radius: 0; + padding: .3em .5em .5em; + border: 0; + + + &:focus, &:active, &:hover, &:visited { + box-shadow: none; + } + } + + label { + } + } + } + + .docs-filter { + position: relative; + padding: 0 1rem; + margin: .5rem 0; + font-size: .9em; + + .filter-icon { + position: absolute; + top: 0px; + padding: 8px 10px; + line-height: 1; + left: 16px; + background: none; + padding: 0.375rem 0.75rem; + font-size: 1rem; + line-height: 1.5; + + i.fa { + color: #ddd; + } + } + } + + .docs-tree-list { + height: 100vh; + + > ul { + display: block; + height: calc(100vh - 210px); + } + + ul { + font-size: .935em; + list-style: none; + padding: 0 1rem; + margin: 0; + + li { + margin-left: 0px; + padding-left: 24px; + display: block; + width: 100%; + position: relative; + + + a { + color: #999; + font-weight: 700; + padding: 7px 0; + display: block; + border-bottom: 1px solid #eeeff3; + + &:hover { + color: #000; + } + + &.last-link { + top: 11px; + color: #aaa; + } + } + + span.tree-toggle { + color: #999; + padding: 7px 0; + display: block; + border-bottom: 1px solid #eeeff3; + } + + .plus-icon { + font-size: .85em; + transition: .3s; + width: 18px; + height: 18px; + text-align: center; + padding: 0; + line-height: 1; + border-radius: 50%; + margin-right: 4px; + position: absolute; + left: 2px; + top: 11px; + color: #aaa; + cursor: default; + + .fa-long-arrow-right { + &.no-link { + color: #555; + } + } + + .fa-chevron-right { + cursor: pointer; + } + } + + ul { + padding: 0; + + li { + + a { + font-weight: 400; + } + + ul { + padding: 0; + + li { + a { + font-weight: 300; + } + } + } + } + } + + &.selected-tree { + > a { + color: #000; + transition: .4s; + } + + > span { + .fa { + transform: rotate(90deg); + color: #007bff; + } + } + + &.last-link { + > span { + .fa { + transform: rotate(0deg); + } + } + } + } + } + } + } + } + + .docs-top { + .navbar-logo { + .navbar-brand { + font-size: 1.5rem; + color: #000; + font-weight: 700; + padding: 20px 0 10px; + line-height: 1; + + strong { + font-weight: 300; + text-transform: uppercase; + font-size: .9rem; + opacity: .6; + } + } + + .go-back-site { + color: #000; + opacity: .15; + transition: .4s; + font-size: .75rem; + font-weight: 300; + + &:hover { + text-decoration: none; + opacity: .5; + } + } + + .navbar-logo-desc { + font-size: .85em; + + strong { + display: block; + } + } + } + } + } + + .docs-content { + .docs-link-btns { + border-bottom: 1px solid #f4f5f7; + background: #fdfdfd; + padding: 10px 20px; + margin: 0 -15px; + text-align: right; + font-size: .8em; + + a { + color: #999; + + &:hover { + color: #444; + text-decoration: none; + } + } + } + + .docs-text-field { + padding: 2rem; + } + + article.docs-body { + h1 { + padding-top: 2rem; + font-size: 2.25rem; + padding-bottom: 10px; + } + + h2 { + padding-top: 2rem; + padding-bottom: 10px; + font-size: 2rem; + } + + h3, h4, h5, h6 { + padding-top: 20px; + padding-bottom: 5px; + font-size: 1.5rem; + } + + h1, h2, h3, h4, h5, h6 { + position: relative; + + .anchor { + position: absolute; + right: -26px; + font-size: 18px; + bottom: 5px; + color: #999; + opacity: 0; + transition: .5s; + } + + &:hover { + .anchor { + opacity: 1; + } + } + } + + img { + max-width: 100%; + border: 1px solid #f4f5f7; + margin: 15px 0 25px; + box-shadow: 0 0 45px #f8f9fa; + border-radius: 6px; + } + } + } + + .docs-page-index { + min-height: 100vh; + + #scroll-index { + max-height: 100vh; + } + + .docs-inner-anchors { + position: fixed; + top: 0px; + /* max-width: 270px; */ + padding: 10px; + font-size: .90em; + /* height: 100vh; */ + .navbar { + .nav-pills { + font-size: .92em; + margin-left: 15px; + border-left: 1px solid #eee; + + .nav-link { + padding: 3px 14px 4px; + color: #aaa; + line-height: 1.2; + position: relative; + border-left: 1px solid #eee; + border-radius: 0; + margin-left: -1px; + margin-top: 1px; + margin-bottom: 1px; + transition: .2s; + + &.active { + border-left: 2px solid #007bff; + background: none; + color: #007bff; + } + } + + .nav-pills { + .nav-link { + &.active { + color: #007bff; + } + } + + .nav-pills { + .nav-link { + &.active { + color: #007bff; + } + } + } + } + } + } + + .index-scroll { + margin-left: -30px; + } + + .docs-anchors-wrapper { + max-width: 300px; + float: left; + } + } + + .scroll-top-btn { + display: none; + font-size: .85em; + color: #aaa; + text-decoration: none; + padding-left: 18px; + + &.showup { + display: block; + } + } + } +} + + +@media (min-width: 1100px) { + .container { + max-width: 1080px; + } + + .docs-page { + .docs-sidebar { + &.dark-sidebar { + background: #191919; + + .docs-sidebar-wrapper { + + .docs-version { + .version-select { + select.form-control { + background: #333; + border-color: #333; + color: #999; + } + + label { + background: #444; + border-color: #444; + color: #ddd; + } + } + } + + .docs-filter { + .form-control { + background: #333; + color: #999; + } + + select { + border: 0; + border-radius: 6px; + } + + .filter-icon { + i.fa { + color: #aaa; + } + } + } + + .docs-tree-list { + ul { + li { + + + a { + color: #aaa; + border-bottom: 1px solid #333; + + &:hover { + color: #fff; + } + + .plus-icon { + font-size: .85em; + transition: .3s; + width: 18px; + height: 18px; + text-align: center; + padding: 0; + line-height: 1; + border-radius: 50%; + margin-right: 4px; + position: absolute; + left: 2px; + top: 11px; + color: #aaa; + cursor: default; + + .fa-long-arrow-right { + &.no-link { + color: #555; + } + } + + .fa-chevron-right { + cursor: pointer; + } + + &.last-link { + top: 11px; + } + } + } + + + span.tree-toggle { + color: #555; + padding: 7px 0; + display: block; + border-bottom: 1px solid #333; + } + + + &.selected-tree { + > a { + color: #fff; + transition: .4s; + + span { + .fa { + color: #fff; + } + + &:not(.last-link) .fa { + transform: rotate(90deg); + color: #fff; + } + } + } + } + } + } + } + } + + .docs-top { + .navbar-logo { + .navbar-brand { + color: #fff; + text-transform: uppercase; + } + + .go-back-site { + color: #fff; + } + + .navbar-logo-desc { + color: #ddd; + } + } + } + } + } + } +} + +@media (min-width: 1366px) { + .container { + max-width: 1340px; + } +} + +@media (min-width: 1440px) { + .container { + max-width: 1400px; + } +} + +@media (max-width: 767px) { + .docs-page .docs-content article.docs-body h1 { + padding-top: 1.5rem; + } + + .docs-page { + > .container-fluid { + display: block; + + > .row { + display: block; + } + } + + background: rgb(245, 247, 249); + + .docs-sidebar { + position: fixed; + max-width: 100%; + width: 100%; + display: block; + padding: 0 !important; + top: 0; + left: 0; + z-index: 100; + right: 0; + + .docs-sidebar-wrapper { + max-width: 100%; + width: 100%; + top: 0px; + position: relative; + margin: 0 !important; + height: 72px; + + .docs-tree-list { + padding: .5rem 1.5rem 2rem 1.5rem; + position: fixed; + top: 70px; + font-size: 17px; + left: 0; + width: 100%; + z-index: 100; + background: #f5f7f9; + display: none; + + .docs-filter { + position: relative; + padding: 0 0 1rem !important; + + .filter-icon { + left: 0px; + } + } + } + } + + .docs-top { + .navbar-logo { + padding: 0rem; + padding-top: .3rem; + display: block; + text-align: center; + + .navbar-brand { + font-size: 1.5rem; + font-weight: 700; + display: block; + margin-right: 0em; + padding: 7px 0 10px; + text-transform: uppercase; + + .docs-logo { + width: 110px; + } + } + + .go-back-site { + display: none; + } + + .navbar-logo-desc { + font-size: 1em; + display: none; + } + } + + .open-dmenu { + position: absolute; + top: 10px; + left: 20px; + + .navbar-toggler-icon { + } + } + } + } + + .docs-content { + padding-top: 72px; + max-width: 100%; + display: block !important; + + .docs-text-field { + padding: 1rem 1.5rem; + } + } + + .docs-page-index { + display: none; + } + } +} + + +.for-mobile { + display: none; +} + +.for-desktop { + display: inline-block; +} + +pre[class*="language-"] { + padding: 1.4em 2em !important; + margin: 15px 0 25px !important; + border-radius: 6px; +} + +code { + padding: 0.2em 0.4em; + margin: 0; + font-size: 82%; + background-color: #f0f1f3; + border-radius: 3px; + color: #28a745; +} + +pre { + code { + padding: 0; + } + + .token.keyword { + color: #569cd6; + } + + .token.atrule, .token.attr-value, .token.function, .token.class-name { + color: #d69d85; + } +} + +:not(pre) > code[class*="language-"], pre[class*="language-"] { + background: #191919 !important; +} + + +div.code-toolbar > .toolbar span { + cursor: default; +} + +div.code-toolbar > .toolbar a { + cursor: copy; +} + +@media (max-width: 767px) { + body { + font-size: 14px; + } + + .for-mobile { + display: inline-block; + } + + .for-desktop { + display: none; + } + + .close-mmenu, .close-dmenu { + position: absolute; + top: -78px; + left: 25px; + color: #fff; + font-size: 68px; + background: #fff; + opacity: 0; + } + + .navbar { + padding: .5rem 1.75rem; + + .navbar-collapse { + background: rgb(56, 0, 61); + position: fixed; + top: 86px; + left: 0; + width: 100%; + height: 100vh; + height: calc(100vh - 86px); + z-index: 100 !important; + + .navbar-nav { + height: 100vh; + padding: 20px 30px; + overflow: auto; + + .nav-link { + padding: 1.2rem !important; + } + } + } + + .navbar-toggler { + padding: .5rem .75rem; + font-size: 1.5rem; + line-height: 1; + background-color: transparent; + border: 0; + border-radius: .25rem; + color: #fff !important; + margin-left: -1rem; + } + } + + .section-with-logos img { + margin: 15px; + opacity: 1; + -webkit-filter: grayscale(0%); + filter: grayscale(0%); + } + + span.code-arrow { + padding: 0px 0 0px; + display: block; + transform: rotate(90deg); + font-size: 2em; + } + + .mb-5, .my-5 { + margin-bottom: 2rem !important; + } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Web/compilerconfig.json b/modules/docs/src/Volo.Docs.Web/compilerconfig.json index 9812985b0c..114e4a3c9d 100644 --- a/modules/docs/src/Volo.Docs.Web/compilerconfig.json +++ b/modules/docs/src/Volo.Docs.Web/compilerconfig.json @@ -3,14 +3,6 @@ "outputFile": "wwwroot/pages/documents/project/index.css", "inputFile": "wwwroot/pages/documents/project/index.less" }, - { - "outputFile": "Pages/Documents/_docs.css", - "inputFile": "Pages/Documents/_docs.scss" - }, - { - "outputFile": "Pages/Documents/_responsive.css", - "inputFile": "Pages/Documents/_responsive.scss" - }, { "outputFile": "Pages/Documents/vs.css", "inputFile": "Pages/Documents/vs.scss" From 1b83e94a22b1054b2c82b64cb478b151a92d31d6 Mon Sep 17 00:00:00 2001 From: Halil ibrahim Kalkan Date: Thu, 6 Dec 2018 10:52:15 +0300 Subject: [PATCH 38/60] Refactor vs.js --- .../Pages/Documents/Project/Index.cshtml | 2 +- .../src/Volo.Docs.Web/Pages/Documents/vs.js | 145 ++++++++---------- 2 files changed, 66 insertions(+), 81 deletions(-) diff --git a/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml b/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml index b58e571473..af052e20d0 100644 --- a/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml +++ b/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml @@ -25,7 +25,6 @@ @section scripts { - @@ -37,6 +36,7 @@ + }
diff --git a/modules/docs/src/Volo.Docs.Web/Pages/Documents/vs.js b/modules/docs/src/Volo.Docs.Web/Pages/Documents/vs.js index 4620a7b483..5eb102473f 100644 --- a/modules/docs/src/Volo.Docs.Web/Pages/Documents/vs.js +++ b/modules/docs/src/Volo.Docs.Web/Pages/Documents/vs.js @@ -1,91 +1,82 @@ -$('li:not(.last-link) a.tree-toggle').click(function () { - $(this).parent().children('ul.tree').toggle(100); - $(this).closest("li").toggleClass("selected-tree"); -}); -$('li:not(.last-link) span.plus-icon i.fa-chevron-right').click(function () { - - var $element = $(this).parent(); - - $element.parent().children('ul.tree').toggle(100); - $element.closest("li").toggleClass("selected-tree"); -}); +(function ($) { + $(function () { + $('li:not(.last-link) a.tree-toggle').click(function () { + $(this).parent().children('ul.tree').toggle(100); + $(this).closest("li").toggleClass("selected-tree"); + }); + $('li:not(.last-link) span.plus-icon i.fa-chevron-right').click(function () { -$(document).ready(function () { - var scrollTopBtn = $(".scroll-top-btn"); - var enoughHeight = $(".docs-sidebar-wrapper > .docs-top").height() + 60; + var $element = $(this).parent(); - $(window).scroll(function () { - var topPos = $(window).scrollTop(); - if (topPos > enoughHeight) { - $(scrollTopBtn).addClass("showup"); - $("body").addClass("scrolled"); - } else { - $(scrollTopBtn).removeClass("showup"); - $("body").removeClass("scrolled"); - } - }); - - $(scrollTopBtn).click(function () { - $('html, body').animate({ - scrollTop: 0 - }, 500); - return false; - }); + $element.parent().children('ul.tree').toggle(100); + $element.closest("li").toggleClass("selected-tree"); + }); -}); + var scrollTopBtn = $(".scroll-top-btn"); + var enoughHeight = $(".docs-sidebar-wrapper > .docs-top").height() + 60; + + $(window).scroll(function () { + var topPos = $(window).scrollTop(); + if (topPos > enoughHeight) { + $(scrollTopBtn).addClass("showup"); + $("body").addClass("scrolled"); + } else { + $(scrollTopBtn).removeClass("showup"); + $("body").removeClass("scrolled"); + } + }); -$(document).ready(function () { - var navSelector = '#docs-sticky-index'; - var $myNav = $(navSelector); - Toc.init($myNav); - $('body').scrollspy({ - target: $myNav - }); - $("#docs-sticky-index a").on('click', function (event) { - if (this.hash !== "") { - event.preventDefault(); - var hash = this.hash; + $(scrollTopBtn).click(function () { $('html, body').animate({ - scrollTop: $(hash).offset().top - }, 500, function () { - window.location.hash = hash; - }); - } - }); -}); - - - -$('.btn-toggle').on("click", function () { - $(".toggle-row").slideToggle(400); - $(this).toggleClass("less"); -}); + scrollTop: 0 + }, 500); + return false; + }); -$('.close-mmenu').on("click", function () { - $(".navbar-collapse").removeClass("show"); -}); + var navSelector = '#docs-sticky-index'; + var $myNav = $(navSelector); + Toc.init($myNav); + $('body').scrollspy({ + target: $myNav + }); + $("#docs-sticky-index a").on('click', function (event) { + if (this.hash !== "") { + event.preventDefault(); + var hash = this.hash; + $('html, body').animate({ + scrollTop: $(hash).offset().top + }, 500, function () { + window.location.hash = hash; + }); + } + }); -$('.open-dmenu').on("click", function () { - $(".docs-tree-list").slideToggle(); -}); + $('.btn-toggle').on("click", function () { + $(".toggle-row").slideToggle(400); + $(this).toggleClass("less"); + }); + $('.close-mmenu').on("click", function () { + $(".navbar-collapse").removeClass("show"); + }); -(function ($) { + $('.open-dmenu').on("click", function () { + $(".docs-tree-list").slideToggle(); + }); - $(window).on("load", function () { - $("#sidebar-scroll").mCustomScrollbar({ - theme: "minimal" + $(window).on("load", function () { + $("#sidebar-scroll").mCustomScrollbar({ + theme: "minimal" + }); }); - }); - $(window).on("load", function () { - $("#scroll-index").mCustomScrollbar({ - theme: "minimal-dark" + $(window).on("load", function () { + $("#scroll-index").mCustomScrollbar({ + theme: "minimal-dark" + }); }); }); - - window.Toc.helpers.createNavList = function () { return $(''); }; @@ -104,10 +95,4 @@ $('.open-dmenu').on("click", function () { $li.append($a); return $li; }; - - -})(jQuery); - - - - +})(jQuery); \ No newline at end of file From 03d995d1d52da294f01f247ed9141a15384fd43d Mon Sep 17 00:00:00 2001 From: Halil ibrahim Kalkan Date: Thu, 6 Dec 2018 10:54:25 +0300 Subject: [PATCH 39/60] Move global css/js to a shared folder --- .../docs/src/Volo.Docs.Web/Pages/Documents/Index.cshtml | 2 +- .../Volo.Docs.Web/Pages/Documents/Project/Index.cshtml | 4 ++-- .../Pages/Documents/{ => Shared/Scripts}/vs.js | 0 .../Pages/Documents/{ => Shared/Styles}/vs.css | 0 .../Pages/Documents/{ => Shared/Styles}/vs.min.css | 0 .../Pages/Documents/{ => Shared/Styles}/vs.scss | 0 modules/docs/src/Volo.Docs.Web/compilerconfig.json | 8 ++------ 7 files changed, 5 insertions(+), 9 deletions(-) rename modules/docs/src/Volo.Docs.Web/Pages/Documents/{ => Shared/Scripts}/vs.js (100%) rename modules/docs/src/Volo.Docs.Web/Pages/Documents/{ => Shared/Styles}/vs.css (100%) rename modules/docs/src/Volo.Docs.Web/Pages/Documents/{ => Shared/Styles}/vs.min.css (100%) rename modules/docs/src/Volo.Docs.Web/Pages/Documents/{ => Shared/Styles}/vs.scss (100%) diff --git a/modules/docs/src/Volo.Docs.Web/Pages/Documents/Index.cshtml b/modules/docs/src/Volo.Docs.Web/Pages/Documents/Index.cshtml index 59d2ae9e1b..00e5bcf069 100644 --- a/modules/docs/src/Volo.Docs.Web/Pages/Documents/Index.cshtml +++ b/modules/docs/src/Volo.Docs.Web/Pages/Documents/Index.cshtml @@ -10,7 +10,7 @@ } @section styles { - + } diff --git a/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml b/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml index af052e20d0..7f72a96d70 100644 --- a/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml +++ b/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml @@ -14,7 +14,7 @@ } @section styles { - + @@ -35,7 +35,7 @@ - + } diff --git a/modules/docs/src/Volo.Docs.Web/Pages/Documents/vs.js b/modules/docs/src/Volo.Docs.Web/Pages/Documents/Shared/Scripts/vs.js similarity index 100% rename from modules/docs/src/Volo.Docs.Web/Pages/Documents/vs.js rename to modules/docs/src/Volo.Docs.Web/Pages/Documents/Shared/Scripts/vs.js diff --git a/modules/docs/src/Volo.Docs.Web/Pages/Documents/vs.css b/modules/docs/src/Volo.Docs.Web/Pages/Documents/Shared/Styles/vs.css similarity index 100% rename from modules/docs/src/Volo.Docs.Web/Pages/Documents/vs.css rename to modules/docs/src/Volo.Docs.Web/Pages/Documents/Shared/Styles/vs.css diff --git a/modules/docs/src/Volo.Docs.Web/Pages/Documents/vs.min.css b/modules/docs/src/Volo.Docs.Web/Pages/Documents/Shared/Styles/vs.min.css similarity index 100% rename from modules/docs/src/Volo.Docs.Web/Pages/Documents/vs.min.css rename to modules/docs/src/Volo.Docs.Web/Pages/Documents/Shared/Styles/vs.min.css diff --git a/modules/docs/src/Volo.Docs.Web/Pages/Documents/vs.scss b/modules/docs/src/Volo.Docs.Web/Pages/Documents/Shared/Styles/vs.scss similarity index 100% rename from modules/docs/src/Volo.Docs.Web/Pages/Documents/vs.scss rename to modules/docs/src/Volo.Docs.Web/Pages/Documents/Shared/Styles/vs.scss diff --git a/modules/docs/src/Volo.Docs.Web/compilerconfig.json b/modules/docs/src/Volo.Docs.Web/compilerconfig.json index 114e4a3c9d..3645b5a8f5 100644 --- a/modules/docs/src/Volo.Docs.Web/compilerconfig.json +++ b/modules/docs/src/Volo.Docs.Web/compilerconfig.json @@ -1,11 +1,7 @@ [ { - "outputFile": "wwwroot/pages/documents/project/index.css", - "inputFile": "wwwroot/pages/documents/project/index.less" - }, - { - "outputFile": "Pages/Documents/vs.css", - "inputFile": "Pages/Documents/vs.scss" + "outputFile": "Pages/Documents/Shared/Styles/vs.css", + "inputFile": "Pages/Documents/Shared/Styles/vs.scss" }, { "outputFile": "Pages/Documents/Project/index.css", From 355a097b3179dd2c6c95db68de5f6461e76084e8 Mon Sep 17 00:00:00 2001 From: Halil ibrahim Kalkan Date: Thu, 6 Dec 2018 10:56:10 +0300 Subject: [PATCH 40/60] Move HtmlNormalizer --- .../Documents/Project => HtmlConverting}/HtmlNormalizer.cs | 2 +- .../src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml.cs | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) rename modules/docs/src/Volo.Docs.Web/{Pages/Documents/Project => HtmlConverting}/HtmlNormalizer.cs (97%) diff --git a/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/HtmlNormalizer.cs b/modules/docs/src/Volo.Docs.Web/HtmlConverting/HtmlNormalizer.cs similarity index 97% rename from modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/HtmlNormalizer.cs rename to modules/docs/src/Volo.Docs.Web/HtmlConverting/HtmlNormalizer.cs index 248784a753..ed3f999614 100644 --- a/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/HtmlNormalizer.cs +++ b/modules/docs/src/Volo.Docs.Web/HtmlConverting/HtmlNormalizer.cs @@ -2,7 +2,7 @@ using System.Text.RegularExpressions; using Volo.Docs.Utils; -namespace Volo.Docs.Pages.Documents.Project +namespace Volo.Docs.HtmlConverting { public static class HtmlNormalizer { diff --git a/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml.cs b/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml.cs index f7c8a9ffdc..cc0d113de3 100644 --- a/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml.cs +++ b/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml.cs @@ -3,7 +3,6 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; -using Microsoft.AspNetCore.Mvc.RazorPages; using Microsoft.AspNetCore.Mvc.Rendering; using Volo.Abp.AspNetCore.Mvc.UI.RazorPages; using Volo.Docs.Documents; From 90f4df42fc608547f31fd5aa3ff01b563cde4aa4 Mon Sep 17 00:00:00 2001 From: Halil ibrahim Kalkan Date: Thu, 6 Dec 2018 11:25:04 +0300 Subject: [PATCH 41/60] Refactor Project\Index.cshtml.cs --- .../Pages/Documents/Project/Index.cshtml | 7 +- .../Pages/Documents/Project/Index.cshtml.cs | 84 +++++++++---------- 2 files changed, 43 insertions(+), 48 deletions(-) diff --git a/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml b/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml index 7f72a96d70..961bf4c467 100644 --- a/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml +++ b/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml @@ -10,7 +10,6 @@ @{ ViewBag.FluidLayout = true; Layout = ThemeManager.CurrentTheme.GetEmptyLayout(); - var projectDisplayName = Model.ProjectDisplayName ?? Model.ProjectName; } @section styles { @@ -46,10 +45,10 @@
- @if (Model.Versions.Any()) + @if (Model.VersionSelectItems.Any()) {
diff --git a/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml.cs b/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml.cs index 3aa1010c17..f659e86a12 100644 --- a/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml.cs +++ b/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml.cs @@ -29,8 +29,6 @@ namespace Volo.Docs.Pages.Documents.Project public DocumentWithDetailsDto Document { get; private set; } - public List Versions { get; private set; } - public List VersionSelectItems { get; private set; } public NavigationWithDetailsDto Navigation { get; private set; } @@ -58,6 +56,7 @@ namespace Volo.Docs.Pages.Documents.Project SetDocumentNames(); await SetVersionAsync(); await SetDocumentAsync(); + ConvertDocumentContentToHtml(); await SetNavigationAsync(); } @@ -73,13 +72,14 @@ namespace Volo.Docs.Pages.Documents.Project private async Task SetVersionAsync() { - var output = await _projectAppService.GetVersionsAsync(Project.Id); + //TODO: Needs refactoring - Versions = output.Items + var output = await _projectAppService.GetVersionsAsync(Project.Id); + var versions = output.Items .Select(v => new VersionInfoViewModel(v.DisplayName, v.Name)) .ToList(); - LatestVersionInfo = Versions.First(); + LatestVersionInfo = versions.First(); LatestVersionInfo.DisplayText = $"{LatestVersionInfo.DisplayText} ({DocsAppConsts.Latest})"; LatestVersionInfo.Version = LatestVersionInfo.Version; @@ -90,7 +90,7 @@ namespace Volo.Docs.Pages.Documents.Project } else { - var versionFromUrl = Versions.FirstOrDefault(v => v.Version == Version); + var versionFromUrl = versions.FirstOrDefault(v => v.Version == Version); if (versionFromUrl != null) { versionFromUrl.IsSelected = true; @@ -98,12 +98,12 @@ namespace Volo.Docs.Pages.Documents.Project } else { - Versions.First().IsSelected = true; - Version = Versions.First().Version; + versions.First().IsSelected = true; + Version = versions.First().Version; } } - VersionSelectItems = Versions.Select(v => new SelectListItem + VersionSelectItems = versions.Select(v => new SelectListItem { Text = v.DisplayText, Value = CreateLink(LatestVersionInfo, v.Version, DocumentName), @@ -191,16 +191,27 @@ namespace Volo.Docs.Pages.Documents.Project catch (DocumentNotFoundException) { //TODO: Handle it! - return; + throw; } - - var converter = _documentToHtmlConverterFactory.Create(Document.Format ?? Project.Format); - - var content = converter.NormalizeLinks(Document.Content, Document.Project.ShortName, GetSpecificVersionOrLatest(), Document.LocalDirectory); - content = converter.Convert(content); + } - content = HtmlNormalizer.ReplaceImageSources(content, Document.RawRootUrl, Document.LocalDirectory); - content = HtmlNormalizer.ReplaceCodeBlocksLanguage(content, "language-C#", "language-csharp"); //todo find a way to make it on client in prismJS configuration (eg: map C# => csharp) + private void ConvertDocumentContentToHtml() + { + var converter = _documentToHtmlConverterFactory.Create(Document.Format ?? Project.Format); + var content = converter.Convert(Project, Document, GetSpecificVersionOrLatest()); + + content = HtmlNormalizer.ReplaceImageSources( + content, + Document.RawRootUrl, + Document.LocalDirectory + ); + + //todo find a way to make it on client in prismJS configuration (eg: map C# => csharp) + content = HtmlNormalizer.ReplaceCodeBlocksLanguage( + content, + "language-C#", + "language-csharp" + ); Document.Content = content; } From 9f02727ac2aaee58987c077e089b8dbf636b5c31 Mon Sep 17 00:00:00 2001 From: Halil ibrahim Kalkan Date: Thu, 6 Dec 2018 14:37:02 +0300 Subject: [PATCH 45/60] Update MarkdownDocumentToHtmlConverter.cs --- .../MarkdownDocumentToHtmlConverter.cs | 77 ++++++++----------- 1 file changed, 34 insertions(+), 43 deletions(-) diff --git a/modules/docs/src/Volo.Docs.Web/Markdown/MarkdownDocumentToHtmlConverter.cs b/modules/docs/src/Volo.Docs.Web/Markdown/MarkdownDocumentToHtmlConverter.cs index 522a820c90..7851d99a99 100644 --- a/modules/docs/src/Volo.Docs.Web/Markdown/MarkdownDocumentToHtmlConverter.cs +++ b/modules/docs/src/Volo.Docs.Web/Markdown/MarkdownDocumentToHtmlConverter.cs @@ -14,11 +14,11 @@ namespace Volo.Docs.Markdown { public const string Type = "md"; - private const string NewLinkFormat = "[{0}](/documents/{1}/{2}{3}/{4})"; + private const string MdLinkFormat = "[{0}](/documents/{1}/{2}{3}/{4})"; private const string MarkdownLinkRegExp = @"\[([^)]+)\]\(([^)]+." + Type + @")\)"; private const string AnchorLinkRegExp = @"]+href=\""(.*?)\""[^>]*>(.*)?"; - public string Convert(ProjectDto project, DocumentWithDetailsDto document, string version) + public virtual string Convert(ProjectDto project, DocumentWithDetailsDto document, string version) { if (document.Content.IsNullOrEmpty()) { @@ -35,41 +35,43 @@ namespace Volo.Docs.Markdown return CommonMarkConverter.Convert(Encoding.UTF8.GetString(Encoding.Default.GetBytes(content))); } - private string NormalizeLinks( + protected virtual string NormalizeLinks( string content, string projectShortName, string version, string documentLocalDirectory) { - if (content == null) + var normalized = Regex.Replace(content, MarkdownLinkRegExp, delegate(Match match) { - return null; - } - - var normalized = Regex.Replace(content, MarkdownLinkRegExp, delegate (Match match) - { - var link = match.Groups[2].Value; - if (UrlHelper.IsExternalLink(link)) - { - return match.Value; - } + var link = match.Groups[2].Value; + if (UrlHelper.IsExternalLink(link)) + { + return match.Value; + } - var displayText = match.Groups[1].Value; + var displayText = match.Groups[1].Value; - var documentName = RemoveFileExtension(link); - var documentLocalDirectoryNormalized = documentLocalDirectory.TrimStart('/').TrimEnd('/'); - if (!string.IsNullOrWhiteSpace(documentLocalDirectoryNormalized)) - { - documentLocalDirectoryNormalized = "/" + documentLocalDirectoryNormalized; - } + var documentName = RemoveFileExtension(link); + var documentLocalDirectoryNormalized = documentLocalDirectory.TrimStart('/').TrimEnd('/'); + if (!string.IsNullOrWhiteSpace(documentLocalDirectoryNormalized)) + { + documentLocalDirectoryNormalized = "/" + documentLocalDirectoryNormalized; + } - return string.Format(NewLinkFormat, displayText, projectShortName, version, documentLocalDirectoryNormalized, documentName); - }); + return string.Format( + MdLinkFormat, + displayText, + projectShortName, + version, + documentLocalDirectoryNormalized, + documentName + ); + }); normalized = Regex.Replace(normalized, AnchorLinkRegExp, delegate (Match match) { var link = match.Groups[1].Value; - if (IsRemoteUrl(link)) + if (UrlHelper.IsExternalLink(link)) { return match.Value; } @@ -82,7 +84,14 @@ namespace Volo.Docs.Markdown documentLocalDirectoryNormalized = "/" + documentLocalDirectoryNormalized; } - return string.Format(NewLinkFormat, displayText, projectShortName, version, documentLocalDirectoryNormalized, documentName); + return string.Format( + MdLinkFormat, + displayText, + projectShortName, + version, + documentLocalDirectoryNormalized, + documentName + ); }); return normalized; @@ -107,23 +116,5 @@ namespace Volo.Docs.Markdown return documentName.Left(documentName.Length - Type.Length - 1); } - - //TODO: Merge with UrlHelper.IsExternalLink - private static bool IsRemoteUrl(string url) - { - if (url == null) - { - return true; - } - - try - { - return Regex.IsMatch(url, @"\A(https?|ftp)://(-\.)?([^\s/?\.#-]+\.?)+(/[^\s]*)?\z"); - } - catch (Exception) - { - return true; - } - } } } From e21fe863d19e7ce4867a6cad1bc577bad2e8dc8d Mon Sep 17 00:00:00 2001 From: Halil ibrahim Kalkan Date: Thu, 6 Dec 2018 14:43:04 +0300 Subject: [PATCH 46/60] Refactor docs --- .../{Helpers => }/TagHelpers/TreeTagHelper.cs | 4 +++- .../Pages/Documents/Project/Index.cshtml.cs | 23 ++++++++++--------- 2 files changed, 15 insertions(+), 12 deletions(-) rename modules/docs/src/Volo.Docs.Web/Areas/Documents/{Helpers => }/TagHelpers/TreeTagHelper.cs (95%) diff --git a/modules/docs/src/Volo.Docs.Web/Areas/Documents/Helpers/TagHelpers/TreeTagHelper.cs b/modules/docs/src/Volo.Docs.Web/Areas/Documents/TagHelpers/TreeTagHelper.cs similarity index 95% rename from modules/docs/src/Volo.Docs.Web/Areas/Documents/Helpers/TagHelpers/TreeTagHelper.cs rename to modules/docs/src/Volo.Docs.Web/Areas/Documents/TagHelpers/TreeTagHelper.cs index bab4600677..38e95a6e93 100644 --- a/modules/docs/src/Volo.Docs.Web/Areas/Documents/Helpers/TagHelpers/TreeTagHelper.cs +++ b/modules/docs/src/Volo.Docs.Web/Areas/Documents/TagHelpers/TreeTagHelper.cs @@ -5,8 +5,10 @@ using Microsoft.AspNetCore.Razor.TagHelpers; using Volo.Docs.Documents; using Volo.Docs.Utils; -namespace Volo.Docs.Areas.Documents.Helpers.TagHelpers +namespace Volo.Docs.Areas.Documents.TagHelpers { + //TODO: Better to convert element "document-nav-tree" + //TODO: Or better to convert to a partial view or to a view component instead of a tag helper! [HtmlTargetElement("ul", Attributes = "root-node")] public class TreeTagHelper : TagHelper { diff --git a/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml.cs b/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml.cs index f659e86a12..3496773054 100644 --- a/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml.cs +++ b/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml.cs @@ -51,23 +51,15 @@ namespace Volo.Docs.Pages.Documents.Project public async Task OnGetAsync() { - Project = await _projectAppService.GetByShortNameAsync(ProjectName); - - SetDocumentNames(); + await SetProjectAsync(); await SetVersionAsync(); await SetDocumentAsync(); - ConvertDocumentContentToHtml(); await SetNavigationAsync(); } - private void SetDocumentNames() + private async Task SetProjectAsync() { - if (DocumentName.IsNullOrWhiteSpace()) - { - DocumentName = Project.DefaultDocumentName; - } - - DocumentNameWithExtension = DocumentName + "." + Project.Format; + Project = await _projectAppService.GetByShortNameAsync(ProjectName); } private async Task SetVersionAsync() @@ -164,6 +156,13 @@ namespace Volo.Docs.Pages.Documents.Project private async Task SetDocumentAsync() { + if (DocumentName.IsNullOrWhiteSpace()) + { + DocumentName = Project.DefaultDocumentName; + } + + DocumentNameWithExtension = DocumentName + "." + Project.Format; + try { if (DocumentNameWithExtension.IsNullOrWhiteSpace()) @@ -193,6 +192,8 @@ namespace Volo.Docs.Pages.Documents.Project //TODO: Handle it! throw; } + + ConvertDocumentContentToHtml(); } private void ConvertDocumentContentToHtml() From 18591befc4695a1cb8b1d642636ae189f6887afc Mon Sep 17 00:00:00 2001 From: Halil ibrahim Kalkan Date: Fri, 7 Dec 2018 11:04:10 +0300 Subject: [PATCH 47/60] Added HTTP API --- .../Volo/Docs/Projects/IProjectAppService.cs | 6 +-- .../Volo/Docs/Projects/ProjectAppService.cs | 6 +-- .../Volo.Docs.HttpApi.csproj | 1 + .../Volo/Docs/DocsHttpApiModule.cs | 7 ++- .../Docs/Documents/DocsDocumentController.cs | 42 ++++++++++++++++++ .../Docs/Projects/DocsProjectController.cs | 43 +++++++++++++++++++ .../Pages/Documents/Project/Index.cshtml.cs | 4 +- 7 files changed, 98 insertions(+), 11 deletions(-) create mode 100644 modules/docs/src/Volo.Docs.HttpApi/Volo/Docs/Documents/DocsDocumentController.cs create mode 100644 modules/docs/src/Volo.Docs.HttpApi/Volo/Docs/Projects/DocsProjectController.cs diff --git a/modules/docs/src/Volo.Docs.Application.Contracts/Volo/Docs/Projects/IProjectAppService.cs b/modules/docs/src/Volo.Docs.Application.Contracts/Volo/Docs/Projects/IProjectAppService.cs index 157ac6c842..5bfc221e4d 100644 --- a/modules/docs/src/Volo.Docs.Application.Contracts/Volo/Docs/Projects/IProjectAppService.cs +++ b/modules/docs/src/Volo.Docs.Application.Contracts/Volo/Docs/Projects/IProjectAppService.cs @@ -1,5 +1,3 @@ -using System; -using System.Collections.Generic; using System.Threading.Tasks; using Volo.Abp.Application.Dtos; using Volo.Abp.Application.Services; @@ -10,8 +8,8 @@ namespace Volo.Docs.Projects { Task> GetListAsync(); - Task GetByShortNameAsync(string shortName); + Task GetAsync(string shortName); - Task> GetVersionsAsync(Guid id); + Task> GetVersionsAsync(string shortName); } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Application/Volo/Docs/Projects/ProjectAppService.cs b/modules/docs/src/Volo.Docs.Application/Volo/Docs/Projects/ProjectAppService.cs index 2ce6f055c0..ac98279f13 100644 --- a/modules/docs/src/Volo.Docs.Application/Volo/Docs/Projects/ProjectAppService.cs +++ b/modules/docs/src/Volo.Docs.Application/Volo/Docs/Projects/ProjectAppService.cs @@ -35,16 +35,16 @@ namespace Volo.Docs.Projects ); } - public async Task GetByShortNameAsync(string shortName) + public async Task GetAsync(string shortName) { var project = await _projectRepository.GetByShortNameAsync(shortName); return ObjectMapper.Map(project); } - public async Task> GetVersionsAsync(Guid id) + public async Task> GetVersionsAsync(string shortName) { - var project = await _projectRepository.GetAsync(id); + var project = await _projectRepository.GetByShortNameAsync(shortName); var versions = await _versionCache.GetOrAddAsync( project.ShortName, diff --git a/modules/docs/src/Volo.Docs.HttpApi/Volo.Docs.HttpApi.csproj b/modules/docs/src/Volo.Docs.HttpApi/Volo.Docs.HttpApi.csproj index c4b436c6f6..13d295b421 100644 --- a/modules/docs/src/Volo.Docs.HttpApi/Volo.Docs.HttpApi.csproj +++ b/modules/docs/src/Volo.Docs.HttpApi/Volo.Docs.HttpApi.csproj @@ -11,6 +11,7 @@ + diff --git a/modules/docs/src/Volo.Docs.HttpApi/Volo/Docs/DocsHttpApiModule.cs b/modules/docs/src/Volo.Docs.HttpApi/Volo/Docs/DocsHttpApiModule.cs index 003f2e3068..0d700576be 100644 --- a/modules/docs/src/Volo.Docs.HttpApi/Volo/Docs/DocsHttpApiModule.cs +++ b/modules/docs/src/Volo.Docs.HttpApi/Volo/Docs/DocsHttpApiModule.cs @@ -1,9 +1,12 @@ -using Volo.Abp.Modularity; +using Volo.Abp.AspNetCore.Mvc; +using Volo.Abp.Modularity; namespace Volo.Docs { [DependsOn( - typeof(DocsApplicationContractsModule))] + typeof(DocsApplicationContractsModule), + typeof(AbpAspNetCoreMvcModule) + )] public class DocsHttpApiModule : AbpModule { diff --git a/modules/docs/src/Volo.Docs.HttpApi/Volo/Docs/Documents/DocsDocumentController.cs b/modules/docs/src/Volo.Docs.HttpApi/Volo/Docs/Documents/DocsDocumentController.cs new file mode 100644 index 0000000000..9ef4b52e49 --- /dev/null +++ b/modules/docs/src/Volo.Docs.HttpApi/Volo/Docs/Documents/DocsDocumentController.cs @@ -0,0 +1,42 @@ +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc; +using Volo.Abp; +using Volo.Abp.AspNetCore.Mvc; + +namespace Volo.Docs.Documents +{ + [RemoteService] + [Area("docs")] + [ControllerName("Document")] + [Route("api/docs/documents")] + public class DocsDocumentController : AbpController, IDocumentAppService + { + protected IDocumentAppService DocumentAppService { get; } + + public DocsDocumentController(IDocumentAppService documentAppService) + { + DocumentAppService = documentAppService; + } + + [HttpGet] + [Route("")] + public virtual Task GetAsync(GetDocumentInput input) + { + return DocumentAppService.GetAsync(input); + } + + [HttpGet] + [Route("default")] + public virtual Task GetDefaultAsync(GetDefaultDocumentInput input) + { + return DocumentAppService.GetDefaultAsync(input); + } + + [HttpGet] + [Route("navigation")] + public virtual Task GetNavigationDocumentAsync(GetNavigationDocumentInput input) + { + return DocumentAppService.GetNavigationDocumentAsync(input); + } + } +} diff --git a/modules/docs/src/Volo.Docs.HttpApi/Volo/Docs/Projects/DocsProjectController.cs b/modules/docs/src/Volo.Docs.HttpApi/Volo/Docs/Projects/DocsProjectController.cs new file mode 100644 index 0000000000..773655aab8 --- /dev/null +++ b/modules/docs/src/Volo.Docs.HttpApi/Volo/Docs/Projects/DocsProjectController.cs @@ -0,0 +1,43 @@ +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc; +using Volo.Abp; +using Volo.Abp.Application.Dtos; +using Volo.Abp.AspNetCore.Mvc; + +namespace Volo.Docs.Projects +{ + [RemoteService] + [Area("docs")] + [ControllerName("Project")] + [Route("api/docs/projects")] + public class DocsProjectController : AbpController, IProjectAppService + { + protected IProjectAppService ProjectAppService { get; } + + public DocsProjectController(IProjectAppService projectAppService) + { + ProjectAppService = projectAppService; + } + + [HttpGet] + [Route("")] + public virtual Task> GetListAsync() + { + return ProjectAppService.GetListAsync(); + } + + [HttpGet] + [Route("{shortName}")] + public virtual Task GetAsync(string shortName) + { + return ProjectAppService.GetAsync(shortName); + } + + [HttpGet] + [Route("{shortName}/versions")] + public virtual Task> GetVersionsAsync(string shortName) + { + return ProjectAppService.GetVersionsAsync(shortName); + } + } +} diff --git a/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml.cs b/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml.cs index 3496773054..15889a07b8 100644 --- a/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml.cs +++ b/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml.cs @@ -59,14 +59,14 @@ namespace Volo.Docs.Pages.Documents.Project private async Task SetProjectAsync() { - Project = await _projectAppService.GetByShortNameAsync(ProjectName); + Project = await _projectAppService.GetAsync(ProjectName); } private async Task SetVersionAsync() { //TODO: Needs refactoring - var output = await _projectAppService.GetVersionsAsync(Project.Id); + var output = await _projectAppService.GetVersionsAsync(Project.ShortName); var versions = output.Items .Select(v => new VersionInfoViewModel(v.DisplayName, v.Name)) .ToList(); From 5b0d647e9e78a6a081a82c8ad0a6d02612ca00be Mon Sep 17 00:00:00 2001 From: Yunus Emre Kalkan Date: Fri, 7 Dec 2018 14:17:47 +0300 Subject: [PATCH 48/60] Remove lib folder, use npm packages instead for docs module #510 --- .../Volo.DocsTestApp/abp.resourcemapping.js | 17 +- .../docs/app/Volo.DocsTestApp/package.json | 8 +- .../wwwroot/libs}/anchor-js/anchor.js | 4 +- .../libs/bootstrap-toc/bootstrap-toc.js | 159 - .../libs/bootstrap-toc/bootstrap-toc.min.css | 4 - .../libs/bootstrap-toc/bootstrap-toc.min.js | 5 - .../wwwroot/libs/clipboard/clipboard.js | 978 + .../jquery.mCustomScrollbar.concat.min.js | 0 .../jquery.mCustomScrollbar.css | 1267 ++ .../wwwroot/libs/popper.js/popper.min.js | 5 + .../libs/prismjs}/prism-copy-to-clipboard.js | 0 .../wwwroot/libs/prismjs}/prism-csharp.js | 0 .../libs/prismjs}/prism-line-highlight.css | 0 .../libs/prismjs}/prism-line-highlight.js | 0 .../wwwroot/libs/prismjs}/prism-okaidia.css | 0 .../libs/prismjs}/prism-show-language.js | 0 .../wwwroot/libs/prismjs}/prism-toolbar.css | 0 .../wwwroot/libs/prismjs}/prism-toolbar.js | 0 .../wwwroot/libs}/prismjs/prism.js | 0 modules/docs/app/Volo.DocsTestApp/yarn.lock | 208 +- .../Volo/Docs/Projects/ProjectAppService.cs | 2 +- .../Pages/Documents/Project/Index.cshtml | 32 +- .../Documents/Project}/bootstrap-toc.css | 58 +- .../Pages/Documents/Project/bootstrap-toc.js | 159 + .../Documents/Project/bootstrap-toc.less | 110 + .../Documents/Project/bootstrap-toc.min.css | 1 + .../Pages/Documents/Project/index.js | 3 +- .../src/Volo.Docs.Web/Volo.Docs.Web.csproj | 3 + .../wwwroot/lib/anchor-js/.bower.json | 29 - .../wwwroot/lib/anchor-js/README.md | 53 - .../wwwroot/lib/anchor-js/anchor.min.js | 6 - .../wwwroot/lib/anchor-js/banner.js | 17 - .../wwwroot/lib/anchor-js/bower.json | 19 - .../wwwroot/lib/anchor-js/docs/anchor.js | 335 - .../wwwroot/lib/anchor-js/docs/favicon.ico | Bin 1150 -> 0 bytes .../anchor-js/docs/fonts/anchorjs-extras.eot | Bin 1680 -> 0 bytes .../anchor-js/docs/fonts/anchorjs-extras.svg | 11 - .../anchor-js/docs/fonts/anchorjs-extras.ttf | Bin 1484 -> 0 bytes .../anchor-js/docs/fonts/anchorjs-extras.woff | Bin 1560 -> 0 bytes .../lib/anchor-js/docs/fonts/fonts.css | 24 - .../docs/grunticon/grunticon.loader.js | 3 - .../docs/grunticon/icons.data.png.css | 5 - .../docs/grunticon/icons.data.svg.css | 5 - .../docs/grunticon/icons.fallback.css | 5 - .../docs/grunticon/png/grunticon-link.png | Bin 499 -> 0 bytes .../lib/anchor-js/docs/grunticon/preview.html | 33 - .../anchor-js/docs/img/anchoring-links.png | Bin 33647 -> 0 bytes .../lib/anchor-js/docs/img/anchorjs_logo.png | Bin 7581 -> 0 bytes .../lib/anchor-js/docs/img/anchorlinks2.png | Bin 62031 -> 0 bytes .../lib/anchor-js/docs/img/gh-link.svg | 9 - .../lib/anchor-js/docs/img/gh_link.svg | 9 - .../lib/anchor-js/docs/img/hyperlink.svg | 9 - .../wwwroot/lib/anchor-js/docs/img/link.svg | 6 - .../lib/anchor-js/docs/img/mini-logo.png | Bin 2259 -> 0 bytes .../lib/anchor-js/docs/img/primer-md.png | Bin 16739 -> 0 bytes .../wwwroot/lib/anchor-js/docs/index.html | 822 - .../wwwroot/lib/anchor-js/docs/scripts.js | 12 - .../wwwroot/lib/anchor-js/docs/styles.css | 494 - .../wwwroot/lib/bootstrap-toc/.bower.json | 14 - .../wwwroot/lib/bootstrap-toc/.gitignore | 4 - .../wwwroot/lib/bootstrap-toc/.travis.yml | 10 - .../wwwroot/lib/bootstrap-toc/Gemfile | 3 - .../wwwroot/lib/bootstrap-toc/LICENSE.md | 25 - .../wwwroot/lib/bootstrap-toc/_config.yml | 6 - .../lib/bootstrap-toc/_layouts/default.html | 56 - .../lib/bootstrap-toc/_layouts/test.html | 10 - .../lib/bootstrap-toc/assets/screen.css | 54 - .../lib/bootstrap-toc/bootstrap-toc.css | 58 - .../lib/bootstrap-toc/bootstrap-toc.js | 159 - .../lib/bootstrap-toc/dist/bootstrap-toc.css | 60 - .../lib/bootstrap-toc/dist/bootstrap-toc.js | 159 - .../bootstrap-toc/dist/bootstrap-toc.min.css | 4 - .../bootstrap-toc/dist/bootstrap-toc.min.js | 5 - .../wwwroot/lib/bootstrap-toc/gulpfile.js | 58 - .../wwwroot/lib/bootstrap-toc/index.md | 183 - .../wwwroot/lib/bootstrap-toc/package.json | 22 - .../wwwroot/lib/bootstrap-toc/test/index.html | 24 - .../lib/bootstrap-toc/test/templates/h2s.md | 17 - .../bootstrap-toc/test/templates/markdown.md | 21 - .../bootstrap-toc/test/templates/no-ids.html | 12 - .../lib/bootstrap-toc/test/toc-test.js | 210 - .../wwwroot/lib/clipboard/.bower.json | 33 - .../wwwroot/lib/clipboard/bower.json | 22 - .../wwwroot/lib/clipboard/composer.json | 25 - .../wwwroot/lib/clipboard/contributing.md | 28 - .../wwwroot/lib/clipboard/dist/clipboard.js | 939 - .../lib/clipboard/dist/clipboard.min.js | 7 - .../wwwroot/lib/clipboard/package.js | 12 - .../wwwroot/lib/clipboard/package.json | 78 - .../wwwroot/lib/clipboard/readme.md | 189 - .../wwwroot/lib/clipboard/webpack.config.js | 41 - .../wwwroot/lib/delegate/.editorconfig | 22 - .../wwwroot/lib/delegate/.travis.yml | 3 - .../wwwroot/lib/delegate/demo/delegate.html | 29 - .../wwwroot/lib/delegate/demo/multiple.html | 37 - .../wwwroot/lib/delegate/demo/undelegate.html | 31 - .../wwwroot/lib/delegate/dist/delegate.js | 80 - .../wwwroot/lib/delegate/karma.conf.js | 24 - .../wwwroot/lib/delegate/package.json | 63 - .../wwwroot/lib/delegate/readme.md | 99 - .../wwwroot/lib/delegate/src/closest.js | 33 - .../wwwroot/lib/delegate/src/delegate.js | 78 - .../wwwroot/lib/delegate/test/closest.js | 45 - .../wwwroot/lib/delegate/test/delegate.js | 116 - .../wwwroot/lib/good-listener/.editorconfig | 22 - .../wwwroot/lib/good-listener/.npmignore | 1 - .../wwwroot/lib/good-listener/.travis.yml | 3 - .../wwwroot/lib/good-listener/bower.json | 11 - .../lib/good-listener/demo/destroy.html | 25 - .../lib/good-listener/demo/multiple.html | 30 - .../wwwroot/lib/good-listener/demo/node.html | 23 - .../lib/good-listener/demo/nodelist.html | 25 - .../lib/good-listener/demo/selector.html | 23 - .../lib/good-listener/dist/good-listener.js | 228 - .../wwwroot/lib/good-listener/karma.conf.js | 24 - .../wwwroot/lib/good-listener/package.json | 67 - .../wwwroot/lib/good-listener/readme.md | 91 - .../wwwroot/lib/good-listener/src/is.js | 49 - .../wwwroot/lib/good-listener/src/listen.js | 95 - .../wwwroot/lib/good-listener/test/is.js | 111 - .../wwwroot/lib/good-listener/test/listen.js | 135 - .../wwwroot/lib/highlight/CHANGES.md | 827 - .../wwwroot/lib/highlight/LICENSE | 24 - .../wwwroot/lib/highlight/README.md | 167 - .../wwwroot/lib/highlight/README.ru.md | 171 - .../wwwroot/lib/highlight/highlight.pack.js | 1 - .../wwwroot/lib/highlight/styles/arta.css | 160 - .../wwwroot/lib/highlight/styles/ascetic.css | 50 - .../highlight/styles/atelier-dune.dark.css | 93 - .../highlight/styles/atelier-dune.light.css | 93 - .../highlight/styles/atelier-forest.dark.css | 93 - .../highlight/styles/atelier-forest.light.css | 93 - .../highlight/styles/atelier-heath.dark.css | 93 - .../highlight/styles/atelier-heath.light.css | 93 - .../styles/atelier-lakeside.dark.css | 93 - .../styles/atelier-lakeside.light.css | 93 - .../highlight/styles/atelier-seaside.dark.css | 93 - .../styles/atelier-seaside.light.css | 93 - .../lib/highlight/styles/brown_paper.css | 105 - .../lib/highlight/styles/brown_papersq.png | Bin 18198 -> 0 bytes .../wwwroot/lib/highlight/styles/dark.css | 105 - .../wwwroot/lib/highlight/styles/default.css | 153 - .../wwwroot/lib/highlight/styles/docco.css | 132 - .../wwwroot/lib/highlight/styles/far.css | 113 - .../lib/highlight/styles/foundation.css | 133 - .../wwwroot/lib/highlight/styles/github.css | 125 - .../lib/highlight/styles/googlecode.css | 147 - .../wwwroot/lib/highlight/styles/idea.css | 122 - .../wwwroot/lib/highlight/styles/ir_black.css | 105 - .../wwwroot/lib/highlight/styles/magula.css | 123 - .../lib/highlight/styles/mono-blue.css | 62 - .../wwwroot/lib/highlight/styles/monokai.css | 127 - .../lib/highlight/styles/monokai_sublime.css | 149 - .../wwwroot/lib/highlight/styles/obsidian.css | 154 - .../lib/highlight/styles/paraiso.dark.css | 93 - .../lib/highlight/styles/paraiso.light.css | 93 - .../wwwroot/lib/highlight/styles/pojoaque.css | 106 - .../wwwroot/lib/highlight/styles/pojoaque.jpg | Bin 1186 -> 0 bytes .../lib/highlight/styles/railscasts.css | 182 - .../wwwroot/lib/highlight/styles/rainbow.css | 112 - .../lib/highlight/styles/school_book.css | 113 - .../lib/highlight/styles/school_book.png | Bin 486 -> 0 bytes .../lib/highlight/styles/solarized_dark.css | 107 - .../lib/highlight/styles/solarized_light.css | 107 - .../wwwroot/lib/highlight/styles/sunburst.css | 160 - .../highlight/styles/tomorrow-night-blue.css | 93 - .../styles/tomorrow-night-bright.css | 92 - .../styles/tomorrow-night-eighties.css | 92 - .../lib/highlight/styles/tomorrow-night.css | 93 - .../wwwroot/lib/highlight/styles/tomorrow.css | 90 - .../wwwroot/lib/highlight/styles/vs.css | 89 - .../wwwroot/lib/highlight/styles/xcode.css | 158 - .../wwwroot/lib/highlight/styles/zenburn.css | 117 - .../wwwroot/lib/highlightjs/.bower.json | 25 - .../wwwroot/lib/highlightjs/LICENSE | 24 - .../wwwroot/lib/highlightjs/Makefile | 21 - .../wwwroot/lib/highlightjs/README.md | 12 - .../wwwroot/lib/highlightjs/bower.json | 14 - .../wwwroot/lib/highlightjs/component.json | 12 - .../wwwroot/lib/highlightjs/composer.json | 26 - .../wwwroot/lib/highlightjs/highlight.pack.js | 16645 ---------------- .../lib/highlightjs/highlight.pack.min.js | 15 - .../wwwroot/lib/highlightjs/package.json | 8 - .../wwwroot/lib/highlightjs/styles/agate.css | 108 - .../lib/highlightjs/styles/androidstudio.css | 66 - .../lib/highlightjs/styles/arduino-light.css | 88 - .../wwwroot/lib/highlightjs/styles/arta.css | 73 - .../lib/highlightjs/styles/ascetic.css | 45 - .../highlightjs/styles/atelier-cave-dark.css | 83 - .../highlightjs/styles/atelier-cave-light.css | 85 - .../highlightjs/styles/atelier-cave.dark.css | 113 - .../highlightjs/styles/atelier-cave.light.css | 113 - .../highlightjs/styles/atelier-dune-dark.css | 69 - .../highlightjs/styles/atelier-dune-light.css | 69 - .../highlightjs/styles/atelier-dune.dark.css | 94 - .../highlightjs/styles/atelier-dune.light.css | 94 - .../styles/atelier-estuary-dark.css | 84 - .../styles/atelier-estuary-light.css | 84 - .../styles/atelier-estuary.dark.css | 113 - .../styles/atelier-estuary.light.css | 113 - .../styles/atelier-forest-dark.css | 69 - .../styles/atelier-forest-light.css | 69 - .../styles/atelier-forest.dark.css | 94 - .../styles/atelier-forest.light.css | 94 - .../highlightjs/styles/atelier-heath-dark.css | 69 - .../styles/atelier-heath-light.css | 69 - .../highlightjs/styles/atelier-heath.dark.css | 94 - .../styles/atelier-heath.light.css | 94 - .../styles/atelier-lakeside-dark.css | 69 - .../styles/atelier-lakeside-light.css | 69 - .../styles/atelier-lakeside.dark.css | 94 - .../styles/atelier-lakeside.light.css | 94 - .../styles/atelier-plateau-dark.css | 84 - .../styles/atelier-plateau-light.css | 84 - .../styles/atelier-plateau.dark.css | 113 - .../styles/atelier-plateau.light.css | 113 - .../styles/atelier-savanna-dark.css | 84 - .../styles/atelier-savanna-light.css | 84 - .../styles/atelier-savanna.dark.css | 113 - .../styles/atelier-savanna.light.css | 113 - .../styles/atelier-seaside-dark.css | 69 - .../styles/atelier-seaside-light.css | 69 - .../styles/atelier-seaside.dark.css | 94 - .../styles/atelier-seaside.light.css | 94 - .../styles/atelier-sulphurpool-dark.css | 69 - .../styles/atelier-sulphurpool-light.css | 69 - .../styles/atelier-sulphurpool.dark.css | 94 - .../styles/atelier-sulphurpool.light.css | 94 - .../lib/highlightjs/styles/atom-one-dark.css | 96 - .../lib/highlightjs/styles/atom-one-light.css | 96 - .../lib/highlightjs/styles/brown-paper.css | 64 - .../lib/highlightjs/styles/brown-papersq.png | Bin 18198 -> 0 bytes .../lib/highlightjs/styles/brown_paper.css | 103 - .../lib/highlightjs/styles/brown_papersq.png | Bin 18198 -> 0 bytes .../lib/highlightjs/styles/codepen-embed.css | 60 - .../lib/highlightjs/styles/color-brewer.css | 71 - .../lib/highlightjs/styles/darcula.css | 77 - .../wwwroot/lib/highlightjs/styles/dark.css | 63 - .../lib/highlightjs/styles/darkula.css | 6 - .../lib/highlightjs/styles/default.css | 99 - .../wwwroot/lib/highlightjs/styles/docco.css | 97 - .../lib/highlightjs/styles/dracula.css | 76 - .../wwwroot/lib/highlightjs/styles/far.css | 71 - .../lib/highlightjs/styles/foundation.css | 88 - .../lib/highlightjs/styles/github-gist.css | 71 - .../wwwroot/lib/highlightjs/styles/github.css | 99 - .../lib/highlightjs/styles/googlecode.css | 89 - .../lib/highlightjs/styles/grayscale.css | 101 - .../lib/highlightjs/styles/gruvbox-dark.css | 108 - .../lib/highlightjs/styles/gruvbox-light.css | 108 - .../lib/highlightjs/styles/hopscotch.css | 83 - .../wwwroot/lib/highlightjs/styles/hybrid.css | 102 - .../wwwroot/lib/highlightjs/styles/idea.css | 97 - .../lib/highlightjs/styles/ir-black.css | 73 - .../lib/highlightjs/styles/ir_black.css | 106 - .../lib/highlightjs/styles/kimbie.dark.css | 74 - .../lib/highlightjs/styles/kimbie.light.css | 74 - .../wwwroot/lib/highlightjs/styles/magula.css | 70 - .../lib/highlightjs/styles/mono-blue.css | 59 - .../highlightjs/styles/monokai-sublime.css | 83 - .../lib/highlightjs/styles/monokai.css | 70 - .../highlightjs/styles/monokai_sublime.css | 154 - .../lib/highlightjs/styles/obsidian.css | 88 - .../wwwroot/lib/highlightjs/styles/ocean.css | 74 - .../lib/highlightjs/styles/paraiso-dark.css | 72 - .../lib/highlightjs/styles/paraiso-light.css | 72 - .../lib/highlightjs/styles/paraiso.dark.css | 96 - .../lib/highlightjs/styles/paraiso.light.css | 96 - .../lib/highlightjs/styles/pojoaque.css | 83 - .../lib/highlightjs/styles/pojoaque.jpg | Bin 1186 -> 0 bytes .../lib/highlightjs/styles/purebasic.css | 96 - .../lib/highlightjs/styles/qtcreator_dark.css | 83 - .../highlightjs/styles/qtcreator_light.css | 83 - .../lib/highlightjs/styles/railscasts.css | 106 - .../lib/highlightjs/styles/rainbow.css | 85 - .../lib/highlightjs/styles/routeros.css | 108 - .../lib/highlightjs/styles/school-book.css | 72 - .../lib/highlightjs/styles/school-book.png | Bin 486 -> 0 bytes .../lib/highlightjs/styles/school_book.css | 111 - .../lib/highlightjs/styles/school_book.png | Bin 486 -> 0 bytes .../lib/highlightjs/styles/solarized-dark.css | 84 - .../highlightjs/styles/solarized-light.css | 84 - .../lib/highlightjs/styles/solarized_dark.css | 107 - .../highlightjs/styles/solarized_light.css | 107 - .../lib/highlightjs/styles/sunburst.css | 102 - .../styles/tomorrow-night-blue.css | 75 - .../styles/tomorrow-night-bright.css | 74 - .../styles/tomorrow-night-eighties.css | 74 - .../lib/highlightjs/styles/tomorrow-night.css | 75 - .../lib/highlightjs/styles/tomorrow.css | 72 - .../wwwroot/lib/highlightjs/styles/vs.css | 68 - .../wwwroot/lib/highlightjs/styles/vs2015.css | 115 - .../wwwroot/lib/highlightjs/styles/xcode.css | 93 - .../wwwroot/lib/highlightjs/styles/xt256.css | 92 - .../lib/highlightjs/styles/zenburn.css | 80 - .../lib/jquery-toc/jquery.tableofcontents.js | 312 - .../jquery-toc/jquery.tableofcontents.min.js | 12 - .../wwwroot/lib/jquery-unveil/.bower.json | 18 - .../wwwroot/lib/jquery-unveil/README.md | 84 - .../wwwroot/lib/jquery-unveil/bower.json | 5 - .../wwwroot/lib/jquery-unveil/img/.DS_Store | Bin 6148 -> 0 bytes .../img/Jude_Landry_Wallpaper_1280x800.jpg | Bin 380648 -> 0 bytes .../img/Jude_Landry_Wallpaper_800x500.jpg | Bin 74721 -> 0 bytes .../Timothy-J-Reynolds-wallpaper-1280x800.jpg | Bin 575761 -> 0 bytes .../Timothy-J-Reynolds-wallpaper-800x500.jpg | Bin 285431 -> 0 bytes ...bullying-tom-froese-wallpaper-1280x800.jpg | Bin 387125 -> 0 bytes ...-bullying-tom-froese-wallpaper-800x500.jpg | Bin 121336 -> 0 bytes .../img/brock-davis-wallpaper-1280x800.jpg | Bin 397290 -> 0 bytes .../img/brock-davis-wallpaper-800x500.jpg | Bin 192704 -> 0 bytes .../img/dark-igloo-wallpaper-1-1280x800.jpg | Bin 501471 -> 0 bytes .../img/dark-igloo-wallpaper-1-800x500.jpg | Bin 187923 -> 0 bytes .../img/dark-igloo-wallpaper-1280x800.jpg | Bin 522463 -> 0 bytes .../img/dark-igloo-wallpaper-800x500.jpg | Bin 91322 -> 0 bytes .../img/haik-avanian-wallpaper-1280x800.jpg | Bin 75878 -> 0 bytes .../img/haik-avanian-wallpaper-800x500.jpg | Bin 28580 -> 0 bytes .../img/iceland-smjor-wallpaper-1280x800.jpg | Bin 214627 -> 0 bytes .../img/iceland-smojr-wallpaper-800x500.jpg | Bin 101829 -> 0 bytes .../img/james-olstein-wallpaper-1280x800.jpg | Bin 498059 -> 0 bytes .../img/james-olstein-wallpaper-800x500.jpg | Bin 87495 -> 0 bytes .../img/johanna-basford-wallpaper-800x500.jpg | Bin 92261 -> 0 bytes .../img/julieta-felix-wallpaper-1280x800.jpg | Bin 84453 -> 0 bytes .../img/julieta-felix-wallpaper-800x500.jpg | Bin 50908 -> 0 bytes .../wwwroot/lib/jquery-unveil/img/loader.gif | Bin 10423 -> 0 bytes .../wwwroot/lib/jquery-unveil/index.html | 200 - .../lib/jquery-unveil/jquery-1.9.1.min.js | 5 - .../lib/jquery-unveil/jquery.unveil.js | 57 - .../lib/jquery-unveil/jquery.unveil.min.js | 11 - .../jquery.mCustomScrollbar.min.css | 1 - .../wwwroot/lib/mark.js/.bower.json | 55 - .../Volo.Docs.Web/wwwroot/lib/mark.js/LICENSE | 21 - .../wwwroot/lib/mark.js/README.md | 45 - .../wwwroot/lib/mark.js/bower.json | 44 - .../lib/mark.js/dist/jquery.mark.es6.js | 905 - .../lib/mark.js/dist/jquery.mark.es6.min.js | 7 - .../wwwroot/lib/mark.js/dist/jquery.mark.js | 1034 - .../lib/mark.js/dist/jquery.mark.min.js | 7 - .../wwwroot/lib/mark.js/dist/mark.es6.js | 910 - .../wwwroot/lib/mark.js/dist/mark.es6.min.js | 7 - .../wwwroot/lib/mark.js/dist/mark.js | 1041 - .../wwwroot/lib/mark.js/dist/mark.min.js | 7 - .../wwwroot/lib/popper.js/README.md | 219 - .../lib/popper.js/dist/esm/popper-utils.js | 1095 - .../popper.js/dist/esm/popper-utils.js.map | 1 - .../popper.js/dist/esm/popper-utils.min.js | 5 - .../dist/esm/popper-utils.min.js.map | 1 - .../wwwroot/lib/popper.js/dist/esm/popper.js | 2532 --- .../lib/popper.js/dist/esm/popper.js.map | 1 - .../lib/popper.js/dist/esm/popper.min.js | 5 - .../lib/popper.js/dist/esm/popper.min.js.map | 1 - .../lib/popper.js/dist/esm/poppper.js.flow | 144 - .../lib/popper.js/dist/popper-utils.js | 1044 - .../lib/popper.js/dist/popper-utils.js.map | 1 - .../lib/popper.js/dist/popper-utils.min.js | 5 - .../popper.js/dist/popper-utils.min.js.map | 1 - .../wwwroot/lib/popper.js/dist/popper.js | 2384 --- .../wwwroot/lib/popper.js/dist/popper.js.map | 1 - .../wwwroot/lib/popper.js/dist/popper.min.js | 5 - .../lib/popper.js/dist/popper.min.js.map | 1 - .../lib/popper.js/dist/umd/popper-utils.js | 1133 -- .../popper.js/dist/umd/popper-utils.js.map | 1 - .../popper.js/dist/umd/popper-utils.min.js | 5 - .../dist/umd/popper-utils.min.js.map | 1 - .../wwwroot/lib/popper.js/dist/umd/popper.js | 2540 --- .../lib/popper.js/dist/umd/popper.js.map | 1 - .../lib/popper.js/dist/umd/popper.min.js | 5 - .../lib/popper.js/dist/umd/popper.min.js.map | 1 - .../wwwroot/lib/popper.js/index.d.ts | 160 - .../wwwroot/lib/popper.js/index.js.flow | 144 - .../wwwroot/lib/popper.js/package.json | 54 - .../wwwroot/lib/prismjs/CHANGELOG.md | 1334 -- .../Volo.Docs.Web/wwwroot/lib/prismjs/LICENSE | 21 - .../wwwroot/lib/prismjs/README.md | 26 - .../wwwroot/lib/prismjs/components.js | 2 - .../wwwroot/lib/prismjs/components.json | 867 - .../wwwroot/lib/prismjs/components/index.js | 82 - .../lib/prismjs/components/prism-abap.js | 48 - .../lib/prismjs/components/prism-abap.min.js | 1 - .../prismjs/components/prism-actionscript.js | 17 - .../components/prism-actionscript.min.js | 1 - .../lib/prismjs/components/prism-ada.js | 19 - .../lib/prismjs/components/prism-ada.min.js | 1 - .../prismjs/components/prism-apacheconf.js | 47 - .../components/prism-apacheconf.min.js | 1 - .../lib/prismjs/components/prism-apl.js | 32 - .../lib/prismjs/components/prism-apl.min.js | 1 - .../prismjs/components/prism-applescript.js | 20 - .../components/prism-applescript.min.js | 1 - .../lib/prismjs/components/prism-arduino.js | 5 - .../prismjs/components/prism-arduino.min.js | 1 - .../lib/prismjs/components/prism-arff.js | 10 - .../lib/prismjs/components/prism-arff.min.js | 1 - .../lib/prismjs/components/prism-asciidoc.js | 271 - .../prismjs/components/prism-asciidoc.min.js | 1 - .../lib/prismjs/components/prism-asm6502.js | 28 - .../prismjs/components/prism-asm6502.min.js | 1 - .../lib/prismjs/components/prism-aspnet.js | 36 - .../prismjs/components/prism-aspnet.min.js | 1 - .../prismjs/components/prism-autohotkey.js | 27 - .../components/prism-autohotkey.min.js | 1 - .../lib/prismjs/components/prism-autoit.js | 34 - .../prismjs/components/prism-autoit.min.js | 1 - .../lib/prismjs/components/prism-bash.js | 84 - .../lib/prismjs/components/prism-bash.min.js | 1 - .../lib/prismjs/components/prism-basic.js | 17 - .../lib/prismjs/components/prism-basic.min.js | 1 - .../lib/prismjs/components/prism-batch.js | 99 - .../lib/prismjs/components/prism-batch.min.js | 1 - .../lib/prismjs/components/prism-bison.js | 39 - .../lib/prismjs/components/prism-bison.min.js | 1 - .../lib/prismjs/components/prism-brainfuck.js | 20 - .../prismjs/components/prism-brainfuck.min.js | 1 - .../lib/prismjs/components/prism-bro.js | 48 - .../lib/prismjs/components/prism-bro.min.js | 1 - .../wwwroot/lib/prismjs/components/prism-c.js | 33 - .../lib/prismjs/components/prism-c.min.js | 1 - .../lib/prismjs/components/prism-clike.js | 30 - .../lib/prismjs/components/prism-clike.min.js | 1 - .../lib/prismjs/components/prism-clojure.js | 13 - .../prismjs/components/prism-clojure.min.js | 1 - .../prismjs/components/prism-coffeescript.js | 91 - .../components/prism-coffeescript.min.js | 1 - .../lib/prismjs/components/prism-core.js | 557 - .../lib/prismjs/components/prism-core.min.js | 1 - .../lib/prismjs/components/prism-cpp.js | 20 - .../lib/prismjs/components/prism-cpp.min.js | 1 - .../lib/prismjs/components/prism-crystal.js | 51 - .../prismjs/components/prism-crystal.min.js | 1 - .../prismjs/components/prism-csharp.min.js | 1 - .../lib/prismjs/components/prism-csp.js | 25 - .../lib/prismjs/components/prism-csp.min.js | 1 - .../prismjs/components/prism-css-extras.js | 16 - .../components/prism-css-extras.min.js | 1 - .../lib/prismjs/components/prism-css.js | 52 - .../lib/prismjs/components/prism-css.min.js | 1 - .../wwwroot/lib/prismjs/components/prism-d.js | 64 - .../lib/prismjs/components/prism-d.min.js | 1 - .../lib/prismjs/components/prism-dart.js | 24 - .../lib/prismjs/components/prism-dart.min.js | 1 - .../lib/prismjs/components/prism-diff.js | 20 - .../lib/prismjs/components/prism-diff.min.js | 1 - .../lib/prismjs/components/prism-django.js | 41 - .../prismjs/components/prism-django.min.js | 1 - .../lib/prismjs/components/prism-docker.js | 11 - .../prismjs/components/prism-docker.min.js | 1 - .../lib/prismjs/components/prism-eiffel.js | 37 - .../prismjs/components/prism-eiffel.min.js | 1 - .../lib/prismjs/components/prism-elixir.js | 93 - .../prismjs/components/prism-elixir.min.js | 1 - .../lib/prismjs/components/prism-elm.js | 44 - .../lib/prismjs/components/prism-elm.min.js | 1 - .../lib/prismjs/components/prism-erb.js | 20 - .../lib/prismjs/components/prism-erb.min.js | 1 - .../lib/prismjs/components/prism-erlang.js | 44 - .../prismjs/components/prism-erlang.min.js | 1 - .../lib/prismjs/components/prism-flow.js | 34 - .../lib/prismjs/components/prism-flow.min.js | 1 - .../lib/prismjs/components/prism-fortran.js | 40 - .../prismjs/components/prism-fortran.min.js | 1 - .../lib/prismjs/components/prism-fsharp.js | 36 - .../prismjs/components/prism-fsharp.min.js | 1 - .../lib/prismjs/components/prism-gedcom.js | 28 - .../prismjs/components/prism-gedcom.min.js | 1 - .../lib/prismjs/components/prism-gherkin.js | 79 - .../prismjs/components/prism-gherkin.min.js | 1 - .../lib/prismjs/components/prism-git.js | 68 - .../lib/prismjs/components/prism-git.min.js | 1 - .../lib/prismjs/components/prism-glsl.js | 16 - .../lib/prismjs/components/prism-glsl.min.js | 1 - .../lib/prismjs/components/prism-go.js | 12 - .../lib/prismjs/components/prism-go.min.js | 1 - .../lib/prismjs/components/prism-graphql.js | 24 - .../prismjs/components/prism-graphql.min.js | 1 - .../lib/prismjs/components/prism-groovy.js | 65 - .../prismjs/components/prism-groovy.min.js | 1 - .../lib/prismjs/components/prism-haml.js | 154 - .../lib/prismjs/components/prism-haml.min.js | 1 - .../prismjs/components/prism-handlebars.js | 37 - .../components/prism-handlebars.min.js | 1 - .../lib/prismjs/components/prism-haskell.js | 36 - .../prismjs/components/prism-haskell.min.js | 1 - .../lib/prismjs/components/prism-haxe.js | 45 - .../lib/prismjs/components/prism-haxe.min.js | 1 - .../lib/prismjs/components/prism-hpkp.js | 20 - .../lib/prismjs/components/prism-hpkp.min.js | 1 - .../lib/prismjs/components/prism-hsts.js | 20 - .../lib/prismjs/components/prism-hsts.min.js | 1 - .../lib/prismjs/components/prism-http.js | 50 - .../lib/prismjs/components/prism-http.min.js | 1 - .../lib/prismjs/components/prism-ichigojam.js | 15 - .../prismjs/components/prism-ichigojam.min.js | 1 - .../lib/prismjs/components/prism-icon.js | 20 - .../lib/prismjs/components/prism-icon.min.js | 1 - .../lib/prismjs/components/prism-inform7.js | 61 - .../prismjs/components/prism-inform7.min.js | 1 - .../lib/prismjs/components/prism-ini.js | 11 - .../lib/prismjs/components/prism-ini.min.js | 1 - .../lib/prismjs/components/prism-io.js | 31 - .../lib/prismjs/components/prism-io.min.js | 1 - .../wwwroot/lib/prismjs/components/prism-j.js | 25 - .../lib/prismjs/components/prism-j.min.js | 1 - .../lib/prismjs/components/prism-java.js | 27 - .../lib/prismjs/components/prism-java.min.js | 1 - .../prismjs/components/prism-javascript.js | 56 - .../components/prism-javascript.min.js | 1 - .../lib/prismjs/components/prism-jolie.js | 56 - .../lib/prismjs/components/prism-jolie.min.js | 1 - .../lib/prismjs/components/prism-json.js | 14 - .../lib/prismjs/components/prism-json.min.js | 1 - .../lib/prismjs/components/prism-jsx.js | 125 - .../lib/prismjs/components/prism-jsx.min.js | 1 - .../lib/prismjs/components/prism-julia.js | 12 - .../lib/prismjs/components/prism-julia.min.js | 1 - .../lib/prismjs/components/prism-keyman.js | 14 - .../prismjs/components/prism-keyman.min.js | 1 - .../lib/prismjs/components/prism-kotlin.js | 62 - .../prismjs/components/prism-kotlin.min.js | 1 - .../lib/prismjs/components/prism-latex.js | 61 - .../lib/prismjs/components/prism-latex.min.js | 1 - .../lib/prismjs/components/prism-less.js | 60 - .../lib/prismjs/components/prism-less.min.js | 1 - .../lib/prismjs/components/prism-liquid.js | 12 - .../prismjs/components/prism-liquid.min.js | 1 - .../lib/prismjs/components/prism-lisp.js | 197 - .../lib/prismjs/components/prism-lisp.min.js | 1 - .../prismjs/components/prism-livescript.js | 119 - .../components/prism-livescript.min.js | 1 - .../lib/prismjs/components/prism-lolcode.js | 55 - .../prismjs/components/prism-lolcode.min.js | 1 - .../lib/prismjs/components/prism-lua.js | 20 - .../lib/prismjs/components/prism-lua.min.js | 1 - .../lib/prismjs/components/prism-makefile.js | 34 - .../prismjs/components/prism-makefile.min.js | 1 - .../lib/prismjs/components/prism-markdown.js | 120 - .../prismjs/components/prism-markdown.min.js | 1 - .../components/prism-markup-templating.js | 89 - .../components/prism-markup-templating.min.js | 1 - .../lib/prismjs/components/prism-markup.js | 56 - .../prismjs/components/prism-markup.min.js | 1 - .../lib/prismjs/components/prism-matlab.js | 16 - .../prismjs/components/prism-matlab.min.js | 1 - .../lib/prismjs/components/prism-mel.js | 43 - .../lib/prismjs/components/prism-mel.min.js | 1 - .../lib/prismjs/components/prism-mizar.js | 12 - .../lib/prismjs/components/prism-mizar.min.js | 1 - .../lib/prismjs/components/prism-monkey.js | 31 - .../prismjs/components/prism-monkey.min.js | 1 - .../lib/prismjs/components/prism-n4js.js | 14 - .../lib/prismjs/components/prism-n4js.min.js | 1 - .../lib/prismjs/components/prism-nasm.js | 24 - .../lib/prismjs/components/prism-nasm.min.js | 1 - .../lib/prismjs/components/prism-nginx.js | 11 - .../lib/prismjs/components/prism-nginx.min.js | 1 - .../lib/prismjs/components/prism-nim.js | 33 - .../lib/prismjs/components/prism-nim.min.js | 1 - .../lib/prismjs/components/prism-nix.js | 40 - .../lib/prismjs/components/prism-nix.min.js | 1 - .../lib/prismjs/components/prism-nsis.js | 29 - .../lib/prismjs/components/prism-nsis.min.js | 1 - .../prismjs/components/prism-objectivec.js | 5 - .../components/prism-objectivec.min.js | 1 - .../lib/prismjs/components/prism-ocaml.js | 27 - .../lib/prismjs/components/prism-ocaml.min.js | 1 - .../lib/prismjs/components/prism-opencl.js | 49 - .../prismjs/components/prism-opencl.min.js | 1 - .../lib/prismjs/components/prism-oz.js | 25 - .../lib/prismjs/components/prism-oz.min.js | 1 - .../lib/prismjs/components/prism-parigp.js | 30 - .../prismjs/components/prism-parigp.min.js | 1 - .../lib/prismjs/components/prism-parser.js | 67 - .../prismjs/components/prism-parser.min.js | 1 - .../lib/prismjs/components/prism-pascal.js | 55 - .../prismjs/components/prism-pascal.min.js | 1 - .../lib/prismjs/components/prism-perl.js | 191 - .../lib/prismjs/components/prism-perl.min.js | 1 - .../prismjs/components/prism-php-extras.js | 11 - .../components/prism-php-extras.min.js | 1 - .../lib/prismjs/components/prism-php.js | 124 - .../lib/prismjs/components/prism-php.min.js | 1 - .../lib/prismjs/components/prism-plsql.js | 20 - .../lib/prismjs/components/prism-plsql.min.js | 1 - .../prismjs/components/prism-powershell.js | 55 - .../components/prism-powershell.min.js | 1 - .../prismjs/components/prism-processing.js | 18 - .../components/prism-processing.min.js | 1 - .../lib/prismjs/components/prism-prolog.js | 20 - .../prismjs/components/prism-prolog.min.js | 1 - .../prismjs/components/prism-properties.js | 9 - .../components/prism-properties.min.js | 1 - .../lib/prismjs/components/prism-protobuf.js | 8 - .../prismjs/components/prism-protobuf.min.js | 1 - .../lib/prismjs/components/prism-pug.js | 198 - .../lib/prismjs/components/prism-pug.min.js | 1 - .../lib/prismjs/components/prism-puppet.js | 136 - .../prismjs/components/prism-puppet.min.js | 1 - .../lib/prismjs/components/prism-pure.js | 81 - .../lib/prismjs/components/prism-pure.min.js | 1 - .../lib/prismjs/components/prism-python.js | 29 - .../prismjs/components/prism-python.min.js | 1 - .../wwwroot/lib/prismjs/components/prism-q.js | 51 - .../lib/prismjs/components/prism-q.min.js | 1 - .../lib/prismjs/components/prism-qore.js | 20 - .../lib/prismjs/components/prism-qore.min.js | 1 - .../wwwroot/lib/prismjs/components/prism-r.js | 22 - .../lib/prismjs/components/prism-r.min.js | 1 - .../lib/prismjs/components/prism-reason.js | 32 - .../prismjs/components/prism-reason.min.js | 1 - .../lib/prismjs/components/prism-renpy.js | 29 - .../lib/prismjs/components/prism-renpy.min.js | 1 - .../lib/prismjs/components/prism-rest.js | 205 - .../lib/prismjs/components/prism-rest.min.js | 1 - .../lib/prismjs/components/prism-rip.js | 32 - .../lib/prismjs/components/prism-rip.min.js | 1 - .../lib/prismjs/components/prism-roboconf.js | 27 - .../prismjs/components/prism-roboconf.min.js | 1 - .../lib/prismjs/components/prism-ruby.js | 131 - .../lib/prismjs/components/prism-ruby.min.js | 1 - .../lib/prismjs/components/prism-rust.js | 68 - .../lib/prismjs/components/prism-rust.min.js | 1 - .../lib/prismjs/components/prism-sas.js | 34 - .../lib/prismjs/components/prism-sas.min.js | 1 - .../lib/prismjs/components/prism-sass.js | 73 - .../lib/prismjs/components/prism-sass.min.js | 1 - .../lib/prismjs/components/prism-scala.js | 18 - .../lib/prismjs/components/prism-scala.min.js | 1 - .../lib/prismjs/components/prism-scheme.js | 29 - .../prismjs/components/prism-scheme.min.js | 1 - .../lib/prismjs/components/prism-scss.js | 75 - .../lib/prismjs/components/prism-scss.min.js | 1 - .../lib/prismjs/components/prism-smalltalk.js | 31 - .../prismjs/components/prism-smalltalk.min.js | 1 - .../lib/prismjs/components/prism-smarty.js | 96 - .../prismjs/components/prism-smarty.min.js | 1 - .../lib/prismjs/components/prism-soy.js | 96 - .../lib/prismjs/components/prism-soy.min.js | 1 - .../lib/prismjs/components/prism-sql.js | 18 - .../lib/prismjs/components/prism-sql.min.js | 1 - .../lib/prismjs/components/prism-stylus.js | 111 - .../prismjs/components/prism-stylus.min.js | 1 - .../lib/prismjs/components/prism-swift.js | 25 - .../lib/prismjs/components/prism-swift.min.js | 1 - .../lib/prismjs/components/prism-tap.js | 20 - .../lib/prismjs/components/prism-tap.min.js | 1 - .../lib/prismjs/components/prism-tcl.js | 46 - .../lib/prismjs/components/prism-tcl.min.js | 1 - .../lib/prismjs/components/prism-textile.js | 257 - .../prismjs/components/prism-textile.min.js | 1 - .../lib/prismjs/components/prism-tsx.js | 2 - .../lib/prismjs/components/prism-tsx.min.js | 1 - .../lib/prismjs/components/prism-tt2.js | 59 - .../lib/prismjs/components/prism-tt2.min.js | 1 - .../lib/prismjs/components/prism-twig.js | 46 - .../lib/prismjs/components/prism-twig.min.js | 1 - .../prismjs/components/prism-typescript.js | 7 - .../components/prism-typescript.min.js | 1 - .../lib/prismjs/components/prism-vbnet.js | 15 - .../lib/prismjs/components/prism-vbnet.min.js | 1 - .../lib/prismjs/components/prism-velocity.js | 72 - .../prismjs/components/prism-velocity.min.js | 1 - .../lib/prismjs/components/prism-verilog.js | 20 - .../prismjs/components/prism-verilog.min.js | 1 - .../lib/prismjs/components/prism-vhdl.js | 23 - .../lib/prismjs/components/prism-vhdl.min.js | 1 - .../lib/prismjs/components/prism-vim.js | 10 - .../lib/prismjs/components/prism-vim.min.js | 1 - .../prismjs/components/prism-visual-basic.js | 34 - .../components/prism-visual-basic.min.js | 1 - .../lib/prismjs/components/prism-wasm.js | 31 - .../lib/prismjs/components/prism-wasm.min.js | 1 - .../lib/prismjs/components/prism-wiki.js | 81 - .../lib/prismjs/components/prism-wiki.min.js | 1 - .../lib/prismjs/components/prism-xeora.js | 114 - .../lib/prismjs/components/prism-xeora.min.js | 1 - .../lib/prismjs/components/prism-xojo.js | 20 - .../lib/prismjs/components/prism-xojo.min.js | 1 - .../lib/prismjs/components/prism-xquery.js | 164 - .../prismjs/components/prism-xquery.min.js | 1 - .../lib/prismjs/components/prism-yaml.js | 45 - .../lib/prismjs/components/prism-yaml.min.js | 1 - .../wwwroot/lib/prismjs/package.json | 81 - .../plugins/autolinker/prism-autolinker.css | 3 - .../plugins/autolinker/prism-autolinker.js | 81 - .../autolinker/prism-autolinker.min.js | 1 - .../plugins/autoloader/prism-autoloader.js | 209 - .../autoloader/prism-autoloader.min.js | 1 - .../command-line/prism-command-line.css | 33 - .../command-line/prism-command-line.js | 139 - .../command-line/prism-command-line.min.js | 1 - .../prism-copy-to-clipboard.min.js | 1 - .../custom-class/prism-custom-class.js | 31 - .../custom-class/prism-custom-class.min.js | 1 - .../prism-data-uri-highlight.js | 98 - .../prism-data-uri-highlight.min.js | 1 - .../file-highlight/prism-file-highlight.js | 90 - .../prism-file-highlight.min.js | 1 - .../prism-highlight-keywords.js | 17 - .../prism-highlight-keywords.min.js | 1 - .../jsonp-highlight/prism-jsonp-highlight.js | 151 - .../prism-jsonp-highlight.min.js | 1 - .../plugins/keep-markup/prism-keep-markup.js | 99 - .../keep-markup/prism-keep-markup.min.js | 1 - .../prism-line-highlight.min.js | 1 - .../line-numbers/prism-line-numbers.css | 41 - .../line-numbers/prism-line-numbers.js | 159 - .../line-numbers/prism-line-numbers.min.js | 1 - .../prism-normalize-whitespace.js | 190 - .../prism-normalize-whitespace.min.js | 1 - .../plugins/previewers/prism-previewers.css | 242 - .../plugins/previewers/prism-previewers.js | 715 - .../previewers/prism-previewers.min.js | 1 - .../prism-remove-initial-line-feed.js | 21 - .../prism-remove-initial-line-feed.min.js | 1 - .../show-invisibles/prism-show-invisibles.css | 33 - .../show-invisibles/prism-show-invisibles.js | 21 - .../prism-show-invisibles.min.js | 1 - .../show-language/prism-show-language.min.js | 1 - .../plugins/toolbar/prism-toolbar.min.js | 1 - .../prism-unescaped-markup.css | 10 - .../prism-unescaped-markup.js | 44 - .../prism-unescaped-markup.min.js | 1 - .../lib/prismjs/plugins/wpd/prism-wpd.css | 11 - .../lib/prismjs/plugins/wpd/prism-wpd.js | 169 - .../lib/prismjs/plugins/wpd/prism-wpd.min.js | 1 - .../wwwroot/lib/prismjs/themes/prism-coy.css | 225 - .../wwwroot/lib/prismjs/themes/prism-dark.css | 128 - .../lib/prismjs/themes/prism-funky.css | 116 - .../prismjs/themes/prism-solarizedlight.css | 149 - .../lib/prismjs/themes/prism-tomorrow.css | 121 - .../lib/prismjs/themes/prism-twilight.css | 198 - .../wwwroot/lib/prismjs/themes/prism.css | 138 - .../wwwroot/lib/select/.editorconfig | 22 - .../wwwroot/lib/select/.npmignore | 1 - .../wwwroot/lib/select/.travis.yml | 3 - .../wwwroot/lib/select/bower.json | 13 - .../lib/select/demo/contenteditable.html | 26 - .../wwwroot/lib/select/demo/dropdown.html | 30 - .../wwwroot/lib/select/demo/editable.html | 26 - .../wwwroot/lib/select/demo/multiple.html | 28 - .../wwwroot/lib/select/demo/nested.html | 34 - .../wwwroot/lib/select/demo/non-editable.html | 26 - .../wwwroot/lib/select/dist/select.js | 47 - .../wwwroot/lib/select/karma.conf.js | 23 - .../wwwroot/lib/select/package.json | 61 - .../wwwroot/lib/select/readme.md | 49 - .../wwwroot/lib/select/src/select.js | 43 - .../wwwroot/lib/select/test/select.js | 93 - .../wwwroot/lib/tiny-emitter/.npmignore | 14 - .../wwwroot/lib/tiny-emitter/LICENSE | 22 - .../wwwroot/lib/tiny-emitter/README.md | 88 - .../lib/tiny-emitter/dist/tinyemitter.js | 70 - .../lib/tiny-emitter/dist/tinyemitter.min.js | 1 - .../wwwroot/lib/tiny-emitter/index.d.ts | 8 - .../wwwroot/lib/tiny-emitter/index.js | 66 - .../wwwroot/lib/tiny-emitter/instance.js | 2 - .../wwwroot/lib/tiny-emitter/package.json | 81 - .../wwwroot/lib/tiny-emitter/test/index.js | 217 - 755 files changed, 2722 insertions(+), 70132 deletions(-) rename modules/docs/{src/Volo.Docs.Web/wwwroot/lib => app/Volo.DocsTestApp/wwwroot/libs}/anchor-js/anchor.js (99%) delete mode 100644 modules/docs/app/Volo.DocsTestApp/wwwroot/libs/bootstrap-toc/bootstrap-toc.js delete mode 100644 modules/docs/app/Volo.DocsTestApp/wwwroot/libs/bootstrap-toc/bootstrap-toc.min.css delete mode 100644 modules/docs/app/Volo.DocsTestApp/wwwroot/libs/bootstrap-toc/bootstrap-toc.min.js create mode 100644 modules/docs/app/Volo.DocsTestApp/wwwroot/libs/clipboard/clipboard.js rename modules/docs/{src/Volo.Docs.Web/wwwroot/lib => app/Volo.DocsTestApp/wwwroot/libs}/mCustomScrollbar/jquery.mCustomScrollbar.concat.min.js (100%) create mode 100644 modules/docs/app/Volo.DocsTestApp/wwwroot/libs/mCustomScrollbar/jquery.mCustomScrollbar.css create mode 100644 modules/docs/app/Volo.DocsTestApp/wwwroot/libs/popper.js/popper.min.js rename modules/docs/{src/Volo.Docs.Web/wwwroot/lib/prismjs/plugins/copy-to-clipboard => app/Volo.DocsTestApp/wwwroot/libs/prismjs}/prism-copy-to-clipboard.js (100%) rename modules/docs/{src/Volo.Docs.Web/wwwroot/lib/prismjs/components => app/Volo.DocsTestApp/wwwroot/libs/prismjs}/prism-csharp.js (100%) rename modules/docs/{src/Volo.Docs.Web/wwwroot/lib/prismjs/plugins/line-highlight => app/Volo.DocsTestApp/wwwroot/libs/prismjs}/prism-line-highlight.css (100%) rename modules/docs/{src/Volo.Docs.Web/wwwroot/lib/prismjs/plugins/line-highlight => app/Volo.DocsTestApp/wwwroot/libs/prismjs}/prism-line-highlight.js (100%) rename modules/docs/{src/Volo.Docs.Web/wwwroot/lib/prismjs/themes => app/Volo.DocsTestApp/wwwroot/libs/prismjs}/prism-okaidia.css (100%) rename modules/docs/{src/Volo.Docs.Web/wwwroot/lib/prismjs/plugins/show-language => app/Volo.DocsTestApp/wwwroot/libs/prismjs}/prism-show-language.js (100%) rename modules/docs/{src/Volo.Docs.Web/wwwroot/lib/prismjs/plugins/toolbar => app/Volo.DocsTestApp/wwwroot/libs/prismjs}/prism-toolbar.css (100%) rename modules/docs/{src/Volo.Docs.Web/wwwroot/lib/prismjs/plugins/toolbar => app/Volo.DocsTestApp/wwwroot/libs/prismjs}/prism-toolbar.js (100%) rename modules/docs/{src/Volo.Docs.Web/wwwroot/lib => app/Volo.DocsTestApp/wwwroot/libs}/prismjs/prism.js (100%) rename modules/docs/{app/Volo.DocsTestApp/wwwroot/libs/bootstrap-toc => src/Volo.Docs.Web/Pages/Documents/Project}/bootstrap-toc.css (56%) create mode 100644 modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/bootstrap-toc.js create mode 100644 modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/bootstrap-toc.less create mode 100644 modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/bootstrap-toc.min.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/.bower.json delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/README.md delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/anchor.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/banner.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/bower.json delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/docs/anchor.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/docs/favicon.ico delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/docs/fonts/anchorjs-extras.eot delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/docs/fonts/anchorjs-extras.svg delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/docs/fonts/anchorjs-extras.ttf delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/docs/fonts/anchorjs-extras.woff delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/docs/fonts/fonts.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/docs/grunticon/grunticon.loader.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/docs/grunticon/icons.data.png.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/docs/grunticon/icons.data.svg.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/docs/grunticon/icons.fallback.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/docs/grunticon/png/grunticon-link.png delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/docs/grunticon/preview.html delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/docs/img/anchoring-links.png delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/docs/img/anchorjs_logo.png delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/docs/img/anchorlinks2.png delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/docs/img/gh-link.svg delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/docs/img/gh_link.svg delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/docs/img/hyperlink.svg delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/docs/img/link.svg delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/docs/img/mini-logo.png delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/docs/img/primer-md.png delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/docs/index.html delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/docs/scripts.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/docs/styles.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/bootstrap-toc/.bower.json delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/bootstrap-toc/.gitignore delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/bootstrap-toc/.travis.yml delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/bootstrap-toc/Gemfile delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/bootstrap-toc/LICENSE.md delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/bootstrap-toc/_config.yml delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/bootstrap-toc/_layouts/default.html delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/bootstrap-toc/_layouts/test.html delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/bootstrap-toc/assets/screen.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/bootstrap-toc/bootstrap-toc.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/bootstrap-toc/bootstrap-toc.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/bootstrap-toc/dist/bootstrap-toc.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/bootstrap-toc/dist/bootstrap-toc.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/bootstrap-toc/dist/bootstrap-toc.min.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/bootstrap-toc/dist/bootstrap-toc.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/bootstrap-toc/gulpfile.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/bootstrap-toc/index.md delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/bootstrap-toc/package.json delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/bootstrap-toc/test/index.html delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/bootstrap-toc/test/templates/h2s.md delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/bootstrap-toc/test/templates/markdown.md delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/bootstrap-toc/test/templates/no-ids.html delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/bootstrap-toc/test/toc-test.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/clipboard/.bower.json delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/clipboard/bower.json delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/clipboard/composer.json delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/clipboard/contributing.md delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/clipboard/dist/clipboard.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/clipboard/dist/clipboard.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/clipboard/package.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/clipboard/package.json delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/clipboard/readme.md delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/clipboard/webpack.config.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/delegate/.editorconfig delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/delegate/.travis.yml delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/delegate/demo/delegate.html delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/delegate/demo/multiple.html delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/delegate/demo/undelegate.html delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/delegate/dist/delegate.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/delegate/karma.conf.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/delegate/package.json delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/delegate/readme.md delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/delegate/src/closest.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/delegate/src/delegate.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/delegate/test/closest.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/delegate/test/delegate.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/good-listener/.editorconfig delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/good-listener/.npmignore delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/good-listener/.travis.yml delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/good-listener/bower.json delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/good-listener/demo/destroy.html delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/good-listener/demo/multiple.html delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/good-listener/demo/node.html delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/good-listener/demo/nodelist.html delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/good-listener/demo/selector.html delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/good-listener/dist/good-listener.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/good-listener/karma.conf.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/good-listener/package.json delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/good-listener/readme.md delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/good-listener/src/is.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/good-listener/src/listen.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/good-listener/test/is.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/good-listener/test/listen.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlight/CHANGES.md delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlight/LICENSE delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlight/README.md delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlight/README.ru.md delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlight/highlight.pack.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlight/styles/arta.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlight/styles/ascetic.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlight/styles/atelier-dune.dark.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlight/styles/atelier-dune.light.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlight/styles/atelier-forest.dark.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlight/styles/atelier-forest.light.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlight/styles/atelier-heath.dark.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlight/styles/atelier-heath.light.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlight/styles/atelier-lakeside.dark.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlight/styles/atelier-lakeside.light.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlight/styles/atelier-seaside.dark.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlight/styles/atelier-seaside.light.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlight/styles/brown_paper.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlight/styles/brown_papersq.png delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlight/styles/dark.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlight/styles/default.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlight/styles/docco.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlight/styles/far.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlight/styles/foundation.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlight/styles/github.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlight/styles/googlecode.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlight/styles/idea.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlight/styles/ir_black.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlight/styles/magula.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlight/styles/mono-blue.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlight/styles/monokai.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlight/styles/monokai_sublime.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlight/styles/obsidian.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlight/styles/paraiso.dark.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlight/styles/paraiso.light.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlight/styles/pojoaque.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlight/styles/pojoaque.jpg delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlight/styles/railscasts.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlight/styles/rainbow.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlight/styles/school_book.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlight/styles/school_book.png delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlight/styles/solarized_dark.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlight/styles/solarized_light.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlight/styles/sunburst.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlight/styles/tomorrow-night-blue.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlight/styles/tomorrow-night-bright.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlight/styles/tomorrow-night-eighties.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlight/styles/tomorrow-night.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlight/styles/tomorrow.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlight/styles/vs.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlight/styles/xcode.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlight/styles/zenburn.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/.bower.json delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/LICENSE delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/Makefile delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/README.md delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/bower.json delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/component.json delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/composer.json delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/highlight.pack.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/highlight.pack.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/package.json delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/agate.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/androidstudio.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/arduino-light.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/arta.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/ascetic.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/atelier-cave-dark.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/atelier-cave-light.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/atelier-cave.dark.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/atelier-cave.light.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/atelier-dune-dark.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/atelier-dune-light.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/atelier-dune.dark.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/atelier-dune.light.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/atelier-estuary-dark.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/atelier-estuary-light.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/atelier-estuary.dark.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/atelier-estuary.light.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/atelier-forest-dark.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/atelier-forest-light.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/atelier-forest.dark.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/atelier-forest.light.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/atelier-heath-dark.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/atelier-heath-light.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/atelier-heath.dark.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/atelier-heath.light.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/atelier-lakeside-dark.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/atelier-lakeside-light.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/atelier-lakeside.dark.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/atelier-lakeside.light.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/atelier-plateau-dark.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/atelier-plateau-light.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/atelier-plateau.dark.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/atelier-plateau.light.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/atelier-savanna-dark.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/atelier-savanna-light.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/atelier-savanna.dark.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/atelier-savanna.light.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/atelier-seaside-dark.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/atelier-seaside-light.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/atelier-seaside.dark.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/atelier-seaside.light.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/atelier-sulphurpool-dark.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/atelier-sulphurpool-light.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/atelier-sulphurpool.dark.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/atelier-sulphurpool.light.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/atom-one-dark.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/atom-one-light.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/brown-paper.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/brown-papersq.png delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/brown_paper.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/brown_papersq.png delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/codepen-embed.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/color-brewer.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/darcula.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/dark.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/darkula.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/default.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/docco.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/dracula.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/far.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/foundation.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/github-gist.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/github.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/googlecode.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/grayscale.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/gruvbox-dark.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/gruvbox-light.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/hopscotch.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/hybrid.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/idea.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/ir-black.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/ir_black.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/kimbie.dark.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/kimbie.light.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/magula.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/mono-blue.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/monokai-sublime.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/monokai.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/monokai_sublime.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/obsidian.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/ocean.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/paraiso-dark.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/paraiso-light.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/paraiso.dark.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/paraiso.light.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/pojoaque.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/pojoaque.jpg delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/purebasic.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/qtcreator_dark.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/qtcreator_light.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/railscasts.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/rainbow.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/routeros.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/school-book.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/school-book.png delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/school_book.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/school_book.png delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/solarized-dark.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/solarized-light.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/solarized_dark.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/solarized_light.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/sunburst.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/tomorrow-night-blue.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/tomorrow-night-bright.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/tomorrow-night-eighties.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/tomorrow-night.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/tomorrow.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/vs.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/vs2015.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/xcode.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/xt256.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/highlightjs/styles/zenburn.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/jquery-toc/jquery.tableofcontents.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/jquery-toc/jquery.tableofcontents.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/jquery-unveil/.bower.json delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/jquery-unveil/README.md delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/jquery-unveil/bower.json delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/jquery-unveil/img/.DS_Store delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/jquery-unveil/img/Jude_Landry_Wallpaper_1280x800.jpg delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/jquery-unveil/img/Jude_Landry_Wallpaper_800x500.jpg delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/jquery-unveil/img/Timothy-J-Reynolds-wallpaper-1280x800.jpg delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/jquery-unveil/img/Timothy-J-Reynolds-wallpaper-800x500.jpg delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/jquery-unveil/img/anti-bullying-tom-froese-wallpaper-1280x800.jpg delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/jquery-unveil/img/anti-bullying-tom-froese-wallpaper-800x500.jpg delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/jquery-unveil/img/brock-davis-wallpaper-1280x800.jpg delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/jquery-unveil/img/brock-davis-wallpaper-800x500.jpg delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/jquery-unveil/img/dark-igloo-wallpaper-1-1280x800.jpg delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/jquery-unveil/img/dark-igloo-wallpaper-1-800x500.jpg delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/jquery-unveil/img/dark-igloo-wallpaper-1280x800.jpg delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/jquery-unveil/img/dark-igloo-wallpaper-800x500.jpg delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/jquery-unveil/img/haik-avanian-wallpaper-1280x800.jpg delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/jquery-unveil/img/haik-avanian-wallpaper-800x500.jpg delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/jquery-unveil/img/iceland-smjor-wallpaper-1280x800.jpg delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/jquery-unveil/img/iceland-smojr-wallpaper-800x500.jpg delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/jquery-unveil/img/james-olstein-wallpaper-1280x800.jpg delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/jquery-unveil/img/james-olstein-wallpaper-800x500.jpg delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/jquery-unveil/img/johanna-basford-wallpaper-800x500.jpg delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/jquery-unveil/img/julieta-felix-wallpaper-1280x800.jpg delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/jquery-unveil/img/julieta-felix-wallpaper-800x500.jpg delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/jquery-unveil/img/loader.gif delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/jquery-unveil/index.html delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/jquery-unveil/jquery-1.9.1.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/jquery-unveil/jquery.unveil.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/jquery-unveil/jquery.unveil.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/mCustomScrollbar/jquery.mCustomScrollbar.min.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/mark.js/.bower.json delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/mark.js/LICENSE delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/mark.js/README.md delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/mark.js/bower.json delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/mark.js/dist/jquery.mark.es6.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/mark.js/dist/jquery.mark.es6.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/mark.js/dist/jquery.mark.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/mark.js/dist/jquery.mark.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/mark.js/dist/mark.es6.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/mark.js/dist/mark.es6.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/mark.js/dist/mark.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/mark.js/dist/mark.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/popper.js/README.md delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/popper.js/dist/esm/popper-utils.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/popper.js/dist/esm/popper-utils.js.map delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/popper.js/dist/esm/popper-utils.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/popper.js/dist/esm/popper-utils.min.js.map delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/popper.js/dist/esm/popper.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/popper.js/dist/esm/popper.js.map delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/popper.js/dist/esm/popper.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/popper.js/dist/esm/popper.min.js.map delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/popper.js/dist/esm/poppper.js.flow delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/popper.js/dist/popper-utils.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/popper.js/dist/popper-utils.js.map delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/popper.js/dist/popper-utils.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/popper.js/dist/popper-utils.min.js.map delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/popper.js/dist/popper.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/popper.js/dist/popper.js.map delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/popper.js/dist/popper.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/popper.js/dist/popper.min.js.map delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/popper.js/dist/umd/popper-utils.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/popper.js/dist/umd/popper-utils.js.map delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/popper.js/dist/umd/popper-utils.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/popper.js/dist/umd/popper-utils.min.js.map delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/popper.js/dist/umd/popper.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/popper.js/dist/umd/popper.js.map delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/popper.js/dist/umd/popper.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/popper.js/dist/umd/popper.min.js.map delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/popper.js/index.d.ts delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/popper.js/index.js.flow delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/popper.js/package.json delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/CHANGELOG.md delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/LICENSE delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/README.md delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components.json delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/index.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-abap.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-abap.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-actionscript.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-actionscript.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-ada.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-ada.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-apacheconf.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-apacheconf.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-apl.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-apl.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-applescript.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-applescript.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-arduino.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-arduino.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-arff.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-arff.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-asciidoc.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-asciidoc.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-asm6502.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-asm6502.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-aspnet.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-aspnet.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-autohotkey.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-autohotkey.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-autoit.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-autoit.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-bash.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-bash.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-basic.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-basic.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-batch.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-batch.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-bison.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-bison.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-brainfuck.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-brainfuck.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-bro.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-bro.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-c.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-c.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-clike.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-clike.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-clojure.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-clojure.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-coffeescript.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-coffeescript.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-core.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-core.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-cpp.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-cpp.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-crystal.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-crystal.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-csharp.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-csp.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-csp.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-css-extras.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-css-extras.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-css.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-css.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-d.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-d.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-dart.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-dart.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-diff.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-diff.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-django.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-django.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-docker.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-docker.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-eiffel.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-eiffel.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-elixir.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-elixir.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-elm.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-elm.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-erb.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-erb.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-erlang.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-erlang.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-flow.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-flow.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-fortran.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-fortran.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-fsharp.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-fsharp.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-gedcom.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-gedcom.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-gherkin.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-gherkin.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-git.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-git.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-glsl.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-glsl.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-go.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-go.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-graphql.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-graphql.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-groovy.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-groovy.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-haml.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-haml.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-handlebars.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-handlebars.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-haskell.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-haskell.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-haxe.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-haxe.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-hpkp.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-hpkp.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-hsts.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-hsts.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-http.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-http.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-ichigojam.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-ichigojam.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-icon.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-icon.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-inform7.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-inform7.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-ini.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-ini.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-io.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-io.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-j.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-j.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-java.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-java.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-javascript.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-javascript.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-jolie.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-jolie.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-json.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-json.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-jsx.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-jsx.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-julia.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-julia.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-keyman.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-keyman.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-kotlin.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-kotlin.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-latex.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-latex.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-less.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-less.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-liquid.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-liquid.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-lisp.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-lisp.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-livescript.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-livescript.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-lolcode.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-lolcode.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-lua.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-lua.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-makefile.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-makefile.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-markdown.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-markdown.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-markup-templating.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-markup-templating.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-markup.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-markup.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-matlab.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-matlab.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-mel.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-mel.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-mizar.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-mizar.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-monkey.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-monkey.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-n4js.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-n4js.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-nasm.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-nasm.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-nginx.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-nginx.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-nim.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-nim.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-nix.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-nix.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-nsis.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-nsis.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-objectivec.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-objectivec.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-ocaml.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-ocaml.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-opencl.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-opencl.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-oz.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-oz.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-parigp.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-parigp.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-parser.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-parser.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-pascal.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-pascal.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-perl.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-perl.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-php-extras.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-php-extras.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-php.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-php.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-plsql.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-plsql.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-powershell.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-powershell.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-processing.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-processing.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-prolog.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-prolog.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-properties.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-properties.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-protobuf.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-protobuf.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-pug.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-pug.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-puppet.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-puppet.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-pure.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-pure.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-python.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-python.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-q.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-q.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-qore.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-qore.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-r.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-r.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-reason.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-reason.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-renpy.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-renpy.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-rest.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-rest.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-rip.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-rip.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-roboconf.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-roboconf.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-ruby.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-ruby.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-rust.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-rust.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-sas.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-sas.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-sass.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-sass.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-scala.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-scala.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-scheme.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-scheme.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-scss.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-scss.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-smalltalk.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-smalltalk.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-smarty.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-smarty.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-soy.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-soy.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-sql.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-sql.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-stylus.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-stylus.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-swift.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-swift.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-tap.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-tap.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-tcl.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-tcl.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-textile.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-textile.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-tsx.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-tsx.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-tt2.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-tt2.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-twig.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-twig.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-typescript.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-typescript.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-vbnet.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-vbnet.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-velocity.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-velocity.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-verilog.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-verilog.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-vhdl.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-vhdl.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-vim.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-vim.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-visual-basic.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-visual-basic.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-wasm.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-wasm.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-wiki.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-wiki.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-xeora.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-xeora.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-xojo.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-xojo.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-xquery.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-xquery.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-yaml.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-yaml.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/package.json delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/plugins/autolinker/prism-autolinker.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/plugins/autolinker/prism-autolinker.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/plugins/autolinker/prism-autolinker.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/plugins/autoloader/prism-autoloader.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/plugins/autoloader/prism-autoloader.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/plugins/command-line/prism-command-line.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/plugins/command-line/prism-command-line.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/plugins/command-line/prism-command-line.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/plugins/copy-to-clipboard/prism-copy-to-clipboard.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/plugins/custom-class/prism-custom-class.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/plugins/custom-class/prism-custom-class.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/plugins/data-uri-highlight/prism-data-uri-highlight.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/plugins/data-uri-highlight/prism-data-uri-highlight.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/plugins/file-highlight/prism-file-highlight.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/plugins/file-highlight/prism-file-highlight.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/plugins/highlight-keywords/prism-highlight-keywords.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/plugins/highlight-keywords/prism-highlight-keywords.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/plugins/jsonp-highlight/prism-jsonp-highlight.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/plugins/jsonp-highlight/prism-jsonp-highlight.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/plugins/keep-markup/prism-keep-markup.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/plugins/keep-markup/prism-keep-markup.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/plugins/line-highlight/prism-line-highlight.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/plugins/line-numbers/prism-line-numbers.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/plugins/line-numbers/prism-line-numbers.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/plugins/line-numbers/prism-line-numbers.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/plugins/normalize-whitespace/prism-normalize-whitespace.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/plugins/normalize-whitespace/prism-normalize-whitespace.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/plugins/previewers/prism-previewers.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/plugins/previewers/prism-previewers.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/plugins/previewers/prism-previewers.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/plugins/remove-initial-line-feed/prism-remove-initial-line-feed.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/plugins/remove-initial-line-feed/prism-remove-initial-line-feed.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/plugins/show-invisibles/prism-show-invisibles.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/plugins/show-invisibles/prism-show-invisibles.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/plugins/show-invisibles/prism-show-invisibles.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/plugins/show-language/prism-show-language.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/plugins/toolbar/prism-toolbar.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/plugins/unescaped-markup/prism-unescaped-markup.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/plugins/unescaped-markup/prism-unescaped-markup.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/plugins/unescaped-markup/prism-unescaped-markup.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/plugins/wpd/prism-wpd.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/plugins/wpd/prism-wpd.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/plugins/wpd/prism-wpd.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/themes/prism-coy.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/themes/prism-dark.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/themes/prism-funky.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/themes/prism-solarizedlight.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/themes/prism-tomorrow.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/themes/prism-twilight.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/themes/prism.css delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/select/.editorconfig delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/select/.npmignore delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/select/.travis.yml delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/select/bower.json delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/select/demo/contenteditable.html delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/select/demo/dropdown.html delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/select/demo/editable.html delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/select/demo/multiple.html delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/select/demo/nested.html delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/select/demo/non-editable.html delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/select/dist/select.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/select/karma.conf.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/select/package.json delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/select/readme.md delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/select/src/select.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/select/test/select.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/tiny-emitter/.npmignore delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/tiny-emitter/LICENSE delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/tiny-emitter/README.md delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/tiny-emitter/dist/tinyemitter.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/tiny-emitter/dist/tinyemitter.min.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/tiny-emitter/index.d.ts delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/tiny-emitter/index.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/tiny-emitter/instance.js delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/tiny-emitter/package.json delete mode 100644 modules/docs/src/Volo.Docs.Web/wwwroot/lib/tiny-emitter/test/index.js diff --git a/modules/docs/app/Volo.DocsTestApp/abp.resourcemapping.js b/modules/docs/app/Volo.DocsTestApp/abp.resourcemapping.js index 77e84daf41..37bc6ca92d 100644 --- a/modules/docs/app/Volo.DocsTestApp/abp.resourcemapping.js +++ b/modules/docs/app/Volo.DocsTestApp/abp.resourcemapping.js @@ -7,6 +7,19 @@ "@libs" ], mappings: { - + "@node_modules/prismjs/plugins/toolbar/prism-toolbar.css": "@libs/prismjs/", + "@node_modules/prismjs/plugins/line-highlight/prism-line-highlight.css": "@libs/prismjs/", + "@node_modules/prismjs/themes/prism-okaidia.css": "@libs/prismjs/", + "@node_modules/prismjs/components/prism-csharp.js": "@libs/prismjs/", + "@node_modules/prismjs/plugins/line-highlight/prism-line-highlight.js": "@libs/prismjs/", + "@node_modules/prismjs/plugins/copy-to-clipboard/prism-copy-to-clipboard.js": "@libs/prismjs/", + "@node_modules/prismjs/plugins/show-language/prism-show-language.js": "@libs/prismjs/", + "@node_modules/prismjs/prism.js": "@libs/prismjs/", + "@node_modules/prismjs/plugins/toolbar/prism-toolbar.js": "@libs/prismjs/", + "@node_modules/malihu-custom-scrollbar-plugin/jquery.mCustomScrollbar.concat.min.js": "@libs/mCustomScrollbar/", + "@node_modules/malihu-custom-scrollbar-plugin/jquery.mCustomScrollbar.css": "@libs/mCustomScrollbar/", + "@node_modules/anchor-js/anchor.js": "@libs/anchor-js/", + "@node_modules/clipboard/dist/clipboard.js": "@libs/clipboard/", + "@node_modules/popper.js/dist/umd/popper.min.js": "@libs/popper.js/" } -} \ No newline at end of file +} diff --git a/modules/docs/app/Volo.DocsTestApp/package.json b/modules/docs/app/Volo.DocsTestApp/package.json index 0e962af8da..2eda74ef1e 100644 --- a/modules/docs/app/Volo.DocsTestApp/package.json +++ b/modules/docs/app/Volo.DocsTestApp/package.json @@ -3,6 +3,12 @@ "name": "volo.docstestapp", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "^0.4.3" + "@abp/aspnetcore.mvc.ui.theme.basic": "^0.4.3", + "@abp/aspnetcore.mvc.ui": "^0.4.3", + "prismjs": "^1.15.0", + "malihu-custom-scrollbar-plugin": "^3.1.5", + "anchor-js": "^4.1.1", + "clipboard": "^2.0.4", + "popper.js": "^1.14.6" } } diff --git a/modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/anchor.js b/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/anchor-js/anchor.js similarity index 99% rename from modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/anchor.js rename to modules/docs/app/Volo.DocsTestApp/wwwroot/libs/anchor-js/anchor.js index 5813b98ed0..38a3b62a66 100644 --- a/modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/anchor.js +++ b/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/anchor-js/anchor.js @@ -220,8 +220,8 @@ * @return {String} - hyphen-delimited text for use in IDs and URLs. */ this.urlify = function(text) { - // Regex for finding the nonsafe URL characters (many need escaping): & +$,:;=?@"#{}|^~[`%!'<>]./()*\ - var nonsafeChars = /[& +$,:;=?@"#{}|^~[`%!'<>\]\.\/\(\)\*\\]/g, + // Regex for finding the nonsafe URL characters (many need escaping): & +$,:;=?@"#{}|^~[`%!'<>]./()*\ (newlines, tabs, backspace, & vertical tabs) + var nonsafeChars = /[& +$,:;=?@"#{}|^~[`%!'<>\]\.\/\(\)\*\\\n\t\b\v]/g, urlText; // The reason we include this _applyRemainingDefaultOptions is so urlify can be called independently, diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/bootstrap-toc/bootstrap-toc.js b/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/bootstrap-toc/bootstrap-toc.js deleted file mode 100644 index 790b25e3dc..0000000000 --- a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/bootstrap-toc/bootstrap-toc.js +++ /dev/null @@ -1,159 +0,0 @@ -/*! - * Bootstrap Table of Contents v1.0.0 (http://afeld.github.io/bootstrap-toc/) - * Copyright 2015 Aidan Feldman - * Licensed under MIT (https://github.com/afeld/bootstrap-toc/blob/gh-pages/LICENSE.md) */ -(function($) { - 'use strict'; - - window.Toc = { - helpers: { - // return all matching elements in the set, or their descendants - findOrFilter: function($el, selector) { - // http://danielnouri.org/notes/2011/03/14/a-jquery-find-that-also-finds-the-root-element/ - // http://stackoverflow.com/a/12731439/358804 - var $descendants = $el.find(selector); - return $el.filter(selector).add($descendants).filter(':not([data-toc-skip])'); - }, - - generateUniqueIdBase: function(el) { - var text = $(el).text(); - var anchor = text.trim().toLowerCase().replace(/[^A-Za-z0-9]+/g, '-'); - return anchor || el.tagName.toLowerCase(); - }, - - generateUniqueId: function(el) { - var anchorBase = this.generateUniqueIdBase(el); - for (var i = 0; ; i++) { - var anchor = anchorBase; - if (i > 0) { - // add suffix - anchor += '-' + i; - } - // check if ID already exists - if (!document.getElementById(anchor)) { - return anchor; - } - } - }, - - generateAnchor: function(el) { - if (el.id) { - return el.id; - } else { - var anchor = this.generateUniqueId(el); - el.id = anchor; - return anchor; - } - }, - - createNavList: function() { - return $(''); - }, - - createChildNavList: function($parent) { - var $childList = this.createNavList(); - $parent.append($childList); - return $childList; - }, - - generateNavEl: function(anchor, text) { - var $a = $(''); - $a.attr('href', '#' + anchor); - $a.text(text); - var $li = $('
  • '); - $li.append($a); - return $li; - }, - - generateNavItem: function(headingEl) { - var anchor = this.generateAnchor(headingEl); - var $heading = $(headingEl); - var text = $heading.data('toc-text') || $heading.text(); - return this.generateNavEl(anchor, text); - }, - - // Find the first heading level (`

    `, then `

    `, etc.) that has more than one element. Defaults to 1 (for `

    `). - getTopLevel: function($scope) { - for (var i = 1; i <= 6; i++) { - var $headings = this.findOrFilter($scope, 'h' + i); - if ($headings.length > 1) { - return i; - } - } - - return 1; - }, - - // returns the elements for the top level, and the next below it - getHeadings: function($scope, topLevel) { - var topSelector = 'h' + topLevel; - - var secondaryLevel = topLevel + 1; - var secondarySelector = 'h' + secondaryLevel; - - return this.findOrFilter($scope, topSelector + ',' + secondarySelector); - }, - - getNavLevel: function(el) { - return parseInt(el.tagName.charAt(1), 10); - }, - - populateNav: function($topContext, topLevel, $headings) { - var $context = $topContext; - var $prevNav; - - var helpers = this; - $headings.each(function(i, el) { - var $newNav = helpers.generateNavItem(el); - var navLevel = helpers.getNavLevel(el); - - // determine the proper $context - if (navLevel === topLevel) { - // use top level - $context = $topContext; - } else if ($prevNav && $context === $topContext) { - // create a new level of the tree and switch to it - $context = helpers.createChildNavList($prevNav); - } // else use the current $context - - $context.append($newNav); - - $prevNav = $newNav; - }); - }, - - parseOps: function(arg) { - var opts; - if (arg.jquery) { - opts = { - $nav: arg - }; - } else { - opts = arg; - } - opts.$scope = opts.$scope || $(document.body); - return opts; - } - }, - - // accepts a jQuery object, or an options object - init: function(opts) { - opts = this.helpers.parseOps(opts); - - // ensure that the data attribute is in place for styling - opts.$nav.attr('data-toggle', 'toc'); - - var $topContext = this.helpers.createChildNavList(opts.$nav); - var topLevel = this.helpers.getTopLevel(opts.$scope); - var $headings = this.helpers.getHeadings(opts.$scope, topLevel); - this.helpers.populateNav($topContext, topLevel, $headings); - } - }; - - $(function() { - $('nav[data-toggle="toc"]').each(function(i, el) { - var $nav = $(el); - Toc.init($nav); - }); - }); -})(jQuery); diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/bootstrap-toc/bootstrap-toc.min.css b/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/bootstrap-toc/bootstrap-toc.min.css deleted file mode 100644 index 7bfd3288b6..0000000000 --- a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/bootstrap-toc/bootstrap-toc.min.css +++ /dev/null @@ -1,4 +0,0 @@ -/*! - * Bootstrap Table of Contents v1.0.0 (http://afeld.github.io/bootstrap-toc/) - * Copyright 2015 Aidan Feldman - * Licensed under MIT (https://github.com/afeld/bootstrap-toc/blob/gh-pages/LICENSE.md) */nav[data-toggle=toc] .nav>li>a{display:block;padding:4px 20px;font-size:13px;font-weight:500;color:#767676}nav[data-toggle=toc] .nav>li>a:focus,nav[data-toggle=toc] .nav>li>a:hover{padding-left:19px;color:#563d7c;text-decoration:none;background-color:transparent;border-left:1px solid #563d7c}nav[data-toggle=toc] .nav-link.active,nav[data-toggle=toc] .nav-link.active:focus,nav[data-toggle=toc] .nav-link.active:hover{padding-left:18px;font-weight:700;color:#563d7c;background-color:transparent;border-left:2px solid #563d7c}nav[data-toggle=toc] .nav-link+ul{display:none;padding-bottom:10px}nav[data-toggle=toc] .nav .nav>li>a{padding-top:1px;padding-bottom:1px;padding-left:30px;font-size:12px;font-weight:400}nav[data-toggle=toc] .nav .nav>li>a:focus,nav[data-toggle=toc] .nav .nav>li>a:hover{padding-left:29px}nav[data-toggle=toc] .nav .nav>li>.active,nav[data-toggle=toc] .nav .nav>li>.active:focus,nav[data-toggle=toc] .nav .nav>li>.active:hover{padding-left:28px;font-weight:500}nav[data-toggle=toc] .nav-link.active+ul{display:block} \ No newline at end of file diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/bootstrap-toc/bootstrap-toc.min.js b/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/bootstrap-toc/bootstrap-toc.min.js deleted file mode 100644 index f72df76668..0000000000 --- a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/bootstrap-toc/bootstrap-toc.min.js +++ /dev/null @@ -1,5 +0,0 @@ -/*! - * Bootstrap Table of Contents v1.0.0 (http://afeld.github.io/bootstrap-toc/) - * Copyright 2015 Aidan Feldman - * Licensed under MIT (https://github.com/afeld/bootstrap-toc/blob/gh-pages/LICENSE.md) */ -!function(e){"use strict";window.Toc={helpers:{findOrFilter:function(e,t){var n=e.find(t);return e.filter(t).add(n).filter(":not([data-toc-skip])")},generateUniqueIdBase:function(t){var n=e(t).text(),r=n.trim().toLowerCase().replace(/[^A-Za-z0-9]+/g,"-");return r||t.tagName.toLowerCase()},generateUniqueId:function(e){for(var t=this.generateUniqueIdBase(e),n=0;;n++){var r=t;if(n>0&&(r+="-"+n),!document.getElementById(r))return r}},generateAnchor:function(e){if(e.id)return e.id;var t=this.generateUniqueId(e);return e.id=t,t},createNavList:function(){return e('')},createChildNavList:function(e){var t=this.createNavList();return e.append(t),t},generateNavEl:function(t,n){var r=e('');r.attr("href","#"+t),r.text(n);var a=e("
  • ");return a.append(r),a},generateNavItem:function(t){var n=this.generateAnchor(t),r=e(t),a=r.data("toc-text")||r.text();return this.generateNavEl(n,a)},getTopLevel:function(e){for(var t=1;t<=6;t++){var n=this.findOrFilter(e,"h"+t);if(n.length>1)return t}return 1},getHeadings:function(e,t){var n="h"+t,r=t+1,a="h"+r;return this.findOrFilter(e,n+","+a)},getNavLevel:function(e){return parseInt(e.tagName.charAt(1),10)},populateNav:function(e,t,n){var r,a=e,i=this;n.each(function(n,o){var s=i.generateNavItem(o),u=i.getNavLevel(o);u===t?a=e:r&&a===e&&(a=i.createChildNavList(r)),a.append(s),r=s})},parseOps:function(t){var n;return n=t.jquery?{$nav:t}:t,n.$scope=n.$scope||e(document.body),n}},init:function(e){e=this.helpers.parseOps(e),e.$nav.attr("data-toggle","toc");var t=this.helpers.createChildNavList(e.$nav),n=this.helpers.getTopLevel(e.$scope),r=this.helpers.getHeadings(e.$scope,n);this.helpers.populateNav(t,n,r)}},e(function(){e('nav[data-toggle="toc"]').each(function(t,n){var r=e(n);Toc.init(r)})})}(jQuery); \ No newline at end of file diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/clipboard/clipboard.js b/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/clipboard/clipboard.js new file mode 100644 index 0000000000..14cb08654f --- /dev/null +++ b/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/clipboard/clipboard.js @@ -0,0 +1,978 @@ +/*! + * clipboard.js v2.0.4 + * https://zenorocha.github.io/clipboard.js + * + * Licensed MIT © Zeno Rocha + */ +(function webpackUniversalModuleDefinition(root, factory) { + if(typeof exports === 'object' && typeof module === 'object') + module.exports = factory(); + else if(typeof define === 'function' && define.amd) + define([], factory); + else if(typeof exports === 'object') + exports["ClipboardJS"] = factory(); + else + root["ClipboardJS"] = factory(); +})(this, function() { +return /******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) { +/******/ return installedModules[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ i: moduleId, +/******/ l: false, +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.l = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // define getter function for harmony exports +/******/ __webpack_require__.d = function(exports, name, getter) { +/******/ if(!__webpack_require__.o(exports, name)) { +/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); +/******/ } +/******/ }; +/******/ +/******/ // define __esModule on exports +/******/ __webpack_require__.r = function(exports) { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ +/******/ // create a fake namespace object +/******/ // mode & 1: value is a module id, require it +/******/ // mode & 2: merge all properties of value into the ns +/******/ // mode & 4: return value when already ns object +/******/ // mode & 8|1: behave like require +/******/ __webpack_require__.t = function(value, mode) { +/******/ if(mode & 1) value = __webpack_require__(value); +/******/ if(mode & 8) return value; +/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; +/******/ var ns = Object.create(null); +/******/ __webpack_require__.r(ns); +/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); +/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); +/******/ return ns; +/******/ }; +/******/ +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function getDefault() { return module['default']; } : +/******/ function getModuleExports() { return module; }; +/******/ __webpack_require__.d(getter, 'a', getter); +/******/ return getter; +/******/ }; +/******/ +/******/ // Object.prototype.hasOwnProperty.call +/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; +/******/ +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(__webpack_require__.s = 0); +/******/ }) +/************************************************************************/ +/******/ ([ +/* 0 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _clipboardAction = __webpack_require__(1); + +var _clipboardAction2 = _interopRequireDefault(_clipboardAction); + +var _tinyEmitter = __webpack_require__(3); + +var _tinyEmitter2 = _interopRequireDefault(_tinyEmitter); + +var _goodListener = __webpack_require__(4); + +var _goodListener2 = _interopRequireDefault(_goodListener); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +/** + * Base class which takes one or more elements, adds event listeners to them, + * and instantiates a new `ClipboardAction` on each click. + */ +var Clipboard = function (_Emitter) { + _inherits(Clipboard, _Emitter); + + /** + * @param {String|HTMLElement|HTMLCollection|NodeList} trigger + * @param {Object} options + */ + function Clipboard(trigger, options) { + _classCallCheck(this, Clipboard); + + var _this = _possibleConstructorReturn(this, (Clipboard.__proto__ || Object.getPrototypeOf(Clipboard)).call(this)); + + _this.resolveOptions(options); + _this.listenClick(trigger); + return _this; + } + + /** + * Defines if attributes would be resolved using internal setter functions + * or custom functions that were passed in the constructor. + * @param {Object} options + */ + + + _createClass(Clipboard, [{ + key: 'resolveOptions', + value: function resolveOptions() { + var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + this.action = typeof options.action === 'function' ? options.action : this.defaultAction; + this.target = typeof options.target === 'function' ? options.target : this.defaultTarget; + this.text = typeof options.text === 'function' ? options.text : this.defaultText; + this.container = _typeof(options.container) === 'object' ? options.container : document.body; + } + + /** + * Adds a click event listener to the passed trigger. + * @param {String|HTMLElement|HTMLCollection|NodeList} trigger + */ + + }, { + key: 'listenClick', + value: function listenClick(trigger) { + var _this2 = this; + + this.listener = (0, _goodListener2.default)(trigger, 'click', function (e) { + return _this2.onClick(e); + }); + } + + /** + * Defines a new `ClipboardAction` on each click event. + * @param {Event} e + */ + + }, { + key: 'onClick', + value: function onClick(e) { + var trigger = e.delegateTarget || e.currentTarget; + + if (this.clipboardAction) { + this.clipboardAction = null; + } + + this.clipboardAction = new _clipboardAction2.default({ + action: this.action(trigger), + target: this.target(trigger), + text: this.text(trigger), + container: this.container, + trigger: trigger, + emitter: this + }); + } + + /** + * Default `action` lookup function. + * @param {Element} trigger + */ + + }, { + key: 'defaultAction', + value: function defaultAction(trigger) { + return getAttributeValue('action', trigger); + } + + /** + * Default `target` lookup function. + * @param {Element} trigger + */ + + }, { + key: 'defaultTarget', + value: function defaultTarget(trigger) { + var selector = getAttributeValue('target', trigger); + + if (selector) { + return document.querySelector(selector); + } + } + + /** + * Returns the support of the given action, or all actions if no action is + * given. + * @param {String} [action] + */ + + }, { + key: 'defaultText', + + + /** + * Default `text` lookup function. + * @param {Element} trigger + */ + value: function defaultText(trigger) { + return getAttributeValue('text', trigger); + } + + /** + * Destroy lifecycle. + */ + + }, { + key: 'destroy', + value: function destroy() { + this.listener.destroy(); + + if (this.clipboardAction) { + this.clipboardAction.destroy(); + this.clipboardAction = null; + } + } + }], [{ + key: 'isSupported', + value: function isSupported() { + var action = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ['copy', 'cut']; + + var actions = typeof action === 'string' ? [action] : action; + var support = !!document.queryCommandSupported; + + actions.forEach(function (action) { + support = support && !!document.queryCommandSupported(action); + }); + + return support; + } + }]); + + return Clipboard; +}(_tinyEmitter2.default); + +/** + * Helper function to retrieve attribute value. + * @param {String} suffix + * @param {Element} element + */ + + +function getAttributeValue(suffix, element) { + var attribute = 'data-clipboard-' + suffix; + + if (!element.hasAttribute(attribute)) { + return; + } + + return element.getAttribute(attribute); +} + +module.exports = Clipboard; + +/***/ }), +/* 1 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _select = __webpack_require__(2); + +var _select2 = _interopRequireDefault(_select); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +/** + * Inner class which performs selection from either `text` or `target` + * properties and then executes copy or cut operations. + */ +var ClipboardAction = function () { + /** + * @param {Object} options + */ + function ClipboardAction(options) { + _classCallCheck(this, ClipboardAction); + + this.resolveOptions(options); + this.initSelection(); + } + + /** + * Defines base properties passed from constructor. + * @param {Object} options + */ + + + _createClass(ClipboardAction, [{ + key: 'resolveOptions', + value: function resolveOptions() { + var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + this.action = options.action; + this.container = options.container; + this.emitter = options.emitter; + this.target = options.target; + this.text = options.text; + this.trigger = options.trigger; + + this.selectedText = ''; + } + + /** + * Decides which selection strategy is going to be applied based + * on the existence of `text` and `target` properties. + */ + + }, { + key: 'initSelection', + value: function initSelection() { + if (this.text) { + this.selectFake(); + } else if (this.target) { + this.selectTarget(); + } + } + + /** + * Creates a fake textarea element, sets its value from `text` property, + * and makes a selection on it. + */ + + }, { + key: 'selectFake', + value: function selectFake() { + var _this = this; + + var isRTL = document.documentElement.getAttribute('dir') == 'rtl'; + + this.removeFake(); + + this.fakeHandlerCallback = function () { + return _this.removeFake(); + }; + this.fakeHandler = this.container.addEventListener('click', this.fakeHandlerCallback) || true; + + this.fakeElem = document.createElement('textarea'); + // Prevent zooming on iOS + this.fakeElem.style.fontSize = '12pt'; + // Reset box model + this.fakeElem.style.border = '0'; + this.fakeElem.style.padding = '0'; + this.fakeElem.style.margin = '0'; + // Move element out of screen horizontally + this.fakeElem.style.position = 'absolute'; + this.fakeElem.style[isRTL ? 'right' : 'left'] = '-9999px'; + // Move element to the same position vertically + var yPosition = window.pageYOffset || document.documentElement.scrollTop; + this.fakeElem.style.top = yPosition + 'px'; + + this.fakeElem.setAttribute('readonly', ''); + this.fakeElem.value = this.text; + + this.container.appendChild(this.fakeElem); + + this.selectedText = (0, _select2.default)(this.fakeElem); + this.copyText(); + } + + /** + * Only removes the fake element after another click event, that way + * a user can hit `Ctrl+C` to copy because selection still exists. + */ + + }, { + key: 'removeFake', + value: function removeFake() { + if (this.fakeHandler) { + this.container.removeEventListener('click', this.fakeHandlerCallback); + this.fakeHandler = null; + this.fakeHandlerCallback = null; + } + + if (this.fakeElem) { + this.container.removeChild(this.fakeElem); + this.fakeElem = null; + } + } + + /** + * Selects the content from element passed on `target` property. + */ + + }, { + key: 'selectTarget', + value: function selectTarget() { + this.selectedText = (0, _select2.default)(this.target); + this.copyText(); + } + + /** + * Executes the copy operation based on the current selection. + */ + + }, { + key: 'copyText', + value: function copyText() { + var succeeded = void 0; + + try { + succeeded = document.execCommand(this.action); + } catch (err) { + succeeded = false; + } + + this.handleResult(succeeded); + } + + /** + * Fires an event based on the copy operation result. + * @param {Boolean} succeeded + */ + + }, { + key: 'handleResult', + value: function handleResult(succeeded) { + this.emitter.emit(succeeded ? 'success' : 'error', { + action: this.action, + text: this.selectedText, + trigger: this.trigger, + clearSelection: this.clearSelection.bind(this) + }); + } + + /** + * Moves focus away from `target` and back to the trigger, removes current selection. + */ + + }, { + key: 'clearSelection', + value: function clearSelection() { + if (this.trigger) { + this.trigger.focus(); + } + + window.getSelection().removeAllRanges(); + } + + /** + * Sets the `action` to be performed which can be either 'copy' or 'cut'. + * @param {String} action + */ + + }, { + key: 'destroy', + + + /** + * Destroy lifecycle. + */ + value: function destroy() { + this.removeFake(); + } + }, { + key: 'action', + set: function set() { + var action = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'copy'; + + this._action = action; + + if (this._action !== 'copy' && this._action !== 'cut') { + throw new Error('Invalid "action" value, use either "copy" or "cut"'); + } + } + + /** + * Gets the `action` property. + * @return {String} + */ + , + get: function get() { + return this._action; + } + + /** + * Sets the `target` property using an element + * that will be have its content copied. + * @param {Element} target + */ + + }, { + key: 'target', + set: function set(target) { + if (target !== undefined) { + if (target && (typeof target === 'undefined' ? 'undefined' : _typeof(target)) === 'object' && target.nodeType === 1) { + if (this.action === 'copy' && target.hasAttribute('disabled')) { + throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute'); + } + + if (this.action === 'cut' && (target.hasAttribute('readonly') || target.hasAttribute('disabled'))) { + throw new Error('Invalid "target" attribute. You can\'t cut text from elements with "readonly" or "disabled" attributes'); + } + + this._target = target; + } else { + throw new Error('Invalid "target" value, use a valid Element'); + } + } + } + + /** + * Gets the `target` property. + * @return {String|HTMLElement} + */ + , + get: function get() { + return this._target; + } + }]); + + return ClipboardAction; +}(); + +module.exports = ClipboardAction; + +/***/ }), +/* 2 */ +/***/ (function(module, exports) { + +function select(element) { + var selectedText; + + if (element.nodeName === 'SELECT') { + element.focus(); + + selectedText = element.value; + } + else if (element.nodeName === 'INPUT' || element.nodeName === 'TEXTAREA') { + var isReadOnly = element.hasAttribute('readonly'); + + if (!isReadOnly) { + element.setAttribute('readonly', ''); + } + + element.select(); + element.setSelectionRange(0, element.value.length); + + if (!isReadOnly) { + element.removeAttribute('readonly'); + } + + selectedText = element.value; + } + else { + if (element.hasAttribute('contenteditable')) { + element.focus(); + } + + var selection = window.getSelection(); + var range = document.createRange(); + + range.selectNodeContents(element); + selection.removeAllRanges(); + selection.addRange(range); + + selectedText = selection.toString(); + } + + return selectedText; +} + +module.exports = select; + + +/***/ }), +/* 3 */ +/***/ (function(module, exports) { + +function E () { + // Keep this empty so it's easier to inherit from + // (via https://github.com/lipsmack from https://github.com/scottcorgan/tiny-emitter/issues/3) +} + +E.prototype = { + on: function (name, callback, ctx) { + var e = this.e || (this.e = {}); + + (e[name] || (e[name] = [])).push({ + fn: callback, + ctx: ctx + }); + + return this; + }, + + once: function (name, callback, ctx) { + var self = this; + function listener () { + self.off(name, listener); + callback.apply(ctx, arguments); + }; + + listener._ = callback + return this.on(name, listener, ctx); + }, + + emit: function (name) { + var data = [].slice.call(arguments, 1); + var evtArr = ((this.e || (this.e = {}))[name] || []).slice(); + var i = 0; + var len = evtArr.length; + + for (i; i < len; i++) { + evtArr[i].fn.apply(evtArr[i].ctx, data); + } + + return this; + }, + + off: function (name, callback) { + var e = this.e || (this.e = {}); + var evts = e[name]; + var liveEvents = []; + + if (evts && callback) { + for (var i = 0, len = evts.length; i < len; i++) { + if (evts[i].fn !== callback && evts[i].fn._ !== callback) + liveEvents.push(evts[i]); + } + } + + // Remove event from queue to prevent memory leak + // Suggested by https://github.com/lazd + // Ref: https://github.com/scottcorgan/tiny-emitter/commit/c6ebfaa9bc973b33d110a84a307742b7cf94c953#commitcomment-5024910 + + (liveEvents.length) + ? e[name] = liveEvents + : delete e[name]; + + return this; + } +}; + +module.exports = E; + + +/***/ }), +/* 4 */ +/***/ (function(module, exports, __webpack_require__) { + +var is = __webpack_require__(5); +var delegate = __webpack_require__(6); + +/** + * Validates all params and calls the right + * listener function based on its target type. + * + * @param {String|HTMLElement|HTMLCollection|NodeList} target + * @param {String} type + * @param {Function} callback + * @return {Object} + */ +function listen(target, type, callback) { + if (!target && !type && !callback) { + throw new Error('Missing required arguments'); + } + + if (!is.string(type)) { + throw new TypeError('Second argument must be a String'); + } + + if (!is.fn(callback)) { + throw new TypeError('Third argument must be a Function'); + } + + if (is.node(target)) { + return listenNode(target, type, callback); + } + else if (is.nodeList(target)) { + return listenNodeList(target, type, callback); + } + else if (is.string(target)) { + return listenSelector(target, type, callback); + } + else { + throw new TypeError('First argument must be a String, HTMLElement, HTMLCollection, or NodeList'); + } +} + +/** + * Adds an event listener to a HTML element + * and returns a remove listener function. + * + * @param {HTMLElement} node + * @param {String} type + * @param {Function} callback + * @return {Object} + */ +function listenNode(node, type, callback) { + node.addEventListener(type, callback); + + return { + destroy: function() { + node.removeEventListener(type, callback); + } + } +} + +/** + * Add an event listener to a list of HTML elements + * and returns a remove listener function. + * + * @param {NodeList|HTMLCollection} nodeList + * @param {String} type + * @param {Function} callback + * @return {Object} + */ +function listenNodeList(nodeList, type, callback) { + Array.prototype.forEach.call(nodeList, function(node) { + node.addEventListener(type, callback); + }); + + return { + destroy: function() { + Array.prototype.forEach.call(nodeList, function(node) { + node.removeEventListener(type, callback); + }); + } + } +} + +/** + * Add an event listener to a selector + * and returns a remove listener function. + * + * @param {String} selector + * @param {String} type + * @param {Function} callback + * @return {Object} + */ +function listenSelector(selector, type, callback) { + return delegate(document.body, selector, type, callback); +} + +module.exports = listen; + + +/***/ }), +/* 5 */ +/***/ (function(module, exports) { + +/** + * Check if argument is a HTML element. + * + * @param {Object} value + * @return {Boolean} + */ +exports.node = function(value) { + return value !== undefined + && value instanceof HTMLElement + && value.nodeType === 1; +}; + +/** + * Check if argument is a list of HTML elements. + * + * @param {Object} value + * @return {Boolean} + */ +exports.nodeList = function(value) { + var type = Object.prototype.toString.call(value); + + return value !== undefined + && (type === '[object NodeList]' || type === '[object HTMLCollection]') + && ('length' in value) + && (value.length === 0 || exports.node(value[0])); +}; + +/** + * Check if argument is a string. + * + * @param {Object} value + * @return {Boolean} + */ +exports.string = function(value) { + return typeof value === 'string' + || value instanceof String; +}; + +/** + * Check if argument is a function. + * + * @param {Object} value + * @return {Boolean} + */ +exports.fn = function(value) { + var type = Object.prototype.toString.call(value); + + return type === '[object Function]'; +}; + + +/***/ }), +/* 6 */ +/***/ (function(module, exports, __webpack_require__) { + +var closest = __webpack_require__(7); + +/** + * Delegates event to a selector. + * + * @param {Element} element + * @param {String} selector + * @param {String} type + * @param {Function} callback + * @param {Boolean} useCapture + * @return {Object} + */ +function _delegate(element, selector, type, callback, useCapture) { + var listenerFn = listener.apply(this, arguments); + + element.addEventListener(type, listenerFn, useCapture); + + return { + destroy: function() { + element.removeEventListener(type, listenerFn, useCapture); + } + } +} + +/** + * Delegates event to a selector. + * + * @param {Element|String|Array} [elements] + * @param {String} selector + * @param {String} type + * @param {Function} callback + * @param {Boolean} useCapture + * @return {Object} + */ +function delegate(elements, selector, type, callback, useCapture) { + // Handle the regular Element usage + if (typeof elements.addEventListener === 'function') { + return _delegate.apply(null, arguments); + } + + // Handle Element-less usage, it defaults to global delegation + if (typeof type === 'function') { + // Use `document` as the first parameter, then apply arguments + // This is a short way to .unshift `arguments` without running into deoptimizations + return _delegate.bind(null, document).apply(null, arguments); + } + + // Handle Selector-based usage + if (typeof elements === 'string') { + elements = document.querySelectorAll(elements); + } + + // Handle Array-like based usage + return Array.prototype.map.call(elements, function (element) { + return _delegate(element, selector, type, callback, useCapture); + }); +} + +/** + * Finds closest match and invokes callback. + * + * @param {Element} element + * @param {String} selector + * @param {String} type + * @param {Function} callback + * @return {Function} + */ +function listener(element, selector, type, callback) { + return function(e) { + e.delegateTarget = closest(e.target, selector); + + if (e.delegateTarget) { + callback.call(element, e); + } + } +} + +module.exports = delegate; + + +/***/ }), +/* 7 */ +/***/ (function(module, exports) { + +var DOCUMENT_NODE_TYPE = 9; + +/** + * A polyfill for Element.matches() + */ +if (typeof Element !== 'undefined' && !Element.prototype.matches) { + var proto = Element.prototype; + + proto.matches = proto.matchesSelector || + proto.mozMatchesSelector || + proto.msMatchesSelector || + proto.oMatchesSelector || + proto.webkitMatchesSelector; +} + +/** + * Finds the closest parent that matches a selector. + * + * @param {Element} element + * @param {String} selector + * @return {Function} + */ +function closest (element, selector) { + while (element && element.nodeType !== DOCUMENT_NODE_TYPE) { + if (typeof element.matches === 'function' && + element.matches(selector)) { + return element; + } + element = element.parentNode; + } +} + +module.exports = closest; + + +/***/ }) +/******/ ]); +}); \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Web/wwwroot/lib/mCustomScrollbar/jquery.mCustomScrollbar.concat.min.js b/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/mCustomScrollbar/jquery.mCustomScrollbar.concat.min.js similarity index 100% rename from modules/docs/src/Volo.Docs.Web/wwwroot/lib/mCustomScrollbar/jquery.mCustomScrollbar.concat.min.js rename to modules/docs/app/Volo.DocsTestApp/wwwroot/libs/mCustomScrollbar/jquery.mCustomScrollbar.concat.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/mCustomScrollbar/jquery.mCustomScrollbar.css b/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/mCustomScrollbar/jquery.mCustomScrollbar.css new file mode 100644 index 0000000000..45152c1bec --- /dev/null +++ b/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/mCustomScrollbar/jquery.mCustomScrollbar.css @@ -0,0 +1,1267 @@ +/* +== malihu jquery custom scrollbar plugin == +Plugin URI: http://manos.malihu.gr/jquery-custom-content-scroller +*/ + + + +/* +CONTENTS: + 1. BASIC STYLE - Plugin's basic/essential CSS properties (normally, should not be edited). + 2. VERTICAL SCROLLBAR - Positioning and dimensions of vertical scrollbar. + 3. HORIZONTAL SCROLLBAR - Positioning and dimensions of horizontal scrollbar. + 4. VERTICAL AND HORIZONTAL SCROLLBARS - Positioning and dimensions of 2-axis scrollbars. + 5. TRANSITIONS - CSS3 transitions for hover events, auto-expanded and auto-hidden scrollbars. + 6. SCROLLBAR COLORS, OPACITY AND BACKGROUNDS + 6.1 THEMES - Scrollbar colors, opacity, dimensions, backgrounds etc. via ready-to-use themes. +*/ + + + +/* +------------------------------------------------------------------------------------------------------------------------ +1. BASIC STYLE +------------------------------------------------------------------------------------------------------------------------ +*/ + + .mCustomScrollbar{ -ms-touch-action: pinch-zoom; touch-action: pinch-zoom; /* direct pointer events to js */ } + .mCustomScrollbar.mCS_no_scrollbar, .mCustomScrollbar.mCS_touch_action{ -ms-touch-action: auto; touch-action: auto; } + + .mCustomScrollBox{ /* contains plugin's markup */ + position: relative; + overflow: hidden; + height: 100%; + max-width: 100%; + outline: none; + direction: ltr; + } + + .mCSB_container{ /* contains the original content */ + overflow: hidden; + width: auto; + height: auto; + } + + + +/* +------------------------------------------------------------------------------------------------------------------------ +2. VERTICAL SCROLLBAR +y-axis +------------------------------------------------------------------------------------------------------------------------ +*/ + + .mCSB_inside > .mCSB_container{ margin-right: 30px; } + + .mCSB_container.mCS_no_scrollbar_y.mCS_y_hidden{ margin-right: 0; } /* non-visible scrollbar */ + + .mCS-dir-rtl > .mCSB_inside > .mCSB_container{ /* RTL direction/left-side scrollbar */ + margin-right: 0; + margin-left: 30px; + } + + .mCS-dir-rtl > .mCSB_inside > .mCSB_container.mCS_no_scrollbar_y.mCS_y_hidden{ margin-left: 0; } /* RTL direction/left-side scrollbar */ + + .mCSB_scrollTools{ /* contains scrollbar markup (draggable element, dragger rail, buttons etc.) */ + position: absolute; + width: 16px; + height: auto; + left: auto; + top: 0; + right: 0; + bottom: 0; + } + + .mCSB_outside + .mCSB_scrollTools{ right: -26px; } /* scrollbar position: outside */ + + .mCS-dir-rtl > .mCSB_inside > .mCSB_scrollTools, + .mCS-dir-rtl > .mCSB_outside + .mCSB_scrollTools{ /* RTL direction/left-side scrollbar */ + right: auto; + left: 0; + } + + .mCS-dir-rtl > .mCSB_outside + .mCSB_scrollTools{ left: -26px; } /* RTL direction/left-side scrollbar (scrollbar position: outside) */ + + .mCSB_scrollTools .mCSB_draggerContainer{ /* contains the draggable element and dragger rail markup */ + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + height: auto; + } + + .mCSB_scrollTools a + .mCSB_draggerContainer{ margin: 20px 0; } + + .mCSB_scrollTools .mCSB_draggerRail{ + width: 2px; + height: 100%; + margin: 0 auto; + -webkit-border-radius: 16px; -moz-border-radius: 16px; border-radius: 16px; + } + + .mCSB_scrollTools .mCSB_dragger{ /* the draggable element */ + cursor: pointer; + width: 100%; + height: 30px; /* minimum dragger height */ + z-index: 1; + } + + .mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{ /* the dragger element */ + position: relative; + width: 4px; + height: 100%; + margin: 0 auto; + -webkit-border-radius: 16px; -moz-border-radius: 16px; border-radius: 16px; + text-align: center; + } + + .mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar, + .mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar{ width: 12px; /* auto-expanded scrollbar */ } + + .mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded + .mCSB_draggerRail, + .mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{ width: 8px; /* auto-expanded scrollbar */ } + + .mCSB_scrollTools .mCSB_buttonUp, + .mCSB_scrollTools .mCSB_buttonDown{ + display: block; + position: absolute; + height: 20px; + width: 100%; + overflow: hidden; + margin: 0 auto; + cursor: pointer; + } + + .mCSB_scrollTools .mCSB_buttonDown{ bottom: 0; } + + + +/* +------------------------------------------------------------------------------------------------------------------------ +3. HORIZONTAL SCROLLBAR +x-axis +------------------------------------------------------------------------------------------------------------------------ +*/ + + .mCSB_horizontal.mCSB_inside > .mCSB_container{ + margin-right: 0; + margin-bottom: 30px; + } + + .mCSB_horizontal.mCSB_outside > .mCSB_container{ min-height: 100%; } + + .mCSB_horizontal > .mCSB_container.mCS_no_scrollbar_x.mCS_x_hidden{ margin-bottom: 0; } /* non-visible scrollbar */ + + .mCSB_scrollTools.mCSB_scrollTools_horizontal{ + width: auto; + height: 16px; + top: auto; + right: 0; + bottom: 0; + left: 0; + } + + .mCustomScrollBox + .mCSB_scrollTools.mCSB_scrollTools_horizontal, + .mCustomScrollBox + .mCSB_scrollTools + .mCSB_scrollTools.mCSB_scrollTools_horizontal{ bottom: -26px; } /* scrollbar position: outside */ + + .mCSB_scrollTools.mCSB_scrollTools_horizontal a + .mCSB_draggerContainer{ margin: 0 20px; } + + .mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_draggerRail{ + width: 100%; + height: 2px; + margin: 7px 0; + } + + .mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_dragger{ + width: 30px; /* minimum dragger width */ + height: 100%; + left: 0; + } + + .mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{ + width: 100%; + height: 4px; + margin: 6px auto; + } + + .mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar, + .mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar{ + height: 12px; /* auto-expanded scrollbar */ + margin: 2px auto; + } + + .mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded + .mCSB_draggerRail, + .mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{ + height: 8px; /* auto-expanded scrollbar */ + margin: 4px 0; + } + + .mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_buttonLeft, + .mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_buttonRight{ + display: block; + position: absolute; + width: 20px; + height: 100%; + overflow: hidden; + margin: 0 auto; + cursor: pointer; + } + + .mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_buttonLeft{ left: 0; } + + .mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_buttonRight{ right: 0; } + + + +/* +------------------------------------------------------------------------------------------------------------------------ +4. VERTICAL AND HORIZONTAL SCROLLBARS +yx-axis +------------------------------------------------------------------------------------------------------------------------ +*/ + + .mCSB_container_wrapper{ + position: absolute; + height: auto; + width: auto; + overflow: hidden; + top: 0; + left: 0; + right: 0; + bottom: 0; + margin-right: 30px; + margin-bottom: 30px; + } + + .mCSB_container_wrapper > .mCSB_container{ + padding-right: 30px; + padding-bottom: 30px; + -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; + } + + .mCSB_vertical_horizontal > .mCSB_scrollTools.mCSB_scrollTools_vertical{ bottom: 20px; } + + .mCSB_vertical_horizontal > .mCSB_scrollTools.mCSB_scrollTools_horizontal{ right: 20px; } + + /* non-visible horizontal scrollbar */ + .mCSB_container_wrapper.mCS_no_scrollbar_x.mCS_x_hidden + .mCSB_scrollTools.mCSB_scrollTools_vertical{ bottom: 0; } + + /* non-visible vertical scrollbar/RTL direction/left-side scrollbar */ + .mCSB_container_wrapper.mCS_no_scrollbar_y.mCS_y_hidden + .mCSB_scrollTools ~ .mCSB_scrollTools.mCSB_scrollTools_horizontal, + .mCS-dir-rtl > .mCustomScrollBox.mCSB_vertical_horizontal.mCSB_inside > .mCSB_scrollTools.mCSB_scrollTools_horizontal{ right: 0; } + + /* RTL direction/left-side scrollbar */ + .mCS-dir-rtl > .mCustomScrollBox.mCSB_vertical_horizontal.mCSB_inside > .mCSB_scrollTools.mCSB_scrollTools_horizontal{ left: 20px; } + + /* non-visible scrollbar/RTL direction/left-side scrollbar */ + .mCS-dir-rtl > .mCustomScrollBox.mCSB_vertical_horizontal.mCSB_inside > .mCSB_container_wrapper.mCS_no_scrollbar_y.mCS_y_hidden + .mCSB_scrollTools ~ .mCSB_scrollTools.mCSB_scrollTools_horizontal{ left: 0; } + + .mCS-dir-rtl > .mCSB_inside > .mCSB_container_wrapper{ /* RTL direction/left-side scrollbar */ + margin-right: 0; + margin-left: 30px; + } + + .mCSB_container_wrapper.mCS_no_scrollbar_y.mCS_y_hidden > .mCSB_container{ padding-right: 0; } + + .mCSB_container_wrapper.mCS_no_scrollbar_x.mCS_x_hidden > .mCSB_container{ padding-bottom: 0; } + + .mCustomScrollBox.mCSB_vertical_horizontal.mCSB_inside > .mCSB_container_wrapper.mCS_no_scrollbar_y.mCS_y_hidden{ + margin-right: 0; /* non-visible scrollbar */ + margin-left: 0; + } + + /* non-visible horizontal scrollbar */ + .mCustomScrollBox.mCSB_vertical_horizontal.mCSB_inside > .mCSB_container_wrapper.mCS_no_scrollbar_x.mCS_x_hidden{ margin-bottom: 0; } + + + +/* +------------------------------------------------------------------------------------------------------------------------ +5. TRANSITIONS +------------------------------------------------------------------------------------------------------------------------ +*/ + + .mCSB_scrollTools, + .mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar, + .mCSB_scrollTools .mCSB_buttonUp, + .mCSB_scrollTools .mCSB_buttonDown, + .mCSB_scrollTools .mCSB_buttonLeft, + .mCSB_scrollTools .mCSB_buttonRight{ + -webkit-transition: opacity .2s ease-in-out, background-color .2s ease-in-out; + -moz-transition: opacity .2s ease-in-out, background-color .2s ease-in-out; + -o-transition: opacity .2s ease-in-out, background-color .2s ease-in-out; + transition: opacity .2s ease-in-out, background-color .2s ease-in-out; + } + + .mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger_bar, /* auto-expanded scrollbar */ + .mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerRail, + .mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger_bar, + .mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerRail{ + -webkit-transition: width .2s ease-out .2s, height .2s ease-out .2s, + margin-left .2s ease-out .2s, margin-right .2s ease-out .2s, + margin-top .2s ease-out .2s, margin-bottom .2s ease-out .2s, + opacity .2s ease-in-out, background-color .2s ease-in-out; + -moz-transition: width .2s ease-out .2s, height .2s ease-out .2s, + margin-left .2s ease-out .2s, margin-right .2s ease-out .2s, + margin-top .2s ease-out .2s, margin-bottom .2s ease-out .2s, + opacity .2s ease-in-out, background-color .2s ease-in-out; + -o-transition: width .2s ease-out .2s, height .2s ease-out .2s, + margin-left .2s ease-out .2s, margin-right .2s ease-out .2s, + margin-top .2s ease-out .2s, margin-bottom .2s ease-out .2s, + opacity .2s ease-in-out, background-color .2s ease-in-out; + transition: width .2s ease-out .2s, height .2s ease-out .2s, + margin-left .2s ease-out .2s, margin-right .2s ease-out .2s, + margin-top .2s ease-out .2s, margin-bottom .2s ease-out .2s, + opacity .2s ease-in-out, background-color .2s ease-in-out; + } + + + +/* +------------------------------------------------------------------------------------------------------------------------ +6. SCROLLBAR COLORS, OPACITY AND BACKGROUNDS +------------------------------------------------------------------------------------------------------------------------ +*/ + + /* + ---------------------------------------- + 6.1 THEMES + ---------------------------------------- + */ + + /* default theme ("light") */ + + .mCSB_scrollTools{ opacity: 0.75; filter: "alpha(opacity=75)"; -ms-filter: "alpha(opacity=75)"; } + + .mCS-autoHide > .mCustomScrollBox > .mCSB_scrollTools, + .mCS-autoHide > .mCustomScrollBox ~ .mCSB_scrollTools{ opacity: 0; filter: "alpha(opacity=0)"; -ms-filter: "alpha(opacity=0)"; } + + .mCustomScrollbar > .mCustomScrollBox > .mCSB_scrollTools.mCSB_scrollTools_onDrag, + .mCustomScrollbar > .mCustomScrollBox ~ .mCSB_scrollTools.mCSB_scrollTools_onDrag, + .mCustomScrollBox:hover > .mCSB_scrollTools, + .mCustomScrollBox:hover ~ .mCSB_scrollTools, + .mCS-autoHide:hover > .mCustomScrollBox > .mCSB_scrollTools, + .mCS-autoHide:hover > .mCustomScrollBox ~ .mCSB_scrollTools{ opacity: 1; filter: "alpha(opacity=100)"; -ms-filter: "alpha(opacity=100)"; } + + .mCSB_scrollTools .mCSB_draggerRail{ + background-color: #000; background-color: rgba(0,0,0,0.4); + filter: "alpha(opacity=40)"; -ms-filter: "alpha(opacity=40)"; + } + + .mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{ + background-color: #fff; background-color: rgba(255,255,255,0.75); + filter: "alpha(opacity=75)"; -ms-filter: "alpha(opacity=75)"; + } + + .mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{ + background-color: #fff; background-color: rgba(255,255,255,0.85); + filter: "alpha(opacity=85)"; -ms-filter: "alpha(opacity=85)"; + } + .mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar, + .mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar{ + background-color: #fff; background-color: rgba(255,255,255,0.9); + filter: "alpha(opacity=90)"; -ms-filter: "alpha(opacity=90)"; + } + + .mCSB_scrollTools .mCSB_buttonUp, + .mCSB_scrollTools .mCSB_buttonDown, + .mCSB_scrollTools .mCSB_buttonLeft, + .mCSB_scrollTools .mCSB_buttonRight{ + background-image: url(mCSB_buttons.png); /* css sprites */ + background-repeat: no-repeat; + opacity: 0.4; filter: "alpha(opacity=40)"; -ms-filter: "alpha(opacity=40)"; + } + + .mCSB_scrollTools .mCSB_buttonUp{ + background-position: 0 0; + /* + sprites locations + light: 0 0, -16px 0, -32px 0, -48px 0, 0 -72px, -16px -72px, -32px -72px + dark: -80px 0, -96px 0, -112px 0, -128px 0, -80px -72px, -96px -72px, -112px -72px + */ + } + + .mCSB_scrollTools .mCSB_buttonDown{ + background-position: 0 -20px; + /* + sprites locations + light: 0 -20px, -16px -20px, -32px -20px, -48px -20px, 0 -92px, -16px -92px, -32px -92px + dark: -80px -20px, -96px -20px, -112px -20px, -128px -20px, -80px -92px, -96px -92px, -112 -92px + */ + } + + .mCSB_scrollTools .mCSB_buttonLeft{ + background-position: 0 -40px; + /* + sprites locations + light: 0 -40px, -20px -40px, -40px -40px, -60px -40px, 0 -112px, -20px -112px, -40px -112px + dark: -80px -40px, -100px -40px, -120px -40px, -140px -40px, -80px -112px, -100px -112px, -120px -112px + */ + } + + .mCSB_scrollTools .mCSB_buttonRight{ + background-position: 0 -56px; + /* + sprites locations + light: 0 -56px, -20px -56px, -40px -56px, -60px -56px, 0 -128px, -20px -128px, -40px -128px + dark: -80px -56px, -100px -56px, -120px -56px, -140px -56px, -80px -128px, -100px -128px, -120px -128px + */ + } + + .mCSB_scrollTools .mCSB_buttonUp:hover, + .mCSB_scrollTools .mCSB_buttonDown:hover, + .mCSB_scrollTools .mCSB_buttonLeft:hover, + .mCSB_scrollTools .mCSB_buttonRight:hover{ opacity: 0.75; filter: "alpha(opacity=75)"; -ms-filter: "alpha(opacity=75)"; } + + .mCSB_scrollTools .mCSB_buttonUp:active, + .mCSB_scrollTools .mCSB_buttonDown:active, + .mCSB_scrollTools .mCSB_buttonLeft:active, + .mCSB_scrollTools .mCSB_buttonRight:active{ opacity: 0.9; filter: "alpha(opacity=90)"; -ms-filter: "alpha(opacity=90)"; } + + + /* theme: "dark" */ + + .mCS-dark.mCSB_scrollTools .mCSB_draggerRail{ background-color: #000; background-color: rgba(0,0,0,0.15); } + + .mCS-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{ background-color: #000; background-color: rgba(0,0,0,0.75); } + + .mCS-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{ background-color: rgba(0,0,0,0.85); } + + .mCS-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar, + .mCS-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar{ background-color: rgba(0,0,0,0.9); } + + .mCS-dark.mCSB_scrollTools .mCSB_buttonUp{ background-position: -80px 0; } + + .mCS-dark.mCSB_scrollTools .mCSB_buttonDown{ background-position: -80px -20px; } + + .mCS-dark.mCSB_scrollTools .mCSB_buttonLeft{ background-position: -80px -40px; } + + .mCS-dark.mCSB_scrollTools .mCSB_buttonRight{ background-position: -80px -56px; } + + /* ---------------------------------------- */ + + + + /* theme: "light-2", "dark-2" */ + + .mCS-light-2.mCSB_scrollTools .mCSB_draggerRail, + .mCS-dark-2.mCSB_scrollTools .mCSB_draggerRail{ + width: 4px; + background-color: #fff; background-color: rgba(255,255,255,0.1); + -webkit-border-radius: 1px; -moz-border-radius: 1px; border-radius: 1px; + } + + .mCS-light-2.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar, + .mCS-dark-2.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{ + width: 4px; + background-color: #fff; background-color: rgba(255,255,255,0.75); + -webkit-border-radius: 1px; -moz-border-radius: 1px; border-radius: 1px; + } + + .mCS-light-2.mCSB_scrollTools_horizontal .mCSB_draggerRail, + .mCS-dark-2.mCSB_scrollTools_horizontal .mCSB_draggerRail, + .mCS-light-2.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar, + .mCS-dark-2.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{ + width: 100%; + height: 4px; + margin: 6px auto; + } + + .mCS-light-2.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{ background-color: #fff; background-color: rgba(255,255,255,0.85); } + + .mCS-light-2.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar, + .mCS-light-2.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar{ background-color: #fff; background-color: rgba(255,255,255,0.9); } + + .mCS-light-2.mCSB_scrollTools .mCSB_buttonUp{ background-position: -32px 0; } + + .mCS-light-2.mCSB_scrollTools .mCSB_buttonDown{ background-position: -32px -20px; } + + .mCS-light-2.mCSB_scrollTools .mCSB_buttonLeft{ background-position: -40px -40px; } + + .mCS-light-2.mCSB_scrollTools .mCSB_buttonRight{ background-position: -40px -56px; } + + + /* theme: "dark-2" */ + + .mCS-dark-2.mCSB_scrollTools .mCSB_draggerRail{ + background-color: #000; background-color: rgba(0,0,0,0.1); + -webkit-border-radius: 1px; -moz-border-radius: 1px; border-radius: 1px; + } + + .mCS-dark-2.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{ + background-color: #000; background-color: rgba(0,0,0,0.75); + -webkit-border-radius: 1px; -moz-border-radius: 1px; border-radius: 1px; + } + + .mCS-dark-2.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{ background-color: #000; background-color: rgba(0,0,0,0.85); } + + .mCS-dark-2.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar, + .mCS-dark-2.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar{ background-color: #000; background-color: rgba(0,0,0,0.9); } + + .mCS-dark-2.mCSB_scrollTools .mCSB_buttonUp{ background-position: -112px 0; } + + .mCS-dark-2.mCSB_scrollTools .mCSB_buttonDown{ background-position: -112px -20px; } + + .mCS-dark-2.mCSB_scrollTools .mCSB_buttonLeft{ background-position: -120px -40px; } + + .mCS-dark-2.mCSB_scrollTools .mCSB_buttonRight{ background-position: -120px -56px; } + + /* ---------------------------------------- */ + + + + /* theme: "light-thick", "dark-thick" */ + + .mCS-light-thick.mCSB_scrollTools .mCSB_draggerRail, + .mCS-dark-thick.mCSB_scrollTools .mCSB_draggerRail{ + width: 4px; + background-color: #fff; background-color: rgba(255,255,255,0.1); + -webkit-border-radius: 2px; -moz-border-radius: 2px; border-radius: 2px; + } + + .mCS-light-thick.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar, + .mCS-dark-thick.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{ + width: 6px; + background-color: #fff; background-color: rgba(255,255,255,0.75); + -webkit-border-radius: 2px; -moz-border-radius: 2px; border-radius: 2px; + } + + .mCS-light-thick.mCSB_scrollTools_horizontal .mCSB_draggerRail, + .mCS-dark-thick.mCSB_scrollTools_horizontal .mCSB_draggerRail{ + width: 100%; + height: 4px; + margin: 6px 0; + } + + .mCS-light-thick.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar, + .mCS-dark-thick.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{ + width: 100%; + height: 6px; + margin: 5px auto; + } + + .mCS-light-thick.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{ background-color: #fff; background-color: rgba(255,255,255,0.85); } + + .mCS-light-thick.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar, + .mCS-light-thick.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar{ background-color: #fff; background-color: rgba(255,255,255,0.9); } + + .mCS-light-thick.mCSB_scrollTools .mCSB_buttonUp{ background-position: -16px 0; } + + .mCS-light-thick.mCSB_scrollTools .mCSB_buttonDown{ background-position: -16px -20px; } + + .mCS-light-thick.mCSB_scrollTools .mCSB_buttonLeft{ background-position: -20px -40px; } + + .mCS-light-thick.mCSB_scrollTools .mCSB_buttonRight{ background-position: -20px -56px; } + + + /* theme: "dark-thick" */ + + .mCS-dark-thick.mCSB_scrollTools .mCSB_draggerRail{ + background-color: #000; background-color: rgba(0,0,0,0.1); + -webkit-border-radius: 2px; -moz-border-radius: 2px; border-radius: 2px; + } + + .mCS-dark-thick.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{ + background-color: #000; background-color: rgba(0,0,0,0.75); + -webkit-border-radius: 2px; -moz-border-radius: 2px; border-radius: 2px; + } + + .mCS-dark-thick.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{ background-color: #000; background-color: rgba(0,0,0,0.85); } + + .mCS-dark-thick.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar, + .mCS-dark-thick.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar{ background-color: #000; background-color: rgba(0,0,0,0.9); } + + .mCS-dark-thick.mCSB_scrollTools .mCSB_buttonUp{ background-position: -96px 0; } + + .mCS-dark-thick.mCSB_scrollTools .mCSB_buttonDown{ background-position: -96px -20px; } + + .mCS-dark-thick.mCSB_scrollTools .mCSB_buttonLeft{ background-position: -100px -40px; } + + .mCS-dark-thick.mCSB_scrollTools .mCSB_buttonRight{ background-position: -100px -56px; } + + /* ---------------------------------------- */ + + + + /* theme: "light-thin", "dark-thin" */ + + .mCS-light-thin.mCSB_scrollTools .mCSB_draggerRail{ background-color: #fff; background-color: rgba(255,255,255,0.1); } + + .mCS-light-thin.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar, + .mCS-dark-thin.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{ width: 2px; } + + .mCS-light-thin.mCSB_scrollTools_horizontal .mCSB_draggerRail, + .mCS-dark-thin.mCSB_scrollTools_horizontal .mCSB_draggerRail{ width: 100%; } + + .mCS-light-thin.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar, + .mCS-dark-thin.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{ + width: 100%; + height: 2px; + margin: 7px auto; + } + + + /* theme "dark-thin" */ + + .mCS-dark-thin.mCSB_scrollTools .mCSB_draggerRail{ background-color: #000; background-color: rgba(0,0,0,0.15); } + + .mCS-dark-thin.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{ background-color: #000; background-color: rgba(0,0,0,0.75); } + + .mCS-dark-thin.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{ background-color: #000; background-color: rgba(0,0,0,0.85); } + + .mCS-dark-thin.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar, + .mCS-dark-thin.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar{ background-color: #000; background-color: rgba(0,0,0,0.9); } + + .mCS-dark-thin.mCSB_scrollTools .mCSB_buttonUp{ background-position: -80px 0; } + + .mCS-dark-thin.mCSB_scrollTools .mCSB_buttonDown{ background-position: -80px -20px; } + + .mCS-dark-thin.mCSB_scrollTools .mCSB_buttonLeft{ background-position: -80px -40px; } + + .mCS-dark-thin.mCSB_scrollTools .mCSB_buttonRight{ background-position: -80px -56px; } + + /* ---------------------------------------- */ + + + + /* theme "rounded", "rounded-dark", "rounded-dots", "rounded-dots-dark" */ + + .mCS-rounded.mCSB_scrollTools .mCSB_draggerRail{ background-color: #fff; background-color: rgba(255,255,255,0.15); } + + .mCS-rounded.mCSB_scrollTools .mCSB_dragger, + .mCS-rounded-dark.mCSB_scrollTools .mCSB_dragger, + .mCS-rounded-dots.mCSB_scrollTools .mCSB_dragger, + .mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_dragger{ height: 14px; } + + .mCS-rounded.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar, + .mCS-rounded-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar, + .mCS-rounded-dots.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar, + .mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{ + width: 14px; + margin: 0 1px; + } + + .mCS-rounded.mCSB_scrollTools_horizontal .mCSB_dragger, + .mCS-rounded-dark.mCSB_scrollTools_horizontal .mCSB_dragger, + .mCS-rounded-dots.mCSB_scrollTools_horizontal .mCSB_dragger, + .mCS-rounded-dots-dark.mCSB_scrollTools_horizontal .mCSB_dragger{ width: 14px; } + + .mCS-rounded.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar, + .mCS-rounded-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar, + .mCS-rounded-dots.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar, + .mCS-rounded-dots-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{ + height: 14px; + margin: 1px 0; + } + + .mCS-rounded.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar, + .mCS-rounded.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar, + .mCS-rounded-dark.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar, + .mCS-rounded-dark.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar{ + width: 16px; /* auto-expanded scrollbar */ + height: 16px; + margin: -1px 0; + } + + .mCS-rounded.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded + .mCSB_draggerRail, + .mCS-rounded.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail, + .mCS-rounded-dark.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded + .mCSB_draggerRail, + .mCS-rounded-dark.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{ width: 4px; /* auto-expanded scrollbar */ } + + .mCS-rounded.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar, + .mCS-rounded.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar, + .mCS-rounded-dark.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar, + .mCS-rounded-dark.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar{ + height: 16px; /* auto-expanded scrollbar */ + width: 16px; + margin: 0 -1px; + } + + .mCS-rounded.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded + .mCSB_draggerRail, + .mCS-rounded.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail, + .mCS-rounded-dark.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded + .mCSB_draggerRail, + .mCS-rounded-dark.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{ + height: 4px; /* auto-expanded scrollbar */ + margin: 6px 0; + } + + .mCS-rounded.mCSB_scrollTools .mCSB_buttonUp{ background-position: 0 -72px; } + + .mCS-rounded.mCSB_scrollTools .mCSB_buttonDown{ background-position: 0 -92px; } + + .mCS-rounded.mCSB_scrollTools .mCSB_buttonLeft{ background-position: 0 -112px; } + + .mCS-rounded.mCSB_scrollTools .mCSB_buttonRight{ background-position: 0 -128px; } + + + /* theme "rounded-dark", "rounded-dots-dark" */ + + .mCS-rounded-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar, + .mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{ background-color: #000; background-color: rgba(0,0,0,0.75); } + + .mCS-rounded-dark.mCSB_scrollTools .mCSB_draggerRail{ background-color: #000; background-color: rgba(0,0,0,0.15); } + + .mCS-rounded-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar, + .mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{ background-color: #000; background-color: rgba(0,0,0,0.85); } + + .mCS-rounded-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar, + .mCS-rounded-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar, + .mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar, + .mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar{ background-color: #000; background-color: rgba(0,0,0,0.9); } + + .mCS-rounded-dark.mCSB_scrollTools .mCSB_buttonUp{ background-position: -80px -72px; } + + .mCS-rounded-dark.mCSB_scrollTools .mCSB_buttonDown{ background-position: -80px -92px; } + + .mCS-rounded-dark.mCSB_scrollTools .mCSB_buttonLeft{ background-position: -80px -112px; } + + .mCS-rounded-dark.mCSB_scrollTools .mCSB_buttonRight{ background-position: -80px -128px; } + + + /* theme "rounded-dots", "rounded-dots-dark" */ + + .mCS-rounded-dots.mCSB_scrollTools_vertical .mCSB_draggerRail, + .mCS-rounded-dots-dark.mCSB_scrollTools_vertical .mCSB_draggerRail{ width: 4px; } + + .mCS-rounded-dots.mCSB_scrollTools .mCSB_draggerRail, + .mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_draggerRail, + .mCS-rounded-dots.mCSB_scrollTools_horizontal .mCSB_draggerRail, + .mCS-rounded-dots-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail{ + background-color: transparent; + background-position: center; + } + + .mCS-rounded-dots.mCSB_scrollTools .mCSB_draggerRail, + .mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_draggerRail{ + background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAANElEQVQYV2NkIAAYiVbw//9/Y6DiM1ANJoyMjGdBbLgJQAX/kU0DKgDLkaQAvxW4HEvQFwCRcxIJK1XznAAAAABJRU5ErkJggg=="); + background-repeat: repeat-y; + opacity: 0.3; + filter: "alpha(opacity=30)"; -ms-filter: "alpha(opacity=30)"; + } + + .mCS-rounded-dots.mCSB_scrollTools_horizontal .mCSB_draggerRail, + .mCS-rounded-dots-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail{ + height: 4px; + margin: 6px 0; + background-repeat: repeat-x; + } + + .mCS-rounded-dots.mCSB_scrollTools .mCSB_buttonUp{ background-position: -16px -72px; } + + .mCS-rounded-dots.mCSB_scrollTools .mCSB_buttonDown{ background-position: -16px -92px; } + + .mCS-rounded-dots.mCSB_scrollTools .mCSB_buttonLeft{ background-position: -20px -112px; } + + .mCS-rounded-dots.mCSB_scrollTools .mCSB_buttonRight{ background-position: -20px -128px; } + + + /* theme "rounded-dots-dark" */ + + .mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_draggerRail{ + background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAALElEQVQYV2NkIAAYSVFgDFR8BqrBBEifBbGRTfiPZhpYjiQFBK3A6l6CvgAAE9kGCd1mvgEAAAAASUVORK5CYII="); + } + + .mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_buttonUp{ background-position: -96px -72px; } + + .mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_buttonDown{ background-position: -96px -92px; } + + .mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_buttonLeft{ background-position: -100px -112px; } + + .mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_buttonRight{ background-position: -100px -128px; } + + /* ---------------------------------------- */ + + + + /* theme "3d", "3d-dark", "3d-thick", "3d-thick-dark" */ + + .mCS-3d.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar, + .mCS-3d-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar, + .mCS-3d-thick.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar, + .mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{ + background-repeat: repeat-y; + background-image: -moz-linear-gradient(left, rgba(255,255,255,0.5) 0%, rgba(255,255,255,0) 100%); + background-image: -webkit-gradient(linear, left top, right top, color-stop(0%,rgba(255,255,255,0.5)), color-stop(100%,rgba(255,255,255,0))); + background-image: -webkit-linear-gradient(left, rgba(255,255,255,0.5) 0%,rgba(255,255,255,0) 100%); + background-image: -o-linear-gradient(left, rgba(255,255,255,0.5) 0%,rgba(255,255,255,0) 100%); + background-image: -ms-linear-gradient(left, rgba(255,255,255,0.5) 0%,rgba(255,255,255,0) 100%); + background-image: linear-gradient(to right, rgba(255,255,255,0.5) 0%,rgba(255,255,255,0) 100%); + } + + .mCS-3d.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar, + .mCS-3d-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar, + .mCS-3d-thick.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar, + .mCS-3d-thick-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{ + background-repeat: repeat-x; + background-image: -moz-linear-gradient(top, rgba(255,255,255,0.5) 0%, rgba(255,255,255,0) 100%); + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(255,255,255,0.5)), color-stop(100%,rgba(255,255,255,0))); + background-image: -webkit-linear-gradient(top, rgba(255,255,255,0.5) 0%,rgba(255,255,255,0) 100%); + background-image: -o-linear-gradient(top, rgba(255,255,255,0.5) 0%,rgba(255,255,255,0) 100%); + background-image: -ms-linear-gradient(top, rgba(255,255,255,0.5) 0%,rgba(255,255,255,0) 100%); + background-image: linear-gradient(to bottom, rgba(255,255,255,0.5) 0%,rgba(255,255,255,0) 100%); + } + + + /* theme "3d", "3d-dark" */ + + .mCS-3d.mCSB_scrollTools_vertical .mCSB_dragger, + .mCS-3d-dark.mCSB_scrollTools_vertical .mCSB_dragger{ height: 70px; } + + .mCS-3d.mCSB_scrollTools_horizontal .mCSB_dragger, + .mCS-3d-dark.mCSB_scrollTools_horizontal .mCSB_dragger{ width: 70px; } + + .mCS-3d.mCSB_scrollTools, + .mCS-3d-dark.mCSB_scrollTools{ + opacity: 1; + filter: "alpha(opacity=30)"; -ms-filter: "alpha(opacity=30)"; + } + + .mCS-3d.mCSB_scrollTools .mCSB_draggerRail, + .mCS-3d.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar, + .mCS-3d-dark.mCSB_scrollTools .mCSB_draggerRail, + .mCS-3d-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{ -webkit-border-radius: 16px; -moz-border-radius: 16px; border-radius: 16px; } + + .mCS-3d.mCSB_scrollTools .mCSB_draggerRail, + .mCS-3d-dark.mCSB_scrollTools .mCSB_draggerRail{ + width: 8px; + background-color: #000; background-color: rgba(0,0,0,0.2); + box-shadow: inset 1px 0 1px rgba(0,0,0,0.5), inset -1px 0 1px rgba(255,255,255,0.2); + } + + .mCS-3d.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar, + .mCS-3d.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar, + .mCS-3d.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar, + .mCS-3d.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar, + .mCS-3d-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar, + .mCS-3d-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar, + .mCS-3d-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar, + .mCS-3d-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar{ background-color: #555; } + + .mCS-3d.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar, + .mCS-3d-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{ width: 8px; } + + .mCS-3d.mCSB_scrollTools_horizontal .mCSB_draggerRail, + .mCS-3d-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail{ + width: 100%; + height: 8px; + margin: 4px 0; + box-shadow: inset 0 1px 1px rgba(0,0,0,0.5), inset 0 -1px 1px rgba(255,255,255,0.2); + } + + .mCS-3d.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar, + .mCS-3d-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{ + width: 100%; + height: 8px; + margin: 4px auto; + } + + .mCS-3d.mCSB_scrollTools .mCSB_buttonUp{ background-position: -32px -72px; } + + .mCS-3d.mCSB_scrollTools .mCSB_buttonDown{ background-position: -32px -92px; } + + .mCS-3d.mCSB_scrollTools .mCSB_buttonLeft{ background-position: -40px -112px; } + + .mCS-3d.mCSB_scrollTools .mCSB_buttonRight{ background-position: -40px -128px; } + + + /* theme "3d-dark" */ + + .mCS-3d-dark.mCSB_scrollTools .mCSB_draggerRail{ + background-color: #000; background-color: rgba(0,0,0,0.1); + box-shadow: inset 1px 0 1px rgba(0,0,0,0.1); + } + + .mCS-3d-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail{ box-shadow: inset 0 1px 1px rgba(0,0,0,0.1); } + + .mCS-3d-dark.mCSB_scrollTools .mCSB_buttonUp{ background-position: -112px -72px; } + + .mCS-3d-dark.mCSB_scrollTools .mCSB_buttonDown{ background-position: -112px -92px; } + + .mCS-3d-dark.mCSB_scrollTools .mCSB_buttonLeft{ background-position: -120px -112px; } + + .mCS-3d-dark.mCSB_scrollTools .mCSB_buttonRight{ background-position: -120px -128px; } + + /* ---------------------------------------- */ + + + + /* theme: "3d-thick", "3d-thick-dark" */ + + .mCS-3d-thick.mCSB_scrollTools, + .mCS-3d-thick-dark.mCSB_scrollTools{ + opacity: 1; + filter: "alpha(opacity=30)"; -ms-filter: "alpha(opacity=30)"; + } + + .mCS-3d-thick.mCSB_scrollTools, + .mCS-3d-thick-dark.mCSB_scrollTools, + .mCS-3d-thick.mCSB_scrollTools .mCSB_draggerContainer, + .mCS-3d-thick-dark.mCSB_scrollTools .mCSB_draggerContainer{ -webkit-border-radius: 7px; -moz-border-radius: 7px; border-radius: 7px; } + + .mCS-3d-thick.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar, + .mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{ -webkit-border-radius: 5px; -moz-border-radius: 5px; border-radius: 5px; } + + .mCSB_inside + .mCS-3d-thick.mCSB_scrollTools_vertical, + .mCSB_inside + .mCS-3d-thick-dark.mCSB_scrollTools_vertical{ right: 1px; } + + .mCS-3d-thick.mCSB_scrollTools_vertical, + .mCS-3d-thick-dark.mCSB_scrollTools_vertical{ box-shadow: inset 1px 0 1px rgba(0,0,0,0.1), inset 0 0 14px rgba(0,0,0,0.5); } + + .mCS-3d-thick.mCSB_scrollTools_horizontal, + .mCS-3d-thick-dark.mCSB_scrollTools_horizontal{ + bottom: 1px; + box-shadow: inset 0 1px 1px rgba(0,0,0,0.1), inset 0 0 14px rgba(0,0,0,0.5); + } + + .mCS-3d-thick.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar, + .mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{ + box-shadow: inset 1px 0 0 rgba(255,255,255,0.4); + width: 12px; + margin: 2px; + position: absolute; + height: auto; + top: 0; + bottom: 0; + left: 0; + right: 0; + } + + .mCS-3d-thick.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar, + .mCS-3d-thick-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{ box-shadow: inset 0 1px 0 rgba(255,255,255,0.4); } + + .mCS-3d-thick.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar, + .mCS-3d-thick.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar, + .mCS-3d-thick.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar, + .mCS-3d-thick.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar{ background-color: #555; } + + .mCS-3d-thick.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar, + .mCS-3d-thick-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{ + height: 12px; + width: auto; + } + + .mCS-3d-thick.mCSB_scrollTools .mCSB_draggerContainer{ + background-color: #000; background-color: rgba(0,0,0,0.05); + box-shadow: inset 1px 1px 16px rgba(0,0,0,0.1); + } + + .mCS-3d-thick.mCSB_scrollTools .mCSB_draggerRail{ background-color: transparent; } + + .mCS-3d-thick.mCSB_scrollTools .mCSB_buttonUp{ background-position: -32px -72px; } + + .mCS-3d-thick.mCSB_scrollTools .mCSB_buttonDown{ background-position: -32px -92px; } + + .mCS-3d-thick.mCSB_scrollTools .mCSB_buttonLeft{ background-position: -40px -112px; } + + .mCS-3d-thick.mCSB_scrollTools .mCSB_buttonRight{ background-position: -40px -128px; } + + + /* theme: "3d-thick-dark" */ + + .mCS-3d-thick-dark.mCSB_scrollTools{ box-shadow: inset 0 0 14px rgba(0,0,0,0.2); } + + .mCS-3d-thick-dark.mCSB_scrollTools_horizontal{ box-shadow: inset 0 1px 1px rgba(0,0,0,0.1), inset 0 0 14px rgba(0,0,0,0.2); } + + .mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{ box-shadow: inset 1px 0 0 rgba(255,255,255,0.4), inset -1px 0 0 rgba(0,0,0,0.2); } + + .mCS-3d-thick-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{ box-shadow: inset 0 1px 0 rgba(255,255,255,0.4), inset 0 -1px 0 rgba(0,0,0,0.2); } + + .mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar, + .mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar, + .mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar, + .mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar{ background-color: #777; } + + .mCS-3d-thick-dark.mCSB_scrollTools .mCSB_draggerContainer{ + background-color: #fff; background-color: rgba(0,0,0,0.05); + box-shadow: inset 1px 1px 16px rgba(0,0,0,0.1); + } + + .mCS-3d-thick-dark.mCSB_scrollTools .mCSB_draggerRail{ background-color: transparent; } + + .mCS-3d-thick-dark.mCSB_scrollTools .mCSB_buttonUp{ background-position: -112px -72px; } + + .mCS-3d-thick-dark.mCSB_scrollTools .mCSB_buttonDown{ background-position: -112px -92px; } + + .mCS-3d-thick-dark.mCSB_scrollTools .mCSB_buttonLeft{ background-position: -120px -112px; } + + .mCS-3d-thick-dark.mCSB_scrollTools .mCSB_buttonRight{ background-position: -120px -128px; } + + /* ---------------------------------------- */ + + + + /* theme: "minimal", "minimal-dark" */ + + .mCSB_outside + .mCS-minimal.mCSB_scrollTools_vertical, + .mCSB_outside + .mCS-minimal-dark.mCSB_scrollTools_vertical{ + right: 0; + margin: 12px 0; + } + + .mCustomScrollBox.mCS-minimal + .mCSB_scrollTools.mCSB_scrollTools_horizontal, + .mCustomScrollBox.mCS-minimal + .mCSB_scrollTools + .mCSB_scrollTools.mCSB_scrollTools_horizontal, + .mCustomScrollBox.mCS-minimal-dark + .mCSB_scrollTools.mCSB_scrollTools_horizontal, + .mCustomScrollBox.mCS-minimal-dark + .mCSB_scrollTools + .mCSB_scrollTools.mCSB_scrollTools_horizontal{ + bottom: 0; + margin: 0 12px; + } + + /* RTL direction/left-side scrollbar */ + .mCS-dir-rtl > .mCSB_outside + .mCS-minimal.mCSB_scrollTools_vertical, + .mCS-dir-rtl > .mCSB_outside + .mCS-minimal-dark.mCSB_scrollTools_vertical{ + left: 0; + right: auto; + } + + .mCS-minimal.mCSB_scrollTools .mCSB_draggerRail, + .mCS-minimal-dark.mCSB_scrollTools .mCSB_draggerRail{ background-color: transparent; } + + .mCS-minimal.mCSB_scrollTools_vertical .mCSB_dragger, + .mCS-minimal-dark.mCSB_scrollTools_vertical .mCSB_dragger{ height: 50px; } + + .mCS-minimal.mCSB_scrollTools_horizontal .mCSB_dragger, + .mCS-minimal-dark.mCSB_scrollTools_horizontal .mCSB_dragger{ width: 50px; } + + .mCS-minimal.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{ + background-color: #fff; background-color: rgba(255,255,255,0.2); + filter: "alpha(opacity=20)"; -ms-filter: "alpha(opacity=20)"; + } + + .mCS-minimal.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar, + .mCS-minimal.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar{ + background-color: #fff; background-color: rgba(255,255,255,0.5); + filter: "alpha(opacity=50)"; -ms-filter: "alpha(opacity=50)"; + } + + + /* theme: "minimal-dark" */ + + .mCS-minimal-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{ + background-color: #000; background-color: rgba(0,0,0,0.2); + filter: "alpha(opacity=20)"; -ms-filter: "alpha(opacity=20)"; + } + + .mCS-minimal-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar, + .mCS-minimal-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar{ + background-color: #000; background-color: rgba(0,0,0,0.5); + filter: "alpha(opacity=50)"; -ms-filter: "alpha(opacity=50)"; + } + + /* ---------------------------------------- */ + + + + /* theme "light-3", "dark-3" */ + + .mCS-light-3.mCSB_scrollTools .mCSB_draggerRail, + .mCS-dark-3.mCSB_scrollTools .mCSB_draggerRail{ + width: 6px; + background-color: #000; background-color: rgba(0,0,0,0.2); + } + + .mCS-light-3.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar, + .mCS-dark-3.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{ width: 6px; } + + .mCS-light-3.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar, + .mCS-dark-3.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar, + .mCS-light-3.mCSB_scrollTools_horizontal .mCSB_draggerRail, + .mCS-dark-3.mCSB_scrollTools_horizontal .mCSB_draggerRail{ + width: 100%; + height: 6px; + margin: 5px 0; + } + + .mCS-light-3.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded + .mCSB_draggerRail, + .mCS-light-3.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail, + .mCS-dark-3.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded + .mCSB_draggerRail, + .mCS-dark-3.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{ + width: 12px; + } + + .mCS-light-3.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded + .mCSB_draggerRail, + .mCS-light-3.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail, + .mCS-dark-3.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded + .mCSB_draggerRail, + .mCS-dark-3.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{ + height: 12px; + margin: 2px 0; + } + + .mCS-light-3.mCSB_scrollTools .mCSB_buttonUp{ background-position: -32px -72px; } + + .mCS-light-3.mCSB_scrollTools .mCSB_buttonDown{ background-position: -32px -92px; } + + .mCS-light-3.mCSB_scrollTools .mCSB_buttonLeft{ background-position: -40px -112px; } + + .mCS-light-3.mCSB_scrollTools .mCSB_buttonRight{ background-position: -40px -128px; } + + + /* theme "dark-3" */ + + .mCS-dark-3.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{ background-color: #000; background-color: rgba(0,0,0,0.75); } + + .mCS-dark-3.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{ background-color: #000; background-color: rgba(0,0,0,0.85); } + + .mCS-dark-3.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar, + .mCS-dark-3.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar{ background-color: #000; background-color: rgba(0,0,0,0.9); } + + .mCS-dark-3.mCSB_scrollTools .mCSB_draggerRail{ background-color: #000; background-color: rgba(0,0,0,0.1); } + + .mCS-dark-3.mCSB_scrollTools .mCSB_buttonUp{ background-position: -112px -72px; } + + .mCS-dark-3.mCSB_scrollTools .mCSB_buttonDown{ background-position: -112px -92px; } + + .mCS-dark-3.mCSB_scrollTools .mCSB_buttonLeft{ background-position: -120px -112px; } + + .mCS-dark-3.mCSB_scrollTools .mCSB_buttonRight{ background-position: -120px -128px; } + + /* ---------------------------------------- */ + + + + /* theme "inset", "inset-dark", "inset-2", "inset-2-dark", "inset-3", "inset-3-dark" */ + + .mCS-inset.mCSB_scrollTools .mCSB_draggerRail, + .mCS-inset-dark.mCSB_scrollTools .mCSB_draggerRail, + .mCS-inset-2.mCSB_scrollTools .mCSB_draggerRail, + .mCS-inset-2-dark.mCSB_scrollTools .mCSB_draggerRail, + .mCS-inset-3.mCSB_scrollTools .mCSB_draggerRail, + .mCS-inset-3-dark.mCSB_scrollTools .mCSB_draggerRail{ + width: 12px; + background-color: #000; background-color: rgba(0,0,0,0.2); + } + + .mCS-inset.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar, + .mCS-inset-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar, + .mCS-inset-2.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar, + .mCS-inset-2-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar, + .mCS-inset-3.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar, + .mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{ + width: 6px; + margin: 3px 5px; + position: absolute; + height: auto; + top: 0; + bottom: 0; + left: 0; + right: 0; + } + + .mCS-inset.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar, + .mCS-inset-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar, + .mCS-inset-2.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar, + .mCS-inset-2-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar, + .mCS-inset-3.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar, + .mCS-inset-3-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{ + height: 6px; + margin: 5px 3px; + position: absolute; + width: auto; + top: 0; + bottom: 0; + left: 0; + right: 0; + } + + .mCS-inset.mCSB_scrollTools_horizontal .mCSB_draggerRail, + .mCS-inset-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail, + .mCS-inset-2.mCSB_scrollTools_horizontal .mCSB_draggerRail, + .mCS-inset-2-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail, + .mCS-inset-3.mCSB_scrollTools_horizontal .mCSB_draggerRail, + .mCS-inset-3-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail{ + width: 100%; + height: 12px; + margin: 2px 0; + } + + .mCS-inset.mCSB_scrollTools .mCSB_buttonUp, + .mCS-inset-2.mCSB_scrollTools .mCSB_buttonUp, + .mCS-inset-3.mCSB_scrollTools .mCSB_buttonUp{ background-position: -32px -72px; } + + .mCS-inset.mCSB_scrollTools .mCSB_buttonDown, + .mCS-inset-2.mCSB_scrollTools .mCSB_buttonDown, + .mCS-inset-3.mCSB_scrollTools .mCSB_buttonDown{ background-position: -32px -92px; } + + .mCS-inset.mCSB_scrollTools .mCSB_buttonLeft, + .mCS-inset-2.mCSB_scrollTools .mCSB_buttonLeft, + .mCS-inset-3.mCSB_scrollTools .mCSB_buttonLeft{ background-position: -40px -112px; } + + .mCS-inset.mCSB_scrollTools .mCSB_buttonRight, + .mCS-inset-2.mCSB_scrollTools .mCSB_buttonRight, + .mCS-inset-3.mCSB_scrollTools .mCSB_buttonRight{ background-position: -40px -128px; } + + + /* theme "inset-dark", "inset-2-dark", "inset-3-dark" */ + + .mCS-inset-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar, + .mCS-inset-2-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar, + .mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{ background-color: #000; background-color: rgba(0,0,0,0.75); } + + .mCS-inset-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar, + .mCS-inset-2-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar, + .mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{ background-color: #000; background-color: rgba(0,0,0,0.85); } + + .mCS-inset-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar, + .mCS-inset-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar, + .mCS-inset-2-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar, + .mCS-inset-2-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar, + .mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar, + .mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar{ background-color: #000; background-color: rgba(0,0,0,0.9); } + + .mCS-inset-dark.mCSB_scrollTools .mCSB_draggerRail, + .mCS-inset-2-dark.mCSB_scrollTools .mCSB_draggerRail, + .mCS-inset-3-dark.mCSB_scrollTools .mCSB_draggerRail{ background-color: #000; background-color: rgba(0,0,0,0.1); } + + .mCS-inset-dark.mCSB_scrollTools .mCSB_buttonUp, + .mCS-inset-2-dark.mCSB_scrollTools .mCSB_buttonUp, + .mCS-inset-3-dark.mCSB_scrollTools .mCSB_buttonUp{ background-position: -112px -72px; } + + .mCS-inset-dark.mCSB_scrollTools .mCSB_buttonDown, + .mCS-inset-2-dark.mCSB_scrollTools .mCSB_buttonDown, + .mCS-inset-3-dark.mCSB_scrollTools .mCSB_buttonDown{ background-position: -112px -92px; } + + .mCS-inset-dark.mCSB_scrollTools .mCSB_buttonLeft, + .mCS-inset-2-dark.mCSB_scrollTools .mCSB_buttonLeft, + .mCS-inset-3-dark.mCSB_scrollTools .mCSB_buttonLeft{ background-position: -120px -112px; } + + .mCS-inset-dark.mCSB_scrollTools .mCSB_buttonRight, + .mCS-inset-2-dark.mCSB_scrollTools .mCSB_buttonRight, + .mCS-inset-3-dark.mCSB_scrollTools .mCSB_buttonRight{ background-position: -120px -128px; } + + + /* theme "inset-2", "inset-2-dark" */ + + .mCS-inset-2.mCSB_scrollTools .mCSB_draggerRail, + .mCS-inset-2-dark.mCSB_scrollTools .mCSB_draggerRail{ + background-color: transparent; + border-width: 1px; + border-style: solid; + border-color: #fff; + border-color: rgba(255,255,255,0.2); + -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; + } + + .mCS-inset-2-dark.mCSB_scrollTools .mCSB_draggerRail{ border-color: #000; border-color: rgba(0,0,0,0.2); } + + + /* theme "inset-3", "inset-3-dark" */ + + .mCS-inset-3.mCSB_scrollTools .mCSB_draggerRail{ background-color: #fff; background-color: rgba(255,255,255,0.6); } + + .mCS-inset-3-dark.mCSB_scrollTools .mCSB_draggerRail{ background-color: #000; background-color: rgba(0,0,0,0.6); } + + .mCS-inset-3.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{ background-color: #000; background-color: rgba(0,0,0,0.75); } + + .mCS-inset-3.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{ background-color: #000; background-color: rgba(0,0,0,0.85); } + + .mCS-inset-3.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar, + .mCS-inset-3.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar{ background-color: #000; background-color: rgba(0,0,0,0.9); } + + .mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{ background-color: #fff; background-color: rgba(255,255,255,0.75); } + + .mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{ background-color: #fff; background-color: rgba(255,255,255,0.85); } + + .mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar, + .mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar{ background-color: #fff; background-color: rgba(255,255,255,0.9); } + + /* ---------------------------------------- */ diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/popper.js/popper.min.js b/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/popper.js/popper.min.js new file mode 100644 index 0000000000..9b7dbeb946 --- /dev/null +++ b/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/popper.js/popper.min.js @@ -0,0 +1,5 @@ +/* + Copyright (C) Federico Zivolo 2018 + Distributed under the MIT License (license terms are at http://opensource.org/licenses/MIT). + */(function(e,t){'object'==typeof exports&&'undefined'!=typeof module?module.exports=t():'function'==typeof define&&define.amd?define(t):e.Popper=t()})(this,function(){'use strict';function e(e){return e&&'[object Function]'==={}.toString.call(e)}function t(e,t){if(1!==e.nodeType)return[];var o=e.ownerDocument.defaultView,n=o.getComputedStyle(e,null);return t?n[t]:n}function o(e){return'HTML'===e.nodeName?e:e.parentNode||e.host}function n(e){if(!e)return document.body;switch(e.nodeName){case'HTML':case'BODY':return e.ownerDocument.body;case'#document':return e.body;}var i=t(e),r=i.overflow,p=i.overflowX,s=i.overflowY;return /(auto|scroll|overlay)/.test(r+s+p)?e:n(o(e))}function r(e){return 11===e?pe:10===e?se:pe||se}function p(e){if(!e)return document.documentElement;for(var o=r(10)?document.body:null,n=e.offsetParent||null;n===o&&e.nextElementSibling;)n=(e=e.nextElementSibling).offsetParent;var i=n&&n.nodeName;return i&&'BODY'!==i&&'HTML'!==i?-1!==['TH','TD','TABLE'].indexOf(n.nodeName)&&'static'===t(n,'position')?p(n):n:e?e.ownerDocument.documentElement:document.documentElement}function s(e){var t=e.nodeName;return'BODY'!==t&&('HTML'===t||p(e.firstElementChild)===e)}function d(e){return null===e.parentNode?e:d(e.parentNode)}function a(e,t){if(!e||!e.nodeType||!t||!t.nodeType)return document.documentElement;var o=e.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_FOLLOWING,n=o?e:t,i=o?t:e,r=document.createRange();r.setStart(n,0),r.setEnd(i,0);var l=r.commonAncestorContainer;if(e!==l&&t!==l||n.contains(i))return s(l)?l:p(l);var f=d(e);return f.host?a(f.host,t):a(e,d(t).host)}function l(e){var t=1=o.clientWidth&&n>=o.clientHeight}),l=0a[e]&&!t.escapeWithReference&&(n=Q(f[o],a[e]-('right'===e?f.width:f.height))),le({},o,n)}};return l.forEach(function(e){var t=-1===['left','top'].indexOf(e)?'secondary':'primary';f=fe({},f,m[t](e))}),e.offsets.popper=f,e},priority:['left','right','top','bottom'],padding:5,boundariesElement:'scrollParent'},keepTogether:{order:400,enabled:!0,fn:function(e){var t=e.offsets,o=t.popper,n=t.reference,i=e.placement.split('-')[0],r=Z,p=-1!==['top','bottom'].indexOf(i),s=p?'right':'bottom',d=p?'left':'top',a=p?'width':'height';return o[s]r(n[s])&&(e.offsets.popper[d]=r(n[s])),e}},arrow:{order:500,enabled:!0,fn:function(e,o){var n;if(!K(e.instance.modifiers,'arrow','keepTogether'))return e;var i=o.element;if('string'==typeof i){if(i=e.instance.popper.querySelector(i),!i)return e;}else if(!e.instance.popper.contains(i))return console.warn('WARNING: `arrow.element` must be child of its popper element!'),e;var r=e.placement.split('-')[0],p=e.offsets,s=p.popper,d=p.reference,a=-1!==['left','right'].indexOf(r),l=a?'height':'width',f=a?'Top':'Left',m=f.toLowerCase(),h=a?'left':'top',c=a?'bottom':'right',u=S(i)[l];d[c]-us[c]&&(e.offsets.popper[m]+=d[m]+u-s[c]),e.offsets.popper=g(e.offsets.popper);var b=d[m]+d[l]/2-u/2,w=t(e.instance.popper),y=parseFloat(w['margin'+f],10),E=parseFloat(w['border'+f+'Width'],10),v=b-e.offsets.popper[m]-y-E;return v=ee(Q(s[l]-u,v),0),e.arrowElement=i,e.offsets.arrow=(n={},le(n,m,$(v)),le(n,h,''),n),e},element:'[x-arrow]'},flip:{order:600,enabled:!0,fn:function(e,t){if(W(e.instance.modifiers,'inner'))return e;if(e.flipped&&e.placement===e.originalPlacement)return e;var o=v(e.instance.popper,e.instance.reference,t.padding,t.boundariesElement,e.positionFixed),n=e.placement.split('-')[0],i=T(n),r=e.placement.split('-')[1]||'',p=[];switch(t.behavior){case ge.FLIP:p=[n,i];break;case ge.CLOCKWISE:p=G(n);break;case ge.COUNTERCLOCKWISE:p=G(n,!0);break;default:p=t.behavior;}return p.forEach(function(s,d){if(n!==s||p.length===d+1)return e;n=e.placement.split('-')[0],i=T(n);var a=e.offsets.popper,l=e.offsets.reference,f=Z,m='left'===n&&f(a.right)>f(l.left)||'right'===n&&f(a.left)f(l.top)||'bottom'===n&&f(a.top)f(o.right),g=f(a.top)f(o.bottom),b='left'===n&&h||'right'===n&&c||'top'===n&&g||'bottom'===n&&u,w=-1!==['top','bottom'].indexOf(n),y=!!t.flipVariations&&(w&&'start'===r&&h||w&&'end'===r&&c||!w&&'start'===r&&g||!w&&'end'===r&&u);(m||b||y)&&(e.flipped=!0,(m||b)&&(n=p[d+1]),y&&(r=z(r)),e.placement=n+(r?'-'+r:''),e.offsets.popper=fe({},e.offsets.popper,D(e.instance.popper,e.offsets.reference,e.placement)),e=P(e.instance.modifiers,e,'flip'))}),e},behavior:'flip',padding:5,boundariesElement:'viewport'},inner:{order:700,enabled:!1,fn:function(e){var t=e.placement,o=t.split('-')[0],n=e.offsets,i=n.popper,r=n.reference,p=-1!==['left','right'].indexOf(o),s=-1===['top','left'].indexOf(o);return i[p?'left':'top']=r[o]-(s?i[p?'width':'height']:0),e.placement=T(t),e.offsets.popper=g(i),e}},hide:{order:800,enabled:!0,fn:function(e){if(!K(e.instance.modifiers,'hide','preventOverflow'))return e;var t=e.offsets.reference,o=C(e.instance.modifiers,function(e){return'preventOverflow'===e.name}).boundaries;if(t.bottomo.right||t.top>o.bottom||t.rightwindow.devicePixelRatio||!me),c='bottom'===o?'top':'bottom',g='right'===n?'left':'right',b=H('transform');if(d='bottom'==c?'HTML'===l.nodeName?-l.clientHeight+h.bottom:-f.height+h.bottom:h.top,s='right'==g?'HTML'===l.nodeName?-l.clientWidth+h.right:-f.width+h.right:h.left,a&&b)m[b]='translate3d('+s+'px, '+d+'px, 0)',m[c]=0,m[g]=0,m.willChange='transform';else{var w='bottom'==c?-1:1,y='right'==g?-1:1;m[c]=d*w,m[g]=s*y,m.willChange=c+', '+g}var E={"x-placement":e.placement};return e.attributes=fe({},E,e.attributes),e.styles=fe({},m,e.styles),e.arrowStyles=fe({},e.offsets.arrow,e.arrowStyles),e},gpuAcceleration:!0,x:'bottom',y:'right'},applyStyle:{order:900,enabled:!0,fn:function(e){return j(e.instance.popper,e.styles),V(e.instance.popper,e.attributes),e.arrowElement&&Object.keys(e.arrowStyles).length&&j(e.arrowElement,e.arrowStyles),e},onLoad:function(e,t,o,n,i){var r=L(i,t,e,o.positionFixed),p=O(o.placement,r,t,e,o.modifiers.flip.boundariesElement,o.modifiers.flip.padding);return t.setAttribute('x-placement',p),j(t,{position:o.positionFixed?'fixed':'absolute'}),o},gpuAcceleration:void 0}}},ue}); +//# sourceMappingURL=popper.min.js.map diff --git a/modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/plugins/copy-to-clipboard/prism-copy-to-clipboard.js b/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/prism-copy-to-clipboard.js similarity index 100% rename from modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/plugins/copy-to-clipboard/prism-copy-to-clipboard.js rename to modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/prism-copy-to-clipboard.js diff --git a/modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-csharp.js b/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/prism-csharp.js similarity index 100% rename from modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/components/prism-csharp.js rename to modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/prism-csharp.js diff --git a/modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/plugins/line-highlight/prism-line-highlight.css b/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/prism-line-highlight.css similarity index 100% rename from modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/plugins/line-highlight/prism-line-highlight.css rename to modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/prism-line-highlight.css diff --git a/modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/plugins/line-highlight/prism-line-highlight.js b/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/prism-line-highlight.js similarity index 100% rename from modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/plugins/line-highlight/prism-line-highlight.js rename to modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/prism-line-highlight.js diff --git a/modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/themes/prism-okaidia.css b/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/prism-okaidia.css similarity index 100% rename from modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/themes/prism-okaidia.css rename to modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/prism-okaidia.css diff --git a/modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/plugins/show-language/prism-show-language.js b/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/prism-show-language.js similarity index 100% rename from modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/plugins/show-language/prism-show-language.js rename to modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/prism-show-language.js diff --git a/modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/plugins/toolbar/prism-toolbar.css b/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/prism-toolbar.css similarity index 100% rename from modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/plugins/toolbar/prism-toolbar.css rename to modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/prism-toolbar.css diff --git a/modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/plugins/toolbar/prism-toolbar.js b/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/prism-toolbar.js similarity index 100% rename from modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/plugins/toolbar/prism-toolbar.js rename to modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/prism-toolbar.js diff --git a/modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/prism.js b/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/prism.js similarity index 100% rename from modules/docs/src/Volo.Docs.Web/wwwroot/lib/prismjs/prism.js rename to modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/prism.js diff --git a/modules/docs/app/Volo.DocsTestApp/yarn.lock b/modules/docs/app/Volo.DocsTestApp/yarn.lock index ac10328960..280e019a52 100644 --- a/modules/docs/app/Volo.DocsTestApp/yarn.lock +++ b/modules/docs/app/Volo.DocsTestApp/yarn.lock @@ -2,31 +2,31 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.basic@^0.3.5": - version "0.3.5" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-0.3.5.tgz#4f6fa79c1d55175a0d7d2a4670a7e5ae896b6402" - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "^0.3.5" - -"@abp/aspnetcore.mvc.ui.theme.shared@^0.3.5": - version "0.3.5" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-0.3.5.tgz#5926165c1bfc7a5e01e3f0d3533f44d7faafd556" - dependencies: - "@abp/aspnetcore.mvc.ui" "^0.3.5" - "@abp/bootstrap" "^0.3.5" - "@abp/datatables.net-bs4" "^0.3.5" - "@abp/font-awesome" "^0.3.5" - "@abp/jquery-form" "^0.3.5" - "@abp/jquery-validation-unobtrusive" "^0.3.5" - "@abp/lodash" "^0.3.5" - "@abp/select2" "^0.3.5" - "@abp/sweetalert" "^0.3.5" - "@abp/timeago" "^0.3.5" - "@abp/toastr" "^0.3.5" - -"@abp/aspnetcore.mvc.ui@^0.3.5": - version "0.3.5" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-0.3.5.tgz#f60217ec953d5b717a89191f4feba80c8ad545d8" +"@abp/aspnetcore.mvc.ui.theme.basic@^0.4.3": + version "0.4.9" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-0.4.9.tgz#926a25c641225598c8666b658c1df3fa7fbed7cf" + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "^0.4.9" + +"@abp/aspnetcore.mvc.ui.theme.shared@^0.4.9": + version "0.4.9" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-0.4.9.tgz#cc8d83162329e3044e12a358c3f3ce6fb3e75f1b" + dependencies: + "@abp/aspnetcore.mvc.ui" "^0.4.9" + "@abp/bootstrap" "^0.4.9" + "@abp/datatables.net-bs4" "^0.4.9" + "@abp/font-awesome" "^0.4.9" + "@abp/jquery-form" "^0.4.9" + "@abp/jquery-validation-unobtrusive" "^0.4.9" + "@abp/lodash" "^0.4.9" + "@abp/select2" "^0.4.9" + "@abp/sweetalert" "^0.4.9" + "@abp/timeago" "^0.4.9" + "@abp/toastr" "^0.4.9" + +"@abp/aspnetcore.mvc.ui@^0.4.3", "@abp/aspnetcore.mvc.ui@^0.4.9": + version "0.4.9" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-0.4.9.tgz#cb7a1905ec003fd459e13e577ef7b3d2ada55f5f" dependencies: ansi-colors "^1.1.0" extend-object "^1.0.0" @@ -35,105 +35,109 @@ path "^0.12.7" rimraf "^2.6.2" -"@abp/bootstrap@^0.3.5": - version "0.3.5" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-0.3.5.tgz#7bf9f16b7d0657ddf38caa97cdb21eb26d758637" +"@abp/bootstrap@^0.4.9": + version "0.4.9" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-0.4.9.tgz#2092858956c9b770509619ffa70d46b382531ce1" dependencies: - "@abp/core" "^0.3.5" + "@abp/core" "^0.4.9" bootstrap "^4.1.1" -"@abp/core@^0.3.5": - version "0.3.5" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-0.3.5.tgz#0e26c03259c10b223465d9cf4f541113ce6a56ae" +"@abp/core@^0.4.9": + version "0.4.9" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-0.4.9.tgz#d644dde25fb9749e4d179bd72729afeae3b6e230" -"@abp/datatables.net-bs4@^0.3.5": - version "0.3.5" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs4/-/datatables.net-bs4-0.3.5.tgz#b0e40c8f2d40113bebaf62c5219c41a8c5e918cd" +"@abp/datatables.net-bs4@^0.4.9": + version "0.4.9" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs4/-/datatables.net-bs4-0.4.9.tgz#a51dcc6c166af8a3126f121cf410a170027e6d11" dependencies: - "@abp/datatables.net" "^0.3.5" + "@abp/datatables.net" "^0.4.9" datatables.net-bs4 "^1.10.16" -"@abp/datatables.net@^0.3.5": - version "0.3.5" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-0.3.5.tgz#784d14462a3e08e7cc921e8d9d0c7f384b8f6e6a" +"@abp/datatables.net@^0.4.9": + version "0.4.9" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-0.4.9.tgz#1c96f4c800b9b05fc0dcec29dac471e1e5c5624a" dependencies: - "@abp/core" "^0.3.5" + "@abp/core" "^0.4.9" datatables.net "^1.10.16" -"@abp/font-awesome@^0.3.5": - version "0.3.5" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-0.3.5.tgz#25385a24d8cbb9475b9d57a51c6402e48963da44" +"@abp/font-awesome@^0.4.9": + version "0.4.9" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-0.4.9.tgz#eb1691ff33be53832b5063aa2a382dc7d65a3f43" dependencies: - "@abp/core" "^0.3.5" + "@abp/core" "^0.4.9" font-awesome "^4.7.0" -"@abp/jquery-form@^0.3.5": - version "0.3.5" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-0.3.5.tgz#ec8315dbf87fa6be841448acd3fbccf51507f6da" +"@abp/jquery-form@^0.4.9": + version "0.4.9" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-0.4.9.tgz#70af1af668f6a55dbadb455f64b6d1cbdc63caf8" dependencies: - "@abp/jquery" "^0.3.5" + "@abp/jquery" "^0.4.9" jquery-form "^4.2.2" -"@abp/jquery-validation-unobtrusive@^0.3.5": - version "0.3.5" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-0.3.5.tgz#6b8b5c821718266ae13e1a3f65da4862ed0a7e6d" +"@abp/jquery-validation-unobtrusive@^0.4.9": + version "0.4.9" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-0.4.9.tgz#3512f1f7fbf9f982b084b8f9cb68f91553dfbcef" dependencies: - "@abp/jquery-validation" "^0.3.5" + "@abp/jquery-validation" "^0.4.9" jquery-validation-unobtrusive "^3.2.9" -"@abp/jquery-validation@^0.3.5": - version "0.3.5" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-0.3.5.tgz#c3f2e3d695f333261cdefadc35c962ebf6f016d3" +"@abp/jquery-validation@^0.4.9": + version "0.4.9" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-0.4.9.tgz#5751da6dac87a6783dd4d1165240b3c29eed3ac3" dependencies: - "@abp/jquery" "^0.3.5" + "@abp/jquery" "^0.4.9" jquery-validation "^1.17.0" -"@abp/jquery@^0.3.5": - version "0.3.5" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-0.3.5.tgz#928252246400ed0c5519dcd3d5fca8be471ce11f" +"@abp/jquery@^0.4.9": + version "0.4.9" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-0.4.9.tgz#4033a4e3d6df643babc6baf29cd47ba5519338f0" dependencies: - "@abp/core" "^0.3.5" + "@abp/core" "^0.4.9" jquery "^3.3.1" -"@abp/lodash@^0.3.5": - version "0.3.5" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-0.3.5.tgz#5cc9397b23be9a3f99e2b20db5b3c1af8d01d06b" +"@abp/lodash@^0.4.9": + version "0.4.9" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-0.4.9.tgz#5d30d2d1f6245bf519160d5ba3ce5f4d08e9b48b" dependencies: - "@abp/core" "^0.3.5" + "@abp/core" "^0.4.9" lodash "^4.17.10" -"@abp/select2@^0.3.5": - version "0.3.5" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-0.3.5.tgz#065727e1948fff2d454ced9183ce03f0b01b377f" +"@abp/select2@^0.4.9": + version "0.4.9" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-0.4.9.tgz#6bbb4d8ffd67876787a400647659f5bb7a1d642d" dependencies: - "@abp/core" "^0.3.5" + "@abp/core" "^0.4.9" select2 "^4.0.5" -"@abp/sweetalert@^0.3.5": - version "0.3.5" - resolved "https://registry.yarnpkg.com/@abp/sweetalert/-/sweetalert-0.3.5.tgz#399f5daad720dd7187abaa191d58928555a26a8f" +"@abp/sweetalert@^0.4.9": + version "0.4.9" + resolved "https://registry.yarnpkg.com/@abp/sweetalert/-/sweetalert-0.4.9.tgz#34cd4f36004229621c454c3d80cc0d2d8d57d42e" dependencies: - "@abp/core" "^0.3.5" + "@abp/core" "^0.4.9" sweetalert "^2.1.0" -"@abp/timeago@^0.3.5": - version "0.3.5" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-0.3.5.tgz#c54080833136da6055fac64d4fbab1da637cb821" +"@abp/timeago@^0.4.9": + version "0.4.9" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-0.4.9.tgz#9314bb2c7194636d2dc294ab0b8a07522e26e905" dependencies: - "@abp/jquery" "^0.3.5" + "@abp/jquery" "^0.4.9" timeago "^1.6.3" -"@abp/toastr@^0.3.5": - version "0.3.5" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-0.3.5.tgz#3584a92dcac7e0694c45364ed604c11c8e6ef009" +"@abp/toastr@^0.4.9": + version "0.4.9" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-0.4.9.tgz#c95703330fefb4e9204292970d17d9facebdffb5" dependencies: - "@abp/jquery" "^0.3.5" + "@abp/jquery" "^0.4.9" toastr "^2.1.4" almond@~0.3.1: version "0.3.3" resolved "https://registry.yarnpkg.com/almond/-/almond-0.3.3.tgz#a0e7c95ac7624d6417b4494b1e68bff693168a20" +anchor-js@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/anchor-js/-/anchor-js-4.1.1.tgz#943b7605e47b3c663e91e82879b682f2e186a5b1" + ansi-colors@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-1.1.0.tgz#6374b4dd5d4718ff3ce27a671a3b1cad077132a9" @@ -281,6 +285,14 @@ class-utils@^0.3.5: isobject "^3.0.0" static-extend "^0.1.1" +clipboard@^2.0.0, clipboard@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/clipboard/-/clipboard-2.0.4.tgz#836dafd66cf0fea5d71ce5d5b0bf6e958009112d" + dependencies: + good-listener "^1.2.2" + select "^1.1.2" + tiny-emitter "^2.0.0" + clone-stats@^0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-0.0.1.tgz#b88f94a82cf38b8791d58046ea4029ad88ca99d1" @@ -372,6 +384,10 @@ define-property@^2.0.2: is-descriptor "^1.0.2" isobject "^3.0.1" +delegate@^3.1.2: + version "3.2.0" + resolved "https://registry.yarnpkg.com/delegate/-/delegate-3.2.0.tgz#b66b71c3158522e8ab5744f720d8ca0c2af59166" + deprecated@^0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/deprecated/-/deprecated-0.0.1.tgz#f9c9af5464afa1e7a971458a8bdef2aa94d5bb19" @@ -617,6 +633,12 @@ glogg@^1.0.0: dependencies: sparkles "^1.0.0" +good-listener@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/good-listener/-/good-listener-1.2.2.tgz#d53b30cdf9313dffb7dc9a0d477096aa6d145c50" + dependencies: + delegate "^3.1.2" + graceful-fs@^3.0.0: version "3.0.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-3.0.11.tgz#7613c778a1afea62f25c630a086d7f3acbbdd818" @@ -887,7 +909,7 @@ jquery-form@^4.2.2: dependencies: jquery ">=1.7.2" -jquery-mousewheel@~3.1.13: +jquery-mousewheel@>=3.0.6, jquery-mousewheel@~3.1.13: version "3.1.13" resolved "https://registry.yarnpkg.com/jquery-mousewheel/-/jquery-mousewheel-3.1.13.tgz#06f0335f16e353a695e7206bf50503cb523a6ee5" @@ -1042,6 +1064,12 @@ make-iterator@^1.0.0: dependencies: kind-of "^6.0.2" +malihu-custom-scrollbar-plugin@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-3.1.5.tgz#310cecc5e59415a1c29e9dfb5d2b6e01d66a29ef" + dependencies: + jquery-mousewheel ">=3.0.6" + map-cache@^0.2.0, map-cache@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" @@ -1256,6 +1284,10 @@ path@^0.12.7: process "^0.11.1" util "^0.10.3" +popper.js@^1.14.6: + version "1.14.6" + resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.14.6.tgz#ab20dd4edf9288b8b3b6531c47c361107b60b4b0" + posix-character-classes@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" @@ -1264,6 +1296,12 @@ pretty-hrtime@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1" +prismjs@^1.15.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.15.0.tgz#8801d332e472091ba8def94976c8877ad60398d9" + optionalDependencies: + clipboard "^2.0.0" + process-nextick-args@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" @@ -1375,6 +1413,10 @@ select2@^4.0.5: almond "~0.3.1" jquery-mousewheel "~3.1.13" +select@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/select/-/select-1.1.2.tgz#0e7350acdec80b1108528786ec1d4418d11b396d" + semver@^4.1.0: version "4.3.6" resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" @@ -1535,6 +1577,10 @@ timeago@^1.6.3: dependencies: jquery ">=1.2.3" +tiny-emitter@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/tiny-emitter/-/tiny-emitter-2.0.2.tgz#82d27468aca5ade8e5fd1e6d22b57dd43ebdfb7c" + to-object-path@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" diff --git a/modules/docs/src/Volo.Docs.Application/Volo/Docs/Projects/ProjectAppService.cs b/modules/docs/src/Volo.Docs.Application/Volo/Docs/Projects/ProjectAppService.cs index 2ce6f055c0..974a636af1 100644 --- a/modules/docs/src/Volo.Docs.Application/Volo/Docs/Projects/ProjectAppService.cs +++ b/modules/docs/src/Volo.Docs.Application/Volo/Docs/Projects/ProjectAppService.cs @@ -51,7 +51,7 @@ namespace Volo.Docs.Projects () => GetVersionsAsync(project), () => new DistributedCacheEntryOptions { - SlidingExpiration = TimeSpan.FromDays(2) + SlidingExpiration = TimeSpan.FromSeconds(2) } ); diff --git a/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml b/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml index 00493c6b23..239f5cca56 100644 --- a/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml +++ b/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml @@ -14,26 +14,26 @@ @section styles { - - - - - + + + + + } @section scripts { - - - - - - - - - - - + + + + + + + + + + + diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/bootstrap-toc/bootstrap-toc.css b/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/bootstrap-toc.css similarity index 56% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/bootstrap-toc/bootstrap-toc.css rename to modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/bootstrap-toc.css index 99943aa0a6..a2f7903f73 100644 --- a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/bootstrap-toc/bootstrap-toc.css +++ b/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/bootstrap-toc.css @@ -1,5 +1,5 @@ -/*! - * Bootstrap Table of Contents v1.0.0 (http://afeld.github.io/bootstrap-toc/) +/*! + * Bootstrap Table of Contents v<%= version %> (http://afeld.github.io/bootstrap-toc/) * Copyright 2015 Aidan Feldman * Licensed under MIT (https://github.com/afeld/bootstrap-toc/blob/gh-pages/LICENSE.md) */ @@ -7,54 +7,54 @@ /* All levels of nav */ nav[data-toggle='toc'] .nav > li > a { - display: block; - padding: 4px 20px; - font-size: 13px; - font-weight: 500; - color: #767676; + display: block; + padding: 4px 20px; + font-size: 13px; + font-weight: 500; + color: #767676; } nav[data-toggle='toc'] .nav > li > a:hover, nav[data-toggle='toc'] .nav > li > a:focus { - padding-left: 19px; - color: #563d7c; - text-decoration: none; - background-color: transparent; - border-left: 1px solid #563d7c; + padding-left: 19px; + color: #563d7c; + text-decoration: none; + background-color: transparent; + border-left: 1px solid #563d7c; } nav[data-toggle='toc'] .nav-link.active, nav[data-toggle='toc'] .nav-link.active:hover, nav[data-toggle='toc'] .nav-link.active:focus { - padding-left: 18px; - font-weight: bold; - color: #563d7c; - background-color: transparent; - border-left: 2px solid #563d7c; + padding-left: 18px; + font-weight: bold; + color: #563d7c; + background-color: transparent; + border-left: 2px solid #563d7c; } /* Nav: second level (shown on .active) */ nav[data-toggle='toc'] .nav-link + ul { - display: none; /* Hide by default, but at >768px, show it */ - padding-bottom: 10px; + display: none; /* Hide by default, but at >768px, show it */ + padding-bottom: 10px; } nav[data-toggle='toc'] .nav .nav > li > a { - padding-top: 1px; - padding-bottom: 1px; - padding-left: 30px; - font-size: 12px; - font-weight: normal; + padding-top: 1px; + padding-bottom: 1px; + padding-left: 30px; + font-size: 12px; + font-weight: normal; } nav[data-toggle='toc'] .nav .nav > li > a:hover, nav[data-toggle='toc'] .nav .nav > li > a:focus { - padding-left: 29px; + padding-left: 29px; } nav[data-toggle='toc'] .nav .nav > li > .active, nav[data-toggle='toc'] .nav .nav > li > .active:hover, nav[data-toggle='toc'] .nav .nav > li > .active:focus { - padding-left: 28px; - font-weight: 500; + padding-left: 28px; + font-weight: 500; } nav[data-toggle='toc'] .nav-link.active + ul { - display: block; -} + display: block; +} \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/bootstrap-toc.js b/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/bootstrap-toc.js new file mode 100644 index 0000000000..3b92bf5e7e --- /dev/null +++ b/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/bootstrap-toc.js @@ -0,0 +1,159 @@ +/*! + * Bootstrap Table of Contents v1.0.0 (http://afeld.github.io/bootstrap-toc/) + * Copyright 2015 Aidan Feldman + * Licensed under MIT (https://github.com/afeld/bootstrap-toc/blob/gh-pages/LICENSE.md) */ +(function ($) { + 'use strict'; + + window.Toc = { + helpers: { + // return all matching elements in the set, or their descendants + findOrFilter: function ($el, selector) { + // http://danielnouri.org/notes/2011/03/14/a-jquery-find-that-also-finds-the-root-element/ + // http://stackoverflow.com/a/12731439/358804 + var $descendants = $el.find(selector); + return $el.filter(selector).add($descendants).filter(':not([data-toc-skip])'); + }, + + generateUniqueIdBase: function (el) { + var text = $(el).text(); + var anchor = text.trim().toLowerCase().replace(/[^A-Za-z0-9]+/g, '-'); + return anchor || el.tagName.toLowerCase(); + }, + + generateUniqueId: function (el) { + var anchorBase = this.generateUniqueIdBase(el); + for (var i = 0; ; i++) { + var anchor = anchorBase; + if (i > 0) { + // add suffix + anchor += '-' + i; + } + // check if ID already exists + if (!document.getElementById(anchor)) { + return anchor; + } + } + }, + + generateAnchor: function (el) { + if (el.id) { + return el.id; + } else { + var anchor = this.generateUniqueId(el); + el.id = anchor; + return anchor; + } + }, + + createNavList: function () { + return $(''); + }, + + createChildNavList: function ($parent) { + var $childList = this.createNavList(); + $parent.append($childList); + return $childList; + }, + + generateNavEl: function (anchor, text) { + var $a = $(''); + $a.attr('href', '#' + anchor); + $a.text(text); + var $li = $('
  • '); + $li.append($a); + return $li; + }, + + generateNavItem: function (headingEl) { + var anchor = this.generateAnchor(headingEl); + var $heading = $(headingEl); + var text = $heading.data('toc-text') || $heading.text(); + return this.generateNavEl(anchor, text); + }, + + // Find the first heading level (`

    `, then `

    `, etc.) that has more than one element. Defaults to 1 (for `

    `). + getTopLevel: function ($scope) { + for (var i = 1; i <= 6; i++) { + var $headings = this.findOrFilter($scope, 'h' + i); + if ($headings.length > 1) { + return i; + } + } + + return 1; + }, + + // returns the elements for the top level, and the next below it + getHeadings: function ($scope, topLevel) { + var topSelector = 'h' + topLevel; + + var secondaryLevel = topLevel + 1; + var secondarySelector = 'h' + secondaryLevel; + + return this.findOrFilter($scope, topSelector + ',' + secondarySelector); + }, + + getNavLevel: function (el) { + return parseInt(el.tagName.charAt(1), 10); + }, + + populateNav: function ($topContext, topLevel, $headings) { + var $context = $topContext; + var $prevNav; + + var helpers = this; + $headings.each(function (i, el) { + var $newNav = helpers.generateNavItem(el); + var navLevel = helpers.getNavLevel(el); + + // determine the proper $context + if (navLevel === topLevel) { + // use top level + $context = $topContext; + } else if ($prevNav && $context === $topContext) { + // create a new level of the tree and switch to it + $context = helpers.createChildNavList($prevNav); + } // else use the current $context + + $context.append($newNav); + + $prevNav = $newNav; + }); + }, + + parseOps: function (arg) { + var opts; + if (arg.jquery) { + opts = { + $nav: arg + }; + } else { + opts = arg; + } + opts.$scope = opts.$scope || $(document.body); + return opts; + } + }, + + // accepts a jQuery object, or an options object + init: function (opts) { + opts = this.helpers.parseOps(opts); + + // ensure that the data attribute is in place for styling + opts.$nav.attr('data-toggle', 'toc'); + + var $topContext = this.helpers.createChildNavList(opts.$nav); + var topLevel = this.helpers.getTopLevel(opts.$scope); + var $headings = this.helpers.getHeadings(opts.$scope, topLevel); + this.helpers.populateNav($topContext, topLevel, $headings); + } + }; + + $(function () { + $('nav[data-toggle="toc"]').each(function (i, el) { + var $nav = $(el); + Toc.init($nav); + }); + }); +})(jQuery); \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/bootstrap-toc.less b/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/bootstrap-toc.less new file mode 100644 index 0000000000..d819f85ccc --- /dev/null +++ b/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/bootstrap-toc.less @@ -0,0 +1,110 @@ +@color_1: #767676; +@color_2: #563d7c; +@background_color_1: transparent; + +/*! + * Bootstrap Table of Contents v<%= version %> (http://afeld.github.io/bootstrap-toc/) + * Copyright 2015 Aidan Feldman + * Licensed under MIT (https://github.com/afeld/bootstrap-toc/blob/gh-pages/LICENSE.md) */ +/* modified from https://github.com/twbs/bootstrap/blob/94b4076dd2efba9af71f0b18d4ee4b163aa9e0dd/docs/assets/css/src/docs.css#L548-L601 */ +/* All levels of nav */ +/* Nav: second level (shown on .active) */ +nav[data-toggle='toc'] { + .nav { + > li { + > a { + display: block; + padding: 4px 20px; + font-size: 13px; + font-weight: 500; + color: @color_1; + + &:hover { + padding-left: 19px; + color: @color_2; + text-decoration: none; + background-color: @background_color_1; + border-left: 1px solid #563d7c; + } + + &:focus { + padding-left: 19px; + color: @color_2; + text-decoration: none; + background-color: @background_color_1; + border-left: 1px solid #563d7c; + } + } + } + + .nav { + > li { + > a { + padding-top: 1px; + padding-bottom: 1px; + padding-left: 30px; + font-size: 12px; + font-weight: normal; + + &:hover { + padding-left: 29px; + } + + &:focus { + padding-left: 29px; + } + } + + > .active { + padding-left: 28px; + font-weight: 500; + + &:hover { + padding-left: 28px; + font-weight: 500; + } + + &:focus { + padding-left: 28px; + font-weight: 500; + } + } + } + } + } + + .nav-link.active { + padding-left: 18px; + font-weight: bold; + color: @color_2; + background-color: @background_color_1; + border-left: 2px solid #563d7c; + + &:hover { + padding-left: 18px; + font-weight: bold; + color: @color_2; + background-color: @background_color_1; + border-left: 2px solid #563d7c; + } + + &:focus { + padding-left: 18px; + font-weight: bold; + color: @color_2; + background-color: @background_color_1; + border-left: 2px solid #563d7c; + } + + & + ul { + display: block; + } + } + + .nav-link { + & + ul { + display: none; + padding-bottom: 10px; + } + } +} diff --git a/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/bootstrap-toc.min.css b/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/bootstrap-toc.min.css new file mode 100644 index 0000000000..e01dffc122 --- /dev/null +++ b/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/bootstrap-toc.min.css @@ -0,0 +1 @@ +nav[data-toggle=toc] .nav>li>a{display:block;padding:4px 20px;font-size:13px;font-weight:500;color:#767676}nav[data-toggle=toc] .nav>li>a:focus,nav[data-toggle=toc] .nav>li>a:hover{padding-left:19px;color:#563d7c;text-decoration:none;background-color:transparent;border-left:1px solid #563d7c}nav[data-toggle=toc] .nav-link.active,nav[data-toggle=toc] .nav-link.active:focus,nav[data-toggle=toc] .nav-link.active:hover{padding-left:18px;font-weight:700;color:#563d7c;background-color:transparent;border-left:2px solid #563d7c}nav[data-toggle=toc] .nav-link+ul{display:none;padding-bottom:10px}nav[data-toggle=toc] .nav .nav>li>a{padding-top:1px;padding-bottom:1px;padding-left:30px;font-size:12px;font-weight:400}nav[data-toggle=toc] .nav .nav>li>a:focus,nav[data-toggle=toc] .nav .nav>li>a:hover{padding-left:29px}nav[data-toggle=toc] .nav .nav>li>.active,nav[data-toggle=toc] .nav .nav>li>.active:focus,nav[data-toggle=toc] .nav .nav>li>.active:hover{padding-left:28px;font-weight:500}nav[data-toggle=toc] .nav-link.active+ul{display:block} \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/index.js b/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/index.js index 7ef3529ad1..0ac501cc94 100644 --- a/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/index.js +++ b/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/index.js @@ -82,4 +82,5 @@ initAnchorTags(".docs-page .docs-body"); }); -})(jQuery); \ No newline at end of file +})(jQuery); + diff --git a/modules/docs/src/Volo.Docs.Web/Volo.Docs.Web.csproj b/modules/docs/src/Volo.Docs.Web/Volo.Docs.Web.csproj index a9d8487dff..5897dec291 100644 --- a/modules/docs/src/Volo.Docs.Web/Volo.Docs.Web.csproj +++ b/modules/docs/src/Volo.Docs.Web/Volo.Docs.Web.csproj @@ -40,6 +40,9 @@ + + + diff --git a/modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/.bower.json b/modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/.bower.json deleted file mode 100644 index 3632626c5d..0000000000 --- a/modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/.bower.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "name": "anchor-js", - "version": "4.1.0", - "authors": [ - "Bryan Braun" - ], - "description": "A Javascript utility for adding deep anchor links to online docs.", - "main": "anchor.js", - "license": "MIT", - "homepage": "https://github.com/bryanbraun/anchorjs", - "ignore": [ - "**/.*", - "node_modules", - "bower_components", - "test", - "tests", - "package.json" - ], - "_release": "4.1.0", - "_resolution": { - "type": "version", - "tag": "4.1.0", - "commit": "848ef8ca7e8bbd5edb032b6c3623f05aefb5ef0b" - }, - "_source": "https://github.com/bryanbraun/anchorjs.git", - "_target": "^4.1.0", - "_originalSource": "anchor-js", - "_direct": true -} \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/README.md b/modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/README.md deleted file mode 100644 index 33da96e2f1..0000000000 --- a/modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/README.md +++ /dev/null @@ -1,53 +0,0 @@ -# AnchorJS [![Build Status](https://img.shields.io/travis/bryanbraun/anchorjs/master.svg?style=flat)](https://travis-ci.org/bryanbraun/anchorjs) - -A JavaScript utility for adding deep anchor links ([like these](http://ux.stackexchange.com/q/36304/33248)) to existing page content. AnchorJS is lightweight, accessible, and has no dependencies. - -**[See Live Examples in the Documentation](http://bryanbraun.github.io/anchorjs#examples).** - -![Anchoring links](docs/img/anchoring-links.png) - -## Installation - -Download AnchorJS using npm, - -```bash -npm install anchor-js -``` - -or bower: - -```bash -bower install anchor-js --save-dev -``` - -(or just [download it from github](https://github.com/bryanbraun/anchorjs/releases)). - -Then include the anchor.js file (or anchor.min.js) in your webpage. - -```html - -``` - -You could also include it via a CDN like [CDNJS](https://cdnjs.com/libraries/anchor-js) or [jsDelivr](http://www.jsdelivr.com/projects/anchorjs). - -## Usage -See **[the Documentation](http://bryanbraun.github.io/anchorjs#basic-usage)** for detailed instructions. - -## Compatibility -Currently Supports: IE9+ and modern browsers - -## Contributing [![devDependency Status](https://img.shields.io/david/dev/bryanbraun/anchorjs.svg?style=flat)](https://david-dm.org/bryanbraun/anchorjs#info=devDependencies) -To contribute: - -1. Fork/Clone the repo. -2. Make your changes. -3. Write tests as needed. -4. Run tests locally to confirm everything is working: - - Install phantomjs: `brew install phantomjs` - - Install test modules: Run `npm install` - - Run all tests: `npm test` -5. Minify the code: `npm run release` -6. Submit a Pull Request. - -## License -Licensed with the [MIT License](http://opensource.org/licenses/MIT). diff --git a/modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/anchor.min.js b/modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/anchor.min.js deleted file mode 100644 index ee4e3b3f4d..0000000000 --- a/modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/anchor.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/** - * AnchorJS - v4.1.0 - 2017-09-20 - * https://github.com/bryanbraun/anchorjs - * Copyright (c) 2017 Bryan Braun; Licensed MIT - */ -!function(A,e){"use strict";"function"==typeof define&&define.amd?define([],e):"object"==typeof module&&module.exports?module.exports=e():(A.AnchorJS=e(),A.anchors=new A.AnchorJS)}(this,function(){"use strict";return function(A){function e(A){A.icon=A.hasOwnProperty("icon")?A.icon:"",A.visible=A.hasOwnProperty("visible")?A.visible:"hover",A.placement=A.hasOwnProperty("placement")?A.placement:"right",A.ariaLabel=A.hasOwnProperty("ariaLabel")?A.ariaLabel:"Anchor",A.class=A.hasOwnProperty("class")?A.class:"",A.truncate=A.hasOwnProperty("truncate")?Math.floor(A.truncate):64}function t(A){var e;if("string"==typeof A||A instanceof String)e=[].slice.call(document.querySelectorAll(A));else{if(!(Array.isArray(A)||A instanceof NodeList))throw new Error("The selector provided to AnchorJS was invalid.");e=[].slice.call(A)}return e}function i(){if(null===document.head.querySelector("style.anchorjs")){var A,e=document.createElement("style");e.className="anchorjs",e.appendChild(document.createTextNode("")),void 0===(A=document.head.querySelector('[rel="stylesheet"], style'))?document.head.appendChild(e):document.head.insertBefore(e,A),e.sheet.insertRule(" .anchorjs-link { opacity: 0; text-decoration: none; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; }",e.sheet.cssRules.length),e.sheet.insertRule(" *:hover > .anchorjs-link, .anchorjs-link:focus { opacity: 1; }",e.sheet.cssRules.length),e.sheet.insertRule(" [data-anchorjs-icon]::after { content: attr(data-anchorjs-icon); }",e.sheet.cssRules.length),e.sheet.insertRule(' @font-face { font-family: "anchorjs-icons"; src: url(data:n/a;base64,AAEAAAALAIAAAwAwT1MvMg8yG2cAAAE4AAAAYGNtYXDp3gC3AAABpAAAAExnYXNwAAAAEAAAA9wAAAAIZ2x5ZlQCcfwAAAH4AAABCGhlYWQHFvHyAAAAvAAAADZoaGVhBnACFwAAAPQAAAAkaG10eASAADEAAAGYAAAADGxvY2EACACEAAAB8AAAAAhtYXhwAAYAVwAAARgAAAAgbmFtZQGOH9cAAAMAAAAAunBvc3QAAwAAAAADvAAAACAAAQAAAAEAAHzE2p9fDzz1AAkEAAAAAADRecUWAAAAANQA6R8AAAAAAoACwAAAAAgAAgAAAAAAAAABAAADwP/AAAACgAAA/9MCrQABAAAAAAAAAAAAAAAAAAAAAwABAAAAAwBVAAIAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAMCQAGQAAUAAAKZAswAAACPApkCzAAAAesAMwEJAAAAAAAAAAAAAAAAAAAAARAAAAAAAAAAAAAAAAAAAAAAQAAg//0DwP/AAEADwABAAAAAAQAAAAAAAAAAAAAAIAAAAAAAAAIAAAACgAAxAAAAAwAAAAMAAAAcAAEAAwAAABwAAwABAAAAHAAEADAAAAAIAAgAAgAAACDpy//9//8AAAAg6cv//f///+EWNwADAAEAAAAAAAAAAAAAAAAACACEAAEAAAAAAAAAAAAAAAAxAAACAAQARAKAAsAAKwBUAAABIiYnJjQ3NzY2MzIWFxYUBwcGIicmNDc3NjQnJiYjIgYHBwYUFxYUBwYGIwciJicmNDc3NjIXFhQHBwYUFxYWMzI2Nzc2NCcmNDc2MhcWFAcHBgYjARQGDAUtLXoWOR8fORYtLTgKGwoKCjgaGg0gEhIgDXoaGgkJBQwHdR85Fi0tOAobCgoKOBoaDSASEiANehoaCQkKGwotLXoWOR8BMwUFLYEuehYXFxYugC44CQkKGwo4GkoaDQ0NDXoaShoKGwoFBe8XFi6ALjgJCQobCjgaShoNDQ0NehpKGgobCgoKLYEuehYXAAAADACWAAEAAAAAAAEACAAAAAEAAAAAAAIAAwAIAAEAAAAAAAMACAAAAAEAAAAAAAQACAAAAAEAAAAAAAUAAQALAAEAAAAAAAYACAAAAAMAAQQJAAEAEAAMAAMAAQQJAAIABgAcAAMAAQQJAAMAEAAMAAMAAQQJAAQAEAAMAAMAAQQJAAUAAgAiAAMAAQQJAAYAEAAMYW5jaG9yanM0MDBAAGEAbgBjAGgAbwByAGoAcwA0ADAAMABAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAH//wAP) format("truetype"); }',e.sheet.cssRules.length)}}this.options=A||{},this.elements=[],e(this.options),this.isTouchDevice=function(){return!!("ontouchstart"in window||window.DocumentTouch&&document instanceof DocumentTouch)},this.add=function(A){var n,o,s,a,r,c,h,l,u,d,f,p=[];if(e(this.options),"touch"===(f=this.options.visible)&&(f=this.isTouchDevice()?"always":"hover"),A||(A="h2, h3, h4, h5, h6"),0===(n=t(A)).length)return this;for(i(),o=document.querySelectorAll("[id]"),s=[].map.call(o,function(A){return A.id}),r=0;r\]\.\/\(\)\*\\]/g;return this.options.truncate||e(this.options),A.trim().replace(/\'/gi,"").replace(t,"-").replace(/-{2,}/g,"-").substring(0,this.options.truncate).replace(/^-+|-+$/gm,"").toLowerCase()},this.hasAnchorJSLink=function(A){var e=A.firstChild&&(" "+A.firstChild.className+" ").indexOf(" anchorjs-link ")>-1,t=A.lastChild&&(" "+A.lastChild.className+" ").indexOf(" anchorjs-link ")>-1;return e||t||!1}}}); \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/banner.js b/modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/banner.js deleted file mode 100644 index 6bd551ef94..0000000000 --- a/modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/banner.js +++ /dev/null @@ -1,17 +0,0 @@ -const fs = require('fs'); -const pkg = require('./package.json'); -const filename = 'anchor.min.js'; -const script = fs.readFileSync(filename); -const padStart = str => ('0' + str).slice(-2) -const dateObj = new Date; -const date = `${dateObj.getFullYear()}-${padStart(dateObj.getMonth() + 1)}-${padStart(dateObj.getDate())}`; -const banner = `/** - * AnchorJS - v${pkg.version} - ${date} - * ${pkg.homepage} - * Copyright (c) ${dateObj.getFullYear()} Bryan Braun; Licensed ${pkg.license} - */ -`; - -if (script.slice(0, 3) != '/**') { - fs.writeFileSync(filename, banner + script); -} diff --git a/modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/bower.json b/modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/bower.json deleted file mode 100644 index bb80f99dce..0000000000 --- a/modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/bower.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "name": "anchor-js", - "version": "4.1.0", - "authors": [ - "Bryan Braun" - ], - "description": "A Javascript utility for adding deep anchor links to online docs.", - "main": "anchor.js", - "license": "MIT", - "homepage": "https://github.com/bryanbraun/anchorjs", - "ignore": [ - "**/.*", - "node_modules", - "bower_components", - "test", - "tests", - "package.json" - ] -} diff --git a/modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/docs/anchor.js b/modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/docs/anchor.js deleted file mode 100644 index 5813b98ed0..0000000000 --- a/modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/docs/anchor.js +++ /dev/null @@ -1,335 +0,0 @@ -/* eslint-env amd, node */ - -// https://github.com/umdjs/umd/blob/master/templates/returnExports.js -(function (root, factory) { - 'use strict'; - - if (typeof define === 'function' && define.amd) { - // AMD. Register as an anonymous module. - define([], factory); - } else if (typeof module === 'object' && module.exports) { - // Node. Does not work with strict CommonJS, but - // only CommonJS-like environments that support module.exports, - // like Node. - module.exports = factory(); - } else { - // Browser globals (root is window) - root.AnchorJS = factory(); - root.anchors = new root.AnchorJS(); - } -}(this, function () { - 'use strict'; - - function AnchorJS(options) { - this.options = options || {}; - this.elements = []; - - /** - * Assigns options to the internal options object, and provides defaults. - * @param {Object} opts - Options object - */ - function _applyRemainingDefaultOptions(opts) { - opts.icon = opts.hasOwnProperty('icon') ? opts.icon : '\ue9cb'; // Accepts characters (and also URLs?), like '#', '¶', '❡', or '§'. - opts.visible = opts.hasOwnProperty('visible') ? opts.visible : 'hover'; // Also accepts 'always' & 'touch' - opts.placement = opts.hasOwnProperty('placement') ? opts.placement : 'right'; // Also accepts 'left' - opts.ariaLabel = opts.hasOwnProperty('ariaLabel') ? opts.ariaLabel : 'Anchor'; // Accepts any text. - opts.class = opts.hasOwnProperty('class') ? opts.class : ''; // Accepts any class name. - // Using Math.floor here will ensure the value is Number-cast and an integer. - opts.truncate = opts.hasOwnProperty('truncate') ? Math.floor(opts.truncate) : 64; // Accepts any value that can be typecast to a number. - } - - _applyRemainingDefaultOptions(this.options); - - /** - * Checks to see if this device supports touch. Uses criteria pulled from Modernizr: - * https://github.com/Modernizr/Modernizr/blob/da22eb27631fc4957f67607fe6042e85c0a84656/feature-detects/touchevents.js#L40 - * @return {Boolean} - true if the current device supports touch. - */ - this.isTouchDevice = function() { - return !!(('ontouchstart' in window) || window.DocumentTouch && document instanceof DocumentTouch); - }; - - /** - * Add anchor links to page elements. - * @param {String|Array|Nodelist} selector - A CSS selector for targeting the elements you wish to add anchor links - * to. Also accepts an array or nodeList containing the relavant elements. - * @return {this} - The AnchorJS object - */ - this.add = function(selector) { - var elements, - elsWithIds, - idList, - elementID, - i, - index, - count, - tidyText, - newTidyText, - readableID, - anchor, - visibleOptionToUse, - indexesToDrop = []; - - // We reapply options here because somebody may have overwritten the default options object when setting options. - // For example, this overwrites all options but visible: - // - // anchors.options = { visible: 'always'; } - _applyRemainingDefaultOptions(this.options); - - visibleOptionToUse = this.options.visible; - if (visibleOptionToUse === 'touch') { - visibleOptionToUse = this.isTouchDevice() ? 'always' : 'hover'; - } - - // Provide a sensible default selector, if none is given. - if (!selector) { - selector = 'h2, h3, h4, h5, h6'; - } - - elements = _getElements(selector); - - if (elements.length === 0) { - return this; - } - - _addBaselineStyles(); - - // We produce a list of existing IDs so we don't generate a duplicate. - elsWithIds = document.querySelectorAll('[id]'); - idList = [].map.call(elsWithIds, function assign(el) { - return el.id; - }); - - for (i = 0; i < elements.length; i++) { - if (this.hasAnchorJSLink(elements[i])) { - indexesToDrop.push(i); - continue; - } - - if (elements[i].hasAttribute('id')) { - elementID = elements[i].getAttribute('id'); - } else if (elements[i].hasAttribute('data-anchor-id')) { - elementID = elements[i].getAttribute('data-anchor-id'); - } else { - tidyText = this.urlify(elements[i].textContent); - - // Compare our generated ID to existing IDs (and increment it if needed) - // before we add it to the page. - newTidyText = tidyText; - count = 0; - do { - if (index !== undefined) { - newTidyText = tidyText + '-' + count; - } - - index = idList.indexOf(newTidyText); - count += 1; - } while (index !== -1); - index = undefined; - idList.push(newTidyText); - - elements[i].setAttribute('id', newTidyText); - elementID = newTidyText; - } - - readableID = elementID.replace(/-/g, ' '); - - // The following code builds the following DOM structure in a more effiecient (albeit opaque) way. - // ''; - anchor = document.createElement('a'); - anchor.className = 'anchorjs-link ' + this.options.class; - anchor.href = '#' + elementID; - anchor.setAttribute('aria-label', this.options.ariaLabel); - anchor.setAttribute('data-anchorjs-icon', this.options.icon); - - if (visibleOptionToUse === 'always') { - anchor.style.opacity = '1'; - } - - if (this.options.icon === '\ue9cb') { - anchor.style.font = '1em/1 anchorjs-icons'; - - // We set lineHeight = 1 here because the `anchorjs-icons` font family could otherwise affect the - // height of the heading. This isn't the case for icons with `placement: left`, so we restore - // line-height: inherit in that case, ensuring they remain positioned correctly. For more info, - // see https://github.com/bryanbraun/anchorjs/issues/39. - if (this.options.placement === 'left') { - anchor.style.lineHeight = 'inherit'; - } - } - - if (this.options.placement === 'left') { - anchor.style.position = 'absolute'; - anchor.style.marginLeft = '-1em'; - anchor.style.paddingRight = '0.5em'; - elements[i].insertBefore(anchor, elements[i].firstChild); - } else { // if the option provided is `right` (or anything else). - anchor.style.paddingLeft = '0.375em'; - elements[i].appendChild(anchor); - } - } - - for (i = 0; i < indexesToDrop.length; i++) { - elements.splice(indexesToDrop[i] - i, 1); - } - this.elements = this.elements.concat(elements); - - return this; - }; - - /** - * Removes all anchorjs-links from elements targed by the selector. - * @param {String|Array|Nodelist} selector - A CSS selector string targeting elements with anchor links, - * OR a nodeList / array containing the DOM elements. - * @return {this} - The AnchorJS object - */ - this.remove = function(selector) { - var index, - domAnchor, - elements = _getElements(selector); - - for (var i = 0; i < elements.length; i++) { - domAnchor = elements[i].querySelector('.anchorjs-link'); - if (domAnchor) { - // Drop the element from our main list, if it's in there. - index = this.elements.indexOf(elements[i]); - if (index !== -1) { - this.elements.splice(index, 1); - } - // Remove the anchor from the DOM. - elements[i].removeChild(domAnchor); - } - } - return this; - }; - - /** - * Removes all anchorjs links. Mostly used for tests. - */ - this.removeAll = function() { - this.remove(this.elements); - }; - - /** - * Urlify - Refine text so it makes a good ID. - * - * To do this, we remove apostrophes, replace nonsafe characters with hyphens, - * remove extra hyphens, truncate, trim hyphens, and make lowercase. - * - * @param {String} text - Any text. Usually pulled from the webpage element we are linking to. - * @return {String} - hyphen-delimited text for use in IDs and URLs. - */ - this.urlify = function(text) { - // Regex for finding the nonsafe URL characters (many need escaping): & +$,:;=?@"#{}|^~[`%!'<>]./()*\ - var nonsafeChars = /[& +$,:;=?@"#{}|^~[`%!'<>\]\.\/\(\)\*\\]/g, - urlText; - - // The reason we include this _applyRemainingDefaultOptions is so urlify can be called independently, - // even after setting options. This can be useful for tests or other applications. - if (!this.options.truncate) { - _applyRemainingDefaultOptions(this.options); - } - - // Note: we trim hyphens after truncating because truncating can cause dangling hyphens. - // Example string: // " ⚡⚡ Don't forget: URL fragments should be i18n-friendly, hyphenated, short, and clean." - urlText = text.trim() // "⚡⚡ Don't forget: URL fragments should be i18n-friendly, hyphenated, short, and clean." - .replace(/\'/gi, '') // "⚡⚡ Dont forget: URL fragments should be i18n-friendly, hyphenated, short, and clean." - .replace(nonsafeChars, '-') // "⚡⚡-Dont-forget--URL-fragments-should-be-i18n-friendly--hyphenated--short--and-clean-" - .replace(/-{2,}/g, '-') // "⚡⚡-Dont-forget-URL-fragments-should-be-i18n-friendly-hyphenated-short-and-clean-" - .substring(0, this.options.truncate) // "⚡⚡-Dont-forget-URL-fragments-should-be-i18n-friendly-hyphenated-" - .replace(/^-+|-+$/gm, '') // "⚡⚡-Dont-forget-URL-fragments-should-be-i18n-friendly-hyphenated" - .toLowerCase(); // "⚡⚡-dont-forget-url-fragments-should-be-i18n-friendly-hyphenated" - - return urlText; - }; - - /** - * Determines if this element already has an AnchorJS link on it. - * Uses this technique: http://stackoverflow.com/a/5898748/1154642 - * @param {HTMLElemnt} el - a DOM node - * @return {Boolean} true/false - */ - this.hasAnchorJSLink = function(el) { - var hasLeftAnchor = el.firstChild && ((' ' + el.firstChild.className + ' ').indexOf(' anchorjs-link ') > -1), - hasRightAnchor = el.lastChild && ((' ' + el.lastChild.className + ' ').indexOf(' anchorjs-link ') > -1); - - return hasLeftAnchor || hasRightAnchor || false; - }; - - /** - * Turns a selector, nodeList, or array of elements into an array of elements (so we can use array methods). - * It also throws errors on any other inputs. Used to handle inputs to .add and .remove. - * @param {String|Array|Nodelist} input - A CSS selector string targeting elements with anchor links, - * OR a nodeList / array containing the DOM elements. - * @return {Array} - An array containing the elements we want. - */ - function _getElements(input) { - var elements; - if (typeof input === 'string' || input instanceof String) { - // See https://davidwalsh.name/nodelist-array for the technique transforming nodeList -> Array. - elements = [].slice.call(document.querySelectorAll(input)); - // I checked the 'input instanceof NodeList' test in IE9 and modern browsers and it worked for me. - } else if (Array.isArray(input) || input instanceof NodeList) { - elements = [].slice.call(input); - } else { - throw new Error('The selector provided to AnchorJS was invalid.'); - } - return elements; - } - - /** - * _addBaselineStyles - * Adds baseline styles to the page, used by all AnchorJS links irregardless of configuration. - */ - function _addBaselineStyles() { - // We don't want to add global baseline styles if they've been added before. - if (document.head.querySelector('style.anchorjs') !== null) { - return; - } - - var style = document.createElement('style'), - linkRule = - ' .anchorjs-link {' + - ' opacity: 0;' + - ' text-decoration: none;' + - ' -webkit-font-smoothing: antialiased;' + - ' -moz-osx-font-smoothing: grayscale;' + - ' }', - hoverRule = - ' *:hover > .anchorjs-link,' + - ' .anchorjs-link:focus {' + - ' opacity: 1;' + - ' }', - anchorjsLinkFontFace = - ' @font-face {' + - ' font-family: "anchorjs-icons";' + // Icon from icomoon; 10px wide & 10px tall; 2 empty below & 4 above - ' src: url(data:n/a;base64,AAEAAAALAIAAAwAwT1MvMg8yG2cAAAE4AAAAYGNtYXDp3gC3AAABpAAAAExnYXNwAAAAEAAAA9wAAAAIZ2x5ZlQCcfwAAAH4AAABCGhlYWQHFvHyAAAAvAAAADZoaGVhBnACFwAAAPQAAAAkaG10eASAADEAAAGYAAAADGxvY2EACACEAAAB8AAAAAhtYXhwAAYAVwAAARgAAAAgbmFtZQGOH9cAAAMAAAAAunBvc3QAAwAAAAADvAAAACAAAQAAAAEAAHzE2p9fDzz1AAkEAAAAAADRecUWAAAAANQA6R8AAAAAAoACwAAAAAgAAgAAAAAAAAABAAADwP/AAAACgAAA/9MCrQABAAAAAAAAAAAAAAAAAAAAAwABAAAAAwBVAAIAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAMCQAGQAAUAAAKZAswAAACPApkCzAAAAesAMwEJAAAAAAAAAAAAAAAAAAAAARAAAAAAAAAAAAAAAAAAAAAAQAAg//0DwP/AAEADwABAAAAAAQAAAAAAAAAAAAAAIAAAAAAAAAIAAAACgAAxAAAAAwAAAAMAAAAcAAEAAwAAABwAAwABAAAAHAAEADAAAAAIAAgAAgAAACDpy//9//8AAAAg6cv//f///+EWNwADAAEAAAAAAAAAAAAAAAAACACEAAEAAAAAAAAAAAAAAAAxAAACAAQARAKAAsAAKwBUAAABIiYnJjQ3NzY2MzIWFxYUBwcGIicmNDc3NjQnJiYjIgYHBwYUFxYUBwYGIwciJicmNDc3NjIXFhQHBwYUFxYWMzI2Nzc2NCcmNDc2MhcWFAcHBgYjARQGDAUtLXoWOR8fORYtLTgKGwoKCjgaGg0gEhIgDXoaGgkJBQwHdR85Fi0tOAobCgoKOBoaDSASEiANehoaCQkKGwotLXoWOR8BMwUFLYEuehYXFxYugC44CQkKGwo4GkoaDQ0NDXoaShoKGwoFBe8XFi6ALjgJCQobCjgaShoNDQ0NehpKGgobCgoKLYEuehYXAAAADACWAAEAAAAAAAEACAAAAAEAAAAAAAIAAwAIAAEAAAAAAAMACAAAAAEAAAAAAAQACAAAAAEAAAAAAAUAAQALAAEAAAAAAAYACAAAAAMAAQQJAAEAEAAMAAMAAQQJAAIABgAcAAMAAQQJAAMAEAAMAAMAAQQJAAQAEAAMAAMAAQQJAAUAAgAiAAMAAQQJAAYAEAAMYW5jaG9yanM0MDBAAGEAbgBjAGgAbwByAGoAcwA0ADAAMABAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAH//wAP) format("truetype");' + - ' }', - pseudoElContent = - ' [data-anchorjs-icon]::after {' + - ' content: attr(data-anchorjs-icon);' + - ' }', - firstStyleEl; - - style.className = 'anchorjs'; - style.appendChild(document.createTextNode('')); // Necessary for Webkit. - - // We place it in the head with the other style tags, if possible, so as to - // not look out of place. We insert before the others so these styles can be - // overridden if necessary. - firstStyleEl = document.head.querySelector('[rel="stylesheet"], style'); - if (firstStyleEl === undefined) { - document.head.appendChild(style); - } else { - document.head.insertBefore(style, firstStyleEl); - } - - style.sheet.insertRule(linkRule, style.sheet.cssRules.length); - style.sheet.insertRule(hoverRule, style.sheet.cssRules.length); - style.sheet.insertRule(pseudoElContent, style.sheet.cssRules.length); - style.sheet.insertRule(anchorjsLinkFontFace, style.sheet.cssRules.length); - } - } - - return AnchorJS; -})); diff --git a/modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/docs/favicon.ico b/modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/docs/favicon.ico deleted file mode 100644 index 2a6c7671068fedf90041ded36c4c16fe6dc435bb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1150 zcma)4yNUuq5G>(BL8D_0e1!gka(;;jn)n6B3WE3nMh1q)hL@Qe-H#lKMn(#vSB;c3 z!;I`Mz1>q?RWsWRP~uyyg5MU#AHXMoHiHn6C(Z=0mwJZzX)~If9u~v=xJ~h5xO8ET zaYM}Ss~)ktyo9B4idWPlrMLZxc-XAW!?^y8S-n#UJkGxFYn?$J)RqnFfA6QpQ{QXC z+H+J7^1nf-w_d2#T0Q9vHxIw|wRB}*UF1Ov^c2-Qlm+EZ!9&A6*%XO`Vf zvOy3_J$W%8h4x-(p<;Uzq=g8@UUKmwJ@lmD!S)b^9_#k^=8ws$D0$19_xpa|?|t8c z_q}h|QbZdX5hI0q2ctD6nNQF5@=_a(bN4p;U-uF1CzpJxP>lj=(q(GVD0$SOHY^tw z(FZgOrb8~Xfp*a~;$(j|mv@Za{eOV@6?48) zcN@kxk9CL!VVA3JtASO(mTRWExO%aDwTe`%gZWF%a~HJr=kW0(@K4l0q#OJJ?0MJ+ zYxQNzPa8q2jdNmX zx22!B@)uhp+<@|(vH|91w6edc$dILHFdVygOc8C~=j+{dn&OynCYK|1mi&a-WX3`G zqLqiLK~m`$_&&;aZ5Iw#r0Q5Ig#bTjUvRCZb&O441+ILOl+rxBSBOL=JKzJe(@CWJ0-?;^E;2Ue-(ba=x&fFU=H+MPw^Y z+jDkd*`EHS;5e|Sai{WbF#9*}o%_-_@h|OCK@dG$ee}cD8s7@u25KT2*b~+m3Puio zXWPw33e@k`klT3pMgaOKi%0xtxI?3_qS}8Id25qw3rSpt+Da-}p)~y%=i}hd#8?IX zEyfyN|7eU;;IG8EkM_|sS-YwZWuG7<2Gn#8?I1h_QyIbS%ax@Hb-IN8?O& z{YoupUT%$gop#f0y}RR`_nNIsfo~PY?6s-EvP z-L|)2U0AhFRf5w&;E&Nv*s9xPp_O}R+OmPWX!9N|fV)7e_@2TaK|rT5Wm_MUg|Yq0 H-^Bj|J9qlF diff --git a/modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/docs/fonts/anchorjs-extras.svg b/modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/docs/fonts/anchorjs-extras.svg deleted file mode 100644 index 5e14922b21..0000000000 --- a/modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/docs/fonts/anchorjs-extras.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - -Generated by IcoMoon - - - - - - - \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/docs/fonts/anchorjs-extras.ttf b/modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/docs/fonts/anchorjs-extras.ttf deleted file mode 100644 index 1971eb181461c602943619e4fde34e7ff2eac703..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1484 zcmb7DPiP!f82`O_GrK!!=ser)PLNQS#HIylc6K&RDhLM5MtZ11v$iKO)6KZslAT$0 zH^~M;D)!_>p%nBkC@9riK@?Ibdg-N?(nC)cJgA3Q=+Umf`DaoDA#Zs5e!uVgz3+Q( zzwbc+ID~7EaNb_2xYm*JUugM}bG6y=y4KBKO+ZYNH(Fl5%T-bMrSHB^@%lN-_!~THh5k)($7;Dq?1ODqphG?^rRPo1Qv3lYY5l z#g{~>=DsfG&xk~8iOjf=sbOk+SJ22B+&}h8U&hG9HuIDUyq7OW6}I zXr?J;&d@Za>_R?Y$m`NHwIgan*|ut^XF-P4mNk*cbt9IS%uFthYN$3U^?GH~snx3W zy0hh^yyCiU%x~MwcT||BE}0~6+Dd6!&X9VPZNgTY%4(>RxDg?>qDquo@!|9+OCgpU zIT;^r;#sF&X;iA4mHKkER%5pMlC$DeH=U(7tFBAF#HvQM;T+%n;hp!a*Ph~#9+&$5 z_Jgk?kgRD{_%_%R$>5&2$Jj8@khk_#K2flL_eQi$#&3jR3`HEr!+3{*kCNX1H}c*l z;4redg1wb>vW7gqPV-6H-%7Dg{8NezzW&oG&e8rsipTIGevf)rH)%OePl7e(`Yy$i z_IFdP6W>d*ff8RwqR-L(Ns7lXCv-1pw!_}l{%La2r{bo3~=LTP|9s+fgyplAmYU+`NS>s}8Rn6`xttn)m*14UR4gF(6F z2Y$~R_-p0M+vRi3@O&5svsjMrFyJj(3?IZd^LS|=YqVX)Hh<6YZwYapGrI3=)EN6q H{$KnL*U;k= diff --git a/modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/docs/fonts/anchorjs-extras.woff b/modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/docs/fonts/anchorjs-extras.woff deleted file mode 100644 index fb3b1043391ba9135793c717545069f0e6417ac7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1560 zcmb7E&ubi29RIv|GrO5Ibe?Uxvq-2*qNz}tot;e+1;K#Xl^$xLS?fuf>1MjylAQ^= zn_mc`c=Mtl9{dXwlS^vP z##*agwbplUlKY1Kh4%iNt)Lx8Yk=%?enGpl_t!?7B)QKRKdn8#A-`>R`a9&lXFRFh zxeIqaZED?bj3guN(X^%CXe-Cw%NLoLO z_u&B6N7g>$_lBeR16AQNe%J)lJ!(t9!9BS**u#>fbJBd%OjI(XsX{cxIgO`y*QzPl zc#h*Zzm&yGpmcC=@ZVrS4u@C_e)V3;o-h-<2?(k@lV!+Rz~b|!^iloCa}w@gPu`I+ z&f_(_1w1of7PB+c`GTKaXD0Kxndx)0*_Asp`IIPB!xzQEMKRQRVni;ERI?Z77Zzx*^YfBc%yS`GE zm2;%6s}+5(zIxqz;UAo^&F=lM`{TzN499F&^!ecq8snat9%I93lXo84 zdBf=bJu>~6m{A8YR@V4ndHv5tK5S_#*uV8PDI@v-VpJeqU`ByS*6Mvmy zhkuX@8P1V^Bg5l(68ClQ+Af*1oEc&ZC-HfPCHdDgY!mNi*g=7(W2n!Oe>cP9m=|`G zG}~$ScJD&G)9*$-L`cv?8!5WDjUHbn#t!<7BJ{4s-QKMn;n++)u[n].href&&u[n].href.indexOf(t)>-1&&(e=!0);e?i.media=r||"all":setTimeout(a)}var i=e.document.createElement("link"),l=n||e.document.getElementsByTagName("script")[0],u=e.document.styleSheets;return i.rel="stylesheet",i.href=t,i.media="only x",i.onload=o||null,l.parentNode.insertBefore(i,l),a(),i}var n=function(r,o){"use strict";if(r&&3===r.length){var a=e.navigator,i=e.Image,l=!(!document.createElementNS||!document.createElementNS("http://www.w3.org/2000/svg","svg").createSVGRect||!document.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#Image","1.1")||e.opera&&-1===a.userAgent.indexOf("Chrome")||-1!==a.userAgent.indexOf("Series40")),u=new i;u.onerror=function(){n.method="png",n.href=r[2],t(r[2])},u.onload=function(){var e=1===u.width&&1===u.height,a=r[e&&l?0:e?1:2];n.method=e&&l?"svg":e?"datapng":"png",n.href=a,t(a,null,null,o)},u.src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==",document.documentElement.className+=" grunticon"}};n.loadCSS=t,e.grunticon=n})(this);(function(e,t){"use strict";var n=t.document,r="grunticon:",o=function(e){if(n.attachEvent?"complete"===n.readyState:"loading"!==n.readyState)e();else{var t=!1;n.addEventListener("readystatechange",function(){t||(t=!0,e())},!1)}},a=function(e){return t.document.querySelector('link[href$="'+e+'"]')},c=function(e){var t,n,o,a,c,i,u={};if(t=e.sheet,!t)return u;n=t.cssRules?t.cssRules:t.rules;for(var l=0;n.length>l;l++)o=n[l].cssText,a=r+n[l].selectorText,c=o.split(");")[0].match(/US\-ASCII\,([^"']+)/),c&&c[1]&&(i=decodeURIComponent(c[1]),u[a]=i);return u},i=function(e){var t,o,a;o="data-grunticon-embed";for(var c in e)if(a=c.slice(r.length),t=n.querySelectorAll(a+"["+o+"]"),t.length)for(var i=0;t.length>i;i++)t[i].innerHTML=e[c],t[i].style.backgroundImage="none",t[i].removeAttribute(o);return t},u=function(t){"svg"===e.method&&o(function(){i(c(a(e.href))),"function"==typeof t&&t()})};e.embedIcons=i,e.getCSS=a,e.getIcons=c,e.ready=o,e.svgLoadedCallback=u,e.embedSVG=u})(grunticon,this); \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/docs/grunticon/icons.data.png.css b/modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/docs/grunticon/icons.data.png.css deleted file mode 100644 index f0bab86024..0000000000 --- a/modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/docs/grunticon/icons.data.png.css +++ /dev/null @@ -1,5 +0,0 @@ - -.icon-grunticon-link { - background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAABuklEQVQ4T52U4VnCMBiE71hAnECcgLCBblBYAJxANgAmEDfABWg3kA2IE6ATWBbo+XwplLaWguZnm765fncX4h9LkesC6DHxvv45/8JT5CIQLyB74TspBbFChgUTn9qjq4EauhXIMYA9pBWIFKId0IfkITwa9CpgARM+ID0c1QSRIzcHOIP0ythPLwLbYMdxaTjwgO4Y+9uLwKAicjaztKysPPtCZab7VqAi9wBSkPZNjp4UuiXIZ2RqVqiRm0KYgbR45Csf/FMdHCJE7EDuud72fiksufkFaIkMnyBM6QSSDm6G/B1g7yAdMg2Z+KQCbHUzcg4dbiwy5mYFJr0x9pNKDptgGrolgHFZ1S9lJVgBDA3oMEYtZzqpEogEQgLCQZiEttRgJ+Bo8Amgi0zWz1ChwguDktaMfunxHtCca29/UFkMs+jw+5j0c90Oau1Q62viN+f2GdCGvQW04NrPmzYebpcuE29/0rqCyxoNUkg7xn5Q333OzbMKA9DctKTnc1mU5mehzXPWYEATNFcY0s5NcRWZozav3M3utbBqDvMKzUMjgJvD6V/INLUGXJrd8X3j5XDpdmmD/wAyTxBSftthKwAAAABJRU5ErkJggg=='); - background-repeat: no-repeat; -} \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/docs/grunticon/icons.data.svg.css b/modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/docs/grunticon/icons.data.svg.css deleted file mode 100644 index ea5bd003c9..0000000000 --- a/modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/docs/grunticon/icons.data.svg.css +++ /dev/null @@ -1,5 +0,0 @@ - -.icon-grunticon-link { - background-image: url('data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22utf-8%22%3F%3E%0A%3C%21--%20Generated%20by%20IcoMoon.io%20--%3E%0A%3C%21DOCTYPE%20svg%20PUBLIC%20%22-//W3C//DTD%20SVG%201.1//EN%22%20%22http%3A//www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd%22%3E%0A%3Csvg%20version%3D%221.1%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20xmlns%3Axlink%3D%22http%3A//www.w3.org/1999/xlink%22%20width%3D%2220%22%20height%3D%2220%22%20viewBox%3D%220%200%20768%20768%22%3E%0A%20%20%3Cg%20fill%3D%22%23FF5231%22%3E%0A%20%20%20%20%3Cpath%20d%3D%22M544%2032q37.75%200%2072.875%2014.25t62.875%2042%2042%2062.875%2014.25%2072.875q0%2037.5-14.375%2072.875t-41.875%2062.875l-96%2096q-2.75%202.75-8.25%207.75-26.75%2023.75-59.75%2036.125t-67.75%2012.375q-43.75%200-82.75-18.75-29.25-13.75-53-37.5t-37.5-53q18.75-18.75%2045.25-18.75%209.25%200%2018.75%202.75%2016.25%2026.25%2042.5%2042.5%2030.75%2018.75%2066.75%2018.75%2025%200%2048.5-9.5t42-28l96-96q18.5-18.5%2028-42t9.5-48.5-9.5-48.5-28-42-42-28-48.5-9.5-48.5%209.5-42%2028l-67.25%2067.25q-32-8.75-66.25-8.75-5.5%200-15.5%200.5%205-5.5%207.75-8.25l96-96q27.5-27.5%2062.875-41.875t72.875-14.375zM320%20256q43.75%200%2082.75%2018.75%2029.25%2013.75%2053%2037.5t37.5%2053q-18.75%2018.75-45.25%2018.75-9.25%200-18.75-2.75-16.25-26.25-42.5-42.5-30.75-18.75-66.75-18.75-25%200-48.5%209.5t-42%2028l-96%2096q-18.5%2018.5-28%2042t-9.5%2048.5%209.5%2048.5%2028%2042%2042%2028%2048.5%209.5%2048.5-9.5%2042-28l67.25-67.25q32%208.75%2066.25%208.75%205.5%200%2015.5-0.5-5%205.5-7.75%208.25l-96%2096q-27.75%2027.75-62.875%2042t-72.875%2014.25q-37.5%200-72.875-14.375t-62.875-41.875q-27.75-27.75-42-62.875t-14.25-72.875%2014.25-72.875%2042-62.875l96-96q2.75-2.75%208.25-7.75%2026.75-23.75%2059.75-36.125t67.75-12.375z%22%3E%3C/path%3E%0A%20%20%3C/g%3E%0A%3C/svg%3E%0A'); - background-repeat: no-repeat; -} \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/docs/grunticon/icons.fallback.css b/modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/docs/grunticon/icons.fallback.css deleted file mode 100644 index 832f36fe7e..0000000000 --- a/modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/docs/grunticon/icons.fallback.css +++ /dev/null @@ -1,5 +0,0 @@ - -.icon-grunticon-link { - background-image: url('png/grunticon-link.png'); - background-repeat: no-repeat; -} \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/docs/grunticon/png/grunticon-link.png b/modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/docs/grunticon/png/grunticon-link.png deleted file mode 100644 index eefa53f0c28b06cce95d78f7647a3de686a159bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 499 zcmV>HnX&>tUUWd zWv2U9pd$AGQjqpdj-C{{CCF!FYF4O`n?jg@w0PtzAN*4t93n*QK<>HT_I@cWx%mZX zi4310Oz8xY4sM409boSu9Wo7>_@n}Cbu)4f9d0Z#=4J&Zy)pKaN)DS~8oDKbaaq+b zWhGbv3=QZoMlEMLsS=0;LIT1;n1r^}U?<>c@Cl%cOxDj(p~4G;lGcoV>G2-WoNI4? zP+1JK=AS(N5yq0MvFU_cWzR~XXHO>q^Oqc*SH&F;0ZY7X-X%|j!Ao5Sf} p$TYPET$2_&@{{S*i5K?~IVJiRt002ovPDHLkV1nw8+bRG6 diff --git a/modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/docs/grunticon/preview.html b/modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/docs/grunticon/preview.html deleted file mode 100644 index 864885d91d..0000000000 --- a/modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/docs/grunticon/preview.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - Icons Preview! - - - - - - - - -

    PREVIEW - you can change this in the previewTemplate option

    - - -
    .icon-grunticon-link:

    - - - - diff --git a/modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/docs/img/anchoring-links.png b/modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/docs/img/anchoring-links.png deleted file mode 100644 index 9d28abcf8063601a2b8852eb65de0d43b8c4732d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33647 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 diff --git a/modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/docs/img/anchorjs_logo.png b/modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/docs/img/anchorjs_logo.png deleted file mode 100644 index 06c8b4df5078d3fdb98eb104dd47c837a9a6c5bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7581 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 TV-0`#Zv`mHsmsEpEx!IARu649 diff --git a/modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/docs/img/anchorlinks2.png b/modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/docs/img/anchorlinks2.png deleted file mode 100644 index 9118b1ecca4a616af6d15bbb3fab678a183f3006..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 62031 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 z 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 diff --git a/modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/docs/img/gh-link.svg b/modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/docs/img/gh-link.svg deleted file mode 100644 index 24abb41cc9..0000000000 --- a/modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/docs/img/gh-link.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/docs/img/gh_link.svg b/modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/docs/img/gh_link.svg deleted file mode 100644 index 8e43abb449..0000000000 --- a/modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/docs/img/gh_link.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/docs/img/hyperlink.svg b/modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/docs/img/hyperlink.svg deleted file mode 100644 index 3a8745a683..0000000000 --- a/modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/docs/img/hyperlink.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/docs/img/link.svg b/modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/docs/img/link.svg deleted file mode 100644 index 5aaef2fcac..0000000000 --- a/modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/docs/img/link.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/docs/img/mini-logo.png b/modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/docs/img/mini-logo.png deleted file mode 100644 index 3806c67b04eb57adbfd2aabf540aa8cddd4f9619..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2259 zcmY*bc|6qJ9{!Q+OLh{*NZOb&DC>0XOV%;oMpTS#?2{RW@QyWG$W|CjnI>C^2H9RF zT^W=@wirGMA@P=deMfb>_nyz^obx@;_xV20`JTT{qK%aaANO%?008*RObrptU5YtD zob1eX+Utlmb7S+=v(y8CnlzqWm!pSCS5t%~0NgqS0Fki(u+4-bKLbDz6aW^S0YEDU z0K~ERO}0AB1Q*uS0S5p)!iSRu$jg@i02T)?BnpqRw9s-5@Kbhi3qZRohxlQcYyi*+ z(PD;v?sykah@Y=NPAfzg{DYyzj1OT581#dJ_t6ETENwsr0fFuyb!9bWC>YKS0)cb_ z-8{4qhQ`0jnI~N^29L*TK_CPIL7AYc91!RUQPI@Ygg{{s7)*)DP{M`!<6T0O{BiO> zMgF5>=#Fy@^upr30{lUTx-RH|AiORZd}#E0{JbaL%j3UJ{ zW~t60s%0JM<<4|I)Q79+{9yhc_RB{Ha%lcPm-*T050u#|oLdL-``O^!7B3VX0D%3I znV}xil#lYqHD8fo(S48L;pY8h2Z&1Y9akw{_7Bdk?U$%t>Ennxb2}S_;|^wz%pnTOQkOfH9-2mI)Z0uC%k^<5myK)Dnvt(*RX3b!#vtatm?` zNXz3B4%(@UHZ$gguYKcTe|;zPX?CVcYu{#BmAYMnvbPsS#~_j%i>lKLA7@&XWY2}# z4yY~1o55uG;t=!bqv`-^?W3kXyDm6=9a7H85+G^-a z)#CP6IAczwA6zF|K)PkUj4SM!85dTx($FU^Gg{BslKls3k_^GOWbQcKb?5A%l^$dY zy1^uK#@A@1mdg?yB3nuI#d|5WwXhf=@AOc11!&+^gsi5pkiN!SOX$Mh)>i0vV}z7P z=uzH2dk;p8Z0c$E+aO$DP)$Xvw3N5^zmzcSW<*Jg1aX#CiQYB3y=+aqWQttj_OY~Z z=xv*AmKGBsl<#PaZ|(I@%*}H7-(MtJD+kHVaGigW1oDoU*};*8PEPR?dN6 zp=K6c*Pl(91UU_}?Tmb10lSwL$9(E3raH|9?vX&ZPr#-@KQ<|$-XWWLPIZLEn!F&PtV<{*`c-*W9{+>NAjDA~GI)<1T; zqk=8*pC(`V6O+TYcXn)o<5{tgs5PALV4V$}Hl){zi(9Tdaa{xLcJY*`e4=2WG-YYk z#@Q(GBo)n*3OO3AUs(w>P_Cs$fTOx6`V3EnHM)noQp;DNO-q@e?Yd+^(?- zdp)|WDv{co$F`f>yfW*tS{PnSZ02386HlM4m^e`V_}^0Z7oTZVPeV%tz*Rl9=o?w1R4vKn6HlD@akMi=s^Bk1mTP#xM8u8T`gs0T4OOU z8M}@2qM{hVWVsfKZOOe+BzLBrokG>jc~y-Z=(~{-OjnowD^0@JeB#3388U^U(0!0= z15V#e$lZ`yTU)E)5&x4zOxJtk>jY!=HHj`ifUs9LKxQoa%HJtAhlNuGWOO2t=nRZe zu_ft3RCb=5Cow!+hp@YOGha9C0u?v+2F7}(P*cGos%z;(LqHp2auNc*+*fdk$Uw_I z^2yMNInR@(-%4Y34h|k_3tr0mN+y%xstqUuPAzfBb?PU0GjU}~&xn2Ba;(+qNIbuE zznE`80K~`Nf8U)zXb@36j>TZQ3iI=+rY77c$S7KbPkD#qwK@D^qNBK2I~DjFcy}U>>V5YMb8wd zdcHyN@bFwnOwQzboY9{aELf*WcSCU9%`xZ&<3~PidF9=z+kTe8W4%QmXI=dKj$C{po`Cf9EGbsV)^vLyNHlzgv2mgs<>NifIaOuu;5rHEs zWvb^IA4%VM@clXZGK;7>hq%mDKU&;@I=fIe@%TZ{myWD2iBr4X2Q&Ck zW6n0%iYu%w3)afH4?tV^Cvd+8=Eet2q|_5!HMF}wjX&Ibc(i0; zYWi*|`_uzWxcEryil;veQX-31nkn~42j7?&o~__-aRZu(FoJIUx^B}aUEGi_N}pOml&iY?m2qGBJ)N6(><(38tq2Mf0Lf! zS@i39j1A*V@rqz8yv^b%xLm%+Y$}PY&Dz0znzte(%d&$lf+r9YWxHZQF#edBKiR~w zN;k~&EV_QSm;RDQ`bfhE)`=7b~P0dF&9 z{>)-cMT&7Zp0L-q7*gguy#e@3PPIBP#aa5J6Ig3m{e2`CbTjMAd~q_;?H;|EA0=TRK&7Fuv4XACyi z?rwRRXQ}q_0w>#ZM0LMjRe8?O*81K(VpzV!XPHywx`&LJFQ!hx{ z<=J?4iYm=r-dnz2e!mENSy|p37XO#0Iiy!v+|b4(ZjPH*G%gf#fFUMDlhLUo!e3++ml4t7huDi^P-Clgg9AlkAhu6PD3# zf}Q%4L>rM8u~t;}(*CjG?RlVw<`Sb!r;Z|haa5D0hs3xfop`PI&}i-=4T6N>{P)H4 zE$&vgE;kyetiJB0rH6X<+5io3Sx9s@flwOuM(cMW%Xz5~asBm0#71=+hQX{f^aX-Q z&mk0haa_~3t16nm==2;+eYy9v>b^K*tNyW;~!sbtgcKOmQ1AUp3^4?z5RWY z+uTDF$9<{0UMRb;fQ+nfpAkacTuIGIO-7p2 z(AJt(-^kX$nAXkO?vok-;CAEuY+4&T=@YnFTiG~ry73VGN5T2o{?|=MMDQPplO+$4 znv6VwkgbC;0ShfNEj$H++YNkQZ2ZsVlyMq}eh{69keFFC@-j)o5Ac24HDHU$6V>KoWPJMj<^ z{ZsURmjAKS$=u}s)@0-Ozuo$DknZ0ZItE&Ly8k2lla>2lFQ=S?x$&pwfAV=5xc{U4 zfA#%uJ=}Evl>a}B`5#aJ>-}_<7nYmu|6Dd+Sm|Hn>Hq*&lZ3E)6eBjaEBZyN2uK^qezyMp^ZcQ#Jdd(RkvR zr_?#Ys@lq09aOaB06vf~VGJdKO!6fTA}lNY^5e|b<0!MA0C^Bz;(Ud~r02Qka-~++ z^`m#Cwo{i5^t^OztNE1(Mi@1Wq>i7Y&dooGm{OF)UmO?@kp)2{ABipa?*L8`h*CyV zb{YkXCP9$E4`HEz6Gnn8p(h|g0BnX-&Q{R>PXs@W1$aCJ5e)SY7~#B@yb2~t>3`fP zWg^y}TqORGr2bzPF_fG|gTp_$KUvEV{!^Ssg6t0psF*IJ|Hmzyhtd3>0T@Z27HG;Z zVWE@#Mn&1YTZh_yI_^|#M9k5eu<8% zu5Pp(t#LwFua6=0eEF5vJ;z~1ykZOb+eNBEL_=!|!!iE7l#ibl_TT;5$VF9i;=}LS zY!F)vG5dx3DcGAq-lRpnQ{L`5*2+cRKo`_?DI&IYY7CP4&a#1DK-E;$mI zOhwCUqs?4F7JUz2SJBNf>{Llzmt##`8=#V`t|;L54PI8$E+Z_HOMXR&UZxsw5g3@1 zMPP#tC97)So=H(oRZDDYD>)4)f^ha2&fS?9E{5?@5?ZqKCSG1*G7y8XdznF6)x?CV zGCk;Ek&L8Tv~w=EvM*l~BS;+k*-7(r7~SGrw}qa*Ut=(L zdLHjk!p0p?vhqrzYWC9iDLnf(2N;R{s{%5v4!#b7r(I7>vBC~m32UfpyZ3b4DyLtl zYwByNq^P@_=Okkst2g&ZT!Bw8XIW49ivfsAX%Rq=53TE+)!i-?meK^QCi??u%W8Fl zDKMjHklKT&h|z{(#c$4VJD}#l!g}_V@9H{wnGjCWl#5b<>$7S$XJ=AT%J?S%c?tkF z6QP3b1wNC|^}pxUDLUSd>&^XVJ098HSv z1^}5N!YW7gOndQAgR!z$DS_lX(S}1bo@{s2LP^kdDy+X{6}46 z2wN5>^{zAbtL}4GIPLo2f*UArhY`s{V7Psqi~dtYYzhno_qHo{2vv zl#j^#qx`YuNvZ9bQhWat%RHQnU~kGZp@->Z?(Wiu4;A7bufc5-20IIrOWHEisg!0J-7A`7cUD-n5uQg#P37y^mwZYB#%K4cWk4@QX6 zX_W=r*0;9zxHpRBdHGqnWG0gVov7U~wq#bIfAW*2IS!+ZgtHidkgk#bnfr{T@&c1cn977pBsphZJ!SXF-5LPc=;mCq7?CBz~ z#9IE`n_32YIcB3%PtK`T)3L%S&hDvg-%yb%q*^f&1{>xM)*EdfJ@ggoO>|bqBqhd& zk342Fio8m9lU1#G32seyi_MwogY}M2am-Q!tcEev{x)2P11#48+d)UbmosDB@eHkP(>L62 zAX@LxNJMN{v7Uzz*7u1)zb>5|s2rPJ?7~PbbT%RDTAR%?#{1j(=1+z*Ul$i1QrIw( z-AmH9WD~gD1H(m?*Gb8%8W9V-Tn=L=#k}OM`AV;D*YenLae>QlhTA;SlwHr|x*VYO10jnRjP?59+*z9_|I z5b_l#wQkN_DJEpLL42UaK%v+W%pnle<)g&!aK7iq^J0++|14#l7!u^kEWJq>U9N)m z6>=VXqFFcyvXM8B2bi_m@)`tTj=!yT_#U>BpMSyyY-_}PX?nLFoi?9ZH@`sl)(-K_ zZ*f!7$&hxF>}%G@JU(Nw?C=Q2fMGLVR(g@&PlVay+Irp$HVHs;<(9hrpuxI_i>kl+ zQ_#N7?|oD$3wz%%8ow;HNg#A;!25e9h40jc|6$rb9eh-Et+Pd?hIQZu&u2!+-gH9t z>lJU@=S7%GjUP_N{szm+P*}#dzC<8$k&OTCzIUDkR9&FGc`lfpcG_E3_|O;T4Y)GELdlbr!e%%zxdk5(^0d*DoIR*(w2Nu zTkwONl>vFyAtRsmq|N77zD}Q#uDWSU;WQ1RiOdGYpEY~;zQ4>-v@4>|!ySy)8Awe$ zO`$KO;$K}9U%5%9(5q3OH>~?;!^(G(bR?~@J?K`LZ(z+=;4iYL&YBiMPlap2vA3{%SaCd&>~q}ne%b^>F}%t9yfxWV)qL&`~kZKRT7d_yLpLZRGeb4|-Cy-Q`z zS1B1Tx*uiU$9-jQ_h%O=rEJeGV8{fmQd}6PO<>>SG;69=;gtva=Yp)Ftov^DFW3%a z`M1U>41~tN@kumh=I?b5>R|N8x_<;2lkvD%vcD_ls##7yzF`@e=!68#oj5X)Ju4>SrRM;_1PVzf`Bn#m^ zOh#5C>ZwZxt$vR1IDQO%8vcN9-`S^*Ljd8$Uz083%!GIWl1)8%#MBKIJiZQz(l@UZ zS;k1EoU=MB!GGFtO4Z1{Qj^^cKNTz&Vk3r z%m+LLEJnTewXN3O%=Md~u{uZR^6E;Oh617sq$Q|lvI|DN-(T?FwZd+{y+X_aci{NZ z-?KwX;c8eI8+@$mDbc@hy=cc#Tjmx5^X{=PZFRLzto&{>{v2V8UEcHsc^@n)d;0i> z^7y`Hpoa3L63a2kE((OKelf+- z-iAgU1(prv6X<9~UC(scEmN{2S=CV0!(JR}QLqW1pLfDHbDL1V+4_<0GKx!y7~vZn zHC39b*#w4MY(@sU@NY5ed>uWsT&EnvP_+w0Wu zygf;>X-?c)LFwS`XISUV;-ldJJR0y~e?Fmhpbq)Gyu9nAoe6u5>r|@$25D1Sy@VLI zoHXA)++VeT{Fb3oEdDSK^h*P9jML<`8z)1M;rWzNja{@K@g5mid0KZ-g;(Gdf$D(f zx}5-72gT^usj?=4_lKj?6x8*Y=}_-`TXzQuw`!B6mHRG+sskG9kQ z9TX~V@pMjSor2S15jOmp-vMEZ#{|uZ;whm{y|Kn(ragY!)^}fb9w^3a)Z^wp=<{BV z{t&)Ngr~V6Q3#!E!;;GDe-Q3u{Q6&;jz_; zDj9~o9~T%hTN|@>KH-h_!wqsp*`bv?#;C{vKDbrh{zrtdVS|CB{?vgQRRiLpZfkBu zlrz?^yrraQwHC+xwHXI4GzQ+nTTCs?0GlC|QuRS+#?zG)NWlKO1;8eJSLc_pd@&F0 z>}#18`T<>LeL zzVC^46-YoMxSHS(`G$gBEg5P*oNb#oP8nn0R8YsN9&re9FxA0F4GVwWGO&=Pr@jel zc!*v^1FMc;+><=H(&0RQ7-Pgi$W(-;(OHh`?$MD_&Y;T1MB@_>WUTnLhA$H2@%HN_ z^SpXr+ojHX^z;BO_QE3nG=no!owvW_=;1;VjXa3ls7+3%hdYN4li{!0Eb1tI*<97H zDfTwR?flS%KVX2%1^UXSA#ur!#(1r{1b<@eac$+IDUfZugk|6I@>jDVpZIEvAB{8_ z_YP8m;&8CRVO*J6m;1!kU3IG}=4R>GUbriSN#9=*kpQ?ef!=xVHs@SlV>eMPi=9&r zArgT$jb79lg<@-hU8D(QH9yNtcTE3w{e`^geclr>Z_;=@?-K}q_(DJQh;iY#NqylM zX%fqKe?Zxak9o@5Q40b8gb&iO9O=+7Ry7=E;X!hwp}w;jcX5$sl}b5}8lR5nO0~Gj zQ$~~QVoo2Gy=Ga-DsVzdfMA5TU?zX}`jVmg6yv*>$u*P4aNDR1IX{}g5~NxA@+~;l z?8~z?hp7?82$cUu2COwT<|xZ@YR6mNc_;Nk2b18_)CCLaUvyjBP=>!>MhIn0uhKG6 zcpOUBhnr~5#CW@8vB!+);UB;H*(zl}lr*K~1<6Y$aVu=)C55wxlM6&h`;^SUbsn;s zr+8byxMMSVPML7Zra8F@4LqkBw|WUMW%oY)F?o4Ks+K*ExlX1alCvszW-2gkTCNL_ z2wa_j`&*71oG{e*XzwPP-JX}ZaZJj}&8YAD_Z5rn>|$lR9D9S18#nT|?3Y_%gRy7H z?n8;tg28=~Lp&*IkN5fFPDSj&+;G{nBk7eKIx!|`H6-qB$Fanwazg1XzS}=;7`05= zGbPsU*sizP`tnjU8k_<_h9QuIU3MC{Ghlg=Sb5DMD!>lwfg9b22L7@S>E0zwm-X=k zTup@(ORA<7hi;Xd#&)mj6jS;MEHeWE+F7waKNL@Sb@8(<|0eU9(iU51i=!Lk3p#Ht z(2D8SHm-^FxF!7JLh^*NU00^G1eqa{mylE{*a%ERiVUiYhGSQ2!k6KJ@cYcM6c3u# zxi1T{=J97&yuQ=V*`7{?DO&&y)H?hv1E?~E4dMt@tO5}b`-NJtBEB6;#L*3)D{ZYS zpAGK}A)dMK@J1m3u^9{mbMggVN&-A@NE{kzgGsV{%~pw1mzH*jjoFI;&k_&DEZrk_ zxG*uPIpSbuf-!5lwA34tIlwmF?)8QGm8rLJD4kM#A7*2h%}D~zHYxjt{;cZb4}VV8 zS|OcVk9UV#kvVM{)A%_=y*LF+`N8iW(U(xI_cGinn0Z+{m2tkioS9^i?(RvD@`Y_< zge1oY(2B1&U&Ti;E+NR-lXNUN&$`> z2kkY@io9L@Ro+Jk#JEh}@fvcaWxhR{#vh;l$F!tJ=~0SQk#X-``Z>JGv8cjAs)lJ! z9}{L~Gg9;!J|a}-2H9KI;Fch=s{!RRB!p3F#qm2a!Ps>Kgf0+`p8d6ZT%?a+SSYZPl3`b8&_8rCxy<|7e~m2 zVm1E4#AsZU{(TZIKAkcBk2~(Qo@oYAC=8)cf#hV1bc1C)+435b#aYu=ayQf@1eqe0 z2`5-m!>!ZSWMqVj7EU@uy&f@+Z5IvTujvECjPyEfz+$q%Yk4EKfvtX7+4|PzHRPJT>L>ltZ={c$jyY%md?rD5W4GlK>^F`D`@`X)~@wdevJifdT z^Ix|A$Q}K~tASt!Z24{M%Y^gTG+yp*VmNcN?9f#QLH1TSv2`hY-6Hex)=G1+08wc6 z6@?|*_DS$_?U*x~CN6BeWtTg`WHdUYaY};DDZtI=>^dNsC#lg0h`lGgZ`NG_oS4|t zIm*Qkx4NrV_opQAa$lYXUP4o6K=|Dbb2qiyb(GG-NVc@i_&ybDEn^cfHAMs@sLO?$ zSh$8y-ct#xM@Jx4-tK7^8;v7ef5xW0E9WWkkN#GGk zOw9I1Lf?-Q%LlO!ukiwPy_h0Du* zQPREj=d3x9`wM>du!qR$0%f#d&W4&f{@SJ)lKF*6Ip}^*gks=IEoT6jTX@5N+YO$2 zu6*bjA=Kqg0bw)sN{ zJHdm-%_dpp&B?L;ZR41AO)++{eNF0P!&eBdI+pO7vHS=}^|YuysSxoG`-)~b_n%0k}Vj2z9q^^tc<0&=`B>Xfc-tNk+@5yYb z%D`Du9m`gcy^~N@<+T|vhwgP-9NAPS8f*aRv>Z+|Z-c^R&G&_rM!xq{jF*s>jN~5< zZR#Nl9{i4e><$Y(b>8W3>qxcr+Gmv;vmCf=C!8tdpi9F&_s0;*m*3^IFKCC)6=d6# z{NSo>!juu?R=kMdYUX}N*oar+mrppaVJ(>N^O&q4MXpor^k4REA+oQB>3{8Ve7Di$ z3;ot$Y3V!!GU$h_hq53;^M5ci3UYezYRsz452Y#F2tc{spKwTs8FiSR?2%t8(0=|- z#(}LCgiC`dUvyLS>_qGf;5qM@NA7}>fyQ4-M~yYp-t&E*qiGRyk;nJKEjng~C|>b} z{^{mo-}C2ga_xLntI17P{79ttZaWh_?~J8RV6CO6u5#MvQt_#sTu6Yl!n7Wz&uj`!IRVVk-5Y6ZC}1n@0~3xS2}lN>n8TW z{a|XKTM&I-^BCgmgd7V<&ex>S#eu}7w=Fg7hCnr!{N#zo#n9cdL1ZOXa@tI{_hkz0 zVJa|Ng+`N+&QBg?lf~RN=oFsQ%wloPV=Cw4DAu-F%<#nzed!OD7c_16H<*5*G};*^ zlm>vs+K=JQa45v`ru2ZwLZmHrfqmHVknA8@PDcqv!=m?`@W4rKBq-DR&*+QHz#1kQ zIw-|pvuv-QgZ+cBF(nOhJ~T++BgACE=i&sxo*!JPs~gF^lOVupF|QHo<~BCq*!*%R zK~{C5tr$dTS2lkT2OWGJ#X<6Wl(!ABV*9;Q+V~@Q#>R=M`1|bdQGnQ~5!$1c{9c;K z>Kvi&hMxCxpv*%_h{X!?pWwH#)L2^%Li@Z87MF?lGjbJ}S=Nb^C~wkb+VH@|S51;p zig4EhZ1Rdo&U7%J=g7>>>$fW;?fRtz0nT1eecm!mQNh+`vg_8KCI&>aB*Nb?Ni-;N z#%ey{Xj&BOC~r-Pqja?IO#qHn@6}tLwmv%x^#KMyxVZg&>(Ukl*l36vO$Sl6|G*yCIhJM z$mA#hKOQ8Sm5c#DQGnTKCi@s3@Y=9F;Hq^j37Bzm*)Az%B!SLJ`@Hpojtt^P1czkX zvdzKvs_}9QWyL=|+emeS4C@U{89y~a5L|8|C@;$Y%q=H-es3o-8+=+`jx%ICnlss| zI*TJN=BX#E$acBlX6CA@`Qs**rbQu zyA9qU&Ri@M<|2WnQN6ajlkM) z{d3!66Tr^-t?%l@uEIOCt88O_@t{Bi*vx)%K(%MP;G>mdZ-;k4 zXwCnJPJHVEMCd1$V!t+66MjU2l_j;L;LU5_u%JV7b2m3S0_|4X6W*)}b$8XhX}&!_ zpXX}FF0l(ihOez@^Ra6<^&r8)GK73N0T=C;n)jNtlVHN88^`dT`NDP4p4bhB5C-?V zx2byA=X?zP;SW!AJt>NgO)K7SK!cRwUA|17kLaDlDjA;--}{_%{UOsADI|lgM+sKC z9`7+7pVo<-#D%a(APZX|f#2W34%nBcW$c$(;^r2S#<6-Mo1Xy=R`a~SbKh67U+#N3 zX!#c=8Bj`KsLKsn*3ALT*m35Sfd6pQAY$t~1G(9q%EksMzD}2*Uj(&!IyZz;Y z5jJbHi-$l2xE`AqHwK@|*ObDVo$YBTmCg2wZi?A+gANV2LMC_W+9h4fhye2z<4ot> z40+#aEwIPCD;BvV_??Q>vhIUbuWNbHispbA(ebln*C#P$JC6f}FWrE$wejVmA4X&Q zRUq^2p;e2quw zyS9SpvbOva>&UVR|Jz=~K*1I`w$7z;dQSXy4-%XaH=gdhMf*OeWGv}B7{?I;5RG^h zythgM^7VBn5H&t$EQZhPGU;t=3$ZdzQnhq#6zZbI-}My3^||-2R&TfNvHRGG-= zi(*98*g`0I%kmm|tZwtRck^b8B)FrH@(2B$4C+kkikiEZO5c6LGWB=%b<>Zkfq2dX z)7W9(Xg$>Nl)|iF2oXS`yqqYY`ylAni|e7ku5{?d)C@F25&ecy&4mbM-eY!JZ>?1zfK<+sJ)qz;f`R*Gy7|6EUq5u0*O~(3sg!?mn z6UnTseO^bmL3s9Zc z_xcxT=ET3fJZzevxxZdtyX0XlKN;kEfS?7kSI_ z?;|B75eEqDPsox-wo`jtq{`Azl>YOy4lh0*SG_sSXBl&qi>Oeh)N=Wf*_h=tT_q0M z@zrt0c=E*?{w0*Rj3zO9 z#(&)`wN^5T2p*+W(s{)()cXQs@d<6&8aS} zQQeNPL^}s4;Lw~zV18%wzZQEvpR=+PQ&fnf1MmGfXmgHK z?O4wT$Tgvj4mYHsWrhp$UajJd@FfBThR%~Siw$* zuO$E=Bshz^lDr3R2=0wk%(P!AyV}~!?bjV&<4CRyc4E*F=Kb9Dn0?yPY80zZ zs7dNQaD14%z3D1x^6JEc)w;%L*EY{Pl8 z8=7w^#zmIs+x{hWqVZ)e_33TIcuq)Ajx7!i(*1`Iy2Rvs*kF$#d$dxs0J8my>$16_%+(2jaxWJK3B>|TS;hHfthsT#4%LP8uc+g@1CI?E;seeS?BpwPQJ7B z1e5@mKHY1`h|215Mod_p<2#L)%QFz`;a8Pk!!h5p>6ag0d`I1(er zRMA~|PGyqDtNg{7OF5~{EsWnwrzR890(Tk@2^G7*c=&cq(!Df(AJBksckEX6S@Y2L znR}<48;tac66YFjH)m%zt-8^66MbMaDN+Py1{jjf$DD3#VN{o|(<=5`$uO4R9o@Qy z2q5SaJRH!g3y;klf2ck zhbW$Ur&L$Unf=d%vo*tch)TG4V-N7_pDurlv+-=&33Wv{B0)jeA}*Fnep#F^{wcVN zGtkE8rj;0`dDE=&7J#r~NfAZ??xSjVFIT_xJ`#8hTk zlq{BxFMoPP;~ibnn^{e??fVR|N!jRCe6;JIav|^{``890TbN_5cT_KDE+@t0*?O3v z8R{g_f*xX@-0+s??arT>Vp7HcKgK_E83d%!_v=0XOxeTAlIKcHq=%Cmg}I#mqMo4F zW)_n`*@4UZQ^bSM4gH&Y_4&p1CA%^kxO!QKO?GA{?*h+JA1%Q&R5JX1`DEO_^>sty zFMJ?&)gUGN;L-tCe(0QW2uU31;Hi7G#=?5R*Ylz5wvIt_rjsc7iN(+(7+9TW$LbIBzD!xea1?gc>_W?pm>k(Qx{*t;-g zCJ05}gF^$8nSPa6Hw_`0OlDruR0EHxh3+9C16vQ_4PLlRgwQD%-tb72F(@-1P3;Fd zz|Qd^4=;s(9rcMR54OV_Zp~T@Re#Rrbqv9G3PYJX*zCc3;)Yu#n8C(Vz*8%#bhi3j)4FG;T_C3V@AM$s<>w%c>#Ewv2; zPt>p3@SthiiS&|2=7=Kw?e7nC*}KF$igq7PikJaNSbwQ`Hh0)^-(!w>-*|2eqD^W; zl0P#qvdh3R;=1{tx?MqDIXO4ouhaBp#b}^z>dWql%wg7c1>?lryQ!E?W)1jX{xTE` z-0r-;@S;3-w_W=Na1%)#+9JEqgfD+nCL7bmmxm$i!q(gCu^|HMT*0#ZzD0U|NPIW; zy{wJZL~oqxIN4%QM1k83h4O>AsB<|tqta;($!5V0aFNpxV?!Ism%i*b4iSh(mBIM@ z6no4&xN4_fa##qu)~;dFWjkQ(lN+a$C252E z4R7X>BBYmf!kZHImf8%`pQXO0Kr3VT3YlbrM&SR3wsMjsGhv$mgw1+A=$*n|?D27c^iQhI?MzKX31e}o zUzn4=p~RcoTl$iJENA39&iCR`kqtH7kvhj(23u^Y*aA5RCHaad^Mjjlhzbk_k0*?eDKw=O4PLfb`5zm zXwdbX`?&Uau6i~_yr1_PR-$~}803ed{$%^Tah$W-j=75h zcn1s?Y)sLp>Qq3aV`EEdbHq{kO;QoEdZL;oL0=XH^h?u9F>gpCIzHc=W-Nm&7+t^$ zle4L4IlM^%l`I6;j3bW~NJZuNsPZw~|4O@yNy{{2RD~?}`o(vc$BpNK=2GUxb#QH) zh*;g%Iq-(VNM1N*oUw|deGNN%K`MI1f1I12KI^+AKZU&*;KFetPoutR%yN4j(xe-C zvae9?07<&epmZSdGIGBf1%3Yl89hm?lphtxcOP%^vS)~}Tv+~F$RVXwE;9|u5_h}U zzRN|cO?gd;M2L+Q>DGmi|9BcQA|@$=QsB#cxtz9%Ij`1!*dHS6O?U3NUnl1%=QD=d zNW9yvpB0T_E6M8vpjuUxf?HzeQ-yrZ8T2lSfg;mPSN5rF-H|j|iQnVOrC**dY#x8Hp_trzyxE6|bQ9`P=<=fbrSJl>aPZ0bS}bEExuroj)evJpJG90#!v z#|F%UX@>)EoOLhaoaPXVRwVJ~x<| z7fUyd86Es^pMRZ>`RWxDe)T+)*>W22A#0TKV8J?P=GjCl3Yh6xJe^*mj*rh}72zUU zG{?A8?dckFISne~^L_5ZYp35~t!Pw&e(rcEeZO_j&bYtgZ5nSG8!JY-h8K_M>VCd7 z_S8;9#W_?W5I-~I`L>M(#llQ|fuG0|4w<1ba_r+d$L_59i+VN?c>F}Wonawm70PYf zPzqlQb2X~4!+Sx)O-pmxz$)43kseW;!(Q~wG^SstQ_m71x$vWZ#OaOX5X=0PX36t) zD)@@R$`?SDL0lS&X@1(3UorbVCHGO=%<$$yrvQER85EexIas7HdlU!mySszX7_)sH z7^Ovij5iIm20`{PPDdRN_$E3&f$S58VxMQYWaA^%N149!X`Loz)_9+O?|Z1gReG-T6mY7CdHHBY{L)(!r;yCK{C|`;>EqkGy81V^t9CkD%TXcODNkfz(UE7_!|zs-$79 z0sJ?Fr8AH|ANEe%*DD0v9s1D>nKp(OfZa4eNXFpQtLCRkc6Ts%-5hP)VjZoeCWTX( zD!^iTg4!CNX7IGLZFS9myp`rMF^TDU-0n7ys}bchh*k%`kl>&7MZ?J*%(x+nFn6rpjzFST^2TO z?AumjndF680x@n;E?(r7?b6V!DVRBL3Ut9IP6WAl{X)fLhud~>9u zbxMIpk!VGsiHS?sAqYoy?Jj2ZqoH)S=RPD4@s&r6`H(n^%{{&~aSG4qd^H+ox_7jT zo9Ar}lVtQ8=k*k?tXWZFZ~?pC*<#tD@A%&A|Duqr-QK-Q9Sx+KS!bCR$7BowQY5*KGjDfVC zqh$80+hbaH4O+naE;Qx=48ceS3s;*AXvW4L8V<(Ms1V4%N2?_ajs!W1x-&7yilTIa zWHZ)EUTmVM@Z>&%=vvUc!k%&Vb2~^oKDO$!fL?_rdU~ef7ZO;nYA7>!)9bR#af4@L z)XTkt!^)z3g}!m|23hLFhgVPK6Fq)W@tl0D4SP8pC*;5)L-pi$Rjipa@zyusy6fPK z`*Ys0TDJfTZw#B^no+!8l_+CAx0!j5{>f*}f5C* zMpSkN@uU%vj!=AcFqUokRd&3@$OW5_=9&^Q?1}UohL`txS~eJYa{2X!jtv)>ofZp| z5+y@lY#NY8TZHW?uEgTWj#;xvi=+m+@567{$F-4ecu2**z-Ir@=_yvPV~LS+D*!P z4w!_-c-vH79X0k4O%d!SwOBVDK6B=wFXipj0DtRVTZ4J=dU{JiG(k;e6vF?7nZL%| zin;Hpis0>P8oH>D9G zBn+$)D7n}O#NG!rdTx4dn?eh#Y7ef@Hvyc?Vmt>SwT2REc)5Q0k7W{kY(oFqG29L@ ztT(-|bADFRRMI^tE*b3l;=!!m+|ht$FF#N2-wC8}qnEO70$Vkk{LCb3O{S_fZcyQH zE6e<`@?OfRjU!tUTU~8&mW+7k9gTECS-!Mhv!ozorZ=WPg+FSpAiB!nfsB9Q$k5Jv zhCJNSpgr{5V*AdE`p(fQP^>eA^P-8#Z-A3KL?jq9@s=z5K&HLHKq5umqTXD=WdZAo zU&I)?{!M7ua2GN9#849q5{)V&@z%Q9CHK1XRm}TpItiwve=Fy7+1+rUZI$GhUb*ix z9uBsrb>N5*(N~xFY=nRfmJU}AU#z9iP7s?P)LUhxC>JwfX~GZ>dcA#OOe{nnuh~E) zNdZNol?I(qNNGk)1UMno`rLk)TZ+58zpdPXMZdlsP8fF-tPfxUc4b>4~nKo`7T&`Q(om`F3qNlrFj}@ZR(hQ5&!l%Kyyen z4mzY=f`9T2N253skZXWV>A8W)n3cK|@UHcC{1vs*)0><&4>0V-;JRGcW~k0x*jdJN zn9PJB2<-JU37An!c|26@;N3gSv<~S$|MfhbjHwIVSe(q-gPQn}9TYW>LgzX zV&B@LNo9s9gMxOYd$OHRF|Fb)$lrzxd(F*fJ3zx?S20*NxG~q^>8~{xIkZz)`Z|BCZA&RiERIk&bR@sJ0E>siUzx`{(JO{9k9?c6>u3* z<4Q->lnrdXkRe@e>RP3Qw3BHbvguwk#=2SW45=zLUDa@QyXbEb;Ih-7MTFZph0s}I z{N1<+1O*M^&^_UKi+*Bw>^>xS{2`m2h#-T~dglNO=6c}3Hl_^y>P0&zSMT@>4P^_2 zLwA=N%SA*hN*bTW3LOUZs-Q5XW_?x(9AYp(z-l;8fudy>RvKv z;^(q+yHrRARTeGl(PY*VXI>jvP4TeZZ^)XzE!@?3=bTCWgDL&T&ag1VCBT04G6xbd zENxN~Xi_yfCL#(ln1qI*;TY4#C5R1u!VR}l`T`)E7cE54I;X{`-3V?!zYp&4{sA=u zY5X7I%M@f#{CHNQS@w7n`m9JkL(hKzrBC!|zxY4&sA95$z&{iD|KUV0{{O{^ej-)j zDmV*&{X;|{`)e#h{ZphSj~d2rEud_wl=crZ_X% - - - - AnchorJS - Add deep anchor links to your docs - - - - - - - - - - -
    -

    AnchorJS

    - -
    -

    Add deep anchor links to your docs.

    -

    What are "deep anchor links"? Here are a few examples:

    -
    -
    -
    -
    - -

    Lorem ipsum dolor consectetur amet nulla elit. Vivamus luctus urna sed urna ultricies. Vivamus luctus urna sed.

    - {} -
    -
    -
    anchors.options.visible = 'always';
    -anchors.add('h3');
    -
    -
    -
    -
    -

    Paragraph Link

    - - {} -
    -
    -
    anchors.options = {
    -  visible: 'always',
    -  placement: 'left',
    -  icon: '¶'
    -};
    -anchors.add('p');
    -
    -
    -
    -

    See more examples

    -
    -

    Used by

    - - Bootstrap Logo - ESLint logo - 18F Logo - Bundler Logo - Mocha Logo - Middleman logo - -
    -
    -
    -

    Overview

    - Examples of deep anchor links from across the web. -

    AnchorJS lets you drop deep anchor links (like these) onto any webpage, and be on your way.

    -

    You don't need to set up IDs or worry about urls. AnchorJS will respect your IDs if you have them, and generate them if you don't.

    -

    It uses an attractive link icon by default, but you can customize the display via options and CSS syling. The examples demonstrate a few customization ideas.

    -

    Finally, AnchorJS is lightweight, accessible, and has no dependencies.

    - -

    Installation

    - -

    Download AnchorJS using npm,

    -
    npm install anchor-js
    -

    or bower:

    -
    bower install anchor-js
    -

    (or just download it from github).

    -

    Then include the anchor.js file (or anchor.min.js) in your webpage.

    -
    <script src="anchor.js"></script>
    -

    You could also include it via a CDN like CDNJS or jsDelivr.

    -

    If you're using it from Node/CommonJS, include it via:

    -
    var anchorJS = require('anchor-js');
    -var anchors = new anchorJS();
    - -

    Basic usage

    -

    AnchorJS provides the anchors.add() method which takes a CSS selector (similar to jQuery) for targeting elements you want to deep-link. Here are some usage examples.

    -
    /**
    - * Example 1
    - * Add anchors to all h1's on the page
    - */
    -anchors.add('h1');
    -
    -/**
    - * Example 2
    - * Adds anchors to elements that have been assigned the class '.anchored'
    - */
    -anchors.add('.anchored');
    -
    -/**
    - * Example 3
    - * If no selector is provided, it falls back to a default selector of:
    - * 'h2, h3, h4, h5, h6'
    - */
    -anchors.add();
    - -

    Don't run it too late!

    -

    You need to add anchors to the page early in the page load process if you want browsers to jump to the ID properly.

    -

    We recommend you call anchors.add() before the DOM finishes loading...

    - -
    <!-- Add anchors before the closing body tag. -->
    -  <script>
    -    anchors.add();
    -  </script>
    -</body>
    -

    ...or on DOMContentLoaded:

    -
    // Add anchors on DOMContentLoaded
    -document.addEventListener("DOMContentLoaded", function(event) {
    -  anchors.add();
    -});
    - -

    Don't add anchors on later events, like $(document).ready() or window.onload as some browsers will attempt to jump to your ID before AnchorJS can add it to the page. For more details, see github issue #69).

    - -

    Options

    -

    You can set a number of options to customize how your anchors look:

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionAccepted ValuesDefault ValueDescription
    placementright
    left
    rightright appends the anchor to the end of the element.
    left places it to the left, in the margin.
    visiblehover
    always
    touch
    hoverhover displays the anchor when hovering over the element.
    always will always display the anchor link.
    touch will always display anchors for devices that support touch events, and only display them via hover for devices that do not support touch events. This approximates touchscreen detection (but isn't 100% accurate).
    icon(any unicode character)Replace the default link icon with the character(s) provided. These are a few good options: #, , , and §.
    class(any string)(none)Adds the provided class(es) to the anchor html.
    truncate(any positive number)64Truncates the generated ID to the specified character length. Note: the length may not be exactly the same, if there are dangling spaces or hyphens to be trimmed.
    ariaLabel(any text)AnchorAllows you to customize or translate the default aria-label ("Anchor"), for screenreaders that encounter the link.
    -

    For example:

    -
    /**
    - * Example 1
    - * Add anchors to all h1s, h2s and h3s inside of #post.
    - * Anchors will be always visible.
    - */
    -anchors.options.visible = 'always';
    -anchors.add('#post h1, #post h2, #post h3');
    -
    -/**
    - * Example 2
    - * Provide options as an object before adding anchors to the page.
    - * Adds always-visible ¶ anchors in the left margin of each p tag inside .story
    - */
    -anchors.options = {
    -  placement: 'left',
    -  visible: 'always',
    -  icon: '¶'
    -};
    -anchors.add('.story > p');
    - -

    Advanced usage

    - -
    -

    Section IDs

    -

    In some cases, you might want to link to existing section IDs instead of the heading element itself. You can instruct AnchorJS to do this with the data-anchor-id attribute:

    -
    <section id="section-1">
    -  <h3 data-anchor-id="section-1">Section 1</h3>
    -  <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed...</p>
    -</section>
    -
    -<!-- ... -->
    -
    -<script>
    -  anchors.add('h3');
    -</script>
    -

    This allows you to do things like highlight sections when your users jump to them.

    -
    - -

    Removing anchors

    -

    You can remove anchors with the anchors.remove() or anchors.removeAll() methods:

    -
    /**
    - * Example 1
    - * Remove anchors from all h1s on the page.
    - */
    -anchors.remove('h1');
    -
    -/**
    - * Example 2
    - * Remove all anchors from the page.
    - */
    -anchors.removeAll();
    -

    Removing anchors with .remove() should be uncommon. If you simply want anchors on a more selective group, consider using the CSS :not() pseudo-class when you add them, like so:

    -
    /**
    - * Example 2
    - * Add anchors to all h2s, except for those with a class of "no-anchor".
    - */
    -anchors.add('h2:not(.no-anchor)');
    - -

    Chaining commands

    -

    You can chain commands of add() and remove() (since they return a copy of anchors), but it's usually more performant to lean on CSS when targeting elements: - -

    /**
    -  * Example 1
    -  * Adds anchors to `.my-anchors` and `.my-other-anchors` except for those
    -  * with a class of `no-anchor`.
    -  */
    - anchors.add('.my-anchors').add('.my-other-anchors').remove('.no-anchor');
    -
    - /**
    -  * Example 2
    -  * A more performant way to add anchors to the same classes in Example 1 above.
    -  */
    -  anchors.add('.my-anchors:not(.no-anchor), .my-other-anchors:not(.no-anchor)');
    - -

    Multiple sets of anchors

    -

    You can have multiple sets of anchors on one page, each with their own design. To do so, just create your own instances of the AnchorJS object:

    -
    var sidebarAnchors = new AnchorJS();
    -anchors.add('.main h2'); // The default instance.
    -sidebarAnchors.add('.sidebar h2'); // The new instance.
    -

    You can preset your instance with whatever options you like:

    -
    var sidebarAnchors = new AnchorJS({
    -  placement: 'left',
    -  icon: '¶'
    -});
    -sidebarAnchors.add('.sidebar h2');
    - -

    Generating navigations

    -

    AnchorJS doesn't include methods for dynamically generating navigations (like a table of contents or jump nav). This is to keep AnchorJS lightweight and simple for the most common usecases.

    -

    However, AnchorJS does expose a list of all anchored elements at anchors.elements. This way, external code can look up the elements and use them to generate navigations (as shown in this example).

    -

    You can also use AnchorJS alongside a static navigation with pre-defined IDs (as is done in this example).

    - -

    Examples

    -
    -
    -
    -

    Basic Link

    -

    Lorem ipsum dolor consectetur amet nulla elit. Vivamus luctus urna sed urna ultricies. Vivamus luctus urna sed.

    - {} -
    -
    -
    anchors.options.visible = 'always';
    -anchors.add('h3');
    -
    -
    -
    -
    -

    Basic Link - Left

    -

    Lorem ipsum dolor consectetur amet nulla elit. Vivamus luctus urna sed urna ultricies. Vivamus luctus urna sed.

    - {} -
    -
    -
    anchors.options = {
    -  visible: 'always',
    -  placement: 'left'
    -};
    -anchors.add('h3');
    -
    -
    -
    -
    -

    Paragraph Link

    - - {} -
    -
    -
    anchors.options = {
    -  visible: 'always',
    -  placement: 'left',
    -  icon: '¶'
    -};
    -anchors.add('p');
    -
    -
    -
    -
    -

    Octothorp

    -

    Lorem ipsum dolor consectetur amet nulla elit. Vivamus luctus urna sed urna ultricies. Vivamus luctus urna sed.

    - {} -
    -
    -
    anchors.options = {
    -  visible: 'always',
    -  icon: '#'
    -};
    -anchors.add('h3');
    -
    -
    -
    -
    -

    Unicode Icon 1

    -

    Lorem ipsum dolor consectetur amet nulla elit. Vivamus luctus urna sed urna ultricies. Vivamus luctus urna sed.

    - {} -
    -
    -
    anchors.options = {
    -  visible: 'always',
    -  placement: 'left',
    -  icon: '§'
    -};
    -anchors.add('h3');
    -
    -
    -
    -
    -

    Unicode Icon 2

    -

    Lorem ipsum dolor consectetur amet nulla elit. Vivamus luctus urna sed urna ultricies. Vivamus luctus urna sed.

    - {} -
    -
    -
    anchors.options = {
    -  visible: 'always',
    -  icon: '❡'
    -};
    -anchors.add('p');
    -
    -
    -
    -
    -

    Custom Text

    -

    Lorem ipsum dolor consectetur amet nulla elit. Vivamus luctus urna sed urna ultricies. Vivamus luctus urna sed.

    - {} -
    -
    -
    anchors.options = {
    -  visible: 'always',
    -  icon: '# LINK'
    -};
    -anchors.add('h3');
    -
    .anchorjs-link {
    -  font-weight: 200;
    -  margin-left: 1em;
    -  padding-right: 0.375em;
    -  font-size: 0.5em;
    -  border: 1px dashed #FFBAAC;
    -  vertical-align: middle;
    -}
    -
    -
    -
    -
    -

    Custom Image

    -

    Lorem ipsum dolor consectetur amet nulla elit. Vivamus luctus urna sed urna ultricies. Vivamus luctus urna sed.

    - {} -
    -
    -
    // Use an empty string ('') for the icon when styling the background with CSS.
    -anchors.options = {
    -  visible: 'always',
    -  placement: 'left',
    -  icon: ''
    -};
    -anchors.add('h3');
    -
    .anchorjs-link {
    -  width: 14px;
    -  height: 32px;
    -  margin-top: 6px;
    -  margin-left: -1.25em !important;
    -  background: url('img/mini-logo.png') no-repeat;
    -}
    -
    -
    -
    -
    -

    Link w/CSS Styling

    -

    Lorem ipsum dolor consectetur amet nulla elit. Vivamus luctus urna sed urna ultricies. Vivamus luctus urna sed.

    - {} -
    -
    -
    anchors.options = {
    -  visible: 'always',
    -  placement: 'left'
    -};
    -anchors.add('h3');
    -
    .anchorjs-link {
    -  display: inline-block;
    -  height: 32px;
    -  width: 18px;
    -  border-radius: 50%;
    -  background-color: #FF5231;
    -  color: white;
    -  margin-top: 4px;
    -  margin-left: -1.4em !important;
    -}
    -.anchorjs-link:before {
    -  margin-left: 7px;
    -  margin-top: -4px;
    -  display: block;
    -}
    -
    -
    -
    -
    -

    Icon Font

    -

    Lorem ipsum dolor consectetur amet nulla elit. Vivamus luctus urna sed urna ultricies. Vivamus luctus urna sed.

    - {} -
    -
    -
    // Just pass in the octal code for your icon-font character.
    -anchors.options = {
    -  visible: 'always',
    -  icon: '\uf0c1'
    -};
    -anchors.add('h3');
    -
    .anchorjs-link {
    -  font-family: 'your-icon-font';
    -}
    -
    -
    -
    -
    -

    SVG Icon

    -

    Lorem ipsum dolor consectetur amet nulla elit. Vivamus luctus urna sed urna ultricies. Vivamus luctus urna sed.

    - {} -
    -
    -
    anchors.options = {
    -  visible: 'always',
    -  icon: ''
    -};
    -anchors.add('h3');
    -
    .anchorjs-link {
    -  display: inline-block;
    -  background: url('img/hyperlink.svg') no-repeat;
    -  margin-left: 8px;
    -  width: 14px;
    -  height: 24px;
    -}
    -
    -
    -
    -
    -

    Base64 Icon

    -

    Lorem ipsum dolor consectetur amet nulla elit. Vivamus luctus urna sed urna ultricies. Vivamus luctus urna sed.

    - {} -
    -
    -
    anchors.options = {
    -  visible: 'always',
    -  placement: 'left',
    -  icon: ''
    -};
    -anchors.add('h3');
    -
    .anchorjs-link {
    -  background: url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cjxzdmcgd2lkdGg9IjIwcHgiIGhlaWdodD0iMTBweCIgdmlld0JveD0iMCAwIDIwIDEwIiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogICAgPGRlZnM+PC9kZWZzPgogICAgPGcgaWQ9IlBhZ2UtMSIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCI+CiAgICAgICAgPGcgaWQ9ImxpbmsiIGZpbGw9IiNGRjUyMzEiPgogICAgICAgICAgICA8cGF0aCBkPSJNMTUsMCBMMTIuMzA0Njg3NSwwIEMxMy4yNDIxODc1LDAuNjI1IDE0LjEyMTA5MzgsMS43MzgyODEyNSAxNC4zOTQ1MzEyLDIuNSBMMTQuOTgwNDY4OCwyLjUgQzE2LjI1LDIuNSAxNy40ODA0Njg4LDMuNzUgMTcuNDgwNDY4OCw1IEMxNy40ODA0Njg4LDYuMjUgMTYuMjEwOTM3NSw3LjUgMTQuOTgwNDY4OCw3LjUgTDExLjIzMDQ2ODgsNy41IEMxMCw3LjUgOC43MzA0Njg3NSw2LjI1IDguNzMwNDY4NzUsNSBDOC43MzA0Njg3NSw0LjU1MDc4MTI1IDguODY3MTg3NSw0LjEyMTA5Mzc1IDkuMDgyMDMxMjUsMy43NSBMNi40MDYyNSwzLjc1IEM2LjMwODU5Mzc1LDQuMTYwMTU2MjUgNi4yNSw0LjU3MDMxMjUgNi4yNSw1IEM2LjI1LDcuNSA4LjczMDQ2ODc1LDEwIDExLjIzMDQ2ODgsMTAgTDE1LDEwIEMxNy41LDEwIDIwLDcuNSAyMCw1IEMyMCwyLjUgMTcuNSwwIDE1LDAgTDE1LDAgWiBNNS42MDU0Njg3NSw3LjUgTDUuMDE5NTMxMjUsNy41IEMzLjc1LDcuNSAyLjUxOTUzMTI1LDYuMjUgMi41MTk1MzEyNSw1IEMyLjUxOTUzMTI1LDMuNzUgMy43ODkwNjI1LDIuNSA1LjAxOTUzMTI1LDIuNSBMOC43Njk1MzEyNSwyLjUgQzEwLDIuNSAxMS4yNjk1MzEyLDMuNzUgMTEuMjY5NTMxMiw1IEMxMS4yNjk1MzEyLDUuNDQ5MjE4NzUgMTEuMTMyODEyNSw1Ljg3ODkwNjI1IDEwLjkxNzk2ODgsNi4yNSBMMTMuNTkzNzUsNi4yNSBDMTMuNjkxNDA2Miw1LjgzOTg0Mzc1IDEzLjc1LDUuNDI5Njg3NSAxMy43NSw1IEMxMy43NSwyLjUgMTEuMjY5NTMxMiwwIDguNzY5NTMxMjUsMCBMNSwwIEMyLjUsMCAwLDIuNSAwLDUgQzAsNy41IDIuNSwxMCA1LDEwIEw3LjY5NTMxMjUsMTAgQzYuNzU3ODEyNSw5LjM3NSA1Ljg3ODkwNjI1LDguMjYxNzE4NzUgNS42MDU0Njg3NSw3LjUgTDUuNjA1NDY4NzUsNy41IFoiIGlkPSJTaGFwZSI+PC9wYXRoPgogICAgICAgIDwvZz4KICAgIDwvZz4KPC9zdmc+") no-repeat;
    -  margin-top: 15px;
    -  height: 16px;
    -  width: 20px;
    -}
    -
    -
    -
    -
    -

    CSS Icon

    -

    Lorem ipsum dolor consectetur amet nulla elit. Vivamus luctus urna sed urna ultricies. Vivamus luctus urna sed.

    - {} -
    -
    -
    anchors.options = {
    -  visible: 'always',
    -  placement: 'left',
    -  icon: ''
    -};
    -anchors.add('h3');
    -
    /* See also: nicolasgallagher.com/pure-css-gui-icons */
    -.anchorjs-link {
    -  border-color: #FF5231 #FF5231 transparent;
    -  border-width: 15px 7px 6px;
    -  border-style: solid;
    -  margin-top: 10px;
    -  font-size: 22px;
    -  padding-right: 0 !important;
    -}
    -
    -
    -
    -
    -

    Emoji

    -

    Lorem ipsum dolor consectetur amet nulla elit. Vivamus luctus urna sed urna ultricies. Vivamus luctus urna sed.

    - {} -
    -
    -
    anchors.options = {
    -  visible: 'always',
    -  placement: 'left',
    -  icon: '⚓'
    -};
    -anchors.add('p');
    -
    .anchorjs-link {
    -  margin-left: -1.8em !important;
    -}
    -
    -
    - -
    -
    -

    Grunticon

    -

    Lorem ipsum dolor consectetur amet nulla elit. Vivamus luctus urna sed urna ultricies. Vivamus luctus urna sed.

    - {} -
    -
    -
    // Assuming you have set up
    -// grunticon and you have a
    -// grunticon class named
    -// 'icon-grunticon-link'...
    -anchors.options = {
    -  visible: 'always',
    -  class: 'icon-grunticon-link'
    -  icon: ''
    -};
    -anchors.add('h3');
    -
    .anchorjs-link {
    -  display: inline-block;
    -  margin-left: 0.375em;
    -  width: 0.375em;
    -  height: 20px;
    -}
    -
    -
    - -
    - -

    Hover examples

    -
    -
    -
    -

    Basic Hover

    -

    Lorem ipsum dolor consectetur amet nulla elit. Vivamus luctus urna sed urna ultricies. Vivamus luctus urna sed.

    - {} -
    -
    -
    anchors.add('h3');
    -
    -
    -
    -
    -

    Color Transition

    -

    Lorem ipsum dolor consectetur amet nulla elit. Vivamus luctus urna sed urna ultricies. Vivamus luctus urna sed.

    - {} -
    -
    -
    anchors.add('h3');
    -
    .anchorjs-link:hover {
    -  color: #2500AD;
    -}
    -*:hover > .anchorjs-link {
    -  transition: color .25s linear;
    -}
    -
    -
    -
    -
    -

    Shift Out

    -

    Lorem ipsum dolor consectetur amet nulla elit. Vivamus luctus urna sed urna ultricies. Vivamus luctus urna sed.

    - {} -
    -
    -
    anchors.options.placement = 'left';
    -anchors.add('h3');
    -
    .anchorjs-link {
    -  transition: all .25s linear;
    -}
    -*:hover > .anchorjs-link {
    -  margin-left: -1.125em !important;
    -}
    -
    -
    - -
    -
    -

    Arrow

    -

    Lorem ipsum dolor consectetur amet nulla elit. Vivamus luctus urna sed urna ultricies. Vivamus luctus urna sed.

    - {} -
    -
    -
    anchors.options.icon = '# LINK';
    -anchors.add('h3');
    -
    /* Based on http://codepen.io/corysimmons/pen/NPBXbe */
    -/* Vendor prefixes not included */
    -.anchorjs-link {
    -  position: relative;
    -  top: 4px;
    -  height: 36px;
    -  flex: 1;
    -  background: #FF5231;
    -  color: white;
    -  font-family: Helvetica, Arial, sans-serif;
    -  font-weight: 200;
    -  font-size: 1rem;
    -  margin-right: -6%;
    -  padding-right: 6%;
    -  padding-left: 42px !important;
    -  line-height: 38px;
    -  transition: all 0.5s ease;
    -  transform: translateX(100%);
    -}
    -.anchorjs-link::before {
    -  position: absolute;
    -  display: block;
    -  left: 0;
    -  width: 0;
    -  height: 0;
    -  content: '';
    -  border: 18px solid #fdfdfd; /* Background color */
    -  border-right-color: #FF5231;
    -  transition: all 0.5s ease;
    -}
    -h2 {
    -  display: flex;
    -}
    -*:hover > .anchorjs-link {
    -  transform: translateX(0);
    -}
    -*:hover > .anchorjs-link:hover {
    -  background: #FF806A;
    -}
    -*:hover > .anchorjs-link:hover::before {
    -  border-right-color: #FF806A;
    -}
    -
    -
    - -
    -
    -

    Tooltip

    -

    Lorem ipsum dolor consectetur amet nulla elit. Vivamus luctus urna sed urna ultricies. Vivamus luctus urna sed.

    - {} -
    -
    -
    anchors.options = { icon: 'Permalink' };
    -anchors.add('h3');
    -
    /* tooltip box */
    -.anchorjs-link:after {
    -  display: inline-block;
    -  transition: opacity .25s linear;
    -  font-family: Verdana, sans-serif;
    -  font-size: 0.75ex;
    -  font-weight: 100;
    -  padding: 0.5ex 1.5ex;
    -  background: #444;
    -  color: #fff;
    -  border-radius: 0.6ex;
    -  vertical-align: 0.8ex;
    -}
    -/* tooltip arrow */
    -.anchorjs-link:before {
    -  content: '';
    -  display: inline-block;
    -  border-top: 0.3ex solid transparent;
    -  border-right: 0.5ex solid #444;
    -  border-bottom: 0.3ex solid transparent;
    -  vertical-align: 0.35ex;
    -}
    -.anchorjs-link:hover:after {
    -  background-color: #666;
    -}
    -.anchorjs-link:hover:before {
    -  border-right-color: #666;
    -}
    -
    -
    - -
    - - Fork me on GitHub -
    - - - - - - - diff --git a/modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/docs/scripts.js b/modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/docs/scripts.js deleted file mode 100644 index c283e73a41..0000000000 --- a/modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/docs/scripts.js +++ /dev/null @@ -1,12 +0,0 @@ -$(document).ready(function() { - var preEls = $('pre'); - - $('.example-code-link').click(function(e) { - e.preventDefault(); - $(this).parent().next().slideToggle(); - }); - - // Dynamically add PrismJS class for syntax highlight - preEls.filter('[class*="js"]').find('code').addClass('language-javascript'); - preEls.filter('.css').find('code').addClass('language-css'); -}); diff --git a/modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/docs/styles.css b/modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/docs/styles.css deleted file mode 100644 index 5e588f5fd7..0000000000 --- a/modules/docs/src/Volo.Docs.Web/wwwroot/lib/anchor-js/docs/styles.css +++ /dev/null @@ -1,494 +0,0 @@ -/*//// Base Styles ////*/ - -div, -article, -section, -main, -footer, -header, -form, -fieldset, -pre, -code, -p, -input[type="text"], -input[type="tel"], -input[type="email"], -input[type="url"], -input[type="password"] { - box-sizing: border-box; -} - -body { - font-family: 'Source Sans Pro', sans-serif; - background-color: rgb(162, 255, 224); - color: #262626; - margin: 0 1.5em; -} - -h1 { - font-size: 2.2em; -} -h2 { - font-size: 2.0em; - margin-top: 1.5em; -} -h3 { - font-size: 1.8em; -} - -table { - border-collapse: collapse; - background: white; - box-shadow: 0px 0px 10px -4px #666; - border: 1px solid white; -} - -table td, -table th { - padding: 0.5em; - border: 1px solid #ddd; -} - -img { - max-width: 100%; -} - -a { - color: black; - text-decoration: underline; -} - -/*//// Code Snippet Styles ////*/ - -code, -samp, -kbd { - background-color: #141414; - color: #f7f7f7; - font-family: "Inconsolata", "Menlo", "Consolas", monospace; - font-size: 0.9em; - padding: 2px 6px; - text-align: left; - border-radius: 3px; -} - -pre { - background-color: #141414; - color: #f7f7f7; - font-family: "Inconsolata", "Menlo", "Consolas", monospace; - font-size: 0.9em; - line-height: 1.2em; - margin: 0; - overflow: auto; - padding: 1em; - border-radius: 3px; -} - -.examples pre, -.hover-examples pre, -.preview-examples pre { - padding-left: 2.75em; - border-radius: 0; -} - -/* Override 'code' css rules if using 'pre > code' markup. */ -pre > code { - font-size: 1em; - padding: 0px; -} - -/* for IE7 and IE6 */ -*:first-child+html pre { - overflow: visible; - overflow-x: auto; - overflow-y: hidden; - padding-bottom: 2em; -} - -* html pre { - overflow: visible; - overflow-x: auto; - padding-bottom: 2em; -} - -/* Reset PrismJS' border styles */ -.main pre[class*="language-"], -.example pre[class*="language-"] { - border: 0; - border-radius: 3px; -} - -/*//// Page Styles ////*/ -.header { - max-width: 720px; - margin: 0 auto; - padding-top: 1.5em; -} - -.page-title { - text-align: center; -} - -.logo { - display: block; - margin: 0 auto; -} - -.desc { - padding: 1em 0; - text-align: center; -} -.maindesc { - font-size: 30px; - margin-bottom: 1em; -} -.subdesc { - font-size: 15px; -} - -.more-examples { - text-align: right; - font-size: 12px; - margin: 0 5px 0 0; -} - -.main { - line-height: 1.4; - margin: 0 auto; - max-width: 720px; -} -.used-by { - text-align: center; - position: relative; - padding: 1em 0; -} -.used-by-label { - font-size: 20px; - text-align: center; - font-weight: normal; -} -.used-by img { - border-radius: 8px; - opacity: 1; - margin: 0px 10px; - width: 96px; -} - -.anchorlink-examples { - float: right; - margin: 0 0 1em 1em; - box-shadow: 0px 0px 10px -3px #666; -} - -.options-table { - width: 100%; - margin: 1em 0; -} - -.minicol { - width: 62px; -} - -.footer { - text-align: center; - color: #777; -} -.footer a { - color: #777; -} - -/*///////////// Examples /////////////*/ - -.examples, -.hover-examples, -.preview-examples { - max-width: 720px; - margin: 0 auto; - display: -webkit-flex; - display: flex; - -webkit-flex-direction: row; - flex-direction: row; - -webkit-justify-content: center; - justify-content: center; - -webkit-flex-wrap: wrap; - flex-wrap: wrap; - -webkit-align-content: flex-end; - align-content: flex-end; -} - -.example { - max-width: 350px; - min-height: 160px; - margin: 5px; -} -.example-label { - font-size: 12px; - color: #777; - display: none; -} -.example-content { - padding: 0 0 0 3.5em; - overflow: hidden; - position: relative; - background: #fff; - box-shadow: 0px 0px 10px -3px #666; -} - -.example-code-link { - width: 16px; - position: absolute; - top: 8px; - right: 8px; - font-family: Courier monospace; - color: #aaa; - text-decoration: none; -} - -.example-code-link:hover:after, -.example-code-link:focus:after { - left: -50px; - opacity: 1; - -webkit-transition: all 0.25s ease-in; - transition: all 0.25s ease-in; -} - -.example-code-link:after { - content: "SOURCE"; - font-family: Helvetica, Arial, sans-serif; - font-size: 10px; - line-height: 1; - display: block; - position: absolute; - text-transform: uppercase; - top: 7px; - left: -45px; - opacity: 0; - -webkit-transition: all 0.25s ease-in; - transition: all 0.25s ease-in; -} - -.example-code { - display: none; -} - -.css { - border-top: 1px solid #666; -} - -.css, -.js { - position: relative; -} - -.css::before, -.js::before { - left: 0; - top: 0; - padding: 1px 4px; - color: white; - background: #FF5231; - position: absolute; - font-size: 11px; - text-transform: uppercase; -} - -.css::before { - content: 'css'; -} -.js::before { - content: 'js'; -} - -.example-content > p { - width: 310px; -} - -.anchorjs-link { - color: #FF5231; -} - -/*///// Styles within Examples /////*/ -.examples .example:nth-child(3) .anchorjs-link, -.preview-examples .example:nth-child(2) .anchorjs-link { - font-family: Helvetica, Arial, sans-serif; -} - -.examples .example:nth-child(7) .anchorjs-link { - font-weight: 200; - margin-left: 1em; - padding-right: 0.375em; - font-size: 0.5em; - border: 1px dashed #FFBAAC; - vertical-align: middle; -} - -.examples .example:nth-child(8) .anchorjs-link { - width: 14px; - height: 32px; - margin-top: 6px; - background: url('img/mini-logo.png') no-repeat; - margin-left: -1.25em !important; -} - -.examples .example:nth-child(9) .anchorjs-link:after { - margin-left: 7px; - margin-top: -4px; - display: block; -} - -.examples .example:nth-child(9) .anchorjs-link { - background-color: #FF5231; - height: 32px; - width: 18px; - border-radius: 50%; - display: inline-block; - color: white; - margin-top: 4px; - margin-left: -1.4em !important; -} - -.examples .example:nth-child(11) .anchorjs-link { - display: inline-block; - background: url('img/hyperlink.svg') no-repeat; - margin-left: 8px; - width: 14px; - height: 24px; -} - -.examples .example:nth-child(12) .anchorjs-link { - background: url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cjxzdmcgd2lkdGg9IjIwcHgiIGhlaWdodD0iMTBweCIgdmlld0JveD0iMCAwIDIwIDEwIiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogICAgPGRlZnM+PC9kZWZzPgogICAgPGcgaWQ9IlBhZ2UtMSIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCI+CiAgICAgICAgPGcgaWQ9ImxpbmsiIGZpbGw9IiNGRjUyMzEiPgogICAgICAgICAgICA8cGF0aCBkPSJNMTUsMCBMMTIuMzA0Njg3NSwwIEMxMy4yNDIxODc1LDAuNjI1IDE0LjEyMTA5MzgsMS43MzgyODEyNSAxNC4zOTQ1MzEyLDIuNSBMMTQuOTgwNDY4OCwyLjUgQzE2LjI1LDIuNSAxNy40ODA0Njg4LDMuNzUgMTcuNDgwNDY4OCw1IEMxNy40ODA0Njg4LDYuMjUgMTYuMjEwOTM3NSw3LjUgMTQuOTgwNDY4OCw3LjUgTDExLjIzMDQ2ODgsNy41IEMxMCw3LjUgOC43MzA0Njg3NSw2LjI1IDguNzMwNDY4NzUsNSBDOC43MzA0Njg3NSw0LjU1MDc4MTI1IDguODY3MTg3NSw0LjEyMTA5Mzc1IDkuMDgyMDMxMjUsMy43NSBMNi40MDYyNSwzLjc1IEM2LjMwODU5Mzc1LDQuMTYwMTU2MjUgNi4yNSw0LjU3MDMxMjUgNi4yNSw1IEM2LjI1LDcuNSA4LjczMDQ2ODc1LDEwIDExLjIzMDQ2ODgsMTAgTDE1LDEwIEMxNy41LDEwIDIwLDcuNSAyMCw1IEMyMCwyLjUgMTcuNSwwIDE1LDAgTDE1LDAgWiBNNS42MDU0Njg3NSw3LjUgTDUuMDE5NTMxMjUsNy41IEMzLjc1LDcuNSAyLjUxOTUzMTI1LDYuMjUgMi41MTk1MzEyNSw1IEMyLjUxOTUzMTI1LDMuNzUgMy43ODkwNjI1LDIuNSA1LjAxOTUzMTI1LDIuNSBMOC43Njk1MzEyNSwyLjUgQzEwLDIuNSAxMS4yNjk1MzEyLDMuNzUgMTEuMjY5NTMxMiw1IEMxMS4yNjk1MzEyLDUuNDQ5MjE4NzUgMTEuMTMyODEyNSw1Ljg3ODkwNjI1IDEwLjkxNzk2ODgsNi4yNSBMMTMuNTkzNzUsNi4yNSBDMTMuNjkxNDA2Miw1LjgzOTg0Mzc1IDEzLjc1LDUuNDI5Njg3NSAxMy43NSw1IEMxMy43NSwyLjUgMTEuMjY5NTMxMiwwIDguNzY5NTMxMjUsMCBMNSwwIEMyLjUsMCAwLDIuNSAwLDUgQzAsNy41IDIuNSwxMCA1LDEwIEw3LjY5NTMxMjUsMTAgQzYuNzU3ODEyNSw5LjM3NSA1Ljg3ODkwNjI1LDguMjYxNzE4NzUgNS42MDU0Njg3NSw3LjUgTDUuNjA1NDY4NzUsNy41IFoiIGlkPSJTaGFwZSI+PC9wYXRoPgogICAgICAgIDwvZz4KICAgIDwvZz4KPC9zdmc+") no-repeat; - margin-top: 15px; - height: 16px; - width: 20px; -} - -.examples .example:nth-child(13) .anchorjs-link { - border-color: #FF5231 #FF5231 transparent; - border-width: 15px 7px 6px; - border-style: solid; - margin-top: 10px; - font-size: 22px; - padding-right: 0 !important; -} - -.examples .example:nth-child(14) .anchorjs-link { - margin-left: -1.8em !important; -} - -.examples .example:nth-child(15) .anchorjs-link { - display: inline-block; - width: 0.375em; - height: 20px; - margin-left: 0.375em; -} - -/* Hover Examples */ - -.hover-examples .example:nth-child(2) *:hover > .anchorjs-link, -.hover-examples .example:nth-child(2) .anchorjs-link:focus { - transition: color .25s linear; -} -.hover-examples .example:nth-child(2) .anchorjs-link:hover { - color: #2500AD; -} - -.hover-examples .example:nth-child(3) .anchorjs-link { - transition: all .25s linear; -} -.hover-examples .example:nth-child(3) *:hover > .anchorjs-link, -.hover-examples .example:nth-child(3) .anchorjs-link:focus { - margin-left: -1.125em !important; -} - - -.hover-examples .example:nth-child(4) h3 { - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; -} -.hover-examples .example:nth-child(4) .anchorjs-link { - background: #FF5231; - color: white; - font-family: Helvetica, Arial, sans-serif; - font-weight: 200; - font-size: 1rem; - position: relative; - top: 2px; - -webkit-box-flex: 1; - -webkit-flex: 1; - -ms-flex: 1; - flex: 1; - margin-right: -6%; - padding-right: 6%; - padding-left: 42px !important; - height: 36px; - line-height: 38px; - -webkit-transition: all 0.5s ease; - transition: all 0.5s ease; - -webkit-transform: translateX(100%); - -ms-transform: translateX(100%); - transform: translateX(100%); -} -.hover-examples .example:nth-child(4) .anchorjs-link::before { - position: absolute; - left: 0; - display: block; - width: 0; - height: 0; - border: 18px solid #fff; - border-right-color: #FF5231; - content: ''; - transition: all 0.5s ease; -} -.hover-examples .example:nth-child(4) *:hover > .anchorjs-link, -.hover-examples .example:nth-child(4) .anchorjs-link:focus { - -webkit-transform: translateX(0); - -ms-transform: translateX(0); - - transform: translateX(0); -} -.hover-examples .example:nth-child(4) *:hover > .anchorjs-link:hover, -.hover-examples .example:nth-child(4) .anchorjs-link:focus { - background: #FF806A; -} -.hover-examples .example:nth-child(4) *:hover > .anchorjs-link:hover::before, -.hover-examples .example:nth-child(4) .anchorjs-link:focus { - border-right-color: #FF806A; -} - -.hover-examples .example:nth-child(5) .anchorjs-link:after { - display: inline-block; - transition: opacity .25s linear; - font-family: Verdana, sans-serif; - font-size: 0.75ex; - font-weight: 100; - padding: 0.5ex 1.5ex; - background: #444; - color: #fff; - border-radius: 0.6ex; - vertical-align: 0.8ex; -} -.hover-examples .example:nth-child(5) .anchorjs-link:before { - content: ''; - display: inline-block; - border-top: 0.3ex solid transparent; - border-right: 0.5ex solid #444; - border-bottom: 0.3ex solid transparent; - vertical-align: 0.35ex; -} -.hover-examples .example:nth-child(5) .anchorjs-link:hover:after { - background-color: #666; -} -.hover-examples .example:nth-child(5) .anchorjs-link:hover:before { - border-right-color: #666; -} - -/*////// Utilities ////////*/ -/* Clearfix */ -.group:after { - content: ""; - display: table; - clear: both; -} diff --git a/modules/docs/src/Volo.Docs.Web/wwwroot/lib/bootstrap-toc/.bower.json b/modules/docs/src/Volo.Docs.Web/wwwroot/lib/bootstrap-toc/.bower.json deleted file mode 100644 index 1eb20d813b..0000000000 --- a/modules/docs/src/Volo.Docs.Web/wwwroot/lib/bootstrap-toc/.bower.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "name": "bootstrap-toc", - "homepage": "https://github.com/afeld/bootstrap-toc", - "version": "0.4.1", - "_release": "0.4.1", - "_resolution": { - "type": "version", - "tag": "v0.4.1", - "commit": "a46628385301df48d2a0d813b2a7f529a074662b" - }, - "_source": "https://github.com/afeld/bootstrap-toc.git", - "_target": "0.4.1", - "_originalSource": "bootstrap-toc" -} \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Web/wwwroot/lib/bootstrap-toc/.gitignore b/modules/docs/src/Volo.Docs.Web/wwwroot/lib/bootstrap-toc/.gitignore deleted file mode 100644 index f97854ca14..0000000000 --- a/modules/docs/src/Volo.Docs.Web/wwwroot/lib/bootstrap-toc/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -_site/ -node_modules/ -Gemfile.lock -*.sw? diff --git a/modules/docs/src/Volo.Docs.Web/wwwroot/lib/bootstrap-toc/.travis.yml b/modules/docs/src/Volo.Docs.Web/wwwroot/lib/bootstrap-toc/.travis.yml deleted file mode 100644 index 218810bac7..0000000000 --- a/modules/docs/src/Volo.Docs.Web/wwwroot/lib/bootstrap-toc/.travis.yml +++ /dev/null @@ -1,10 +0,0 @@ -sudo: false -language: node_js -node_js: - - "5.1" -branches: - only: - - /.*/ -cache: - directories: - - node_modules diff --git a/modules/docs/src/Volo.Docs.Web/wwwroot/lib/bootstrap-toc/Gemfile b/modules/docs/src/Volo.Docs.Web/wwwroot/lib/bootstrap-toc/Gemfile deleted file mode 100644 index f1b369d2ef..0000000000 --- a/modules/docs/src/Volo.Docs.Web/wwwroot/lib/bootstrap-toc/Gemfile +++ /dev/null @@ -1,3 +0,0 @@ -source 'https://rubygems.org' - -gem 'github-pages', group: :jekyll_plugins diff --git a/modules/docs/src/Volo.Docs.Web/wwwroot/lib/bootstrap-toc/LICENSE.md b/modules/docs/src/Volo.Docs.Web/wwwroot/lib/bootstrap-toc/LICENSE.md deleted file mode 100644 index 0346635160..0000000000 --- a/modules/docs/src/Volo.Docs.Web/wwwroot/lib/bootstrap-toc/LICENSE.md +++ /dev/null @@ -1,25 +0,0 @@ -The MIT License (MIT) -===================== - -Copyright © 2015 Aidan Feldman - -Permission is hereby granted, free of charge, to any person -obtaining a copy of this software and associated documentation -files (the “Software”), to deal in the Software without -restriction, including without limitation the rights to use, -copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. diff --git a/modules/docs/src/Volo.Docs.Web/wwwroot/lib/bootstrap-toc/_config.yml b/modules/docs/src/Volo.Docs.Web/wwwroot/lib/bootstrap-toc/_config.yml deleted file mode 100644 index d089191136..0000000000 --- a/modules/docs/src/Volo.Docs.Web/wwwroot/lib/bootstrap-toc/_config.yml +++ /dev/null @@ -1,6 +0,0 @@ -baseurl: /bootstrap-toc -markdown: kramdown -kramdown: - input: GFM -exclude: - - node_modules/ diff --git a/modules/docs/src/Volo.Docs.Web/wwwroot/lib/bootstrap-toc/_layouts/default.html b/modules/docs/src/Volo.Docs.Web/wwwroot/lib/bootstrap-toc/_layouts/default.html deleted file mode 100644 index 3c71fdf875..0000000000 --- a/modules/docs/src/Volo.Docs.Web/wwwroot/lib/bootstrap-toc/_layouts/default.html +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - Table of Contents plugin for Bootstrap - - - - - - - - - - - - - - -
    -
    -
    - -
    -
    - {{ content }} -
    - - -
    -
    -
    -
    - - diff --git a/modules/docs/src/Volo.Docs.Web/wwwroot/lib/bootstrap-toc/_layouts/test.html b/modules/docs/src/Volo.Docs.Web/wwwroot/lib/bootstrap-toc/_layouts/test.html deleted file mode 100644 index c6551588b8..0000000000 --- a/modules/docs/src/Volo.Docs.Web/wwwroot/lib/bootstrap-toc/_layouts/test.html +++ /dev/null @@ -1,10 +0,0 @@ ---- -layout: default ---- - - -{{ content }} diff --git a/modules/docs/src/Volo.Docs.Web/wwwroot/lib/bootstrap-toc/assets/screen.css b/modules/docs/src/Volo.Docs.Web/wwwroot/lib/bootstrap-toc/assets/screen.css deleted file mode 100644 index 8aba2dc682..0000000000 --- a/modules/docs/src/Volo.Docs.Web/wwwroot/lib/bootstrap-toc/assets/screen.css +++ /dev/null @@ -1,54 +0,0 @@ -.right .github-fork-ribbon { - background-color: #563d7c; -} - -.container { - max-width: 800px; - padding-top: 40px; - padding-bottom: 40px; -} - -.hint { - color: #563d7c; - display: inline-block; - font-weight: bold; - left: 20px; /* match the left margin of the top-level nav items */ - position: relative; - top: 0.5em; -} -.hint:before { - content: '↑'; - display: block; - font-size: 3em; - margin-bottom: 5px; - text-align: center; -} - -footer { - margin-top: 50px; - text-align: center; -} - -/* small screens */ -@media (max-width: 768px) { - /* override the Affix plugin so that the navigation isn't sticky */ - nav.affix[data-toggle='toc'] { - position: static; - } - - /* display the second-level nav */ - nav[data-toggle='toc'] .nav .nav { - display: block; - } - - .hint { - top: 0; - } -} - -/* large screens */ -@media (min-width: 768px) { - h1:first-child { - margin-top: 0; - } -} diff --git a/modules/docs/src/Volo.Docs.Web/wwwroot/lib/bootstrap-toc/bootstrap-toc.css b/modules/docs/src/Volo.Docs.Web/wwwroot/lib/bootstrap-toc/bootstrap-toc.css deleted file mode 100644 index fe0934e71b..0000000000 --- a/modules/docs/src/Volo.Docs.Web/wwwroot/lib/bootstrap-toc/bootstrap-toc.css +++ /dev/null @@ -1,58 +0,0 @@ -/*! - * Bootstrap Table of Contents v<%= version %> (http://afeld.github.io/bootstrap-toc/) - * Copyright 2015 Aidan Feldman - * Licensed under MIT (https://github.com/afeld/bootstrap-toc/blob/gh-pages/LICENSE.md) */ - -/* modified from https://github.com/twbs/bootstrap/blob/94b4076dd2efba9af71f0b18d4ee4b163aa9e0dd/docs/assets/css/src/docs.css#L548-L601 */ - -/* All levels of nav */ -nav[data-toggle='toc'] .nav > li > a { - display: block; - padding: 4px 20px; - font-size: 13px; - font-weight: 500; - color: #767676; -} -nav[data-toggle='toc'] .nav > li > a:hover, -nav[data-toggle='toc'] .nav > li > a:focus { - padding-left: 19px; - color: #563d7c; - text-decoration: none; - background-color: transparent; - border-left: 1px solid #563d7c; -} -nav[data-toggle='toc'] .nav > .active > a, -nav[data-toggle='toc'] .nav > .active:hover > a, -nav[data-toggle='toc'] .nav > .active:focus > a { - padding-left: 18px; - font-weight: bold; - color: #563d7c; - background-color: transparent; - border-left: 2px solid #563d7c; -} - -/* Nav: second level (shown on .active) */ -nav[data-toggle='toc'] .nav .nav { -} -nav[data-toggle='toc'] .nav .nav > li > a { - padding-top: 4px; - padding-bottom: 4px; - padding-left: 40px; - font-size: 11px; - font-weight: normal; -} -nav[data-toggle='toc'] .nav .nav > li > a:hover, -nav[data-toggle='toc'] .nav .nav > li > a:focus { - padding-left: 39px; -} -nav[data-toggle='toc'] .nav .nav > .active > a, -nav[data-toggle='toc'] .nav .nav > .active:hover > a, -nav[data-toggle='toc'] .nav .nav > .active:focus > a { - padding-left: 28px; - font-weight: 500; -} - -/* from https://github.com/twbs/bootstrap/blob/e38f066d8c203c3e032da0ff23cd2d6098ee2dd6/docs/assets/css/src/docs.css#L631-L634 */ -nav[data-toggle='toc'] .nav > .active > ul { - display: block; -} diff --git a/modules/docs/src/Volo.Docs.Web/wwwroot/lib/bootstrap-toc/bootstrap-toc.js b/modules/docs/src/Volo.Docs.Web/wwwroot/lib/bootstrap-toc/bootstrap-toc.js deleted file mode 100644 index 9311722b3c..0000000000 --- a/modules/docs/src/Volo.Docs.Web/wwwroot/lib/bootstrap-toc/bootstrap-toc.js +++ /dev/null @@ -1,159 +0,0 @@ -/*! - * Bootstrap Table of Contents v<%= version %> (http://afeld.github.io/bootstrap-toc/) - * Copyright 2015 Aidan Feldman - * Licensed under MIT (https://github.com/afeld/bootstrap-toc/blob/gh-pages/LICENSE.md) */ -(function() { - 'use strict'; - - window.Toc = { - helpers: { - // return all matching elements in the set, or their descendants - findOrFilter: function($el, selector) { - // http://danielnouri.org/notes/2011/03/14/a-jquery-find-that-also-finds-the-root-element/ - // http://stackoverflow.com/a/12731439/358804 - var $descendants = $el.find(selector); - return $el.filter(selector).add($descendants).filter(':not([data-toc-skip])'); - }, - - generateUniqueIdBase: function(el) { - var text = $(el).text(); - var anchor = text.trim().toLowerCase().replace(/[^A-Za-z0-9]+/g, '-'); - return anchor || el.tagName.toLowerCase(); - }, - - generateUniqueId: function(el) { - var anchorBase = this.generateUniqueIdBase(el); - for (var i = 0; ; i++) { - var anchor = anchorBase; - if (i > 0) { - // add suffix - anchor += '-' + i; - } - // check if ID already exists - if (!document.getElementById(anchor)) { - return anchor; - } - } - }, - - generateAnchor: function(el) { - if (el.id) { - return el.id; - } else { - var anchor = this.generateUniqueId(el); - el.id = anchor; - return anchor; - } - }, - - createNavList: function() { - return $(''); - }, - - createChildNavList: function($parent) { - var $childList = this.createNavList(); - $parent.append($childList); - return $childList; - }, - - generateNavEl: function(anchor, text) { - var $a = $(''); - $a.attr('href', '#' + anchor); - $a.text(text); - var $li = $('
  • '); - $li.append($a); - return $li; - }, - - generateNavItem: function(headingEl) { - var anchor = this.generateAnchor(headingEl); - var $heading = $(headingEl); - var text = $heading.data('toc-text') || $heading.text(); - return this.generateNavEl(anchor, text); - }, - - // Find the first heading level (`

    `, then `

    `, etc.) that has more than one element. Defaults to 1 (for `

    `). - getTopLevel: function($scope) { - for (var i = 1; i <= 6; i++) { - var $headings = this.findOrFilter($scope, 'h' + i); - if ($headings.length > 1) { - return i; - } - } - - return 1; - }, - - // returns the elements for the top level, and the next below it - getHeadings: function($scope, topLevel) { - var topSelector = 'h' + topLevel; - - var secondaryLevel = topLevel + 1; - var secondarySelector = 'h' + secondaryLevel; - - return this.findOrFilter($scope, topSelector + ',' + secondarySelector); - }, - - getNavLevel: function(el) { - return parseInt(el.tagName.charAt(1), 10); - }, - - populateNav: function($topContext, topLevel, $headings) { - var $context = $topContext; - var $prevNav; - - var helpers = this; - $headings.each(function(i, el) { - var $newNav = helpers.generateNavItem(el); - var navLevel = helpers.getNavLevel(el); - - // determine the proper $context - if (navLevel === topLevel) { - // use top level - $context = $topContext; - } else if ($prevNav && $context === $topContext) { - // create a new level of the tree and switch to it - $context = helpers.createChildNavList($prevNav); - } // else use the current $context - - $context.append($newNav); - - $prevNav = $newNav; - }); - }, - - parseOps: function(arg) { - var opts; - if (arg.jquery) { - opts = { - $nav: arg - }; - } else { - opts = arg; - } - opts.$scope = opts.$scope || $(document.body); - return opts; - } - }, - - // accepts a jQuery object, or an options object - init: function(opts) { - opts = this.helpers.parseOps(opts); - - // ensure that the data attribute is in place for styling - opts.$nav.attr('data-toggle', 'toc'); - - var $topContext = this.helpers.createChildNavList(opts.$nav); - var topLevel = this.helpers.getTopLevel(opts.$scope); - var $headings = this.helpers.getHeadings(opts.$scope, topLevel); - this.helpers.populateNav($topContext, topLevel, $headings); - } - }; - - $(function() { - $('nav[data-toggle="toc"]').each(function(i, el) { - var $nav = $(el); - Toc.init($nav); - }); - }); -})(); diff --git a/modules/docs/src/Volo.Docs.Web/wwwroot/lib/bootstrap-toc/dist/bootstrap-toc.css b/modules/docs/src/Volo.Docs.Web/wwwroot/lib/bootstrap-toc/dist/bootstrap-toc.css deleted file mode 100644 index 5a859415c1..0000000000 --- a/modules/docs/src/Volo.Docs.Web/wwwroot/lib/bootstrap-toc/dist/bootstrap-toc.css +++ /dev/null @@ -1,60 +0,0 @@ -/*! - * Bootstrap Table of Contents v0.4.1 (http://afeld.github.io/bootstrap-toc/) - * Copyright 2015 Aidan Feldman - * Licensed under MIT (https://github.com/afeld/bootstrap-toc/blob/gh-pages/LICENSE.md) */ - -/* modified from https://github.com/twbs/bootstrap/blob/94b4076dd2efba9af71f0b18d4ee4b163aa9e0dd/docs/assets/css/src/docs.css#L548-L601 */ - -/* All levels of nav */ -nav[data-toggle='toc'] .nav > li > a { - display: block; - padding: 4px 20px; - font-size: 13px; - font-weight: 500; - color: #767676; -} -nav[data-toggle='toc'] .nav > li > a:hover, -nav[data-toggle='toc'] .nav > li > a:focus { - padding-left: 19px; - color: #563d7c; - text-decoration: none; - background-color: transparent; - border-left: 1px solid #563d7c; -} -nav[data-toggle='toc'] .nav > .active > a, -nav[data-toggle='toc'] .nav > .active:hover > a, -nav[data-toggle='toc'] .nav > .active:focus > a { - padding-left: 18px; - font-weight: bold; - color: #563d7c; - background-color: transparent; - border-left: 2px solid #563d7c; -} - -/* Nav: second level (shown on .active) */ -nav[data-toggle='toc'] .nav .nav { - display: none; /* Hide by default, but at >768px, show it */ - padding-bottom: 10px; -} -nav[data-toggle='toc'] .nav .nav > li > a { - padding-top: 1px; - padding-bottom: 1px; - padding-left: 30px; - font-size: 12px; - font-weight: normal; -} -nav[data-toggle='toc'] .nav .nav > li > a:hover, -nav[data-toggle='toc'] .nav .nav > li > a:focus { - padding-left: 29px; -} -nav[data-toggle='toc'] .nav .nav > .active > a, -nav[data-toggle='toc'] .nav .nav > .active:hover > a, -nav[data-toggle='toc'] .nav .nav > .active:focus > a { - padding-left: 28px; - font-weight: 500; -} - -/* from https://github.com/twbs/bootstrap/blob/e38f066d8c203c3e032da0ff23cd2d6098ee2dd6/docs/assets/css/src/docs.css#L631-L634 */ -nav[data-toggle='toc'] .nav > .active > ul { - display: block; -} diff --git a/modules/docs/src/Volo.Docs.Web/wwwroot/lib/bootstrap-toc/dist/bootstrap-toc.js b/modules/docs/src/Volo.Docs.Web/wwwroot/lib/bootstrap-toc/dist/bootstrap-toc.js deleted file mode 100644 index 1cdd573b20..0000000000 --- a/modules/docs/src/Volo.Docs.Web/wwwroot/lib/bootstrap-toc/dist/bootstrap-toc.js +++ /dev/null @@ -1,159 +0,0 @@ -/*! - * Bootstrap Table of Contents v0.4.1 (http://afeld.github.io/bootstrap-toc/) - * Copyright 2015 Aidan Feldman - * Licensed under MIT (https://github.com/afeld/bootstrap-toc/blob/gh-pages/LICENSE.md) */ -(function() { - 'use strict'; - - window.Toc = { - helpers: { - // return all matching elements in the set, or their descendants - findOrFilter: function($el, selector) { - // http://danielnouri.org/notes/2011/03/14/a-jquery-find-that-also-finds-the-root-element/ - // http://stackoverflow.com/a/12731439/358804 - var $descendants = $el.find(selector); - return $el.filter(selector).add($descendants).filter(':not([data-toc-skip])'); - }, - - generateUniqueIdBase: function(el) { - var text = $(el).text(); - var anchor = text.trim().toLowerCase().replace(/[^A-Za-z0-9]+/g, '-'); - return anchor || el.tagName.toLowerCase(); - }, - - generateUniqueId: function(el) { - var anchorBase = this.generateUniqueIdBase(el); - for (var i = 0; ; i++) { - var anchor = anchorBase; - if (i > 0) { - // add suffix - anchor += '-' + i; - } - // check if ID already exists - if (!document.getElementById(anchor)) { - return anchor; - } - } - }, - - generateAnchor: function(el) { - if (el.id) { - return el.id; - } else { - var anchor = this.generateUniqueId(el); - el.id = anchor; - return anchor; - } - }, - - createNavList: function() { - return $(''); - }, - - createChildNavList: function($parent) { - var $childList = this.createNavList(); - $parent.append($childList); - return $childList; - }, - - generateNavEl: function(anchor, text) { - var $a = $(''); - $a.attr('href', '#' + anchor); - $a.text(text); - var $li = $('
  • '); - $li.append($a); - return $li; - }, - - generateNavItem: function(headingEl) { - var anchor = this.generateAnchor(headingEl); - var $heading = $(headingEl); - var text = $heading.data('toc-text') || $heading.text(); - return this.generateNavEl(anchor, text); - }, - - // Find the first heading level (`

    `, then `

    `, etc.) that has more than one element. Defaults to 1 (for `

    `). - getTopLevel: function($scope) { - for (var i = 1; i <= 6; i++) { - var $headings = this.findOrFilter($scope, 'h' + i); - if ($headings.length > 1) { - return i; - } - } - - return 1; - }, - - // returns the elements for the top level, and the next below it - getHeadings: function($scope, topLevel) { - var topSelector = 'h' + topLevel; - - var secondaryLevel = topLevel + 1; - var secondarySelector = 'h' + secondaryLevel; - - return this.findOrFilter($scope, topSelector + ',' + secondarySelector); - }, - - getNavLevel: function(el) { - return parseInt(el.tagName.charAt(1), 10); - }, - - populateNav: function($topContext, topLevel, $headings) { - var $context = $topContext; - var $prevNav; - - var helpers = this; - $headings.each(function(i, el) { - var $newNav = helpers.generateNavItem(el); - var navLevel = helpers.getNavLevel(el); - - // determine the proper $context - if (navLevel === topLevel) { - // use top level - $context = $topContext; - } else if ($prevNav && $context === $topContext) { - // create a new level of the tree and switch to it - $context = helpers.createChildNavList($prevNav); - } // else use the current $context - - $context.append($newNav); - - $prevNav = $newNav; - }); - }, - - parseOps: function(arg) { - var opts; - if (arg.jquery) { - opts = { - $nav: arg - }; - } else { - opts = arg; - } - opts.$scope = opts.$scope || $(document.body); - return opts; - } - }, - - // accepts a jQuery object, or an options object - init: function(opts) { - opts = this.helpers.parseOps(opts); - - // ensure that the data attribute is in place for styling - opts.$nav.attr('data-toggle', 'toc'); - - var $topContext = this.helpers.createChildNavList(opts.$nav); - var topLevel = this.helpers.getTopLevel(opts.$scope); - var $headings = this.helpers.getHeadings(opts.$scope, topLevel); - this.helpers.populateNav($topContext, topLevel, $headings); - } - }; - - $(function() { - $('nav[data-toggle="toc"]').each(function(i, el) { - var $nav = $(el); - Toc.init($nav); - }); - }); -})(); diff --git a/modules/docs/src/Volo.Docs.Web/wwwroot/lib/bootstrap-toc/dist/bootstrap-toc.min.css b/modules/docs/src/Volo.Docs.Web/wwwroot/lib/bootstrap-toc/dist/bootstrap-toc.min.css deleted file mode 100644 index 2d36ad199e..0000000000 --- a/modules/docs/src/Volo.Docs.Web/wwwroot/lib/bootstrap-toc/dist/bootstrap-toc.min.css +++ /dev/null @@ -1,4 +0,0 @@ -/*! - * Bootstrap Table of Contents v0.4.1 (http://afeld.github.io/bootstrap-toc/) - * Copyright 2015 Aidan Feldman - * Licensed under MIT (https://github.com/afeld/bootstrap-toc/blob/gh-pages/LICENSE.md) */nav[data-toggle=toc] .nav>li>a{display:block;padding:4px 20px;font-size:13px;font-weight:500;color:#767676}nav[data-toggle=toc] .nav>li>a:focus,nav[data-toggle=toc] .nav>li>a:hover{padding-left:19px;color:#563d7c;text-decoration:none;background-color:transparent;border-left:1px solid #563d7c}nav[data-toggle=toc] .nav>.active:focus>a,nav[data-toggle=toc] .nav>.active:hover>a,nav[data-toggle=toc] .nav>.active>a{padding-left:18px;font-weight:700;color:#563d7c;background-color:transparent;border-left:2px solid #563d7c}nav[data-toggle=toc] .nav .nav{display:none;padding-bottom:10px}nav[data-toggle=toc] .nav .nav>li>a{padding-top:1px;padding-bottom:1px;padding-left:30px;font-size:12px;font-weight:400}nav[data-toggle=toc] .nav .nav>li>a:focus,nav[data-toggle=toc] .nav .nav>li>a:hover{padding-left:29px}nav[data-toggle=toc] .nav .nav>.active:focus>a,nav[data-toggle=toc] .nav .nav>.active:hover>a,nav[data-toggle=toc] .nav .nav>.active>a{padding-left:28px;font-weight:500}nav[data-toggle=toc] .nav>.active>ul{display:block} \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Web/wwwroot/lib/bootstrap-toc/dist/bootstrap-toc.min.js b/modules/docs/src/Volo.Docs.Web/wwwroot/lib/bootstrap-toc/dist/bootstrap-toc.min.js deleted file mode 100644 index 35bae96628..0000000000 --- a/modules/docs/src/Volo.Docs.Web/wwwroot/lib/bootstrap-toc/dist/bootstrap-toc.min.js +++ /dev/null @@ -1,5 +0,0 @@ -/*! - * Bootstrap Table of Contents v0.4.1 (http://afeld.github.io/bootstrap-toc/) - * Copyright 2015 Aidan Feldman - * Licensed under MIT (https://github.com/afeld/bootstrap-toc/blob/gh-pages/LICENSE.md) */ -!function(){"use strict";window.Toc={helpers:{findOrFilter:function(e,t){var r=e.find(t);return e.filter(t).add(r).filter(":not([data-toc-skip])")},generateUniqueIdBase:function(e){var t=$(e).text(),r=t.trim().toLowerCase().replace(/[^A-Za-z0-9]+/g,"-");return r||e.tagName.toLowerCase()},generateUniqueId:function(e){for(var t=this.generateUniqueIdBase(e),r=0;;r++){var n=t;if(r>0&&(n+="-"+r),!document.getElementById(n))return n}},generateAnchor:function(e){if(e.id)return e.id;var t=this.generateUniqueId(e);return e.id=t,t},createNavList:function(){return $('')},createChildNavList:function(e){var t=this.createNavList();return e.append(t),t},generateNavEl:function(e,t){var r=$("");r.attr("href","#"+e),r.text(t);var n=$("
  • ");return n.append(r),n},generateNavItem:function(e){var t=this.generateAnchor(e),r=$(e),n=r.data("toc-text")||r.text();return this.generateNavEl(t,n)},getTopLevel:function(e){for(var t=1;t<=6;t++){var r=this.findOrFilter(e,"h"+t);if(r.length>1)return t}return 1},getHeadings:function(e,t){var r="h"+t,n=t+1,a="h"+n;return this.findOrFilter(e,r+","+a)},getNavLevel:function(e){return parseInt(e.tagName.charAt(1),10)},populateNav:function(e,t,r){var n,a=e,i=this;r.each(function(r,o){var s=i.generateNavItem(o),u=i.getNavLevel(o);u===t?a=e:n&&a===e&&(a=i.createChildNavList(n)),a.append(s),n=s})},parseOps:function(e){var t;return t=e.jquery?{$nav:e}:e,t.$scope=t.$scope||$(document.body),t}},init:function(e){e=this.helpers.parseOps(e),e.$nav.attr("data-toggle","toc");var t=this.helpers.createChildNavList(e.$nav),r=this.helpers.getTopLevel(e.$scope),n=this.helpers.getHeadings(e.$scope,r);this.helpers.populateNav(t,r,n)}},$(function(){$('nav[data-toggle="toc"]').each(function(e,t){var r=$(t);Toc.init(r)})})}(); \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Web/wwwroot/lib/bootstrap-toc/gulpfile.js b/modules/docs/src/Volo.Docs.Web/wwwroot/lib/bootstrap-toc/gulpfile.js deleted file mode 100644 index 7cc796409f..0000000000 --- a/modules/docs/src/Volo.Docs.Web/wwwroot/lib/bootstrap-toc/gulpfile.js +++ /dev/null @@ -1,58 +0,0 @@ -var gulp = require('gulp'); -var del = require('del'); -var template = require('gulp-template'); -var minifyCss = require('gulp-minify-css'); -var rename = require('gulp-rename'); -var uglify = require('gulp-uglify'); -var jshint = require('gulp-jshint'); -var mochaPhantomJS = require('gulp-mocha-phantomjs'); -var pkg = require('./package.json'); - -gulp.task('clean', function () { - return del(['dist/*']); -}); - -gulp.task('build-css', ['clean'], function() { - return gulp.src('bootstrap-toc.css') - .pipe(template(pkg)) - .pipe(gulp.dest('dist')) - .pipe(minifyCss({compatibility: 'ie8'})) - .pipe(rename({ - extname: '.min.css' - })) - .pipe(gulp.dest('dist')); -}); - -gulp.task('build-js', ['clean'], function() { - return gulp.src('bootstrap-toc.js') - .pipe(template(pkg)) - .pipe(gulp.dest('dist')) - .pipe(uglify({ - preserveComments: 'license' - })) - .pipe(rename({ - extname: '.min.js' - })) - .pipe(gulp.dest('dist')); -}); - -gulp.task('js-lint', function () { - return gulp.src('bootstrap-toc.js') - .pipe(jshint()) - .pipe(jshint.reporter('default')) - .pipe(jshint.reporter('fail')); -}); - -gulp.task('test', function () { - return gulp.src('test/index.html') - .pipe(mochaPhantomJS()); -}); - -gulp.task('watch', function() { - gulp.watch('bootstrap-toc.js', ['js-lint', 'test']); - gulp.watch('test/*', ['test']); -}); - -gulp.task('build', ['build-css', 'build-js']); - -gulp.task('default', ['build', 'js-lint', 'test']); diff --git a/modules/docs/src/Volo.Docs.Web/wwwroot/lib/bootstrap-toc/index.md b/modules/docs/src/Volo.Docs.Web/wwwroot/lib/bootstrap-toc/index.md deleted file mode 100644 index 453025d192..0000000000 --- a/modules/docs/src/Volo.Docs.Web/wwwroot/lib/bootstrap-toc/index.md +++ /dev/null @@ -1,183 +0,0 @@ ---- -layout: default -permalink: / ---- - -# Table of Contents plugin for Bootstrap -{: .page-header} - -[![Build Status](https://travis-ci.org/afeld/bootstrap-toc.svg?branch=gh-pages)](https://travis-ci.org/afeld/bootstrap-toc) - -This [Bootstrap](http://getbootstrap.com/) plugin allows you to generate a table of contents for any page, based on the heading elements (`

    `, `

    `, etc.). It is meant to emulate the sidebar you see on [the Bootstrap documentation site](http://getbootstrap.com/css/). - -This page is an example of the plugin in action – the table of contents you see on the left (or top, on mobile) was automatically generated, without having to manually keep all of the navigation items in sync with the headings. - -## Usage - -On top of the normal Bootstrap setup (see their [Getting Started](http://getbootstrap.com/getting-started/) guide), you will need to include the Bootstrap Table of Contents stylesheet and JavaScript file. - -```html - - - - -``` - -[Unminified versions](https://github.com/afeld/bootstrap-toc/tree/gh-pages/dist) are also available. - -Next, pick one of the two options below. - -### Via data attributes - -*Simplest.* - -Create a `