From d01434c8330a4d5c8894ee6f5455fa569463ebff Mon Sep 17 00:00:00 2001 From: John Cardinal Date: Wed, 15 Jan 2020 00:42:35 +0000 Subject: [PATCH] --- .../core-display-format-template-system.txt | 11 ++-- devdocs/todo.txt | 2 +- server/AyaNova/biz/WidgetBiz.cs | 66 +++++++++---------- 3 files changed, 38 insertions(+), 41 deletions(-) diff --git a/devdocs/specs/core-display-format-template-system.txt b/devdocs/specs/core-display-format-template-system.txt index bbf69921..6f479a57 100644 --- a/devdocs/specs/core-display-format-template-system.txt +++ b/devdocs/specs/core-display-format-template-system.txt @@ -2,11 +2,12 @@ DISPLAY FORMAT TEMPLATE SYSTEM SPECS OVERVIEW RAVEN uses a user customizable template to determine what fields in which order get sent to the client when they display a list or select from a drop down + - FILTER / SORT: The templating is ENTIRELY separate from the filtering and sorting code which is already coded sufficiently and is a separate thing - Users with BIZ rights can set the template - There is one template per list (not user based but global in nature) - - Template affects both "MINI" single column display of list for small devices and large format wide mode with multiple columns for larger devices + - Template affects both "MINI" single column display of list for small devices and "FULL" format wide mode with multiple columns for larger devices - In MINI list format displays they choose which columns go into the one single column for display that is returned - - In regular list format display they choose which columns are returned and which order separately from MINI format display + - In FULL list format display they choose which columns are returned and which order separately from MINI format display Narrow grids on small screens as well as picklists need to show a single field of information as required by that shop for selection, recognition etc so templated to format multiple return fields into one Grids need a way to ensure you can see what you need on small devices as well they need to show the columns desired on larger devices @@ -64,10 +65,10 @@ Back AND front end MOCK TEMPLATE { - columns:[ - + full:[ +ltKey,ltKey2,ltkey3 ], mini:[ - + ltKey, ltkey2, ltkey3 ] } \ No newline at end of file diff --git a/devdocs/todo.txt b/devdocs/todo.txt index 248c4c78..af84141d 100644 --- a/devdocs/todo.txt +++ b/devdocs/todo.txt @@ -20,7 +20,7 @@ REALLY MAKING MORE PROGRESS WHEN CLIENT DEV DRIVES BACKEND DEV, STICK TO THAT!! ----------------------- GRID LISTS TODO NOW: - + - RECODE GETLIST in WidgetBiz - Return JSON and internally work with JSON so the list can return dynamic object - https://devblogs.microsoft.com/dotnet/try-the-new-system-text-json-apis/ - https://docs.microsoft.com/en-us/dotnet/core/whats-new/dotnet-core-3-0#fast-built-in-json-support diff --git a/server/AyaNova/biz/WidgetBiz.cs b/server/AyaNova/biz/WidgetBiz.cs index c0ff4208..92537fa7 100644 --- a/server/AyaNova/biz/WidgetBiz.cs +++ b/server/AyaNova/biz/WidgetBiz.cs @@ -266,46 +266,26 @@ namespace AyaNova.Biz // LISTS // - // public static FilterOptions FilterOptions(long localizeToLocaleId = 0) - // { - // //NOTE: All column names are lowercase to conform with Postgres AyaNova DB which uses lowercase for all identifiers - // //Also all list keys are lower case for consistency - // FilterOptions f = new FilterOptions("widget"); - // f. - // AddField("id", "ID", AyDataType.Integer). - // AddField("name", "WidgetName", AyDataType.Text). - // AddField("serial", "WidgetSerial", AyDataType.Integer). - // AddField("notes", "WidgetNotes", AyDataType.Text). - // AddField("dollaramount", "WidgetDollarAmount", AyDataType.Decimal). - // AddField("active", "Active", AyDataType.Bool). - // AddField("startdate", "WidgetStartDate", AyDataType.Date). - // AddField("count", "WidgetCount", AyDataType.Integer). - // AddField("tags", "Tags", AyDataType.Tags). - // AddField("enddate", "WidgetEndDate", AyDataType.Date); - // if (localizeToLocaleId != 0) - // f.Localize(localizeToLocaleId); - // return f; - // } //get many (paged) - internal async Task GetList(IUrlHelper Url, string routeName, ListOptions pagingOptions) + internal async Task GetList(IUrlHelper Url, string routeName, ListOptions listOptions) { - pagingOptions.Offset = pagingOptions.Offset ?? ListOptions.DefaultOffset; - pagingOptions.Limit = pagingOptions.Limit ?? ListOptions.DefaultLimit; + listOptions.Offset = listOptions.Offset ?? ListOptions.DefaultOffset; + listOptions.Limit = listOptions.Limit ?? ListOptions.DefaultLimit; //BUILD THE QUERY //base query var q = "SELECT *, xmin FROM AWIDGET "; //GET THE FILTER / SORT - if (pagingOptions.DataFilterId > 0) + if (listOptions.DataFilterId > 0) { - var TheFilter = await ct.DataFilter.FirstOrDefaultAsync(x => x.Id == pagingOptions.DataFilterId); + var TheFilter = await ct.DataFilter.FirstOrDefaultAsync(x => x.Id == listOptions.DataFilterId); //BUILD WHERE AND APPEND IT - q = q + FilterSqlCriteriaBuilder.DataFilterToSQLCriteria(TheFilter, ObjectFields.ObjectFieldsList(ObjectFields.WIDGET_KEY), UserId); + q = q + FilterSqlCriteriaBuilder.DataFilterToSQLCriteria(TheFilter, ObjectFields.ObjectFieldsList(ObjectFields.WIDGET_KEY), UserId); //BUILD ORDER BY AND APPEND IT q = q + FilterSqlOrderByBuilder.DataFilterToSQLOrderBy(TheFilter); @@ -319,35 +299,51 @@ namespace AyaNova.Biz #pragma warning disable EF1000 -//GET THE FULL LIST OF ITEMS + //GET THE FULL LIST OF ITEMS var items = await ct.Widget .FromSqlRaw(q) .AsNoTracking() - .Skip(pagingOptions.Offset.Value) - .Take(pagingOptions.Limit.Value) + .Skip(listOptions.Offset.Value) + .Take(listOptions.Limit.Value) .ToArrayAsync(); -//GET THE RECORD COUNT + //GET THE RECORD COUNT var totalRecordCount = await ct.Widget .FromSqlRaw(q) .AsNoTracking() .CountAsync(); #pragma warning restore EF1000 -//BUILD THE PAGING LINKS PORTION - var pageLinks = new PaginationLinkBuilder(Url, routeName, null, pagingOptions, totalRecordCount).PagingLinksObject(); + //BUILD THE PAGING LINKS PORTION + var pageLinks = new PaginationLinkBuilder(Url, routeName, null, listOptions, totalRecordCount).PagingLinksObject(); //BUILD THE RETURN BASED ON TEMPLATE and MINI CONDITIONAL FORMAT //TODO: Get template (MOCKED FOR NOW UNTIL PROOF OF CONCEPT) - + /*{ "MyStringArray" : ["somestring1", "somestring2"] } + { + columns:[ +ltKey,ltKey2,ltkey3 + ], + mini:[ + ltKey, ltkey2, ltkey3 + ] +} + */ + var MOCK_DISPLAY_TEMPLATE = @" + { + ""full"":[""WidgetName"",""WidgetSerial"",""WidgetDollarAmount"",""WidgetRoles"",""WidgetStartDate"",""Active""], + ""mini"":[""WidgetName"",""WidgetSerial""] + } + "; + //TODO: BUILD THE RETURN LIST OF FIELDS / TYPES AND ORDER FROM TEMPLATE AND MINI CONDITIONAL //TODO: BUILD THE RETURN LIST OF DATA ITEMS //If mini format all desired columns in order into the single mini return display (and set the only other return field which is ID) - + //If wide then format the fields in oder chosen (grid sort and filter template has already done that part above) -//TODO: Genericize the above block of building return when it's working as this code needs to be central and optimized as much as possible + //TODO: Genericize the above block of building return when it's working as this code needs to be central and optimized as much as possible //New return code dynamic ret = new JObject();