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"
|
ShowGroupPanel="true"
|
||||||
ShowGroupedColumns="true"
|
ShowGroupedColumns="true"
|
||||||
AllowGroup="true"
|
AllowGroup="true"
|
||||||
ShowFilterRow="true"
|
FilterMenuButtonDisplayMode="GridFilterMenuButtonDisplayMode.Always"
|
||||||
AllowColumnResize="true"
|
AllowColumnResize="true"
|
||||||
ColumnResizeMode="GridColumnResizeMode.ColumnsContainer"
|
ColumnResizeMode="GridColumnResizeMode.ColumnsContainer"
|
||||||
AllowColumnReorder="true"
|
AllowColumnReorder="true"
|
||||||
@@ -213,10 +213,6 @@ else
|
|||||||
private ValidationMessageStore? validationMessageStore;
|
private ValidationMessageStore? validationMessageStore;
|
||||||
private IGrid? gridRef;
|
private IGrid? gridRef;
|
||||||
private string popupHeaderText = "Edit";
|
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 LayoutType = "GRID_BANDS";
|
||||||
private const string LayoutKey = "CatalogsGrid";
|
private const string LayoutKey = "CatalogsGrid";
|
||||||
private const string LayoutUserStorageKey = "layoutUser";
|
private const string LayoutUserStorageKey = "layoutUser";
|
||||||
@@ -243,15 +239,6 @@ else
|
|||||||
new() { Value = 1, Text = "PRTBMY_CATALOG_SAVE" }
|
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 CanSaveBandLayout => !string.IsNullOrWhiteSpace(layoutUser);
|
||||||
private bool gridLayoutApplied;
|
private bool gridLayoutApplied;
|
||||||
|
|
||||||
@@ -757,97 +744,9 @@ else
|
|||||||
builder.AddAttribute(seq++, "ReadOnly", true);
|
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();
|
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
|
private sealed class BandLayout
|
||||||
{
|
{
|
||||||
public List<BandDefinition> Bands { get; set; } = new();
|
public List<BandDefinition> Bands { get; set; } = new();
|
||||||
|
|||||||
@@ -196,7 +196,7 @@ else
|
|||||||
ShowGroupPanel="true"
|
ShowGroupPanel="true"
|
||||||
ShowGroupedColumns="true"
|
ShowGroupedColumns="true"
|
||||||
AllowGroup="true"
|
AllowGroup="true"
|
||||||
ShowFilterRow="true"
|
FilterMenuButtonDisplayMode="GridFilterMenuButtonDisplayMode.Always"
|
||||||
AllowColumnResize="true"
|
AllowColumnResize="true"
|
||||||
ColumnResizeMode="GridColumnResizeMode.ColumnsContainer"
|
ColumnResizeMode="GridColumnResizeMode.ColumnsContainer"
|
||||||
AllowColumnReorder="true"
|
AllowColumnReorder="true"
|
||||||
@@ -265,12 +265,6 @@ else
|
|||||||
private int pageCount = 1;
|
private int pageCount = 1;
|
||||||
private int? pageSize = 100;
|
private int? pageSize = 100;
|
||||||
private string popupHeaderText = "Edit";
|
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 EditContext? editContext;
|
||||||
private ValidationMessageStore? validationMessageStore;
|
private ValidationMessageStore? validationMessageStore;
|
||||||
private IGrid? gridRef;
|
private IGrid? gridRef;
|
||||||
@@ -317,15 +311,6 @@ else
|
|||||||
new() { Value = 0, Text = "PRMassdata_UpsertByCustomerName" }
|
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;
|
private bool gridLayoutApplied;
|
||||||
|
|
||||||
protected override async Task OnInitializedAsync()
|
protected override async Task OnInitializedAsync()
|
||||||
@@ -650,163 +635,9 @@ else
|
|||||||
builder.AddAttribute(seq++, "ReadOnly", true);
|
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();
|
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)
|
private void SetEditContext(EditContext context)
|
||||||
{
|
{
|
||||||
if (editContext == context)
|
if (editContext == context)
|
||||||
|
|||||||
@@ -116,7 +116,7 @@ else
|
|||||||
ShowGroupPanel="true"
|
ShowGroupPanel="true"
|
||||||
ShowGroupedColumns="true"
|
ShowGroupedColumns="true"
|
||||||
AllowGroup="true"
|
AllowGroup="true"
|
||||||
ShowFilterRow="true"
|
FilterMenuButtonDisplayMode="GridFilterMenuButtonDisplayMode.Always"
|
||||||
AllowColumnResize="true"
|
AllowColumnResize="true"
|
||||||
ColumnResizeMode="GridColumnResizeMode.ColumnsContainer"
|
ColumnResizeMode="GridColumnResizeMode.ColumnsContainer"
|
||||||
AllowColumnReorder="true"
|
AllowColumnReorder="true"
|
||||||
@@ -172,10 +172,6 @@ else
|
|||||||
private ValidationMessageStore? validationMessageStore;
|
private ValidationMessageStore? validationMessageStore;
|
||||||
private IGrid? gridRef;
|
private IGrid? gridRef;
|
||||||
private string popupHeaderText = "Edit";
|
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 LayoutType = "GRID_BANDS";
|
||||||
private const string LayoutKey = "CatalogsGrid";
|
private const string LayoutKey = "CatalogsGrid";
|
||||||
private const string LayoutUserStorageKey = "layoutUser";
|
private const string LayoutUserStorageKey = "layoutUser";
|
||||||
@@ -202,15 +198,6 @@ else
|
|||||||
new() { Value = 1, Text = "PRTBMY_CATALOG_SAVE" }
|
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 CanSaveBandLayout => !string.IsNullOrWhiteSpace(layoutUser);
|
||||||
private bool gridLayoutApplied;
|
private bool gridLayoutApplied;
|
||||||
|
|
||||||
@@ -716,97 +703,9 @@ else
|
|||||||
builder.AddAttribute(seq++, "ReadOnly", true);
|
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();
|
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
|
private sealed class BandLayout
|
||||||
{
|
{
|
||||||
public List<BandDefinition> Bands { get; set; } = new();
|
public List<BandDefinition> Bands { get; set; } = new();
|
||||||
|
|||||||
@@ -196,7 +196,7 @@ else
|
|||||||
ShowGroupPanel="true"
|
ShowGroupPanel="true"
|
||||||
ShowGroupedColumns="true"
|
ShowGroupedColumns="true"
|
||||||
AllowGroup="true"
|
AllowGroup="true"
|
||||||
ShowFilterRow="true"
|
FilterMenuButtonDisplayMode="GridFilterMenuButtonDisplayMode.Always"
|
||||||
AllowColumnResize="true"
|
AllowColumnResize="true"
|
||||||
ColumnResizeMode="GridColumnResizeMode.ColumnsContainer"
|
ColumnResizeMode="GridColumnResizeMode.ColumnsContainer"
|
||||||
AllowColumnReorder="true"
|
AllowColumnReorder="true"
|
||||||
@@ -265,12 +265,6 @@ else
|
|||||||
private int pageCount = 1;
|
private int pageCount = 1;
|
||||||
private int? pageSize = 100;
|
private int? pageSize = 100;
|
||||||
private string popupHeaderText = "Edit";
|
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 EditContext? editContext;
|
||||||
private ValidationMessageStore? validationMessageStore;
|
private ValidationMessageStore? validationMessageStore;
|
||||||
private IGrid? gridRef;
|
private IGrid? gridRef;
|
||||||
@@ -305,27 +299,11 @@ else
|
|||||||
new() { Value = null, Text = "Alle" }
|
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()
|
private readonly List<ProcedureOption> procedureOptions = new()
|
||||||
{
|
{
|
||||||
new() { Value = 0, Text = "PRMassdata_UpsertByCustomerName" }
|
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;
|
private bool gridLayoutApplied;
|
||||||
|
|
||||||
protected override async Task OnInitializedAsync()
|
protected override async Task OnInitializedAsync()
|
||||||
@@ -650,163 +628,9 @@ else
|
|||||||
builder.AddAttribute(seq++, "ReadOnly", true);
|
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();
|
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)
|
private void SetEditContext(EditContext context)
|
||||||
{
|
{
|
||||||
if (editContext == context)
|
if (editContext == context)
|
||||||
|
|||||||
Reference in New Issue
Block a user