Browse Source

page toolbar implementation

pull/7686/head
Ilkay Ilknur 6 years ago
parent
commit
77381e8c6f
  1. 18
      framework/src/Volo.Abp.AspNetCore.Components.WebAssembly.Theming/Layout/BreadcrumbItem.cs
  2. 42
      framework/src/Volo.Abp.AspNetCore.Components.WebAssembly.Theming/Layout/PageHeader.razor
  3. 69
      framework/src/Volo.Abp.AspNetCore.Components.WebAssembly.Theming/Layout/PageHeader.razor.cs
  4. 30
      framework/src/Volo.Abp.AspNetCore.Components.WebAssembly.Theming/PageToolbars/AbpPageToolbarOptions.cs
  5. 9
      framework/src/Volo.Abp.AspNetCore.Components.WebAssembly.Theming/PageToolbars/IPageToolbarContributor.cs
  6. 9
      framework/src/Volo.Abp.AspNetCore.Components.WebAssembly.Theming/PageToolbars/IPageToolbarManager.cs
  7. 17
      framework/src/Volo.Abp.AspNetCore.Components.WebAssembly.Theming/PageToolbars/PageToolbar.cs
  8. 27
      framework/src/Volo.Abp.AspNetCore.Components.WebAssembly.Theming/PageToolbars/PageToolbarContributionContext.cs
  9. 9
      framework/src/Volo.Abp.AspNetCore.Components.WebAssembly.Theming/PageToolbars/PageToolbarContributor.cs
  10. 8
      framework/src/Volo.Abp.AspNetCore.Components.WebAssembly.Theming/PageToolbars/PageToolbarContributorList.cs
  11. 9
      framework/src/Volo.Abp.AspNetCore.Components.WebAssembly.Theming/PageToolbars/PageToolbarDictionary.cs
  12. 71
      framework/src/Volo.Abp.AspNetCore.Components.WebAssembly.Theming/PageToolbars/PageToolbarExtensions.cs
  13. 27
      framework/src/Volo.Abp.AspNetCore.Components.WebAssembly.Theming/PageToolbars/PageToolbarItem.cs
  14. 9
      framework/src/Volo.Abp.AspNetCore.Components.WebAssembly.Theming/PageToolbars/PageToolbarItemList.cs
  15. 44
      framework/src/Volo.Abp.AspNetCore.Components.WebAssembly.Theming/PageToolbars/PageToolbarManager.cs
  16. 53
      framework/src/Volo.Abp.AspNetCore.Components.WebAssembly.Theming/PageToolbars/SimplePageToolbarContributor.cs
  17. 7
      framework/src/Volo.Abp.BlazoriseUI/AbpCrudPageBase.cs
  18. 7
      framework/src/Volo.Abp.BlazoriseUI/Components/ToolbarButton.razor
  19. 25
      framework/src/Volo.Abp.BlazoriseUI/Components/ToolbarButton.razor.cs

18
framework/src/Volo.Abp.AspNetCore.Components.WebAssembly.Theming/Layout/BreadcrumbItem.cs

@ -0,0 +1,18 @@
namespace Volo.Abp.AspNetCore.Components.WebAssembly.Theming.Layout
{
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;
}
}
}

42
framework/src/Volo.Abp.AspNetCore.Components.WebAssembly.Theming/Layout/PageHeader.razor

@ -0,0 +1,42 @@
@using Blazorise
@using BlazoriseUI
<Row Class="entry-row">
<Column ColumnSize="ColumnSize.IsAuto">
<h1 class="content-header-title">@Title</h1>
</Column>
@if (BreadcrumbItems.Any())
{
<Column ColumnSize="ColumnSize.IsAuto.OnWidescreen" Padding="Padding.Is0.FromLeft.OnWidescreen">
<Breadcrumb Mode="@(BreadcrumbShowCurrent ? BreadcrumbMode.Auto : BreadcrumbMode.None)">
@if (BreadcrumbShowHome)
{
<BreadcrumbItem>
<BreadcrumbLink To="/">
<Icon Name="IconName.Home" />
</BreadcrumbLink>
</BreadcrumbItem>
}
@foreach (var item in BreadcrumbItems)
{
<BreadcrumbItem>
<BreadcrumbLink To="@item.Url">
@if (item.Icon != null)
{
<Icon Name="@item.Icon" />
}
@item.Text
</BreadcrumbLink>
</BreadcrumbItem>
}
</Breadcrumb>
</Column>
}
<Column>
<Row Class="justify-content-end mx-n1">
@foreach (var toolbarItemRender in ToolbarItemRenders)
{
@toolbarItemRender
}
</Row>
</Column>
</Row>

69
framework/src/Volo.Abp.AspNetCore.Components.WebAssembly.Theming/Layout/PageHeader.razor.cs

@ -0,0 +1,69 @@
using Microsoft.AspNetCore.Components;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Volo.Abp.AspNetCore.Components.WebAssembly.Theming.PageToolbars;
namespace Volo.Abp.AspNetCore.Components.WebAssembly.Theming.Layout
{
public partial class PageHeader : ComponentBase
{
protected List<RenderFragment> ToolbarItemRenders { get; set; }
public IPageToolbarManager PageToolbarManager { get; set; }
[Parameter]
public string Title { get; set; }
[Parameter]
public bool BreadcrumbShowHome { get; set; } = true;
[Parameter]
public bool BreadcrumbShowCurrent { get; set; } = true;
[Parameter]
public RenderFragment ChildContent { get; set; }
[Parameter]
public List<BlazoriseUI.BreadcrumbItem> BreadcrumbItems { get; set; }
[Parameter]
public string PageName { get; set; }
public PageHeader(IPageToolbarManager pageToolbarManager)
{
BreadcrumbItems = new List<BlazoriseUI.BreadcrumbItem>();
ToolbarItemRenders = new List<RenderFragment>();
PageToolbarManager = pageToolbarManager;
}
protected override async Task OnInitializedAsync()
{
if (!PageName.IsNullOrEmpty())
{
var toolbarItems = await PageToolbarManager.GetItemsAsync(PageName);
ToolbarItemRenders.Clear();
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();
});
}
}
}
}
}

30
framework/src/Volo.Abp.AspNetCore.Components.WebAssembly.Theming/PageToolbars/AbpPageToolbarOptions.cs

@ -0,0 +1,30 @@
using JetBrains.Annotations;
using System;
using System.Collections.Generic;
namespace Volo.Abp.AspNetCore.Components.WebAssembly.Theming.PageToolbars
{
public class AbpPageToolbarOptions
{
public PageToolbarDictionary Toolbars { get; }
public AbpPageToolbarOptions()
{
Toolbars = new PageToolbarDictionary();
}
public void Configure<TPage>([NotNull] Action<PageToolbar> configureAction)
{
Configure(typeof(TPage).FullName, configureAction);
}
public void Configure([NotNull] string pageName, [NotNull] Action<PageToolbar> configureAction)
{
Check.NotNullOrWhiteSpace(pageName, nameof(pageName));
Check.NotNull(configureAction, nameof(configureAction));
var toolbar = Toolbars.GetOrAdd(pageName, () => new PageToolbar(pageName));
configureAction(toolbar);
}
}
}

9
framework/src/Volo.Abp.AspNetCore.Components.WebAssembly.Theming/PageToolbars/IPageToolbarContributor.cs

@ -0,0 +1,9 @@
using System.Threading.Tasks;
namespace Volo.Abp.AspNetCore.Components.WebAssembly.Theming.PageToolbars
{
public interface IPageToolbarContributor
{
Task ContributeAsync(PageToolbarContributionContext context);
}
}

9
framework/src/Volo.Abp.AspNetCore.Components.WebAssembly.Theming/PageToolbars/IPageToolbarManager.cs

@ -0,0 +1,9 @@
using System.Threading.Tasks;
namespace Volo.Abp.AspNetCore.Components.WebAssembly.Theming.PageToolbars
{
public interface IPageToolbarManager
{
Task<PageToolbarItem[]> GetItemsAsync(string pageName);
}
}

17
framework/src/Volo.Abp.AspNetCore.Components.WebAssembly.Theming/PageToolbars/PageToolbar.cs

@ -0,0 +1,17 @@
using JetBrains.Annotations;
namespace Volo.Abp.AspNetCore.Components.WebAssembly.Theming.PageToolbars
{
public class PageToolbar
{
public string PageName { get; }
public PageToolbarContributorList Contributors { get; set; }
public PageToolbar([NotNull] string pageName)
{
PageName = Check.NotNullOrEmpty(pageName, nameof(pageName));
Contributors = new PageToolbarContributorList();
}
}
}

27
framework/src/Volo.Abp.AspNetCore.Components.WebAssembly.Theming/PageToolbars/PageToolbarContributionContext.cs

@ -0,0 +1,27 @@
using JetBrains.Annotations;
using System;
namespace Volo.Abp.AspNetCore.Components.WebAssembly.Theming.PageToolbars
{
public class PageToolbarContributionContext
{
[NotNull]
public string PageName { get; }
[NotNull]
public IServiceProvider ServiceProvider { get; }
[NotNull]
public PageToolbarItemList Items { get; }
public PageToolbarContributionContext(
[NotNull] string pageName,
[NotNull] IServiceProvider serviceProvider)
{
PageName = Check.NotNull(pageName, nameof(pageName));
ServiceProvider = Check.NotNull(serviceProvider, nameof(serviceProvider));
Items = new PageToolbarItemList();
}
}
}

9
framework/src/Volo.Abp.AspNetCore.Components.WebAssembly.Theming/PageToolbars/PageToolbarContributor.cs

@ -0,0 +1,9 @@
using System.Threading.Tasks;
namespace Volo.Abp.AspNetCore.Components.WebAssembly.Theming.PageToolbars
{
public abstract class PageToolbarContributor : IPageToolbarContributor
{
public abstract Task ContributeAsync(PageToolbarContributionContext context);
}
}

8
framework/src/Volo.Abp.AspNetCore.Components.WebAssembly.Theming/PageToolbars/PageToolbarContributorList.cs

@ -0,0 +1,8 @@
using System.Collections.Generic;
namespace Volo.Abp.AspNetCore.Components.WebAssembly.Theming.PageToolbars
{
public class PageToolbarContributorList : List<IPageToolbarContributor>
{
}
}

9
framework/src/Volo.Abp.AspNetCore.Components.WebAssembly.Theming/PageToolbars/PageToolbarDictionary.cs

@ -0,0 +1,9 @@
using System.Collections.Generic;
namespace Volo.Abp.AspNetCore.Components.WebAssembly.Theming.PageToolbars
{
public class PageToolbarDictionary : Dictionary<string, PageToolbar>
{
}
}

71
framework/src/Volo.Abp.AspNetCore.Components.WebAssembly.Theming/PageToolbars/PageToolbarExtensions.cs

@ -0,0 +1,71 @@
using Blazorise;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Volo.Abp.BlazoriseUI.Components;
using Volo.Abp.Localization;
namespace Volo.Abp.AspNetCore.Components.WebAssembly.Theming.PageToolbars
{
public static class PageToolbarExtensions
{
public static PageToolbar AddComponent<TComponent>(
this PageToolbar toolbar,
Dictionary<string, object> 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<string, object> 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<Task> clicked,
object icon = null,
Color color = Color.Primary,
bool disabled = false,
int order = 0,
string requiredPolicyName = null)
{
toolbar.AddComponent<ToolbarButton>(
new Dictionary<string, object>
{
{ nameof(ToolbarButton.Color), color},
{ nameof(ToolbarButton.Text), text},
{ nameof(ToolbarButton.Disabled), disabled},
{ nameof(ToolbarButton.Icon), icon},
{ nameof(ToolbarButton.Clicked),clicked},
},
order,
requiredPolicyName
);
return toolbar;
}
}
}

27
framework/src/Volo.Abp.AspNetCore.Components.WebAssembly.Theming/PageToolbars/PageToolbarItem.cs

@ -0,0 +1,27 @@
using JetBrains.Annotations;
using System;
using System.Collections.Generic;
namespace Volo.Abp.AspNetCore.Components.WebAssembly.Theming.PageToolbars
{
public class PageToolbarItem
{
[NotNull]
public Type ComponentType { get; }
[CanBeNull]
public Dictionary<string, object> Arguments { get; set; }
public int Order { get; set; }
public PageToolbarItem(
[NotNull] Type componentType,
[CanBeNull] Dictionary<string, object> arguments = null,
int order = 0)
{
ComponentType = Check.NotNull(componentType, nameof(componentType));
Arguments = arguments;
Order = order;
}
}
}

9
framework/src/Volo.Abp.AspNetCore.Components.WebAssembly.Theming/PageToolbars/PageToolbarItemList.cs

@ -0,0 +1,9 @@
using System.Collections.Generic;
namespace Volo.Abp.AspNetCore.Components.WebAssembly.Theming.PageToolbars
{
public class PageToolbarItemList : List<PageToolbarItem>
{
}
}

44
framework/src/Volo.Abp.AspNetCore.Components.WebAssembly.Theming/PageToolbars/PageToolbarManager.cs

@ -0,0 +1,44 @@
using Microsoft.Extensions.Options;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
namespace Volo.Abp.AspNetCore.Components.WebAssembly.Theming.PageToolbars
{
public class PageToolbarManager : IPageToolbarManager, ITransientDependency
{
protected AbpPageToolbarOptions Options { get; }
protected IHybridServiceScopeFactory ServiceScopeFactory { get; }
public PageToolbarManager(
IOptions<AbpPageToolbarOptions> options,
IHybridServiceScopeFactory serviceScopeFactory)
{
Options = options.Value;
ServiceScopeFactory = serviceScopeFactory;
}
public virtual async Task<PageToolbarItem[]> GetItemsAsync(string pageName)
{
var toolbar = Options.Toolbars.GetOrDefault(pageName);
if (toolbar == null || !toolbar.Contributors.Any())
{
return Array.Empty<PageToolbarItem>();
}
using (var scope = ServiceScopeFactory.CreateScope())
{
var context = new PageToolbarContributionContext(pageName, scope.ServiceProvider);
foreach (var contributor in toolbar.Contributors)
{
await contributor.ContributeAsync(context);
}
return context.Items.OrderBy(i => i.Order).ToArray();
}
}
}
}

53
framework/src/Volo.Abp.AspNetCore.Components.WebAssembly.Theming/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;
namespace Volo.Abp.AspNetCore.Components.WebAssembly.Theming.PageToolbars
{
public class SimplePageToolbarContributor : IPageToolbarContributor
{
public Type ComponentType { get; }
public Dictionary<string, object> Arguments { get; set; }
public int Order { get; }
public string RequiredPolicyName { get; }
public SimplePageToolbarContributor(
Type componentType,
Dictionary<string, object> 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<bool> ShouldAddComponentAsync(PageToolbarContributionContext context)
{
if (RequiredPolicyName != null)
{
var authorizationService = context.ServiceProvider.GetRequiredService<IAuthorizationService>();
if (!await authorizationService.IsGrantedAsync(RequiredPolicyName))
{
return false;
}
}
return true;
}
}
}

7
framework/src/Volo.Abp.BlazoriseUI/AbpCrudPageBase.cs

@ -10,6 +10,7 @@ using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Components;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Localization;
using Microsoft.Extensions.Options;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services;
using Volo.Abp.AspNetCore.Components;
@ -206,6 +207,7 @@ namespace Volo.Abp.BlazoriseUI
protected override async Task OnInitializedAsync()
{
await SetToolbarItemsAsync();
await SetEntityActionsAsync();
await SetTableColumnsAsync();
await SetBreadcrumbItemsAsync();
@ -462,5 +464,10 @@ namespace Volo.Abp.BlazoriseUI
{
return ValueTask.CompletedTask;
}
protected virtual ValueTask SetToolbarItemsAsync()
{
return ValueTask.CompletedTask;
}
}
}

7
framework/src/Volo.Abp.BlazoriseUI/Components/ToolbarButton.razor

@ -0,0 +1,7 @@
<Button Color="@Color" Clicked="@Clicked" Disabled="@Disabled">
@if (Icon != null)
{
<Icon Name="IconName.Add" Class="mr-1"></Icon>
}
@Text
</Button>

25
framework/src/Volo.Abp.BlazoriseUI/Components/ToolbarButton.razor.cs

@ -0,0 +1,25 @@
using Blazorise;
using Microsoft.AspNetCore.Components;
using System;
using System.Threading.Tasks;
namespace Volo.Abp.BlazoriseUI.Components
{
public partial class ToolbarButton : ComponentBase
{
[Parameter]
public Color Color { get; set; }
[Parameter]
public object Icon { get; set; }
[Parameter]
public string Text { get; set; }
[Parameter]
public Func<Task> Clicked { get; set; }
[Parameter]
public bool Disabled { get; set; }
}
}
Loading…
Cancel
Save