From dfa1ddba1b10b8de780c33f6ca9880361ceab582 Mon Sep 17 00:00:00 2001 From: Andy Damevin Date: Wed, 14 Aug 2024 09:35:20 +0200 Subject: [PATCH] Fix presets (#1461) * Fix stream presets * Preset Fixes --- .../code/testing/AcceptanceTestApp.java | 3 +- .../icons}/presets/ai-infused.svg | 0 .../media => assets/icons}/presets/cli.svg | 0 .../icons}/presets/db-service.svg | 0 .../icons}/presets/event-driven-kafka.svg | 0 .../icons}/presets/webapp-mvc.svg | 0 .../icons}/presets/webapp-npm.svg | 0 .../icons}/presets/webapp-qute.svg | 0 .../code/rest/CodeQuarkusResource.java | 23 ++++++++++----- .../quarkus/code/service/PlatformService.java | 29 +++++++++++++++---- .../extensions-picker/presets-panel.tsx | 12 +++++--- 11 files changed, 49 insertions(+), 18 deletions(-) rename base/{src/main/resources/web/static/media => assets/icons}/presets/ai-infused.svg (100%) rename base/{src/main/resources/web/static/media => assets/icons}/presets/cli.svg (100%) rename base/{src/main/resources/web/static/media => assets/icons}/presets/db-service.svg (100%) rename base/{src/main/resources/web/static/media => assets/icons}/presets/event-driven-kafka.svg (100%) rename base/{src/main/resources/web/static/media => assets/icons}/presets/webapp-mvc.svg (100%) rename base/{src/main/resources/web/static/media => assets/icons}/presets/webapp-npm.svg (100%) rename base/{src/main/resources/web/static/media => assets/icons}/presets/webapp-qute.svg (100%) diff --git a/acceptance-test/src/main/java/io/quarkus/code/testing/AcceptanceTestApp.java b/acceptance-test/src/main/java/io/quarkus/code/testing/AcceptanceTestApp.java index a9fce498d..58170d842 100644 --- a/acceptance-test/src/main/java/io/quarkus/code/testing/AcceptanceTestApp.java +++ b/acceptance-test/src/main/java/io/quarkus/code/testing/AcceptanceTestApp.java @@ -33,6 +33,7 @@ public class AcceptanceTestApp implements QuarkusApplication { private static final Logger LOG = LoggerFactory.getLogger(AcceptanceTestApp.class); private static final String GENERATE_YOUR_APPLICATION_TEXT = "generate your application"; + public static final String LABEL_TOGGLE_FULL_LIST = "[aria-label='Toggle full list of extensions']"; public static final String LABEL_DOWNLOAD_THE_ZIP = "[aria-label='Download the zip']"; private static final int DEFAULT_MIN_EXTENSIONS = 50; private static final int DEFAULT_MIN_STREAMS = 1; @@ -80,7 +81,7 @@ public int run(String... args) throws Exception { } else { LOG.info("{} streams found", streams.size()); } - + page.waitForSelector(LABEL_TOGGLE_FULL_LIST).click(); page.waitForSelector(".extensions-picker .extension-row"); final List extensions = page.querySelectorAll(".extensions-picker .extension-row"); final Integer minExtensions = testConfig.getMinExtensions().orElse(DEFAULT_MIN_EXTENSIONS); diff --git a/base/src/main/resources/web/static/media/presets/ai-infused.svg b/base/assets/icons/presets/ai-infused.svg similarity index 100% rename from base/src/main/resources/web/static/media/presets/ai-infused.svg rename to base/assets/icons/presets/ai-infused.svg diff --git a/base/src/main/resources/web/static/media/presets/cli.svg b/base/assets/icons/presets/cli.svg similarity index 100% rename from base/src/main/resources/web/static/media/presets/cli.svg rename to base/assets/icons/presets/cli.svg diff --git a/base/src/main/resources/web/static/media/presets/db-service.svg b/base/assets/icons/presets/db-service.svg similarity index 100% rename from base/src/main/resources/web/static/media/presets/db-service.svg rename to base/assets/icons/presets/db-service.svg diff --git a/base/src/main/resources/web/static/media/presets/event-driven-kafka.svg b/base/assets/icons/presets/event-driven-kafka.svg similarity index 100% rename from base/src/main/resources/web/static/media/presets/event-driven-kafka.svg rename to base/assets/icons/presets/event-driven-kafka.svg diff --git a/base/src/main/resources/web/static/media/presets/webapp-mvc.svg b/base/assets/icons/presets/webapp-mvc.svg similarity index 100% rename from base/src/main/resources/web/static/media/presets/webapp-mvc.svg rename to base/assets/icons/presets/webapp-mvc.svg diff --git a/base/src/main/resources/web/static/media/presets/webapp-npm.svg b/base/assets/icons/presets/webapp-npm.svg similarity index 100% rename from base/src/main/resources/web/static/media/presets/webapp-npm.svg rename to base/assets/icons/presets/webapp-npm.svg diff --git a/base/src/main/resources/web/static/media/presets/webapp-qute.svg b/base/assets/icons/presets/webapp-qute.svg similarity index 100% rename from base/src/main/resources/web/static/media/presets/webapp-qute.svg rename to base/assets/icons/presets/webapp-qute.svg diff --git a/base/src/main/java/io/quarkus/code/rest/CodeQuarkusResource.java b/base/src/main/java/io/quarkus/code/rest/CodeQuarkusResource.java index c6f21b214..e9e0beb9c 100644 --- a/base/src/main/java/io/quarkus/code/rest/CodeQuarkusResource.java +++ b/base/src/main/java/io/quarkus/code/rest/CodeQuarkusResource.java @@ -29,6 +29,7 @@ import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.List; +import java.util.Map; import java.util.logging.Logger; import java.util.stream.Collectors; @@ -154,15 +155,11 @@ public Uni extensionsForStream( @Tag(name = "Presets", description = "Preset related endpoints") @APIResponse(responseCode = "200", description = "List of Presets", content = @Content(mediaType = MediaType.APPLICATION_JSON, schema = @Schema(implementation = Preset.class, type = SchemaType.ARRAY))) public Uni presets() { - String lastUpdated = platformService.cacheLastUpdated().format(FORMATTER); - Response response = Response.ok(PRESETS) - .header(LAST_MODIFIED_HEADER, lastUpdated) - .build(); - return Uni.createFrom().item(response); + return presets(platformService.recommendedPlatformInfo().extensionsById()); } @GET - @Path("/extensions/presets/{streamKey}") + @Path("/presets/stream/{streamKey}") @Produces(MediaType.APPLICATION_JSON) @NoCache @Operation(operationId = "presetsForStream", summary = "Get the Quarkus Launcher list of Presets") @@ -170,7 +167,19 @@ public Uni presets() { @APIResponse(responseCode = "200", description = "List of Presets for a certain stream", content = @Content(mediaType = MediaType.APPLICATION_JSON, schema = @Schema(implementation = Preset.class, type = SchemaType.ARRAY))) public Uni presetsForStream( @PathParam("streamKey") String streamKey) { - return presets(); + + final Map extensionsById = platformService.platformInfo(streamKey).extensionsById(); + return presets(extensionsById); + } + + private Uni presets(Map extensionsById) { + String lastUpdated = platformService.cacheLastUpdated().format(FORMATTER); + final List presets = PRESETS.stream().filter(p -> p.extensions().stream().allMatch(extensionsById::containsKey)) + .toList(); + Response response = Response.ok(presets) + .header(LAST_MODIFIED_HEADER, lastUpdated) + .build(); + return Uni.createFrom().item(response); } private Uni extensions( diff --git a/base/src/main/java/io/quarkus/code/service/PlatformService.java b/base/src/main/java/io/quarkus/code/service/PlatformService.java index f877615e8..9b406b945 100644 --- a/base/src/main/java/io/quarkus/code/service/PlatformService.java +++ b/base/src/main/java/io/quarkus/code/service/PlatformService.java @@ -49,17 +49,34 @@ public class PlatformService { public static final List PRESETS = List.of( - new Preset("db-service", "Microservice with database", "/static/media/presets/db-service.svg", + new Preset("db-service-reactive", "Microservice with database", + "https://raw.githubusercontent.com/quarkusio/code.quarkus.io/main/base/assets/icons/presets/db-service.svg", + List.of("io.quarkus:quarkus-resteasy-reactive", "io.quarkus:quarkus-resteasy-reactive-jackson", + "io.quarkus:quarkus-hibernate-reactive-panache", "io.quarkus:quarkus-jdbc-postgresql")), + new Preset("webapp-npm-reactive", "Web app with NPM UI", + "https://raw.githubusercontent.com/quarkusio/code.quarkus.io/main/base/assets/icons/presets/webapp-npm.svg", + List.of("io.quarkus:quarkus-resteasy-reactive", "io.quarkus:quarkus-resteasy-reactive-jackson", + "io.quarkiverse.quinoa:quarkus-quinoa")), + new Preset("event-driven-reactive-kafka", "Event driven service with Kafka", + "https://raw.githubusercontent.com/quarkusio/code.quarkus.io/main/base/assets/icons/presets/event-driven-kafka.svg", + List.of("io.quarkus:quarkus-smallrye-reactive-messaging-kafka")), + new Preset("db-service", "Microservice with database", + "https://raw.githubusercontent.com/quarkusio/code.quarkus.io/main/base/assets/icons/presets/db-service.svg", List.of("io.quarkus:quarkus-rest", "io.quarkus:quarkus-rest-jackson", "io.quarkus:quarkus-hibernate-orm-panache", "io.quarkus:quarkus-jdbc-postgresql")), - new Preset("event-driven-kafka", "Event driven service with Kafka", "/static/media/presets/event-driven-kafka.svg", + new Preset("event-driven-kafka", "Event driven service with Kafka", + "https://raw.githubusercontent.com/quarkusio/code.quarkus.io/main/base/assets/icons/presets/event-driven-kafka.svg", List.of("io.quarkus:quarkus-messaging-kafka")), - new Preset("cli", "Command-line tool", "/static/media/presets/cli.svg", + new Preset("cli", "Command-line tool", + "https://raw.githubusercontent.com/quarkusio/code.quarkus.io/main/base/assets/icons/presets/cli.svg", List.of("io.quarkus:quarkus-picocli")), - new Preset("webapp-mvc", "Web app with Model-View-Controller", "/static/media/presets/webapp-mvc.svg", + new Preset("webapp-mvc", "Web app with Model-View-Controller", + "https://raw.githubusercontent.com/quarkusio/code.quarkus.io/main/base/assets/icons/presets/webapp-mvc.svg", List.of("io.quarkiverse.renarde:quarkus-renarde", "io.quarkiverse.web-bundler:quarkus-web-bundler")), - new Preset("webapp-npm", "Web app with NPM UI", "/static/media/presets/webapp-npm.svg", - List.of("io.quarkus:quarkus-rest", "io.quarkiverse.quinoa:quarkus-quinoa")), + new Preset("webapp-npm", "Web app with NPM UI", + "https://raw.githubusercontent.com/quarkusio/code.quarkus.io/main/base/assets/icons/presets/webapp-npm.svg", + List.of("io.quarkus:quarkus-rest", "io.quarkus:quarkus-rest-jackson", + "io.quarkiverse.quinoa:quarkus-quinoa")), new Preset("webapp-qute", "Web app with ServerSide Rendering", "static/media/presets/webapp-qute.svg", List.of("io.quarkiverse.qute.web:quarkus-qute-web", "io.quarkiverse.web-bundler:quarkus-web-bundler")), new Preset("ai-infused", "AI Infused service", "static/media/presets/ai-infused.svg", diff --git a/base/src/main/resources/web/lib/components/extensions-picker/presets-panel.tsx b/base/src/main/resources/web/lib/components/extensions-picker/presets-panel.tsx index 1f7b9ea39..59d73b613 100644 --- a/base/src/main/resources/web/lib/components/extensions-picker/presets-panel.tsx +++ b/base/src/main/resources/web/lib/components/extensions-picker/presets-panel.tsx @@ -2,6 +2,7 @@ import styled from 'styled-components'; import {TagEntry} from "./extensions-picker"; import {Platform, Preset} from "../api/model"; import _ from "lodash"; +import {useAnalytics} from "../../core/analytics"; interface PresetsProps { platform: Platform, @@ -15,7 +16,7 @@ const PresetsPanelDiv = styled.div` .panel-title { font-weight: bold; color: var(--extensionsPickerCategoryTextColor); - font-size: 1.1rem; + font-size: 1.3rem; margin: 10px 0 10px 0; height: 30px; } @@ -39,16 +40,16 @@ const PresetsPanelDiv = styled.div` .preset-title { color: var(--presetsCardTextColor); - font-size: 1.2rem; + font-size: 1.1rem; text-align: center; } .preset-icon { - flex-basis: 130px; + flex-basis: 110px; } .preset-icon img { - width: 100px; + width: 90px; } `; @@ -63,12 +64,15 @@ export const PresetCard = (props: { preset: Preset, tagsDef: TagEntry[], onClick } export const PresetsPanel = (props: PresetsProps) => { + let analytics = useAnalytics(); + const context = {element: 'preset-picker'}; const byId = _.keyBy(props.platform.extensions, ({id}) => id); const presets = props.platform.presets.map(p => ({ ...p, resolvedExtensions: p.extensions.filter(e => byId[e]).map(e => byId[e]) } as Preset)) const selectPreset = (preset: Preset) => { + analytics.event('Select preset', {preset: preset.key, ...context}); preset.extensions.forEach(e => props.select(e, "presets")); }; return (