diff --git a/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/AbpAspNetCoreMvcUIBasicThemeModule.cs b/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/AbpAspNetCoreMvcUIBasicThemeModule.cs index 2efdfa69aa..6076dfe0c0 100644 --- a/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/AbpAspNetCoreMvcUIBasicThemeModule.cs +++ b/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/AbpAspNetCoreMvcUIBasicThemeModule.cs @@ -2,6 +2,7 @@ using Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Toolbars; using Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared; using Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Toolbars; +using Volo.Abp.AspNetCore.Mvc.UI.Theming; using Volo.Abp.Modularity; using Volo.Abp.VirtualFileSystem; @@ -14,6 +15,11 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic { public override void ConfigureServices(IServiceCollection services) { + services.Configure(options => + { + options.Themes.Add(); + }); + services.Configure(options => { options.FileSets.AddEmbedded("Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic"); @@ -23,7 +29,7 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic { options.Contributors.Add(new BasicThemeMainTopToolbarContributor()); }); - + services.AddAssemblyOf(); } } diff --git a/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/BasicTheme.cs b/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/BasicTheme.cs new file mode 100644 index 0000000000..cd9ce2d1e0 --- /dev/null +++ b/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/BasicTheme.cs @@ -0,0 +1,15 @@ +using Volo.Abp.AspNetCore.Mvc.UI.Theming; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic +{ + public class BasicTheme : ITheme, ITransientDependency + { + public string DefaultLayout => "~/Views/Shared/_AppLayout.cshtml"; + + public string GetLayoutOrNull(string name) + { + return DefaultLayout; + } + } +} diff --git a/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/Pages/_ViewStart.cshtml b/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/Pages/_ViewStart.cshtml index f4d75cd962..17679d1702 100644 --- a/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/Pages/_ViewStart.cshtml +++ b/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/Pages/_ViewStart.cshtml @@ -1,3 +1,6 @@ -@{ - Layout = "~/Views/Shared/_AppLayout.cshtml"; -} +@using Volo.Abp.AspNetCore.Mvc.UI.Theming +@inject IThemeManager ThemeManager +@{ + //TODO: Move this to a lower layer... to Shared? + Layout = ThemeManager.CurrentTheme.DefaultLayout; +} \ No newline at end of file diff --git a/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/Toolbars/BasicThemeMainTopToolbarContributor.cs b/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/Toolbars/BasicThemeMainTopToolbarContributor.cs index b6c5f0c7e5..d6fee581a8 100644 --- a/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/Toolbars/BasicThemeMainTopToolbarContributor.cs +++ b/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/Toolbars/BasicThemeMainTopToolbarContributor.cs @@ -14,6 +14,11 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Toolbars return Task.CompletedTask; } + if (!(context.Theme is BasicTheme)) + { + return Task.CompletedTask; + } + context.Toolbar.Items.Add(new ToolbarItem(typeof(LanguageSwitchViewComponent))); context.Toolbar.Items.Add(new ToolbarItem(typeof(UserMenuViewComponent))); diff --git a/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Toolbars/IToolbarConfigurationContext.cs b/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Toolbars/IToolbarConfigurationContext.cs index aa972deac0..f33b9fdebc 100644 --- a/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Toolbars/IToolbarConfigurationContext.cs +++ b/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Toolbars/IToolbarConfigurationContext.cs @@ -1,9 +1,12 @@ -using Volo.Abp.DependencyInjection; +using Volo.Abp.AspNetCore.Mvc.UI.Theming; +using Volo.Abp.DependencyInjection; namespace Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Toolbars { public interface IToolbarConfigurationContext : IServiceProviderAccessor { + ITheme Theme { get; } + Toolbar Toolbar { get; } } } \ No newline at end of file diff --git a/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Toolbars/ToolbarConfigurationContext.cs b/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Toolbars/ToolbarConfigurationContext.cs index baf0935caf..4b696512bf 100644 --- a/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Toolbars/ToolbarConfigurationContext.cs +++ b/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Toolbars/ToolbarConfigurationContext.cs @@ -1,15 +1,19 @@ using System; +using Volo.Abp.AspNetCore.Mvc.UI.Theming; namespace Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Toolbars { public class ToolbarConfigurationContext : IToolbarConfigurationContext { + public ITheme Theme { get; } + public Toolbar Toolbar { get; } public IServiceProvider ServiceProvider { get; } - public ToolbarConfigurationContext(Toolbar toolbar, IServiceProvider serviceProvider) + public ToolbarConfigurationContext(ITheme currentTheme, Toolbar toolbar, IServiceProvider serviceProvider) { + Theme = currentTheme; Toolbar = toolbar; ServiceProvider = serviceProvider; } diff --git a/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Toolbars/ToolbarManager.cs b/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Toolbars/ToolbarManager.cs index bdf546b3ca..3838231464 100644 --- a/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Toolbars/ToolbarManager.cs +++ b/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Toolbars/ToolbarManager.cs @@ -2,17 +2,23 @@ using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; +using Volo.Abp.AspNetCore.Mvc.UI.Theming; using Volo.Abp.DependencyInjection; namespace Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Toolbars { public class ToolbarManager : IToolbarManager, ITransientDependency { + protected IThemeManager ThemeManager { get; } protected ToolbarOptions Options { get; } protected IServiceProvider ServiceProvider { get; } - public ToolbarManager(IOptions options, IServiceProvider serviceProvider) + public ToolbarManager( + IOptions options, + IServiceProvider serviceProvider, + IThemeManager themeManager) { + ThemeManager = themeManager; ServiceProvider = serviceProvider; Options = options.Value; } @@ -23,7 +29,7 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Toolbars using (var scope = ServiceProvider.CreateScope()) { - var context = new ToolbarConfigurationContext(menu, scope.ServiceProvider); + var context = new ToolbarConfigurationContext(ThemeManager.CurrentTheme, menu, scope.ServiceProvider); foreach (var contributor in Options.Contributors) { diff --git a/src/Volo.Abp.AspNetCore.Mvc.UI/UI/Theming/DefaultThemeManager.cs b/src/Volo.Abp.AspNetCore.Mvc.UI/UI/Theming/DefaultThemeManager.cs new file mode 100644 index 0000000000..de2341293d --- /dev/null +++ b/src/Volo.Abp.AspNetCore.Mvc.UI/UI/Theming/DefaultThemeManager.cs @@ -0,0 +1,54 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Options; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.AspNetCore.Mvc.UI.Theming +{ + public class DefaultThemeManager : IThemeManager, ITransientDependency, IServiceProviderAccessor + { + public IServiceProvider ServiceProvider { get; } + + public ITheme CurrentTheme => GetCurrentTheme(); + + protected ThemingOptions Options { get; } + + protected Lazy> Themes { get; } + + private readonly IHttpContextAccessor _httpContextAccessor; + + public DefaultThemeManager( + IOptions options, + IServiceProvider serviceProvider, + IHttpContextAccessor httpContextAccessor) + { + _httpContextAccessor = httpContextAccessor; + ServiceProvider = serviceProvider; + Options = options.Value; + Themes = new Lazy>(CreateThemeList, true); + } + + protected virtual ITheme GetCurrentTheme() + { + return Themes.Value.First(); + ////TODO: Temporary code! + + //var currentTheme = _httpContextAccessor.HttpContext.Items["_AbpCurrentTheme"] as ITheme; + //if (currentTheme != null) + //{ + // return currentTheme; + //} + + //_httpContextAccessor.HttpContext.Items["_AbpCurrentTheme"] = currentTheme = RandomHelper.GetRandomOf(Themes.Value.ToArray()); + //return currentTheme; + } + + protected virtual List CreateThemeList() + { + return Options.Themes.Select(t => (ITheme) ServiceProvider.GetRequiredService(t)).ToList(); + } + } +} \ No newline at end of file diff --git a/src/Volo.Abp.AspNetCore.Mvc.UI/UI/Theming/ITheme.cs b/src/Volo.Abp.AspNetCore.Mvc.UI/UI/Theming/ITheme.cs new file mode 100644 index 0000000000..563010c7f2 --- /dev/null +++ b/src/Volo.Abp.AspNetCore.Mvc.UI/UI/Theming/ITheme.cs @@ -0,0 +1,9 @@ +namespace Volo.Abp.AspNetCore.Mvc.UI.Theming +{ + public interface ITheme + { + string DefaultLayout { get; } + + string GetLayoutOrNull(string name); + } +} \ No newline at end of file diff --git a/src/Volo.Abp.AspNetCore.Mvc.UI/UI/Theming/IThemeManager.cs b/src/Volo.Abp.AspNetCore.Mvc.UI/UI/Theming/IThemeManager.cs new file mode 100644 index 0000000000..564427eefb --- /dev/null +++ b/src/Volo.Abp.AspNetCore.Mvc.UI/UI/Theming/IThemeManager.cs @@ -0,0 +1,7 @@ +namespace Volo.Abp.AspNetCore.Mvc.UI.Theming +{ + public interface IThemeManager + { + ITheme CurrentTheme { get; } + } +} diff --git a/src/Volo.Abp.AspNetCore.Mvc.UI/UI/Theming/ThemingOptions.cs b/src/Volo.Abp.AspNetCore.Mvc.UI/UI/Theming/ThemingOptions.cs new file mode 100644 index 0000000000..dc6f81451b --- /dev/null +++ b/src/Volo.Abp.AspNetCore.Mvc.UI/UI/Theming/ThemingOptions.cs @@ -0,0 +1,14 @@ +using Volo.Abp.Collections; + +namespace Volo.Abp.AspNetCore.Mvc.UI.Theming +{ + public class ThemingOptions + { + public TypeList Themes { get; } + + public ThemingOptions() + { + Themes = new TypeList(); + } + } +}