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

io.imunity.furms.ui.views.project.sites.SitesView 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.views.project.sites;

import com.vaadin.flow.component.Component;
import com.vaadin.flow.component.grid.ColumnTextAlign;
import com.vaadin.flow.component.grid.GridVariant;
import com.vaadin.flow.component.html.Div;
import com.vaadin.flow.component.treegrid.TreeGrid;
import com.vaadin.flow.router.Route;
import io.imunity.furms.api.project_installation.ProjectInstallationsService;
import io.imunity.furms.api.user_site_access.UserSiteAccessService;
import io.imunity.furms.domain.project_installation.ProjectUpdateJobStatus;
import io.imunity.furms.domain.projects.ProjectId;
import io.imunity.furms.domain.sites.SiteId;
import io.imunity.furms.domain.user_site_access.UsersSitesAccesses;
import io.imunity.furms.ui.components.FurmsViewComponent;
import io.imunity.furms.ui.components.GridActionMenu;
import io.imunity.furms.ui.components.GridActionsButtonLayout;
import io.imunity.furms.ui.components.IconButton;
import io.imunity.furms.ui.components.MenuButton;
import io.imunity.furms.ui.components.PageTitle;
import io.imunity.furms.ui.components.StatusLayout;
import io.imunity.furms.ui.components.ViewHeaderLayout;
import io.imunity.furms.ui.views.project.ProjectAdminMenu;
import io.imunity.furms.ui.views.project.resource_access.DenseTreeGrid;

import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;

import static com.vaadin.flow.component.icon.VaadinIcon.MINUS_CIRCLE;
import static com.vaadin.flow.component.icon.VaadinIcon.PLUS_CIRCLE;
import static com.vaadin.flow.component.icon.VaadinIcon.REFRESH;
import static io.imunity.furms.ui.utils.ResourceGetter.getCurrentResourceId;

@Route(value = "project/admin/sites", layout = ProjectAdminMenu.class)
@PageTitle(key = "view.project-admin.sites.page.title")
public class SitesView extends FurmsViewComponent {
	public final UserSiteAccessService userSiteAccessService;
	public final ProjectInstallationsService projectInstallationsService;
	public final TreeGrid grid;
	public final ProjectId projectId;

	SitesView(UserSiteAccessService userSiteAccessService, ProjectInstallationsService projectInstallationsService) {
		this.userSiteAccessService = userSiteAccessService;
		this.projectInstallationsService = projectInstallationsService;
		this.grid = new DenseTreeGrid<>();
		this.projectId = new ProjectId(getCurrentResourceId());
		fillGrid();
		getContent().add(new ViewHeaderLayout(getTranslation("view.community-admin.projects.header")), grid);
	}

	private Set loadData() {
		ProjectId projectId = new ProjectId(getCurrentResourceId());
		Map collect =
			projectInstallationsService.findAllUpdatesByProjectId(projectId).stream()
			.collect(Collectors.toMap(x -> x.siteId, x -> x));

		return projectInstallationsService.findAllByProjectId(projectId).stream()
			.map(statusJob -> {
				String status = Optional.ofNullable(collect.get(statusJob.siteId))
					.map(x -> getTranslation("project.update.status." + x.status.getPersistentId()))
					.orElse(getTranslation("project.installation.status." + statusJob.status.getPersistentId()));
				String message = statusJob.errorMessage
					.map(y -> y.message)
					.orElse(null);
				return SiteTreeGridModel.builder()
					.siteId(statusJob.siteId)
					.siteName(statusJob.siteName)
					.status(status)
					.message(message)
					.build();
			})
			.collect(Collectors.toSet());
	}

	private Set loadNextLevelData(UsersSitesAccesses usersSitesAccesses, SiteTreeGridModel model) {
		if(model.userId != null)
			return Set.of();
		SiteId siteId = model.siteId;
		return  usersSitesAccesses.getUsersInstalledOnSite().stream()
			.map(furmsUser -> SiteTreeGridModel.builder()
				.siteId(siteId)
				.userId(furmsUser.fenixUserId.get())
				.userName(furmsUser.firstName.orElse("") + " " + furmsUser.lastName.orElse(""))
				.userEmail(furmsUser.email)
				.userAccessStatus(usersSitesAccesses.getStatus(siteId, furmsUser.fenixUserId.get()))
				.build())
			.collect(Collectors.toSet());
	}

	private void fillGrid() {
		grid.addHierarchyColumn(model -> Optional.ofNullable(model.siteName).orElse(""))
			.setHeader(getTranslation("view.project-admin.sites.grid.1"))
			.setSortable(true)
			.setFlexGrow(25);
		grid.addComponentColumn(model -> new StatusLayout(model.status, model.message, getContent()))
			.setHeader(getTranslation("view.project-admin.sites.grid.2"))
			.setSortable(true)
			.setFlexGrow(6);
		grid.addColumn(model -> model.userName)
			.setHeader(getTranslation("view.project-admin.sites.grid.3"))
			.setSortable(true)
			.setFlexGrow(25);
		grid.addColumn(model -> model.userEmail)
			.setHeader(getTranslation("view.project-admin.sites.grid.4"))
			.setSortable(true)
			.setFlexGrow(25);
		grid.addColumn(model -> Optional.ofNullable(model.userAccessStatus)
				.map(status -> status.status.isEnabled() ?
					getTranslation("view.project-admin.sites.enabled") : getTranslation("view.project-admin.sites.disabled"))
				.orElse("")
		)
			.setHeader(getTranslation("view.project-admin.sites.grid.5"))
			.setSortable(true)
			.setFlexGrow(25);
		grid.addComponentColumn(model -> Optional.ofNullable(model.userAccessStatus)
			.map(status -> (Component) new StatusLayout(
				getTranslation("view.project-admin.sites." + status.status.name()),
				status.message,
				getContent()))
			.orElse(new Div())
		)
			.setHeader(getTranslation("view.project-admin.sites.grid.6"))
			.setSortable(true)
			.setFlexGrow(25);
		grid.addComponentColumn(resourceAccessModel -> {
			if(resourceAccessModel.userAccessStatus == null || resourceAccessModel.userAccessStatus.status.isPending()) {
				IconButton iconButton = new IconButton(REFRESH.create());
				iconButton.addClickListener(event -> loadGridContent());
				return iconButton;
			}
			else {
				GridActionMenu contextMenu = new GridActionMenu();
				if(resourceAccessModel.userAccessStatus.status.isInstalled()) {
					contextMenu.addItem(new MenuButton(
							getTranslation("view.project-admin.sites.revoke"), MINUS_CIRCLE),
						event -> {
						userSiteAccessService.removeAccess(resourceAccessModel.siteId, projectId, resourceAccessModel.userId);
						loadGridContent();
					});
				}
				else {
					contextMenu.addItem(new MenuButton(
							getTranslation("view.project-admin.sites.grant"), PLUS_CIRCLE),
						event -> {
							userSiteAccessService.addAccess(resourceAccessModel.siteId, projectId, resourceAccessModel.userId);
							loadGridContent();
						});
				}
				return new GridActionsButtonLayout(contextMenu.getTarget());
			}

		})
			.setHeader(getTranslation("view.project-admin.sites.grid.7"))
			.setTextAlign(ColumnTextAlign.END);

		grid.addThemeVariants(GridVariant.LUMO_NO_BORDER);
		loadGridContent();
	}

	private void loadGridContent() {
		UsersSitesAccesses usersSitesAccesses = userSiteAccessService.getUsersSitesAccesses(projectId);
		Set rootItems = loadData();
		Set currentExpandedItems = rootItems.stream()
			.filter(grid::isExpanded)
			.collect(Collectors.toSet());

		grid.setItems(rootItems, key -> loadNextLevelData(usersSitesAccesses, key));
		grid.expand(currentExpandedItems);
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy