diff --git a/Mimeo.DynamicUI.Blazor.Tests/Mimeo.DynamicUI.Blazor.Tests.csproj b/Mimeo.DynamicUI.Blazor.Tests/Mimeo.DynamicUI.Blazor.Tests.csproj index f8d2c2f..2aa81d2 100644 --- a/Mimeo.DynamicUI.Blazor.Tests/Mimeo.DynamicUI.Blazor.Tests.csproj +++ b/Mimeo.DynamicUI.Blazor.Tests/Mimeo.DynamicUI.Blazor.Tests.csproj @@ -10,13 +10,13 @@ - + runtime; build; native; contentfiles; analyzers; buildtransitive all - + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/Mimeo.DynamicUI.Blazor/Controls/CustomRadzenDataGrid.razor b/Mimeo.DynamicUI.Blazor/Controls/CustomRadzenDataGrid.razor index c631a1b..e1717de 100644 --- a/Mimeo.DynamicUI.Blazor/Controls/CustomRadzenDataGrid.razor +++ b/Mimeo.DynamicUI.Blazor/Controls/CustomRadzenDataGrid.razor @@ -1,4 +1,4 @@ -@typeparam TItem +@typeparam TItem where TItem : notnull @inherits RadzenDataGrid @inject TaskRunningService taskRunningService diff --git a/Mimeo.DynamicUI.Blazor/Extensions/RadzenLoadDataArgsExtensions.cs b/Mimeo.DynamicUI.Blazor/Extensions/RadzenLoadDataArgsExtensions.cs index c2e6ba5..c91e5a6 100644 --- a/Mimeo.DynamicUI.Blazor/Extensions/RadzenLoadDataArgsExtensions.cs +++ b/Mimeo.DynamicUI.Blazor/Extensions/RadzenLoadDataArgsExtensions.cs @@ -14,6 +14,11 @@ public static DataQuery ToODataQuery(this LoadDataArgs args, ViewModel viewModel }; foreach (var filter in args.Filters ?? []) { + if (string.IsNullOrEmpty(filter.Property)) + { + continue; + } + var formFieldDefinition = viewModel.GetListForm().Values.SingleOrDefault(f => f.PropertyName == filter.Property); if (formFieldDefinition == null) { @@ -32,6 +37,11 @@ public static DataQuery ToODataQuery(this LoadDataArgs args, ViewModel viewModel } foreach (var sort in args.Sorts ?? []) { + if (string.IsNullOrEmpty(sort.Property)) + { + continue; + } + var formFieldDefinition = viewModel.GetListForm().Values.SingleOrDefault(f => f.PropertyName == sort.Property); if (formFieldDefinition == null) { @@ -69,6 +79,11 @@ FormFieldDefinition getFormField(string propertyName, object? filterValue) }; foreach (var filter in args.Filters ?? []) { + if (string.IsNullOrEmpty(filter.Property)) + { + continue; + } + if (filter.FilterValue != null) { query.Filters.Add(new DataQueryFilter(new DataFieldDefinition(getFormField(filter.Property, filter.FilterValue)), ToDataFilterOperator(filter.FilterOperator), filter.FilterValue)); @@ -81,6 +96,11 @@ FormFieldDefinition getFormField(string propertyName, object? filterValue) foreach (var sort in args.Sorts ?? []) { + if (string.IsNullOrEmpty(sort.Property)) + { + continue; + } + query.Sorts.Add(new DataQuerySort(new DataFieldDefinition(getFormField(sort.Property, null)), sort.SortOrder == SortOrder.Descending)); } return query; diff --git a/Mimeo.DynamicUI.Blazor/Forms/CustomRadzenDataGridColumn.cs b/Mimeo.DynamicUI.Blazor/Forms/CustomRadzenDataGridColumn.cs index 7d3feae..212dde9 100644 --- a/Mimeo.DynamicUI.Blazor/Forms/CustomRadzenDataGridColumn.cs +++ b/Mimeo.DynamicUI.Blazor/Forms/CustomRadzenDataGridColumn.cs @@ -3,7 +3,7 @@ namespace Mimeo.DynamicUI.Blazor.Forms; -public class CustomRadzenDataGridColumn : RadzenDataGridColumn +public class CustomRadzenDataGridColumn : RadzenDataGridColumn where TItem : notnull { private static readonly IReadOnlyDictionary DataFilterOperators = new Dictionary { @@ -23,7 +23,7 @@ public class CustomRadzenDataGridColumn : RadzenDataGridColumn {FilterOperator.IsNotEmpty, "ne"} }; - protected override string GetColumnODataFilter(object filterValue, FilterOperator filterOperator) + protected override string GetColumnODataFilter(object? filterValue, FilterOperator filterOperator) { var odataOperator = DataFilterOperators[filterOperator]; var property = GetFilterProperty().Replace('.', '/'); diff --git a/Mimeo.DynamicUI.Blazor/Forms/DataFilter/DataFilterField.razor b/Mimeo.DynamicUI.Blazor/Forms/DataFilter/DataFilterField.razor index 82bffd5..a389f85 100644 --- a/Mimeo.DynamicUI.Blazor/Forms/DataFilter/DataFilterField.razor +++ b/Mimeo.DynamicUI.Blazor/Forms/DataFilter/DataFilterField.razor @@ -1,5 +1,4 @@ @using Mimeo.DynamicUI.Blazor.Extensions -@using Radzen.Blazor.Rendering
- \ No newline at end of file + \ No newline at end of file diff --git a/Mimeo.DynamicUI.Blazor/Forms/DataFilter/DataFilterField.razor.cs b/Mimeo.DynamicUI.Blazor/Forms/DataFilter/DataFilterField.razor.cs index 0e3f492..25e904b 100644 --- a/Mimeo.DynamicUI.Blazor/Forms/DataFilter/DataFilterField.razor.cs +++ b/Mimeo.DynamicUI.Blazor/Forms/DataFilter/DataFilterField.razor.cs @@ -3,14 +3,14 @@ using Mimeo.DynamicUI.Blazor.Extensions; using Mimeo.DynamicUI.Data; using Mimeo.DynamicUI.Data.OData; -using Radzen.Blazor.Rendering; +using Radzen.Blazor; namespace Mimeo.DynamicUI.Blazor.Forms.DataFilter { public partial class DataFilterField { private ElementReference _customSplitButton; - private Popup? _popup; + private RadzenPopup? _popup; private IEnumerable? _filterOperators; [Parameter] diff --git a/Mimeo.DynamicUI.Blazor/Forms/ODataGrid.razor b/Mimeo.DynamicUI.Blazor/Forms/ODataGrid.razor index d242a5c..8aa69ac 100644 --- a/Mimeo.DynamicUI.Blazor/Forms/ODataGrid.razor +++ b/Mimeo.DynamicUI.Blazor/Forms/ODataGrid.razor @@ -29,7 +29,14 @@ @if (SupportsSearchText) { - + @if (SupportsSearchAutoComplete) + { + + } + else + { + + } } (Service?.SupportsDelete ?? false) && AllowDelete; private bool CanView => (Service?.SupportsView ?? false) && AllowView; private bool SupportsSearchText => Service?.SupportsSearchText ?? false; + private bool SupportsSearchAutoComplete => Service?.SupportsSearchAutoComplete ?? false; private RadzenDataGrid? gridRef; private bool IsSmall; @@ -213,18 +214,28 @@ private async Task LoadData(LoadDataArgs args) } // Work around Radzen bug where it's not thread safe - args.Filters = args.Filters.ToList(); - args.Sorts = args.Sorts.ToList(); + args.Filters = args.Filters?.ToList() ?? []; + args.Sorts = args.Sorts?.ToList() ?? []; // The GridItem class is private to this control // Filters and sorts will be on a GridItem property, // but we need to feed the actual property to ListMethod() foreach (var filter in args.Filters) { + if (string.IsNullOrEmpty(filter.Property)) + { + continue; + } + filter.Property = filter.Property.Replace($"{nameof(GridItem.ListModel)}.", "").Replace($"{nameof(GridItem.ListModel)}/", ""); } foreach (var orderBy in args.Sorts) { + if (string.IsNullOrEmpty(orderBy.Property)) + { + continue; + } + orderBy.Property = orderBy.Property.Replace($"{nameof(GridItem.ListModel)}.", "").Replace($"{nameof(GridItem.ListModel)}/", ""); } searchModel ??= await taskRunningService.Run(() => Service.GetSearchModel()); diff --git a/Mimeo.DynamicUI.Blazor/Mimeo.DynamicUI.Blazor.csproj b/Mimeo.DynamicUI.Blazor/Mimeo.DynamicUI.Blazor.csproj index 8f148dd..c3f2ac0 100644 --- a/Mimeo.DynamicUI.Blazor/Mimeo.DynamicUI.Blazor.csproj +++ b/Mimeo.DynamicUI.Blazor/Mimeo.DynamicUI.Blazor.csproj @@ -1,7 +1,7 @@ - net8.0;net10.0 + net10.0 enable enable README.md @@ -20,25 +20,15 @@
- + - - - - - - - - - - - - - - - - + + + + + + diff --git a/Mimeo.DynamicUI.Demo/Mimeo.DynamicUI.Demo.Client/Mimeo.DynamicUI.Demo.Client.csproj b/Mimeo.DynamicUI.Demo/Mimeo.DynamicUI.Demo.Client/Mimeo.DynamicUI.Demo.Client.csproj index 5cfe73c..463e700 100644 --- a/Mimeo.DynamicUI.Demo/Mimeo.DynamicUI.Demo.Client/Mimeo.DynamicUI.Demo.Client.csproj +++ b/Mimeo.DynamicUI.Demo/Mimeo.DynamicUI.Demo.Client/Mimeo.DynamicUI.Demo.Client.csproj @@ -9,9 +9,9 @@ - - - + + + diff --git a/Mimeo.DynamicUI.Demo/Mimeo.DynamicUI.Demo.Client/Services/TestDataService.cs b/Mimeo.DynamicUI.Demo/Mimeo.DynamicUI.Demo.Client/Services/TestDataService.cs index 2196a1a..85f9e87 100644 --- a/Mimeo.DynamicUI.Demo/Mimeo.DynamicUI.Demo.Client/Services/TestDataService.cs +++ b/Mimeo.DynamicUI.Demo/Mimeo.DynamicUI.Demo.Client/Services/TestDataService.cs @@ -32,6 +32,8 @@ public TestDataService(HttpClient httpClient, ODataExpressionGenerator oDataExpr public bool SupportsSearchText => true; + public bool SupportsSearchAutoComplete => true; + public async Task> GetModels(DataQuery args) { var apiUrl = $"{this.apiUrl}/Test"; diff --git a/Mimeo.DynamicUI.Demo/Mimeo.DynamicUI.Demo.Server/Mimeo.DynamicUI.Demo.Server.csproj b/Mimeo.DynamicUI.Demo/Mimeo.DynamicUI.Demo.Server/Mimeo.DynamicUI.Demo.Server.csproj index 7cd3251..4ac5852 100644 --- a/Mimeo.DynamicUI.Demo/Mimeo.DynamicUI.Demo.Server/Mimeo.DynamicUI.Demo.Server.csproj +++ b/Mimeo.DynamicUI.Demo/Mimeo.DynamicUI.Demo.Server/Mimeo.DynamicUI.Demo.Server.csproj @@ -9,8 +9,8 @@ - - + + diff --git a/Mimeo.DynamicUI.Tests/Mimeo.DynamicUI.Tests.csproj b/Mimeo.DynamicUI.Tests/Mimeo.DynamicUI.Tests.csproj index 58c93f6..08016c4 100644 --- a/Mimeo.DynamicUI.Tests/Mimeo.DynamicUI.Tests.csproj +++ b/Mimeo.DynamicUI.Tests/Mimeo.DynamicUI.Tests.csproj @@ -10,15 +10,15 @@ - - + + runtime; build; native; contentfiles; analyzers; buildtransitive all - + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/Mimeo.DynamicUI/Data/IDataService.cs b/Mimeo.DynamicUI/Data/IDataService.cs index 4eba5f7..cd462b9 100644 --- a/Mimeo.DynamicUI/Data/IDataService.cs +++ b/Mimeo.DynamicUI/Data/IDataService.cs @@ -4,6 +4,8 @@ public interface IReadOnlyDataService { bool SupportsView { get; } bool SupportsSearchText { get; } + public bool SupportsSearchAutoComplete => SupportsSearchText; + Task> GetModels(DataQuery args); Task GetNewListModel(); diff --git a/Mimeo.DynamicUI/Mimeo.DynamicUI.csproj b/Mimeo.DynamicUI/Mimeo.DynamicUI.csproj index 072ee3d..97cd04b 100644 --- a/Mimeo.DynamicUI/Mimeo.DynamicUI.csproj +++ b/Mimeo.DynamicUI/Mimeo.DynamicUI.csproj @@ -17,7 +17,7 @@ - +