Filter survey statistics by supervisor

This commit is contained in:
Andreas Svanberg 2023-10-30 12:32:46 +01:00
parent c0902a8cad
commit 9223f53f42
4 changed files with 72 additions and 6 deletions
core/src/main/java/se/su/dsv/scipro/survey
view/src/main/java/se/su/dsv/scipro/admin/pages

@ -26,5 +26,7 @@ public interface SurveyService {
void setAvailability(boolean availability);
SurveyStatistics getStatistics();
record Filter(User supervisor) {}
SurveyStatistics getStatistics(Filter filter);
}

@ -147,8 +147,11 @@ public class SurveyServiceImpl implements SurveyService {
}
@Override
public SurveyStatistics getStatistics() {
List<Survey> surveys = surveyRepository.findAll();
public SurveyStatistics getStatistics(Filter filter) {
List<Survey> surveys = surveyRepository.findAll()
.stream()
.filter(applyFilter(filter))
.toList();
List<Question> questions = getQuestions();
Map<Question, List<SurveyAnswer>> m = surveys.stream()
.map(Survey::getAnswers)
@ -196,6 +199,15 @@ public class SurveyServiceImpl implements SurveyService {
return new SurveyStatistics(surveys.size(), questionStatistics);
}
private Predicate<? super Survey> applyFilter(Filter filter) {
return survey -> {
if (filter.supervisor() != null && !Objects.equals(filter.supervisor(), survey.getProject().getHeadSupervisor())) {
return false;
}
return true;
};
}
private Survey generateSurvey(final Project project, final User author) {
final Survey survey = new Survey();
final List<Question> questions = getQuestions();

@ -2,6 +2,18 @@
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org">
<body>
<wicket:extend>
<div class="card bg-light mb-3">
<form class="card-body p-2" wicket:id="filter">
<div class="mb-3 col-md-2">
<label class="col-form-label">Supervisor</label>
<select class="form-select" wicket:id="supervisor"></select>
</div>
</form>
</div>
<div wicket:id="statistics">
<p class="mb-3">
Respondents: <strong wicket:id="respondents"></strong>
</p>
@ -39,6 +51,8 @@
</div>
</div>
</div>
<wicket:fragment wicket:id="answers">
<ul>
<li wicket:id="answers">

@ -4,17 +4,22 @@ import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.AjaxLink;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.markup.html.panel.Fragment;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.LoadableDetachableModel;
import se.su.dsv.scipro.components.EmployeeAutoComplete;
import se.su.dsv.scipro.components.LargeModalWindow;
import se.su.dsv.scipro.components.ModalWindowPlus;
import se.su.dsv.scipro.data.DetachableServiceModel;
import se.su.dsv.scipro.data.PolyModel;
import se.su.dsv.scipro.statistics.AbstractAdminStatisticsPage;
import se.su.dsv.scipro.survey.SurveyService;
import se.su.dsv.scipro.survey.SurveyStatistics;
import se.su.dsv.scipro.system.User;
import se.su.dsv.scipro.system.UserService;
import javax.inject.Inject;
import java.util.List;
@ -23,14 +28,24 @@ public class AdminSurveyStatisticsPage extends AbstractAdminStatisticsPage {
@Inject
SurveyService surveyService;
private final WebMarkupContainer statisticsContainer;
public AdminSurveyStatisticsPage() {
super();
IModel<SurveyStatistics> statistics = LoadableDetachableModel.of(surveyService::getStatistics);
FilterForm filterForm = new FilterForm("filter");
add(filterForm);
add(new Label("respondents", statistics.map(SurveyStatistics::respondents)));
IModel<SurveyStatistics> statistics = LoadableDetachableModel.of(() ->
surveyService.getStatistics(filterForm.getFilter()));
add(new ListView<>("questions", statistics.map(SurveyStatistics::questions)) {
this.statisticsContainer = new WebMarkupContainer("statistics");
this.statisticsContainer.setOutputMarkupPlaceholderTag(true);
add(statisticsContainer);
this.statisticsContainer.add(new Label("respondents", statistics.map(SurveyStatistics::respondents)));
this.statisticsContainer.add(new ListView<>("questions", statistics.map(SurveyStatistics::questions)) {
@Override
protected void populateItem(ListItem<SurveyStatistics.Question> item) {
item.add(new Label("question", item.getModel().map(SurveyStatistics.Question::text)));
@ -108,6 +123,29 @@ public class AdminSurveyStatisticsPage extends AbstractAdminStatisticsPage {
}
}
private class FilterForm extends Form<Object> {
@Inject
UserService userService;
private IModel<User> supervisorModel;
public FilterForm(String id) {
super(id);
supervisorModel = new DetachableServiceModel<>(userService);
add(new EmployeeAutoComplete("supervisor", supervisorModel) {
@Override
protected void action(AjaxRequestTarget target, User object) {
target.add(statisticsContainer);
}
});
}
public SurveyService.Filter getFilter() {
return new SurveyService.Filter(supervisorModel.getObject());
}
}
private class FreeTextPanel extends WebMarkupContainer {
public FreeTextPanel(String id, IModel<SurveyStatistics.Question.Text> model) {
super(id, model);