From 24f72e19c91f5b1647e50c0548449cbf71edcee6 Mon Sep 17 00:00:00 2001 From: Johan Polak | Camas IT bv Date: Tue, 5 Dec 2023 08:45:47 +0100 Subject: [PATCH] Edit DataFilter; add param to show time in datefilter, separate code from razor component --- Radzen.Blazor/RadzenDataFilter.razor | 4 +- Radzen.Blazor/RadzenDataFilter.razor.cs | 7 + Radzen.Blazor/RadzenDataFilterItem.razor | 245 +----------------- Radzen.Blazor/RadzenDataFilterItem.razor.cs | 266 ++++++++++++++++++++ 4 files changed, 278 insertions(+), 244 deletions(-) create mode 100644 Radzen.Blazor/RadzenDataFilterItem.razor.cs diff --git a/Radzen.Blazor/RadzenDataFilter.razor b/Radzen.Blazor/RadzenDataFilter.razor index 72311ae165b..08f03012fd7 100644 --- a/Radzen.Blazor/RadzenDataFilter.razor +++ b/Radzen.Blazor/RadzenDataFilter.razor @@ -24,8 +24,8 @@ @foreach(var filter in Filters) {
  • - -
  • + + }
  • diff --git a/Radzen.Blazor/RadzenDataFilter.razor.cs b/Radzen.Blazor/RadzenDataFilter.razor.cs index 82ca68937fe..1f9d1bb4f62 100644 --- a/Radzen.Blazor/RadzenDataFilter.razor.cs +++ b/Radzen.Blazor/RadzenDataFilter.razor.cs @@ -338,6 +338,13 @@ internal async Task ChangeState() [Parameter] public string FilterDateFormat { get; set; } + /// + /// Gets or sets a value indicating whether the time part is shown in a date filter. + /// + /// true if time part is shown; otherwise, false. + [Parameter] + public bool FilterDateShowTime { get; set; } = true; + internal async Task AddFilter(bool isGroup) { if (UniqueFilters && properties.All(f => f.IsSelected)) diff --git a/Radzen.Blazor/RadzenDataFilterItem.razor b/Radzen.Blazor/RadzenDataFilterItem.razor index 49b49109868..c887d848e21 100644 --- a/Radzen.Blazor/RadzenDataFilterItem.razor +++ b/Radzen.Blazor/RadzenDataFilterItem.razor @@ -1,4 +1,5 @@ @typeparam TItem + @if (Filter.Filters != null) { @@ -59,8 +60,8 @@ else } else if (PropertyAccess.IsDate(property.FilterPropertyType)) { - InvokeAsync(ApplyFilter)) /> + InvokeAsync(ApplyFilter)) /> } else if (property.FilterPropertyType == typeof(bool) || property.FilterPropertyType == typeof(bool?)) { @@ -73,244 +74,4 @@ else } -} -@code { - [Parameter] - public RadzenDataFilter DataFilter { get; set; } - - [Parameter] - public RadzenDataFilterItem 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 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() - } - } - ); - } - 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 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 Create(object receiver, Action action) - { - return EventCallback.Factory.Create(receiver, action); - } - - public static Action Action(Action action) - { - return args => action(args); - } - } - - internal string getFilterDateFormat() - { - if (property != null && !string.IsNullOrEmpty(property.FormatString)) - { - return property.FormatString.Replace("{0:", "").Replace("}", ""); - } - - return DataFilter.FilterDateFormat; - } } \ No newline at end of file diff --git a/Radzen.Blazor/RadzenDataFilterItem.razor.cs b/Radzen.Blazor/RadzenDataFilterItem.razor.cs new file mode 100644 index 00000000000..ed2f8449d45 --- /dev/null +++ b/Radzen.Blazor/RadzenDataFilterItem.razor.cs @@ -0,0 +1,266 @@ +using Microsoft.AspNetCore.Components; +using System; +using System.Linq; +using System.Threading.Tasks; + +namespace Radzen.Blazor +{ + /// + /// RadzenDataFilterItem component. + /// + /// The type of the item. + public partial class RadzenDataFilterItem + { + /// + /// Gets or sets the DataFilter. + /// + /// The data filter. + [Parameter] + public RadzenDataFilter DataFilter { get; set; } + + /// + /// Gets or sets the parent DataFilterItem. + /// + /// The parent data filter item. + [Parameter] + public RadzenDataFilterItem Parent { get; set; } + + CompositeFilterDescriptor _filter; + + /// + /// Gets or sets the filter for this item. + /// + /// The filter for this item. + [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 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() + } + } + ); + } + 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 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 Create(object receiver, Action action) + { + return EventCallback.Factory.Create(receiver, action); + } + + public static Action Action(Action action) + { + return args => action(args); + } + } + + internal string getFilterDateFormat() + { + if (property != null && !string.IsNullOrEmpty(property.FormatString)) + { + return property.FormatString.Replace("{0:", "").Replace("}", ""); + } + + return DataFilter.FilterDateFormat; + } + } +}