Skip to content

Commit

Permalink
Confirm experimental group deletion with the user when editing experi…
Browse files Browse the repository at this point in the history
…mental variables (#334)

* clean up code

* add double-check confirmation dialog

* address inspection warning

* extract confirm dialog into new method

* Fix typo

Co-authored-by: Steffengreiner <[email protected]>

* Fix switched JavaDocs

Co-authored-by: steffengreiner <[email protected]>

---------

Co-authored-by: Steffengreiner <[email protected]>
  • Loading branch information
KochTobi and Steffengreiner authored Jul 28, 2023
1 parent db2c46e commit 4c6710d
Show file tree
Hide file tree
Showing 5 changed files with 230 additions and 166 deletions.
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
package life.qbic.projectmanagement.application;

import static java.util.Objects.*;
import static java.util.Objects.requireNonNull;

import java.util.Objects;
import life.qbic.application.commons.Result;
import life.qbic.projectmanagement.application.sample.SampleInformationService;
import life.qbic.projectmanagement.domain.project.experiment.ExperimentId;
Expand Down Expand Up @@ -47,7 +46,7 @@ public Result<ExperimentId, ResponseCode> deleteAllExperimentalVariables(Experim
if (queryResult.isError()) {
return Result.fromError(ResponseCode.QUERY_FAILED);
}
if (queryResult.isValue() && queryResult.getValue().size() > 0) {
if (queryResult.isValue() && !queryResult.getValue().isEmpty()) {
return Result.fromError(ResponseCode.SAMPLES_STILL_ATTACHED_TO_EXPERIMENT);
}
experimentInformationService.deleteAllExperimentalVariables(id);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import com.vaadin.flow.component.Text;
import com.vaadin.flow.component.button.Button;
import com.vaadin.flow.component.button.ButtonVariant;
import com.vaadin.flow.component.confirmdialog.ConfirmDialog;
import com.vaadin.flow.component.html.Anchor;
import com.vaadin.flow.component.html.Div;
import com.vaadin.flow.component.html.Span;
Expand Down Expand Up @@ -155,27 +156,43 @@ private void configureComponent() {
configureExperimentalGroupCreation();
addCancelListenerForAddVariableDialog();
addConfirmListenerForAddVariableDialog();
addConfirmListenerForEditVariableDialog();
addListenerForNewVariableEvent();
addEditListenerForExperimentalVariables();
}

private void addEditListenerForExperimentalVariables() {
private void addConfirmListenerForEditVariableDialog() {
experimentalVariablesComponent.subscribeToEditEvent(experimentalVariablesEditEvent -> {
ExperimentId experimentId = context.experimentId().orElseThrow();
var editDialog = ExperimentalVariablesDialog.prefilled(
experimentInformationService.getVariablesOfExperiment(experimentId));
editDialog.subscribeToCancelEvent(
editDialog.addCancelEventListener(
experimentalVariablesDialogCancelEvent -> editDialog.close());
editDialog.subscribeToConfirmEvent(experimentalVariablesDialogConfirmEvent -> {
deleteExistingExperimentalVariables(experimentId);
registerExperimentalVariables(experimentalVariablesDialogConfirmEvent.getSource());
editDialog.close();
reloadExperimentalVariables();
editDialog.addConfirmEventListener(experimentalVariablesDialogConfirmEvent -> {
var confirmDialog = experimentalGroupDeletionConfirmDialog();
confirmDialog.addConfirmListener(confirmDeletionEvent -> {
deleteExistingExperimentalVariables(experimentId);
registerExperimentalVariables(experimentalVariablesDialogConfirmEvent.getSource());
editDialog.close();
reloadExperimentalVariables();
});
confirmDialog.open();
});
editDialog.open();
});
}

private static ConfirmDialog experimentalGroupDeletionConfirmDialog() {
var confirmDialog = new ConfirmDialog();
confirmDialog.setHeader("Your experimental groups will be deleted");
confirmDialog.setText(
"Editing experimental variables requires all experimental groups to be deleted. Are you sure you want to delete them?");
confirmDialog.setConfirmText("Delete experimental groups");
confirmDialog.setCancelable(true);
confirmDialog.setCancelText("Abort");
confirmDialog.setRejectable(false);
return confirmDialog;
}

private void reloadExperimentalVariables() {
loadExperiment(context.experimentId().orElseThrow());
}
Expand Down Expand Up @@ -233,7 +250,7 @@ private void configureExperimentalGroupCreation() {
}

private void addCancelListenerForAddVariableDialog() {
addExperimentalVariablesDialog.subscribeToCancelEvent(it -> it.getSource().close());
addExperimentalVariablesDialog.addCancelEventListener(it -> it.getSource().close());
}

private void handleGroupSubmittedSuccess() {
Expand Down Expand Up @@ -293,7 +310,7 @@ private void handleDeletionClickedEvent(
}

private void addConfirmListenerForAddVariableDialog() {
addExperimentalVariablesDialog.subscribeToConfirmEvent(it -> {
addExperimentalVariablesDialog.addConfirmEventListener(it -> {
try {
registerExperimentalVariables(it.getSource());
it.getSource().close();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package life.qbic.datamanager.views.projects.project.experiments.experiment.components;

import java.util.List;

/**
* @param name the name of the variable
* @param unit the unit of the variable levels
* @param levels the variable levels that are assigned to the variable
*/
public record ExperimentalVariableContent(String name, String unit, List<String> levels) {

static ExperimentalVariableContent from(final ExperimentalVariableRowLayout layout) {
final String variableName = layout.getVariableName();
final String unit = layout.getUnit();
final List<String> levels = layout.getLevels();
return new ExperimentalVariableContent(variableName, unit, levels);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
package life.qbic.datamanager.views.projects.project.experiments.experiment.components;

import com.vaadin.flow.component.formlayout.FormLayout;
import com.vaadin.flow.component.html.Span;
import com.vaadin.flow.component.icon.Icon;
import com.vaadin.flow.component.icon.VaadinIcon;
import com.vaadin.flow.component.textfield.TextArea;
import com.vaadin.flow.component.textfield.TextField;
import com.vaadin.flow.shared.Registration;
import java.io.Serial;
import java.util.List;
import java.util.Objects;
import java.util.function.Consumer;
import java.util.stream.Collectors;
import life.qbic.projectmanagement.domain.project.experiment.ExperimentalVariable;

/**
* A layout containing rows for experimental variable input
*/
final class ExperimentalVariableRowLayout extends Span {

@Serial
private static final long serialVersionUID = -1126299161780107501L;
private final TextField nameField = new TextField("Experimental Variable");
private final TextField unitField = new TextField("Unit");
private final TextArea levelArea = new TextArea("Levels");
private final Icon deleteIcon = new Icon(VaadinIcon.CLOSE_SMALL);
private Registration clickListener;

ExperimentalVariableRowLayout() {
init();
}

static ExperimentalVariableRowLayout from(
final ExperimentalVariable experimentalVariable) {
final ExperimentalVariableRowLayout rowLayout = new ExperimentalVariableRowLayout();
rowLayout.nameField.setValue(experimentalVariable.name().value());
rowLayout.unitField.setValue(
experimentalVariable.levels().get(0).experimentalValue().unit().orElse(""));
rowLayout.levelArea.setValue(
experimentalVariable.levels().stream().map(it -> it.experimentalValue().value())
.collect(Collectors.joining("\n")));
return rowLayout;
}

private void init() {
addClassName("row");
FormLayout experimentalVariableFieldsLayout = new FormLayout();
experimentalVariableFieldsLayout.add(nameField, unitField, levelArea);
experimentalVariableFieldsLayout.setResponsiveSteps(new FormLayout.ResponsiveStep("0", 3));
nameField.setRequired(true);
levelArea.setRequired(true);
add(experimentalVariableFieldsLayout, deleteIcon);
}

public String getVariableName() {
return nameField.getValue();
}

public String getUnit() {
return unitField.getValue();
}

public List<String> getLevels() {
return levelArea.getValue().lines().filter(it -> !it.isBlank()).toList();
}

public void setCloseListener(
Consumer<CloseEvent> closeListener) {
if (Objects.nonNull(clickListener)) {
clickListener.remove();
}
clickListener = deleteIcon.addClickListener(it -> closeListener.accept(
new CloseEvent(this)));
}

public boolean isValid() {
boolean isNameFieldValid = !nameField.isInvalid() && !nameField.isEmpty();
boolean isLevelFieldValid = !levelArea.isInvalid() && !levelArea.isEmpty();
return isNameFieldValid && isLevelFieldValid;
}

public boolean isEmpty() {
return nameField.isEmpty() && unitField.isEmpty() && levelArea.isEmpty();
}

public record CloseEvent(ExperimentalVariableRowLayout origin) {

}

}
Loading

0 comments on commit 4c6710d

Please sign in to comment.