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

io.imunity.furms.ui.views.site.policy_documents.PolicyDocumentAcceptanceView 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.site.policy_documents;

import com.vaadin.flow.router.BeforeEvent;
import com.vaadin.flow.router.OptionalParameter;
import com.vaadin.flow.router.Route;
import io.imunity.furms.api.policy_documents.PolicyDocumentService;
import io.imunity.furms.domain.policy_documents.PolicyAcceptance;
import io.imunity.furms.domain.policy_documents.PolicyAcceptanceStatus;
import io.imunity.furms.domain.policy_documents.PolicyDocument;
import io.imunity.furms.domain.policy_documents.PolicyId;
import io.imunity.furms.domain.policy_documents.PolicyWorkflow;
import io.imunity.furms.domain.sites.SiteId;
import io.imunity.furms.ui.components.layout.BreadCrumbParameter;
import io.imunity.furms.ui.components.FurmsViewComponent;
import io.imunity.furms.ui.components.MenuButton;
import io.imunity.furms.ui.components.PageTitle;
import io.imunity.furms.ui.components.ViewHeaderLayout;
import io.imunity.furms.ui.components.administrators.UserContextMenuFactory;
import io.imunity.furms.ui.components.administrators.UserGrid;
import io.imunity.furms.ui.components.administrators.UsersGridComponent;
import io.imunity.furms.ui.views.site.SiteAdminMenu;

import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;
import java.util.Optional;
import java.util.stream.Collectors;

import static com.vaadin.flow.component.icon.VaadinIcon.CHECK_CIRCLE;
import static com.vaadin.flow.component.icon.VaadinIcon.PAPERPLANE;
import static io.imunity.furms.ui.utils.NotificationUtils.showErrorNotification;
import static io.imunity.furms.ui.utils.ResourceGetter.getCurrentResourceId;
import static io.imunity.furms.utils.UTCTimeUtils.convertToUTCTime;

@Route(value = "site/admin/policy/documents/acceptance", layout = SiteAdminMenu.class)
@PageTitle(key = "view.site-admin.policy-documents-acceptance.page.title")
public class PolicyDocumentAcceptanceView extends FurmsViewComponent {
	private final PolicyDocumentService policyDocumentService;
	private final SiteId siteId;
	private PolicyDocument policyDocument;
	private UsersGridComponent grid;

	private BreadCrumbParameter breadCrumbParameter;

	protected PolicyDocumentAcceptanceView(PolicyDocumentService policyDocumentService) {
		this.policyDocumentService = policyDocumentService;
		this.siteId = new SiteId(getCurrentResourceId());
	}

	@Override
	public void setParameter(BeforeEvent event, @OptionalParameter String parameter){
		Optional optionalPolicyDocument = policyDocumentService.findById(siteId, new PolicyId(parameter));
		if(optionalPolicyDocument.isPresent()) {
			this.policyDocument = optionalPolicyDocument.get();
			this.breadCrumbParameter = new BreadCrumbParameter(
				policyDocument.id.id.toString(), policyDocument.name,
				getTranslation("view.site-admin.policy-documents-acceptance.bread-cramb"));
			fillPage();
		}
		else {
			showErrorNotification(getTranslation("view.site-admin.policy-documents-acceptance.wrong.id"));
		}
	}

	private void fillPage() {
		getContent().removeAll();
		ViewHeaderLayout viewHeaderLayout = new ViewHeaderLayout(policyDocument.name + " " + getTranslation("view.site-admin.policy-documents-acceptance.half.header"));
		UserContextMenuFactory.Builder builder = UserContextMenuFactory.builder();
		if(policyDocument.workflow.equals(PolicyWorkflow.PAPER_BASED)) {
			builder.addCustomContextMenuItem(
				x -> new MenuButton(getTranslation("view.site-admin.policy-documents-acceptance.menu.accept"), CHECK_CIRCLE),
				(PolicyUserGridItem userGridItem) -> {
					PolicyAcceptance policyAcceptance = createPolicyAcceptance();
					policyDocumentService.addUserPolicyAcceptance(policyDocument.siteId, userGridItem.getFenixUserId().get(), policyAcceptance);
					grid.reloadGrid();
				},
				policyUserGridItem -> !policyUserGridItem.isAccepted()
			);
		}
		builder.addCustomContextMenuItem(
				x -> new MenuButton(getTranslation("view.site-admin.policy-documents-acceptance.menu.resend"), PAPERPLANE),
				(PolicyUserGridItem userGridItem) -> {
					policyDocumentService.resendPolicyInfo(policyDocument.siteId, userGridItem.getId().get(), policyDocument.id);
					grid.reloadGrid();
				},
				policyUserGridItem -> !policyUserGridItem.isAccepted()
			);

		UserContextMenuFactory userContextMenuFactory = builder.build();
		UserGrid.Builder userGrid = UserGrid.builder()
			.withFullNameColumn()
			.withEmailColumn()
			.withCustomColumn((PolicyUserGridItem x) -> {
				if(x.isAccepted())
					return getTranslation("view.site-admin.policy-documents-acceptance.status.accepted");
				else if(x.getRevision() != 0)
					return getTranslation("view.site-admin.policy-documents-acceptance.status.accepted.old", x.getRevision());
				else
					return getTranslation("view.site-admin.policy-documents-acceptance.status.not.accepted");
			}, getTranslation("view.site-admin.policy-documents-acceptance.status"))
			.withContextMenuColumn(userContextMenuFactory);
		grid = UsersGridComponent.init(
			() -> policyDocumentService.findAllUsersPolicyAcceptances(policyDocument.id, policyDocument.siteId).stream()
				.filter(userPolicyAcceptances -> userPolicyAcceptances.user.fenixUserId.isPresent())
				.map(userPolicyAcceptances -> new PolicyUserGridItem(
					userPolicyAcceptances.user,
					userPolicyAcceptances.policyAcceptances.stream()
						.filter(y -> y.policyDocumentId.equals(policyDocument.id))
						.mapToInt(y -> y.policyDocumentRevision)
						.max()
						.orElse(0),
					policyDocument.revision)
				).collect(Collectors.toList()),
			userGrid
		);

		getContent().add(viewHeaderLayout, grid);
	}

	private PolicyAcceptance createPolicyAcceptance() {
		return PolicyAcceptance.builder()
			.policyDocumentId(policyDocument.id)
			.policyDocumentRevision(policyDocument.revision)
			.acceptanceStatus(PolicyAcceptanceStatus.ACCEPTED)
			.decisionTs(convertToUTCTime(ZonedDateTime.now(ZoneId.systemDefault())).toInstant(ZoneOffset.UTC))
			.build();
	}

	@Override
	public Optional getParameter() {
		return Optional.ofNullable(breadCrumbParameter);
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy