Skip to content

Commit

Permalink
feat: use Flow menu item collection (#2425)
Browse files Browse the repository at this point in the history
* feat: use Flow menu item collection

Unify the views.json to use the same
names as createViewConfigJson generates.

depends on vaadin/flow#19355

Part of #19321

* Remove new extra filed from result

---------

Co-authored-by: Soroosh Taefi <taefi.soroosh@gmail.com>
  • Loading branch information
caalador and taefi authored May 15, 2024
1 parent f49aed6 commit 4d99972
Show file tree
Hide file tree
Showing 11 changed files with 186 additions and 340 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -21,35 +21,31 @@
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.function.Predicate;
import java.util.stream.Stream;

import com.vaadin.flow.function.DeploymentConfiguration;
import com.vaadin.flow.router.BeforeEnterListener;
import com.vaadin.flow.server.VaadinRequest;
import com.vaadin.flow.router.RouteConfiguration;
import com.vaadin.flow.server.auth.MenuAccessControl;
import com.vaadin.flow.server.auth.NavigationAccessControl;
import com.vaadin.flow.server.auth.ViewAccessChecker;
import com.vaadin.flow.server.menu.AvailableViewInfo;
import com.vaadin.flow.server.menu.MenuRegistry;
import com.vaadin.hilla.route.records.ClientViewConfig;

import com.fasterxml.jackson.annotation.JsonIgnore;
import org.jsoup.nodes.DataNode;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.lang.Nullable;

import com.vaadin.flow.internal.AnnotationReader;
import com.vaadin.flow.router.PageTitle;
import com.vaadin.flow.router.RouteData;
import com.vaadin.flow.server.RouteRegistry;
import com.vaadin.flow.server.VaadinService;
import com.vaadin.flow.server.communication.IndexHtmlRequestListener;
import com.vaadin.flow.server.communication.IndexHtmlResponse;
import com.vaadin.hilla.route.records.AvailableViewInfo;
import com.vaadin.hilla.route.records.ClientViewMenuConfig;
import com.vaadin.hilla.route.records.RouteParamType;

/**
* Index HTML request listener for collecting the client side and the server
Expand Down Expand Up @@ -98,6 +94,8 @@ public RouteUnifyingIndexHtmlRequestListener(
this.accessControl = accessControl;
this.viewAccessChecker = viewAccessChecker;
this.exposeServerRoutesToClient = exposeServerRoutesToClient;

mapper.addMixIn(AvailableViewInfo.class, IgnoreMixin.class);
}

@Override
Expand All @@ -110,8 +108,7 @@ public void modifyIndexHtmlResponse(IndexHtmlResponse response) {
if (exposeServerRoutesToClient) {
LOGGER.debug(
"Exposing server-side views to the client based on user configuration");
availableViews
.putAll(collectServerViews(response.getVaadinRequest()));
availableViews.putAll(collectServerViews());
}

if (availableViews.isEmpty()) {
Expand Down Expand Up @@ -153,14 +150,14 @@ protected Map<String, AvailableViewInfo> collectClientViews(
config.getTitle(), config.getRolesAllowed(),
config.isLoginRequired(), config.getRoute(),
config.isLazy(), config.isAutoRegistered(),
config.menu(), config.getRouteParameters());
config.menu(), Collections.emptyList(),
config.getRouteParameters());
clientViews.put(route, availableViewInfo);
});
return clientViews;
}

protected Map<String, AvailableViewInfo> collectServerViews(
VaadinRequest vaadinRequest) {
protected Map<String, AvailableViewInfo> collectServerViews() {
var serverViews = new HashMap<String, AvailableViewInfo>();
final VaadinService vaadinService = VaadinService.getCurrent();
if (vaadinService == null) {
Expand All @@ -175,68 +172,21 @@ protected Map<String, AvailableViewInfo> collectServerViews(
.of(accessControl, viewAccessChecker).filter(Objects::nonNull)
.toList();

List<RouteData> serverRoutes = Collections.emptyList();
if (vaadinService.getInstantiator().getMenuAccessControl()
.getPopulateClientSideMenu() == MenuAccessControl.PopulateClientMenu.ALWAYS
|| clientRouteRegistry.hasMainLayout()) {
serverRoutes = serverRouteRegistry
.getRegisteredAccessibleMenuRoutes(vaadinRequest,
accessControls);
MenuRegistry.collectAndAddServerMenuItems(
RouteConfiguration.forRegistry(serverRouteRegistry),
accessControls, serverViews);
}
serverRoutes.forEach(serverView -> {
final Class<? extends com.vaadin.flow.component.Component> viewClass = serverView
.getNavigationTarget();
final String targetUrl = serverView.getTemplate();
if (targetUrl != null) {
final String url = "/" + targetUrl;

final String title;
PageTitle pageTitle = AnnotationReader
.getAnnotationFor(viewClass, PageTitle.class)
.orElse(null);
if (pageTitle != null) {
title = pageTitle.value();
} else {
title = serverView.getNavigationTarget().getSimpleName();
}

final ClientViewMenuConfig menuConfig = Optional
.ofNullable(serverView.getMenuData())
.map(menu -> new ClientViewMenuConfig(
(menu.getTitle() == null
|| menu.getTitle().isBlank()) ? title
: menu.getTitle(),
menu.getOrder(), menu.getIcon(),
menu.isExclude()))
.orElse(null);

final Map<String, RouteParamType> routeParameters = getRouteParameters(
serverView);

final AvailableViewInfo availableViewInfo = new AvailableViewInfo(
title, null, false, url, false, false, menuConfig,
routeParameters);
serverViews.put(url, availableViewInfo);
}
});
return serverViews;
}

private Map<String, RouteParamType> getRouteParameters(
RouteData serverView) {
final Map<String, RouteParamType> routeParameters = new HashMap<>();
serverView.getRouteParameters().forEach((route, params) -> {
if (params.getTemplate().contains("*")) {
routeParameters.put(params.getTemplate(),
RouteParamType.WILDCARD);
} else if (params.getTemplate().contains("?")) {
routeParameters.put(params.getTemplate(),
RouteParamType.OPTIONAL);
} else {
routeParameters.put(params.getTemplate(),
RouteParamType.REQUIRED);
}
});
return routeParameters;
/**
* Mixin to ignore unwanted fields in the json results.
*/
abstract class IgnoreMixin {
@JsonIgnore
abstract List<AvailableViewInfo> children(); // we don't need it!
}
}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,9 @@
import java.util.Map;
import java.util.Objects;

import com.vaadin.flow.router.MenuData;
import com.vaadin.flow.server.menu.RouteParamType;

/**
* Implementation of TypeScript's Hilla ConfigView. Represents a view
* configuration from Hilla file-system-routing module.
Expand All @@ -21,7 +24,7 @@ public final class ClientViewConfig {
private String route;
private boolean lazy;
private boolean autoRegistered;
private ClientViewMenuConfig menu;
private MenuData menu;
private List<ClientViewConfig> children;
@JsonProperty("params")
private Map<String, RouteParamType> routeParameters;
Expand Down Expand Up @@ -79,7 +82,7 @@ public boolean isAutoRegistered() {
return autoRegistered;
}

public ClientViewMenuConfig menu() {
public MenuData menu() {
return menu;
}

Expand Down Expand Up @@ -124,7 +127,7 @@ public void setAutoRegistered(boolean autoRegistered) {
this.autoRegistered = autoRegistered;
}

public void setMenu(ClientViewMenuConfig menu) {
public void setMenu(MenuData menu) {
this.menu = menu;
}

Expand Down

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package com.vaadin.hilla.route;

import com.vaadin.flow.function.DeploymentConfiguration;
import com.vaadin.flow.server.menu.RouteParamType;
import com.vaadin.hilla.route.records.ClientViewConfig;
import com.vaadin.hilla.route.records.RouteParamType;

import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,9 +35,9 @@
import com.vaadin.flow.server.VaadinService;
import com.vaadin.flow.server.auth.MenuAccessControl;
import com.vaadin.flow.server.communication.IndexHtmlResponse;
import com.vaadin.hilla.route.records.AvailableViewInfo;
import com.vaadin.flow.server.menu.AvailableViewInfo;
import com.vaadin.flow.server.menu.RouteParamType;
import com.vaadin.hilla.route.records.ClientViewConfig;
import com.vaadin.hilla.route.records.RouteParamType;

import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.mock;
Expand Down Expand Up @@ -337,7 +337,7 @@ public void should_collectServerViews() {
.mockStatic(VaadinService.class)) {
mocked.when(VaadinService::getCurrent).thenReturn(vaadinService);

views = requestListener.collectServerViews(vaadinRequest);
views = requestListener.collectServerViews();
}
MatcherAssert.assertThat(views, Matchers.aMapWithSize(5));
MatcherAssert.assertThat(views.get("/bar").title(),
Expand Down
Loading

0 comments on commit 4d99972

Please sign in to comment.