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

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

import com.vaadin.flow.component.button.Button;
import com.vaadin.flow.component.combobox.ComboBox;
import com.vaadin.flow.component.dependency.CssImport;
import com.vaadin.flow.component.orderedlayout.FlexComponent;
import com.vaadin.flow.component.orderedlayout.HorizontalLayout;
import com.vaadin.flow.data.binder.ValueContext;
import com.vaadin.flow.data.validator.EmailValidator;
import io.imunity.furms.api.validation.exceptions.UserIsSiteAdmin;
import io.imunity.furms.api.validation.exceptions.UserIsSiteSupport;
import io.imunity.furms.domain.users.FURMSUser;
import io.imunity.furms.domain.users.PersistentId;
import io.imunity.furms.ui.components.FurmsUserComboBox;
import io.imunity.furms.ui.user_context.FurmsViewUserModel;
import io.imunity.furms.ui.user_context.FurmsViewUserModelMapper;
import io.imunity.furms.ui.utils.CommonExceptionsHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.lang.invoke.MethodHandles;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.function.Consumer;
import java.util.function.Supplier;
import java.util.stream.Collectors;

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.NotificationUtils.showSuccessNotification;

@CssImport("./styles/components/furms-combo-box.css")
class SiteRoleInviteUserComponent extends HorizontalLayout {
	private final static Logger LOG = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());

	private final Button inviteButton;
	private final ComboBox siteRoleComboBox = new ComboBox<>();
	private final FurmsUserComboBox furmsUserComboBox;
	private final EmailValidator emailValidator = new EmailValidator("Not valid email");

	private final Supplier> fetchAllUsersAction;
	private final Supplier> fetchCurrentUsersAction;

	SiteRoleInviteUserComponent(Supplier> fetchAllUsersAction, Supplier> fetchCurrentUsersAction) {
		this.fetchAllUsersAction = fetchAllUsersAction;
		this.fetchCurrentUsersAction = fetchCurrentUsersAction;

		siteRoleComboBox.setItems(SiteRole.values());
		siteRoleComboBox.setItemLabelGenerator(role -> getTranslation("enum.SiteRole." + role.name()));
		siteRoleComboBox.setClassName("furms-role-type-combo-box");
		siteRoleComboBox.setRequired(true);
		siteRoleComboBox.setAllowCustomValue(false);
		siteRoleComboBox.setPreventInvalidInput(true);
		siteRoleComboBox.setValue(SiteRole.ADMIN);
		siteRoleComboBox.addValueChangeListener(event -> {
			if(event.getValue() == null)
				siteRoleComboBox.setValue(event.getOldValue());
		});

		setJustifyContentMode(FlexComponent.JustifyContentMode.END);
		setSpacing(true);
		furmsUserComboBox = new FurmsUserComboBox(getAvailableUsers(), true);
		furmsUserComboBox.setClassName("furms-invite-combo-box");
		inviteButton = new Button(getTranslation("component.invite.button"), PAPERPLANE.create());
		inviteButton.setMinWidth("auto");
		inviteButton.setEnabled(furmsUserComboBox.hasValue());
		inviteButton.addFocusListener(x -> {
			if(furmsUserComboBox.getEmail().isEmpty())
				inviteButton.setEnabled(false);
		});
		furmsUserComboBox.addValueChangeListener(event ->
			inviteButton.setEnabled(furmsUserComboBox.hasValue() && siteRoleComboBox.getValue() != null));
		siteRoleComboBox.addValueChangeListener(event ->
			inviteButton.setEnabled((isMailValid(furmsUserComboBox.getEmail()) || furmsUserComboBox.hasValue()) && siteRoleComboBox.getValue() != null));
		furmsUserComboBox.addCustomValueSetListener(customValue ->
			inviteButton.setEnabled(isMailValid(customValue.getDetail()))
		);
		add(furmsUserComboBox, siteRoleComboBox, inviteButton);
	}

	private boolean isMailValid(String email) {
		return !emailValidator.apply(email, new ValueContext()).isError();
	}

	void addInviteAction(Map> existingUserInvitators,
	                     Map> newUserInvitators,
	                     Runnable gridReloader) {
		inviteButton.addClickListener((event) -> {
			try {
				getUserId().ifPresentOrElse(
					id -> existingUserInvitators.get(siteRoleComboBox.getValue()).accept(id),
					() -> newUserInvitators.get(siteRoleComboBox.getValue()).accept(furmsUserComboBox.getEmail())
				);
				reload();
				gridReloader.run();
				showSuccessNotification(getTranslation("invite.successful.added"));
			} catch (UserIsSiteAdmin e) {
				showErrorNotification(getTranslation("invite.error.role.site.admin"));
			} catch (UserIsSiteSupport e) {
				showErrorNotification(getTranslation("invite.error.role.site.support"));
			} catch (RuntimeException e) {
				boolean handled = CommonExceptionsHandler.showExceptionBasedNotificationError(e);
				if(!handled)
					LOG.error("Could not invite site user.");
			}
		});
	}

	private Optional getUserId() {
		return Optional.ofNullable(furmsUserComboBox.getValue()).flatMap(userModel -> userModel.id);
	}

	void reload() {
		furmsUserComboBox.clear();
		furmsUserComboBox.clearCustomValue(inviteButton);
		List availableUsers = getAvailableUsers();
		furmsUserComboBox.setItems(availableUsers);
	}

	private List getAvailableUsers() {
		List users = fetchAllUsersAction.get();
		List currentEmails = fetchCurrentUsersAction.get().stream()
			.map(user -> user.email)
			.collect(Collectors.toList());

		return FurmsViewUserModelMapper.mapList(
			users.stream()
				.filter(user -> !currentEmails.contains(user.email))
				.collect(Collectors.toList())
		);
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy