<?php
/**
* @file pages/reviewer/PKPReviewerHandler.php
*
* Copyright (c) 2014-2021 Simon Fraser University
* Copyright (c) 2003-2021 John Willinsky
* Distributed under the GNU GPL v3. For full terms see the file docs/COPYING.
*
* @class PKPReviewerHandler
*
* @ingroup pages_reviewer
*
* @brief Handle requests for reviewer functions.
*/
namespace PKP\pages\reviewer;
use APP\facades\Repo;
use APP\handler\Handler;
use APP\notification\NotificationManager;
use APP\submission\Submission;
use APP\template\TemplateManager;
use Exception;
use Illuminate\Support\Facades\Mail;
use PKP\core\JSONMessage;
use PKP\core\PKPApplication;
use PKP\core\PKPRequest;
use PKP\facades\Locale;
use PKP\notification\PKPNotification;
use PKP\submission\reviewAssignment\ReviewAssignment;
use PKP\submission\reviewer\form\PKPReviewerReviewStep3Form;
use PKP\submission\reviewer\form\ReviewerReviewForm;
use PKP\submission\reviewer\ReviewerAction;
class PKPReviewerHandler extends Handler
{
/** @copydoc PKPHandler::_isBackendPage */
public $_isBackendPage = true;
/**
* Display the submission review page.
*/
public function submission(array $args, PKPRequest $request): void
{
$reviewAssignment = $this->getAuthorizedContextObject(PKPApplication::ASSOC_TYPE_REVIEW_ASSIGNMENT); /** @var ReviewAssignment $reviewAssignment */
$reviewSubmission = Repo::submission()->get($reviewAssignment->getSubmissionId());
$this->setupTemplate($request);
$templateMgr = TemplateManager::getManager($request);
$reviewStep = max($reviewAssignment->getStep(), 1);
$userStep = (int) $request->getUserVar('step');
$step = (int) (!empty($userStep) ? $userStep : $reviewStep);
if ($step > $reviewStep) {
$step = $reviewStep;
} // Reviewer can't go past incomplete steps
if ($step < 1 || $step > 4) {
throw new Exception('Invalid step!');
}
$templateMgr->assign([
'pageTitle' => __('semicolon', ['label' => __('submission.review')]) . $reviewSubmission->getLocalizedTitle(),
'reviewStep' => $reviewStep,
'selected' => $step - 1,
'submission' => $reviewSubmission,
]);
$templateMgr->display('reviewer/review/reviewStepHeader.tpl');
}
/**
* Display a step tab contents in the submission review page.
*/
public function step(array $args, PKPRequest $request): JSONMessage
{
$reviewAssignment = $this->getAuthorizedContextObject(PKPApplication::ASSOC_TYPE_REVIEW_ASSIGNMENT); /** @var ReviewAssignment $reviewAssignment */
$reviewId = $reviewAssignment->getId();
assert(!empty($reviewId));
$reviewSubmission = Repo::submission()->get($reviewAssignment->getSubmissionId());
$this->setupTemplate($request);
$reviewStep = max($reviewAssignment->getStep(), 1); // Get the current saved step from the DB
$userStep = (int) $request->getUserVar('step');
$step = (int) (!empty($userStep) ? $userStep : $reviewStep);
if ($step > $reviewStep) {
$step = $reviewStep;
} // Reviewer can't go past incomplete steps
if ($step < 1 || $step > 4) {
fatalError('Invalid step!');
}
if ($step < 4) {
$reviewerForm = $this->getReviewForm($step, $request, $reviewSubmission, $reviewAssignment);
$reviewerForm->initData();
return new JSONMessage(true, $reviewerForm->fetch($request));
} else {
$templateMgr = TemplateManager::getManager($request);
$templateMgr->assign([
'submission' => $reviewSubmission,
'step' => 4,
'reviewAssignment' => $reviewAssignment,
]);
return $templateMgr->fetchJson('reviewer/review/reviewCompleted.tpl');
}
}
/**
* Save a review step.
*/
public function saveStep(array $args, PKPRequest $request): JSONMessage
{
$step = (int)$request->getUserVar('step');
if ($step < 1 || $step > 3) {
fatalError('Invalid step!');
}
$reviewAssignment = $this->getAuthorizedContextObject(PKPApplication::ASSOC_TYPE_REVIEW_ASSIGNMENT); /** @var ReviewAssignment $reviewAssignment */
if ($reviewAssignment->getDateCompleted()) {
fatalError('Review already completed!');
}
$reviewSubmission = Repo::submission()->get($reviewAssignment->getSubmissionId());
$reviewerForm = $this->getReviewForm($step, $request, $reviewSubmission, $reviewAssignment);
$reviewerForm->readInputData();
// Save the available form data, but do not submit
if ($request->getUserVar('isSave')) {
/** @var PKPReviewerReviewStep3Form $reviewerForm */
$reviewerForm->saveForLater();
$notificationMgr = new NotificationManager();
$user = $request->getUser();
$notificationMgr->createTrivialNotification($user->getId(), PKPNotification::NOTIFICATION_TYPE_SUCCESS, ['contents' => __('common.changesSaved')]);
return \PKP\db\DAO::getDataChangedEvent();
}
// Submit the form data and move forward
else {
if ($reviewerForm->validate()) {
$reviewerForm->execute();
$json = new JSONMessage(true);
$json->setEvent('setStep', $step + 1);
return $json;
} else {
$this->setupTemplate($request);
return new JSONMessage(true, $reviewerForm->fetch($request));
}
}
}
/**
* Show a form for the reviewer to enter regrets into.
*/
public function showDeclineReview(array $args, PKPRequest $request): JSONMessage
{
$reviewAssignment = $this->getAuthorizedContextObject(PKPApplication::ASSOC_TYPE_REVIEW_ASSIGNMENT); /** @var ReviewAssignment $reviewAssignment */
$reviewSubmission = Repo::submission()->get($reviewAssignment->getSubmissionId());
$this->setupTemplate($request);
$templateMgr = TemplateManager::getManager($request);
$templateMgr->assign('submissionId', $reviewSubmission->getId());
// Provide the email body to the template
$reviewerAction = new ReviewerAction();
$mailable = $reviewerAction->getResponseEmail($reviewSubmission, $reviewAssignment, true, null);
$messageBody = Mail::compileParams($mailable->view, $mailable->getData(Locale::getLocale()));
$templateMgr->assign('declineMessageBody', $messageBody);
return $templateMgr->fetchJson('reviewer/review/modal/regretMessage.tpl');
}
/**
* Save the reviewer regrets form and decline the review.
*/
public function saveDeclineReview(array $args, PKPRequest $request): JSONMessage
{
$reviewAssignment = $this->getAuthorizedContextObject(PKPApplication::ASSOC_TYPE_REVIEW_ASSIGNMENT); /** @var ReviewAssignment $reviewAssignment */
if ($reviewAssignment->getDateCompleted()) {
fatalError('Review already completed!');
}
$declineReviewMessage = $request->getUserVar('declineReviewMessage');
// Decline the review
$reviewerAction = new ReviewerAction();
$submission = $this->getAuthorizedContextObject(PKPApplication::ASSOC_TYPE_SUBMISSION);
$reviewerAction->confirmReview($request, $reviewAssignment, $submission, 1, $declineReviewMessage);
$dispatcher = $request->getDispatcher();
return $request->redirectUrlJson($dispatcher->url($request, PKPApplication::ROUTE_PAGE, null, 'index'));
}
/**
* Get a review form for the current step.
*/
public function getReviewForm(
int $step, // current step
PKPRequest $request,
Submission $reviewSubmission,
ReviewAssignment $reviewAssignment
): ReviewerReviewForm {
switch ($step) {
case 1:
return new \PKP\submission\reviewer\form\PKPReviewerReviewStep1Form($request, $reviewSubmission, $reviewAssignment);
case 2:
return new \PKP\submission\reviewer\form\PKPReviewerReviewStep2Form($request, $reviewSubmission, $reviewAssignment);
case 3:
return new \PKP\submission\reviewer\form\PKPReviewerReviewStep3Form($request, $reviewSubmission, $reviewAssignment);
default:
return null;
}
}
//
// Private helper methods
//
public function _retrieveStep(): int
{
$reviewAssignment = $this->getAuthorizedContextObject(PKPApplication::ASSOC_TYPE_REVIEW_ASSIGNMENT); /** @var ReviewAssignment $reviewAssignment */
$reviewId = (int) $reviewAssignment->getId();
assert(!empty($reviewId));
return $reviewId;
}
}
|