Skip to content

Commit

Permalink
pkp#10970 Implement reviewer views according to new logic
Browse files Browse the repository at this point in the history
  • Loading branch information
Vitaliy-1 committed Feb 26, 2025
1 parent 8622d23 commit 00df6c8
Show file tree
Hide file tree
Showing 5 changed files with 205 additions and 18 deletions.
16 changes: 14 additions & 2 deletions api/v1/_submissions/PKPBackendSubmissionsController.php
Original file line number Diff line number Diff line change
Expand Up @@ -394,12 +394,24 @@ public function getReviewAssignments(Request $illuminateRequest): JsonResponse

foreach ($illuminateRequest->query() as $param => $val) {
switch ($param) {
case 'pending':
$collector->filterByIsIncomplete(true);
case 'actionRequired':
$collector->filterByActionRequiredByReviewer(true);
break;
case 'active':
$collector->filterByActive(true);
break;
case 'archived':
$collector->filterByIsArchived(true);
break;
case 'declined':
$collector->filterByDeclined(true);
break;
case 'completed':
$collector->filterByCompleted(true);
break;
case 'published':
$collector->filterByPublished(true);
break;
}
}

Expand Down
6 changes: 5 additions & 1 deletion classes/submission/DashboardView.php
Original file line number Diff line number Diff line change
Expand Up @@ -41,10 +41,14 @@ class DashboardView
public const TYPE_SCHEDULED = 'scheduled';
public const TYPE_PUBLISHED = 'published';
public const TYPE_DECLINED = 'declined';

public const TYPE_INCOMPLETE_SUBMISSIONS = 'incomplete-submissions';
public const TYPE_REVIEWER_ACTION_REQUIRED = 'reviewer-action-required';
public const TYPE_REVIEWER_ASSIGNMENTS_ALL = 'reviewer-assignments-all';
public const TYPE_REVIEWER_ASSIGNMENTS_PENDING = 'reviewer-assignments-pending';
public const TYPE_REVIEWER_ASSIGNMENTS_COMPLETED = 'reviewer-assignments-completed';
public const TYPE_REVIEWER_ASSIGNMENTS_PUBLISHED = 'reviewer-assignments-published';
public const TYPE_REVIEWER_ASSIGNMENTS_ARCHIVED = 'reviewer-assignments-archived';
public const TYPE_REVIEWER_ASSIGNMENTS_DECLINED = 'reviewer-assignments-declined';

// The number of submissions in the view
protected int $count = 0;
Expand Down
51 changes: 45 additions & 6 deletions classes/submission/Repository.php
Original file line number Diff line number Diff line change
Expand Up @@ -1074,27 +1074,53 @@ protected function mapDashboardViews(Collection $types, Context $context, User $
'assigned',
['isIncomplete' => true]
);
case DashboardView::TYPE_REVIEWER_ACTION_REQUIRED:
return new DashboardView(
$key,
__('submission.dashboard.view.reviewAssignments.actionRequired'),
[Role::ROLE_ID_REVIEWER],
Repo::reviewAssignment()->getCollector()
->filterByReviewerIds([$user->getId()])
->filterByContextIds([$context->getId()])
->filterByActionRequiredByReviewer(true),
'reviewerAssignments',
['actionRequired' => true]
);
case DashboardView::TYPE_REVIEWER_ASSIGNMENTS_ALL:
return new DashboardView(
$key,
__('submission.dashboard.view.reviewAssignments.all'),
[Role::ROLE_ID_REVIEWER],
Repo::reviewAssignment()->getCollector()
->filterByReviewerIds([$user->getId()])
->filterByContextIds([$context->getId()]),
'reviewerAssignments'
->filterByContextIds([$context->getId()])
->filterByActive(true),
'reviewerAssignments',
['active' => true]
);
case DashboardView::TYPE_REVIEWER_ASSIGNMENTS_PENDING:
case DashboardView::TYPE_REVIEWER_ASSIGNMENTS_COMPLETED:
return new DashboardView(
$key,
__('submission.dashboard.view.reviewAssignments.pending'),
__('submission.dashboard.view.reviewAssignments.completed'),
[Role::ROLE_ID_REVIEWER],
Repo::reviewAssignment()->getCollector()
->filterByReviewerIds([$user->getId()])
->filterByContextIds([$context->getId()])
->filterByIsIncomplete(true),
->filterByCompleted(true),
'reviewerAssignments',
['pending' => true]
['completed' => true]
);
case DashboardView::TYPE_REVIEWER_ASSIGNMENTS_PUBLISHED:
return new DashboardView(
$key,
__('submission.dashboard.view.reviewAssignments.published'),
[Role::ROLE_ID_REVIEWER],
Repo::reviewAssignment()->getCollector()
->filterByReviewerIds([$user->getId()])
->filterByContextIds([$context->getId()])
->filterByPublished(true),
'reviewerAssignments',
['published' => true]
);
case DashboardView::TYPE_REVIEWER_ASSIGNMENTS_ARCHIVED:
return new DashboardView(
Expand All @@ -1108,6 +1134,19 @@ protected function mapDashboardViews(Collection $types, Context $context, User $
'reviewerAssignments',
['archived' => true]
);
case DashboardView::TYPE_REVIEWER_ASSIGNMENTS_DECLINED:
return new DashboardView(
$key,
__('submission.dashboard.view.reviewAssignments.declined'),
[Role::ROLE_ID_REVIEWER],
Repo::reviewAssignment()->getCollector()
->filterByReviewerIds([$user->getId()])
->filterByContextIds([$context->getId()])
->filterByDeclined(true),
'reviewerAssignments',
['declined' => true]
);

}
});
}
Expand Down
135 changes: 129 additions & 6 deletions classes/submission/reviewAssignment/Collector.php
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
<?php

/**
* @file classes/submission/reviewAssignment/Collector.php
*
Expand All @@ -20,6 +21,7 @@
use Illuminate\Support\LazyCollection;
use PKP\core\Core;
use PKP\core\interfaces\CollectorInterface;
use PKP\submission\PKPSubmission;
use PKP\submission\ViewsCount;

/**
Expand All @@ -34,8 +36,13 @@ class Collector implements CollectorInterface, ViewsCount
public ?array $contextIds = null;
public ?array $submissionIds = null;
public bool $isIncomplete = false;
public bool $isActive = false;
public bool $actionRequiredByReviewer = false;
public bool $isCompleted = false;
public bool $isPublished = false;
public bool $isArchived = false;
public bool $isOverdue = false;
public bool $isDeclined = false;
public ?array $reviewRoundIds = null;
public ?array $reviewerIds = null;
public bool $isLastReviewRound = false;
Expand Down Expand Up @@ -110,7 +117,7 @@ public function filterByIsIncomplete(?bool $isIncomplete): static
}

/**
* Filter by completed or declined assignments
* Filter review assignments which are incomplete but submission was moved forward to the editing or production stage
*/
public function filterByIsArchived(?bool $isArchived): static
{
Expand All @@ -121,12 +128,60 @@ public function filterByIsArchived(?bool $isArchived): static
/**
* Filter by overdue assignments
*/
public function filterByIsOverdue(?bool $isOverdue): static
public function filterByIsOverdue(bool $isOverdue): static
{
$this->isOverdue = $isOverdue;
return $this;
}

/**
* Filter by review assignments, which require attention from reviewer:
* awaiting respond from reviewer to accept the review or to finish the review (accepted but not completed)
* due dates are missed
* Don't include assignments that aren't on a correspondent review stage
*/
public function filterByActionRequiredByReviewer(bool $actionsRequired): static
{
$this->actionRequiredByReviewer = $actionsRequired;
return $this;
}

/**
* Filter by submissions there are not: cancelled, declined, published
*/
public function filterByActive(bool $isActive): static
{
$this->isActive = $isActive;
return $this;
}

/**
* Filter by completed review assignments, applies for all submissions stages, except submission is published (see filterByPublished)
*/
public function filterByCompleted(bool $isCompleted): static
{
$this->isCompleted = $isCompleted;
return $this;
}

/**
* Filter by complete review assignments made on submissions which subsequently were published
*/
public function filterByPublished(bool $isPublished): static
{
$this->isPublished = $isPublished;
return $this;
}

/**
* Filter by declined review assignments
*/
public function filterByDeclined(bool $isDeclined): static
{
$this->isDeclined = $isDeclined;
return $this;
}

/**
* Filter by review round ids
*/
Expand Down Expand Up @@ -271,13 +326,81 @@ public function getQueryBuilder(): Builder
);
});

$q->when(
$this->actionRequiredByReviewer,
fn (Builder $q) => $q
->whereNull('ra.date_completed')
->where('ra.declined', '<>', 1)
->where('ra.cancelled', '<>', 1)
->whereIn(
'ra.submission_id',
fn (Builder $q) => $q
->select('s.submission_id')
->from('submissions AS s')
->whereColumn('s.submission_id', 'ra.submission_id')
->whereColumn('s.stage_id', 'ra.stage_id')
)
);

$q->when(
$this->isActive,
fn (Builder $q) => $q
->where('ra.declined', '<>', 1)
->where('ra.cancelled', '<>', 1)
->whereIn(
'ra.submission_id',
fn (Builder $q) => $q
->select('s.submission_id')
->from('submissions AS s')
->whereColumn('s.submission_id', 'ra.submission_id')
->where('s.status', '<>', PKPSubmission::STATUS_PUBLISHED)
)
);

$q->when(
$this->isDeclined,
fn (Builder $q) => $q->where('ra.declined', 1)
);

$q->when(
$this->isPublished || $this->isCompleted,
fn (Builder $q) => $q
->whereNotNull('ra.date_completed')
->whereIn(
'ra.submission_id',
fn (Builder $q) => $q
->select('s.submission_id')
->from('submissions AS s')
->whereColumn('s.submission_id', 'ra.submission_id')
->when(
$this->isPublished,
fn (Builder $q) => $q
->where('s.status', PKPSubmission::STATUS_PUBLISHED)
)
->when(
$this->isCompleted,
fn (Builder $q) => $q
// Don't include published submissions
->where('s.status', '<>', PKPSubmission::STATUS_PUBLISHED)
// If the submission is returned to the submission stage, exclude it
->where('s.stage_id', '<>', WORKFLOW_STAGE_ID_SUBMISSION)
)
)
);

$q->when(
$this->isArchived,
fn (Builder $q) =>
$q->where(
fn (Builder $q) => $q->where(
fn (Builder $q) => $q
->whereNotNull('ra.date_completed')
->orWhere('declined', 1)
->whereNull('ra.date_completed')
->whereIn(
'ra.submission_id',
fn (Builder $q) => $q
->select('s.submission_id')
->from('submissions AS s')
->whereColumn('s.submission_id', 'ra.submission_id')
->whereIn('s.stage_id', [WORKFLOW_STAGE_ID_EDITING, WORKFLOW_STAGE_ID_PRODUCTION])
)
)
);

Expand Down
15 changes: 12 additions & 3 deletions locale/en/submission.po
Original file line number Diff line number Diff line change
Expand Up @@ -2458,11 +2458,20 @@ msgstr "Completed / Declined"
msgid "submission.dashboard.view.reviewAssignments.all"
msgstr "All assignments"

msgid "submission.dashboard.view.reviewAssignments.pending"
msgstr "Pending"
msgid "submission.dashboard.view.reviewAssignments.actionRequired"
msgstr "Action Required by me"

msgid "submission.dashboard.view.reviewAssignments.archived"
msgstr "Completed / Declined"
msgstr "Archived"

msgid "submission.dashboard.view.reviewAssignments.declined"
msgstr "Declined"

msgid "submission.dashboard.view.reviewAssignments.completed"
msgstr "Completed"

msgid "submission.dashboard.view.reviewAssignments.published"
msgstr "Published"

msgid "submission.stage.externalReviewWithRound"
msgstr "Review (Round {$round})"
Expand Down

0 comments on commit 00df6c8

Please sign in to comment.