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

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

import com.vaadin.flow.component.button.Button;
import com.vaadin.flow.component.button.ButtonVariant;
import com.vaadin.flow.data.binder.BeanValidationBinder;
import com.vaadin.flow.data.binder.Binder;
import com.vaadin.flow.router.Route;
import io.imunity.furms.api.projects.ProjectService;
import io.imunity.furms.api.users.UserService;
import io.imunity.furms.domain.projects.ProjectAdminControlledAttributes;
import io.imunity.furms.domain.projects.ProjectId;
import io.imunity.furms.ui.components.FormButtons;
import io.imunity.furms.ui.components.FurmsViewComponent;
import io.imunity.furms.ui.components.PageTitle;
import io.imunity.furms.ui.project.ProjectFormComponent;
import io.imunity.furms.ui.project.ProjectModelResolver;
import io.imunity.furms.ui.project.ProjectViewModel;
import io.imunity.furms.ui.user_context.FurmsViewUserModel;
import io.imunity.furms.ui.user_context.FurmsViewUserModelMapper;
import io.imunity.furms.ui.user_context.UIContext;
import io.imunity.furms.ui.views.project.ProjectAdminMenu;

import java.time.ZoneId;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;

import static io.imunity.furms.ui.components.layout.FurmsAppLayoutUtils.callReloadLogo;
import static io.imunity.furms.ui.utils.NotificationUtils.showErrorNotification;
import static io.imunity.furms.ui.utils.NotificationUtils.showSuccessNotification;
import static io.imunity.furms.ui.utils.ResourceGetter.getCurrentResourceId;
import static io.imunity.furms.ui.utils.VaadinExceptionHandler.getResultOrException;
import static io.imunity.furms.ui.utils.VaadinExceptionHandler.handleExceptions;
import static java.util.function.Function.identity;

@Route(value = "project/admin/settings", layout = ProjectAdminMenu.class)
@PageTitle(key = "view.project-admin.settings.page.title")
public class SettingsView extends FurmsViewComponent {
	private final Binder binder = new BeanValidationBinder<>(ProjectViewModel.class);
	private final Button updateButton = createUpdateButton();
	private final Button cancelButton = createCloseButton();
	private final ProjectFormComponent projectFormComponent;
	private final ProjectService projectService;
	private final ProjectModelResolver resolver;
	private final ZoneId zoneId;

	private ProjectViewModel oldProject;

	SettingsView(ProjectService projectService, UserService userService, ProjectModelResolver resolver) {
		this.projectService = projectService;
		this.resolver = resolver;
		List users = FurmsViewUserModelMapper.mapList(userService.getAllUsers());
		this.projectFormComponent = new ProjectFormComponent(binder, true, users);
		zoneId = UIContext.getCurrent().getZone();

		projectFormComponent.getUpload().addFinishedListener(x -> enableEditorMode());
		projectFormComponent.getUpload().addFileRemovedListener(x -> enableEditorMode());
		Optional projectViewModel = getProjectViewModel();
		if(projectViewModel.isPresent()){
			oldProject = projectViewModel.get();
			projectFormComponent.setFormPools(new ProjectViewModel(oldProject));
			disableEditorMode();
		}
		if(!projectService.isProjectInTerminalState(oldProject.id)){
			projectFormComponent.readOnlyAll();
		}

		binder.addStatusChangeListener(status -> {
			if(oldProject.equalsFields(binder.getBean()))
				disableEditorMode();
			else
				enableEditorMode();
		});


		FormButtons buttons = new FormButtons(cancelButton, updateButton);
		getContent().add(
			projectFormComponent, buttons
		);
	}

	private void enableEditorMode() {
		updateButton.setVisible(true);
		updateButton.setEnabled(binder.isValid());
		cancelButton.setVisible(true);
	}

	private void disableEditorMode() {
		cancelButton.setVisible(false);
		updateButton.setVisible(false);
	}

	private Button createCloseButton() {
		Button closeButton = new Button(getTranslation("view.project-admin.settings.button.cancel"));
		closeButton.addThemeVariants(ButtonVariant.LUMO_TERTIARY);
		closeButton.addClickListener(event ->{
			loadProject();
			closeButton.setVisible(false);
			projectFormComponent.getUpload().cleanCurrentFileName();
		});
		return closeButton;
	}

	private void loadProject() {
		getProjectViewModel()
			.ifPresent(projectFormComponent::setFormPools);
	}

	private Optional getProjectViewModel() {
		return handleExceptions(() -> projectService.findById(new ProjectId(getCurrentResourceId())))
			.flatMap(identity())
			.map(project -> resolver.resolve(project, zoneId));
	}

	private Button createUpdateButton() {
		Button updateButton = new Button(getTranslation("view.project-admin.settings.button.update"));
		updateButton.addThemeVariants(ButtonVariant.LUMO_PRIMARY);
		updateButton.addClickListener(x -> {
			binder.validate();
			if(binder.isValid()) {
				ProjectViewModel projectViewModel = new ProjectViewModel(binder.getBean());
				ProjectAdminControlledAttributes project = new ProjectAdminControlledAttributes(
						projectViewModel.id,
						projectViewModel.description,
						projectViewModel.researchField,
						projectViewModel.logo);
				getResultOrException(() -> projectService.update(project))
					.getException()
					.ifPresentOrElse(
						e -> showErrorNotification(getTranslation("base.error.message")),
						() -> {
							if (isLogoChange(oldProject, projectViewModel)) {
								callReloadLogo(this.getClass());
							}
							oldProject = projectViewModel;
							disableEditorMode();
							showSuccessNotification(getTranslation("view.project-admin.settings.update.success"));
						}
					);
			}
		});
		return updateButton;
	}

	private boolean isLogoChange(ProjectViewModel oldProject, ProjectViewModel projectViewModel) {
		return !Arrays.equals(oldProject.getLogo().getImage(), projectViewModel.getLogo().getImage());
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy