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 657f983708..2efdfa69aa 100644 --- a/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/AbpAspNetCoreMvcUIBasicThemeModule.cs +++ b/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/AbpAspNetCoreMvcUIBasicThemeModule.cs @@ -1,5 +1,7 @@ using Microsoft.Extensions.DependencyInjection; +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.Modularity; using Volo.Abp.VirtualFileSystem; @@ -17,6 +19,11 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic options.FileSets.AddEmbedded("Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic"); }); + services.Configure(options => + { + options.Contributors.Add(new BasicThemeMainTopToolbarContributor()); + }); + services.AddAssemblyOf(); } } diff --git a/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/ToolbarManager.cs b/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/ToolbarManager.cs deleted file mode 100644 index 5fefd1f243..0000000000 --- a/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/ToolbarManager.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System.Threading.Tasks; -using Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Views.Shared.Components.Theme.MainNavbar.Toolbar.Items.LanguageSwitch; -using Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Views.Shared.Components.Theme.MainNavbar.Toolbar.Items.UserMenu; -using Volo.Abp.DependencyInjection; - -namespace Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Toolbars -{ - public class ToolbarManager : IToolbarManager, ITransientDependency - { - public async Task GetAsync(string name) - { - return new Toolbar(name) - { - Items = - { - new ToolbarItem(typeof(LanguageSwitchViewComponent)), - new ToolbarItem(typeof(UserMenuViewComponent)) - } - }; - } - } -} \ 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 new file mode 100644 index 0000000000..b6c5f0c7e5 --- /dev/null +++ b/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/Toolbars/BasicThemeMainTopToolbarContributor.cs @@ -0,0 +1,23 @@ +using System.Threading.Tasks; +using Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Views.Shared.Components.Theme.MainNavbar.Toolbar.Items.LanguageSwitch; +using Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Views.Shared.Components.Theme.MainNavbar.Toolbar.Items.UserMenu; +using Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Toolbars; + +namespace Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Toolbars +{ + public class BasicThemeMainTopToolbarContributor : IToolbarContributor + { + public Task ConfigureToolbarAsync(IToolbarConfigurationContext context) + { + if (context.Toolbar.Name != StandardToolbars.Main) + { + return Task.CompletedTask; + } + + context.Toolbar.Items.Add(new ToolbarItem(typeof(LanguageSwitchViewComponent))); + context.Toolbar.Items.Add(new ToolbarItem(typeof(UserMenuViewComponent))); + + return Task.CompletedTask; + } + } +} 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 new file mode 100644 index 0000000000..aa972deac0 --- /dev/null +++ b/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Toolbars/IToolbarConfigurationContext.cs @@ -0,0 +1,9 @@ +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Toolbars +{ + public interface IToolbarConfigurationContext : IServiceProviderAccessor + { + Toolbar Toolbar { get; } + } +} \ No newline at end of file diff --git a/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Toolbars/IToolbarContributor.cs b/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Toolbars/IToolbarContributor.cs new file mode 100644 index 0000000000..a7e0eb1aa1 --- /dev/null +++ b/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Toolbars/IToolbarContributor.cs @@ -0,0 +1,9 @@ +using System.Threading.Tasks; + +namespace Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Toolbars +{ + public interface IToolbarContributor + { + Task ConfigureToolbarAsync(IToolbarConfigurationContext context); + } +} \ 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 new file mode 100644 index 0000000000..baf0935caf --- /dev/null +++ b/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Toolbars/ToolbarConfigurationContext.cs @@ -0,0 +1,17 @@ +using System; + +namespace Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Toolbars +{ + public class ToolbarConfigurationContext : IToolbarConfigurationContext + { + public Toolbar Toolbar { get; } + + public IServiceProvider ServiceProvider { get; } + + public ToolbarConfigurationContext(Toolbar toolbar, IServiceProvider serviceProvider) + { + Toolbar = toolbar; + ServiceProvider = serviceProvider; + } + } +} \ No newline at end of file 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 new file mode 100644 index 0000000000..bdf546b3ca --- /dev/null +++ b/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Toolbars/ToolbarManager.cs @@ -0,0 +1,37 @@ +using System; +using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Options; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Toolbars +{ + public class ToolbarManager : IToolbarManager, ITransientDependency + { + protected ToolbarOptions Options { get; } + protected IServiceProvider ServiceProvider { get; } + + public ToolbarManager(IOptions options, IServiceProvider serviceProvider) + { + ServiceProvider = serviceProvider; + Options = options.Value; + } + + public async Task GetAsync(string name) + { + var menu = new Toolbar(name); + + using (var scope = ServiceProvider.CreateScope()) + { + var context = new ToolbarConfigurationContext(menu, scope.ServiceProvider); + + foreach (var contributor in Options.Contributors) + { + await contributor.ConfigureToolbarAsync(context); + } + } + + return menu; + } + } +} \ No newline at end of file diff --git a/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Toolbars/ToolbarOptions.cs b/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Toolbars/ToolbarOptions.cs new file mode 100644 index 0000000000..e830f3fcf6 --- /dev/null +++ b/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Toolbars/ToolbarOptions.cs @@ -0,0 +1,16 @@ +using System.Collections.Generic; +using JetBrains.Annotations; + +namespace Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Toolbars +{ + public class ToolbarOptions + { + [NotNull] + public List Contributors { get; } + + public ToolbarOptions() + { + Contributors = new List(); + } + } +} diff --git a/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/IMenuConfigurationContext.cs b/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/IMenuConfigurationContext.cs index d74f961e98..92b0a89c5e 100644 --- a/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/IMenuConfigurationContext.cs +++ b/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/IMenuConfigurationContext.cs @@ -1,10 +1,11 @@ +using System; using Volo.Abp.DependencyInjection; namespace Volo.Abp.UI.Navigation { public interface IMenuConfigurationContext : IServiceProviderAccessor { - ApplicationMenu Menu { get; set; } + ApplicationMenu Menu { get; } //TODO: Add Localization, Authorization components since they are most used components on menu creation! } diff --git a/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/MenuConfigurationContext.cs b/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/MenuConfigurationContext.cs index f4d7ad6461..4231d6f2df 100644 --- a/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/MenuConfigurationContext.cs +++ b/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/MenuConfigurationContext.cs @@ -4,7 +4,7 @@ namespace Volo.Abp.UI.Navigation { public class MenuConfigurationContext : IMenuConfigurationContext { - public ApplicationMenu Menu { get; set; } + public ApplicationMenu Menu { get; } public IServiceProvider ServiceProvider { get; }