3249 Allow saving general criteria before filling in overall motivation

This commit is contained in:
Andreas Svanberg 2023-11-22 13:19:31 +01:00
parent 9ede3a270d
commit cb2d389881
6 changed files with 57 additions and 18 deletions

@ -109,4 +109,8 @@ public class SupervisorGradingReport extends GradingReport {
public void setMotivation(String motivation) {
this.motivation = motivation;
}
public boolean hasProvidedOverallMotivation() {
return getMotivation() != null && !getMotivation().isBlank();
}
}

@ -51,7 +51,7 @@
</p>
<textarea class="form-control" rows="10" wicket:id="overall_motivation"></textarea>
</div>
<wicket:enclosure child="grading_basis_requirements_not_met">
<wicket:container wicket:id="grading_basis_missing">
<h4 class="mt-3">Criteria not met</h4>
<ul>
<li wicket:id="grading_basis_requirements_not_met">
@ -61,8 +61,11 @@
<span wicket:id="required_points"></span> required to pass
</wicket:message>
</li>
<li wicket:id="overall_motivation_missing">
Overall motivation not filled in
</li>
</ul>
</wicket:enclosure>
</wicket:container>
<wicket:enclosure child="save">
<div class="position-sticky bottom-0 bg-white py-3 d-flex">
<button class="btn btn-success me-3" wicket:id="save">

@ -98,7 +98,16 @@ public class GradingBasisPanel extends GenericPanel<Project> {
assessment.getPoints(),
0) < assessment.criterion().minimumPoints())
.toList());
add(new AutoHidingListView<>("grading_basis_requirements_not_met", criteriaNotMet) {
WebMarkupContainer gradingBasisMissing = new WebMarkupContainer("grading_basis_missing") {
@Override
protected void onConfigure() {
super.onConfigure();
String overallMotivation = gradingBasis.getObject().getOverallMotivation();
setVisible(!criteriaNotMet.getObject().isEmpty() || overallMotivation == null || overallMotivation.isBlank());
}
};
add(gradingBasisMissing);
gradingBasisMissing.add(new AutoHidingListView<>("grading_basis_requirements_not_met", criteriaNotMet) {
@Override
protected void populateItem(ListItem<Assessment> item) {
IModel<Criterion> criterion = item.getModel().map(Assessment::criterion);
@ -108,12 +117,19 @@ public class GradingBasisPanel extends GenericPanel<Project> {
item.add(new Label("required_points", criterion.map(Criterion::minimumPoints)));
}
});
gradingBasisMissing.add(new WebMarkupContainer("overall_motivation_missing") {
@Override
protected void onConfigure() {
super.onConfigure();
String overallMotivation = gradingBasis.getObject().getOverallMotivation();
setVisible(overallMotivation == null || overallMotivation.isBlank());
}
});
IModel<String> overallMotivation = LambdaModel.of(gradingBasis,
GradingBasis::getOverallMotivation,
GradingBasis::setOverallMotivation);
TextArea<String> overallMotivationField = new TextArea<>("overall_motivation", overallMotivation);
overallMotivationField.setRequired(true);
add(overallMotivationField);
add(new Label("rejection_comment", gradingBasis.map(GradingBasis::rejectionComment)) {

@ -38,17 +38,18 @@
<li wicket:id="status_plagiarism"></li>
<li>
<div wicket:id="status_grading_basis">></div>
<wicket:enclosure child="grading_basis_requirements_not_met">
<ul>
<li wicket:id="grading_basis_requirements_not_met">
<wicket:message key="criteria_not_met">
<span wicket:id="title">[U1 title]</span>
<span wicket:id="given_points"></span>/<span wicket:id="maximum_points"></span>
<span wicket:id="required_points"></span> required to pass
</wicket:message>
</li>
</ul>
</wicket:enclosure>
<ul wicket:id="grading_basis_missing">
<li wicket:id="grading_basis_requirements_not_met">
<wicket:message key="criteria_not_met">
<span wicket:id="title">[U1 title]</span>
<span wicket:id="given_points"></span>/<span wicket:id="maximum_points"></span>
<span wicket:id="required_points"></span> required to pass
</wicket:message>
</li>
<li wicket:id="grading_basis_overall_motivation_missing">
Overall motivation not filled in
</li>
</ul>
</li>
<li>
<div wicket:id="status_individual_assessment"></div>

@ -84,7 +84,15 @@ public class IndividualAuthorAssessment extends GenericPanel<User> {
add(new UserLabel("author_name", authorModel));
add(new AutoHidingListView<>("grading_basis_requirements_not_met", gradingBasisCriterionNotMet) {
WebMarkupContainer gradingBasisMissing = new WebMarkupContainer("grading_basis_missing") {
@Override
protected void onConfigure() {
super.onConfigure();
setVisible(!hasFilledInGradingBasis.getObject());
}
};
add(gradingBasisMissing);
gradingBasisMissing.add(new AutoHidingListView<>("grading_basis_requirements_not_met", gradingBasisCriterionNotMet) {
@Override
protected void populateItem(ListItem<GradingCriterion> item) {
item.add(new Label("title", item.getModel().map(GradingCriterion::getTitle)));
@ -93,6 +101,13 @@ public class IndividualAuthorAssessment extends GenericPanel<User> {
item.add(new Label("required_points", item.getModel().map(GradingCriterion::getPointsRequiredToPass)));
}
});
gradingBasisMissing.add(new WebMarkupContainer("grading_basis_overall_motivation_missing") {
@Override
protected void onConfigure() {
super.onConfigure();
setVisible(!gradingReport.getObject().hasProvidedOverallMotivation());
}
});
add(new AutoHidingListView<>("individual_assessment_requirements_not_met", individualCriterionNotMet) {
@Override
protected void populateItem(ListItem<GradingCriterion> item) {
@ -164,7 +179,7 @@ public class IndividualAuthorAssessment extends GenericPanel<User> {
boolean criteriaMet = supervisorGradingReport.getProjectCriteria()
.stream()
.allMatch(GradingCriterion::meetsMinimumPointRequirement);
return criteriaMet && supervisorGradingReport.hasProvidedRejectionFeedback();
return criteriaMet && supervisorGradingReport.hasProvidedRejectionFeedback() && supervisorGradingReport.hasProvidedOverallMotivation();
}
private void redGreen(String id, IModel<Boolean> finished, String redTextKey, String greenTextKey) {

@ -163,7 +163,7 @@ public class SupervisorGradingReportPage extends AbstractSupervisorProjectDetail
boolean criteriaMet = supervisorGradingReport.getProjectCriteria()
.stream()
.allMatch(GradingCriterion::meetsMinimumPointRequirement);
return criteriaMet && supervisorGradingReport.hasProvidedRejectionFeedback();
return criteriaMet && supervisorGradingReport.hasProvidedRejectionFeedback() && supervisorGradingReport.hasProvidedOverallMotivation();
}
private boolean individualCriteriaDone(SupervisorGradingReport supervisorGradingReport) {