This is an automated email from the ASF dual-hosted git repository.

jamesbognar pushed a commit to branch release-manager
in repository https://gitbox.apache.org/repos/asf/juneau.git


The following commit(s) were added to refs/heads/release-manager by this push:
     new 0542aa9d46 TODO-444: Dogfood column configurator assets and 
ColumnConfig on Release/Admin pages
0542aa9d46 is described below

commit 0542aa9d467e68e8e03adcdb1e6ad9666bd70d55
Author: James Bognar <[email protected]>
AuthorDate: Thu Aug 20 11:35:35 2026 -0400

    TODO-444: Dogfood column configurator assets and ColumnConfig on 
Release/Admin pages
    
    Wire juneau-config.js/css into base.ftlh and enable ColumnConfig (pinned 
version, hidden GitHub/Milestone, format choosers) on the releases view.
---
 .../org/apache/juneau/releng/rest/AdminRest.java     |  4 +++-
 .../org/apache/juneau/releng/rest/ReleaseRest.java   | 20 +++++++++++++-------
 src/main/resources/templates/base.ftlh               |  2 ++
 .../org/apache/juneau/releng/rest/AdminRestTest.java | 16 ++++++++++++++++
 4 files changed, 34 insertions(+), 8 deletions(-)

diff --git a/src/main/java/org/apache/juneau/releng/rest/AdminRest.java 
b/src/main/java/org/apache/juneau/releng/rest/AdminRest.java
index 6101fde966..354052167d 100644
--- a/src/main/java/org/apache/juneau/releng/rest/AdminRest.java
+++ b/src/main/java/org/apache/juneau/releng/rest/AdminRest.java
@@ -73,14 +73,16 @@ public class AdminRest extends BasicRestResource {
        /** Human page &mdash; the composed tab/sub-tab page shell (emitted as 
trusted markup) + PAGE_META sidecar. */
        @RestGet("/")
        public View page(RestRequest req) {
-               var markup = 
HtmlSerializer.DEFAULT_SIMPLE_SQ.toString(PageTable.of(adminPage()));
+               var markup = 
HtmlSerializer.DEFAULT_SIMPLE_SQ.toString(PageTable.of(req, adminPage()));
                return ConsolePage.of("admin", req)
                        .attr("pageTable", markup)
                        .attr("viewsCssUrl", asset(req, 
ViewsMixin.VIEWS_CSS_PATH))
+                       .attr("configCssUrl", asset(req, 
ViewsMixin.CONFIG_CSS_PATH))
                        .attr("rendersJsUrl", asset(req, 
ViewsMixin.RENDERS_JS_PATH))
                        .attr("iconsJsUrl", asset(req, 
ViewsMixin.ICONS_JS_PATH))
                        .attr("ribbonJsUrl", asset(req, 
ViewsMixin.RIBBON_JS_PATH))
                        .attr("viewsJsUrl", asset(req, 
ViewsMixin.VIEWS_JS_PATH))
+                       .attr("configJsUrl", asset(req, 
ViewsMixin.CONFIG_JS_PATH))
                        .attr("pagesJsUrl", asset(req, 
ViewsMixin.PAGES_JS_PATH));
        }
 
diff --git a/src/main/java/org/apache/juneau/releng/rest/ReleaseRest.java 
b/src/main/java/org/apache/juneau/releng/rest/ReleaseRest.java
index c94f132ae4..ca1c7e4de2 100644
--- a/src/main/java/org/apache/juneau/releng/rest/ReleaseRest.java
+++ b/src/main/java/org/apache/juneau/releng/rest/ReleaseRest.java
@@ -33,6 +33,7 @@ import 
org.apache.juneau.rest.server.view.freemarker.FreemarkerMixin;
 import org.apache.juneau.rest.server.view.freemarker.FreemarkerViewRenderer;
 import 
org.apache.juneau.rest.server.view.freemarker.console.ConsoleFreemarkerMixin;
 import org.apache.juneau.rest.server.views.Column;
+import org.apache.juneau.rest.server.views.ColumnConfig;
 import org.apache.juneau.rest.server.views.RibbonAction;
 import org.apache.juneau.rest.server.views.ViewDef;
 import org.apache.juneau.rest.server.views.ViewDef.DataMode;
@@ -99,14 +100,17 @@ public class ReleaseRest extends BasicRestResource {
                        .dataUrl(MOUNT + "/data")
                        .defaultOrder("version", Dir.DESC)
                        .columns(
-                               
Column.of("version").title("Version").render(RENDER_LINKED).href(MOUNT + 
"/{version}/1"),
+                               
Column.of("version").title("Version").render(RENDER_LINKED).href(MOUNT + 
"/{version}/1").pinned(true),
                                Column.of("rc").title("RC"),
                                
Column.of("status").title("Status").render("tag:status"),
                                
Column.of("stage").title("Stage").render("tag:stage"),
-                               Column.of("voteCloses").title("Vote 
closes").render("ts-zulu"),
-                               
Column.of("released").title("Released").render("date"),
-                               
Column.of("githubReleaseUrl").title("GitHub").render(RENDER_LINKED).href("{githubReleaseUrl}").orderable(false),
-                               
Column.of("milestoneUrl").title("Milestone").render(RENDER_LINKED).href("{milestoneUrl}").orderable(false))
+                               Column.of("voteCloses").title("Vote 
closes").render("ts-zulu").formats("ts-zulu", "datetime", "date"),
+                               
Column.of("released").title("Released").render("date").formats("date", 
"datetime", "ts-zulu"),
+                               
Column.of("githubReleaseUrl").title("GitHub").render(RENDER_LINKED).href("{githubReleaseUrl}").orderable(false)
+                                       .defaultVisible(false),
+                               
Column.of("milestoneUrl").title("Milestone").render(RENDER_LINKED).href("{milestoneUrl}").orderable(false)
+                                       .defaultVisible(false))
+                       .columnConfig(ColumnConfig.create())
                        .ribbon(
                                // "filters" clusters the column-search toggle 
and the dropped-only quick-filter into one
                                // segmented ribbon group (visual-parity 
control-row layout: filter-ribbon); "export" actions are
@@ -123,14 +127,16 @@ public class ReleaseRest extends BasicRestResource {
        /** Human page — the rich-view table shell (emitted as trusted markup) 
+ JSON sidecar, hydrated by the toolkit JS. */
        @RestGet("/")
        public View page(RestRequest req) {
-               var markup = 
HtmlSerializer.DEFAULT_SIMPLE_SQ.toString(ViewTable.of(releasesView()));
+               var markup = 
HtmlSerializer.DEFAULT_SIMPLE_SQ.toString(ViewTable.of(req, releasesView()));
                return ConsolePage.of("releases", req)
                        .attr("viewTable", markup)
                        .attr("viewsCssUrl", asset(req, 
ViewsMixin.VIEWS_CSS_PATH))
+                       .attr("configCssUrl", asset(req, 
ViewsMixin.CONFIG_CSS_PATH))
                        .attr("rendersJsUrl", asset(req, 
ViewsMixin.RENDERS_JS_PATH))
                        .attr("iconsJsUrl", asset(req, 
ViewsMixin.ICONS_JS_PATH))
                        .attr("ribbonJsUrl", asset(req, 
ViewsMixin.RIBBON_JS_PATH))
-                       .attr("viewsJsUrl", asset(req, 
ViewsMixin.VIEWS_JS_PATH));
+                       .attr("viewsJsUrl", asset(req, 
ViewsMixin.VIEWS_JS_PATH))
+                       .attr("configJsUrl", asset(req, 
ViewsMixin.CONFIG_JS_PATH));
        }
 
        /**
diff --git a/src/main/resources/templates/base.ftlh 
b/src/main/resources/templates/base.ftlh
index 13b587e22f..d29e6eea18 100644
--- a/src/main/resources/templates/base.ftlh
+++ b/src/main/resources/templates/base.ftlh
@@ -50,6 +50,7 @@
          .tag.<domain>.<value> classes. This same stylesheet also carries the 
TODO-399 Phase C .jc-tab/.jc-panel
          page-shell base rules the Admin tab's juneau-pages.js runtime relies 
on. -->
     <link rel="stylesheet" 
href="${viewsCssUrl!'/rest/releases/juneau-views.css'}">
+    <link rel="stylesheet" 
href="${configCssUrl!'/rest/releases/juneau-config.css'}">
     </#if>
     <link rel="stylesheet" href="/juneau-console/chrome.css">
     <link rel="stylesheet" href="/css/chrome.css">
@@ -101,6 +102,7 @@
     <script src="${iconsJsUrl!'/rest/releases/juneau-icons.js'}"></script>
     <script src="${ribbonJsUrl!'/rest/releases/juneau-ribbon.js'}"></script>
     <script src="${viewsJsUrl!'/rest/releases/juneau-views.js'}"></script>
+    <script src="${configJsUrl!'/rest/releases/juneau-config.js'}"></script>
     </#if>
     <#if activeTab?? && activeTab == 'admin'>
     <#-- TODO-399 Phase C: the opt-in tabs/sub-tabs page runtime — only the 
Admin tab's composed PageDef page loads
diff --git a/src/test/java/org/apache/juneau/releng/rest/AdminRestTest.java 
b/src/test/java/org/apache/juneau/releng/rest/AdminRestTest.java
index c2435efc25..f1f9fb8d31 100644
--- a/src/test/java/org/apache/juneau/releng/rest/AdminRestTest.java
+++ b/src/test/java/org/apache/juneau/releng/rest/AdminRestTest.java
@@ -118,6 +118,13 @@ class AdminRestTest {
                        try (var resp = client.request("GET", 
ViewsMixin.VIEWS_JS_PATH).run()) {
                                assertEquals(200, resp.getStatusCode());
                        }
+                       try (var resp = client.request("GET", 
ViewsMixin.CONFIG_JS_PATH).run()) {
+                               assertEquals(200, resp.getStatusCode());
+                               
assertTrue(resp.getBodyAsString().contains("JuneauViews"));
+                       }
+                       try (var resp = client.request("GET", 
ViewsMixin.CONFIG_CSS_PATH).run()) {
+                               assertEquals(200, resp.getStatusCode());
+                       }
                }
        }
 
@@ -154,6 +161,15 @@ class AdminRestTest {
                assertTrue(base.contains("href=\"/rest/admin\""), "Missing 
Admin nav link: " + base);
                assertTrue(base.contains("activeTab == 'admin'"), "Missing 
admin-tab conditional asset wiring: " + base);
                assertTrue(base.contains("pagesJsUrl"), "Missing 
juneau-pages.js include for the Admin tab: " + base);
+               assertTrue(base.contains("configJsUrl"), "Missing 
juneau-config.js include: " + base);
+               assertTrue(base.contains("configCssUrl"), "Missing 
juneau-config.css include: " + base);
+               var viewsJsIdx = base.indexOf("viewsJsUrl");
+               var configJsIdx = base.indexOf("configJsUrl");
+               var pagesJsIdx = base.indexOf("pagesJsUrl");
+               assertTrue(viewsJsIdx >= 0 && configJsIdx > viewsJsIdx,
+                       "juneau-config.js must load after juneau-views.js: " + 
base);
+               assertTrue(pagesJsIdx > configJsIdx,
+                       "juneau-pages.js must load after juneau-config.js: " + 
base);
        }
 
        /**

Reply via email to