From 92cc968d6166941214f5f6960beddd92c3e2c60e Mon Sep 17 00:00:00 2001 From: Rene Schwarzer Date: Sat, 6 Jun 2026 08:12:32 +0200 Subject: [PATCH 1/4] feat: introduce new View/State/Service design for components --- ...ogRestFormAdd.cs => CatalogDataFormAdd.cs} | 2 +- ...FormDelete.cs => CatalogDataFormDelete.cs} | 2 +- ...RestFormEdit.cs => CatalogDataFormEdit.cs} | 2 +- .../Content/Catalog/CatalogTable.cs | 22 +++++++++++++++--- ...{SeedRestFormAdd.cs => SeedDataFormAdd.cs} | 4 ++-- ...estFormDelete.cs => SeedDataFormDelete.cs} | 4 ++-- ...eedRestFormEdit.cs => SeedDataFormEdit.cs} | 4 ++-- .../WebFragment/Content/Seed/SeedTable.cs | 23 ++++++++++++++++--- 8 files changed, 48 insertions(+), 15 deletions(-) rename src/WebIndex/WebFragment/Content/Catalog/{CatalogRestFormAdd.cs => CatalogDataFormAdd.cs} (97%) rename src/WebIndex/WebFragment/Content/Catalog/{CatalogRestFormDelete.cs => CatalogDataFormDelete.cs} (96%) rename src/WebIndex/WebFragment/Content/Catalog/{CatalogRestFormEdit.cs => CatalogDataFormEdit.cs} (97%) rename src/WebIndex/WebFragment/Content/Seed/{SeedRestFormAdd.cs => SeedDataFormAdd.cs} (92%) rename src/WebIndex/WebFragment/Content/Seed/{SeedRestFormDelete.cs => SeedDataFormDelete.cs} (93%) rename src/WebIndex/WebFragment/Content/Seed/{SeedRestFormEdit.cs => SeedDataFormEdit.cs} (94%) diff --git a/src/WebIndex/WebFragment/Content/Catalog/CatalogRestFormAdd.cs b/src/WebIndex/WebFragment/Content/Catalog/CatalogDataFormAdd.cs similarity index 97% rename from src/WebIndex/WebFragment/Content/Catalog/CatalogRestFormAdd.cs rename to src/WebIndex/WebFragment/Content/Catalog/CatalogDataFormAdd.cs index c5dfe0a..8196c85 100644 --- a/src/WebIndex/WebFragment/Content/Catalog/CatalogRestFormAdd.cs +++ b/src/WebIndex/WebFragment/Content/Catalog/CatalogDataFormAdd.cs @@ -14,7 +14,7 @@ namespace WebExpress.Tutorial.WebIndex.WebFragment.Content.Catalog /// [Section] [Scope] - public class CatalogFormAdd : FragmentControlRestFormAdd + public class CatalogFormAdd : FragmentControlDataFormAdd { /// /// Gets or sets the uir associated with the object. diff --git a/src/WebIndex/WebFragment/Content/Catalog/CatalogRestFormDelete.cs b/src/WebIndex/WebFragment/Content/Catalog/CatalogDataFormDelete.cs similarity index 96% rename from src/WebIndex/WebFragment/Content/Catalog/CatalogRestFormDelete.cs rename to src/WebIndex/WebFragment/Content/Catalog/CatalogDataFormDelete.cs index db416c3..bdd2d76 100644 --- a/src/WebIndex/WebFragment/Content/Catalog/CatalogRestFormDelete.cs +++ b/src/WebIndex/WebFragment/Content/Catalog/CatalogDataFormDelete.cs @@ -11,7 +11,7 @@ namespace WebExpress.Tutorial.WebIndex.WebFragment.Content.Catalog /// /// Represents a form for deleting a catalog index item. /// - public class CatalogFormDelete : FragmentControlRestFormDelete + public class CatalogFormDelete : FragmentControlDataFormDelete { /// /// Initializes a new instance of the class. diff --git a/src/WebIndex/WebFragment/Content/Catalog/CatalogRestFormEdit.cs b/src/WebIndex/WebFragment/Content/Catalog/CatalogDataFormEdit.cs similarity index 97% rename from src/WebIndex/WebFragment/Content/Catalog/CatalogRestFormEdit.cs rename to src/WebIndex/WebFragment/Content/Catalog/CatalogDataFormEdit.cs index 760bca2..1929224 100644 --- a/src/WebIndex/WebFragment/Content/Catalog/CatalogRestFormEdit.cs +++ b/src/WebIndex/WebFragment/Content/Catalog/CatalogDataFormEdit.cs @@ -14,7 +14,7 @@ namespace WebExpress.Tutorial.WebIndex.WebFragment.Content.Catalog /// [Section] [Scope] - public class CatalogFormEdit : FragmentControlRestFormEdit + public class CatalogFormEdit : FragmentControlDataFormEdit { /// /// Gets or sets the uir associated with the object. diff --git a/src/WebIndex/WebFragment/Content/Catalog/CatalogTable.cs b/src/WebIndex/WebFragment/Content/Catalog/CatalogTable.cs index 0feffca..23f0ab3 100644 --- a/src/WebIndex/WebFragment/Content/Catalog/CatalogTable.cs +++ b/src/WebIndex/WebFragment/Content/Catalog/CatalogTable.cs @@ -1,4 +1,6 @@ -using WebExpress.WebApp.WebFragment; +using System.Net.Http; +using WebExpress.WebApp.WebData; +using WebExpress.WebApp.WebFragment; using WebExpress.WebApp.WebSection; using WebExpress.WebCore.WebAttribute; using WebExpress.WebCore.WebFragment; @@ -16,7 +18,7 @@ namespace WebExpress.Tutorial.WebIndex.WebFragment.Content.Catalog /// [Section] [Scope] - public sealed class CatalogTable : FragmentControlRestTable + public sealed class CatalogTable : FragmentControlDataTable { /// /// Initializes a new instance of the class. @@ -26,7 +28,21 @@ public sealed class CatalogTable : FragmentControlRestTable public CatalogTable(ISitemapManager sitemapManager, IFragmentContext fragmentContext) : base(fragmentContext) { - RestUri = _ => sitemapManager.GetUri(fragmentContext.ApplicationContext); + ServiceFactory = rennderContext => new DataServiceBuilder("data") + .Endpoint() + .Method(HttpMethod.Get) + .Query(q => q + .Map("search", "q") + .Map("wql", "wql") + .Map("filter", "f") + .Map("page", "p") + .Map("pageSize", "l") + .Map("orderBy", "o") + .Map("orderDir", "d")) + .Response(r => r + .Items("items") + .Total("total")) + .Build(rennderContext); } /// diff --git a/src/WebIndex/WebFragment/Content/Seed/SeedRestFormAdd.cs b/src/WebIndex/WebFragment/Content/Seed/SeedDataFormAdd.cs similarity index 92% rename from src/WebIndex/WebFragment/Content/Seed/SeedRestFormAdd.cs rename to src/WebIndex/WebFragment/Content/Seed/SeedDataFormAdd.cs index 58fe5e6..25821c8 100644 --- a/src/WebIndex/WebFragment/Content/Seed/SeedRestFormAdd.cs +++ b/src/WebIndex/WebFragment/Content/Seed/SeedDataFormAdd.cs @@ -12,7 +12,7 @@ namespace WebExpress.Tutorial.WebIndex.WebFragment.Content.Seed /// [Section] [Scope] - public sealed class SeedRestFormAdd : FragmentControlRestFormAdd + public sealed class SeedDataFormAdd : FragmentControlDataFormAdd { /// /// Gets the control element for entering the login identifier. @@ -30,7 +30,7 @@ public sealed class SeedRestFormAdd : FragmentControlRestFormAdd /// /// The sitemap manager. /// The context of the fragment. - public SeedRestFormAdd(ISitemapManager sitemapManager, IFragmentContext fragmentContext) + public SeedDataFormAdd(ISitemapManager sitemapManager, IFragmentContext fragmentContext) : base(fragmentContext) { Add(Url); diff --git a/src/WebIndex/WebFragment/Content/Seed/SeedRestFormDelete.cs b/src/WebIndex/WebFragment/Content/Seed/SeedDataFormDelete.cs similarity index 93% rename from src/WebIndex/WebFragment/Content/Seed/SeedRestFormDelete.cs rename to src/WebIndex/WebFragment/Content/Seed/SeedDataFormDelete.cs index f2e55cb..7d9f4ad 100644 --- a/src/WebIndex/WebFragment/Content/Seed/SeedRestFormDelete.cs +++ b/src/WebIndex/WebFragment/Content/Seed/SeedDataFormDelete.cs @@ -15,14 +15,14 @@ namespace WebExpress.Tutorial.WebIndex.WebFragment.Content.Seed /// [Section] [Scope] - public sealed class SeedRestFormDelete : FragmentControlRestFormDelete + public sealed class SeedDataFormDelete : FragmentControlDataFormDelete { /// /// Initializes a new instance of the class. /// /// The sitemap manager. /// The context of the fragment. - public SeedRestFormDelete(ISitemapManager sitemapManager, IFragmentContext fragmentContext) + public SeedDataFormDelete(ISitemapManager sitemapManager, IFragmentContext fragmentContext) : base(fragmentContext) { Uri = _ => sitemapManager.GetUri(fragmentContext.ApplicationContext); diff --git a/src/WebIndex/WebFragment/Content/Seed/SeedRestFormEdit.cs b/src/WebIndex/WebFragment/Content/Seed/SeedDataFormEdit.cs similarity index 94% rename from src/WebIndex/WebFragment/Content/Seed/SeedRestFormEdit.cs rename to src/WebIndex/WebFragment/Content/Seed/SeedDataFormEdit.cs index 1107727..4b589d5 100644 --- a/src/WebIndex/WebFragment/Content/Seed/SeedRestFormEdit.cs +++ b/src/WebIndex/WebFragment/Content/Seed/SeedDataFormEdit.cs @@ -15,7 +15,7 @@ namespace WebExpress.Tutorial.WebIndex.WebFragment.Content.Seed /// [Section] [Scope] - public sealed class SeedRestFormEdit : FragmentControlRestFormEdit + public sealed class SeedDataFormEdit : FragmentControlDataFormEdit { /// /// Gets the control element for entering the login identifier. @@ -33,7 +33,7 @@ public sealed class SeedRestFormEdit : FragmentControlRestFormEdit /// /// The sitemap manager. /// The context of the fragment. - public SeedRestFormEdit(ISitemapManager sitemapManager, IFragmentContext fragmentContext) + public SeedDataFormEdit(ISitemapManager sitemapManager, IFragmentContext fragmentContext) : base(fragmentContext) { Add(Url); diff --git a/src/WebIndex/WebFragment/Content/Seed/SeedTable.cs b/src/WebIndex/WebFragment/Content/Seed/SeedTable.cs index 137171e..00105c1 100644 --- a/src/WebIndex/WebFragment/Content/Seed/SeedTable.cs +++ b/src/WebIndex/WebFragment/Content/Seed/SeedTable.cs @@ -1,4 +1,6 @@ -using WebExpress.WebApp.WebFragment; +using System.Net.Http; +using WebExpress.WebApp.WebData; +using WebExpress.WebApp.WebFragment; using WebExpress.WebApp.WebSection; using WebExpress.WebCore.WebAttribute; using WebExpress.WebCore.WebFragment; @@ -13,7 +15,7 @@ namespace WebExpress.Tutorial.WebIndex.WebFragment.Content.Seed /// [Section] [Scope] - public sealed class SeedTable : FragmentControlRestTable + public sealed class SeedTable : FragmentControlDataTable { private readonly ISitemapManager _sitemapManager; @@ -26,7 +28,22 @@ public SeedTable(ISitemapManager sitemapManager, IFragmentContext fragmentContex : base(fragmentContext) { _sitemapManager = sitemapManager; - RestUri = _ => _sitemapManager.GetUri(fragmentContext.ApplicationContext); + + ServiceFactory = rennderContext => new DataServiceBuilder("data") + .Endpoint() + .Method(HttpMethod.Get) + .Query(q => q + .Map("search", "q") + .Map("wql", "wql") + .Map("filter", "f") + .Map("page", "p") + .Map("pageSize", "l") + .Map("orderBy", "o") + .Map("orderDir", "d")) + .Response(r => r + .Items("items") + .Total("total")) + .Build(rennderContext); } /// From c04a5399e40c1ac66bbc16a64f3ee679721ddc7a Mon Sep 17 00:00:00 2001 From: Rene Schwarzer Date: Wed, 10 Jun 2026 21:06:04 +0200 Subject: [PATCH 2/4] feat: general improvements and minor bugs --- .../Content/Catalog/CatalogTable.cs | 20 +++++++------------ .../WebFragment/Content/Seed/SeedTable.cs | 20 +++++++------------ 2 files changed, 14 insertions(+), 26 deletions(-) diff --git a/src/WebIndex/WebFragment/Content/Catalog/CatalogTable.cs b/src/WebIndex/WebFragment/Content/Catalog/CatalogTable.cs index 23f0ab3..06d788e 100644 --- a/src/WebIndex/WebFragment/Content/Catalog/CatalogTable.cs +++ b/src/WebIndex/WebFragment/Content/Catalog/CatalogTable.cs @@ -28,21 +28,15 @@ public sealed class CatalogTable : FragmentControlDataTable public CatalogTable(ISitemapManager sitemapManager, IFragmentContext fragmentContext) : base(fragmentContext) { - ServiceFactory = rennderContext => new DataServiceBuilder("data") + // the logical names of the closed query vocabulary map to their + // historical wire names through the typed helpers; this endpoint + // answers with an item list rather than the table row shape + ServiceFactory = renderContext => new DataServiceBuilder("data") .Endpoint() .Method(HttpMethod.Get) - .Query(q => q - .Map("search", "q") - .Map("wql", "wql") - .Map("filter", "f") - .Map("page", "p") - .Map("pageSize", "l") - .Map("orderBy", "o") - .Map("orderDir", "d")) - .Response(r => r - .Items("items") - .Total("total")) - .Build(rennderContext); + .Query(q => q.Search().Wql().Filter().Page().PageSize().OrderBy().OrderDir()) + .Response(r => r.Items().Total()) + .Build(renderContext); } /// diff --git a/src/WebIndex/WebFragment/Content/Seed/SeedTable.cs b/src/WebIndex/WebFragment/Content/Seed/SeedTable.cs index 00105c1..3831604 100644 --- a/src/WebIndex/WebFragment/Content/Seed/SeedTable.cs +++ b/src/WebIndex/WebFragment/Content/Seed/SeedTable.cs @@ -29,21 +29,15 @@ public SeedTable(ISitemapManager sitemapManager, IFragmentContext fragmentContex { _sitemapManager = sitemapManager; - ServiceFactory = rennderContext => new DataServiceBuilder("data") + // the logical names of the closed query vocabulary map to their + // historical wire names through the typed helpers; this endpoint + // answers with an item list rather than the table row shape + ServiceFactory = renderContext => new DataServiceBuilder("data") .Endpoint() .Method(HttpMethod.Get) - .Query(q => q - .Map("search", "q") - .Map("wql", "wql") - .Map("filter", "f") - .Map("page", "p") - .Map("pageSize", "l") - .Map("orderBy", "o") - .Map("orderDir", "d")) - .Response(r => r - .Items("items") - .Total("total")) - .Build(rennderContext); + .Query(q => q.Search().Wql().Filter().Page().PageSize().OrderBy().OrderDir()) + .Response(r => r.Items().Total()) + .Build(renderContext); } /// From 680a2b9ac45ab1942b3011b641e542bbafe68aa4 Mon Sep 17 00:00:00 2001 From: Rene Schwarzer Date: Fri, 12 Jun 2026 18:31:24 +0200 Subject: [PATCH 3/4] feat: general improvements and minor bugs --- src/WebIndex/WebExpress.Tutorial.WebIndex.csproj | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/WebIndex/WebExpress.Tutorial.WebIndex.csproj b/src/WebIndex/WebExpress.Tutorial.WebIndex.csproj index b3fc216..168adab 100644 --- a/src/WebIndex/WebExpress.Tutorial.WebIndex.csproj +++ b/src/WebIndex/WebExpress.Tutorial.WebIndex.csproj @@ -24,8 +24,11 @@ + + + + - From 05667f762b1a24c34db66885b19ab188d1fefc43 Mon Sep 17 00:00:00 2001 From: Rene Schwarzer Date: Sun, 21 Jun 2026 21:29:26 +0200 Subject: [PATCH 4/4] feat: general improvements, extensions, and additional tests --- src/WebIndex.App/config/webexpress.config.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/WebIndex.App/config/webexpress.config.xml b/src/WebIndex.App/config/webexpress.config.xml index d56b94c..1336d5b 100644 --- a/src/WebIndex.App/config/webexpress.config.xml +++ b/src/WebIndex.App/config/webexpress.config.xml @@ -7,10 +7,10 @@ http://localhost/ - - 300 - 3000000000 - + + 300 + 3000000000 + de-DE