diff --git a/packages/java/endpoint/src/main/java/com/vaadin/hilla/route/RouteUnifyingIndexHtmlRequestListener.java b/packages/java/endpoint/src/main/java/com/vaadin/hilla/route/RouteUnifyingIndexHtmlRequestListener.java index 2925ae196d..8b43a665d9 100644 --- a/packages/java/endpoint/src/main/java/com/vaadin/hilla/route/RouteUnifyingIndexHtmlRequestListener.java +++ b/packages/java/endpoint/src/main/java/com/vaadin/hilla/route/RouteUnifyingIndexHtmlRequestListener.java @@ -26,6 +26,7 @@ import java.util.stream.Collectors; import java.util.stream.Stream; +import com.vaadin.hilla.route.records.ClientViewConfig; import org.jsoup.nodes.DataNode; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -138,21 +139,28 @@ protected Map collectClientViews( deploymentConfiguration); } - return clientRouteRegistry.getAllRoutes().values().stream() - .filter(config -> config.getRouteParameters() == null - || config.getRouteParameters().isEmpty() - || config.getRouteParameters().values().stream() - .noneMatch( - param -> param == RouteParamType.REQUIRED)) - .filter(config -> routeUtil.isRouteAllowed(isUserInRole, - isUserAuthenticated, config)) - .map(config -> new AvailableViewInfo(config.getTitle(), - config.getRolesAllowed(), config.isLoginRequired(), - config.getRoute(), config.isLazy(), - config.isAutoRegistered(), config.menu(), - config.getRouteParameters())) - .collect(Collectors.toMap(AvailableViewInfo::route, - Function.identity())); + return clientRouteRegistry.getAllRoutes().entrySet().stream() + .filter(viewMapping -> !hasRequiredParameter( + viewMapping.getValue().getRouteParameters())) + .filter(viewMapping -> routeUtil.isRouteAllowed(isUserInRole, + isUserAuthenticated, viewMapping.getValue())) + .collect(Collectors.toMap(Map.Entry::getKey, + viewMapping -> toAvailableViewInfo( + viewMapping.getValue()))); + } + + private boolean hasRequiredParameter( + Map routeParameters) { + return routeParameters != null && !routeParameters.isEmpty() + && routeParameters.values().stream().anyMatch( + paramType -> paramType == RouteParamType.REQUIRED); + } + + private AvailableViewInfo toAvailableViewInfo(ClientViewConfig config) { + return new AvailableViewInfo(config.getTitle(), + config.getRolesAllowed(), config.isLoginRequired(), + config.getRoute(), config.isLazy(), config.isAutoRegistered(), + config.menu(), config.getRouteParameters()); } protected Map collectServerViews( diff --git a/packages/java/endpoint/src/test/java/com/vaadin/hilla/route/RouteUnifyingIndexHtmlRequestListenerTest.java b/packages/java/endpoint/src/test/java/com/vaadin/hilla/route/RouteUnifyingIndexHtmlRequestListenerTest.java index b61be24a22..0624a67284 100644 --- a/packages/java/endpoint/src/test/java/com/vaadin/hilla/route/RouteUnifyingIndexHtmlRequestListenerTest.java +++ b/packages/java/endpoint/src/test/java/com/vaadin/hilla/route/RouteUnifyingIndexHtmlRequestListenerTest.java @@ -151,6 +151,30 @@ private Map prepareClientRoutes() { .setRouteParameters(Map.of(":userId", RouteParamType.REQUIRED)); routes.put("/user/:userId", userProfileConfig); + ClientViewConfig rootIndexConfig = new ClientViewConfig(); + rootIndexConfig.setTitle("Index"); + rootIndexConfig.setRolesAllowed(null); + rootIndexConfig.setLoginRequired(false); + rootIndexConfig.setRoute(""); + rootIndexConfig.setLazy(false); + rootIndexConfig.setAutoRegistered(false); + rootIndexConfig.setMenu(null); + rootIndexConfig.setChildren(Collections.emptyList()); + rootIndexConfig.setRouteParameters(Collections.emptyMap()); + routes.put("/", rootIndexConfig); + + ClientViewConfig ordersIndexConfig = new ClientViewConfig(); + ordersIndexConfig.setTitle("Orders"); + ordersIndexConfig.setRolesAllowed(null); + ordersIndexConfig.setLoginRequired(false); + ordersIndexConfig.setRoute(""); + ordersIndexConfig.setLazy(false); + ordersIndexConfig.setAutoRegistered(false); + ordersIndexConfig.setMenu(null); + ordersIndexConfig.setChildren(Collections.emptyList()); + ordersIndexConfig.setRouteParameters(Collections.emptyMap()); + routes.put("/orders", ordersIndexConfig); + return routes; } @@ -360,7 +384,7 @@ public void when_productionMode_should_collectClientViews() { boolean isAuthenticated = true; var views = requestListener.collectClientViews(isUserInRole, isAuthenticated); - MatcherAssert.assertThat(views, Matchers.aMapWithSize(2)); + MatcherAssert.assertThat(views, Matchers.aMapWithSize(4)); } @Test @@ -371,7 +395,7 @@ public void when_developmentMode_should_collectClientViews() Predicate isUserInRole = role -> true; var views = requestListener.collectClientViews(isUserInRole, isUserAuthenticated); - MatcherAssert.assertThat(views, Matchers.aMapWithSize(2)); + MatcherAssert.assertThat(views, Matchers.aMapWithSize(4)); } @Test diff --git a/packages/java/endpoint/src/test/resources/META-INF/VAADIN/available-views-admin.json b/packages/java/endpoint/src/test/resources/META-INF/VAADIN/available-views-admin.json index db9e99c7bc..8236fe1f1c 100644 --- a/packages/java/endpoint/src/test/resources/META-INF/VAADIN/available-views-admin.json +++ b/packages/java/endpoint/src/test/resources/META-INF/VAADIN/available-views-admin.json @@ -62,5 +62,25 @@ "params": { ":___commentId?": "opt" } + }, + "/": { + "title": "Index", + "rolesAllowed": null, + "requiresLogin": false, + "route": "", + "lazy": false, + "register": false, + "menu": null, + "params": {} + }, + "/orders": { + "title": "Orders", + "rolesAllowed": null, + "requiresLogin": false, + "route": "", + "lazy": false, + "register": false, + "menu": null, + "params": {} } } diff --git a/packages/java/endpoint/src/test/resources/META-INF/VAADIN/available-views-anonymous.json b/packages/java/endpoint/src/test/resources/META-INF/VAADIN/available-views-anonymous.json index 4a5b22e3a1..5eac1cba66 100644 --- a/packages/java/endpoint/src/test/resources/META-INF/VAADIN/available-views-anonymous.json +++ b/packages/java/endpoint/src/test/resources/META-INF/VAADIN/available-views-anonymous.json @@ -52,5 +52,25 @@ "params": { ":___commentId?": "opt" } + }, + "/": { + "title": "Index", + "rolesAllowed": null, + "requiresLogin": false, + "route": "", + "lazy": false, + "register": false, + "menu": null, + "params": {} + }, + "/orders": { + "title": "Orders", + "rolesAllowed": null, + "requiresLogin": false, + "route": "", + "lazy": false, + "register": false, + "menu": null, + "params": {} } } diff --git a/packages/java/endpoint/src/test/resources/META-INF/VAADIN/available-views-user.json b/packages/java/endpoint/src/test/resources/META-INF/VAADIN/available-views-user.json index db9e99c7bc..8236fe1f1c 100644 --- a/packages/java/endpoint/src/test/resources/META-INF/VAADIN/available-views-user.json +++ b/packages/java/endpoint/src/test/resources/META-INF/VAADIN/available-views-user.json @@ -62,5 +62,25 @@ "params": { ":___commentId?": "opt" } + }, + "/": { + "title": "Index", + "rolesAllowed": null, + "requiresLogin": false, + "route": "", + "lazy": false, + "register": false, + "menu": null, + "params": {} + }, + "/orders": { + "title": "Orders", + "rolesAllowed": null, + "requiresLogin": false, + "route": "", + "lazy": false, + "register": false, + "menu": null, + "params": {} } } diff --git a/packages/java/endpoint/src/test/resources/META-INF/VAADIN/only-client-views.json b/packages/java/endpoint/src/test/resources/META-INF/VAADIN/only-client-views.json index 4338863244..6776409383 100644 --- a/packages/java/endpoint/src/test/resources/META-INF/VAADIN/only-client-views.json +++ b/packages/java/endpoint/src/test/resources/META-INF/VAADIN/only-client-views.json @@ -18,5 +18,25 @@ "register": false, "menu": null, "params": {} + }, + "/": { + "title": "Index", + "rolesAllowed": null, + "requiresLogin": false, + "route": "", + "lazy": false, + "register": false, + "menu": null, + "params": {} + }, + "/orders": { + "title": "Orders", + "rolesAllowed": null, + "requiresLogin": false, + "route": "", + "lazy": false, + "register": false, + "menu": null, + "params": {} } }