Browse Source

Merge pull request #5890 from abpframework/blazor-ui-entit-actions-component

Blazor UI Entity actions component
pull/6014/head
Halil İbrahim Kalkan 6 years ago
committed by GitHub
parent
commit
9fa389b75b
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 8
      framework/src/Volo.Abp.BlazoriseUI/AbpCrudPageBase.cs
  2. 8
      framework/src/Volo.Abp.BlazoriseUI/Components/ActionType.cs
  3. 30
      framework/src/Volo.Abp.BlazoriseUI/Components/DataGridEntityActionsColumn.cs
  4. 21
      framework/src/Volo.Abp.BlazoriseUI/Components/EntityAction.razor
  5. 75
      framework/src/Volo.Abp.BlazoriseUI/Components/EntityAction.razor.cs
  6. 30
      framework/src/Volo.Abp.BlazoriseUI/Components/EntityActions.razor
  7. 49
      framework/src/Volo.Abp.BlazoriseUI/Components/EntityActions.razor.cs
  8. 117
      modules/identity/src/Volo.Abp.Identity.Blazor/Pages/Identity/RoleManagement.razor
  9. 16
      modules/identity/src/Volo.Abp.Identity.Blazor/Pages/Identity/RoleManagement.razor.cs
  10. 62
      modules/identity/src/Volo.Abp.Identity.Blazor/Pages/Identity/UserManagement.razor
  11. 21
      modules/identity/src/Volo.Abp.Identity.Blazor/Pages/Identity/UserManagement.razor.cs
  12. 1
      modules/identity/src/Volo.Abp.Identity.Blazor/_Imports.razor
  13. 81
      modules/tenant-management/src/Volo.Abp.TenantManagement.Blazor/Pages/TenantManagement/TenantManagement.razor
  14. 39
      modules/tenant-management/src/Volo.Abp.TenantManagement.Blazor/Pages/TenantManagement/TenantManagement.razor.cs
  15. 1
      modules/tenant-management/src/Volo.Abp.TenantManagement.Blazor/_Imports.razor

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

@ -15,6 +15,7 @@ using Volo.Abp.Application.Services;
using Volo.Abp.AspNetCore.Components; using Volo.Abp.AspNetCore.Components;
using Volo.Abp.AspNetCore.Components.WebAssembly; using Volo.Abp.AspNetCore.Components.WebAssembly;
using Volo.Abp.Authorization; using Volo.Abp.Authorization;
using Volo.Abp.BlazoriseUI.Components;
using Volo.Abp.ObjectMapping; using Volo.Abp.ObjectMapping;
namespace Volo.Abp.BlazoriseUI namespace Volo.Abp.BlazoriseUI
@ -170,7 +171,6 @@ namespace Volo.Abp.BlazoriseUI
where TUpdateViewModel : class, new() where TUpdateViewModel : class, new()
{ {
[Inject] protected TAppService AppService { get; set; } [Inject] protected TAppService AppService { get; set; }
[Inject] protected IUiMessageService UiMessageService { get; set; }
[Inject] protected IStringLocalizer<AbpUiResource> UiLocalizer { get; set; } [Inject] protected IStringLocalizer<AbpUiResource> UiLocalizer { get; set; }
[Inject] protected IAuthorizationService AuthorizationService { get; set; } [Inject] protected IAuthorizationService AuthorizationService { get; set; }
@ -189,6 +189,7 @@ namespace Volo.Abp.BlazoriseUI
protected Validations CreateValidationsRef; protected Validations CreateValidationsRef;
protected Validations EditValidationsRef; protected Validations EditValidationsRef;
protected List<BreadcrumbItem> BreadcrumbItems = new List<BreadcrumbItem>(2); protected List<BreadcrumbItem> BreadcrumbItems = new List<BreadcrumbItem>(2);
protected DataGridEntityActionsColumn<TListViewModel> EntityActionsColumn;
protected string CreatePolicyName { get; set; } protected string CreatePolicyName { get; set; }
protected string UpdatePolicyName { get; set; } protected string UpdatePolicyName { get; set; }
@ -405,11 +406,6 @@ namespace Volo.Abp.BlazoriseUI
{ {
await CheckDeletePolicyAsync(); await CheckDeletePolicyAsync();
if (!await UiMessageService.ConfirmAsync(GetDeleteConfirmationMessage(entity)))
{
return;
}
await AppService.DeleteAsync(entity.Id); await AppService.DeleteAsync(entity.Id);
await GetEntitiesAsync(); await GetEntitiesAsync();
} }

8
framework/src/Volo.Abp.BlazoriseUI/Components/ActionType.cs

@ -0,0 +1,8 @@
namespace Volo.Abp.BlazoriseUI.Components
{
public enum ActionType
{
Dropdown,
Button
}
}

30
framework/src/Volo.Abp.BlazoriseUI/Components/DataGridEntityActionsColumn.cs

@ -0,0 +1,30 @@
using System.Linq;
using System.Threading.Tasks;
using Blazorise.DataGrid;
using Localization.Resources.AbpUi;
using Microsoft.AspNetCore.Components;
using Microsoft.Extensions.Localization;
namespace Volo.Abp.BlazoriseUI.Components
{
public class DataGridEntityActionsColumn<TItem> : DataGridColumn<TItem>
{
[Inject]
public IStringLocalizer<AbpUiResource> UiLocalizer { get; set; }
protected override async Task OnInitializedAsync()
{
await base.OnInitializedAsync();
await SetDefaultValuesAsync();
}
protected virtual ValueTask SetDefaultValuesAsync()
{
Caption = UiLocalizer["Actions"];
Width = "150px";
Sortable = false;
Field = typeof(TItem).GetProperties().First().Name;
return ValueTask.CompletedTask;
}
}
}

21
framework/src/Volo.Abp.BlazoriseUI/Components/EntityAction.razor

@ -0,0 +1,21 @@
@typeparam TItem
@using Blazorise
@if (ParentActions.Type == ActionType.Dropdown)
{
if (IsVisible && Primary == false)
{
<DropdownItem Clicked="@ActionClickedAsync">@Text</DropdownItem>
}
}
else
{
if (IsVisible)
{
<Blazorise.Button Block="true"
Color="@Color"
Clicked="@ActionClickedAsync">
@Text
</Blazorise.Button>
}
}

75
framework/src/Volo.Abp.BlazoriseUI/Components/EntityAction.razor.cs

@ -0,0 +1,75 @@
using System;
using System.Threading.Tasks;
using Blazorise;
using Localization.Resources.AbpUi;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Components;
using Microsoft.Extensions.Localization;
using Volo.Abp.AspNetCore.Components.WebAssembly;
namespace Volo.Abp.BlazoriseUI.Components
{
public partial class EntityAction<TItem> : ComponentBase
{
internal bool IsVisible = true;
[Parameter]
public string Text { get; set; }
[Parameter]
public bool Primary { get; set; }
[Parameter]
public EventCallback Clicked { get; set; }
[Parameter]
public string RequiredPolicy { get; set; }
[Parameter]
public Color Color { get; set; }
[Parameter]
public Func<string> ConfirmationMessage { get; set; }
[CascadingParameter]
public EntityActions<TItem> ParentActions { get; set; }
[Inject]
protected IAuthorizationService AuthorizationService { get; set; }
[Inject]
protected IUiMessageService UiMessageService { get; set; }
protected async override Task OnInitializedAsync()
{
await base.OnInitializedAsync();
await SetDefaultValuesAsync();
if (!RequiredPolicy.IsNullOrEmpty())
{
IsVisible = await AuthorizationService.IsGrantedAsync(RequiredPolicy);
}
ParentActions.AddAction(this);
}
protected internal virtual async Task ActionClickedAsync()
{
if (ConfirmationMessage != null)
{
if (await UiMessageService.ConfirmAsync(ConfirmationMessage()))
{
await Clicked.InvokeAsync();
}
}
else
{
await Clicked.InvokeAsync();
}
}
protected virtual ValueTask SetDefaultValuesAsync()
{
Color = Color.Primary;
return ValueTask.CompletedTask;
}
}
}

30
framework/src/Volo.Abp.BlazoriseUI/Components/EntityActions.razor

@ -0,0 +1,30 @@
@typeparam TItem
<CascadingValue Value="this">
@if (Type == ActionType.Dropdown)
{
<Dropdown>
@if (HasPrimaryAction)
{
<Blazorise.Button Block="true"
Color="@PrimaryAction.Color"
Clicked="async ()=> await PrimaryAction.ActionClickedAsync()">
@PrimaryAction.Text
</Blazorise.Button>
<DropdownToggle Color="@ToggleColor" Split="true" />
}
else
{
<DropdownToggle Color="@ToggleColor">
@ToggleText
</DropdownToggle>
}
<DropdownMenu>
@ChildContent
</DropdownMenu>
</Dropdown>
}
else
{
@ChildContent
}
</CascadingValue>

49
framework/src/Volo.Abp.BlazoriseUI/Components/EntityActions.razor.cs

@ -0,0 +1,49 @@
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Blazorise;
using Localization.Resources.AbpUi;
using Microsoft.AspNetCore.Components;
using Microsoft.Extensions.Localization;
namespace Volo.Abp.BlazoriseUI.Components
{
public partial class EntityActions<TItem> : ComponentBase
{
protected readonly List<EntityAction<TItem>> Actions = new List<EntityAction<TItem>>();
protected bool HasPrimaryAction => Actions.Any(t => t.Primary);
protected EntityAction<TItem> PrimaryAction => Actions.FirstOrDefault(t => t.Primary);
protected internal ActionType Type => Actions.Count(t => t.IsVisible) > 1 ? ActionType.Dropdown : ActionType.Button;
[Parameter]
public Color ToggleColor { get; set; } = Color.Primary;
[Parameter]
public string ToggleText { get; set; }
[Parameter]
public RenderFragment ChildContent { get; set; }
[Parameter]
public DataGridEntityActionsColumn<TItem> EntityActionsColumn { get; set; }
[Inject]
public IStringLocalizer<AbpUiResource> UiLocalizer { get; set; }
internal void AddAction(EntityAction<TItem> action)
{
Actions.Add(action);
if (EntityActionsColumn != null)
{
EntityActionsColumn.Displayable = Actions.Any(t => t.IsVisible);
}
StateHasChanged();
}
protected override void OnInitialized()
{
base.OnInitialized();
ToggleText = UiLocalizer["Actions"];
}
}
}

117
modules/identity/src/Volo.Abp.Identity.Blazor/Pages/Identity/RoleManagement.razor

@ -1,5 +1,5 @@
@page "/identity/roles" @page "/identity/roles"
@attribute [Authorize( IdentityPermissions.Roles.Default )] @attribute [Authorize(IdentityPermissions.Roles.Default)]
@using Volo.Abp.Identity @using Volo.Abp.Identity
@using Microsoft.AspNetCore.Authorization @using Microsoft.AspNetCore.Authorization
@using Microsoft.Extensions.Localization @using Microsoft.Extensions.Localization
@ -14,7 +14,7 @@
<Heading Size="HeadingSize.Is1">@L["Roles"]</Heading> <Heading Size="HeadingSize.Is1">@L["Roles"]</Heading>
</Column> </Column>
<Column ColumnSize="ColumnSize.Is6"> <Column ColumnSize="ColumnSize.Is6">
@if ( HasCreatePermission ) @if (HasCreatePermission)
{ {
<Paragraph Alignment="TextAlignment.Right"> <Paragraph Alignment="TextAlignment.Right">
<Button Color="Color.Primary" Clicked="OpenCreateModalAsync">@L["NewRole"]</Button> <Button Color="Color.Primary" Clicked="OpenCreateModalAsync">@L["NewRole"]</Button>
@ -31,40 +31,33 @@
ShowPager="true" ShowPager="true"
PageSize="PageSize"> PageSize="PageSize">
<DataGridColumns> <DataGridColumns>
@if ( ShouldShowEntityActions ) <DataGridEntityActionsColumn TItem="IdentityRoleDto" @ref="@EntityActionsColumn">
{ <DisplayTemplate>
<DataGridColumn Width="150px" TItem="IdentityRoleDto" Field="@nameof(IdentityRoleDto.Name)" Sortable="false" Caption="@L["Actions"].Value"> <EntityActions TItem="IdentityRoleDto" EntityActionsColumn="@EntityActionsColumn">
<DisplayTemplate> <EntityAction TItem="IdentityRoleDto"
<Dropdown> RequiredPolicy="@UpdatePolicyName"
<DropdownToggle Color="Color.Primary"> Clicked="() => OpenEditModalAsync(context.Id)"
@L["Actions"] Text="@L["Edit"]"></EntityAction>
</DropdownToggle> <EntityAction TItem="IdentityRoleDto"
<DropdownMenu> RequiredPolicy="@ManagePermissionsPolicyName"
@if ( HasUpdatePermission ) Clicked="() => PermissionManagementModal.OpenAsync(PermissionProviderName, context.Name)"
{ Text="@L["Permissions"]"></EntityAction>
<DropdownItem Clicked="() => OpenEditModalAsync(context.As<IdentityRoleDto>().Id)">@L["Edit"]</DropdownItem> <EntityAction TItem="IdentityRoleDto"
} RequiredPolicy="@DeletePolicyName"
@if ( HasManagePermissionsPermission ) Clicked="() => DeleteEntityAsync(context)"
{ ConfirmationMessage="()=> GetDeleteConfirmationMessage(context)"
<DropdownItem Clicked="() => PermissionManagementModal.OpenAsync(PermissionProviderName, context.As<IdentityRoleDto>().Name)">@L["Permissions"]</DropdownItem> Text="@L["Delete"]"></EntityAction>
} </EntityActions>
@if ( HasDeletePermission ) </DisplayTemplate>
{ </DataGridEntityActionsColumn>
<DropdownItem Clicked="() => DeleteEntityAsync(context.As<IdentityRoleDto>())">@L["Delete"]</DropdownItem>
}
</DropdownMenu>
</Dropdown>
</DisplayTemplate>
</DataGridColumn>
}
<DataGridColumn TItem="IdentityRoleDto" Field="@nameof(IdentityRoleDto.Name)" Caption="@L["RoleName"].Value"> <DataGridColumn TItem="IdentityRoleDto" Field="@nameof(IdentityRoleDto.Name)" Caption="@L["RoleName"].Value">
<DisplayTemplate> <DisplayTemplate>
@(context.As<IdentityRoleDto>().Name) @(context.Name)
@if ( context.As<IdentityRoleDto>().IsDefault ) @if (context.IsDefault)
{ {
<Badge Color="Color.Primary">@L["DisplayName:IsDefault"]</Badge> <Badge Color="Color.Primary">@L["DisplayName:IsDefault"]</Badge>
} }
@if ( context.As<IdentityRoleDto>().IsPublic ) @if (context.IsPublic)
{ {
<Badge Color="Color.Light">@L["DisplayName:IsPublic"]</Badge> <Badge Color="Color.Light">@L["DisplayName:IsPublic"]</Badge>
} }
@ -74,42 +67,42 @@
</DataGrid> </DataGrid>
@* ************************* CREATE MODAL ************************* *@ @* ************************* CREATE MODAL ************************* *@
@if ( HasCreatePermission ) @if (HasCreatePermission)
{ {
<Modal @ref="CreateModal"> <Modal @ref="CreateModal">
<ModalBackdrop /> <ModalBackdrop />
<ModalContent Centered="true"> <ModalContent Centered="true">
<ModalHeader> <ModalHeader>
<ModalTitle>@L["NewRole"]</ModalTitle> <ModalTitle>@L["NewRole"]</ModalTitle>
<CloseButton Clicked="CloseCreateModalAsync" /> <CloseButton Clicked="CloseCreateModalAsync" />
</ModalHeader> </ModalHeader>
<ModalBody> <ModalBody>
<Validations @ref="@CreateValidationsRef" Model="@NewEntity" ValidateOnLoad="false"> <Validations @ref="@CreateValidationsRef" Model="@NewEntity" ValidateOnLoad="false">
<Validation MessageLocalizer="@LH.Localize"> <Validation MessageLocalizer="@LH.Localize">
<Field>
<FieldLabel>@L["DisplayName:RoleName"]</FieldLabel>
<TextEdit @bind-Text="@NewEntity.Name">
<Feedback>
<ValidationError />
</Feedback>
</TextEdit>
</Field>
</Validation>
<Field> <Field>
<Check TValue="bool" @bind-Checked="@NewEntity.IsDefault">@L["DisplayName:IsDefault"]</Check> <FieldLabel>@L["DisplayName:RoleName"]</FieldLabel>
<Check TValue="bool" @bind-Checked="@NewEntity.IsPublic">@L["DisplayName:IsPublic"]</Check> <TextEdit @bind-Text="@NewEntity.Name">
<Feedback>
<ValidationError />
</Feedback>
</TextEdit>
</Field> </Field>
</Validations> </Validation>
</ModalBody> <Field>
<ModalFooter> <Check TValue="bool" @bind-Checked="@NewEntity.IsDefault">@L["DisplayName:IsDefault"]</Check>
<Button Color="Color.Secondary" Clicked="CloseCreateModalAsync">@L["Cancel"]</Button> <Check TValue="bool" @bind-Checked="@NewEntity.IsPublic">@L["DisplayName:IsPublic"]</Check>
<Button Color="Color.Primary" Clicked="CreateEntityAsync">@L["Save"]</Button> </Field>
</ModalFooter> </Validations>
</ModalContent> </ModalBody>
</Modal> <ModalFooter>
<Button Color="Color.Secondary" Clicked="CloseCreateModalAsync">@L["Cancel"]</Button>
<Button Color="Color.Primary" Clicked="CreateEntityAsync">@L["Save"]</Button>
</ModalFooter>
</ModalContent>
</Modal>
} }
@* ************************* EDIT MODAL ************************* *@ @* ************************* EDIT MODAL ************************* *@
@if ( HasUpdatePermission ) @if (HasUpdatePermission)
{ {
<Modal @ref="EditModal"> <Modal @ref="EditModal">
<ModalBackdrop /> <ModalBackdrop />

16
modules/identity/src/Volo.Abp.Identity.Blazor/Pages/Identity/RoleManagement.razor.cs

@ -13,11 +13,10 @@ namespace Volo.Abp.Identity.Blazor.Pages.Identity
protected const string PermissionProviderName = "R"; protected const string PermissionProviderName = "R";
protected PermissionManagementModal PermissionManagementModal; protected PermissionManagementModal PermissionManagementModal;
protected string ManagePermissionsPolicyName;
protected bool HasManagePermissionsPermission { get; set; } protected bool HasManagePermissionsPermission { get; set; }
protected bool ShouldShowEntityActions { get; set; }
public RoleManagementBase() public RoleManagementBase()
{ {
ObjectMapperContext = typeof(AbpIdentityBlazorModule); ObjectMapperContext = typeof(AbpIdentityBlazorModule);
@ -26,19 +25,12 @@ namespace Volo.Abp.Identity.Blazor.Pages.Identity
CreatePolicyName = IdentityPermissions.Roles.Create; CreatePolicyName = IdentityPermissions.Roles.Create;
UpdatePolicyName = IdentityPermissions.Roles.Update; UpdatePolicyName = IdentityPermissions.Roles.Update;
DeletePolicyName = IdentityPermissions.Roles.Delete; DeletePolicyName = IdentityPermissions.Roles.Delete;
ManagePermissionsPolicyName = IdentityPermissions.Roles.ManagePermissions;
} }
protected async override Task SetPermissionsAsync() protected override string GetDeleteConfirmationMessage(IdentityRoleDto entity)
{ {
await base.SetPermissionsAsync(); return string.Format(L["RoleDeletionConfirmationMessage"], entity.Name);
HasManagePermissionsPermission = await AuthorizationService.IsGrantedAsync(
IdentityPermissions.Roles.ManagePermissions
);
ShouldShowEntityActions = HasUpdatePermission ||
HasDeletePermission ||
HasManagePermissionsPermission;
} }
} }
} }

62
modules/identity/src/Volo.Abp.Identity.Blazor/Pages/Identity/UserManagement.razor

@ -1,5 +1,5 @@
@page "/identity/users" @page "/identity/users"
@attribute [Authorize( IdentityPermissions.Users.Default )] @attribute [Authorize(IdentityPermissions.Users.Default)]
@using Microsoft.AspNetCore.Authorization @using Microsoft.AspNetCore.Authorization
@using Microsoft.Extensions.Localization @using Microsoft.Extensions.Localization
@using Volo.Abp.Identity.Localization @using Volo.Abp.Identity.Localization
@ -13,7 +13,7 @@
<h1>@L["Users"]</h1> <h1>@L["Users"]</h1>
</Column> </Column>
<Column ColumnSize="ColumnSize.Is6"> <Column ColumnSize="ColumnSize.Is6">
@if ( HasCreatePermission ) @if (HasCreatePermission)
{ {
<Paragraph Alignment="TextAlignment.Right"> <Paragraph Alignment="TextAlignment.Right">
<Button Color="Color.Primary" Clicked="OpenCreateModalAsync">@L["NewUser"]</Button> <Button Color="Color.Primary" Clicked="OpenCreateModalAsync">@L["NewUser"]</Button>
@ -30,33 +30,25 @@
ShowPager="true" ShowPager="true"
PageSize="PageSize"> PageSize="PageSize">
<DataGridColumns> <DataGridColumns>
@if ( ShouldShowEntityActions ) <DataGridEntityActionsColumn TItem="IdentityUserDto" @ref="@EntityActionsColumn">
{ <DisplayTemplate>
<DataGridColumn Width="150px" TItem="IdentityUserDto" Field="@nameof(IdentityUserDto.UserName)" Sortable="false" Caption="@L["Actions"].Value"> <EntityActions TItem="IdentityUserDto" EntityActionsColumn="@EntityActionsColumn">
<DisplayTemplate> <EntityAction TItem="IdentityUserDto"
<Dropdown> RequiredPolicy="@UpdatePolicyName"
<DropdownToggle Color="Color.Primary"> Clicked="() => OpenEditModalAsync(context.Id)"
@L["Actions"] Text="@L["Edit"]" />
</DropdownToggle> <EntityAction TItem="IdentityUserDto"
<DropdownMenu> RequiredPolicy="@ManagePermissionsPolicyName"
@if ( HasUpdatePermission ) Clicked="() => PermissionManagementModal.OpenAsync(PermissionProviderName, context.Id.ToString())"
{ Text="@L["Permissions"]" />
<DropdownItem Clicked="() => OpenEditModalAsync(context.As<IdentityUserDto>().Id)">@L["Edit"]</DropdownItem> <EntityAction TItem="IdentityUserDto"
} RequiredPolicy="@DeletePolicyName"
@if ( HasManagePermissionsPermission ) Clicked="() => DeleteEntityAsync(context)"
{ ConfirmationMessage="()=>GetDeleteConfirmationMessage(context)"
<DropdownItem Clicked="() => PermissionManagementModal.OpenAsync(PermissionProviderName, context.As<IdentityUserDto>().Id.ToString())">@L["Permissions"]</DropdownItem> Text="@L["Delete"]" />
} </EntityActions>
@if ( HasDeletePermission ) </DisplayTemplate>
{ </DataGridEntityActionsColumn>
<DropdownDivider />
<DropdownItem Clicked="() => DeleteEntityAsync(context.As<IdentityUserDto>())">@L["Delete"]</DropdownItem>
}
</DropdownMenu>
</Dropdown>
</DisplayTemplate>
</DataGridColumn>
}
<DataGridColumn TItem="IdentityUserDto" Field="@nameof(IdentityUserDto.UserName)" Caption="@L["UserName"].Value"> <DataGridColumn TItem="IdentityUserDto" Field="@nameof(IdentityUserDto.UserName)" Caption="@L["UserName"].Value">
<DisplayTemplate> <DisplayTemplate>
@(context.As<IdentityUserDto>().UserName) @(context.As<IdentityUserDto>().UserName)
@ -76,7 +68,7 @@
</DataGrid> </DataGrid>
@* ************************* CREATE MODAL ************************* *@ @* ************************* CREATE MODAL ************************* *@
@if ( HasCreatePermission ) @if (HasCreatePermission)
{ {
<Modal @ref="CreateModal"> <Modal @ref="CreateModal">
<ModalBackdrop /> <ModalBackdrop />
@ -159,9 +151,9 @@
</Field> </Field>
</TabPanel> </TabPanel>
<TabPanel Name="Roles"> <TabPanel Name="Roles">
@if ( NewUserRoles != null ) @if (NewUserRoles != null)
{ {
@foreach ( var role in NewUserRoles ) @foreach (var role in NewUserRoles)
{ {
<Field> <Field>
<input type="hidden" @bind-value="@role.Name" /> <input type="hidden" @bind-value="@role.Name" />
@ -183,7 +175,7 @@
} }
@* ************************* EDIT MODAL ************************* *@ @* ************************* EDIT MODAL ************************* *@
@if ( HasUpdatePermission ) @if (HasUpdatePermission)
{ {
<Modal @ref="EditModal"> <Modal @ref="EditModal">
<ModalBackdrop /> <ModalBackdrop />
@ -268,9 +260,9 @@
</Field> </Field>
</TabPanel> </TabPanel>
<TabPanel Name="Roles"> <TabPanel Name="Roles">
@if ( EditUserRoles != null ) @if (EditUserRoles != null)
{ {
@foreach ( var role in EditUserRoles ) @foreach (var role in EditUserRoles)
{ {
<Field> <Field>
<input type="hidden" @bind-value="@role.Name" /> <input type="hidden" @bind-value="@role.Name" />

21
modules/identity/src/Volo.Abp.Identity.Blazor/Pages/Identity/UserManagement.razor.cs

@ -24,8 +24,7 @@ namespace Volo.Abp.Identity.Blazor.Pages.Identity
protected AssignedRoleViewModel[] EditUserRoles; protected AssignedRoleViewModel[] EditUserRoles;
protected bool ShouldShowEntityActions { get; set; } protected string ManagePermissionsPolicyName;
protected bool HasManagePermissionsPermission { get; set; }
protected string CreateModalSelectedTab = DefaultSelectedTab; protected string CreateModalSelectedTab = DefaultSelectedTab;
@ -39,6 +38,7 @@ namespace Volo.Abp.Identity.Blazor.Pages.Identity
CreatePolicyName = IdentityPermissions.Users.Create; CreatePolicyName = IdentityPermissions.Users.Create;
UpdatePolicyName = IdentityPermissions.Users.Update; UpdatePolicyName = IdentityPermissions.Users.Update;
DeletePolicyName = IdentityPermissions.Users.Delete; DeletePolicyName = IdentityPermissions.Users.Delete;
ManagePermissionsPolicyName = IdentityPermissions.Users.ManagePermissions;
} }
protected async override Task OnInitializedAsync() protected async override Task OnInitializedAsync()
@ -48,18 +48,6 @@ namespace Volo.Abp.Identity.Blazor.Pages.Identity
Roles = (await AppService.GetAssignableRolesAsync()).Items; Roles = (await AppService.GetAssignableRolesAsync()).Items;
} }
protected async override Task SetPermissionsAsync()
{
await base.SetPermissionsAsync();
HasManagePermissionsPermission = await AuthorizationService.IsGrantedAsync(
IdentityPermissions.Users.ManagePermissions
);
ShouldShowEntityActions = HasUpdatePermission ||
HasDeletePermission ||
HasManagePermissionsPermission;
}
protected override Task OpenCreateModalAsync() protected override Task OpenCreateModalAsync()
{ {
@ -104,6 +92,11 @@ namespace Volo.Abp.Identity.Blazor.Pages.Identity
return base.OnUpdatingEntityAsync(); return base.OnUpdatingEntityAsync();
} }
protected override string GetDeleteConfirmationMessage(IdentityUserDto entity)
{
return string.Format(L["UserDeletionConfirmationMessage"], entity.UserName);
}
} }
public class AssignedRoleViewModel public class AssignedRoleViewModel

1
modules/identity/src/Volo.Abp.Identity.Blazor/_Imports.razor

@ -2,5 +2,6 @@
@using Volo.Abp.AspNetCore.Components.WebAssembly @using Volo.Abp.AspNetCore.Components.WebAssembly
@using Microsoft.AspNetCore.Components.Forms @using Microsoft.AspNetCore.Components.Forms
@using Volo.Abp.BlazoriseUI @using Volo.Abp.BlazoriseUI
@using Volo.Abp.BlazoriseUI.Components
@using Blazorise @using Blazorise
@using Blazorise.DataGrid @using Blazorise.DataGrid

81
modules/tenant-management/src/Volo.Abp.TenantManagement.Blazor/Pages/TenantManagement/TenantManagement.razor

@ -6,7 +6,6 @@
@using Volo.Abp.FeatureManagement.Blazor.Components @using Volo.Abp.FeatureManagement.Blazor.Components
@inherits TenantManagementBase @inherits TenantManagementBase
@inject IStringLocalizer<AbpTenantManagementResource> L @inject IStringLocalizer<AbpTenantManagementResource> L
@* ************************* PAGE HEADER ************************* *@ @* ************************* PAGE HEADER ************************* *@
<Row> <Row>
<Column ColumnSize="ColumnSize.Is6"> <Column ColumnSize="ColumnSize.Is6">
@ -30,40 +29,32 @@
ShowPager="true" ShowPager="true"
PageSize="PageSize"> PageSize="PageSize">
<DataGridColumns> <DataGridColumns>
@if (ShouldShowEntityActions) <DataGridEntityActionsColumn TItem="TenantDto" @ref="@EntityActionsColumn">
{ <DisplayTemplate>
<DataGridColumn Width="150px" TItem="TenantDto" Field="@nameof(TenantDto.Name)" Sortable="false" Caption="@L["Actions"].Value"> <EntityActions TItem="TenantDto" EntityActionsColumn="@EntityActionsColumn">
<DisplayTemplate> <EntityAction TItem="TenantDto"
<Dropdown> RequiredPolicy="@UpdatePolicyName"
<DropdownToggle Color="Color.Primary"> Clicked="() => OpenEditModalAsync(context.Id)"
@L["Actions"] Text="@L["Edit"]"></EntityAction>
</DropdownToggle> <EntityAction TItem="TenantDto"
<DropdownMenu> RequiredPolicy="@ManageConnectionStringsPolicyName"
@if (HasUpdatePermission) Clicked="() => OpenEditConnectionStringModalAsync(context.Id)"
{ Text="@L["ConnectionStrings"]"></EntityAction>
<DropdownItem Clicked="() => OpenEditModalAsync(context.As<TenantDto>().Id)">@L["Edit"]</DropdownItem> <EntityAction TItem="TenantDto"
} RequiredPolicy="@ManageFeaturesPolicyName"
@if (HasManageConnectionStringsPermission) Clicked="() => FeatureManagementModal.OpenAsync(FeatureProviderName, context.Id.ToString())"
{ Text="@L["Features"]"></EntityAction>
<DropdownItem Clicked="() => OpenEditConnectionStringModalAsync(context.As<TenantDto>().Id)">@L["ConnectionStrings"]</DropdownItem> <EntityAction TItem="TenantDto"
} RequiredPolicy="@DeletePolicyName"
@if (HasManageFeaturesPermission) Clicked="() => DeleteEntityAsync(context)"
{ ConfirmationMessage="()=>GetDeleteConfirmationMessage(context)"
<DropdownItem Clicked="() => FeatureManagementModal.OpenAsync(FeatureProviderName, context.As<TenantDto>().Id.ToString())">@L["Features"]</DropdownItem> Text="@L["Delete"]"></EntityAction>
} </EntityActions>
@if (HasDeletePermission) </DisplayTemplate>
{ </DataGridEntityActionsColumn>
<DropdownDivider/>
<DropdownItem Clicked="() => DeleteEntityAsync(context.As<TenantDto>())">@L["Delete"]</DropdownItem>
}
</DropdownMenu>
</Dropdown>
</DisplayTemplate>
</DataGridColumn>
}
<DataGridColumn TItem="TenantDto" Field="@nameof(TenantDto.Name)" Caption="@L["TenantName"].Value"> <DataGridColumn TItem="TenantDto" Field="@nameof(TenantDto.Name)" Caption="@L["TenantName"].Value">
<DisplayTemplate> <DisplayTemplate>
@(context.As<TenantDto>().Name) @(context.Name)
</DisplayTemplate> </DisplayTemplate>
</DataGridColumn> </DataGridColumn>
</DataGridColumns> </DataGridColumns>
@ -73,25 +64,25 @@
@if (HasCreatePermission) @if (HasCreatePermission)
{ {
<Modal @ref="CreateModal"> <Modal @ref="CreateModal">
<ModalBackdrop/> <ModalBackdrop />
<ModalContent IsCentered="true"> <ModalContent IsCentered="true">
<ModalHeader> <ModalHeader>
<ModalTitle>@L["NewTenant"]</ModalTitle> <ModalTitle>@L["NewTenant"]</ModalTitle>
<CloseButton Clicked="CloseCreateModalAsync"/> <CloseButton Clicked="CloseCreateModalAsync" />
</ModalHeader> </ModalHeader>
<ModalBody> <ModalBody>
<EditForm id="TenantCreateForm" Model="@NewEntity" OnValidSubmit="CreateEntityAsync"> <EditForm id="TenantCreateForm" Model="@NewEntity" OnValidSubmit="CreateEntityAsync">
<Field> <Field>
<FieldLabel>@L["TenantName"]</FieldLabel> <FieldLabel>@L["TenantName"]</FieldLabel>
<TextEdit @bind-text="@NewEntity.Name"/> <TextEdit @bind-text="@NewEntity.Name" />
</Field> </Field>
<Field> <Field>
<FieldLabel>@L["DisplayName:AdminEmailAddress"]</FieldLabel> <FieldLabel>@L["DisplayName:AdminEmailAddress"]</FieldLabel>
<TextEdit Role="@TextRole.Email" @bind-text="@NewEntity.AdminEmailAddress"/> <TextEdit Role="@TextRole.Email" @bind-text="@NewEntity.AdminEmailAddress" />
</Field> </Field>
<Field> <Field>
<FieldLabel>@L["DisplayName:AdminPassword"]</FieldLabel> <FieldLabel>@L["DisplayName:AdminPassword"]</FieldLabel>
<TextEdit Role="@TextRole.Password" @bind-text="@NewEntity.AdminPassword"/> <TextEdit Role="@TextRole.Password" @bind-text="@NewEntity.AdminPassword" />
</Field> </Field>
</EditForm> </EditForm>
</ModalBody> </ModalBody>
@ -107,17 +98,17 @@
@if (HasUpdatePermission) @if (HasUpdatePermission)
{ {
<Modal @ref="EditModal"> <Modal @ref="EditModal">
<ModalBackdrop/> <ModalBackdrop />
<ModalContent IsCentered="true"> <ModalContent IsCentered="true">
<ModalHeader> <ModalHeader>
<ModalTitle>@L["Edit"]</ModalTitle> <ModalTitle>@L["Edit"]</ModalTitle>
<CloseButton Clicked="CloseEditModalAsync"/> <CloseButton Clicked="CloseEditModalAsync" />
</ModalHeader> </ModalHeader>
<ModalBody> <ModalBody>
<EditForm id="TenantEditForm" Model="@EditingEntity" OnValidSubmit="UpdateEntityAsync"> <EditForm id="TenantEditForm" Model="@EditingEntity" OnValidSubmit="UpdateEntityAsync">
<Field> <Field>
<FieldLabel>@L["TenantName"]</FieldLabel> <FieldLabel>@L["TenantName"]</FieldLabel>
<TextEdit @bind-text="@EditingEntity.Name"/> <TextEdit @bind-text="@EditingEntity.Name" />
</Field> </Field>
</EditForm> </EditForm>
</ModalBody> </ModalBody>
@ -133,11 +124,11 @@
@if (HasUpdatePermission) @if (HasUpdatePermission)
{ {
<Modal @ref="@ManageConnectionStringModal"> <Modal @ref="@ManageConnectionStringModal">
<ModalBackdrop/> <ModalBackdrop />
<ModalContent IsCentered="true"> <ModalContent IsCentered="true">
<ModalHeader> <ModalHeader>
<ModalTitle>@L["ConnectionStrings"]</ModalTitle> <ModalTitle>@L["ConnectionStrings"]</ModalTitle>
<CloseButton Clicked="CloseEditConnectionStringModal"/> <CloseButton Clicked="CloseEditConnectionStringModal" />
</ModalHeader> </ModalHeader>
<ModalBody> <ModalBody>
<EditForm id="ConnectionStringEditForm" Model="@TenantInfo" OnValidSubmit="UpdateConnectionStringAsync"> <EditForm id="ConnectionStringEditForm" Model="@TenantInfo" OnValidSubmit="UpdateConnectionStringAsync">
@ -149,7 +140,7 @@
{ {
<Field> <Field>
<FieldLabel>@L["DisplayName:DefaultConnectionString"]</FieldLabel> <FieldLabel>@L["DisplayName:DefaultConnectionString"]</FieldLabel>
<TextEdit @bind-text="@TenantInfo.DefaultConnectionString"/> <TextEdit @bind-text="@TenantInfo.DefaultConnectionString" />
</Field> </Field>
} }
</EditForm> </EditForm>
@ -164,5 +155,5 @@
@if (HasManageFeaturesPermission) @if (HasManageFeaturesPermission)
{ {
<FeatureManagementModal @ref="FeatureManagementModal"/> <FeatureManagementModal @ref="FeatureManagementModal" />
} }

39
modules/tenant-management/src/Volo.Abp.TenantManagement.Blazor/Pages/TenantManagement/TenantManagement.razor.cs

@ -11,17 +11,18 @@ namespace Volo.Abp.TenantManagement.Blazor.Pages.TenantManagement
: AbpCrudPageBase<ITenantAppService, TenantDto, Guid, GetTenantsInput, TenantCreateDto, TenantUpdateDto> : AbpCrudPageBase<ITenantAppService, TenantDto, Guid, GetTenantsInput, TenantCreateDto, TenantUpdateDto>
{ {
protected const string FeatureProviderName = "T"; protected const string FeatureProviderName = "T";
protected bool ShouldShowEntityActions;
protected bool HasManageConnectionStringsPermission; protected bool HasManageConnectionStringsPermission;
protected bool HasManageFeaturesPermission; protected bool HasManageFeaturesPermission;
protected string ManageConnectionStringsPolicyName;
protected string ManageFeaturesPolicyName;
protected FeatureManagementModal FeatureManagementModal; protected FeatureManagementModal FeatureManagementModal;
protected Modal ManageConnectionStringModal; protected Modal ManageConnectionStringModal;
protected TenantInfoModel TenantInfo; protected TenantInfoModel TenantInfo;
public TenantManagementBase() public TenantManagementBase()
{ {
ObjectMapperContext = typeof(AbpTenantManagementBlazorModule); ObjectMapperContext = typeof(AbpTenantManagementBlazorModule);
@ -29,7 +30,9 @@ namespace Volo.Abp.TenantManagement.Blazor.Pages.TenantManagement
CreatePolicyName = TenantManagementPermissions.Tenants.Create; CreatePolicyName = TenantManagementPermissions.Tenants.Create;
UpdatePolicyName = TenantManagementPermissions.Tenants.Update; UpdatePolicyName = TenantManagementPermissions.Tenants.Update;
DeletePolicyName = TenantManagementPermissions.Tenants.Delete; DeletePolicyName = TenantManagementPermissions.Tenants.Delete;
ManageConnectionStringsPolicyName = TenantManagementPermissions.Tenants.ManageConnectionStrings;
ManageFeaturesPolicyName = TenantManagementPermissions.Tenants.ManageFeatures;
TenantInfo = new TenantInfoModel(); TenantInfo = new TenantInfoModel();
} }
@ -37,29 +40,24 @@ namespace Volo.Abp.TenantManagement.Blazor.Pages.TenantManagement
{ {
await base.SetPermissionsAsync(); await base.SetPermissionsAsync();
HasManageConnectionStringsPermission = await AuthorizationService.IsGrantedAsync(TenantManagementPermissions.Tenants.ManageConnectionStrings); HasManageConnectionStringsPermission = await AuthorizationService.IsGrantedAsync(ManageConnectionStringsPolicyName);
HasManageFeaturesPermission = await AuthorizationService.IsGrantedAsync(TenantManagementPermissions.Tenants.ManageFeatures); HasManageFeaturesPermission = await AuthorizationService.IsGrantedAsync(ManageFeaturesPolicyName);
ShouldShowEntityActions = HasUpdatePermission ||
HasDeletePermission ||
HasManageConnectionStringsPermission ||
HasManageFeaturesPermission;
} }
protected virtual async Task OpenEditConnectionStringModalAsync(Guid id) protected virtual async Task OpenEditConnectionStringModalAsync(Guid id)
{ {
var tenantConnectionString = await AppService.GetDefaultConnectionStringAsync(id); var tenantConnectionString = await AppService.GetDefaultConnectionStringAsync(id);
TenantInfo = new TenantInfoModel TenantInfo = new TenantInfoModel
{ {
Id = id, Id = id,
DefaultConnectionString = tenantConnectionString, DefaultConnectionString = tenantConnectionString,
UseSharedDatabase = tenantConnectionString.IsNullOrWhiteSpace() UseSharedDatabase = tenantConnectionString.IsNullOrWhiteSpace()
}; };
ManageConnectionStringModal.Show(); ManageConnectionStringModal.Show();
} }
protected virtual Task CloseEditConnectionStringModal() protected virtual Task CloseEditConnectionStringModal()
{ {
ManageConnectionStringModal.Hide(); ManageConnectionStringModal.Hide();
@ -68,7 +66,7 @@ namespace Volo.Abp.TenantManagement.Blazor.Pages.TenantManagement
protected virtual async Task UpdateConnectionStringAsync() protected virtual async Task UpdateConnectionStringAsync()
{ {
await CheckPolicyAsync(TenantManagementPermissions.Tenants.ManageConnectionStrings); await CheckPolicyAsync(ManageConnectionStringsPolicyName);
if (TenantInfo.UseSharedDatabase || TenantInfo.DefaultConnectionString.IsNullOrWhiteSpace()) if (TenantInfo.UseSharedDatabase || TenantInfo.DefaultConnectionString.IsNullOrWhiteSpace())
{ {
@ -78,9 +76,14 @@ namespace Volo.Abp.TenantManagement.Blazor.Pages.TenantManagement
{ {
await AppService.UpdateDefaultConnectionStringAsync(TenantInfo.Id, TenantInfo.DefaultConnectionString); await AppService.UpdateDefaultConnectionStringAsync(TenantInfo.Id, TenantInfo.DefaultConnectionString);
} }
ManageConnectionStringModal.Hide(); ManageConnectionStringModal.Hide();
} }
protected override string GetDeleteConfirmationMessage(TenantDto entity)
{
return string.Format(L["TenantDeletionConfirmationMessage"], entity.Name);
}
} }
public class TenantInfoModel public class TenantInfoModel
@ -88,7 +91,7 @@ namespace Volo.Abp.TenantManagement.Blazor.Pages.TenantManagement
public Guid Id { get; set; } public Guid Id { get; set; }
public bool UseSharedDatabase { get; set; } public bool UseSharedDatabase { get; set; }
public string DefaultConnectionString { get; set; } public string DefaultConnectionString { get; set; }
} }
} }

1
modules/tenant-management/src/Volo.Abp.TenantManagement.Blazor/_Imports.razor

@ -2,5 +2,6 @@
@using Volo.Abp.AspNetCore.Components.WebAssembly @using Volo.Abp.AspNetCore.Components.WebAssembly
@using Microsoft.AspNetCore.Components.Forms @using Microsoft.AspNetCore.Components.Forms
@using Volo.Abp.BlazoriseUI @using Volo.Abp.BlazoriseUI
@using Volo.Abp.BlazoriseUI.Components
@using Blazorise @using Blazorise
@using Blazorise.DataGrid @using Blazorise.DataGrid

Loading…
Cancel
Save