Switch grids to built-in filter menu, remove custom filters

Removed custom filter row templates and operator logic for date and number columns in CatalogsGrid.razor and MassDataGrid.razor. Grids now use DevExpress's built-in filter menu (FilterMenuButtonDisplayMode.Always), simplifying code and UI. All related filter fields and methods were deleted.
This commit is contained in:
OlgunR
2026-02-10 13:32:21 +01:00
parent f49db97147
commit db232914a9
4 changed files with 4 additions and 551 deletions

View File

@@ -116,7 +116,7 @@ else
ShowGroupPanel="true"
ShowGroupedColumns="true"
AllowGroup="true"
ShowFilterRow="true"
FilterMenuButtonDisplayMode="GridFilterMenuButtonDisplayMode.Always"
AllowColumnResize="true"
ColumnResizeMode="GridColumnResizeMode.ColumnsContainer"
AllowColumnReorder="true"
@@ -172,10 +172,6 @@ else
private ValidationMessageStore? validationMessageStore;
private IGrid? gridRef;
private string popupHeaderText = "Edit";
private DateTime? addedWhenFilterValue;
private string addedWhenFilterOperator = "=";
private DateTime? changedWhenFilterValue;
private string changedWhenFilterOperator = "=";
private const string LayoutType = "GRID_BANDS";
private const string LayoutKey = "CatalogsGrid";
private const string LayoutUserStorageKey = "layoutUser";
@@ -202,15 +198,6 @@ else
new() { Value = 1, Text = "PRTBMY_CATALOG_SAVE" }
};
private readonly List<FilterOperatorOption> filterOperators = new()
{
new() { Value = "=", Text = "=" },
new() { Value = "<", Text = "<" },
new() { Value = ">", Text = ">" },
new() { Value = "<=", Text = "<=" },
new() { Value = ">=", Text = ">=" }
};
private bool CanSaveBandLayout => !string.IsNullOrWhiteSpace(layoutUser);
private bool gridLayoutApplied;
@@ -716,97 +703,9 @@ else
builder.AddAttribute(seq++, "ReadOnly", true);
}
if (string.Equals(column.FieldName, nameof(CatalogReadDto.AddedWhen), StringComparison.OrdinalIgnoreCase))
{
builder.AddAttribute(seq++, "FilterRowCellTemplate", BuildAddedWhenFilterTemplate());
}
else if (string.Equals(column.FieldName, nameof(CatalogReadDto.ChangedWhen), StringComparison.OrdinalIgnoreCase))
{
builder.AddAttribute(seq++, "FilterRowCellTemplate", BuildChangedWhenFilterTemplate());
}
builder.CloseComponent();
}
private RenderFragment<GridDataColumnFilterRowCellTemplateContext> BuildAddedWhenFilterTemplate()
{
return BuildDateFilterTemplate(
() => addedWhenFilterValue,
value => addedWhenFilterValue = value,
() => addedWhenFilterOperator,
value => addedWhenFilterOperator = value);
}
private RenderFragment<GridDataColumnFilterRowCellTemplateContext> BuildChangedWhenFilterTemplate()
{
return BuildDateFilterTemplate(
() => changedWhenFilterValue,
value => changedWhenFilterValue = value,
() => changedWhenFilterOperator,
value => changedWhenFilterOperator = value);
}
private RenderFragment<GridDataColumnFilterRowCellTemplateContext> BuildDateFilterTemplate(
Func<DateTime?> getValue,
Action<DateTime?> setValue,
Func<string> getOperator,
Action<string> setOperator)
{
return context => builder =>
{
var seq = 0;
builder.OpenElement(seq++, "div");
builder.AddAttribute(seq++, "class", "filter-row-cell");
builder.OpenComponent<DxComboBox<FilterOperatorOption, string>>(seq++);
builder.AddAttribute(seq++, "Data", filterOperators);
builder.AddAttribute(seq++, "TextFieldName", "Text");
builder.AddAttribute(seq++, "ValueFieldName", "Value");
builder.AddAttribute(seq++, "Value", getOperator());
builder.AddAttribute(seq++, "ValueChanged", EventCallback.Factory.Create<string>(this, value =>
{
setOperator(value);
UpdateFilterCriteria(context, value, getValue());
}));
builder.AddAttribute(seq++, "CssClass", "filter-operator");
builder.CloseComponent();
builder.OpenComponent<DxDateEdit<DateTime?>>(seq++);
builder.AddAttribute(seq++, "Date", getValue());
builder.AddAttribute(seq++, "DateChanged", EventCallback.Factory.Create<DateTime?>(this, value =>
{
setValue(value);
UpdateFilterCriteria(context, getOperator(), value);
}));
builder.AddAttribute(seq++, "ClearButtonDisplayMode", DataEditorClearButtonDisplayMode.Auto);
builder.AddAttribute(seq++, "CssClass", "filter-value");
builder.CloseComponent();
builder.CloseElement();
};
}
private void UpdateFilterCriteria(GridDataColumnFilterRowCellTemplateContext context, string op, DateTime? value)
{
if (!value.HasValue)
{
context.FilterCriteria = null;
return;
}
var prop = new OperandProperty(context.DataColumn.FieldName);
var date = value.Value.Date;
context.FilterCriteria = op switch
{
"=" => new GroupOperator(GroupOperatorType.And, prop >= date, prop < date.AddDays(1)),
"<" => prop < date,
"<=" => prop < date.AddDays(1),
">" => prop >= date.AddDays(1),
">=" => prop >= date,
_ => prop == date
};
}
private sealed class BandLayout
{
public List<BandDefinition> Bands { get; set; } = new();

View File

@@ -196,7 +196,7 @@ else
ShowGroupPanel="true"
ShowGroupedColumns="true"
AllowGroup="true"
ShowFilterRow="true"
FilterMenuButtonDisplayMode="GridFilterMenuButtonDisplayMode.Always"
AllowColumnResize="true"
ColumnResizeMode="GridColumnResizeMode.ColumnsContainer"
AllowColumnReorder="true"
@@ -265,12 +265,6 @@ else
private int pageCount = 1;
private int? pageSize = 100;
private string popupHeaderText = "Edit";
private decimal? amountFilterValue;
private string amountFilterOperator = "=";
private DateTime? addedWhenFilterValue;
private string addedWhenFilterOperator = "=";
private DateTime? changedWhenFilterValue;
private string changedWhenFilterOperator = "=";
private EditContext? editContext;
private ValidationMessageStore? validationMessageStore;
private IGrid? gridRef;
@@ -305,27 +299,11 @@ else
new() { Value = null, Text = "Alle" }
};
private readonly List<BoolFilterOption> statusFilterOptions = new()
{
new() { Value = null, Text = "Alle" },
new() { Value = true, Text = "True" },
new() { Value = false, Text = "False" }
};
private readonly List<ProcedureOption> procedureOptions = new()
{
new() { Value = 0, Text = "PRMassdata_UpsertByCustomerName" }
};
private readonly List<FilterOperatorOption> filterOperators = new()
{
new() { Value = "=", Text = "=" },
new() { Value = "<", Text = "<" },
new() { Value = ">", Text = ">" },
new() { Value = "<=", Text = "<=" },
new() { Value = ">=", Text = ">=" }
};
private bool gridLayoutApplied;
protected override async Task OnInitializedAsync()
@@ -650,163 +628,9 @@ else
builder.AddAttribute(seq++, "ReadOnly", true);
}
if (string.Equals(column.FieldName, nameof(MassDataReadDto.Amount), StringComparison.OrdinalIgnoreCase))
{
builder.AddAttribute(seq++, "FilterRowCellTemplate", BuildAmountFilterTemplate());
}
else if (string.Equals(column.FieldName, nameof(MassDataReadDto.AddedWhen), StringComparison.OrdinalIgnoreCase))
{
builder.AddAttribute(seq++, "FilterRowCellTemplate", BuildAddedWhenFilterTemplate());
}
else if (string.Equals(column.FieldName, nameof(MassDataReadDto.ChangedWhen), StringComparison.OrdinalIgnoreCase))
{
builder.AddAttribute(seq++, "FilterRowCellTemplate", BuildChangedWhenFilterTemplate());
}
builder.CloseComponent();
}
private RenderFragment<GridDataColumnFilterRowCellTemplateContext> BuildAmountFilterTemplate()
{
return BuildNumberFilterTemplate(
() => amountFilterValue,
value => amountFilterValue = value,
() => amountFilterOperator,
value => amountFilterOperator = value);
}
private RenderFragment<GridDataColumnFilterRowCellTemplateContext> BuildAddedWhenFilterTemplate()
{
return BuildDateFilterTemplate(
() => addedWhenFilterValue,
value => addedWhenFilterValue = value,
() => addedWhenFilterOperator,
value => addedWhenFilterOperator = value);
}
private RenderFragment<GridDataColumnFilterRowCellTemplateContext> BuildChangedWhenFilterTemplate()
{
return BuildDateFilterTemplate(
() => changedWhenFilterValue,
value => changedWhenFilterValue = value,
() => changedWhenFilterOperator,
value => changedWhenFilterOperator = value);
}
private RenderFragment<GridDataColumnFilterRowCellTemplateContext> BuildNumberFilterTemplate(
Func<decimal?> getValue,
Action<decimal?> setValue,
Func<string> getOperator,
Action<string> setOperator)
{
return context => builder =>
{
var seq = 0;
builder.OpenElement(seq++, "div");
builder.AddAttribute(seq++, "class", "filter-row-cell");
builder.OpenComponent<DxComboBox<FilterOperatorOption, string>>(seq++);
builder.AddAttribute(seq++, "Data", filterOperators);
builder.AddAttribute(seq++, "TextFieldName", "Text");
builder.AddAttribute(seq++, "ValueFieldName", "Value");
builder.AddAttribute(seq++, "Value", getOperator());
builder.AddAttribute(seq++, "ValueChanged", EventCallback.Factory.Create<string>(this, value =>
{
setOperator(value);
UpdateFilterCriteria(context, value, getValue());
}));
builder.AddAttribute(seq++, "CssClass", "filter-operator");
builder.CloseComponent();
builder.OpenComponent<DxSpinEdit<decimal?>>(seq++);
builder.AddAttribute(seq++, "Value", getValue());
builder.AddAttribute(seq++, "ValueChanged", EventCallback.Factory.Create<decimal?>(this, value =>
{
setValue(value);
UpdateFilterCriteria(context, getOperator(), value);
}));
builder.AddAttribute(seq++, "ClearButtonDisplayMode", DataEditorClearButtonDisplayMode.Auto);
builder.AddAttribute(seq++, "CssClass", "filter-value filter-value-amount");
builder.CloseComponent();
builder.CloseElement();
};
}
private RenderFragment<GridDataColumnFilterRowCellTemplateContext> BuildDateFilterTemplate(
Func<DateTime?> getValue,
Action<DateTime?> setValue,
Func<string> getOperator,
Action<string> setOperator)
{
return context => builder =>
{
var seq = 0;
builder.OpenElement(seq++, "div");
builder.AddAttribute(seq++, "class", "filter-row-cell");
builder.OpenComponent<DxComboBox<FilterOperatorOption, string>>(seq++);
builder.AddAttribute(seq++, "Data", filterOperators);
builder.AddAttribute(seq++, "TextFieldName", "Text");
builder.AddAttribute(seq++, "ValueFieldName", "Value");
builder.AddAttribute(seq++, "Value", getOperator());
builder.AddAttribute(seq++, "ValueChanged", EventCallback.Factory.Create<string>(this, value =>
{
setOperator(value);
UpdateFilterCriteria(context, value, getValue());
}));
builder.AddAttribute(seq++, "CssClass", "filter-operator");
builder.CloseComponent();
builder.OpenComponent<DxDateEdit<DateTime?>>(seq++);
builder.AddAttribute(seq++, "Date", getValue());
builder.AddAttribute(seq++, "DateChanged", EventCallback.Factory.Create<DateTime?>(this, value =>
{
setValue(value);
UpdateFilterCriteria(context, getOperator(), value);
}));
builder.AddAttribute(seq++, "ClearButtonDisplayMode", DataEditorClearButtonDisplayMode.Auto);
builder.AddAttribute(seq++, "CssClass", "filter-value");
builder.CloseComponent();
builder.CloseElement();
};
}
private void UpdateFilterCriteria(GridDataColumnFilterRowCellTemplateContext context, string op, object? value)
{
if (value == null)
{
context.FilterCriteria = null;
return;
}
var prop = new OperandProperty(context.DataColumn.FieldName);
if (value is DateTime dateValue)
{
var date = dateValue.Date;
context.FilterCriteria = op switch
{
"=" => new GroupOperator(GroupOperatorType.And, prop >= date, prop < date.AddDays(1)),
"<" => prop < date,
"<=" => prop < date.AddDays(1),
">" => prop >= date.AddDays(1),
">=" => prop >= date,
_ => prop == date
};
return;
}
context.FilterCriteria = op switch
{
"<" => new BinaryOperator(prop, new OperandValue(value), BinaryOperatorType.Less),
">" => new BinaryOperator(prop, new OperandValue(value), BinaryOperatorType.Greater),
"<=" => new BinaryOperator(prop, new OperandValue(value), BinaryOperatorType.LessOrEqual),
">=" => new BinaryOperator(prop, new OperandValue(value), BinaryOperatorType.GreaterOrEqual),
_ => new BinaryOperator(prop, new OperandValue(value), BinaryOperatorType.Equal)
};
}
private void SetEditContext(EditContext context)
{
if (editContext == context)