diff --git a/src/main/java/nl/tudelft/queue/service/LabService.java b/src/main/java/nl/tudelft/queue/service/LabService.java index 79eea8c1d5f22d102d726949917ec18d5c81f22f..ab2149ab5bd26e95d5b9f0350141a0f81725cdad 100644 --- a/src/main/java/nl/tudelft/queue/service/LabService.java +++ b/src/main/java/nl/tudelft/queue/service/LabService.java @@ -18,6 +18,7 @@ package nl.tudelft.queue.service; import static java.time.LocalDateTime.now; +import static nl.tudelft.labracore.api.dto.RolePersonDetailsDTO.TypeEnum.*; import static nl.tudelft.queue.misc.QueueSessionStatus.*; import java.io.IOException; diff --git a/src/main/java/nl/tudelft/queue/service/RoleDTOService.java b/src/main/java/nl/tudelft/queue/service/RoleDTOService.java index 440df091fab771c0fb58ee997fa3e869466b4381..6c8db09539daa094cf4544dc4244e0c908437bb8 100644 --- a/src/main/java/nl/tudelft/queue/service/RoleDTOService.java +++ b/src/main/java/nl/tudelft/queue/service/RoleDTOService.java @@ -28,6 +28,8 @@ import nl.tudelft.labracore.api.RoleControllerApi; import nl.tudelft.labracore.api.dto.*; import nl.tudelft.labracore.lib.security.user.Person; import nl.tudelft.queue.cache.EditionRolesCacheManager; +import nl.tudelft.queue.cache.SessionCacheManager; +import nl.tudelft.queue.model.QueueSession; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -40,6 +42,9 @@ public class RoleDTOService { @Autowired private RoleControllerApi rApi; + @Autowired + private SessionCacheManager sessionCacheManager; + public List<String> names(List<PersonSummaryDTO> people) { return people.stream().map(PersonSummaryDTO::getDisplayName).collect(Collectors.toList()); } @@ -131,6 +136,17 @@ public class RoleDTOService { return roles(eDto, Set.of(TA)); } + public List<PersonSummaryDTO> assistantsAndManagers(QueueSession<?> qSession) { + return erCache + .getAndIgnoreMissing(sessionCacheManager.getRequired(qSession.getId()).getEditions().stream() + .map(EditionSummaryDTO::getId)) + .stream().flatMap(rh -> rh.getRoles().stream()) + .filter(role -> Set.of(TA, HEAD_TA, TEACHER, TEACHER_RO).contains(role.getType())) + .map(RolePersonDetailsDTO::getPerson) + .distinct() + .collect(Collectors.toList()); + } + public List<PersonSummaryDTO> headTAs(EditionDetailsDTO eDto) { return roles(eDto, Set.of(HEAD_TA)); } diff --git a/src/main/resources/templates/lab/view/components/slots-info.html b/src/main/resources/templates/lab/view/components/slots-info.html index 12fd5772c5a6c2dcfcaeff31abff62365c4e38a0..dce4117b6db56306dc113e222208e830a80d4d24 100644 --- a/src/main/resources/templates/lab/view/components/slots-info.html +++ b/src/main/resources/templates/lab/view/components/slots-info.html @@ -34,6 +34,10 @@ <a href="#ts-capacity-tab" class="nav-link" data-toggle="list" aria-selected="true"><i class="fa fa-chair"></i> Edit Time-slot Capacity</a> </li> + <li class="nav-item" role="tab"> + <a href="#ts-distribution-tab" class="nav-link" data-toggle="list" aria-selected="true"><i + class="fa fa-solid fa-people"></i> Distribute Requests</a> + </li> </ul> <div class="tab-content"> @@ -192,6 +196,30 @@ </div> </th:block> + <th:block th:if="${@permissionService.canManageSession(qSession.data)}"> + <div id="ts-distribution-tab" class="tab-pane fade"> + <h2>Distribute Requests</h2> + <p>Distribute pending requests among selected TAs.</p> + <form th:with="allAssistants = ${@roleDTOService.assistantsAndManagers(qSession.data)}"> + <label class="col-sm-1 col-form-label" for="assistant-select">Select Assistants:</label> + <div class="col-sm-3"> + <select multiple class="selectpicker form-control" + id="assistant-select" + data-live-search="true" + required> + <th:block th:each="assistant : ${allAssistants}"> + <option th:value="${assistant.id}" + th:text="|${assistant.displayName}|"> + </option> + </th:block> + </select> + </div> + </form> + + + </div> + </th:block> + <hr> </div>