Skip to content

Commit

Permalink
Merge branch 'development' into feature/dm-774-batch-overview-component
Browse files Browse the repository at this point in the history
  • Loading branch information
Steffengreiner committed Jul 13, 2023
2 parents 8d5d6c7 + 3573376 commit 33dea35
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 33dea35

Please sign in to comment.