Skip to content

Commit 496c038

Browse files
committed
improvements for entitytable
1 parent a89af23 commit 496c038

File tree

7 files changed

+67
-67
lines changed

7 files changed

+67
-67
lines changed

.editorconfig

+4
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
root = true
22

33
[*]
4+
roslynator_accessibility_modifiers = explicit
5+
roslynator_use_anonymous_function_or_method_group = anonymous_function|method_group
6+
roslynator_enum_has_flag_style = method
7+
roslynator_object_creation_type_style = explicit|implicit|implicit_when_type_is_obvious
48

59
indent_style = space
610

src/Client/Components/EntityTable/AddEditModal.razor

+3-8
Original file line numberDiff line numberDiff line change
@@ -10,27 +10,22 @@
1010
@if (IsCreate)
1111
{
1212
<MudIcon Icon="@Icons.Material.Filled.Add" Class="mr-3 mb-n1" />
13+
@($"{L["Create"]} {EntityName}");
1314
}
1415
else
1516
{
1617
<MudIcon Icon="@Icons.Material.Filled.Update" Class="mr-3 mb-n1" />
18+
@($"{L["Edit"]} {EntityName} {Id}");
1719
}
18-
@Title
1920
</MudText>
2021
</TitleContent>
2122

2223
<DialogContent>
2324
<DataAnnotationsValidator />
2425
<CustomValidation @ref="_customValidation" />
2526
<MudGrid>
26-
@if (!IsCreate)
27-
{
28-
<MudItem xs="12" md="6">
29-
<MudTextField Disabled For="@(() => Id)" @bind-Value="Id" Label="@L["Id"]" />
30-
</MudItem>
31-
}
3227

33-
@EditFormContent(RequestModel!)
28+
@EditFormContent(RequestModel)
3429

3530
</MudGrid>
3631
</DialogContent>

src/Client/Components/EntityTable/AddEditModal.razor.cs

+9-10
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
namespace FSH.BlazorWebAssembly.Client.Components.EntityTable;
77

8-
public partial class AddEditModal<TRequest> : IAddEditModal
8+
public partial class AddEditModal<TRequest> : IAddEditModal<TRequest>
99
{
1010
[Parameter]
1111
[EditorRequired]
@@ -22,9 +22,7 @@ public partial class AddEditModal<TRequest> : IAddEditModal
2222

2323
[Parameter]
2424
[EditorRequired]
25-
public string Title { get; set; } = default!;
26-
[Parameter]
27-
public bool IsCreate { get; set; }
25+
public string EntityName { get; set; } = default!;
2826
[Parameter]
2927
public object? Id { get; set; }
3028

@@ -33,13 +31,9 @@ public partial class AddEditModal<TRequest> : IAddEditModal
3331

3432
private CustomValidation? _customValidation;
3533

36-
protected override Task OnInitializedAsync() =>
37-
OnInitializedFunc is not null
38-
? OnInitializedFunc()
39-
: Task.CompletedTask;
34+
public bool IsCreate => Id is null;
4035

41-
public void ForceRender() =>
42-
StateHasChanged();
36+
public void ForceRender() => StateHasChanged();
4337

4438
// This should not be necessary anymore, except maybe in the case when the
4539
// UpdateEntityRequest has different validation rules than the CreateEntityRequest.
@@ -75,6 +69,11 @@ public bool Validate(object request)
7569
return true;
7670
}
7771

72+
protected override Task OnInitializedAsync() =>
73+
OnInitializedFunc is not null
74+
? OnInitializedFunc()
75+
: Task.CompletedTask;
76+
7877
private async Task SaveAsync()
7978
{
8079
if (await ApiHelper.ExecuteCallGuardedAsync(

src/Client/Components/EntityTable/EntityTable.razor

+19-22
Original file line numberDiff line numberDiff line change
@@ -16,18 +16,18 @@
1616
@if (_canSearch && (Context.AdvancedSearchEnabled || AdvancedSearchContent is not null))
1717
{
1818
<MudExpansionPanel @bind-IsExpanded="_advancedSearchExpanded"
19-
Style="padding:10px!important; margin-bottom:10px!important;border-radius: var(--mud-default-borderradius) !important;"
20-
Class="mud-elevation-25" Text="@L["Advanced Search"]">
19+
Style="padding:10px!important; margin-bottom:10px!important;border-radius: var(--mud-default-borderradius) !important;"
20+
Class="mud-elevation-25" Text="@L["Advanced Search"]">
2121
<MudTextField @bind-Value="SearchString" Immediate="true"
22-
Placeholder="@(L["Search for "] + Context.EntityNamePlural)" Adornment="Adornment.Start"
23-
AdornmentIcon="@Icons.Material.Filled.Search" IconSize="Size.Medium"
24-
Style="flex:none!important;margin:0px!important" TextChanged="OnSearchStringChanged">
22+
Placeholder="@(L["Search for "] + Context.EntityNamePlural)" Adornment="Adornment.Start"
23+
AdornmentIcon="@Icons.Material.Filled.Search" IconSize="Size.Medium"
24+
Style="flex:none!important;margin:0px!important" TextChanged="OnSearchStringChanged">
2525
</MudTextField>
2626
@if (Context.AdvancedSearchEnabled)
2727
{
2828
<div style="margin-top:10px!important">
2929
<MudCheckBox Label="All Columns" T="bool" Checked="Context.AllColumnsChecked"
30-
CheckedChanged="Context.AllColumnsCheckChanged"></MudCheckBox>
30+
CheckedChanged="Context.AllColumnsCheckChanged"></MudCheckBox>
3131
@foreach (var field in Context.Fields)
3232
{
3333
<MudCheckBox @bind-Checked="@field.CheckedForSearch" Label="@(field.DisplayName)"></MudCheckBox>
@@ -48,8 +48,8 @@
4848
@if (_canCreate)
4949
{
5050
<MudButton DisableElevation Variant="Variant.Filled" Color="Color.Primary"
51-
OnClick="(() => InvokeModal())" StartIcon="@Icons.Material.Filled.Add"
52-
IconColor="Color.Surface">@L["Create"]</MudButton>
51+
OnClick="(() => InvokeModal())" StartIcon="@Icons.Material.Filled.Add"
52+
IconColor="Color.Surface">@L["Create"]</MudButton>
5353
}
5454
<MudButton DisableElevation Variant="Variant.Filled" OnClick="ResetAsync"
5555
StartIcon="@Icons.Material.Filled.Refresh" IconColor="Color.Surface" Color="Color.Secondary"
@@ -59,9 +59,9 @@
5959
@if (_canSearch && !_advancedSearchExpanded)
6060
{
6161
<MudTextField @bind-Value="SearchString" Immediate="true" FullWidth="false"
62-
Placeholder="@(L["Search for "] + Context.EntityNamePlural)" Adornment="Adornment.End"
63-
AdornmentIcon="@Icons.Material.Filled.Search" IconSize="Size.Medium" Class="mt-0 mb-3"
64-
TextChanged="OnSearchStringChanged">
62+
Placeholder="@(L["Search for "] + Context.EntityNamePlural)" Adornment="Adornment.End"
63+
AdornmentIcon="@Icons.Material.Filled.Search" IconSize="Size.Medium" Class="mt-0 mb-3"
64+
TextChanged="OnSearchStringChanged">
6565
</MudTextField>
6666
}
6767
</ToolBarContent>
@@ -94,16 +94,13 @@
9494
{
9595
@field.Template(context)
9696
}
97+
else if (field.Type == typeof(bool))
98+
{
99+
<MudCheckBox Checked="@field.ValueFunc(context)" ReadOnly Color="Color.Secondary"></MudCheckBox>
100+
}
97101
else
98102
{
99-
if (field.Type == typeof(bool))
100-
{
101-
<MudCheckBox Checked="@field.ValueFunc(context)" ReadOnly Color="Color.Secondary"></MudCheckBox>
102-
}
103-
else
104-
{
105-
<MudHighlighter Text="@field.ValueFunc(context)?.ToString()" HighlightedText="@SearchString" />
106-
}
103+
<MudHighlighter Text="@field.ValueFunc(context)?.ToString()" HighlightedText="@SearchString" />
107104
}
108105
</MudTd>
109106
}
@@ -115,8 +112,8 @@
115112
else if (HasActions)
116113
{
117114
<MudMenu Label="@L["Actions"]" Variant="Variant.Filled" DisableElevation="true"
118-
EndIcon="@Icons.Filled.KeyboardArrowDown" IconColor="Color.Secondary" Direction="Direction.Left"
119-
OffsetX="true">
115+
EndIcon="@Icons.Filled.KeyboardArrowDown" IconColor="Color.Secondary" Direction="Direction.Left"
116+
OffsetX="true">
120117
@if (CanUpdateEntity(context))
121118
{
122119
<MudMenuItem @onclick="@(() => InvokeModal(context))">@L["Edit"]</MudMenuItem>
@@ -134,7 +131,7 @@
134131
else
135132
{
136133
<MudButton Variant="Variant.Filled" DisableElevation="true"
137-
StartIcon="@Icons.Material.Filled.DoNotTouch" IconColor="Color.Secondary" Size="Size.Small"
134+
StartIcon="@Icons.Material.Filled.DoNotTouch" IconColor="Color.Secondary" Size="Size.Small"
138135
Color="Color.Surface">
139136
@L["No Allowed Actions"]
140137
</MudButton>

src/Client/Components/EntityTable/EntityTable.razor.cs

+25-24
Original file line numberDiff line numberDiff line change
@@ -73,24 +73,28 @@ protected override async Task OnInitializedAsync()
7373
_canDelete = await CanDoPermission(Context.DeletePermission, state);
7474

7575
await LocalLoadDataAsync();
76-
await SubscribeToTableCustomizationPanel();
76+
await SetAndSubscribeToTablePreference();
7777
}
7878

79-
private async Task SubscribeToTableCustomizationPanel()
79+
private async Task SetAndSubscribeToTablePreference()
8080
{
81-
if (await ClientPreferences.GetPreference() is not ClientPreference currentPreference) return;
82-
Dense = currentPreference.EntityTablePreference.IsDense;
83-
Striped = currentPreference.EntityTablePreference.IsStriped;
84-
Bordered = currentPreference.EntityTablePreference.HasBorder;
85-
Hoverable = currentPreference.EntityTablePreference.IsHoverable;
86-
MessagingCenter.Subscribe<TableCustomizationPanel, EntityTablePreference>(this, nameof(currentPreference.EntityTablePreference), (_, value) =>
81+
if (await ClientPreferences.GetPreference() is ClientPreference clientPreference)
8782
{
88-
Dense = value.IsDense;
89-
Striped = value.IsStriped;
90-
Bordered = value.HasBorder;
91-
Hoverable = value.IsHoverable;
92-
StateHasChanged();
93-
});
83+
SetTablePreference(clientPreference.EntityTablePreference);
84+
MessagingCenter.Subscribe<TableCustomizationPanel, EntityTablePreference>(this, nameof(ClientPreference.EntityTablePreference), (_, value) =>
85+
{
86+
SetTablePreference(value);
87+
StateHasChanged();
88+
});
89+
}
90+
}
91+
92+
private void SetTablePreference(EntityTablePreference tablePreference)
93+
{
94+
Dense = tablePreference.IsDense;
95+
Striped = tablePreference.IsStriped;
96+
Bordered = tablePreference.HasBorder;
97+
Hoverable = tablePreference.IsHoverable;
9498
}
9599

96100
private async Task<bool> CanDoPermission(string? permission, AuthenticationState state) =>
@@ -208,31 +212,27 @@ private async Task InvokeModal(TEntity? entity = default)
208212
{
209213
bool isCreate = entity is null;
210214

211-
string title = isCreate
212-
? L["Create "] + Context.EntityName
213-
: L["Update "] + Context.EntityName;
214-
215215
var parameters = new DialogParameters()
216216
{
217217
{ nameof(AddEditModal<TRequest>.EditFormContent), EditFormContent },
218218
{ nameof(AddEditModal<TRequest>.OnInitializedFunc), Context.EditFormInitializedFunc },
219-
{ nameof(AddEditModal<TRequest>.IsCreate), isCreate },
220-
{ nameof(AddEditModal<TRequest>.Title), title }
219+
{ nameof(AddEditModal<TRequest>.EntityName), Context.EntityName }
221220
};
222221

222+
TRequest requestModel;
223+
223224
if (isCreate)
224225
{
225226
_ = Context.CreateFunc ?? throw new InvalidOperationException("CreateFunc can't be null!");
226227
parameters.Add(nameof(AddEditModal<TRequest>.SaveFunc), Context.CreateFunc);
227228

228-
var requestModel =
229+
requestModel =
229230
Context.GetDefaultsFunc is not null
230231
&& await ApiHelper.ExecuteCallGuardedAsync(
231232
() => Context.GetDefaultsFunc(), Snackbar)
232233
is TRequest defaultsResult
233234
? defaultsResult
234235
: new TRequest();
235-
parameters.Add(nameof(AddEditModal<TRequest>.RequestModel), requestModel);
236236
}
237237
else
238238
{
@@ -244,17 +244,18 @@ is TRequest defaultsResult
244244
Func<TRequest, Task> saveFunc = entity => Context.UpdateFunc(id, entity);
245245
parameters.Add(nameof(AddEditModal<TRequest>.SaveFunc), saveFunc);
246246

247-
var requestModel =
247+
requestModel =
248248
Context.GetDetailsFunc is not null
249249
&& await ApiHelper.ExecuteCallGuardedAsync(
250250
() => Context.GetDetailsFunc(id!),
251251
Snackbar)
252252
is TRequest detailsResult
253253
? detailsResult
254254
: entity!.Adapt<TRequest>();
255-
parameters.Add(nameof(AddEditModal<TRequest>.RequestModel), requestModel);
256255
}
257256

257+
parameters.Add(nameof(AddEditModal<TRequest>.RequestModel), requestModel);
258+
258259
var options = new DialogOptions { CloseButton = true, MaxWidth = MaxWidth.Medium, FullWidth = true, DisableBackdropClick = true };
259260

260261
var dialog = DialogService.Show<AddEditModal<TRequest>>(isCreate ? L["Create"] : L["Edit"], parameters, options);

src/Client/Components/EntityTable/EntityTableContext.cs

+4-2
Original file line numberDiff line numberDiff line change
@@ -150,13 +150,15 @@ public EntityTableContext(
150150
CanDeleteEntityFunc = canDeleteEntityFunc;
151151
}
152152

153+
// AddEdit modal
153154
private IDialogReference? _addEditModalRef;
154155

155156
internal void SetAddEditModalRef(IDialogReference dialog) =>
156157
_addEditModalRef = dialog;
157158

158-
public IAddEditModal? AddEditModal =>
159-
_addEditModalRef?.Dialog as IAddEditModal;
159+
public IAddEditModal<TRequest> AddEditModal =>
160+
_addEditModalRef?.Dialog as IAddEditModal<TRequest>
161+
?? throw new InvalidOperationException("AddEditModal is only available when the modal is shown.");
160162

161163
// Shortcuts
162164
public EntityClientTableContext<TEntity, TId, TRequest>? ClientContext => this as EntityClientTableContext<TEntity, TId, TRequest>;
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
namespace FSH.BlazorWebAssembly.Client.Components.EntityTable;
22

3-
public interface IAddEditModal
3+
public interface IAddEditModal<TRequest>
44
{
5+
TRequest RequestModel { get; }
6+
bool IsCreate { get; }
57
void ForceRender();
68
bool Validate(object request);
79
}

0 commit comments

Comments
 (0)