Skip to content

Commit

Permalink
Edit DataFilter; add param to show time in datefilter, separate code …
Browse files Browse the repository at this point in the history
…from razor component
  • Loading branch information
Johan Polak | Camas IT bv authored and Johan Polak | Camas IT bv committed Dec 5, 2023
1 parent 9a6fd69 commit 24f72e1
Show file tree
Hide file tree
Showing 4 changed files with 278 additions and 244 deletions.
4 changes: 2 additions & 2 deletions Radzen.Blazor/RadzenDataFilter.razor
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,8 @@
@foreach(var filter in Filters)
{
<li class="rz-datafilter-item @(filter.Filters != null ? "rz-datafilter-group-item" : "")">
<RadzenDataFilterItem @key=@filter.GetHashCode() DataFilter="@this" Filter="@filter" />
</li>
<RadzenDataFilterItem @key=@filter.GetHashCode() DataFilter="@this" Filter="@filter" />
</li>
}
<li class="rz-datafilter-item rz-datafilter-bar">
<RadzenSplitButton Icon="add" Click="@(args => AddFilter(args?.Value == "group"))" Size="ButtonSize.Small" Variant="Variant.Flat" ButtonStyle="ButtonStyle.Primary" Shade="Shade.Lighter">
Expand Down
7 changes: 7 additions & 0 deletions Radzen.Blazor/RadzenDataFilter.razor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -338,6 +338,13 @@ internal async Task ChangeState()
[Parameter]
public string FilterDateFormat { get; set; }

/// <summary>
/// Gets or sets a value indicating whether the time part is shown in a date filter.
/// </summary>
/// <value><c>true</c> if time part is shown; otherwise, <c>false</c>.</value>
[Parameter]
public bool FilterDateShowTime { get; set; } = true;

internal async Task AddFilter(bool isGroup)
{
if (UniqueFilters && properties.All(f => f.IsSelected))
Expand Down
245 changes: 3 additions & 242 deletions Radzen.Blazor/RadzenDataFilterItem.razor
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
@typeparam TItem

@if (Filter.Filters != null)
{
<RadzenSelectBar @bind-Value=Filter.LogicalFilterOperator Change="@((LogicalFilterOperator args) => { InvokeAsync(ChangeState); InvokeAsync(ApplyFilter); })" Size="ButtonSize.Small">
Expand Down Expand Up @@ -59,8 +60,8 @@ else
}
else if (PropertyAccess.IsDate(property.FilterPropertyType))
{
<RadzenDatePicker Disabled="@IsOperatorNullOrEmpty()" @bind-Value=@Filter.FilterValue TValue="@object" ShowTime="true" class="rz-datafilter-editor"
ShowTimeOkButton="true" DateFormat="@getFilterDateFormat()" Change=@(args => InvokeAsync(ApplyFilter)) />
<RadzenDatePicker Disabled="@IsOperatorNullOrEmpty()" @bind-Value=@Filter.FilterValue TValue="@object" ShowTime="@DataFilter.FilterDateShowTime" class="rz-datafilter-editor"
ShowTimeOkButton="@DataFilter.FilterDateShowTime" DateFormat="@getFilterDateFormat()" Change=@(args => InvokeAsync(ApplyFilter)) />
}
else if (property.FilterPropertyType == typeof(bool) || property.FilterPropertyType == typeof(bool?))
{
Expand All @@ -73,244 +74,4 @@ else

<RadzenButton title="@DataFilter.RemoveFilterText" class="rz-datafilter-item-clear" Icon="clear" Click="@RemoveFilter" Variant="Variant.Text" Size="ButtonSize.Small" ButtonStyle="ButtonStyle.Dark"/>
}
}
@code {
[Parameter]
public RadzenDataFilter<TItem> DataFilter { get; set; }

[Parameter]
public RadzenDataFilterItem<TItem> Parent { get; set; }

CompositeFilterDescriptor _filter;
[Parameter]
public CompositeFilterDescriptor Filter
{
get
{
return _filter;
}
set
{
_filter = value;

if (property == null && Filter.Filters == null)
{
if (Filter.Property != null)
{
property = DataFilter?.properties.FirstOrDefault(f => object.Equals(f.Property, Filter.Property));
}
else if (property == null && DataFilter?.UniqueFilters == true)
{
property = DataFilter?.properties.FirstOrDefault(f => f.IsSelected == false);
}
else
{
property = DataFilter?.properties.FirstOrDefault();
}

if (property != null)
{
property.FilterValueChange -= OnFilterValueChange;
property.FilterValueChange += OnFilterValueChange;

if (DataFilter?.UniqueFilters == true)
{
property.IsSelected = true;
}

Filter.Property = property.Property;

if (!property.GetFilterOperators().Contains(Filter.FilterOperator))
{
Filter.FilterOperator = property.GetFilterOperators().FirstOrDefault();
}

var v = property.GetFilterValue();
if (v != null)
{
Filter.FilterValue = v;
}
}
}
}
}

void OnFilterValueChange(object value)
{
if (property != null)
{
Filter.FilterValue = property.GetFilterValue();
}
}

RadzenDataFilterProperty<TItem> property;

async Task ApplyFilter()
{
if (DataFilter.Auto)
{
await DataFilter.Filter();
}
}

async Task OnPropertyChange(object p)
{
property.FilterValueChange -= OnFilterValueChange;
property.IsSelected = false;

property = DataFilter.properties.Where(c => object.Equals(c.Property, p)).FirstOrDefault();

property.FilterValueChange += OnFilterValueChange;
if (DataFilter?.UniqueFilters == true)
{
property.IsSelected = true;
}
Filter.FilterValue = null;

var defaultOperator = typeof(System.Collections.IEnumerable).IsAssignableFrom(property.FilterPropertyType) ? FilterOperator.Contains : default(FilterOperator);

if (property.GetFilterOperators().Any(o => o == property.FilterOperator))
{
Filter.FilterOperator = property.FilterOperator;
}
else if (property.GetFilterOperators().Contains(defaultOperator))
{
Filter.FilterOperator = defaultOperator;
}
else
{
Filter.FilterOperator = property.GetFilterOperators().FirstOrDefault();
}

await ApplyFilter();
}

bool IsOperatorNullOrEmpty()
{
if (Filter != null)
{
return Filter.FilterOperator == FilterOperator.IsEmpty || Filter.FilterOperator == FilterOperator.IsNotEmpty ||
Filter.FilterOperator == FilterOperator.IsNull || Filter.FilterOperator == FilterOperator.IsNotNull;
}

return false;
}

async Task OnOperatorChange(object p)
{
if (IsOperatorNullOrEmpty())
{
Filter.FilterValue = null;
}

await ApplyFilter();
}

async Task AddFilter(bool isGroup)
{
if (DataFilter?.UniqueFilters == true && DataFilter.properties.All(f => f.IsSelected))
{
return;
}
if (isGroup)
{
Filter.Filters = Filter.Filters.Concat(new CompositeFilterDescriptor[]
{
new CompositeFilterDescriptor()
{
Filters = Enumerable.Empty<CompositeFilterDescriptor>()
}
}
);
}
else
{
Filter.Filters = Filter.Filters.Concat(new CompositeFilterDescriptor[] { new CompositeFilterDescriptor() });
}

if (DataFilter.Auto)
{
await DataFilter.Filter();
}
}

async Task RemoveFilter()
{
if (property != null)
{
property.IsSelected = false;
}
property = null;

if (Parent != null)
{
Parent.Filter.Filters = Parent.Filter.Filters.Where(f => f != Filter).ToList();
await Parent.ChangeState();
}
else
{
DataFilter.Filters = DataFilter.Filters.Where(f => f != Filter).ToList();
await DataFilter.ChangeState();
}

await ApplyFilter();
}

internal async Task ChangeState()
{
await InvokeAsync(StateHasChanged);
}

RenderFragment DrawNumericFilter()
{
return new RenderFragment(builder =>
{
var type = Nullable.GetUnderlyingType(property.FilterPropertyType) != null ?
property.FilterPropertyType : typeof(Nullable<>).MakeGenericType(property.FilterPropertyType);

var numericType = typeof(RadzenNumeric<>).MakeGenericType(type);

builder.OpenComponent(0, numericType);

builder.AddAttribute(1, "Value", Filter.FilterValue);
builder.AddAttribute(2, "class", "rz-datafilter-editor");
builder.AddAttribute(3, "Disabled", IsOperatorNullOrEmpty());

Action<object> action = args =>
{
Filter.FilterValue = args; InvokeAsync(ApplyFilter);
};

var eventCallbackGenericCreate = typeof(NumericFilterEventCallback).GetMethod("Create").MakeGenericMethod(type);
var eventCallbackGenericAction = typeof(NumericFilterEventCallback).GetMethod("Action").MakeGenericMethod(type);

builder.AddAttribute(3, "Change", eventCallbackGenericCreate.Invoke(this,
new object[] { this, eventCallbackGenericAction.Invoke(this, new object[] { action }) }));

builder.CloseComponent();
});
}

internal class NumericFilterEventCallback
{
public static EventCallback<T> Create<T>(object receiver, Action<T> action)
{
return EventCallback.Factory.Create<T>(receiver, action);
}

public static Action<T> Action<T>(Action<object> action)
{
return args => action(args);
}
}

internal string getFilterDateFormat()
{
if (property != null && !string.IsNullOrEmpty(property.FormatString))
{
return property.FormatString.Replace("{0:", "").Replace("}", "");
}

return DataFilter.FilterDateFormat;
}
}
Loading

0 comments on commit 24f72e1

Please sign in to comment.