Browse Source

Created simple theme manager.

pull/301/head
Halil İbrahim Kalkan 9 years ago
parent
commit
1f7077819c
  1. 8
      src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/AbpAspNetCoreMvcUIBasicThemeModule.cs
  2. 15
      src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/BasicTheme.cs
  3. 9
      src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/Pages/_ViewStart.cshtml
  4. 5
      src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/Toolbars/BasicThemeMainTopToolbarContributor.cs
  5. 5
      src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Toolbars/IToolbarConfigurationContext.cs
  6. 6
      src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Toolbars/ToolbarConfigurationContext.cs
  7. 10
      src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Toolbars/ToolbarManager.cs
  8. 54
      src/Volo.Abp.AspNetCore.Mvc.UI/UI/Theming/DefaultThemeManager.cs
  9. 9
      src/Volo.Abp.AspNetCore.Mvc.UI/UI/Theming/ITheme.cs
  10. 7
      src/Volo.Abp.AspNetCore.Mvc.UI/UI/Theming/IThemeManager.cs
  11. 14
      src/Volo.Abp.AspNetCore.Mvc.UI/UI/Theming/ThemingOptions.cs

8
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<ThemingOptions>(options =>
{
options.Themes.Add<BasicTheme>();
});
services.Configure<VirtualFileSystemOptions>(options =>
{
options.FileSets.AddEmbedded<AbpAspNetCoreMvcUiBasicThemeModule>("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<AbpAspNetCoreMvcUiBasicThemeModule>();
}
}

15
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;
}
}
}

9
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;
}

5
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)));

5
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; }
}
}

6
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;
}

10
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<ToolbarOptions> options, IServiceProvider serviceProvider)
public ToolbarManager(
IOptions<ToolbarOptions> 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)
{

54
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<List<ITheme>> Themes { get; }
private readonly IHttpContextAccessor _httpContextAccessor;
public DefaultThemeManager(
IOptions<ThemingOptions> options,
IServiceProvider serviceProvider,
IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
ServiceProvider = serviceProvider;
Options = options.Value;
Themes = new Lazy<List<ITheme>>(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<ITheme> CreateThemeList()
{
return Options.Themes.Select(t => (ITheme) ServiceProvider.GetRequiredService(t)).ToList();
}
}
}

9
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);
}
}

7
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; }
}
}

14
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<ITheme> Themes { get; }
public ThemingOptions()
{
Themes = new TypeList<ITheme>();
}
}
}
Loading…
Cancel
Save