Skip to content
Merged
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
342 changes: 169 additions & 173 deletions CS/Components/ConditionalFormatSelector.razor
Original file line number Diff line number Diff line change
@@ -1,174 +1,170 @@
@using ConditionalFormatSelector.Data
@using DevExpress.Data.Filtering
@typeparam TModel

<DxPopup @ref="popupRef"
ShowHeader="false">
<BodyContentTemplate Context="PopupContext">
<DxFormLayout>

<DxFormLayoutItem Caption="Condition" ColSpanMd="12">
<DxComboBox Data="@conditions"
@bind-Value="selectedConditionType"
ValueFieldName="@nameof(ConditionInfo.ConditionType)"
TextFieldName="@nameof(ConditionInfo.ConditionName)" />
</DxFormLayoutItem>

<DxFormLayoutItem Caption="Filter Condition" ColSpanMd="12" Visible="@(selectedConditionType == ConditionType.Filter)">
<DxFilterBuilder @bind-FilterCriteria="selectedFilterCriteria">
<Fields>
@foreach (var field in typeof(TModel).GetProperties().Where(p => VisibleFilterFields?.Contains(p.Name) == true)) {
<DxFilterBuilderField FieldName="@field.Name" Type="@field.PropertyType" />
}
</Fields>
</DxFilterBuilder>
</DxFormLayoutItem>

<DxFormLayoutItem Caption="Style" ColSpanMd="12">
<DxComboBox Data="@FormatStyles"
@bind-Value="selectedFormatStyleName"
ValueFieldName="@nameof(FormatStyleInfo.FormatName)"
TextFieldName="@nameof(FormatStyleInfo.FormatName)"
ClearButtonDisplayMode="DataEditorClearButtonDisplayMode.Auto" />
</DxFormLayoutItem>

<DxFormLayoutItem ColSpanMd="9">
<DxButton Text="@SaveButtonText" Click="OnApplyClick" RenderStyle="ButtonRenderStyle.Primary" Enabled="@(!IsEmptyFilterCriteriaSelected)" />
<DxButton Text="Delete" Click="OnDeleteClick" RenderStyle="ButtonRenderStyle.Danger" Visible=@(!isNew) />
</DxFormLayoutItem>

<DxFormLayoutItem ColSpanMd="3">
<div class="cancel-btn-container">
<DxButton Text="Cancel" Click="OnCancelClick" RenderStyle="ButtonRenderStyle.Secondary" />
</div>
</DxFormLayoutItem>

</DxFormLayout>
</BodyContentTemplate>
</DxPopup>
@code {
[Parameter]
public List<SimpleFormat>? Formats { get; set; } = new List<SimpleFormat>();
[Parameter]
public EventCallback FormatsChanged { get; set; }
[Parameter]
public string[]? VisibleFilterFields { get; set; }
[Parameter]
public List<SummaryConditionInfo>? SummaryConditions { get; set; }
[Parameter]
public required List<FormatStyleInfo> FormatStyles { get; set; }

DxPopup? popupRef;
List<ConditionInfo> conditions = new List<ConditionInfo>();
string? currentColumnName;
string? currentFormatId;

string SaveButtonText =>
IsEmptyFilterCriteriaSelected
? "Select a Filter"
: (isNew ? "Add Format" : "Save Changes");

bool isNew = true;
bool IsEmptyFilterCriteriaSelected =>
selectedConditionType is ConditionType.Filter &&
(selectedFilterCriteria is null || string.IsNullOrEmpty(selectedFilterCriteria.ToString()));

ConditionType selectedConditionType;
CriteriaOperator? selectedFilterCriteria;
string? selectedFormatStyleName;

protected override void OnInitialized() {
conditions.Add(new ConditionInfo(ConditionType.Filter, "Filter"));
if (SummaryConditions?.Any() == true)
conditions.AddRange(SummaryConditions);
}

void OnApplyClick() {
bool isValidCondition = selectedFilterCriteria is not null || selectedConditionType is not ConditionType.Filter;
var condition = conditions.FirstOrDefault(c => c.ConditionType == selectedConditionType);

if (condition is not null && currentColumnName is not null && isValidCondition) {
if (condition.ConditionType is ConditionType.Filter)
condition = new FilterConditionInfo(condition.ConditionName, selectedFilterCriteria!);

if (isNew) {
isNew = false;
if (Formats is not null) {
var format = new SimpleFormat(
currentColumnName,
condition,
FormatStyles.FirstOrDefault(fs => fs.FormatName == selectedFormatStyleName)
);
Formats.Add(format);
}
}
else {
var format = Formats?.FirstOrDefault(f => f.FormatId == currentFormatId);
if (format is not null) {
format.Condition = condition;
format.Style = FormatStyles.FirstOrDefault(fs => fs.FormatName == selectedFormatStyleName);
}
}
}

popupRef?.CloseAsync();
FormatsChanged.InvokeAsync();
}

private void OnCancelClick() {
popupRef?.CloseAsync();
}

private void OnDeleteClick() {
var format = Formats?.FirstOrDefault(f => f.FormatId == currentFormatId);
if (format is null || Formats is null) {
Console.WriteLine($"Could not find format with ID:{currentFormatId} in the Formats collection");
return;
}
Formats.Remove(format);
FormatsChanged.InvokeAsync();
popupRef?.CloseAsync();
}

public void AddNewFormat(string fieldName) {
var firstOrDefaultCondition = conditions.FirstOrDefault();
if (firstOrDefaultCondition is null) {
Console.WriteLine("No conditions available to show Format Selector");
return;
}

currentColumnName = fieldName;
currentFormatId = null;
isNew = true;
selectedConditionType = firstOrDefaultCondition.ConditionType;
selectedFilterCriteria = null;
selectedFormatStyleName = null;

StateHasChanged();
popupRef?.ShowAsync();
}

public void EditFormat(string formatId) {
var formatItem = Formats?.FirstOrDefault(f => f.FormatId == formatId);
if (formatItem is null) {
Console.WriteLine($"Could not find format with ID:{formatId} in the Formats collection");
return;
}

currentColumnName = formatItem.ColumnFieldName;
currentFormatId = formatId;
isNew = false;
selectedConditionType = formatItem.Condition.ConditionType;
if (formatItem.Condition is FilterConditionInfo filterInfo)
selectedFilterCriteria = filterInfo.FilterCriteria;
selectedFormatStyleName = formatItem.Style?.FormatName;

StateHasChanged();
popupRef?.ShowAsync();
}

public void ClearAllColumnFormats(string fieldName) {
Formats?.RemoveAll(f => f.ColumnFieldName == fieldName);
FormatsChanged.InvokeAsync();
}
@using ConditionalFormatSelector.Data
@using DevExpress.Data.Filtering
@typeparam TModel

<DxPopup @ref="popupRef"
ShowHeader="false"
ApplyBackgroundShading="false">
<BodyContentTemplate Context="PopupContext">
<DxFormLayout>
<DxFormLayoutItem Caption="Condition" ColSpanMd="12">
<DxComboBox Data="@conditions"
@bind-Value="selectedConditionType"
ValueFieldName="@nameof(ConditionInfo.ConditionType)"
TextFieldName="@nameof(ConditionInfo.ConditionName)" />
</DxFormLayoutItem>
<DxFormLayoutItem Caption="Filter Condition" ColSpanMd="12" Visible="@(selectedConditionType == ConditionType.Filter)">
<DxFilterBuilder @bind-FilterCriteria="selectedFilterCriteria">
<Fields>
@foreach (var field in typeof(TModel).GetProperties().Where(p => VisibleFilterFields?.Contains(p.Name) == true)) {
<DxFilterBuilderField FieldName="@field.Name" Type="@field.PropertyType" />
}
</Fields>
</DxFilterBuilder>
</DxFormLayoutItem>
<DxFormLayoutItem Caption="Style" ColSpanMd="12">
<DxComboBox Data="@FormatStyles"
@bind-Value="selectedFormatStyleName"
ValueFieldName="@nameof(FormatStyleInfo.FormatName)"
TextFieldName="@nameof(FormatStyleInfo.FormatName)"
ClearButtonDisplayMode="DataEditorClearButtonDisplayMode.Auto" />
</DxFormLayoutItem>
<DxFormLayoutItem ColSpanMd="9">
<DxButton Text="@SaveButtonText" Click="OnApplyClick" RenderStyle="ButtonRenderStyle.Primary" Enabled="@(!IsEmptyFilterCriteriaSelected)" />
<DxButton Text="Delete" Click="OnDeleteClick" RenderStyle="ButtonRenderStyle.Danger" Visible=@(!isNew) />
</DxFormLayoutItem>
<DxFormLayoutItem ColSpanMd="3">
<div class="cancel-btn-container">
<DxButton Text="Cancel" Click="OnCancelClick" RenderStyle="ButtonRenderStyle.Secondary" />
</div>
</DxFormLayoutItem>
</DxFormLayout>
</BodyContentTemplate>
</DxPopup>

@code {
[Parameter]
public List<SimpleFormat>? Formats { get; set; } = new List<SimpleFormat>();
[Parameter]
public EventCallback FormatsChanged { get; set; }
[Parameter]
public string[]? VisibleFilterFields { get; set; }
[Parameter]
public List<SummaryConditionInfo>? SummaryConditions { get; set; }
[Parameter]
public required List<FormatStyleInfo> FormatStyles { get; set; }

DxPopup? popupRef;
List<ConditionInfo> conditions = new List<ConditionInfo>();
string? currentColumnName;
string? currentFormatId;

string SaveButtonText =>
IsEmptyFilterCriteriaSelected
? "Select a Filter"
: (isNew ? "Add Format" : "Save Changes");

bool isNew = true;
bool IsEmptyFilterCriteriaSelected =>
selectedConditionType is ConditionType.Filter &&
(selectedFilterCriteria is null || string.IsNullOrEmpty(selectedFilterCriteria.ToString()));

ConditionType selectedConditionType;
CriteriaOperator? selectedFilterCriteria;
string? selectedFormatStyleName;

protected override void OnInitialized() {
conditions.Add(new ConditionInfo(ConditionType.Filter, "Filter"));
if (SummaryConditions?.Any() == true)
conditions.AddRange(SummaryConditions);
}

void OnApplyClick() {
bool isValidCondition = selectedFilterCriteria is not null || selectedConditionType is not ConditionType.Filter;
var condition = conditions.FirstOrDefault(c => c.ConditionType == selectedConditionType);

if (condition is not null && currentColumnName is not null && isValidCondition) {
if (condition.ConditionType is ConditionType.Filter)
condition = new FilterConditionInfo(condition.ConditionName, selectedFilterCriteria!);

if (isNew) {
isNew = false;
if (Formats is not null) {
var format = new SimpleFormat(
currentColumnName,
condition,
FormatStyles.FirstOrDefault(fs => fs.FormatName == selectedFormatStyleName)
);
Formats.Add(format);
}
}
else {
var format = Formats?.FirstOrDefault(f => f.FormatId == currentFormatId);
if (format is not null) {
format.Condition = condition;
format.Style = FormatStyles.FirstOrDefault(fs => fs.FormatName == selectedFormatStyleName);
}
}
}

popupRef?.CloseAsync();
FormatsChanged.InvokeAsync();
}

private void OnCancelClick() {
popupRef?.CloseAsync();
}

private void OnDeleteClick() {
var format = Formats?.FirstOrDefault(f => f.FormatId == currentFormatId);
if (format is null || Formats is null) {
Console.WriteLine($"Could not find format with ID:{currentFormatId} in the Formats collection");
return;
}
Formats.Remove(format);
FormatsChanged.InvokeAsync();
popupRef?.CloseAsync();
}

public void AddNewFormat(string fieldName) {
var firstOrDefaultCondition = conditions.FirstOrDefault();
if (firstOrDefaultCondition is null) {
Console.WriteLine("No conditions available to show Format Selector");
return;
}

currentColumnName = fieldName;
currentFormatId = null;
isNew = true;
selectedConditionType = firstOrDefaultCondition.ConditionType;
selectedFilterCriteria = null;
selectedFormatStyleName = null;

StateHasChanged();
popupRef?.ShowAsync();
}

public void EditFormat(string formatId) {
var formatItem = Formats?.FirstOrDefault(f => f.FormatId == formatId);
if (formatItem is null) {
Console.WriteLine($"Could not find format with ID:{formatId} in the Formats collection");
return;
}

currentColumnName = formatItem.ColumnFieldName;
currentFormatId = formatId;
isNew = false;
selectedConditionType = formatItem.Condition.ConditionType;
if (formatItem.Condition is FilterConditionInfo filterInfo)
selectedFilterCriteria = filterInfo.FilterCriteria;
selectedFormatStyleName = formatItem.Style?.FormatName;

StateHasChanged();
popupRef?.ShowAsync();
}

public void ClearAllColumnFormats(string fieldName) {
Formats?.RemoveAll(f => f.ColumnFieldName == fieldName);
FormatsChanged.InvokeAsync();
}
}
Loading
Loading