Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions blazorbootstrap/Components/Grid/GridColumnFilter.razor
Original file line number Diff line number Diff line change
Expand Up @@ -38,19 +38,19 @@
|| PropertyTypeName == StringConstants.PropertyTypeNameDecimal
|| PropertyTypeName == StringConstants.PropertyTypeNameDouble)
{
<input class="form-control" style="@filterStyle" type="number" value="@filterValue" @oninput="@(async args => await OnFilterValueChangedAsync(args))">
<input class="form-control" style="@filterStyle" type="number" @bind-value="filterValue" @bind-value:event="oninput" />
}
else if (PropertyTypeName == StringConstants.PropertyTypeNameDateOnly)
{
<input class="form-control" style="@filterStyle" type="date" value="@filterValue" @oninput="@(async args => await OnFilterValueChangedAsync(args))" />
<input class="form-control" style="@filterStyle" type="date" value="@_filterValue" @oninput="OnFilterValueInput" />
}
else if (PropertyTypeName == StringConstants.PropertyTypeNameDateTime)
{
<input class="form-control" style="@filterStyle" type="datetime-local" value="@filterValue" @oninput="@(async args => await OnFilterValueChangedAsync(args))" />
<input class="form-control" style="@filterStyle" type="datetime-local" value="@_filterValue" @oninput="OnFilterValueInput" />
}
else if (PropertyTypeName == StringConstants.PropertyTypeNameBoolean)
{
<input class="form-check-input" type="checkbox" value="@filterValue" @onchange="@(async args => await OnFilterValueChangedAsync(args))" />
<input class="form-check-input" type="checkbox" @bind-value="filterValue" @bind-value:event="onchange" />
}
else if (PropertyTypeName == StringConstants.PropertyTypeNameEnum)
{
Expand Down Expand Up @@ -79,6 +79,6 @@
}
else // guid or string
{
<input class="form-control" style="@filterStyle" type="text" value="@filterValue" @oninput="@(async args => await OnFilterValueChangedAsync(args))" />
<input class="form-control" style="@filterStyle" type="text" @bind-value="filterValue" @bind-value:event="oninput" />
}
</div>
40 changes: 27 additions & 13 deletions blazorbootstrap/Components/Grid/GridColumnFilter.razor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,23 @@ public partial class GridColumnFilter : BlazorBootstrapComponentBase

private IEnumerable<FilterOperatorInfo>? filterOperators;

private string? filterValue;
private string? _filterValue;
private string? filterValue
{
get => _filterValue;
set
{
if (_filterValue != value)
{
_filterValue = value;
// Trigger the filter changed event when the value changes
if (GridColumnFilterChanged.HasDelegate)
{
InvokeAsync(async () => await GridColumnFilterChanged.InvokeAsync(new FilterEventArgs(_filterValue!, filterOperator)));
}
}
}
}

private string? selectedFilterSymbol;

Expand Down Expand Up @@ -87,10 +103,15 @@ private async Task<IEnumerable<FilterOperatorInfo>> GetFilterOperatorsAsync(stri

private async Task OnEnumFilterValueChangedAsync(object enumValue)
{
// Setting filterValue will automatically trigger the event via the property setter
filterValue = enumValue?.ToString();
}

if (GridColumnFilterChanged.HasDelegate)
await GridColumnFilterChanged.InvokeAsync(new FilterEventArgs(filterValue!, filterOperator));
private void OnFilterValueInput(ChangeEventArgs args)
{
// Update the value directly without triggering the property setter to avoid issues with date/datetime binding
// The property setter will auto-trigger when assigned
filterValue = args?.Value?.ToString();
}

private async Task OnFilterOperatorChangedAsync(FilterOperatorInfo filterOperatorInfo)
Expand All @@ -107,21 +128,14 @@ private async Task OnFilterOperatorChangedAsync(FilterOperatorInfo filterOperato
else
{
filterOperator = filterOperatorInfo.FilterOperator;
// Manually trigger the event since we're only changing the operator, not the value
if (GridColumnFilterChanged.HasDelegate)
await GridColumnFilterChanged.InvokeAsync(new FilterEventArgs(filterValue!, filterOperator));
}

SetSelectedFilterSymbol();

if (GridColumnFilterChanged.HasDelegate)
await GridColumnFilterChanged.InvokeAsync(new FilterEventArgs(filterValue!, filterOperator));
}

private async Task OnFilterValueChangedAsync(ChangeEventArgs args)
{
filterValue = args?.Value?.ToString();

if (GridColumnFilterChanged.HasDelegate)
await GridColumnFilterChanged.InvokeAsync(new FilterEventArgs(filterValue!, filterOperator));
}

private void SetSelectedFilterSymbol()
{
Expand Down