All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.imunity.furms.ui.components.layout.BreadCrumbComponent Maven / Gradle / Ivy

There is a newer version: 4.3.1
Show newest version
/*
 * Copyright (c) 2020 Bixbit s.c. All rights reserved.
 * See LICENSE file for licensing information.
 */
package io.imunity.furms.ui.components.layout;

import static io.imunity.furms.ui.components.layout.FurmsAppLayoutUtils.getPageTitle;
import static java.util.stream.Collectors.toList;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Stack;
import java.util.stream.Stream;

import com.vaadin.flow.component.Component;
import com.vaadin.flow.component.Composite;
import com.vaadin.flow.component.html.Div;
import com.vaadin.flow.component.html.Span;
import com.vaadin.flow.router.QueryParameters;
import com.vaadin.flow.router.RouterLink;
import io.imunity.furms.ui.components.FurmsViewComponent;
import io.imunity.furms.ui.components.MenuComponent;

class BreadCrumbComponent extends Composite
{ private final Stack bredCrumbs = new Stack<>(); private final List menuRouts; BreadCrumbComponent(List menuRouts){ getContent().setId("breadcrumb"); getContent().setSizeFull(); this.menuRouts = menuRouts; } public void update(FurmsViewComponent component){ Class componentClass = component.getClass(); BreadCrumb route = new BreadCrumb(componentClass, component.getParameter().orElse(null)); getSubview(componentClass).ifPresent(menuElement -> { if (bredCrumbs.isEmpty()) { // entering page directly from URL link bredCrumbs.push(new BreadCrumb(menuElement.component, null)); } }); if(isChangingMenuViews(componentClass)) { bredCrumbs.removeAllElements(); } if(!bredCrumbs.contains(route)) bredCrumbs.push(route); else if (bredCrumbs.peek().isParamChanged(route)){ bredCrumbs.pop(); bredCrumbs.push(route); } else while (!bredCrumbs.peek().equals(route)) bredCrumbs.pop(); updateView(); } private Optional getSubview(Class componentClass) { for (MenuComponent menu : menuRouts) { if (menu.subViews.contains(componentClass)) return Optional.of(menu); } return Optional.empty(); } private boolean isChangingMenuViews(Class componentClass) { return menuRouts.stream() .map(menu -> menu.component) .collect(toList()) .contains(componentClass); } private void updateView() { List components = new ArrayList<>(); RouterLink firstRouterLink = createRouterLink(bredCrumbs.firstElement()).findFirst() .orElseThrow(() -> new IllegalStateException("Expecting bread crumbs to contain at least one element: " + bredCrumbs)); List nextComponents = bredCrumbs.stream() .skip(1) .flatMap(this::createNextRouterLink) .distinct() .collect(toList()); components.add(firstRouterLink); components.addAll(nextComponents); getContent().removeAll(); getContent().add(components.toArray(Component[]::new)); } private Stream createNextRouterLink(BreadCrumb route) { return createRouterLink(route) .map(x -> { Span span = new Span(" > "); span.add(x); return span; }); } private Stream createRouterLink(BreadCrumb route) { return route.getBreadCrumbParameter() .map(p -> getRouterLink(route.getRouteClass(), p)) .orElseGet(() -> Stream.of(new RouterLink(getPageTitle(route.getRouteClass()), route.getRouteClass()))); } private Stream getRouterLink(Class routeClass, BreadCrumbParameter p) { RouterLink basicRoute = new RouterLink(p.name, routeClass, p.id); if(p.parameter != null) { RouterLink routerLink = new RouterLink(p.parameter, routeClass, p.id); routerLink.setQueryParameters(QueryParameters.simple(Map.of("tab", p.parameter))); return Stream.of(basicRoute, routerLink); } return Stream.of(basicRoute); } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy