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 — 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);
}
/**