Browse Source

refactored AbpMudCrudPageBase and AbpMudExtensibleDataGrid for clearity

pull/25235/head
İsmail ÇAĞDAŞ 9 months ago
parent
commit
27badaca60
  1. 65
      framework/src/Volo.Abp.MudBlazorUI/AbpMudCrudPageBase.cs
  2. 334
      framework/src/Volo.Abp.MudBlazorUI/Components/AbpMudExtensibleDataGrid.razor
  3. 12
      framework/src/Volo.Abp.MudBlazorUI/Components/AbpMudExtensibleDataGrid.razor.cs
  4. 15
      modules/identity/src/Volo.Abp.Identity.Blazor.MudBlazor/Pages/Identity/RoleManagement.razor
  5. 15
      modules/identity/src/Volo.Abp.Identity.Blazor.MudBlazor/Pages/Identity/UserManagement.razor
  6. 2
      modules/identity/src/Volo.Abp.Identity.Blazor.MudBlazor/Pages/Identity/UserManagement.razor.cs
  7. 9
      modules/tenant-management/src/Volo.Abp.TenantManagement.Blazor.MudBlazor/Pages/TenantManagement/TenantManagement.razor
  8. 1
      modules/tenant-management/src/Volo.Abp.TenantManagement.Blazor/Pages/TenantManagement/TenantManagement.razor

65
framework/src/Volo.Abp.MudBlazorUI/AbpMudCrudPageBase.cs

@ -181,9 +181,7 @@ public abstract class AbpMudCrudPageBase<
protected int CurrentPage = 1;
protected string CurrentSorting = default!;
protected int? TotalCount;
protected TGetListInput GetListInput = new TGetListInput();
protected IReadOnlyList<TListViewModel> Entities = Array.Empty<TListViewModel>();
protected TCreateViewModel NewEntity;
protected TKey EditingEntityId = default!;
protected TUpdateViewModel EditingEntity;
@ -205,6 +203,8 @@ public abstract class AbpMudCrudPageBase<
protected MudDialog? _createDialog;
protected MudDialog? _editDialog;
protected AbpMudExtensibleDataGrid<TListViewModel> _dataGrid = default!;
protected AbpMudCrudPageBase()
{
NewEntity = new TCreateViewModel();
@ -259,21 +259,6 @@ public abstract class AbpMudCrudPageBase<
}
}
protected virtual async Task GetEntitiesAsync()
{
try
{
await UpdateGetListInputAsync();
var result = await AppService.GetListAsync(GetListInput);
Entities = MapToListViewModel(result.Items);
TotalCount = (int?)result.TotalCount;
}
catch (Exception ex)
{
await HandleErrorAsync(ex);
}
}
private IReadOnlyList<TListViewModel> MapToListViewModel(IReadOnlyList<TGetListOutputDto> dtos)
{
if (typeof(TGetListOutputDto) == typeof(TListViewModel))
@ -310,9 +295,12 @@ public abstract class AbpMudCrudPageBase<
CurrentPage = 1;
if (currentPage == 1)
{
await GetEntitiesAsync();
await _dataGrid.ReloadServerDataAsync();
}
else
{
await InvokeAsync(StateHasChanged);
}
await InvokeAsync(StateHasChanged);
}
protected virtual async Task<GridData<TListViewModel>> OnDataGridReadAsync(GridState<TListViewModel> state)
@ -322,14 +310,29 @@ public abstract class AbpMudCrudPageBase<
.JoinAsString(",");
CurrentPage = state.Page + 1;
await GetEntitiesAsync();
await InvokeAsync(StateHasChanged);
try
{
await UpdateGetListInputAsync();
var result = await AppService.GetListAsync(GetListInput);
var items = MapToListViewModel(result.Items);
await InvokeAsync(StateHasChanged);
return new GridData<TListViewModel>
return new GridData<TListViewModel>
{
Items = items,
TotalItems = (int)result.TotalCount
};
}
catch (Exception ex)
{
Items = Entities,
TotalItems = TotalCount ?? 0
};
await HandleErrorAsync(ex);
return new GridData<TListViewModel>
{
Items = Array.Empty<TListViewModel>(),
TotalItems = 0
};
}
}
protected virtual async Task OpenCreateDialogAsync()
@ -450,7 +453,7 @@ public abstract class AbpMudCrudPageBase<
protected virtual async Task OnCreatedEntityAsync()
{
await GetEntitiesAsync();
await _dataGrid.ReloadServerDataAsync();
await CloseCreateDialogAsync();
Snackbar.Add(GetCreateMessage(), Severity.Success);
}
@ -495,7 +498,7 @@ public abstract class AbpMudCrudPageBase<
protected virtual async Task OnUpdatedEntityAsync()
{
await GetEntitiesAsync();
await _dataGrid.ReloadServerDataAsync();
await CloseEditDialogAsync();
Snackbar.Add(GetUpdateMessage(), Severity.Success);
}
@ -534,13 +537,7 @@ public abstract class AbpMudCrudPageBase<
protected virtual async Task OnDeletedEntityAsync()
{
if (Entities.Count == 1 && CurrentPage > 1)
{
CurrentPage -= 1;
}
await GetEntitiesAsync();
await InvokeAsync(StateHasChanged);
await _dataGrid.ReloadServerDataAsync();
Snackbar.Add(GetDeleteMessage(), Severity.Success);
}

334
framework/src/Volo.Abp.MudBlazorUI/Components/AbpMudExtensibleDataGrid.razor

@ -2,283 +2,133 @@
@using MudBlazor
@using Volo.Abp.Data
@if (ServerData is not null)
{
<MudDataGrid T="TItem"
ServerData="@ServerData"
Loading="@Loading"
Dense="true"
Striped="true"
Bordered="false"
Hover="true"
Class="@Class">
<LoadingContent>
<MudProgressCircular Color="Color.Primary" Indeterminate="true" />
</LoadingContent>
<NoRecordsContent>
<MudText Typo="Typo.body1" Class="pa-4" Align="Align.Center">
@UiLocalizer["NoDataAvailableInDatatable"]
</MudText>
</NoRecordsContent>
<Columns>
@if (Columns != null)
<MudDataGrid @ref="_dataGrid" T="TItem" ServerData="@ServerData" Loading="@Loading" Dense="true" Striped="true"
Bordered="false" Hover="true" Class="@Class">
<LoadingContent>
<MudProgressCircular Color="Color.Primary" Indeterminate="true" />
</LoadingContent>
<NoRecordsContent>
<MudText Typo="Typo.body1" Class="pa-4" Align="Align.Center">
@UiLocalizer["NoDataAvailableInDatatable"]
</MudText>
</NoRecordsContent>
<Columns>
@if (Columns != null)
{
@foreach (var column in Columns)
{
@foreach (var column in Columns)
if (column.Actions.Any())
{
if (column.Actions.Any())
{
var entityActionType = column.Actions.Count == 1 ? MudActionType.Button : MudActionType.Dropdown;
<TemplateColumn T="TItem" Title="@column.Title" Sortable="false" CellStyle="@($"width: {ActionColumnWidth}")">
<CellTemplate>
<MudEntityActions Type="entityActionType" TItem="TItem">
@foreach (var action in column.Actions)
var entityActionType = column.Actions.Count == 1 ? MudActionType.Button : MudActionType.Dropdown;
<TemplateColumn T="TItem" Title="@column.Title" Sortable="false" CellStyle="@($"width: {ActionColumnWidth}")">
<CellTemplate>
<MudEntityActions Type="entityActionType" TItem="TItem">
@foreach (var action in column.Actions)
{
if (action.ConfirmationMessage != null)
{
if (action.ConfirmationMessage != null)
{
<MudEntityAction TItem="TItem"
Color="@GetColor(action.Color)"
Icon="@action.Icon"
Clicked="async () => await action.Clicked(context.Item!)"
ConfirmationMessage="() => action.ConfirmationMessage.Invoke(context.Item!)"
Visible="@(action.Visible != null ? action.Visible(context.Item!) : true)"
Text="@action.Text"
Disabled="@action.Disabled">
</MudEntityAction>
}
else
{
<MudEntityAction TItem="TItem"
Clicked="async () => await action.Clicked(context.Item!)"
Color="@GetColor(action.Color)"
Icon="@action.Icon"
Visible="@(action.Visible != null ? action.Visible(context.Item!) : true)"
Text="@action.Text"
Disabled="@action.Disabled">
</MudEntityAction>
}
<MudEntityAction TItem="TItem" Color="@GetColor(action.Color)" Icon="@action.Icon"
Clicked="async () => await action.Clicked(context.Item!)"
ConfirmationMessage="() => action.ConfirmationMessage.Invoke(context.Item!)"
Visible="@(action.Visible != null ? action.Visible(context.Item!) : true)" Text="@action.Text"
Disabled="@action.Disabled">
</MudEntityAction>
}
else
{
<MudEntityAction TItem="TItem" Clicked="async () => await action.Clicked(context.Item!)"
Color="@GetColor(action.Color)" Icon="@action.Icon"
Visible="@(action.Visible != null ? action.Visible(context.Item!) : true)" Text="@action.Text"
Disabled="@action.Disabled">
</MudEntityAction>
}
</MudEntityActions>
}
</MudEntityActions>
</CellTemplate>
</TemplateColumn>
}
else
{
@if (column.Component != null)
{
<TemplateColumn T="TItem" Title="@column.Title" Sortable="@column.Sortable" Hidden="@(!column.Visible)"
CellStyle="@GetColumnStyle(column)">
<CellTemplate>
@RenderCustomTableColumnComponent(column.Component, context.Item!)
</CellTemplate>
</TemplateColumn>
}
else
{
@if (column.Component != null)
{
<TemplateColumn T="TItem" Title="@column.Title" Sortable="@column.Sortable" Hidden="@(!column.Visible)" CellStyle="@GetColumnStyle(column)">
<CellTemplate>
@RenderCustomTableColumnComponent(column.Component, context.Item!)
</CellTemplate>
</TemplateColumn>
}
else
if (!ExtensionPropertiesRegex.IsMatch(column.Data))
{
if (!ExtensionPropertiesRegex.IsMatch(column.Data))
@if (column.ValueConverter == null)
{
@if (column.ValueConverter == null)
{
<PropertyColumn T="TItem" TProperty="object" Property="@(x => GetPropertyValue(x, column.Data))" Title="@column.Title" Sortable="@column.Sortable" Hidden="@(!column.Visible)" CellStyle="@GetColumnStyle(column)" />
}
else
{
<TemplateColumn T="TItem" Title="@column.Title" Sortable="@column.Sortable" Hidden="@(!column.Visible)" CellStyle="@GetColumnStyle(column)">
<CellTemplate>
@((MarkupString)GetConvertedFieldValue(context.Item, column))
</CellTemplate>
</TemplateColumn>
}
<PropertyColumn T="TItem" TProperty="object" Property="@(x => GetPropertyValue(x, column.Data))"
Title="@column.Title" Sortable="@column.Sortable" Hidden="@(!column.Visible)"
CellStyle="@GetColumnStyle(column)" />
}
else
{
<TemplateColumn T="TItem" Title="@column.Title" SortBy="@GetExtensionPropertySortFunc(column)" Hidden="@(!column.Visible)" CellStyle="@GetColumnStyle(column)">
<TemplateColumn T="TItem" Title="@column.Title" Sortable="@column.Sortable" Hidden="@(!column.Visible)"
CellStyle="@GetColumnStyle(column)">
<CellTemplate>
@{
var entity = context.Item as IHasExtraProperties;
var propertyName = ExtensionPropertiesRegex.Match(column.Data).Groups[1].Value;
var propertyValue = entity?.GetProperty(propertyName);
if (propertyValue != null && propertyValue.GetType() == typeof(bool))
{
if ((bool)propertyValue)
{
<MudIcon Icon="@Icons.Material.Filled.Check" Color="Color.Success" />
}
else
{
<MudIcon Icon="@Icons.Material.Filled.Close" Color="Color.Error" />
}
}
else
{
if (column.ValueConverter != null)
{
@((MarkupString)GetConvertedFieldValue(context.Item, column))
}
else
{
if (column.DisplayFormat == null)
{
@(propertyValue)
}
else
{
@(string.Format(column.DisplayFormatProvider, column.DisplayFormat, propertyValue))
}
}
}
}
@((MarkupString)GetConvertedFieldValue(context.Item, column))
</CellTemplate>
</TemplateColumn>
}
}
}
}
}
</Columns>
<PagerContent>
@if (ShowPager)
{
<MudDataGridPager T="TItem" />
}
</PagerContent>
</MudDataGrid>
}
else
{
<MudDataGrid T="TItem"
Items="@Data"
Loading="@Loading"
Dense="true"
Striped="true"
Bordered="false"
Hover="true"
Class="@Class">
<LoadingContent>
<MudProgressCircular Color="Color.Primary" Indeterminate="true" />
</LoadingContent>
<NoRecordsContent>
<MudText Typo="Typo.body1" Class="pa-4" Align="Align.Center">
@UiLocalizer["NoDataAvailableInDatatable"]
</MudText>
</NoRecordsContent>
<Columns>
@if (Columns != null)
{
@foreach (var column in Columns)
{
if (column.Actions.Any())
{
var entityActionType = column.Actions.Count == 1 ? MudActionType.Button : MudActionType.Dropdown;
<TemplateColumn T="TItem" Title="@column.Title" Sortable="false" CellStyle="@($"width: {ActionColumnWidth}")">
<CellTemplate>
<MudEntityActions Type="entityActionType" TItem="TItem">
@foreach (var action in column.Actions)
{
if (action.ConfirmationMessage != null)
else
{
<TemplateColumn T="TItem" Title="@column.Title" SortBy="@GetExtensionPropertySortFunc(column)"
Hidden="@(!column.Visible)" CellStyle="@GetColumnStyle(column)">
<CellTemplate>
@{
var entity = context.Item as IHasExtraProperties;
var propertyName = ExtensionPropertiesRegex.Match(column.Data).Groups[1].Value;
var propertyValue = entity?.GetProperty(propertyName);
if (propertyValue != null && propertyValue.GetType() == typeof(bool))
{
<MudEntityAction TItem="TItem"
Color="@GetColor(action.Color)"
Icon="@action.Icon"
Clicked="async () => await action.Clicked(context.Item!)"
ConfirmationMessage="() => action.ConfirmationMessage.Invoke(context.Item!)"
Visible="@(action.Visible != null ? action.Visible(context.Item!) : true)"
Text="@action.Text"
Disabled="@action.Disabled">
</MudEntityAction>
if ((bool)propertyValue)
{
<MudIcon Icon="@Icons.Material.Filled.Check" Color="Color.Success" />
}
else
{
<MudIcon Icon="@Icons.Material.Filled.Close" Color="Color.Error" />
}
}
else
{
<MudEntityAction TItem="TItem"
Clicked="async () => await action.Clicked(context.Item!)"
Color="@GetColor(action.Color)"
Icon="@action.Icon"
Visible="@(action.Visible != null ? action.Visible(context.Item!) : true)"
Text="@action.Text"
Disabled="@action.Disabled">
</MudEntityAction>
}
}
</MudEntityActions>
</CellTemplate>
</TemplateColumn>
}
else
{
@if (column.Component != null)
{
<TemplateColumn T="TItem" Title="@column.Title" Sortable="@column.Sortable" Hidden="@(!column.Visible)" CellStyle="@GetColumnStyle(column)">
<CellTemplate>
@RenderCustomTableColumnComponent(column.Component, context.Item!)
</CellTemplate>
</TemplateColumn>
}
else
{
if (!ExtensionPropertiesRegex.IsMatch(column.Data))
{
@if (column.ValueConverter == null)
{
<PropertyColumn T="TItem" TProperty="object" Property="@(x => GetPropertyValue(x, column.Data))" Title="@column.Title" Sortable="@column.Sortable" Hidden="@(!column.Visible)" CellStyle="@GetColumnStyle(column)" />
}
else
{
<TemplateColumn T="TItem" Title="@column.Title" Sortable="@column.Sortable" Hidden="@(!column.Visible)" CellStyle="@GetColumnStyle(column)">
<CellTemplate>
@((MarkupString)GetConvertedFieldValue(context.Item, column))
</CellTemplate>
</TemplateColumn>
}
}
else
{
<TemplateColumn T="TItem" Title="@column.Title" SortBy="@GetExtensionPropertySortFunc(column)" Hidden="@(!column.Visible)" CellStyle="@GetColumnStyle(column)">
<CellTemplate>
@{
var entity = context.Item as IHasExtraProperties;
var propertyName = ExtensionPropertiesRegex.Match(column.Data).Groups[1].Value;
var propertyValue = entity?.GetProperty(propertyName);
if (propertyValue != null && propertyValue.GetType() == typeof(bool))
if (column.ValueConverter != null)
{
if ((bool)propertyValue)
{
<MudIcon Icon="@Icons.Material.Filled.Check" Color="Color.Success" />
}
else
{
<MudIcon Icon="@Icons.Material.Filled.Close" Color="Color.Error" />
}
@((MarkupString)GetConvertedFieldValue(context.Item, column))
}
else
{
if (column.ValueConverter != null)
if (column.DisplayFormat == null)
{
@((MarkupString)GetConvertedFieldValue(context.Item, column))
@(propertyValue)
}
else
{
if (column.DisplayFormat == null)
{
@(propertyValue)
}
else
{
@(string.Format(column.DisplayFormatProvider, column.DisplayFormat, propertyValue))
}
@(string.Format(column.DisplayFormatProvider, column.DisplayFormat, propertyValue))
}
}
}
</CellTemplate>
</TemplateColumn>
}
}
</CellTemplate>
</TemplateColumn>
}
}
}
}
</Columns>
<PagerContent>
@if (ShowPager)
{
<MudDataGridPager T="TItem" />
}
</PagerContent>
</MudDataGrid>
}
}
</Columns>
<PagerContent>
@if (ShowPager)
{
<MudDataGridPager T="TItem" />
}
</PagerContent>
</MudDataGrid>

12
framework/src/Volo.Abp.MudBlazorUI/Components/AbpMudExtensibleDataGrid.razor.cs

@ -18,9 +18,9 @@ public partial class AbpMudExtensibleDataGrid<TItem> : ComponentBase
{
protected const string DataFieldAttributeName = "Data";
protected Regex ExtensionPropertiesRegex = new Regex(@"ExtraProperties\[(.*?)\]");
private MudDataGrid<TItem>? _dataGrid;
[Parameter] public IEnumerable<TItem>? Data { get; set; }
protected Regex ExtensionPropertiesRegex = new Regex(@"ExtraProperties\[(.*?)\]");
[Parameter] public Func<GridState<TItem>, Task<GridData<TItem>>>? ServerData { get; set; }
@ -44,6 +44,14 @@ public partial class AbpMudExtensibleDataGrid<TItem> : ComponentBase
[Inject]
public IStringLocalizer<AbpUiResource> UiLocalizer { get; set; } = default!;
public virtual async Task ReloadServerDataAsync()
{
if (_dataGrid != null && ServerData != null)
{
await _dataGrid.ReloadServerData();
}
}
protected virtual RenderFragment RenderCustomTableColumnComponent(Type type, object data)
{
return (builder) =>

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

@ -19,14 +19,13 @@
<MudCard>
<MudCardContent>
<AbpMudExtensibleDataGrid TItem="IdentityRoleDto"
Data="@Entities"
ServerData="@OnDataGridReadAsync"
Loading="@(TotalCount == null)"
ShowPager="true"
PageSize="@PageSize"
CurrentPage="@CurrentPage"
Columns="@RoleManagementTableColumns" />
<AbpMudExtensibleDataGrid @ref="_dataGrid"
TItem="IdentityRoleDto"
ServerData="@OnDataGridReadAsync"
ShowPager="true"
PageSize="@PageSize"
CurrentPage="@CurrentPage"
Columns="@RoleManagementTableColumns" />
</MudCardContent>
</MudCard>

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

@ -31,14 +31,13 @@
</MudItem>
</MudGrid>
<AbpMudExtensibleDataGrid TItem="IdentityUserDto"
Data="@Entities"
ServerData="@OnDataGridReadAsync"
Loading="@(TotalCount == null)"
ShowPager="true"
PageSize="@PageSize"
CurrentPage="@CurrentPage"
Columns="@UserManagementTableColumns" />
<AbpMudExtensibleDataGrid @ref="_dataGrid"
TItem="IdentityUserDto"
ServerData="@OnDataGridReadAsync"
ShowPager="true"
PageSize="@PageSize"
CurrentPage="@CurrentPage"
Columns="@UserManagementTableColumns" />
</MudCardContent>
</MudCard>

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

@ -93,7 +93,7 @@ public partial class UserManagement
{
GetListInput.Filter = GetListInput.Filter;
CurrentPage = 1;
await GetEntitiesAsync();
await _dataGrid.ReloadServerDataAsync();
}
}

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

@ -3,6 +3,7 @@
@using global::MudBlazor
@using Microsoft.AspNetCore.Authorization
@using Volo.Abp.FeatureManagement.Blazor.MudBlazor.Components
@using Volo.Abp.MudBlazorUI.Components
@using Microsoft.Extensions.Localization
@using Volo.Abp.UI.Navigation.Localization.Resource
@inject IStringLocalizer<AbpUiNavigationResource> LUiNavigation
@ -14,10 +15,10 @@
<MudCard>
<MudCardContent>
<AbpMudExtensibleDataGrid TItem="TenantDto"
Items="@Entities"
ReadData="@OnDataGridReadAsync"
TotalItems="@TotalCount"
<AbpMudExtensibleDataGrid @ref="_dataGrid"
TItem="TenantDto"
ServerData="@OnDataGridReadAsync"
ShowPager="true"
PageSize="@PageSize"
CurrentPage="@CurrentPage"
Columns="@TenantManagementTableColumns" />

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

@ -24,7 +24,6 @@
<CardBody>
@* ************************* DATA GRID ************************* *@
<AbpExtensibleDataGrid TItem="TenantDto"
Data="@Entities"
ReadData="@OnDataGridReadAsync"
TotalItems="@TotalCount"
ShowPager="true"

Loading…
Cancel
Save