Skip to content

Commit b448b27

Browse files
committed
Add QueryFieldSelection for flexible field name selection
1 parent 5fc2561 commit b448b27

File tree

9 files changed

+51
-17
lines changed

9 files changed

+51
-17
lines changed

src/LoreSoft.Blazor.Controls/Data/DataComponentBase.cs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -279,6 +279,11 @@ public bool IsFilterActive()
279279
return LinqExpressionBuilder.IsValid(RootQuery);
280280
}
281281

282+
/// <summary>
283+
/// Gets a value indicating whether the current data provider is the local default provider.
284+
/// </summary>
285+
protected bool IsLocalProvider { get; private set; }
286+
282287
/// <summary>
283288
/// Applies the current filters and refreshes the data display.
284289
/// This method closes the filter panel and triggers a data refresh with the current filter state.
@@ -457,18 +462,12 @@ protected override async Task OnParametersSetAsync()
457462

458463
if (DataProvider != null)
459464
{
460-
if (Data != null || DataLoader != null)
461-
{
462-
throw new InvalidOperationException(
463-
$"Component can only accept one item source from its parameters. " +
464-
$"Do not supply both '{nameof(Data)}' and '{nameof(DataProvider)}'.");
465-
}
466-
467465
CurrentDataProvider = DataProvider;
468466
}
469467
else if (Data != null)
470468
{
471469
CurrentDataProvider = DefaultProvider;
470+
IsLocalProvider = true;
472471

473472
// if Data was replaces, refresh
474473
if (_data != Data)
@@ -480,6 +479,7 @@ protected override async Task OnParametersSetAsync()
480479
else if (DataLoader != null)
481480
{
482481
CurrentDataProvider = DefaultProvider;
482+
IsLocalProvider = true;
483483
}
484484
else
485485
{

src/LoreSoft.Blazor.Controls/Data/DataGrid.razor

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,10 @@
2727
<div class="data-grid__header"
2828
role="row">
2929

30-
3130
@if (DetailTemplate != null || HasGrouping)
3231
{
3332
<div class="data-grid__header-cell data-grid__cell--expand"
34-
role="columnheader">
35-
36-
</div>
33+
role="columnheader"></div>
3734
}
3835
@if (Selectable)
3936
{
@@ -70,6 +67,7 @@
7067
@foreach (var column in Columns.Where(c => c.Filterable))
7168
{
7269
<QueryBuilderField @key="column"
70+
FieldSelection="@(IsLocalProvider ? QueryFieldSelection.Property : QueryFieldSelection.Column)"
7371
Field="column.Property"
7472
Title="@column.HeaderName"
7573
Values="@column.FilterValues"

src/LoreSoft.Blazor.Controls/Data/DataGrid.razor.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -205,7 +205,7 @@ public async Task QuickSearch(string? searchText, bool clearFilter = false)
205205
{
206206
var filter = new QueryFilter
207207
{
208-
Field = column.ColumnName,
208+
Field = IsLocalProvider ? column.PropertyName : column.ColumnName,
209209
Operator = QueryOperators.Contains,
210210
Value = searchText
211211
};

src/LoreSoft.Blazor.Controls/Data/DataList.razor.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -259,7 +259,7 @@ public virtual async Task ExportAsync(string? fileName = null, CancellationToken
259259

260260
await CsvWriter.WriteAsync(
261261
stream: memoryStream,
262-
headers: fields.Select(p => p.Column ?? p.Name ?? string.Empty),
262+
headers: fields.Select(p => p.CurrentName ?? p.Name ?? string.Empty),
263263
rows: result.Items,
264264
selector: item => fields.Select(f => f.FieldValue(item)),
265265
encoding: Encoding.UTF8,

src/LoreSoft.Blazor.Controls/Query/QueryBuilderField.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,12 @@ public class QueryBuilderField<TItem> : ComponentBase
8282
[Parameter]
8383
public bool Searchable { get; set; } = true;
8484

85+
/// <summary>
86+
/// Gets or sets the mode used for which field name is used, column name
87+
/// or property name for filtering or sorting. Default is <see cref="QueryFieldSelection.Column"/>.
88+
/// </summary>
89+
[Parameter]
90+
public QueryFieldSelection FieldSelection { get; set; } = QueryFieldSelection.Column;
8591

8692
/// <summary>
8793
/// Gets the name of the field (property name).
@@ -118,6 +124,11 @@ public class QueryBuilderField<TItem> : ComponentBase
118124
/// </summary>
119125
public List<string>? CurrentValues { get; set; }
120126

127+
/// <summary>
128+
/// Gets the current name of the field based on the selected name mode.
129+
/// </summary>
130+
public string? CurrentName => FieldSelection == QueryFieldSelection.Column ? Column : Name;
131+
121132
/// <inheritdoc />
122133
protected override void OnInitialized()
123134
{

src/LoreSoft.Blazor.Controls/Query/QueryBuilderFilter.razor

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
<option value="">- Field -</option>
1919
@foreach (var field in Fields)
2020
{
21-
<option @key="field" value="@field.Column">@field.CurrentTitle</option>
21+
<option @key="field" value="@field.CurrentName">@field.CurrentTitle</option>
2222
}
2323
</select>
2424

@@ -33,7 +33,7 @@
3333
<select id="operator-@Filter.Id"
3434
name="operator-@Filter.Id"
3535
title="Select Filter Operator"
36-
required="true"
36+
required="required"
3737
autocomplete="off"
3838
@bind="Filter.Operator"
3939
@bind:after="@OperatorChanged"
@@ -59,7 +59,7 @@
5959
name="value-@Filter.Id"
6060
title="Select Filter Value"
6161
value="@GetValue()"
62-
required="true"
62+
required="required"
6363
autocomplete="off"
6464
@onchange="SetValue"
6565
class="query-filter-value">

src/LoreSoft.Blazor.Controls/Query/QueryBuilderFilter.razor.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ protected override void OnInitialized()
5151
/// </summary>
5252
protected void FieldChanged()
5353
{
54-
Field = Fields.FirstOrDefault(f => f.Column == Filter.Field);
54+
Field = Fields.FirstOrDefault(f => f.CurrentName == Filter.Field);
5555
QueryBuilder.Refresh();
5656
StateHasChanged();
5757
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
namespace LoreSoft.Blazor.Controls;
2+
3+
/// <summary>
4+
/// Specifies the mode used for which field name is used, column name or property name for filtering or sorting
5+
/// </summary>
6+
public enum QueryFieldSelection
7+
{
8+
/// <summary>
9+
/// Use the column name in a data source, such as a database or a data table.
10+
/// </summary>
11+
Column,
12+
/// <summary>
13+
/// Use the property name as defined in code, such as a class property.
14+
/// </summary>
15+
Property
16+
}

test/LoreSoft.Blazor.Controls.Tests/Snapshots/PublicApiTest.PublicApiHasNotChanged.verified.txt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -305,6 +305,7 @@ namespace LoreSoft.Blazor.Controls
305305
[Microsoft.AspNetCore.Components.Parameter]
306306
public Microsoft.AspNetCore.Components.EventCallback<LoreSoft.Blazor.Controls.DataComponentBase<TItem>> Initialized { get; set; }
307307
public bool IsLoading { get; set; }
308+
protected bool IsLocalProvider { get; }
308309
[Microsoft.AspNetCore.Components.Inject]
309310
public required Microsoft.JSInterop.IJSRuntime JavaScript { get; set; }
310311
[Microsoft.AspNetCore.Components.Parameter]
@@ -1132,13 +1133,16 @@ namespace LoreSoft.Blazor.Controls
11321133
public QueryBuilderField() { }
11331134
public string? Column { get; set; }
11341135
public string? CurrentInputType { get; set; }
1136+
public string? CurrentName { get; }
11351137
public System.Collections.Generic.List<string>? CurrentOperators { get; set; }
11361138
public string? CurrentTitle { get; set; }
11371139
public System.Collections.Generic.List<string>? CurrentValues { get; set; }
11381140
[Microsoft.AspNetCore.Components.EditorRequired]
11391141
[Microsoft.AspNetCore.Components.Parameter]
11401142
public required System.Linq.Expressions.Expression<System.Func<TItem, object>> Field { get; set; }
11411143
[Microsoft.AspNetCore.Components.Parameter]
1144+
public LoreSoft.Blazor.Controls.QueryFieldSelection FieldSelection { get; set; }
1145+
[Microsoft.AspNetCore.Components.Parameter]
11421146
public string? Format { get; set; }
11431147
[Microsoft.AspNetCore.Components.Parameter]
11441148
public string? InputType { get; set; }
@@ -1216,6 +1220,11 @@ namespace LoreSoft.Blazor.Controls
12161220
protected override void OnParametersSet() { }
12171221
public void Refresh() { }
12181222
}
1223+
public enum QueryFieldSelection
1224+
{
1225+
Column = 0,
1226+
Property = 1,
1227+
}
12191228
public class QueryFilter : LoreSoft.Blazor.Controls.QueryRule, System.IEquatable<LoreSoft.Blazor.Controls.QueryFilter?>
12201229
{
12211230
public QueryFilter() { }

0 commit comments

Comments
 (0)