Skip to content

Commit 645908e

Browse files
Dev UI: New page types (Settings and Unlisted) and DEV MVC Moved to use those
Signed-off-by: Phillip Kruger <[email protected]>
1 parent 3823d7e commit 645908e

File tree

23 files changed

+730
-215
lines changed

23 files changed

+730
-215
lines changed

extensions/devui/deployment-spi/src/main/java/io/quarkus/devui/spi/page/AbstractPageBuildItem.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ public AbstractPageBuildItem() {
2727
public AbstractPageBuildItem(PageBuilder... pageBuilder) {
2828
super();
2929
this.buildTimeData = new HashMap<>();
30-
this.pageBuilders = Arrays.asList(pageBuilder);
30+
this.pageBuilders = new ArrayList<>(Arrays.asList(pageBuilder));
3131
}
3232

3333
public AbstractPageBuildItem(String customIdentifier) {
@@ -39,7 +39,7 @@ public AbstractPageBuildItem(String customIdentifier) {
3939
public AbstractPageBuildItem(String customIdentifier, PageBuilder... pageBuilder) {
4040
super(customIdentifier);
4141
this.buildTimeData = new HashMap<>();
42-
this.pageBuilders = Arrays.asList(pageBuilder);
42+
this.pageBuilders = new ArrayList<>(Arrays.asList(pageBuilder));
4343
}
4444

4545
public void addPage(PageBuilder page) {
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package io.quarkus.devui.spi.page;
2+
3+
public class AssistantPageBuilder extends WebComponentPageBuilder {
4+
5+
protected AssistantPageBuilder() {
6+
super();
7+
icon("font-awesome-solid:robot");
8+
color("var(--quarkus-assistant)");
9+
tooltip("This uses the Quarkus Assistant feature");
10+
metadata("isAssistantPage", "true");
11+
}
12+
}

extensions/devui/deployment-spi/src/main/java/io/quarkus/devui/spi/page/Page.java

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,16 @@ protected Page(String icon,
5353
String namespaceLabel,
5454
String extensionId) {
5555

56-
this.icon = icon;
57-
this.color = color;
56+
if (icon != null) {
57+
this.icon = icon;
58+
} else {
59+
this.icon = "font-awesome-solid:arrow-right"; // default
60+
}
61+
if (color != null) {
62+
this.color = color;
63+
} else {
64+
this.color = "var(--lumo-contrast-80pct)"; // default
65+
}
5866
this.tooltip = tooltip;
5967
this.title = title;
6068
this.staticLabel = staticLabel;
@@ -224,8 +232,7 @@ public static WebComponentPageBuilder webComponentPageBuilder() {
224232
* You can use build time data if you made it available
225233
*/
226234
public static WebComponentPageBuilder assistantPageBuilder() {
227-
return new WebComponentPageBuilder("font-awesome-solid:robot", "var(--quarkus-assistant)",
228-
"This uses the Quarkus Assistant feature");
235+
return new AssistantPageBuilder();
229236
}
230237

231238
/**

extensions/devui/deployment-spi/src/main/java/io/quarkus/devui/spi/page/PageBuilder.java

Lines changed: 4 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -35,31 +35,18 @@ public abstract class PageBuilder<T> {
3535
protected String extensionId = null;
3636
protected Class preprocessor = null;
3737

38-
protected PageBuilder() {
39-
this("font-awesome-solid:arrow-right", "var(--lumo-contrast-80pct)", null, false);
40-
}
41-
42-
protected PageBuilder(String icon, String color, String tooltip, boolean assistantPage) {
43-
this.icon = icon;
44-
this.color = color;
45-
this.tooltip = tooltip;
46-
if (assistantPage) {
47-
metadata("isAssistantPage", "true");
48-
}
49-
}
50-
5138
@SuppressWarnings("unchecked")
5239
public T icon(String icon) {
53-
if (this.icon != null) {
40+
if (this.icon == null) {
5441
this.icon = icon;
5542
} else {
56-
log.warn("Icon already set, ignoring " + icon);
43+
log.warn("Icon already set to [" + this.icon + "] , ignoring [" + icon + "]");
5744
}
5845
return (T) this;
5946
}
6047

6148
public T color(String color) {
62-
if (this.color != null) {
49+
if (this.color == null) {
6350
this.color = color;
6451
} else {
6552
log.warn("Color already set, ignoring " + color);
@@ -68,7 +55,7 @@ public T color(String color) {
6855
}
6956

7057
public T tooltip(String tooltip) {
71-
if (this.tooltip != null) {
58+
if (this.tooltip == null) {
7259
this.tooltip = tooltip;
7360
} else {
7461
log.warn("Tooltip already set, ignoring " + tooltip);
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package io.quarkus.devui.spi.page;
2+
3+
/**
4+
* Add a setting page to the Dev UI. (Tab in the setting screen)
5+
*/
6+
public final class SettingPageBuildItem extends AbstractPageBuildItem {
7+
8+
public SettingPageBuildItem() {
9+
super();
10+
}
11+
12+
public SettingPageBuildItem(PageBuilder... pageBuilder) {
13+
super(pageBuilder);
14+
}
15+
16+
public SettingPageBuildItem(String customIdentifier, PageBuilder... pageBuilder) {
17+
super(customIdentifier, pageBuilder);
18+
}
19+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package io.quarkus.devui.spi.page;
2+
3+
/**
4+
* Add a unlisted page to the Dev UI. Page that is not linked from anywhere in the Dashboard, but reachable if you know the url
5+
*/
6+
public final class UnlistedPageBuildItem extends AbstractPageBuildItem {
7+
8+
public UnlistedPageBuildItem() {
9+
super();
10+
}
11+
12+
public UnlistedPageBuildItem(PageBuilder... pageBuilder) {
13+
super(pageBuilder);
14+
}
15+
16+
public UnlistedPageBuildItem(String customIdentifier, PageBuilder... pageBuilder) {
17+
super(customIdentifier, pageBuilder);
18+
}
19+
}

extensions/devui/deployment-spi/src/main/java/io/quarkus/devui/spi/page/WebComponentPageBuilder.java

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,6 @@ protected WebComponentPageBuilder() {
66
super();
77
}
88

9-
protected WebComponentPageBuilder(String icon, String color, String tooltip) {
10-
super(icon, color, tooltip, true);
11-
}
12-
139
public WebComponentPageBuilder componentName(String componentName) {
1410
if (componentName == null || componentName.isEmpty()) {
1511
throw new RuntimeException("Invalid component [" + componentName + "]");

extensions/devui/deployment/src/main/java/io/quarkus/devui/deployment/BuildTimeContentProcessor.java

Lines changed: 49 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,8 @@
7878
import io.quarkus.devui.spi.page.MenuPageBuildItem;
7979
import io.quarkus.devui.spi.page.Page;
8080
import io.quarkus.devui.spi.page.PageBuilder;
81+
import io.quarkus.devui.spi.page.SettingPageBuildItem;
82+
import io.quarkus.devui.spi.page.UnlistedPageBuildItem;
8183
import io.quarkus.maven.dependency.ResolvedDependency;
8284
import io.quarkus.vertx.http.deployment.NonApplicationRootPathBuildItem;
8385
import io.vertx.core.json.jackson.DatabindCodec;
@@ -194,6 +196,8 @@ RelocationImportMapBuildItem createRelocationMap() {
194196
void mapPageBuildTimeData(List<CardPageBuildItem> cards,
195197
List<MenuPageBuildItem> menus,
196198
List<FooterPageBuildItem> footers,
199+
List<SettingPageBuildItem> settings,
200+
List<UnlistedPageBuildItem> unlisteds,
197201
CurateOutcomeBuildItem curateOutcomeBuildItem,
198202
BuildProducer<BuildTimeConstBuildItem> buildTimeConstProducer) {
199203

@@ -221,6 +225,23 @@ void mapPageBuildTimeData(List<CardPageBuildItem> cards,
221225
new BuildTimeConstBuildItem(extensionPathName, buildTimeData));
222226
}
223227
}
228+
for (SettingPageBuildItem setting : settings) {
229+
String extensionPathName = setting.getExtensionPathName(curateOutcomeBuildItem);
230+
Map<String, BuildTimeData> buildTimeData = getBuildTimeDataForPage(setting);
231+
if (!buildTimeData.isEmpty()) {
232+
buildTimeConstProducer.produce(
233+
new BuildTimeConstBuildItem(extensionPathName, buildTimeData));
234+
}
235+
}
236+
237+
for (UnlistedPageBuildItem unlisted : unlisteds) {
238+
String extensionPathName = unlisted.getExtensionPathName(curateOutcomeBuildItem);
239+
Map<String, BuildTimeData> buildTimeData = getBuildTimeDataForPage(unlisted);
240+
if (!buildTimeData.isEmpty()) {
241+
buildTimeConstProducer.produce(
242+
new BuildTimeConstBuildItem(extensionPathName, buildTimeData));
243+
}
244+
}
224245
}
225246

226247
@BuildStep(onlyIf = IsLocalDevelopment.class)
@@ -513,6 +534,8 @@ void createBuildTimeData(BuildProducer<BuildTimeConstBuildItem> buildTimeConstPr
513534
addThemeBuildTimeData(internalBuildTimeData, devUIConfig, themeVarsProducer);
514535
addMenuSectionBuildTimeData(internalBuildTimeData, internalPages, extensionsBuildItem);
515536
addFooterTabBuildTimeData(internalBuildTimeData, extensionsBuildItem, devUIConfig);
537+
addSettingTabBuildTimeData(internalBuildTimeData, extensionsBuildItem);
538+
addUnlistedPageBuildTimeData(internalBuildTimeData, extensionsBuildItem);
516539
addApplicationInfoBuildTimeData(internalBuildTimeData, curateOutcomeBuildItem, nonApplicationRootPathBuildItem);
517540
addIdeBuildTimeData(internalBuildTimeData, effectiveIdeBuildItem, launchModeBuildItem);
518541
buildTimeConstProducer.produce(internalBuildTimeData);
@@ -557,8 +580,7 @@ private void addMenuSectionBuildTimeData(BuildTimeConstBuildItem internalBuildTi
557580
List<InternalPageBuildItem> internalPages,
558581
ExtensionsBuildItem extensionsBuildItem) {
559582
// Menu section
560-
@SuppressWarnings("unchecked")
561-
List<Page> sectionMenu = new ArrayList();
583+
List<Page> sectionMenu = new ArrayList<>();
562584
Collections.sort(internalPages, (t, t1) -> {
563585
return ((Integer) t.getPosition()).compareTo(t1.getPosition());
564586
});
@@ -583,11 +605,34 @@ private void addMenuSectionBuildTimeData(BuildTimeConstBuildItem internalBuildTi
583605
internalBuildTimeData.addBuildTimeData("menuItems", sectionMenu);
584606
}
585607

608+
private void addSettingTabBuildTimeData(BuildTimeConstBuildItem internalBuildTimeData,
609+
ExtensionsBuildItem extensionsBuildItem) {
610+
611+
List<Page> settingTabs = new ArrayList<>();
612+
// Settings from extensions
613+
for (Extension e : extensionsBuildItem.getSettingTabsExtensions()) {
614+
List<Page> pagesFromExtension = e.getSettingPages();
615+
settingTabs.addAll(pagesFromExtension);
616+
}
617+
internalBuildTimeData.addBuildTimeData("settingTabs", settingTabs);
618+
}
619+
620+
private void addUnlistedPageBuildTimeData(BuildTimeConstBuildItem internalBuildTimeData,
621+
ExtensionsBuildItem extensionsBuildItem) {
622+
623+
List<Page> unlistedPages = new ArrayList<>();
624+
// Unlisted pages from extensions
625+
for (Extension e : extensionsBuildItem.getUnlistedExtensions()) {
626+
List<Page> pagesFromExtension = e.getUnlistedPages();
627+
unlistedPages.addAll(pagesFromExtension);
628+
}
629+
internalBuildTimeData.addBuildTimeData("unlistedPages", unlistedPages);
630+
}
631+
586632
private void addFooterTabBuildTimeData(BuildTimeConstBuildItem internalBuildTimeData,
587633
ExtensionsBuildItem extensionsBuildItem, DevUIConfig devUIConfig) {
588634
// Add the Footer tabs
589-
@SuppressWarnings("unchecked")
590-
List<Page> footerTabs = new ArrayList();
635+
List<Page> footerTabs = new ArrayList<>();
591636
Page serverLog = Page.webComponentPageBuilder().internal()
592637
.namespace("devui-logstream")
593638
.title("Server")

extensions/devui/deployment/src/main/java/io/quarkus/devui/deployment/DevMCPConfig.java

Lines changed: 0 additions & 17 deletions
This file was deleted.

0 commit comments

Comments
 (0)