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:
@@ -157,7 +157,7 @@ else
|
||||
ShowGroupPanel="true"
|
||||
ShowGroupedColumns="true"
|
||||
AllowGroup="true"
|
||||
ShowFilterRow="true"
|
||||
FilterMenuButtonDisplayMode="GridFilterMenuButtonDisplayMode.Always"
|
||||
AllowColumnResize="true"
|
||||
ColumnResizeMode="GridColumnResizeMode.ColumnsContainer"
|
||||
AllowColumnReorder="true"
|
||||
@@ -213,10 +213,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";
|
||||
@@ -243,15 +239,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;
|
||||
|
||||
@@ -757,97 +744,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();
|
||||
|
||||
@@ -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;
|
||||
@@ -317,15 +311,6 @@ else
|
||||
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 +635,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)
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user