From fe92f0675072be058d82db3b687029a57eaa0cb8 Mon Sep 17 00:00:00 2001 From: okankocyigit Date: Mon, 20 Mar 2017 12:20:11 +0300 Subject: [PATCH 1/5] fix unnecessary query prefix for engine --- MVCGrid/Web/QueryStringParser.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MVCGrid/Web/QueryStringParser.cs b/MVCGrid/Web/QueryStringParser.cs index 7a8c3dc..930ebf5 100644 --- a/MVCGrid/Web/QueryStringParser.cs +++ b/MVCGrid/Web/QueryStringParser.cs @@ -26,7 +26,7 @@ public static QueryOptions ParseOptions(IMVCGridDefinition grid, HttpRequest htt string qsKeyPage = grid.QueryStringPrefix + QueryStringSuffix_Page; string qsKeySort = grid.QueryStringPrefix + QueryStringSuffix_Sort; string qsKeyDirection = grid.QueryStringPrefix + QueryStringSuffix_SortDir; - string qsKeyEngine = grid.QueryStringPrefix + QueryStringSuffix_Engine; + string qsKeyEngine = QueryStringSuffix_Engine; string qsKeyPageSize = grid.QueryStringPrefix + QueryStringSuffix_ItemsPerPage; string qsColumns = grid.QueryStringPrefix + QueryStringSuffix_Columns; From e7fdaf56734594531d5d146592455c5a7c356745 Mon Sep 17 00:00:00 2001 From: okankocyigit Date: Thu, 25 May 2017 11:49:50 +0300 Subject: [PATCH 2/5] dynamic header text --- MVCGrid/Engine/GridEngine.cs | 4 ++-- MVCGrid/Interfaces/IMVCGridColumn.cs | 1 + MVCGrid/Models/ColumnDefaults.cs | 2 ++ MVCGrid/Models/GridColumn.cs | 2 ++ MVCGrid/Models/GridColumnBuilder.cs | 6 ++++++ MVCGridExample/Content/MVCGridConfig.txt | 17 ++++++++++------- 6 files changed, 23 insertions(+), 9 deletions(-) diff --git a/MVCGrid/Engine/GridEngine.cs b/MVCGrid/Engine/GridEngine.cs index e5892f5..eb2bde8 100644 --- a/MVCGrid/Engine/GridEngine.cs +++ b/MVCGrid/Engine/GridEngine.cs @@ -122,7 +122,7 @@ private RenderingModel PrepModel(int? totalRecords, List rows, Models.GridC model.PagingModel.TotalRecords = totalRecords.Value; model.PagingModel.FirstRecord = (currentPageIndex * gridContext.QueryOptions.ItemsPerPage.Value) + 1; - if(model.PagingModel.FirstRecord > model.PagingModel.TotalRecords) + if (model.PagingModel.FirstRecord > model.PagingModel.TotalRecords) { model.PagingModel.FirstRecord = model.PagingModel.TotalRecords; } @@ -154,7 +154,7 @@ private void PrepColumns(Models.GridContext gridContext, RenderingModel model) Column renderingColumn = new Column(); model.Columns.Add(renderingColumn); renderingColumn.Name = col.ColumnName; - renderingColumn.HeaderText = col.HeaderText; + renderingColumn.HeaderText = col.HeaderTextExpression != null ? col.HeaderTextExpression() : col.HeaderText; if (gridContext.GridDefinition.Sorting && col.EnableSorting) { diff --git a/MVCGrid/Interfaces/IMVCGridColumn.cs b/MVCGrid/Interfaces/IMVCGridColumn.cs index 2c25a3b..1134557 100644 --- a/MVCGrid/Interfaces/IMVCGridColumn.cs +++ b/MVCGrid/Interfaces/IMVCGridColumn.cs @@ -12,6 +12,7 @@ public interface IMVCGridColumn /// Header text to display for the current column, if different from ColumnName. /// string HeaderText { get; } + Func HeaderTextExpression { get; } /// /// A unique name for this column diff --git a/MVCGrid/Models/ColumnDefaults.cs b/MVCGrid/Models/ColumnDefaults.cs index c8b57f7..d02a7fe 100644 --- a/MVCGrid/Models/ColumnDefaults.cs +++ b/MVCGrid/Models/ColumnDefaults.cs @@ -18,10 +18,12 @@ public ColumnDefaults() Visible = true; SortColumnData = null; AllowChangeVisibility = false; + HeaderTextExpression = null; } public string ColumnName { get; set; } public string HeaderText { get; set; } + public Func HeaderTextExpression { get; set; } public bool EnableSorting { get; set; } public bool HtmlEncode { get; set; } public bool EnableFiltering { get; set; } diff --git a/MVCGrid/Models/GridColumn.cs b/MVCGrid/Models/GridColumn.cs index 2243a70..8c50b1b 100644 --- a/MVCGrid/Models/GridColumn.cs +++ b/MVCGrid/Models/GridColumn.cs @@ -75,6 +75,8 @@ public string HeaderText } } + public Func HeaderTextExpression { get; set; } + /// /// Template for formatting cell value /// diff --git a/MVCGrid/Models/GridColumnBuilder.cs b/MVCGrid/Models/GridColumnBuilder.cs index e0d3d58..fffcbcc 100644 --- a/MVCGrid/Models/GridColumnBuilder.cs +++ b/MVCGrid/Models/GridColumnBuilder.cs @@ -102,6 +102,12 @@ public GridColumnBuilder WithHeaderText(string text) return this; } + public GridColumnBuilder WithHeaderTextExpression(Func expression) + { + GridColumn.HeaderTextExpression = expression; + return this; + } + /// /// Enables sorting on this column diff --git a/MVCGridExample/Content/MVCGridConfig.txt b/MVCGridExample/Content/MVCGridConfig.txt index cc5093b..f700c33 100644 --- a/MVCGridExample/Content/MVCGridConfig.txt +++ b/MVCGridExample/Content/MVCGridConfig.txt @@ -28,6 +28,7 @@ namespace MVCGridExample .AddColumns(cols => { cols.Add("Id").WithValueExpression((p, c) => c.UrlHelper.Action("detail", "demo", new { id = p.Id })) + .WithHeaderTextExpression(() => new Random().Next().ToString()) .WithValueTemplate("{Model.Id}", false) .WithPlainTextValueExpression(p => p.Id.ToString()); cols.Add("FirstName").WithHeaderText("First Name") @@ -60,17 +61,19 @@ namespace MVCGridExample //.WithAdditionalSetting(MVCGrid.Rendering.BootstrapRenderingEngine.SettingNameTableClass, "notreal") // Example of changing table css class .WithRetrieveDataMethod((context) => { - var options = context.QueryOptions; + //var options = context.QueryOptions; - int totalRecords; - var repo = DependencyResolver.Current.GetService(); + int totalRecords = 100; + //var repo = DependencyResolver.Current.GetService(); - string globalSearch = options.GetAdditionalQueryOptionString("search"); + //string globalSearch = options.GetAdditionalQueryOptionString("search"); - string sortColumn = options.GetSortColumnData(); + //string sortColumn = options.GetSortColumnData(); - var items = repo.GetData(out totalRecords, globalSearch, options.GetLimitOffset(), options.GetLimitRowcount(), - sortColumn, options.SortDirection == SortDirection.Dsc); + //var items = repo.GetData(out totalRecords, globalSearch, options.GetLimitOffset(), options.GetLimitRowcount(), + // sortColumn, options.SortDirection == SortDirection.Dsc); + + var items = new List() { new Person() { FirstName = "Okan" } }; return new QueryResult() { From 51f034121a000187c7f5a41e1da80c7d6a56d9f9 Mon Sep 17 00:00:00 2001 From: okankocyigit Date: Thu, 25 May 2017 12:01:14 +0300 Subject: [PATCH 3/5] rebuild --- MVCGridExample/Content/MVCGridConfig.txt | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/MVCGridExample/Content/MVCGridConfig.txt b/MVCGridExample/Content/MVCGridConfig.txt index f700c33..cc5093b 100644 --- a/MVCGridExample/Content/MVCGridConfig.txt +++ b/MVCGridExample/Content/MVCGridConfig.txt @@ -28,7 +28,6 @@ namespace MVCGridExample .AddColumns(cols => { cols.Add("Id").WithValueExpression((p, c) => c.UrlHelper.Action("detail", "demo", new { id = p.Id })) - .WithHeaderTextExpression(() => new Random().Next().ToString()) .WithValueTemplate("{Model.Id}", false) .WithPlainTextValueExpression(p => p.Id.ToString()); cols.Add("FirstName").WithHeaderText("First Name") @@ -61,19 +60,17 @@ namespace MVCGridExample //.WithAdditionalSetting(MVCGrid.Rendering.BootstrapRenderingEngine.SettingNameTableClass, "notreal") // Example of changing table css class .WithRetrieveDataMethod((context) => { - //var options = context.QueryOptions; - - int totalRecords = 100; - //var repo = DependencyResolver.Current.GetService(); + var options = context.QueryOptions; - //string globalSearch = options.GetAdditionalQueryOptionString("search"); + int totalRecords; + var repo = DependencyResolver.Current.GetService(); - //string sortColumn = options.GetSortColumnData(); + string globalSearch = options.GetAdditionalQueryOptionString("search"); - //var items = repo.GetData(out totalRecords, globalSearch, options.GetLimitOffset(), options.GetLimitRowcount(), - // sortColumn, options.SortDirection == SortDirection.Dsc); + string sortColumn = options.GetSortColumnData(); - var items = new List() { new Person() { FirstName = "Okan" } }; + var items = repo.GetData(out totalRecords, globalSearch, options.GetLimitOffset(), options.GetLimitRowcount(), + sortColumn, options.SortDirection == SortDirection.Dsc); return new QueryResult() { From 09b488456e4440163873c1dc3d7f8e0899c02f70 Mon Sep 17 00:00:00 2001 From: okankocyigit Date: Wed, 4 Oct 2017 17:30:57 +0300 Subject: [PATCH 4/5] localization expressions added --- MVCGrid/Engine/GridEngine.cs | 10 +++--- MVCGrid/Interfaces/IMVCGridDefinition.cs | 19 ++++++++++++ MVCGrid/Models/GridDefaults.cs | 11 ++++++- MVCGrid/Models/GridDefinition.cs | 13 ++++++++ MVCGrid/Models/MVCGridBuilder.cs | 32 ++++++++++++++++++++ MVCGrid/Web/MVCGridHtmlGenerator.cs | 4 +-- MVCGridExample/Controllers/TestController.cs | 1 + 7 files changed, 82 insertions(+), 8 deletions(-) diff --git a/MVCGrid/Engine/GridEngine.cs b/MVCGrid/Engine/GridEngine.cs index eb2bde8..3c976a6 100644 --- a/MVCGrid/Engine/GridEngine.cs +++ b/MVCGrid/Engine/GridEngine.cs @@ -104,13 +104,13 @@ private RenderingModel PrepModel(int? totalRecords, List rows, Models.GridC if (model.Rows.Count == 0) { - model.NoResultsMessage = gridContext.GridDefinition.NoResultsMessage; + model.NoResultsMessage = gridContext.GridDefinition.NoResultsMessageExpression != null ? gridContext.GridDefinition.NoResultsMessageExpression() : gridContext.GridDefinition.NoResultsMessage; } - model.NextButtonCaption = gridContext.GridDefinition.NextButtonCaption; - model.PreviousButtonCaption = gridContext.GridDefinition.PreviousButtonCaption; - model.SummaryMessage = gridContext.GridDefinition.SummaryMessage; - model.ProcessingMessage = gridContext.GridDefinition.ProcessingMessage; + model.NextButtonCaption = gridContext.GridDefinition.NextButtonCaptionExpression != null ? gridContext.GridDefinition.NextButtonCaptionExpression() : gridContext.GridDefinition.NextButtonCaption; + model.PreviousButtonCaption = gridContext.GridDefinition.PreviousButtonCaptionExpression != null ? gridContext.GridDefinition.PreviousButtonCaptionExpression() : gridContext.GridDefinition.PreviousButtonCaption; + model.SummaryMessage = gridContext.GridDefinition.SummaryMessageExpression != null ? gridContext.GridDefinition.SummaryMessageExpression() : gridContext.GridDefinition.SummaryMessage; + model.ProcessingMessage = gridContext.GridDefinition.ProcessingMessageExpression != null ? gridContext.GridDefinition.ProcessingMessageExpression() : gridContext.GridDefinition.ProcessingMessage; model.PagingModel = null; if (gridContext.QueryOptions.ItemsPerPage.HasValue) diff --git a/MVCGrid/Interfaces/IMVCGridDefinition.cs b/MVCGrid/Interfaces/IMVCGridDefinition.cs index d82a7b8..12bf3c6 100644 --- a/MVCGrid/Interfaces/IMVCGridDefinition.cs +++ b/MVCGrid/Interfaces/IMVCGridDefinition.cs @@ -57,26 +57,45 @@ public interface IMVCGridDefinition /// string NoResultsMessage { get; set; } + /// + /// Text to display when there are no results with expression + /// + Func NoResultsMessageExpression { get; set; } + /// /// Text to display on the "next" button /// string NextButtonCaption { get; set; } + /// + /// Text to display on the "next" button + /// + Func NextButtonCaptionExpression { get; set; } + /// /// Text to display on the "previous" button /// string PreviousButtonCaption { get; set; } + Func PreviousButtonCaptionExpression { get; set; } + /// /// Summary text to display in grid footer /// string SummaryMessage { get; set; } + /// + /// Summary text to display in grid footer + /// + Func SummaryMessageExpression { get; set; } + /// /// Text to display when query is processed /// string ProcessingMessage { get; set; } + Func ProcessingMessageExpression { get; set; } + /// /// Name of function to call before ajax call begins /// diff --git a/MVCGrid/Models/GridDefaults.cs b/MVCGrid/Models/GridDefaults.cs index 9052315..7c50335 100644 --- a/MVCGrid/Models/GridDefaults.cs +++ b/MVCGrid/Models/GridDefaults.cs @@ -19,10 +19,15 @@ public GridDefaults() DefaultSortColumn = null; DefaultSortDirection = SortDirection.Unspecified; NoResultsMessage = "No results."; + NoResultsMessageExpression = null; + SummaryMessageExpression = null; NextButtonCaption = "Next"; + NextButtonCaptionExpression = null; PreviousButtonCaption = "Previous"; + PreviousButtonCaptionExpression = null; SummaryMessage = "Showing {0} to {1} of {2} entries"; ProcessingMessage = "Processing"; + ProcessingMessageExpression = null; ClientSideLoadingMessageFunctionName = null; ClientSideLoadingCompleteFunctionName = null; Filtering = false; @@ -54,11 +59,15 @@ public GridDefaults() public SortDirection DefaultSortDirection { get; set; } public string NoResultsMessage { get; set; } + public Func NoResultsMessageExpression { get; set; } public string NextButtonCaption { get; set; } + public Func NextButtonCaptionExpression { get; set; } public string PreviousButtonCaption { get; set; } + public Func PreviousButtonCaptionExpression { get; set; } public string SummaryMessage { get; set; } + public Func SummaryMessageExpression { get; set; } public string ProcessingMessage { get; set; } - + public Func ProcessingMessageExpression { get; set; } public string ClientSideLoadingMessageFunctionName { get; set; } public string ClientSideLoadingCompleteFunctionName { get; set; } public bool Filtering { get; set; } diff --git a/MVCGrid/Models/GridDefinition.cs b/MVCGrid/Models/GridDefinition.cs index 09dd8bb..50b528e 100644 --- a/MVCGrid/Models/GridDefinition.cs +++ b/MVCGrid/Models/GridDefinition.cs @@ -258,26 +258,39 @@ internal override List GetData(GridContext context, out int? totalRecords) /// public string NoResultsMessage { get; set; } + /// + /// Text to display when there are no results with expression. + /// + public Func NoResultsMessageExpression { get; set; } + /// /// Text to display on the "next" button. /// public string NextButtonCaption { get; set; } + public Func NextButtonCaptionExpression { get; set; } + /// /// Text to display on the "previous" button. /// public string PreviousButtonCaption { get; set; } + public Func PreviousButtonCaptionExpression { get; set; } + /// /// Summary text to display in grid footer /// public string SummaryMessage { get; set; } + public Func SummaryMessageExpression { get; set; } + /// /// Text to display when query is processed /// public string ProcessingMessage { get; set; } + public Func ProcessingMessageExpression { get; set; } + /// /// Name of function to call before ajax call begins /// diff --git a/MVCGrid/Models/MVCGridBuilder.cs b/MVCGrid/Models/MVCGridBuilder.cs index e623ef0..f5b49e1 100644 --- a/MVCGrid/Models/MVCGridBuilder.cs +++ b/MVCGrid/Models/MVCGridBuilder.cs @@ -224,6 +224,38 @@ public MVCGridBuilder WithNoResultsMessage(string noResultsMessage) return this; } + /// + /// Text to display when there are no results with expression + /// + public MVCGridBuilder WithNoResultsMessageExpression(Func expression) + { + GridDefinition.NoResultsMessageExpression = expression; + return this; + } + + public MVCGridBuilder WithNextButtonCaptionExpression(Func expression) + { + GridDefinition.NextButtonCaptionExpression = expression; + return this; + } + + public MVCGridBuilder WithPreviousButtonCaptionExpression(Func expression) + { + GridDefinition.PreviousButtonCaptionExpression = expression; + return this; + } + + public MVCGridBuilder WithSummaryMessageExpression(Func expression) + { + GridDefinition.SummaryMessageExpression = expression; + return this; + } + + public MVCGridBuilder WithProcessingMessageExpression(Func expression) + { + GridDefinition.ProcessingMessageExpression = expression; + return this; + } /// /// Name of function to call before ajax call begins /// diff --git a/MVCGrid/Web/MVCGridHtmlGenerator.cs b/MVCGrid/Web/MVCGridHtmlGenerator.cs index 4f5096d..733673d 100644 --- a/MVCGrid/Web/MVCGridHtmlGenerator.cs +++ b/MVCGrid/Web/MVCGridHtmlGenerator.cs @@ -158,8 +158,8 @@ internal static string GenerateBasePageHtml(string gridName, IMVCGridDefinition if (renderLoadingDiv) { sbHtml.AppendFormat(""); } diff --git a/MVCGridExample/Controllers/TestController.cs b/MVCGridExample/Controllers/TestController.cs index 1e01307..8effb7d 100644 --- a/MVCGridExample/Controllers/TestController.cs +++ b/MVCGridExample/Controllers/TestController.cs @@ -45,6 +45,7 @@ public override void RegisterGrids() .WithAllowChangingPageSize(false) .WithFiltering(true) .WithNoResultsMessage("Please enter a year to search for. No results found.") + .WithNoResultsMessageExpression(() => "beişey") .AddColumns(cols => { cols.Add("Year").WithHeaderText("Year") From 9d012f8c103bd1b2dc48d76e2898d065b114d1eb Mon Sep 17 00:00:00 2001 From: okankocyigit Date: Wed, 24 Jan 2018 17:30:11 +0300 Subject: [PATCH 5/5] null check for page parameters, this allow nullable page parameters --- MVCGrid/Engine/GridEngine.cs | 5 ++++- MVCGrid/Web/MVCGridHtmlGenerator.cs | 6 +++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/MVCGrid/Engine/GridEngine.cs b/MVCGrid/Engine/GridEngine.cs index 3c976a6..b7bf31d 100644 --- a/MVCGrid/Engine/GridEngine.cs +++ b/MVCGrid/Engine/GridEngine.cs @@ -261,7 +261,10 @@ private static string RenderPreloadedGridHtml(HtmlHelper helper, IMVCGridDefinit foreach (PropertyDescriptor descriptor in TypeDescriptor.GetProperties(pageParameters)) { object obj2 = descriptor.GetValue(pageParameters); - pageParamsDict.Add(descriptor.Name, obj2.ToString()); + if (obj2 != null) + { + pageParamsDict.Add(descriptor.Name, obj2.ToString()); + } } } if (grid.PageParameterNames.Count > 0) diff --git a/MVCGrid/Web/MVCGridHtmlGenerator.cs b/MVCGrid/Web/MVCGridHtmlGenerator.cs index 733673d..a29567c 100644 --- a/MVCGrid/Web/MVCGridHtmlGenerator.cs +++ b/MVCGrid/Web/MVCGridHtmlGenerator.cs @@ -182,12 +182,16 @@ private static string GenerateJsonPageParameters(object pageParameters) foreach (PropertyDescriptor descriptor in TypeDescriptor.GetProperties(pageParameters)) { object obj2 = descriptor.GetValue(pageParameters); - pageParamsDict.Add(descriptor.Name, obj2.ToString()); + if (obj2 != null) + { + pageParamsDict.Add(descriptor.Name, obj2.ToString()); + } } } foreach (var col in pageParamsDict) { + string val = col.Value; if (sb.Length > 0)