229 lines
8.7 KiB
PHP
229 lines
8.7 KiB
PHP
<?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;
|
|
}
|
|
}
|