Search in sources :

Example 1 with HasElement

use of com.vaadin.flow.component.HasElement in project flow by vaadin.

the class BootstrapUtils method createInitialPageSettingsObject.

private static InitialPageSettings createInitialPageSettingsObject(BootstrapHandler.BootstrapContext context) {
    UI ui = context.getUI();
    VaadinRequest request = context.getRequest();
    WebBrowser browser = context.getSession().getBrowser();
    String pathInfo = request.getPathInfo();
    if (pathInfo == null) {
        pathInfo = "";
    } else {
        assert pathInfo.startsWith("/");
        pathInfo = pathInfo.substring(1);
    }
    Optional<Router> router = ui.getRouter();
    NavigationEvent navigationEvent = new NavigationEvent(router.isPresent() ? router.get() : null, new Location(pathInfo, QueryParameters.full(request.getParameterMap())), ui, NavigationTrigger.PAGE_LOAD);
    List<HasElement> components = ui.getChildren().map(component -> (HasElement) component).collect(Collectors.toList());
    AfterNavigationEvent afterNavigationEvent = new AfterNavigationEvent(RouterUtil.createEvent(navigationEvent, components));
    return new InitialPageSettings(request, ui, afterNavigationEvent, browser);
}
Also used : Inline(com.vaadin.flow.component.page.Inline) TargetElement(com.vaadin.flow.component.page.TargetElement) Json(elemental.json.Json) VaadinUriResolver(com.vaadin.flow.shared.VaadinUriResolver) RouterUtil(com.vaadin.flow.router.internal.RouterUtil) Dependency(com.vaadin.flow.shared.ui.Dependency) Router(com.vaadin.flow.router.Router) Route(com.vaadin.flow.router.Route) Theme(com.vaadin.flow.theme.Theme) Charset(java.nio.charset.Charset) Map(java.util.Map) Location(com.vaadin.flow.router.Location) UI(com.vaadin.flow.component.UI) AbstractTheme(com.vaadin.flow.theme.AbstractTheme) NavigationTrigger(com.vaadin.flow.router.NavigationTrigger) QueryParameters(com.vaadin.flow.router.QueryParameters) RouterLayout(com.vaadin.flow.router.RouterLayout) EnumMap(java.util.EnumMap) HasElement(com.vaadin.flow.component.HasElement) ReflectTools(com.vaadin.flow.internal.ReflectTools) IOException(java.io.IOException) InputStreamReader(java.io.InputStreamReader) Collectors(java.util.stream.Collectors) StandardCharsets(java.nio.charset.StandardCharsets) HtmlImport(com.vaadin.flow.component.dependency.HtmlImport) List(java.util.List) Stream(java.util.stream.Stream) AfterNavigationEvent(com.vaadin.flow.router.AfterNavigationEvent) LoadMode(com.vaadin.flow.shared.ui.LoadMode) BodySize(com.vaadin.flow.component.page.BodySize) Optional(java.util.Optional) JsonObject(elemental.json.JsonObject) BufferedReader(java.io.BufferedReader) Collections(java.util.Collections) Viewport(com.vaadin.flow.component.page.Viewport) NavigationEvent(com.vaadin.flow.router.NavigationEvent) ParentLayout(com.vaadin.flow.router.ParentLayout) InputStream(java.io.InputStream) AfterNavigationEvent(com.vaadin.flow.router.AfterNavigationEvent) NavigationEvent(com.vaadin.flow.router.NavigationEvent) Router(com.vaadin.flow.router.Router) UI(com.vaadin.flow.component.UI) HasElement(com.vaadin.flow.component.HasElement) Location(com.vaadin.flow.router.Location) AfterNavigationEvent(com.vaadin.flow.router.AfterNavigationEvent)

Example 2 with HasElement

use of com.vaadin.flow.component.HasElement in project flow by vaadin.

the class AbstractNavigationStateRenderer method handle.

@Override
public int handle(NavigationEvent event) {
    UI ui = event.getUI();
    Class<? extends Component> routeTargetType = navigationState.getNavigationTarget();
    List<Class<? extends RouterLayout>> routeLayoutTypes = getRouterLayoutTypes(routeTargetType);
    assert routeTargetType != null;
    assert routeLayoutTypes != null;
    clearContinueNavigationAction(ui);
    RouterUtil.checkForDuplicates(routeTargetType, routeLayoutTypes);
    if (eventActionsSupported()) {
        BeforeLeaveEvent beforeNavigationDeactivating = new BeforeLeaveEvent(event, routeTargetType);
        Deque<BeforeLeaveHandler> leaveHandlers;
        if (postponed != null) {
            leaveHandlers = postponed.getLeaveObservers();
            if (!leaveHandlers.isEmpty()) {
                postponed = null;
            }
        } else {
            List<BeforeLeaveHandler> beforeLeaveHandlers = new ArrayList<>(ui.getNavigationListeners(BeforeLeaveHandler.class));
            beforeLeaveHandlers.addAll(EventUtil.collectBeforeLeaveObservers(ui.getElement()));
            leaveHandlers = new ArrayDeque<>(beforeLeaveHandlers);
        }
        TransitionOutcome transitionOutcome = executeBeforeLeaveNavigation(beforeNavigationDeactivating, leaveHandlers);
        if (transitionOutcome == TransitionOutcome.REROUTED) {
            return reroute(event, beforeNavigationDeactivating);
        } else if (transitionOutcome == TransitionOutcome.POSTPONED) {
            ContinueNavigationAction currentAction = beforeNavigationDeactivating.getContinueNavigationAction();
            currentAction.setReferences(this, event);
            storeContinueNavigationAction(ui, currentAction);
            return HttpServletResponse.SC_OK;
        }
    }
    Component componentInstance = getRouteTarget(routeTargetType, event);
    List<HasElement> chain = new ArrayList<>();
    chain.add(componentInstance);
    for (Class<? extends RouterLayout> parentType : routeLayoutTypes) {
        chain.add(getRouteTarget(parentType, event));
    }
    BeforeEnterEvent beforeNavigationActivating = new BeforeEnterEvent(event, routeTargetType);
    LocationChangeEvent locationChangeEvent = RouterUtil.createEvent(event, chain);
    notifyNavigationTarget(componentInstance, event, beforeNavigationActivating, locationChangeEvent);
    if (beforeNavigationActivating.hasRerouteTarget()) {
        return reroute(event, beforeNavigationActivating);
    }
    @SuppressWarnings("unchecked") List<RouterLayout> routerLayouts = (List<RouterLayout>) (List<?>) chain.subList(1, chain.size());
    List<BeforeEnterHandler> enterHandlers = new ArrayList<>(ui.getNavigationListeners(BeforeEnterHandler.class));
    enterHandlers.addAll(EventUtil.collectEnterObservers(componentInstance, routerLayouts));
    TransitionOutcome transitionOutcome = executeBeforeEnterNavigation(beforeNavigationActivating, enterHandlers);
    if (eventActionsSupported() && TransitionOutcome.REROUTED.equals(transitionOutcome)) {
        return reroute(event, beforeNavigationActivating);
    }
    ui.getInternals().showRouteTarget(event.getLocation(), navigationState.getResolvedPath(), componentInstance, routerLayouts);
    RouterUtil.updatePageTitle(event, componentInstance);
    int statusCode = locationChangeEvent.getStatusCode();
    validateStatusCode(statusCode, routeTargetType);
    List<AfterNavigationHandler> afterNavigationHandlers = new ArrayList<>(ui.getNavigationListeners(AfterNavigationHandler.class));
    afterNavigationHandlers.addAll(EventUtil.collectAfterNavigationObservers(componentInstance, routerLayouts));
    fireAfterNavigationListeners(new AfterNavigationEvent(locationChangeEvent), afterNavigationHandlers);
    return statusCode;
}
Also used : LocationChangeEvent(com.vaadin.flow.router.LocationChangeEvent) ArrayList(java.util.ArrayList) UI(com.vaadin.flow.component.UI) ArrayList(java.util.ArrayList) List(java.util.List) Component(com.vaadin.flow.component.Component) BeforeEnterEvent(com.vaadin.flow.router.BeforeEnterEvent) BeforeLeaveEvent(com.vaadin.flow.router.BeforeLeaveEvent) RouterLayout(com.vaadin.flow.router.RouterLayout) ContinueNavigationAction(com.vaadin.flow.router.BeforeLeaveEvent.ContinueNavigationAction) HasElement(com.vaadin.flow.component.HasElement) AfterNavigationEvent(com.vaadin.flow.router.AfterNavigationEvent)

Example 3 with HasElement

use of com.vaadin.flow.component.HasElement in project flow by vaadin.

the class AbstractNavigationStateRenderer method getRouteTarget.

/**
 * Gets the component instance to use for the given type and the
 * corresponding navigation event.
 * <p>
 * Override this method to control the creation of view instances.
 * <p>
 * By default always creates new instances.
 *
 * @param <T>
 *            the route target type
 * @param routeTargetType
 *            the class of the route target component
 * @param event
 *            the navigation event that uses the route target
 * @return an instance of the route target component
 */
@SuppressWarnings("unchecked")
static <// Non-private for testing purposes
T extends HasElement> T getRouteTarget(Class<T> routeTargetType, NavigationEvent event) {
    UI ui = event.getUI();
    Optional<HasElement> currentInstance = ui.getInternals().getActiveRouterTargetsChain().stream().filter(component -> component.getClass().equals(routeTargetType)).findAny();
    return (T) currentInstance.orElseGet(() -> Instantiator.get(ui).createRouteTarget(routeTargetType, event));
}
Also used : BeforeLeaveEvent(com.vaadin.flow.router.BeforeLeaveEvent) BeforeEnterEvent(com.vaadin.flow.router.BeforeEnterEvent) Component(com.vaadin.flow.component.Component) Deque(java.util.Deque) BeforeEvent(com.vaadin.flow.router.BeforeEvent) ArrayList(java.util.ArrayList) Route(com.vaadin.flow.router.Route) ErrorParameter(com.vaadin.flow.router.ErrorParameter) Location(com.vaadin.flow.router.Location) LocationChangeEvent(com.vaadin.flow.router.LocationChangeEvent) ContinueNavigationAction(com.vaadin.flow.router.BeforeLeaveEvent.ContinueNavigationAction) ErrorNavigationEvent(com.vaadin.flow.router.ErrorNavigationEvent) UI(com.vaadin.flow.component.UI) BeforeEnterObserver(com.vaadin.flow.router.BeforeEnterObserver) NavigationTrigger(com.vaadin.flow.router.NavigationTrigger) Instantiator(com.vaadin.flow.di.Instantiator) RouterLayout(com.vaadin.flow.router.RouterLayout) NavigationHandler(com.vaadin.flow.router.NavigationHandler) HasElement(com.vaadin.flow.component.HasElement) EventUtil(com.vaadin.flow.router.EventUtil) HttpServletResponse(javax.servlet.http.HttpServletResponse) ReflectTools(com.vaadin.flow.internal.ReflectTools) List(java.util.List) AfterNavigationEvent(com.vaadin.flow.router.AfterNavigationEvent) Optional(java.util.Optional) NavigationState(com.vaadin.flow.router.NavigationState) ArrayDeque(java.util.ArrayDeque) NavigationEvent(com.vaadin.flow.router.NavigationEvent) BeforeLeaveObserver(com.vaadin.flow.router.BeforeLeaveObserver) UI(com.vaadin.flow.component.UI) HasElement(com.vaadin.flow.component.HasElement)

Example 4 with HasElement

use of com.vaadin.flow.component.HasElement in project flow by vaadin.

the class UIInternals method showRouteTarget.

/**
 * Shows a route target in the related UI. This method is intended for
 * framework use only. Use {@link UI#navigate(String)} to change the route
 * target that is shown in a UI.
 *
 * @param viewLocation
 *            the location of the route target relative to the servlet
 *            serving the UI, not <code>null</code>
 * @param path
 *            the resolved route path so we can determine what the rendered
 *            target is for
 * @param target
 *            the component to show, not <code>null</code>
 * @param layouts
 *            the parent layouts
 */
public void showRouteTarget(Location viewLocation, String path, Component target, List<RouterLayout> layouts) {
    assert target != null;
    assert viewLocation != null;
    updateTheme(target, path);
    this.viewLocation = viewLocation;
    Element uiElement = ui.getElement();
    // Assemble previous parent-child relationships to enable detecting
    // changes
    Map<RouterLayout, HasElement> oldChildren = new HashMap<>();
    for (int i = 0; i < routerTargetChain.size() - 1; i++) {
        HasElement child = routerTargetChain.get(i);
        RouterLayout parent = (RouterLayout) routerTargetChain.get(i + 1);
        oldChildren.put(parent, child);
    }
    routerTargetChain = new ArrayList<>();
    routerTargetChain.add(target);
    if (layouts != null) {
        routerTargetChain.addAll(layouts);
    }
    // Ensure the entire chain is connected
    HasElement root = null;
    for (HasElement part : routerTargetChain) {
        if (root != null) {
            assert part instanceof RouterLayout : "All parts of the chain except the first must implement " + RouterLayout.class.getSimpleName();
            RouterLayout parent = (RouterLayout) part;
            HasElement oldChild = oldChildren.get(parent);
            if (oldChild != root) {
                removeFromParent(oldChild);
                parent.showRouterLayoutContent(root);
            }
        } else if (part instanceof RouterLayout && oldChildren.containsKey(part)) {
            // Remove old child view from leaf view if it had one
            removeFromParent(oldChildren.get(part));
            ((RouterLayout) part).showRouterLayoutContent(null);
        }
        root = part;
    }
    if (root == null) {
        throw new IllegalArgumentException("Root can't be null here since we know there's at least one item in the chain");
    }
    Element rootElement = root.getElement();
    if (!uiElement.equals(rootElement.getParent())) {
        removeServerSideChildrenFromUI(uiElement);
        rootElement.removeFromParent();
        uiElement.appendChild(rootElement);
    }
}
Also used : RouterLayout(com.vaadin.flow.router.RouterLayout) HashMap(java.util.HashMap) Element(com.vaadin.flow.dom.Element) HasElement(com.vaadin.flow.component.HasElement) HasElement(com.vaadin.flow.component.HasElement)

Aggregations

HasElement (com.vaadin.flow.component.HasElement)4 RouterLayout (com.vaadin.flow.router.RouterLayout)4 UI (com.vaadin.flow.component.UI)3 AfterNavigationEvent (com.vaadin.flow.router.AfterNavigationEvent)3 List (java.util.List)3 Component (com.vaadin.flow.component.Component)2 ReflectTools (com.vaadin.flow.internal.ReflectTools)2 BeforeEnterEvent (com.vaadin.flow.router.BeforeEnterEvent)2 BeforeLeaveEvent (com.vaadin.flow.router.BeforeLeaveEvent)2 ContinueNavigationAction (com.vaadin.flow.router.BeforeLeaveEvent.ContinueNavigationAction)2 Location (com.vaadin.flow.router.Location)2 LocationChangeEvent (com.vaadin.flow.router.LocationChangeEvent)2 NavigationEvent (com.vaadin.flow.router.NavigationEvent)2 NavigationTrigger (com.vaadin.flow.router.NavigationTrigger)2 Route (com.vaadin.flow.router.Route)2 ArrayList (java.util.ArrayList)2 Optional (java.util.Optional)2 HtmlImport (com.vaadin.flow.component.dependency.HtmlImport)1 BodySize (com.vaadin.flow.component.page.BodySize)1 Inline (com.vaadin.flow.component.page.Inline)1