3204 Unified the look of each reviewer card during assignment

This commit is contained in:
Andreas Svanberg 2023-12-08 13:12:28 +01:00
parent 3c8740cac8
commit f2cfb07a29
2 changed files with 75 additions and 114 deletions
view/src/main/java/se/su/dsv/scipro/admin/pages

@ -32,23 +32,7 @@
and their research area matches the project's.
</p>
<div class="card bg-success text-white bg-opacity-50 mb-3" wicket:id="good_candidates">
<div class="row">
<div class="col-auto">
<img class="img-fluid rounded-start" wicket:id="image">
</div>
<div class="col my-auto">
<div class="card-body p-0">
<h4 class="card-title text-white" wicket:id="user"></h4>
<span wicket:id="assigned"></span> / <span wicket:id="target"></span>
<p wicket:id="note"></p>
</div>
</div>
<div class="col-auto my-auto">
<div class="card-body py-0">
<button class="btn btn-success" wicket:id="assign">Assign</button>
</div>
</div>
</div>
<wicket:container wicket:id="details"/>
</div>
</wicket:enclosure>
@ -58,39 +42,7 @@
These reviewers have not met their review quota, but their language or research areas does not match the project's.
</p>
<div class="card bg-warning opacity-50 mb-3" wicket:id="mismatched_candidates">
<div class="row">
<div class="col-auto">
<img class="img-fluid rounded-start" wicket:id="image">
</div>
<div class="col my-auto">
<div class="card-body p-0">
<h4 class="card-title" wicket:id="user"></h4>
<span wicket:id="assigned"></span> / <span wicket:id="target"></span>
<p wicket:id="note"></p>
<div>
Research areas:
<ul class="csv">
<li wicket:id="research_areas">
<wicket:container wicket:id="research_area"></wicket:container>
</li>
</ul>
</div>
<div>
Languages:
<ul class="csv">
<li wicket:id="languages">
<wicket:container wicket:id="language"></wicket:container>
</li>
</ul>
</div>
</div>
</div>
<div class="col-auto my-auto">
<div class="card-body py-0">
<button class="btn btn-success" wicket:id="assign">Assign</button>
</div>
</div>
</div>
<wicket:container wicket:id="details"/>
</div>
</wicket:enclosure>
@ -100,23 +52,7 @@
These reviewers have already met their assigned review quota.
</p>
<div class="card bg-danger text-white opacity-50 mb-3" wicket:id="busy_candidates">
<div class="row">
<div class="col-auto">
<img class="img-fluid rounded-start" wicket:id="image">
</div>
<div class="col my-auto">
<div class="card-body p-0">
<h4 class="card-title text-white" wicket:id="user"></h4>
<span wicket:id="assigned"></span> / <span wicket:id="target"></span>
<p wicket:id="note"></p>
</div>
</div>
<div class="col-auto my-auto">
<div class="card-body py-0">
<button class="btn btn-success" wicket:id="assign">Assign</button>
</div>
</div>
</div>
<wicket:container wicket:id="details"/>
</div>
</wicket:enclosure>
@ -126,23 +62,46 @@
These reviewers have not been assigned a review quota at all.
</p>
<div class="card bg-secondary text-white opacity-50 mb-3" wicket:id="unavailable_candidates">
<div class="row">
<div class="col-auto">
<img class="img-fluid rounded-start" wicket:id="image">
</div>
<div class="col my-auto">
<div class="card-body p-0">
<h4 class="card-title text-white" wicket:id="user"></h4>
<wicket:container wicket:id="details"/>
</div>
</wicket:enclosure>
<wicket:fragment wicket:id="reviewer_details">
<div class="row g-0">
<div class="col-auto">
<img class="img-fluid rounded-start" wicket:id="image">
</div>
<div class="col my-auto">
<div class="card-body">
<h4 class="card-title text-white" wicket:id="user"></h4>
<span wicket:id="assigned"></span> / <span wicket:id="target"></span>
<p wicket:id="note"></p>
<div>
Research areas:
<ul class="csv">
<li wicket:id="research_areas">
<wicket:container wicket:id="research_area"></wicket:container>
</li>
<li wicket:id="none">None specified</li>
</ul>
</div>
</div>
<div class="col-auto my-auto">
<div class="card-body py-0">
<button class="btn btn-secondary" wicket:id="assign">Assign</button>
<div>
Languages:
<ul class="csv mb-0">
<li wicket:id="languages">
<wicket:container wicket:id="language"></wicket:container>
</li>
</ul>
</div>
</div>
</div>
<div class="col-auto my-auto">
<div class="card-body">
<button class="btn btn-success" wicket:id="assign">Assign</button>
</div>
</div>
</div>
</wicket:enclosure>
</wicket:fragment>
</div>
</div>
</wicket:extend>

@ -9,6 +9,7 @@ import org.apache.wicket.markup.html.link.Link;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.markup.html.panel.FeedbackPanel;
import org.apache.wicket.markup.html.panel.Fragment;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.LoadableDetachableModel;
import org.apache.wicket.request.mapper.parameter.PageParameters;
@ -90,60 +91,61 @@ public class AdminAssignReviewerPage extends AbstractAdminProjectPage {
add(new AutoHidingListView<>("good_candidates", reviewerCandidates.map(ReviewerCandidates::good)) {
@Override
protected void populateItem(ListItem<ReviewerCandidates.Candidate> item) {
item.add(new UserProfileImage("image", item.getModel().map(ReviewerCandidates.Candidate::reviewer), UserProfileImage.Size.MEDIUM));
item.add(new UserLabel("user", item.getModel().map(ReviewerCandidates.Candidate::reviewer)));
item.add(new Label("target", item.getModel().map(ReviewerCandidates.Candidate::target)));
item.add(new Label("assigned", item.getModel().map(ReviewerCandidates.Candidate::assigned)));
item.add(new Label("note", item.getModel().map(ReviewerCandidates.Candidate::note)));
item.add(new AssignReviewerLink("assign", item.getModel().map(ReviewerCandidates.Candidate::reviewer)));
item.add(new ReviewerCard("details", item.getModel()));
}
});
add(new AutoHidingListView<>("mismatched_candidates", reviewerCandidates.map(ReviewerCandidates::mismatched)) {
@Override
protected void populateItem(ListItem<ReviewerCandidates.Candidate> item) {
IModel<User> reviewerModel = item.getModel().map(ReviewerCandidates.Candidate::reviewer);
item.add(new UserProfileImage("image", reviewerModel, UserProfileImage.Size.MEDIUM));
item.add(new UserLabel("user", reviewerModel));
item.add(new Label("target", item.getModel().map(ReviewerCandidates.Candidate::target)));
item.add(new Label("assigned", item.getModel().map(ReviewerCandidates.Candidate::assigned)));
item.add(new Label("note", item.getModel().map(ReviewerCandidates.Candidate::note)));
item.add(new AssignReviewerLink("assign", reviewerModel));
item.add(new ListView<>("research_areas", reviewerModel.map(User::getResearchAreas).map(ArrayList::new)) {
@Override
protected void populateItem(ListItem<ResearchArea> item) {
item.add(new Label("research_area", item.getModel().map(ResearchArea::getTitle)));
}
});
item.add(new ListView<>("languages", reviewerModel.map(User::getLanguages).map(ArrayList::new)) {
@Override
protected void populateItem(ListItem<Language> item) {
item.add(new EnumLabel<>("language", item.getModel()));
}
});
item.add(new ReviewerCard("details", item.getModel()));
}
});
add(new AutoHidingListView<>("busy_candidates", reviewerCandidates.map(ReviewerCandidates::busy)) {
@Override
protected void populateItem(ListItem<ReviewerCandidates.Candidate> item) {
item.add(new UserProfileImage("image", item.getModel().map(ReviewerCandidates.Candidate::reviewer), UserProfileImage.Size.MEDIUM));
item.add(new UserLabel("user", item.getModel().map(ReviewerCandidates.Candidate::reviewer)));
item.add(new Label("target", item.getModel().map(ReviewerCandidates.Candidate::target)));
item.add(new Label("assigned", item.getModel().map(ReviewerCandidates.Candidate::assigned)));
item.add(new Label("note", item.getModel().map(ReviewerCandidates.Candidate::note)));
item.add(new AssignReviewerLink("assign", item.getModel().map(ReviewerCandidates.Candidate::reviewer)));
item.add(new ReviewerCard("details", item.getModel()));
}
});
add(new AutoHidingListView<>("unavailable_candidates", reviewerCandidates.map(ReviewerCandidates::unavailable)) {
@Override
protected void populateItem(ListItem<ReviewerCandidates.Candidate> item) {
item.add(new UserProfileImage("image", item.getModel().map(ReviewerCandidates.Candidate::reviewer), UserProfileImage.Size.MEDIUM));
item.add(new UserLabel("user", item.getModel().map(ReviewerCandidates.Candidate::reviewer)));
IModel<User> reviewer = item.getModel().map(ReviewerCandidates.Candidate::reviewer);
item.add(new AssignReviewerLink("assign", reviewer));
item.add(new ReviewerCard("details", item.getModel()));
}
});
}
private class ReviewerCard extends Fragment {
public ReviewerCard(String id, IModel<ReviewerCandidates.Candidate> candidate) {
super(id, "reviewer_details", AvailableReviewersPanel.this, candidate);
IModel<User> reviewer = candidate.map(ReviewerCandidates.Candidate::reviewer);
add(new UserProfileImage("image", reviewer, UserProfileImage.Size.MEDIUM));
add(new UserLabel("user", reviewer));
add(new Label("target", candidate.map(ReviewerCandidates.Candidate::target)));
add(new Label("assigned", candidate.map(ReviewerCandidates.Candidate::assigned)));
add(new Label("note", candidate.map(ReviewerCandidates.Candidate::note)));
add(new ListView<>("research_areas", reviewer.map(User::getResearchAreas).map(ArrayList::new)) {
@Override
protected void populateItem(ListItem<ResearchArea> item) {
item.add(new Label("research_area", item.getModel().map(ResearchArea::getTitle)));
}
});
add(new WebMarkupContainer("none") {
@Override
protected void onConfigure() {
super.onConfigure();
setVisible(reviewer.getObject().getResearchAreas().isEmpty());
}
});
add(new ListView<>("languages", reviewer.map(User::getLanguages).map(ArrayList::new)) {
@Override
protected void populateItem(ListItem<Language> item) {
item.add(new EnumLabel<>("language", item.getModel()));
}
});
add(new AssignReviewerLink("assign", reviewer));
}
}
private class AssignReviewerLink extends Link<User> {
public AssignReviewerLink(String id, IModel<User> reviewer) {
super(id, reviewer);