Update instructions for how to get Prettier to format on save #55
@ -1,8 +1,6 @@
|
|||||||
package se.su.dsv.scipro.report;
|
package se.su.dsv.scipro.report;
|
||||||
|
|
||||||
import java.io.Serializable;
|
public interface GradeCalculator {
|
||||||
|
|
||||||
public interface GradeCalculator extends Serializable {
|
|
||||||
GradingReport.Grade getGrade(GradingReport gradingReport);
|
GradingReport.Grade getGrade(GradingReport gradingReport);
|
||||||
|
|
||||||
long getPoints(GradingReport gradingReport);
|
long getPoints(GradingReport gradingReport);
|
||||||
|
@ -16,10 +16,8 @@
|
|||||||
|
|
||||||
<fieldset class="mb-3">
|
<fieldset class="mb-3">
|
||||||
<legend><wicket:message key="projectTypes"/></legend>
|
<legend><wicket:message key="projectTypes"/></legend>
|
||||||
<div class="form-check" wicket:id="projectTypes">
|
<div wicket:id="projectTypes"></div>
|
||||||
<input type="checkbox" wicket:id="checkbox" class="form-check-input"/>
|
<div wicket:id="projectTypesFeedback"></div>
|
||||||
<label class="form-check-label" wicket:for="checkbox"><span wicket:id="name"></span></label>
|
|
||||||
</div>
|
|
||||||
</fieldset>
|
</fieldset>
|
||||||
|
|
||||||
<div class="form-row">
|
<div class="form-row">
|
||||||
|
@ -4,17 +4,14 @@ import jakarta.inject.Inject;
|
|||||||
import java.time.LocalDate;
|
import java.time.LocalDate;
|
||||||
import java.time.LocalTime;
|
import java.time.LocalTime;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import org.apache.wicket.extensions.model.AbstractCheckBoxModel;
|
|
||||||
import org.apache.wicket.feedback.FencedFeedbackPanel;
|
import org.apache.wicket.feedback.FencedFeedbackPanel;
|
||||||
import org.apache.wicket.markup.html.basic.Label;
|
|
||||||
import org.apache.wicket.markup.html.form.*;
|
import org.apache.wicket.markup.html.form.*;
|
||||||
import org.apache.wicket.markup.html.list.ListItem;
|
|
||||||
import org.apache.wicket.markup.html.list.ListView;
|
|
||||||
import org.apache.wicket.markup.html.panel.ComponentFeedbackPanel;
|
import org.apache.wicket.markup.html.panel.ComponentFeedbackPanel;
|
||||||
import org.apache.wicket.model.IModel;
|
import org.apache.wicket.model.IModel;
|
||||||
import org.apache.wicket.model.LambdaModel;
|
import org.apache.wicket.model.LambdaModel;
|
||||||
import org.apache.wicket.model.LoadableDetachableModel;
|
import org.apache.wicket.model.LoadableDetachableModel;
|
||||||
import org.apache.wicket.request.mapper.parameter.PageParameters;
|
import org.apache.wicket.request.mapper.parameter.PageParameters;
|
||||||
|
import se.su.dsv.scipro.components.BootstrapCheckBoxMultipleChoice;
|
||||||
import se.su.dsv.scipro.components.BootstrapDatePicker;
|
import se.su.dsv.scipro.components.BootstrapDatePicker;
|
||||||
import se.su.dsv.scipro.components.BootstrapTimePicker;
|
import se.su.dsv.scipro.components.BootstrapTimePicker;
|
||||||
import se.su.dsv.scipro.components.DatesValidator;
|
import se.su.dsv.scipro.components.DatesValidator;
|
||||||
@ -39,7 +36,6 @@ public class AdminEditApplicationPeriodPage
|
|||||||
public static final String TITLE = "title";
|
public static final String TITLE = "title";
|
||||||
public static final String FEEDBACK = "Feedback";
|
public static final String FEEDBACK = "Feedback";
|
||||||
public static final String TITLE_FEEDBACK = "titleFeedback";
|
public static final String TITLE_FEEDBACK = "titleFeedback";
|
||||||
public static final String CHECKBOX = "checkbox";
|
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
private ProjectTypeService projectTypeService;
|
private ProjectTypeService projectTypeService;
|
||||||
@ -62,19 +58,15 @@ public class AdminEditApplicationPeriodPage
|
|||||||
);
|
);
|
||||||
add(new ComponentFeedbackPanel(TITLE_FEEDBACK, title));
|
add(new ComponentFeedbackPanel(TITLE_FEEDBACK, title));
|
||||||
add(title);
|
add(title);
|
||||||
add(
|
BootstrapCheckBoxMultipleChoice<ProjectType> projectTypeChoice = new BootstrapCheckBoxMultipleChoice<>(
|
||||||
new ListView<>(PROJECT_TYPES, availableProjectTypes()) {
|
PROJECT_TYPES,
|
||||||
@Override
|
LambdaModel.of(getModel(), ApplicationPeriod::getProjectTypes, ApplicationPeriod::setProjectTypes),
|
||||||
protected void populateItem(ListItem<ProjectType> item) {
|
availableProjectTypes(),
|
||||||
item.add(
|
new LambdaChoiceRenderer<>(ProjectType::getName, ProjectType::getId)
|
||||||
new CheckBox(CHECKBOX, new ProjectTypeSelectionModel(item.getModel())).setOutputMarkupId(
|
|
||||||
true
|
|
||||||
)
|
|
||||||
);
|
|
||||||
item.add(new Label("name", item.getModel().map(ProjectType::getName)));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
);
|
);
|
||||||
|
projectTypeChoice.setRequired(true);
|
||||||
|
add(projectTypeChoice);
|
||||||
|
add(new FencedFeedbackPanel("projectTypesFeedback", projectTypeChoice));
|
||||||
final FormComponent<LocalDate> startDate = addDateField(
|
final FormComponent<LocalDate> startDate = addDateField(
|
||||||
START_DATE,
|
START_DATE,
|
||||||
LambdaModel.of(getModel(), ApplicationPeriod::getStartDate, ApplicationPeriod::setStartDate)
|
LambdaModel.of(getModel(), ApplicationPeriod::getStartDate, ApplicationPeriod::setStartDate)
|
||||||
@ -139,30 +131,6 @@ public class AdminEditApplicationPeriodPage
|
|||||||
getRootForm().error(getString("overlapping"));
|
getRootForm().error(getString("overlapping"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private class ProjectTypeSelectionModel extends AbstractCheckBoxModel {
|
|
||||||
|
|
||||||
private final IModel<ProjectType> model;
|
|
||||||
|
|
||||||
public ProjectTypeSelectionModel(IModel<ProjectType> model) {
|
|
||||||
this.model = model;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isSelected() {
|
|
||||||
return getModelObject().getProjectTypes().contains(model.getObject());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void select() {
|
|
||||||
getModelObject().addProjectType(model.getObject());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void unselect() {
|
|
||||||
getModelObject().removeProjectType(model.getObject());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private LoadableDetachableModel<ApplicationPeriod> getLoaded(final PageParameters pp) {
|
private LoadableDetachableModel<ApplicationPeriod> getLoaded(final PageParameters pp) {
|
||||||
|
@ -14,4 +14,5 @@ success= Application period saved.
|
|||||||
overlapping= Overlapping application period already exists.
|
overlapping= Overlapping application period already exists.
|
||||||
date.Required= You need to specify a valid date.
|
date.Required= You need to specify a valid date.
|
||||||
hours.Required= Hours field is required.
|
hours.Required= Hours field is required.
|
||||||
minutes.Required= Minutes field is required.
|
minutes.Required= Minutes field is required.
|
||||||
|
projectTypes.Required=You must select at least one project type.
|
||||||
|
@ -4,7 +4,6 @@ import org.apache.wicket.markup.html.WebMarkupContainer;
|
|||||||
import org.apache.wicket.markup.html.basic.Label;
|
import org.apache.wicket.markup.html.basic.Label;
|
||||||
import org.apache.wicket.markup.html.panel.Panel;
|
import org.apache.wicket.markup.html.panel.Panel;
|
||||||
import org.apache.wicket.model.IModel;
|
import org.apache.wicket.model.IModel;
|
||||||
import org.apache.wicket.model.LoadableDetachableModel;
|
|
||||||
import se.su.dsv.scipro.components.OppositeVisibility;
|
import se.su.dsv.scipro.components.OppositeVisibility;
|
||||||
import se.su.dsv.scipro.report.GradeCalculator;
|
import se.su.dsv.scipro.report.GradeCalculator;
|
||||||
import se.su.dsv.scipro.report.GradingReport;
|
import se.su.dsv.scipro.report.GradingReport;
|
||||||
@ -18,15 +17,13 @@ public class GradingReportPointsPanel extends Panel {
|
|||||||
public GradingReportPointsPanel(
|
public GradingReportPointsPanel(
|
||||||
String id,
|
String id,
|
||||||
final IModel<? extends GradingReport> gradingReportIModel,
|
final IModel<? extends GradingReport> gradingReportIModel,
|
||||||
final GradeCalculator gradeCalculator
|
final IModel<GradeCalculator> gradeCalculator
|
||||||
) {
|
) {
|
||||||
super(id, gradingReportIModel);
|
super(id, gradingReportIModel);
|
||||||
final IModel<GradingReport.Grade> gradeModel = new LoadableDetachableModel<>() {
|
final IModel<GradingReport.Grade> gradeModel = gradingReportIModel.combineWith(
|
||||||
@Override
|
gradeCalculator,
|
||||||
protected GradingReport.Grade load() {
|
GradingReport::getGrade
|
||||||
return gradingReportIModel.getObject().getGrade(gradeCalculator);
|
);
|
||||||
}
|
|
||||||
};
|
|
||||||
final Label grade = new Label(GRADE, gradeModel.map(GradingReport.Grade::name)) {
|
final Label grade = new Label(GRADE, gradeModel.map(GradingReport.Grade::name)) {
|
||||||
@Override
|
@Override
|
||||||
protected void onConfigure() {
|
protected void onConfigure() {
|
||||||
@ -36,12 +33,7 @@ public class GradingReportPointsPanel extends Panel {
|
|||||||
};
|
};
|
||||||
add(grade);
|
add(grade);
|
||||||
|
|
||||||
final IModel<Long> points = new LoadableDetachableModel<>() {
|
final IModel<Long> points = gradingReportIModel.combineWith(gradeCalculator, GradingReport::getPoints);
|
||||||
@Override
|
|
||||||
protected Long load() {
|
|
||||||
return gradingReportIModel.getObject().getPoints(gradeCalculator);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
add(new Label(POINTS_LABEL, points));
|
add(new Label(POINTS_LABEL, points));
|
||||||
|
|
||||||
add(new WebMarkupContainer(NO_GRADE_EXPLANATION).add(new OppositeVisibility(grade)));
|
add(new WebMarkupContainer(NO_GRADE_EXPLANATION).add(new OppositeVisibility(grade)));
|
||||||
|
@ -271,8 +271,8 @@ public class IndividualAuthorAssessmentPanel extends GenericPanel<User> {
|
|||||||
new TemplatePanel("points_to_grade_conversion", gradingReport.map(SupervisorGradingReport::getProject))
|
new TemplatePanel("points_to_grade_conversion", gradingReport.map(SupervisorGradingReport::getProject))
|
||||||
);
|
);
|
||||||
|
|
||||||
GradeCalculator supervisorCalculator = gradeCalculatorService.getSupervisorCalculator(
|
IModel<GradeCalculator> supervisorCalculator = LoadableDetachableModel.of(() ->
|
||||||
gradingReport.getObject().getProject()
|
gradeCalculatorService.getSupervisorCalculator(gradingReport.getObject().getProject())
|
||||||
);
|
);
|
||||||
add(new GradingReportPointsPanel("points", gradingReport, supervisorCalculator));
|
add(new GradingReportPointsPanel("points", gradingReport, supervisorCalculator));
|
||||||
|
|
||||||
|
@ -7,8 +7,10 @@ import java.io.Serializable;
|
|||||||
import java.time.LocalDate;
|
import java.time.LocalDate;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import org.apache.wicket.Component;
|
||||||
import org.apache.wicket.Page;
|
import org.apache.wicket.Page;
|
||||||
import org.apache.wicket.feedback.FeedbackMessage;
|
import org.apache.wicket.feedback.FeedbackMessage;
|
||||||
|
import org.apache.wicket.markup.html.form.CheckBoxMultipleChoice;
|
||||||
import org.apache.wicket.markup.html.form.RequiredTextField;
|
import org.apache.wicket.markup.html.form.RequiredTextField;
|
||||||
import org.apache.wicket.request.mapper.parameter.PageParameters;
|
import org.apache.wicket.request.mapper.parameter.PageParameters;
|
||||||
import org.apache.wicket.util.tester.FormTester;
|
import org.apache.wicket.util.tester.FormTester;
|
||||||
@ -36,6 +38,7 @@ public class AdminEditApplicationPeriodPageTest extends SciProTest {
|
|||||||
@BeforeEach
|
@BeforeEach
|
||||||
public void setUp() throws Exception {
|
public void setUp() throws Exception {
|
||||||
bachelor = new ProjectType(DegreeType.BACHELOR, "Bachelor", "Bachelor");
|
bachelor = new ProjectType(DegreeType.BACHELOR, "Bachelor", "Bachelor");
|
||||||
|
bachelor.setId(8L);
|
||||||
bachelor.addModule(ProjectModule.MATCH);
|
bachelor.addModule(ProjectModule.MATCH);
|
||||||
when(projectTypeService.findWithModule(ProjectModule.MATCH)).thenReturn(Collections.singletonList(bachelor));
|
when(projectTypeService.findWithModule(ProjectModule.MATCH)).thenReturn(Collections.singletonList(bachelor));
|
||||||
startPage();
|
startPage();
|
||||||
@ -47,8 +50,12 @@ public class AdminEditApplicationPeriodPageTest extends SciProTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
public void contains_project_type_selection() {
|
public void contains_project_type_selection() {
|
||||||
tester.assertModelValue(path(FORM, PROJECT_TYPES), projectTypeService.findWithModule(ProjectModule.MATCH));
|
tester.assertComponent(path(FORM, PROJECT_TYPES), CheckBoxMultipleChoice.class);
|
||||||
|
Component component = tester.getComponentFromLastRenderedPage(path(FORM, PROJECT_TYPES));
|
||||||
|
CheckBoxMultipleChoice<ProjectType> choice = (CheckBoxMultipleChoice<ProjectType>) component;
|
||||||
|
Assertions.assertEquals(projectTypeService.findWithModule(ProjectModule.MATCH), choice.getChoices());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ -105,7 +112,7 @@ public class AdminEditApplicationPeriodPageTest extends SciProTest {
|
|||||||
);
|
);
|
||||||
FormTester formTester = tester.newFormTester(FORM);
|
FormTester formTester = tester.newFormTester(FORM);
|
||||||
fillInForm("Title", 0, 1, 2, formTester);
|
fillInForm("Title", 0, 1, 2, formTester);
|
||||||
formTester.setValue(path(PROJECT_TYPES, 0, CHECKBOX), true);
|
formTester.setValue(path(PROJECT_TYPES), String.valueOf(bachelor.getId()));
|
||||||
formTester.submit();
|
formTester.submit();
|
||||||
|
|
||||||
ArgumentCaptor<ApplicationPeriod> captor = ArgumentCaptor.forClass(ApplicationPeriod.class);
|
ArgumentCaptor<ApplicationPeriod> captor = ArgumentCaptor.forClass(ApplicationPeriod.class);
|
||||||
@ -113,12 +120,25 @@ public class AdminEditApplicationPeriodPageTest extends SciProTest {
|
|||||||
MatcherAssert.assertThat(captor.getValue().getProjectTypes(), Matchers.hasItem(bachelor));
|
MatcherAssert.assertThat(captor.getValue().getProjectTypes(), Matchers.hasItem(bachelor));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void requires_at_least_one_project_type_to_be_selected() {
|
||||||
|
FormTester formTester = tester.newFormTester(FORM);
|
||||||
|
fillInFormWithValidValues(formTester);
|
||||||
|
formTester.setValue(path(PROJECT_TYPES), "");
|
||||||
|
formTester.submit();
|
||||||
|
tester.assertErrorMessages(tester.getLastRenderedPage().getString("projectTypes.Required"));
|
||||||
|
}
|
||||||
|
|
||||||
private void submitForm(String title, int startDate, int endDate, int courseStartDate) {
|
private void submitForm(String title, int startDate, int endDate, int courseStartDate) {
|
||||||
FormTester formTester = tester.newFormTester(FORM);
|
FormTester formTester = tester.newFormTester(FORM);
|
||||||
fillInForm(title, startDate, endDate, courseStartDate, formTester);
|
fillInForm(title, startDate, endDate, courseStartDate, formTester);
|
||||||
formTester.submit();
|
formTester.submit();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void fillInFormWithValidValues(FormTester formTester) {
|
||||||
|
fillInForm("Title", 0, 1, 2, formTester);
|
||||||
|
}
|
||||||
|
|
||||||
private void fillInForm(String title, int startDate, int endDate, int courseStartDate, FormTester formTester) {
|
private void fillInForm(String title, int startDate, int endDate, int courseStartDate, FormTester formTester) {
|
||||||
formTester.setValue(TITLE, title);
|
formTester.setValue(TITLE, title);
|
||||||
final LocalDate now = LocalDate.now();
|
final LocalDate now = LocalDate.now();
|
||||||
@ -126,6 +146,7 @@ public class AdminEditApplicationPeriodPageTest extends SciProTest {
|
|||||||
formTester.setValue(END_DATE, now.plusDays(endDate).toString());
|
formTester.setValue(END_DATE, now.plusDays(endDate).toString());
|
||||||
formTester.setValue(COURSE_START_DATE, now.plusDays(courseStartDate).toString());
|
formTester.setValue(COURSE_START_DATE, now.plusDays(courseStartDate).toString());
|
||||||
formTester.setValue("courseStartTime", "08:00");
|
formTester.setValue("courseStartTime", "08:00");
|
||||||
|
formTester.setValue(PROJECT_TYPES, String.valueOf(bachelor.getId()));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void startPage() {
|
private void startPage() {
|
||||||
|
@ -62,7 +62,7 @@ public class GradingReportPointsPanelTest extends SciProTest {
|
|||||||
|
|
||||||
private void startPanel() {
|
private void startPanel() {
|
||||||
panel = tester.startComponentInPage(
|
panel = tester.startComponentInPage(
|
||||||
new GradingReportPointsPanel("id", Model.of(gradingReport), gradeCalculator)
|
new GradingReportPointsPanel("id", Model.of(gradingReport), () -> gradeCalculator)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user