Skip to content

Commit

Permalink
Set Condition field as valid upon initialization and provide javadocs…
Browse files Browse the repository at this point in the history
…, remove unnecessary binder validation call and minor variable naming refactor. (#314)
  • Loading branch information
Steffengreiner authored Jul 13, 2023
1 parent 400e866 commit 3573376
Showing 1 changed file with 38 additions and 35 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -8,22 +8,29 @@
import com.vaadin.flow.component.textfield.NumberField;
import com.vaadin.flow.data.binder.Binder;
import jakarta.validation.constraints.Min;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;
import life.qbic.datamanager.views.general.Container;
import life.qbic.datamanager.views.projects.project.experiments.experiment.ExperimentalGroupInput.ExperimentalGroupBean;
import life.qbic.projectmanagement.application.ExperimentValueFormatter;
import life.qbic.projectmanagement.domain.project.experiment.BiologicalReplicate;
import life.qbic.projectmanagement.domain.project.experiment.Condition;
import life.qbic.projectmanagement.domain.project.experiment.Experiment;
import life.qbic.projectmanagement.domain.project.experiment.ExperimentalGroup;
import life.qbic.projectmanagement.domain.project.experiment.VariableLevel;
import life.qbic.projectmanagement.domain.project.experiment.VariableName;

import java.util.*;
import java.util.stream.Collectors;

/**
* TODO!
* <b>short description</b>
*
* <p>detailed description</p>
*
* @since <version tag>
* <b>ExperimentalGroupInput Field</b>
* ExperimentalGroupInput is a {@link CustomField} which enables the user to create an
* {@link ExperimentalGroup} by defining the {@link Condition} and number of
* {@link BiologicalReplicate} associated with the {@link ExperimentalGroup}
*/
public class ExperimentalGroupInput extends CustomField<ExperimentalGroupBean> {

Expand All @@ -35,43 +42,39 @@ public class ExperimentalGroupInput extends CustomField<ExperimentalGroupBean> {
ExperimentValueFormatter.format(it.experimentalValue()));

private final MultiSelectComboBox<VariableLevel> variableLevelSelect;
private final NumberField sampleSizeField;

private int variableCount = 0;

private final List<Binder<?>> binders = new ArrayList<>();


private final NumberField replicateCountField;
int variableCount;

/**
* ExperimentalGroupInput is a {@link CustomField} which contains a {@link MultiSelectComboBox}
* allowing the user to define the {@link Condition} and a {@link NumberField} enabling the user
* to define the number of {@link BiologicalReplicate} within an {@link ExperimentalGroup}
*
* @param availableLevels Collection of {@link VariableLevel} defined for an {@link Experiment}
*/
public ExperimentalGroupInput(Collection<VariableLevel> availableLevels) {
addClassName("group-input");

variableLevelSelect = generateVariableLevelSelect();
sampleSizeField = generateSampleSizeField();
replicateCountField = generateSampleSizeField();

Span layout = new Span(variableLevelSelect, sampleSizeField);
Span layout = new Span(variableLevelSelect, replicateCountField);
layout.addClassName("layout");
add(layout);
setLevels(availableLevels);
addValidationForVariableCount();
variableLevelSelect.addValueChangeListener(
event -> setInvalid(variableLevelSelect.isInvalid() || sampleSizeField.isInvalid()));
sampleSizeField.addValueChangeListener(
event -> setInvalid(variableLevelSelect.isInvalid() || sampleSizeField.isInvalid()));
event -> setInvalid(variableLevelSelect.isInvalid() || replicateCountField.isInvalid()));
replicateCountField.addValueChangeListener(
event -> setInvalid(variableLevelSelect.isInvalid() || replicateCountField.isInvalid()));
}

private void addValidationForVariableCount() {
Binder<Container<Set<VariableLevel>>> binder = new Binder<>();
binder.forField(variableLevelSelect)
Binder<Container<Set<VariableLevel>>> variableLevelSelectBinder = new Binder<>();
variableLevelSelectBinder.forField(variableLevelSelect)
.withValidator(levels -> levels.size() == variableCount,
"Please select one level for each variable.")
.bind(Container::get, Container::set);
binders.add(binder);
}

private void validateInput() {
for (Binder<?> binder : binders) {
binder.validate();
}
}

private void setLevels(Collection<VariableLevel> availableLevels) {
Expand All @@ -86,29 +89,28 @@ protected ExperimentalGroupBean generateModelValue() {
var levels = variableLevelSelect.getValue().stream().sorted(VARIABLE_LEVEL_COMPARATOR)
.toList();
var sampleSize = Optional
.ofNullable(sampleSizeField.getValue()).map(Double::intValue)
.ofNullable(replicateCountField.getValue()).map(Double::intValue)
.orElse(0);
return new ExperimentalGroupBean(sampleSize, levels);
}

@Override
protected void setPresentationValue(ExperimentalGroupBean newPresentationValue) {
variableLevelSelect.setValue(newPresentationValue.levels);
sampleSizeField.setValue((double) newPresentationValue.sampleSize);
replicateCountField.setValue((double) newPresentationValue.sampleSize);
}

@Override
public void setRequiredIndicatorVisible(boolean requiredIndicatorVisible) {
super.setRequiredIndicatorVisible(requiredIndicatorVisible);
variableLevelSelect.setRequired(requiredIndicatorVisible);
variableLevelSelect.setRequiredIndicatorVisible(requiredIndicatorVisible);
sampleSizeField.setRequiredIndicatorVisible(requiredIndicatorVisible);
replicateCountField.setRequiredIndicatorVisible(requiredIndicatorVisible);
}

@Override
public boolean isInvalid() {
validateInput();
super.setInvalid(variableLevelSelect.isInvalid() || sampleSizeField.isInvalid());
super.setInvalid(variableLevelSelect.isInvalid() || replicateCountField.isInvalid());
return super.isInvalid();
}

Expand All @@ -131,6 +133,7 @@ private NumberField generateSampleSizeField() {
numberField.setStep(1);
numberField.setMin(1);
numberField.setValue(1.0);
numberField.setErrorMessage("Please specify a valid number of replicates");
return numberField;
}

Expand Down

0 comments on commit 3573376

Please sign in to comment.