From 9c1fef7ae86ce3ae2e229b140d995c49450a1c28 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Sun, 27 Feb 2022 00:17:52 +0800 Subject: [PATCH] Add AntDesign Theme --- lsw.Abp.AntDesignUI.sln | 23 +++++ ...oreComponentsServerAntDesignThemeModule.cs | 37 ++++++++ .../Bundling/BlazorGlobalBundles.cs | 14 +++ .../Bundling/BlazorGlobalScriptContributor.cs | 14 +++ .../Bundling/BlazorGlobalStyleContributor.cs | 12 +++ ...re.Components.Server.AntDesignTheme.csproj | 23 +++++ .../AbpAntDesignThemeOptions.cs | 26 ++++++ ...etCoreComponentsWebAntDesignThemeModule.cs | 14 +++ .../Layout/AbpPageHeader.razor | 51 +++++++++++ .../Layout/AbpPageHeader.razor.cs | 88 +++++++++++++++++++ .../Layout/PageHeaderOptions.cs | 8 ++ .../Layout/PageLayout.cs | 29 ++++++ ...tCore.Components.Web.AntDesignTheme.csproj | 17 ++++ .../PageToolbars/IPageToolbarContributor.cs | 9 ++ .../PageToolbars/IPageToolbarManager.cs | 8 ++ .../PageToolbars/PageToolbar.cs | 11 +++ .../PageToolbarContributionContext.cs | 21 +++++ .../PageToolbars/PageToolbarContributor.cs | 9 ++ .../PageToolbarContributorList.cs | 8 ++ .../PageToolbars/PageToolbarDictionary.cs | 8 ++ .../PageToolbars/PageToolbarExtensions.cs | 69 +++++++++++++++ .../PageToolbars/PageToolbarItem.cs | 27 ++++++ .../PageToolbars/PageToolbarItemList.cs | 8 ++ .../PageToolbars/PageToolbarManager.cs | 39 ++++++++ .../SimplePageToolbarContributor.cs | 53 +++++++++++ .../Routing/AbpRouterOptions.cs | 15 ++++ .../Routing/RouterAssemblyList.cs | 9 ++ .../Themes/AntDesign/App.razor | 28 ++++++ .../Themes/AntDesign/MainMenu.razor | 9 ++ .../Themes/AntDesign/MainMenu.razor.cs | 45 ++++++++++ .../Themes/AntDesign/MainMenuItem.razor | 45 ++++++++++ .../Themes/AntDesign/_Imports.razor | 9 ++ .../Toolbars/AbpToolbarOptions.cs | 16 ++++ .../Toolbars/IToolbarConfigurationContext.cs | 28 ++++++ .../Toolbars/IToolbarContributor.cs | 8 ++ .../Toolbars/IToolbarManager.cs | 8 ++ .../Toolbars/StandardToolbars.cs | 6 ++ .../Toolbars/Toolbar.cs | 18 ++++ .../Toolbars/ToolbarConfigurationContext.cs | 52 +++++++++++ .../Toolbars/ToolbarItem.cs | 22 +++++ .../Toolbars/ToolbarManager.cs | 39 ++++++++ ...mponentsWebAssemblyAntDesignThemeModule.cs | 14 +++ .../ComponentsComponentsBundleContributor.cs | 19 ++++ ...mponents.WebAssembly.AntDesignTheme.csproj | 17 ++++ src/BreadcrumbItem.cs | 19 ---- src/Lsw.Abp.AntDesignUI/BreadcrumbItem.cs | 4 +- .../Components/AbpExtensibleDataGrid.razor.cs | 2 +- .../Components/ToolbarButton.razor | 2 +- .../Components/UiPageProgress.razor | 4 +- .../Components/UiPageProgress.razor.cs | 2 +- 50 files changed, 1040 insertions(+), 26 deletions(-) create mode 100644 modules/Lsw.Abp.AspnetCore.Components.Server.AntDesignTheme/AbpAspNetCoreComponentsServerAntDesignThemeModule.cs create mode 100644 modules/Lsw.Abp.AspnetCore.Components.Server.AntDesignTheme/Bundling/BlazorGlobalBundles.cs create mode 100644 modules/Lsw.Abp.AspnetCore.Components.Server.AntDesignTheme/Bundling/BlazorGlobalScriptContributor.cs create mode 100644 modules/Lsw.Abp.AspnetCore.Components.Server.AntDesignTheme/Bundling/BlazorGlobalStyleContributor.cs create mode 100644 modules/Lsw.Abp.AspnetCore.Components.Server.AntDesignTheme/Lsw.Abp.AspnetCore.Components.Server.AntDesignTheme.csproj create mode 100644 modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/AbpAntDesignThemeOptions.cs create mode 100644 modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/AbpAspNetCoreComponentsWebAntDesignThemeModule.cs create mode 100644 modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Layout/AbpPageHeader.razor create mode 100644 modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Layout/AbpPageHeader.razor.cs create mode 100644 modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Layout/PageHeaderOptions.cs create mode 100644 modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Layout/PageLayout.cs create mode 100644 modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.csproj create mode 100644 modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/PageToolbars/IPageToolbarContributor.cs create mode 100644 modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/PageToolbars/IPageToolbarManager.cs create mode 100644 modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/PageToolbars/PageToolbar.cs create mode 100644 modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/PageToolbars/PageToolbarContributionContext.cs create mode 100644 modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/PageToolbars/PageToolbarContributor.cs create mode 100644 modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/PageToolbars/PageToolbarContributorList.cs create mode 100644 modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/PageToolbars/PageToolbarDictionary.cs create mode 100644 modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/PageToolbars/PageToolbarExtensions.cs create mode 100644 modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/PageToolbars/PageToolbarItem.cs create mode 100644 modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/PageToolbars/PageToolbarItemList.cs create mode 100644 modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/PageToolbars/PageToolbarManager.cs create mode 100644 modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/PageToolbars/SimplePageToolbarContributor.cs create mode 100644 modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Routing/AbpRouterOptions.cs create mode 100644 modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Routing/RouterAssemblyList.cs create mode 100644 modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Themes/AntDesign/App.razor create mode 100644 modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Themes/AntDesign/MainMenu.razor create mode 100644 modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Themes/AntDesign/MainMenu.razor.cs create mode 100644 modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Themes/AntDesign/MainMenuItem.razor create mode 100644 modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Themes/AntDesign/_Imports.razor create mode 100644 modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Toolbars/AbpToolbarOptions.cs create mode 100644 modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Toolbars/IToolbarConfigurationContext.cs create mode 100644 modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Toolbars/IToolbarContributor.cs create mode 100644 modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Toolbars/IToolbarManager.cs create mode 100644 modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Toolbars/StandardToolbars.cs create mode 100644 modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Toolbars/Toolbar.cs create mode 100644 modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Toolbars/ToolbarConfigurationContext.cs create mode 100644 modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Toolbars/ToolbarItem.cs create mode 100644 modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Toolbars/ToolbarManager.cs create mode 100644 modules/Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme/AbpAspNetCoreComponentsWebAssemblyAntDesignThemeModule.cs create mode 100644 modules/Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme/ComponentsComponentsBundleContributor.cs create mode 100644 modules/Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme/Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme.csproj delete mode 100644 src/BreadcrumbItem.cs diff --git a/lsw.Abp.AntDesignUI.sln b/lsw.Abp.AntDesignUI.sln index 7579f07..19f4c41 100644 --- a/lsw.Abp.AntDesignUI.sln +++ b/lsw.Abp.AntDesignUI.sln @@ -4,6 +4,14 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{6C9F4322-BDC EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Lsw.Abp.AntDesignUI", "src\Lsw.Abp.AntDesignUI\Lsw.Abp.AntDesignUI.csproj", "{9EA4AA35-DEFC-4C25-8333-78137853EC5D}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "modules", "modules", "{0C432416-770F-4331-84E6-5835408A9BD8}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme", "modules\Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme\Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.csproj", "{75753009-1BE9-4994-8D2E-890829844C46}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Lsw.Abp.AspnetCore.Components.Server.AntDesignTheme", "modules\Lsw.Abp.AspnetCore.Components.Server.AntDesignTheme\Lsw.Abp.AspnetCore.Components.Server.AntDesignTheme.csproj", "{7C86BBAF-609E-4651-B1AF-FBF3EA669E3A}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme", "modules\Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme\Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme.csproj", "{84F26612-0056-4CD1-849B-B0B8F046350D}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -11,11 +19,26 @@ Global EndGlobalSection GlobalSection(NestedProjects) = preSolution {9EA4AA35-DEFC-4C25-8333-78137853EC5D} = {6C9F4322-BDC7-42DA-ACBD-1AC641B907B4} + {75753009-1BE9-4994-8D2E-890829844C46} = {0C432416-770F-4331-84E6-5835408A9BD8} + {7C86BBAF-609E-4651-B1AF-FBF3EA669E3A} = {0C432416-770F-4331-84E6-5835408A9BD8} + {84F26612-0056-4CD1-849B-B0B8F046350D} = {0C432416-770F-4331-84E6-5835408A9BD8} EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {9EA4AA35-DEFC-4C25-8333-78137853EC5D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9EA4AA35-DEFC-4C25-8333-78137853EC5D}.Debug|Any CPU.Build.0 = Debug|Any CPU {9EA4AA35-DEFC-4C25-8333-78137853EC5D}.Release|Any CPU.ActiveCfg = Release|Any CPU {9EA4AA35-DEFC-4C25-8333-78137853EC5D}.Release|Any CPU.Build.0 = Release|Any CPU + {75753009-1BE9-4994-8D2E-890829844C46}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {75753009-1BE9-4994-8D2E-890829844C46}.Debug|Any CPU.Build.0 = Debug|Any CPU + {75753009-1BE9-4994-8D2E-890829844C46}.Release|Any CPU.ActiveCfg = Release|Any CPU + {75753009-1BE9-4994-8D2E-890829844C46}.Release|Any CPU.Build.0 = Release|Any CPU + {7C86BBAF-609E-4651-B1AF-FBF3EA669E3A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7C86BBAF-609E-4651-B1AF-FBF3EA669E3A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7C86BBAF-609E-4651-B1AF-FBF3EA669E3A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7C86BBAF-609E-4651-B1AF-FBF3EA669E3A}.Release|Any CPU.Build.0 = Release|Any CPU + {84F26612-0056-4CD1-849B-B0B8F046350D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {84F26612-0056-4CD1-849B-B0B8F046350D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {84F26612-0056-4CD1-849B-B0B8F046350D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {84F26612-0056-4CD1-849B-B0B8F046350D}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection EndGlobal diff --git a/modules/Lsw.Abp.AspnetCore.Components.Server.AntDesignTheme/AbpAspNetCoreComponentsServerAntDesignThemeModule.cs b/modules/Lsw.Abp.AspnetCore.Components.Server.AntDesignTheme/AbpAspNetCoreComponentsServerAntDesignThemeModule.cs new file mode 100644 index 0000000..26361d7 --- /dev/null +++ b/modules/Lsw.Abp.AspnetCore.Components.Server.AntDesignTheme/AbpAspNetCoreComponentsServerAntDesignThemeModule.cs @@ -0,0 +1,37 @@ +using Lsw.Abp.AspnetCore.Components.Server.AntDesignTheme.Bundling; +using Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme; +using Volo.Abp.AspNetCore.Components.Server; +using Volo.Abp.AspNetCore.Mvc.UI.Bundling; +using Volo.Abp.AspNetCore.Mvc.UI.Packages; +using Volo.Abp.Modularity; + +namespace Lsw.Abp.AspnetCore.Components.Server.AntDesignTheme; + +[DependsOn( + typeof(AbpAspNetCoreComponentsServerModule), + typeof(AbpAspNetCoreMvcUiPackagesModule), + typeof(AbpAspNetCoreMvcUiBundlingModule), + typeof(AbpAspNetCoreComponentsWebAntDesignThemeModule) +)] +public class AbpAspNetCoreComponentsServerAntDesignThemeModule : AbpModule +{ + public override void ConfigureServices(ServiceConfigurationContext context) + { + Configure(options => + { + options + .StyleBundles + .Add(BlazorStandardBundles.Styles.Global, bundle => + { + bundle.AddContributors(typeof(BlazorGlobalStyleContributor)); + }); + + options + .ScriptBundles + .Add(BlazorStandardBundles.Scripts.Global, bundle => + { + bundle.AddContributors(typeof(BlazorGlobalScriptContributor)); + }); + }); + } +} diff --git a/modules/Lsw.Abp.AspnetCore.Components.Server.AntDesignTheme/Bundling/BlazorGlobalBundles.cs b/modules/Lsw.Abp.AspnetCore.Components.Server.AntDesignTheme/Bundling/BlazorGlobalBundles.cs new file mode 100644 index 0000000..4784185 --- /dev/null +++ b/modules/Lsw.Abp.AspnetCore.Components.Server.AntDesignTheme/Bundling/BlazorGlobalBundles.cs @@ -0,0 +1,14 @@ +namespace Lsw.Abp.AspnetCore.Components.Server.AntDesignTheme.Bundling; + +public class BlazorStandardBundles +{ + public static class Styles + { + public static string Global = "Blazor.Global"; + } + + public static class Scripts + { + public static string Global = "Blazor.Global"; + } +} diff --git a/modules/Lsw.Abp.AspnetCore.Components.Server.AntDesignTheme/Bundling/BlazorGlobalScriptContributor.cs b/modules/Lsw.Abp.AspnetCore.Components.Server.AntDesignTheme/Bundling/BlazorGlobalScriptContributor.cs new file mode 100644 index 0000000..6e4654e --- /dev/null +++ b/modules/Lsw.Abp.AspnetCore.Components.Server.AntDesignTheme/Bundling/BlazorGlobalScriptContributor.cs @@ -0,0 +1,14 @@ +using System.Collections.Generic; +using Volo.Abp.AspNetCore.Mvc.UI.Bundling; + +namespace Lsw.Abp.AspnetCore.Components.Server.AntDesignTheme.Bundling; + +public class BlazorGlobalScriptContributor : BundleContributor +{ + public override void ConfigureBundle(BundleConfigurationContext context) + { + context.Files.AddIfNotContains("/_framework/blazor.server.js"); + context.Files.AddIfNotContains("/_content/Volo.Abp.AspNetCore.Components.Web/libs/abp/js/abp.js"); + context.Files.AddIfNotContains("/_content/AntDesign/js/ant-design-blazor.js"); + } +} diff --git a/modules/Lsw.Abp.AspnetCore.Components.Server.AntDesignTheme/Bundling/BlazorGlobalStyleContributor.cs b/modules/Lsw.Abp.AspnetCore.Components.Server.AntDesignTheme/Bundling/BlazorGlobalStyleContributor.cs new file mode 100644 index 0000000..44d0fc6 --- /dev/null +++ b/modules/Lsw.Abp.AspnetCore.Components.Server.AntDesignTheme/Bundling/BlazorGlobalStyleContributor.cs @@ -0,0 +1,12 @@ +using System.Collections.Generic; +using Volo.Abp.AspNetCore.Mvc.UI.Bundling; + +namespace Lsw.Abp.AspnetCore.Components.Server.AntDesignTheme.Bundling; + +public class BlazorGlobalStyleContributor : BundleContributor +{ + public override void ConfigureBundle(BundleConfigurationContext context) + { + context.Files.AddIfNotContains("/_content/AntDesign/css/ant-design-blazor.css"); + } +} diff --git a/modules/Lsw.Abp.AspnetCore.Components.Server.AntDesignTheme/Lsw.Abp.AspnetCore.Components.Server.AntDesignTheme.csproj b/modules/Lsw.Abp.AspnetCore.Components.Server.AntDesignTheme/Lsw.Abp.AspnetCore.Components.Server.AntDesignTheme.csproj new file mode 100644 index 0000000..90f7cc8 --- /dev/null +++ b/modules/Lsw.Abp.AspnetCore.Components.Server.AntDesignTheme/Lsw.Abp.AspnetCore.Components.Server.AntDesignTheme.csproj @@ -0,0 +1,23 @@ + + + + + + net6.0 + + + + + + + + + + + + + + + + + diff --git a/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/AbpAntDesignThemeOptions.cs b/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/AbpAntDesignThemeOptions.cs new file mode 100644 index 0000000..0220165 --- /dev/null +++ b/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/AbpAntDesignThemeOptions.cs @@ -0,0 +1,26 @@ +using AntDesign; + +namespace Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme; + +public class AbpAntDesignThemeOptions +{ + public MenuOptions Menu { get; set; } +} + +public class MenuOptions +{ + public MenuTheme Theme { get; set; } + + public MenuPlace Place { get; set; } + + public MenuMode GetMode() + { + return Place == MenuPlace.Left ? MenuMode.Inline : MenuMode.Horizontal; + } + + public enum MenuPlace + { + Top, + Left + } +} diff --git a/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/AbpAspNetCoreComponentsWebAntDesignThemeModule.cs b/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/AbpAspNetCoreComponentsWebAntDesignThemeModule.cs new file mode 100644 index 0000000..cfb43b4 --- /dev/null +++ b/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/AbpAspNetCoreComponentsWebAntDesignThemeModule.cs @@ -0,0 +1,14 @@ +using Lsw.Abp.AntDesignUI; +using Volo.Abp.Modularity; +using Volo.Abp.UI.Navigation; + +namespace Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme; + +[DependsOn( + typeof(AbpAntDesignUIModule), + typeof(AbpUiNavigationModule) +)] +public class AbpAspNetCoreComponentsWebAntDesignThemeModule : AbpModule +{ + +} diff --git a/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Layout/AbpPageHeader.razor b/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Layout/AbpPageHeader.razor new file mode 100644 index 0000000..5fc4250 --- /dev/null +++ b/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Layout/AbpPageHeader.razor @@ -0,0 +1,51 @@ +@using AntDesign +@using Microsoft.Extensions.Options +@inject IOptions Options + + + @if (Options.Value.RenderPageTitle) + { + + } + + @if (Options.Value.RenderBreadcrumbs && PageLayout.BreadcrumbItems.Any()) + { + + @if (BreadcrumbShowHome) + { + + + + } + @foreach (var item in PageLayout.BreadcrumbItems) + { + + @if (!item.Icon.IsNullOrWhiteSpace()) + { + + } + @item.Text + + } + + } + + @if (Options.Value.RenderToolbar) + { +
+ + @if (Toolbar == null) + { + @ChildContent + } + + @foreach (var toolbarItemRender in ToolbarItemRenders) + { +
+ @toolbarItemRender +
+ } +
+
+ } +
diff --git a/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Layout/AbpPageHeader.razor.cs b/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Layout/AbpPageHeader.razor.cs new file mode 100644 index 0000000..f718588 --- /dev/null +++ b/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Layout/AbpPageHeader.razor.cs @@ -0,0 +1,88 @@ +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Linq; +using System.Threading.Tasks; +using Lsw.Abp.AntDesignUI; +using Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.PageToolbars; +using Microsoft.AspNetCore.Components; + +namespace Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.Layout; + +public partial class AbpPageHeader : ComponentBase +{ + protected List ToolbarItemRenders { get; set; } + + public IPageToolbarManager PageToolbarManager { get; set; } + + [Inject] + public PageLayout PageLayout { get; private set; } + + [Parameter] + public string Title { get => PageLayout.Title; set => PageLayout.Title = value; } + + [Parameter] + public bool BreadcrumbShowHome { get; set; } = true; + + [Parameter] + public bool BreadcrumbShowCurrent { get; set; } = true; + + [Parameter] + public RenderFragment ChildContent { get; set; } + + [Parameter] + public List BreadcrumbItems { + get => PageLayout.BreadcrumbItems.ToList(); + set => PageLayout.BreadcrumbItems = new ObservableCollection(value); + } + + [Parameter] + public PageToolbar Toolbar { get; set; } + + public AbpPageHeader() + { + ToolbarItemRenders = new List(); + } + + protected override async Task OnParametersSetAsync() + { + await base.OnParametersSetAsync(); + if (Toolbar != null) + { + var toolbarItems = await PageToolbarManager.GetItemsAsync(Toolbar); + ToolbarItemRenders.Clear(); + + if (!Options.Value.RenderToolbar) + { + PageLayout.ToolbarItems.Clear(); + foreach (var item in toolbarItems) + { + PageLayout.ToolbarItems.Add(item); + } + return; + } + + foreach (var item in toolbarItems) + { + var sequence = 0; + ToolbarItemRenders.Add(builder => + { + builder.OpenComponent(sequence, item.ComponentType); + if (item.Arguments != null) + { + foreach (var argument in item.Arguments) + { + sequence++; + builder.AddAttribute(sequence, argument.Key, argument.Value); + } + } + builder.CloseComponent(); + }); + } + } + } + + protected override async Task OnInitializedAsync() + { + await base.OnInitializedAsync(); + } +} diff --git a/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Layout/PageHeaderOptions.cs b/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Layout/PageHeaderOptions.cs new file mode 100644 index 0000000..adc9a35 --- /dev/null +++ b/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Layout/PageHeaderOptions.cs @@ -0,0 +1,8 @@ +namespace Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.Layout; + +public class PageHeaderOptions +{ + public bool RenderPageTitle { get; set; } = true; + public bool RenderBreadcrumbs { get; set; } = true; + public bool RenderToolbar { get; set; } = true; +} diff --git a/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Layout/PageLayout.cs b/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Layout/PageLayout.cs new file mode 100644 index 0000000..4f0a0ff --- /dev/null +++ b/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Layout/PageLayout.cs @@ -0,0 +1,29 @@ +using System.Collections.ObjectModel; +using System.ComponentModel; +using Lsw.Abp.AntDesignUI; +using Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.PageToolbars; +using Volo.Abp.DependencyInjection; + +namespace Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.Layout; + +public class PageLayout : IScopedDependency, INotifyPropertyChanged +{ + private string title; + + // TODO: Consider using this property for setting Page Title too. + public virtual string Title + { + get => title; + set + { + title = value; + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Title))); + } + } + + public virtual ObservableCollection BreadcrumbItems { get; set; } = new(); + + public virtual ObservableCollection ToolbarItems { get; set; } = new(); + + public event PropertyChangedEventHandler PropertyChanged; +} diff --git a/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.csproj b/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.csproj new file mode 100644 index 0000000..86e1a6a --- /dev/null +++ b/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.csproj @@ -0,0 +1,17 @@ + + + + + + net6.0 + + + + + + + + + + + diff --git a/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/PageToolbars/IPageToolbarContributor.cs b/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/PageToolbars/IPageToolbarContributor.cs new file mode 100644 index 0000000..d390b3d --- /dev/null +++ b/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/PageToolbars/IPageToolbarContributor.cs @@ -0,0 +1,9 @@ +using System.Threading.Tasks; +using Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.PageToolbars; + +namespace Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.PageToolbars; + +public interface IPageToolbarContributor +{ + Task ContributeAsync(PageToolbarContributionContext context); +} diff --git a/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/PageToolbars/IPageToolbarManager.cs b/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/PageToolbars/IPageToolbarManager.cs new file mode 100644 index 0000000..2643a00 --- /dev/null +++ b/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/PageToolbars/IPageToolbarManager.cs @@ -0,0 +1,8 @@ +using System.Threading.Tasks; + +namespace Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.PageToolbars; + +public interface IPageToolbarManager +{ + Task GetItemsAsync(PageToolbar toolbar); +} diff --git a/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/PageToolbars/PageToolbar.cs b/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/PageToolbars/PageToolbar.cs new file mode 100644 index 0000000..28effdb --- /dev/null +++ b/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/PageToolbars/PageToolbar.cs @@ -0,0 +1,11 @@ +namespace Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.PageToolbars; + +public class PageToolbar +{ + public PageToolbarContributorList Contributors { get; set; } + + public PageToolbar() + { + Contributors = new PageToolbarContributorList(); + } +} diff --git a/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/PageToolbars/PageToolbarContributionContext.cs b/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/PageToolbars/PageToolbarContributionContext.cs new file mode 100644 index 0000000..e62be66 --- /dev/null +++ b/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/PageToolbars/PageToolbarContributionContext.cs @@ -0,0 +1,21 @@ +using JetBrains.Annotations; +using System; +using Volo.Abp; + +namespace Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.PageToolbars; + +public class PageToolbarContributionContext +{ + [NotNull] + public IServiceProvider ServiceProvider { get; } + + [NotNull] + public PageToolbarItemList Items { get; } + + public PageToolbarContributionContext( + [NotNull] IServiceProvider serviceProvider) + { + ServiceProvider = Check.NotNull(serviceProvider, nameof(serviceProvider)); + Items = new PageToolbarItemList(); + } +} diff --git a/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/PageToolbars/PageToolbarContributor.cs b/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/PageToolbars/PageToolbarContributor.cs new file mode 100644 index 0000000..c81f566 --- /dev/null +++ b/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/PageToolbars/PageToolbarContributor.cs @@ -0,0 +1,9 @@ +using System.Threading.Tasks; +using Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.PageToolbars; + +namespace Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.PageToolbars; + +public abstract class PageToolbarContributor : IPageToolbarContributor +{ + public abstract Task ContributeAsync(PageToolbarContributionContext context); +} diff --git a/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/PageToolbars/PageToolbarContributorList.cs b/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/PageToolbars/PageToolbarContributorList.cs new file mode 100644 index 0000000..3a66b4d --- /dev/null +++ b/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/PageToolbars/PageToolbarContributorList.cs @@ -0,0 +1,8 @@ +using System.Collections.Generic; +using Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.PageToolbars; + +namespace Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.PageToolbars; + +public class PageToolbarContributorList : List +{ +} diff --git a/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/PageToolbars/PageToolbarDictionary.cs b/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/PageToolbars/PageToolbarDictionary.cs new file mode 100644 index 0000000..1be1149 --- /dev/null +++ b/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/PageToolbars/PageToolbarDictionary.cs @@ -0,0 +1,8 @@ +using System.Collections.Generic; + +namespace Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.PageToolbars; + +public class PageToolbarDictionary : Dictionary +{ + +} diff --git a/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/PageToolbars/PageToolbarExtensions.cs b/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/PageToolbars/PageToolbarExtensions.cs new file mode 100644 index 0000000..f5186e9 --- /dev/null +++ b/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/PageToolbars/PageToolbarExtensions.cs @@ -0,0 +1,69 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using AntDesign; +using Lsw.Abp.AntDesignUI.Components; + +namespace Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.PageToolbars; + +public static class PageToolbarExtensions +{ + public static PageToolbar AddComponent( + this PageToolbar toolbar, + Dictionary arguments = null, + int order = 0, + string requiredPolicyName = null) + { + return toolbar.AddComponent( + typeof(TComponent), + arguments, + order, + requiredPolicyName + ); + } + + public static PageToolbar AddComponent( + this PageToolbar toolbar, + Type componentType, + Dictionary arguments = null, + int order = 0, + string requiredPolicyName = null) + { + toolbar.Contributors.Add( + new SimplePageToolbarContributor( + componentType, + arguments, + order, + requiredPolicyName + ) + ); + + return toolbar; + } + + public static PageToolbar AddButton( + this PageToolbar toolbar, + string text, + Func clicked, + object icon = null, + string color = ButtonType.Primary, + bool disabled = false, + int order = 0, + string requiredPolicyName = null) + { + toolbar.AddComponent( + new Dictionary + { + { nameof(ToolbarButton.Color), color}, + { nameof(ToolbarButton.Text), text}, + { nameof(ToolbarButton.Disabled), disabled}, + { nameof(ToolbarButton.Icon), icon}, + { nameof(ToolbarButton.Clicked),clicked}, + }, + order, + requiredPolicyName + ); + + return toolbar; + } +} diff --git a/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/PageToolbars/PageToolbarItem.cs b/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/PageToolbars/PageToolbarItem.cs new file mode 100644 index 0000000..f6a1f04 --- /dev/null +++ b/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/PageToolbars/PageToolbarItem.cs @@ -0,0 +1,27 @@ +using JetBrains.Annotations; +using System; +using System.Collections.Generic; +using Volo.Abp; + +namespace Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.PageToolbars; + +public class PageToolbarItem +{ + [NotNull] + public Type ComponentType { get; } + + [CanBeNull] + public Dictionary Arguments { get; set; } + + public int Order { get; set; } + + public PageToolbarItem( + [NotNull] Type componentType, + [CanBeNull] Dictionary arguments = null, + int order = 0) + { + ComponentType = Check.NotNull(componentType, nameof(componentType)); + Arguments = arguments; + Order = order; + } +} diff --git a/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/PageToolbars/PageToolbarItemList.cs b/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/PageToolbars/PageToolbarItemList.cs new file mode 100644 index 0000000..9711edc --- /dev/null +++ b/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/PageToolbars/PageToolbarItemList.cs @@ -0,0 +1,8 @@ +using System.Collections.Generic; + +namespace Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.PageToolbars; + +public class PageToolbarItemList : List +{ + +} diff --git a/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/PageToolbars/PageToolbarManager.cs b/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/PageToolbars/PageToolbarManager.cs new file mode 100644 index 0000000..0de6394 --- /dev/null +++ b/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/PageToolbars/PageToolbarManager.cs @@ -0,0 +1,39 @@ +using Microsoft.Extensions.Options; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Volo.Abp.DependencyInjection; + +namespace Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.PageToolbars; + +public class PageToolbarManager : IPageToolbarManager, ITransientDependency +{ + protected IHybridServiceScopeFactory ServiceScopeFactory { get; } + + public PageToolbarManager( + IHybridServiceScopeFactory serviceScopeFactory) + { + ServiceScopeFactory = serviceScopeFactory; + } + + public virtual async Task GetItemsAsync(PageToolbar toolbar) + { + if (toolbar == null || !toolbar.Contributors.Any()) + { + return Array.Empty(); + } + + using (var scope = ServiceScopeFactory.CreateScope()) + { + var context = new PageToolbarContributionContext(scope.ServiceProvider); + + foreach (var contributor in toolbar.Contributors) + { + await contributor.ContributeAsync(context); + } + + return context.Items.OrderBy(i => i.Order).ToArray(); + } + } +} diff --git a/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/PageToolbars/SimplePageToolbarContributor.cs b/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/PageToolbars/SimplePageToolbarContributor.cs new file mode 100644 index 0000000..a4fbf47 --- /dev/null +++ b/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/PageToolbars/SimplePageToolbarContributor.cs @@ -0,0 +1,53 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.Extensions.DependencyInjection; +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.PageToolbars; + +namespace Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.PageToolbars; + +public class SimplePageToolbarContributor : IPageToolbarContributor +{ + public Type ComponentType { get; } + + public Dictionary Arguments { get; set; } + + public int Order { get; } + + public string RequiredPolicyName { get; } + + public SimplePageToolbarContributor( + Type componentType, + Dictionary arguments = null, + int order = 0, + string requiredPolicyName = null) + { + ComponentType = componentType; + Arguments = arguments; + Order = order; + RequiredPolicyName = requiredPolicyName; + } + + public async Task ContributeAsync(PageToolbarContributionContext context) + { + if (await ShouldAddComponentAsync(context)) + { + context.Items.Add(new PageToolbarItem(ComponentType, Arguments, Order)); + } + } + + protected virtual async Task ShouldAddComponentAsync(PageToolbarContributionContext context) + { + if (RequiredPolicyName != null) + { + var authorizationService = context.ServiceProvider.GetRequiredService(); + if (!await authorizationService.IsGrantedAsync(RequiredPolicyName)) + { + return false; + } + } + + return true; + } +} diff --git a/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Routing/AbpRouterOptions.cs b/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Routing/AbpRouterOptions.cs new file mode 100644 index 0000000..d562363 --- /dev/null +++ b/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Routing/AbpRouterOptions.cs @@ -0,0 +1,15 @@ +using System.Reflection; + +namespace Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.Routing; + +public class AbpRouterOptions +{ + public Assembly AppAssembly { get; set; } + + public RouterAssemblyList AdditionalAssemblies { get; } + + public AbpRouterOptions() + { + AdditionalAssemblies = new RouterAssemblyList(); + } +} diff --git a/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Routing/RouterAssemblyList.cs b/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Routing/RouterAssemblyList.cs new file mode 100644 index 0000000..0b50ad7 --- /dev/null +++ b/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Routing/RouterAssemblyList.cs @@ -0,0 +1,9 @@ +using System.Collections.Generic; +using System.Reflection; + +namespace Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.Routing; + +public class RouterAssemblyList : List +{ + +} diff --git a/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Themes/AntDesign/App.razor b/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Themes/AntDesign/App.razor new file mode 100644 index 0000000..db16c0a --- /dev/null +++ b/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Themes/AntDesign/App.razor @@ -0,0 +1,28 @@ +@using Microsoft.Extensions.Options +@using Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.Routing +@inject IOptions RouterOptions + + + + + + @if (!context.User.Identity.IsAuthenticated) + { + + } + else + { +

You are not authorized to access this resource.

+ } +
+
+
+ + +

Sorry, there's nothing at this address.

+
+
+
+ +
diff --git a/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Themes/AntDesign/MainMenu.razor b/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Themes/AntDesign/MainMenu.razor new file mode 100644 index 0000000..25e58bc --- /dev/null +++ b/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Themes/AntDesign/MainMenu.razor @@ -0,0 +1,9 @@ + + @if (Menu != null) + { + foreach (var menu in Menu.Items) + { + + } + } + diff --git a/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Themes/AntDesign/MainMenu.razor.cs b/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Themes/AntDesign/MainMenu.razor.cs new file mode 100644 index 0000000..f265d20 --- /dev/null +++ b/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Themes/AntDesign/MainMenu.razor.cs @@ -0,0 +1,45 @@ +using System; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Components; +using Microsoft.AspNetCore.Components.Authorization; +using Microsoft.Extensions.Options; +using Volo.Abp.UI.Navigation; + +namespace Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.Themes.AntDesign; + +public partial class MainMenu : IDisposable +{ + [Inject] + protected IMenuManager MenuManager { get; set; } + + [Inject] + protected IOptions Options { get; set; } + + [Inject] + protected AuthenticationStateProvider AuthenticationStateProvider { get; set; } + + + protected ApplicationMenu Menu { get; set; } + + protected override async Task OnInitializedAsync() + { + await GetMenuAsync(); + AuthenticationStateProvider.AuthenticationStateChanged += AuthenticationStateProviderOnAuthenticationStateChanged; + } + + private async Task GetMenuAsync() + { + Menu = await MenuManager.GetMainMenuAsync(); + } + + private async void AuthenticationStateProviderOnAuthenticationStateChanged(Task task) + { + await GetMenuAsync(); + await InvokeAsync(StateHasChanged); + } + + public void Dispose() + { + AuthenticationStateProvider.AuthenticationStateChanged -= AuthenticationStateProviderOnAuthenticationStateChanged; + } +} diff --git a/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Themes/AntDesign/MainMenuItem.razor b/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Themes/AntDesign/MainMenuItem.razor new file mode 100644 index 0000000..fd707f5 --- /dev/null +++ b/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Themes/AntDesign/MainMenuItem.razor @@ -0,0 +1,45 @@ +@using Volo.Abp.UI.Navigation + +@if (Menu != null) +{ + var elementId = Menu.ElementId ?? "MenuItem_" + Menu.Name.Replace(".", "_"); + var url = Menu.Url == null ? "#" : Menu.Url.TrimStart('/', '~'); + + if (Menu.IsLeaf && Menu.Url != null) + { + + @if (Menu.Icon != null) + { + + } + @Menu.Name + + } + else + { + + @foreach (var menuItem in Menu.Items) + { + + } + + } +} + +@code { + + [Parameter] + public ApplicationMenuItem Menu { get; set; } + + private RenderFragment GetSubMenuTemplate() + { + return @ + @if (Menu.Icon != null) + { + + } + @Menu.Name + ; + } + +} diff --git a/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Themes/AntDesign/_Imports.razor b/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Themes/AntDesign/_Imports.razor new file mode 100644 index 0000000..aaadd42 --- /dev/null +++ b/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Themes/AntDesign/_Imports.razor @@ -0,0 +1,9 @@ +@using System.Net.Http +@using Microsoft.AspNetCore.Components.Authorization +@using Microsoft.AspNetCore.Components.Forms +@using Microsoft.AspNetCore.Components.Routing +@using Microsoft.AspNetCore.Components.Web +@using Microsoft.JSInterop +@using AntDesign +@using Lsw.Abp.AntDesignUI +@using Lsw.Abp.AntDesignUI.Components diff --git a/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Toolbars/AbpToolbarOptions.cs b/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Toolbars/AbpToolbarOptions.cs new file mode 100644 index 0000000..647243e --- /dev/null +++ b/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Toolbars/AbpToolbarOptions.cs @@ -0,0 +1,16 @@ +using System.Collections.Generic; +using JetBrains.Annotations; +using Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.Toolbars; + +namespace Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.Toolbars; + +public class AbpToolbarOptions +{ + [NotNull] + public List Contributors { get; } + + public AbpToolbarOptions() + { + Contributors = new List(); + } +} diff --git a/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Toolbars/IToolbarConfigurationContext.cs b/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Toolbars/IToolbarConfigurationContext.cs new file mode 100644 index 0000000..9ad8b6b --- /dev/null +++ b/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Toolbars/IToolbarConfigurationContext.cs @@ -0,0 +1,28 @@ +using System; +using System.Threading.Tasks; +using JetBrains.Annotations; +using Microsoft.AspNetCore.Authorization; +using Microsoft.Extensions.Localization; +using Volo.Abp.DependencyInjection; + +namespace Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.Toolbars; + +public interface IToolbarConfigurationContext : IServiceProviderAccessor +{ + Toolbar Toolbar { get; } + + IAuthorizationService AuthorizationService { get; } + + IStringLocalizerFactory StringLocalizerFactory { get; } + + Task IsGrantedAsync(string policyName); + + [CanBeNull] + IStringLocalizer GetDefaultLocalizer(); + + [NotNull] + public IStringLocalizer GetLocalizer(); + + [NotNull] + public IStringLocalizer GetLocalizer(Type resourceType); +} diff --git a/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Toolbars/IToolbarContributor.cs b/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Toolbars/IToolbarContributor.cs new file mode 100644 index 0000000..1dc9567 --- /dev/null +++ b/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Toolbars/IToolbarContributor.cs @@ -0,0 +1,8 @@ +using System.Threading.Tasks; + +namespace Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.Toolbars; + +public interface IToolbarContributor +{ + Task ConfigureToolbarAsync(IToolbarConfigurationContext context); +} diff --git a/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Toolbars/IToolbarManager.cs b/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Toolbars/IToolbarManager.cs new file mode 100644 index 0000000..37c72c8 --- /dev/null +++ b/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Toolbars/IToolbarManager.cs @@ -0,0 +1,8 @@ +using System.Threading.Tasks; + +namespace Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.Toolbars; + +public interface IToolbarManager +{ + Task GetAsync(string name); +} diff --git a/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Toolbars/StandardToolbars.cs b/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Toolbars/StandardToolbars.cs new file mode 100644 index 0000000..c9f0e54 --- /dev/null +++ b/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Toolbars/StandardToolbars.cs @@ -0,0 +1,6 @@ +namespace Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.Toolbars; + +public static class StandardToolbars +{ + public const string Main = "Main"; +} diff --git a/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Toolbars/Toolbar.cs b/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Toolbars/Toolbar.cs new file mode 100644 index 0000000..78a366e --- /dev/null +++ b/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Toolbars/Toolbar.cs @@ -0,0 +1,18 @@ +using System.Collections.Generic; +using JetBrains.Annotations; +using Volo.Abp; + +namespace Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.Toolbars; + +public class Toolbar +{ + public string Name { get; } + + public List Items { get; } + + public Toolbar([NotNull] string name) + { + Name = Check.NotNull(name, nameof(name)); + Items = new List(); + } +} diff --git a/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Toolbars/ToolbarConfigurationContext.cs b/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Toolbars/ToolbarConfigurationContext.cs new file mode 100644 index 0000000..c5a1118 --- /dev/null +++ b/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Toolbars/ToolbarConfigurationContext.cs @@ -0,0 +1,52 @@ +using System; +using System.Threading.Tasks; +using JetBrains.Annotations; +using Microsoft.AspNetCore.Authorization; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Localization; +using Volo.Abp.DependencyInjection; + +namespace Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.Toolbars; + +public class ToolbarConfigurationContext : IToolbarConfigurationContext +{ + public IServiceProvider ServiceProvider { get; } + + private readonly IAbpLazyServiceProvider _lazyServiceProvider; + + public IAuthorizationService AuthorizationService => _lazyServiceProvider.LazyGetRequiredService(); + + public IStringLocalizerFactory StringLocalizerFactory => _lazyServiceProvider.LazyGetRequiredService(); + + public Toolbar Toolbar { get; } + + public ToolbarConfigurationContext(Toolbar toolbar, IServiceProvider serviceProvider) + { + Toolbar = toolbar; + ServiceProvider = serviceProvider; + _lazyServiceProvider = ServiceProvider.GetRequiredService(); + } + + public Task IsGrantedAsync(string policyName) + { + return AuthorizationService.IsGrantedAsync(policyName); + } + + [CanBeNull] + public IStringLocalizer GetDefaultLocalizer() + { + return StringLocalizerFactory.CreateDefaultOrNull(); + } + + [NotNull] + public IStringLocalizer GetLocalizer() + { + return StringLocalizerFactory.Create(); + } + + [NotNull] + public IStringLocalizer GetLocalizer(Type resourceType) + { + return StringLocalizerFactory.Create(resourceType); + } +} diff --git a/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Toolbars/ToolbarItem.cs b/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Toolbars/ToolbarItem.cs new file mode 100644 index 0000000..2847203 --- /dev/null +++ b/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Toolbars/ToolbarItem.cs @@ -0,0 +1,22 @@ +using System; +using JetBrains.Annotations; +using Volo.Abp; + +namespace Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.Toolbars; + +public class ToolbarItem +{ + public Type ComponentType { + get => _componentType; + set => _componentType = Check.NotNull(value, nameof(value)); + } + private Type _componentType; + + public int Order { get; set; } + + public ToolbarItem([NotNull] Type componentType, int order = 0) + { + Order = order; + ComponentType = Check.NotNull(componentType, nameof(componentType)); + } +} diff --git a/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Toolbars/ToolbarManager.cs b/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Toolbars/ToolbarManager.cs new file mode 100644 index 0000000..b93ba76 --- /dev/null +++ b/modules/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Toolbars/ToolbarManager.cs @@ -0,0 +1,39 @@ +using System; +using System.Threading.Tasks; +using Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.Toolbars; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Options; +using Volo.Abp.DependencyInjection; + +namespace Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.Toolbars; + +public class ToolbarManager : IToolbarManager, ITransientDependency +{ + protected AbpToolbarOptions Options { get; } + protected IServiceProvider ServiceProvider { get; } + + public ToolbarManager( + IOptions options, + IServiceProvider serviceProvider) + { + ServiceProvider = serviceProvider; + Options = options.Value; + } + + public async Task GetAsync(string name) + { + var toolbar = new Toolbar(name); + + using (var scope = ServiceProvider.CreateScope()) + { + var context = new ToolbarConfigurationContext(toolbar, scope.ServiceProvider); + + foreach (var contributor in Options.Contributors) + { + await contributor.ConfigureToolbarAsync(context); + } + } + + return toolbar; + } +} diff --git a/modules/Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme/AbpAspNetCoreComponentsWebAssemblyAntDesignThemeModule.cs b/modules/Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme/AbpAspNetCoreComponentsWebAssemblyAntDesignThemeModule.cs new file mode 100644 index 0000000..f34b51c --- /dev/null +++ b/modules/Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme/AbpAspNetCoreComponentsWebAssemblyAntDesignThemeModule.cs @@ -0,0 +1,14 @@ +using Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme; +using Volo.Abp.AspNetCore.Components.WebAssembly; +using Volo.Abp.Modularity; + +namespace Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme; + +[DependsOn( + typeof(AbpAspNetCoreComponentsWebAntDesignThemeModule), + typeof(AbpAspNetCoreComponentsWebAssemblyModule) +)] +public class AbpAspNetCoreComponentsWebAssemblyAntDesignThemeModule : AbpModule +{ + +} diff --git a/modules/Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme/ComponentsComponentsBundleContributor.cs b/modules/Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme/ComponentsComponentsBundleContributor.cs new file mode 100644 index 0000000..5aa14cb --- /dev/null +++ b/modules/Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme/ComponentsComponentsBundleContributor.cs @@ -0,0 +1,19 @@ +using Volo.Abp.Bundling; + +namespace Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme; + +public class ComponentsComponentsBundleContributor : IBundleContributor +{ + public void AddScripts(BundleContext context) + { + context.Add("_content/Microsoft.AspNetCore.Components.WebAssembly.Authentication/AuthenticationService.js"); + context.Add("_content/Volo.Abp.AspNetCore.Components.Web/libs/abp/js/abp.js"); + context.Add("_content/Volo.Abp.AspNetCore.Components.Web/libs/abp/js/lang-utils.js"); + context.Add("_content/AntDesign/js/ant-design-blazor.js"); + } + + public void AddStyles(BundleContext context) + { + context.Add("_content/AntDesign/css/ant-design-blazor.css"); + } +} diff --git a/modules/Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme/Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme.csproj b/modules/Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme/Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme.csproj new file mode 100644 index 0000000..0538d97 --- /dev/null +++ b/modules/Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme/Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme.csproj @@ -0,0 +1,17 @@ + + + + + + net6.0 + + + + + + + + + + + diff --git a/src/BreadcrumbItem.cs b/src/BreadcrumbItem.cs deleted file mode 100644 index 4c1c951..0000000 --- a/src/BreadcrumbItem.cs +++ /dev/null @@ -1,19 +0,0 @@ -using Blazorise; - -namespace Lsw.Abp.AntDesignUI; - -public class BreadcrumbItem -{ - public string Text { get; set; } - - public object Icon { get; set; } - - public string Url { get; set; } - - public BreadcrumbItem(string text, string url = null, object icon = null) - { - Text = text; - Url = url; - Icon = icon; - } -} diff --git a/src/Lsw.Abp.AntDesignUI/BreadcrumbItem.cs b/src/Lsw.Abp.AntDesignUI/BreadcrumbItem.cs index 5cab3aa..dcabc06 100644 --- a/src/Lsw.Abp.AntDesignUI/BreadcrumbItem.cs +++ b/src/Lsw.Abp.AntDesignUI/BreadcrumbItem.cs @@ -4,11 +4,11 @@ public class BreadcrumbItem { public string Text { get; set; } - public object Icon { get; set; } + public string Icon { get; set; } public string Url { get; set; } - public BreadcrumbItem(string text, string url = null, object icon = null) + public BreadcrumbItem(string text, string url = null, string icon = null) { Text = text; Url = url; diff --git a/src/Lsw.Abp.AntDesignUI/Components/AbpExtensibleDataGrid.razor.cs b/src/Lsw.Abp.AntDesignUI/Components/AbpExtensibleDataGrid.razor.cs index d3e50e6..4243b2b 100644 --- a/src/Lsw.Abp.AntDesignUI/Components/AbpExtensibleDataGrid.razor.cs +++ b/src/Lsw.Abp.AntDesignUI/Components/AbpExtensibleDataGrid.razor.cs @@ -17,7 +17,7 @@ public partial class AbpExtensibleDataGrid : ComponentBase public IEnumerable Data { get; set; } [Parameter] - public int? TotalItems { get; set; } + public int TotalItems { get; set; } [Parameter] public int PageSize { get; set; } diff --git a/src/Lsw.Abp.AntDesignUI/Components/ToolbarButton.razor b/src/Lsw.Abp.AntDesignUI/Components/ToolbarButton.razor index e940cb9..6a36e84 100644 --- a/src/Lsw.Abp.AntDesignUI/Components/ToolbarButton.razor +++ b/src/Lsw.Abp.AntDesignUI/Components/ToolbarButton.razor @@ -12,7 +12,7 @@ public string Color { get; set; } = ButtonType.Default; [Parameter] - public object Icon { get; set; } + public string Icon { get; set; } [Parameter] public string Text { get; set; } diff --git a/src/Lsw.Abp.AntDesignUI/Components/UiPageProgress.razor b/src/Lsw.Abp.AntDesignUI/Components/UiPageProgress.razor index 3a76b5d..eec2087 100644 --- a/src/Lsw.Abp.AntDesignUI/Components/UiPageProgress.razor +++ b/src/Lsw.Abp.AntDesignUI/Components/UiPageProgress.razor @@ -2,11 +2,11 @@ { if (_progressStatus == ProgressStatus.Active) { - + } else { - + } } diff --git a/src/Lsw.Abp.AntDesignUI/Components/UiPageProgress.razor.cs b/src/Lsw.Abp.AntDesignUI/Components/UiPageProgress.razor.cs index b7e39c1..615b88a 100644 --- a/src/Lsw.Abp.AntDesignUI/Components/UiPageProgress.razor.cs +++ b/src/Lsw.Abp.AntDesignUI/Components/UiPageProgress.razor.cs @@ -7,7 +7,7 @@ namespace Lsw.Abp.AntDesignUI.Components; public partial class UiPageProgress : ComponentBase { - private int? _percent; + private double? _percent; private ProgressStatus _progressStatus;