Skip to content

Commit 51fb604

Browse files
authored
Merge pull request #11285 from Vitaliy-1/stable-3_5_0-i11252
#11252 Show only reviews in the last round in action-required view
2 parents be11cf4 + 99e6085 commit 51fb604

File tree

3 files changed

+41
-11
lines changed

3 files changed

+41
-11
lines changed

api/v1/_submissions/PKPBackendSubmissionsController.php

+4-1
Original file line numberDiff line numberDiff line change
@@ -368,7 +368,7 @@ public function getReviewAssignments(Request $illuminateRequest): JsonResponse
368368
}
369369
$currentUser = $request->getUser();
370370
$collector = Repo::reviewAssignment()->getCollector()
371-
->filterByReviewerIds([$currentUser->getId()])
371+
->filterByReviewerIds([$currentUser->getId()], true)
372372
->filterByContextIds([$context->getId()]);
373373

374374
foreach ($illuminateRequest->query() as $param => $val) {
@@ -391,6 +391,9 @@ public function getReviewAssignments(Request $illuminateRequest): JsonResponse
391391
case 'published':
392392
$collector->filterByPublished(true);
393393
break;
394+
case 'allReviewRounds':
395+
$collector->filterByReviewerIds([$currentUser->getId()]);
396+
break;
394397
}
395398
}
396399

classes/submission/Repository.php

+7-7
Original file line numberDiff line numberDiff line change
@@ -1095,7 +1095,7 @@ protected function mapDashboardViews(Collection $types, Context $context, User $
10951095
->filterByStatus([PKPSubmission::STATUS_QUEUED]);
10961096
return new DashboardView(
10971097
$key,
1098-
in_array(Role::ROLE_ID_AUTHOR, $selectedRoleIds) ? __('submission.list.revisionsSubmitted') : __('submission.dashboard.view.revisionsSubmitted'),
1098+
in_array(Role::ROLE_ID_AUTHOR, $selectedRoleIds) ? __('submission.list.revisionsSubmitted') : __('submission.dashboard.view.revisionsSubmitted'),
10991099
[Role::ROLE_ID_SITE_ADMIN, Role::ROLE_ID_MANAGER, Role::ROLE_ID_SUB_EDITOR, Role::ROLE_ID_ASSISTANT, Role::ROLE_ID_AUTHOR],
11001100
$canAccessUnassignedSubmission
11011101
? $collector
@@ -1121,7 +1121,7 @@ protected function mapDashboardViews(Collection $types, Context $context, User $
11211121
__('submission.dashboard.view.reviewAssignments.actionRequired'),
11221122
[Role::ROLE_ID_REVIEWER],
11231123
Repo::reviewAssignment()->getCollector()
1124-
->filterByReviewerIds([$user->getId()])
1124+
->filterByReviewerIds([$user->getId()], true)
11251125
->filterByContextIds([$context->getId()])
11261126
->filterByActionRequiredByReviewer(true),
11271127
'reviewerAssignments',
@@ -1133,7 +1133,7 @@ protected function mapDashboardViews(Collection $types, Context $context, User $
11331133
__('submission.dashboard.view.reviewAssignments.all'),
11341134
[Role::ROLE_ID_REVIEWER],
11351135
Repo::reviewAssignment()->getCollector()
1136-
->filterByReviewerIds([$user->getId()])
1136+
->filterByReviewerIds([$user->getId()], true)
11371137
->filterByContextIds([$context->getId()])
11381138
->filterByActive(true),
11391139
'reviewerAssignments',
@@ -1145,7 +1145,7 @@ protected function mapDashboardViews(Collection $types, Context $context, User $
11451145
__('submission.dashboard.view.reviewAssignments.completed'),
11461146
[Role::ROLE_ID_REVIEWER],
11471147
Repo::reviewAssignment()->getCollector()
1148-
->filterByReviewerIds([$user->getId()])
1148+
->filterByReviewerIds([$user->getId()], true)
11491149
->filterByContextIds([$context->getId()])
11501150
->filterByCompleted(true),
11511151
'reviewerAssignments',
@@ -1157,7 +1157,7 @@ protected function mapDashboardViews(Collection $types, Context $context, User $
11571157
__('submission.dashboard.view.reviewAssignments.published'),
11581158
[Role::ROLE_ID_REVIEWER],
11591159
Repo::reviewAssignment()->getCollector()
1160-
->filterByReviewerIds([$user->getId()])
1160+
->filterByReviewerIds([$user->getId()], true)
11611161
->filterByContextIds([$context->getId()])
11621162
->filterByPublished(true),
11631163
'reviewerAssignments',
@@ -1169,7 +1169,7 @@ protected function mapDashboardViews(Collection $types, Context $context, User $
11691169
__('submission.dashboard.view.reviewAssignments.archived'),
11701170
[Role::ROLE_ID_REVIEWER],
11711171
Repo::reviewAssignment()->getCollector()
1172-
->filterByReviewerIds([$user->getId()])
1172+
->filterByReviewerIds([$user->getId()], true)
11731173
->filterByContextIds([$context->getId()])
11741174
->filterByIsArchived(true),
11751175
'reviewerAssignments',
@@ -1181,7 +1181,7 @@ protected function mapDashboardViews(Collection $types, Context $context, User $
11811181
__('submission.dashboard.view.reviewAssignments.declined'),
11821182
[Role::ROLE_ID_REVIEWER],
11831183
Repo::reviewAssignment()->getCollector()
1184-
->filterByReviewerIds([$user->getId()])
1184+
->filterByReviewerIds([$user->getId()], true)
11851185
->filterByContextIds([$context->getId()])
11861186
->filterByDeclined(true),
11871187
'reviewerAssignments',

classes/submission/reviewAssignment/Collector.php

+30-3
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ class Collector implements CollectorInterface, ViewsCount
4545
public bool $isDeclined = false;
4646
public ?array $reviewRoundIds = null;
4747
public ?array $reviewerIds = null;
48+
public ?bool $isLastReviewRoundByReviewer = false;
4849
public bool $isLastReviewRound = false;
4950
public ?int $count = null;
5051
public ?int $offset = null;
@@ -191,9 +192,18 @@ public function filterByReviewRoundIds(?array $reviewRoundIds): static
191192
return $this;
192193
}
193194

194-
public function filterByReviewerIds(?array $reviewerIds): static
195+
/**
196+
* Filter results by reviewer IDs
197+
*
198+
* @param array|null $reviewerIds user IDs of reviewers
199+
* @param bool $lastReviewRound if true, only the last review round for each reviewer will be returned
200+
*
201+
* @return $this
202+
*/
203+
public function filterByReviewerIds(?array $reviewerIds, bool $lastReviewRound = false): static
195204
{
196205
$this->reviewerIds = $reviewerIds;
206+
$this->isLastReviewRoundByReviewer = $lastReviewRound;
197207
return $this;
198208
}
199209

@@ -435,8 +445,25 @@ public function getQueryBuilder(): Builder
435445

436446
$q->when(
437447
$this->reviewerIds !== null,
438-
fn (Builder $q) =>
439-
$q->whereIn('ra.reviewer_id', $this->reviewerIds)
448+
fn (Builder $q) => $q
449+
->whereIn('ra.reviewer_id', $this->reviewerIds)
450+
->when(
451+
$this->isLastReviewRoundByReviewer,
452+
fn (Builder $q) => $q
453+
// Aggregate the latest review round number for the given assignment and reviewer
454+
->leftJoinSub(
455+
DB::table('review_assignments as ramax')
456+
->select(['ramax.submission_id', 'ramax.reviewer_id'])
457+
->selectRaw('MAX(ramax.round) as latest_round')
458+
->selectRaw('MAX(ramax.stage_id) as latest_stage')
459+
->whereIn('ramax.reviewer_id', $this->reviewerIds)
460+
->groupBy(['ramax.submission_id', 'ramax.reviewer_id']),
461+
'agrmax',
462+
fn (JoinClause $join) => $join->on('ra.submission_id', '=', 'agrmax.submission_id')
463+
)
464+
->whereColumn('ra.round', 'agrmax.latest_round') // assignments from the last review round per reviewer only
465+
->whereColumn('ra.stage_id', 'agrmax.latest_stage') // assignments for the current review stage only (for OMP)
466+
)
440467
);
441468

442469
$q->when(

0 commit comments

Comments
 (0)