3298 Filter projects by reviewer

This commit is contained in:
Andreas Svanberg 2024-02-01 14:57:51 +01:00
parent 0acf5f2bad
commit bf572189d3
4 changed files with 29 additions and 2 deletions
core/src/main/java/se/su/dsv/scipro/project
view/src/main/java/se/su/dsv/scipro/datatables/project

@ -42,6 +42,7 @@ public interface ProjectService extends GenericService<Project, Long>, FilteredS
private Collection<ProjectType> projectTypes;
private String titleContains;
private User supervisor;
private User reviewer;
private boolean filterSupervisor = true;
private Collection<ProjectTeamMemberRoles> roles;
private User authorUser;
@ -157,6 +158,14 @@ public interface ProjectService extends GenericService<Project, Long>, FilteredS
this.redStateTime = redStateTime;
}
public User getReviewer() {
return reviewer;
}
public void setReviewer(User reviewer) {
this.reviewer = reviewer;
}
@Override
public boolean equals(final Object o) {
if (o == this) return true;
@ -166,6 +175,7 @@ public interface ProjectService extends GenericService<Project, Long>, FilteredS
&& Objects.equals(this.getProjectTypes(), other.getProjectTypes())
&& Objects.equals(this.getTitleContains(), other.getTitleContains())
&& Objects.equals(this.getSupervisor(), other.getSupervisor())
&& Objects.equals(this.getReviewer(), other.getReviewer())
&& this.isFilterSupervisor() == other.isFilterSupervisor()
&& Objects.equals(this.getRoles(), other.getRoles())
&& Objects.equals(this.getAuthorUser(), other.getAuthorUser())
@ -187,6 +197,7 @@ public interface ProjectService extends GenericService<Project, Long>, FilteredS
return Objects.hash(this.getProjectTypes(),
this.getTitleContains(),
this.getSupervisor(),
this.getReviewer(),
this.isFilterSupervisor(),
this.getRoles(),
this.getAuthorUser(),
@ -201,7 +212,7 @@ public interface ProjectService extends GenericService<Project, Long>, FilteredS
@Override
public String toString() {
return "ProjectService.Filter(projectTypes=" + this.getProjectTypes() + ", titleContains=" + this.getTitleContains() + ", supervisor=" + this.getSupervisor() + ", filterSupervisor=" + this.isFilterSupervisor() + ", roles=" + this.getRoles() + ", authorUser=" + this.getAuthorUser() + ", createdAfter=" + this.getCreatedAfter() + ", createdBefore=" + this.getCreatedBefore() + ", statuses=" + this.getStatuses() + ", filterExternal=" + this.isFilterExternal() + ", noReviewer=" + this.isNoReviewer() + ", unit=" + this.getUnit() + ", redStateTime=" + this.getRedStateTime() + ")";
return "ProjectService.Filter(projectTypes=" + this.getProjectTypes() + ", titleContains=" + this.getTitleContains() + ", supervisor=" + this.getSupervisor() + ", reviewer=" + this.getReviewer() + ", filterSupervisor=" + this.isFilterSupervisor() + ", roles=" + this.getRoles() + ", authorUser=" + this.getAuthorUser() + ", createdAfter=" + this.getCreatedAfter() + ", createdBefore=" + this.getCreatedBefore() + ", statuses=" + this.getStatuses() + ", filterExternal=" + this.isFilterExternal() + ", noReviewer=" + this.isNoReviewer() + ", unit=" + this.getUnit() + ", redStateTime=" + this.getRedStateTime() + ")";
}
}
}

@ -204,6 +204,9 @@ public class ProjectServiceImpl extends AbstractServiceImpl<Project, Long> imple
if (rolesBb.hasValue()) {
predicate.and(rolesBb);
}
if (filter.getReviewer() != null) {
predicate.and(QProject.project.reviewers.any().eq(filter.getReviewer()));
}
if (filter.getTitleContains() != null && filter.getTitleContains().length() >= MIN_TITLE_LENGTH) {
predicate.and(titleContains(filter.getTitleContains()));

@ -39,7 +39,10 @@
</div>
</div>
<div class="col-md-12 col-lg-2">
<strong>Reviewer</strong>
<div class="mb-3">
<label wicket:for="reviewerFilter" class="col-form-label">Reviewer</label>
<select class="w-100" wicket:id="reviewerFilter"></select>
</div>
<div class="form-check">
<input class="form-check-input" type="checkbox" wicket:id="noReviewer">
<label class="form-check-label" wicket:for="noReviewer">

@ -44,6 +44,7 @@ public abstract class ProjectFilterPanel extends Panel {
addDateFilter(model);
addRedStateFilter(model);
addSupervisorFilter(model);
addReviewerFilter(model);
addProjectTitleFilter(model);
addAuthorFilter(model);
addProjectTypeFilter(model);
@ -83,6 +84,15 @@ public abstract class ProjectFilterPanel extends Panel {
});
}
private void addReviewerFilter(final IModel<ProjectService.Filter> filter) {
add(new EmployeeAutoComplete("reviewerFilter", LambdaModel.of(filter, ProjectService.Filter::getReviewer, ProjectService.Filter::setReviewer)) {
@Override
protected void action(AjaxRequestTarget target, User newSelection) {
filterUpdated(target);
}
});
}
private void addProjectTitleFilter(final IModel<ProjectService.Filter> model) {
TextField<String> titleField = new TextField<>("titleFilter", new Model<>());
titleField.add(new AjaxFormComponentUpdatingBehavior("keyup") {