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

io.imunity.furms.ui.components.InviteUserComponent 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;

import com.vaadin.flow.component.ClickEvent;
import com.vaadin.flow.component.ComponentEventListener;
import com.vaadin.flow.component.button.Button;
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.domain.users.FURMSUser;
import io.imunity.furms.domain.users.PersistentId;
import io.imunity.furms.ui.user_context.FurmsViewUserModel;
import io.imunity.furms.ui.user_context.FurmsViewUserModelMapper;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.function.Supplier;
import java.util.stream.Collectors;

import static com.vaadin.flow.component.icon.VaadinIcon.PAPERPLANE;

@CssImport("./styles/components/furms-combo-box.css")
public class InviteUserComponent extends HorizontalLayout {

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

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

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

		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())
		);
		furmsUserComboBox.addCustomValueSetListener(customValue ->
			inviteButton.setEnabled(!emailValidator.apply(customValue.getDetail(), new ValueContext()).isError())
		);
		add(furmsUserComboBox, inviteButton);
	}

	public void addInviteAction(ComponentEventListener> inviteAction) {
		inviteButton.addClickListener(inviteAction);
	}

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

	public String getEmail() {
		return furmsUserComboBox.getEmail();
	}

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

	public List getAvailableUsers() {
		List users = new ArrayList<>(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