Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

pkp/pkp-lib#1660 Customizable Reviewer Recommendations #4505

Open
wants to merge 14 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions api/v1/contexts/index.php
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
<?php

/**
* @defgroup api_v1_contexts Context API requests
*/
Expand Down
15 changes: 15 additions & 0 deletions api/v1/reviewers/index.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<?php

/**
* @file api/v1/reviewers/index.php
*
* Copyright (c) 2025 Simon Fraser University
* Copyright (c) 2025 John Willinsky
* Distributed under the GNU GPL v3. For full terms see the file docs/COPYING.
*
* @brief Handle API requests context's reviewers recommendations
*/

return new \PKP\handler\APIHandler(
new \PKP\API\v1\reviewers\recommendations\ReviewerRecommendationController()
);
6 changes: 6 additions & 0 deletions classes/facades/Repo.php
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
use PKP\facades\Repo as BaseRepo;
use PKP\galley\Repository as GalleyRepository;
use PKP\submission\reviewAssignment\Repository as ReviewAssignmentRepository;
use PKP\submission\reviewer\recommendation\Repository as ReviewerRecommendationRepository;

class Repo extends BaseRepo
{
Expand Down Expand Up @@ -83,4 +84,9 @@ public static function reviewAssignment(): ReviewAssignmentRepository
{
return app(ReviewAssignmentRepository::class);
}

public static function reviewerRecommendation(): ReviewerRecommendationRepository
{
return app(ReviewerRecommendationRepository::class);
}
}
42 changes: 42 additions & 0 deletions classes/migration/install/ReviewerRecommendationsMigration.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
<?php

/**
* @file classes/migration/install/ReviewerRecommendationsMigration.php
*
* Copyright (c) 2024 Simon Fraser University
* Copyright (c) 2024 John Willinsky
* Distributed under the GNU GPL v3. For full terms see the file docs/COPYING.
*
* @class ReviewerRecommendationsMigration
*
* @brief Describe database table structures .
*/

namespace APP\migration\install;

class ReviewerRecommendationsMigration extends \PKP\migration\install\ReviewerRecommendationsMigration
{
/**
* @copydoc \PKP\migration\install\ReviewerRecommendationsMigratio::contextTable()
*/
public function contextTable(): string
{
return 'journals';
}

/**
* @copydoc \PKP\migration\install\ReviewerRecommendationsMigratio::settingTable()
*/
public function settingTable(): string
{
return 'journal_settings';
}

/**
* @copydoc \PKP\migration\install\ReviewerRecommendationsMigratio::contextPrimaryKey()
*/
public function contextPrimaryKey(): string
{
return 'journal_id';
}
}
29 changes: 29 additions & 0 deletions classes/migration/upgrade/v3_6_0/I1660_ReviewerRecommendations.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
<?php

/**
* @file classes/migration/upgrade/v3_6_0/I1660_ReviewerRecommendations.php
*
* Copyright (c) 2024 Simon Fraser University
* Copyright (c) 2024 John Willinsky
* Distributed under the GNU GPL v3. For full terms see the file docs/COPYING.
*
* @class I1660_ReviewerRecommendations.php
*
* @brief Upgrade migration add recommendations
*
*/

namespace APP\migration\upgrade\v3_6_0;

use APP\facades\Repo;

class I1660_ReviewerRecommendations extends \PKP\migration\upgrade\v3_6_0\I1660_ReviewerRecommendations
{
/**
* @copydoc \PKP\migration\upgrade\v3_6_0\I1660_ReviewerRecommendations::systemDefineNonRemovableRecommendations()
*/
protected function systemDefineNonRemovableRecommendations(): array
{
return Repo::reviewerRecommendation()->getDefaultRecommendations();
}
}
29 changes: 22 additions & 7 deletions classes/services/ContextService.php
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
<?php

/**
* @file classes/services/ContextService.php
*
* Copyright (c) 2014-2021 Simon Fraser University
* Copyright (c) 2000-2021 John Willinsky
* Copyright (c) 2014-2025 Simon Fraser University
* Copyright (c) 2000-2025 John Willinsky
* Distributed under the GNU GPL v3. For full terms see the file docs/COPYING.
*
* @class ContextService
Expand All @@ -28,6 +29,7 @@
use PKP\file\TemporaryFileManager;
use PKP\plugins\Hook;
use PKP\submission\GenreDAO;
use PKP\submission\reviewer\recommendation\ReviewerRecommendation;

class ContextService extends \PKP\services\PKPContextService
{
Expand Down Expand Up @@ -65,7 +67,9 @@ public function __construct()
*/
public function afterAddContext($hookName, $args)
{
$context = $args[0];
$context = $args[0]; /** @var \PKP\context\Context $context */

Repo::reviewerRecommendation()->addDefaultRecommendations($context);

// Create a default section
$section = Repo::section()->newDataObject();
Expand Down Expand Up @@ -94,8 +98,8 @@ public function afterAddContext($hookName, $args)
*/
public function afterEditContext($hookName, $args)
{
$newContext = $args[0];
$currentContext = $args[1];
$newContext = $args[0]; /** @var \PKP\context\Context $context */
$currentContext = $args[1]; /** @var \PKP\context\Context $context */
$params = $args[2];
$request = $args[3];

Expand Down Expand Up @@ -146,7 +150,7 @@ public function afterEditContext($hookName, $args)
*/
public function beforeDeleteContext($hookName, $args)
{
$context = $args[0];
$context = $args[0]; /** @var \PKP\context\Context $context */

// Create tombstones for all published submissions
$articleTombstoneManager = new ArticleTombstoneManager();
Expand All @@ -168,11 +172,14 @@ public function beforeDeleteContext($hookName, $args)
*/
public function afterDeleteContext($hookName, $args)
{
$context = $args[0];
$context = $args[0]; /** @var \PKP\context\Context $context */

Repo::section()->deleteByContextId($context->getId());

Repo::issue()->deleteByContextId($context->getId());

ReviewerRecommendation::query()->withContextId($context->getId())->delete();

/** @var IndividualSubscriptionDAO */
$subscriptionDao = DAORegistry::getDAO('IndividualSubscriptionDAO');
$subscriptionDao->deleteByJournalId($context->getId());
Expand Down Expand Up @@ -228,4 +235,12 @@ public function validateContext($hookName, $args)
}
}
}

/**
* @copydoc \PKP\services\PKPContextService::hasCustomizableReviewerRecommendation()
*/
public function hasCustomizableReviewerRecommendation(): bool
{
return true;
}
}
1 change: 1 addition & 0 deletions dbscripts/xml/install.xml
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@

<migration class="APP\migration\install\OJSMigration" />

<migration class="APP\migration\install\ReviewerRecommendationsMigration" />
<migration class="PKP\migration\install\MetadataMigration" />
<migration class="PKP\migration\install\AnnouncementsMigration" />
<migration class="PKP\migration\install\CategoriesMigration" />
Expand Down
1 change: 1 addition & 0 deletions dbscripts/xml/upgrade.xml
Original file line number Diff line number Diff line change
Expand Up @@ -167,6 +167,7 @@
<migration class="APP\migration\upgrade\v3_5_0\I4787_AddReviewSuggestionHelp"/>
<migration class="PKP\migration\upgrade\v3_5_0\I4787_InstallReviewerSuggestion"/>
<note file="docs/release-notes/README-3.5.0" />
<migration class="APP\migration\upgrade\v3_6_0\I1660_ReviewerRecommendations"/>
</upgrade>

<!-- update plugin configuration - should be done as the final upgrade task -->
Expand Down
2 changes: 1 addition & 1 deletion lib/pkp
Submodule pkp updated 28 files
+218 −0 api/v1/reviewers/recommendations/ReviewerRecommendationController.php
+84 −0 api/v1/reviewers/recommendations/formRequests/AddReviewerRecommendation.php
+38 −0 api/v1/reviewers/recommendations/formRequests/EditReviewerRecommendation.php
+33 −0 api/v1/reviewers/recommendations/formRequests/UpdateStatusReviewerRecommendation.php
+37 −0 api/v1/reviewers/recommendations/resources/ReviewerRecommendationResource.php
+61 −0 classes/components/forms/context/ReviewerRecommendationForm.php
+126 −0 classes/components/listPanels/ReviewerRecommendationsListPanel.php
+5 −2 classes/controllers/grid/users/reviewer/PKPReviewerGridHandler.php
+1 −1 classes/core/PKPApplication.php
+1 −1 classes/mail/variables/ReviewAssignmentEmailVariable.php
+103 −0 classes/migration/install/ReviewerRecommendationsMigration.php
+136 −0 classes/migration/upgrade/v3_6_0/I1660_ReviewerRecommendations.php
+10 −3 classes/services/PKPContextService.php
+16 −0 classes/submission/reviewAssignment/Collector.php
+47 −33 classes/submission/reviewAssignment/ReviewAssignment.php
+5 −5 classes/submission/reviewer/form/PKPReviewerReviewStep3Form.php
+119 −0 classes/submission/reviewer/recommendation/Repository.php
+197 −0 classes/submission/reviewer/recommendation/ReviewerRecommendation.php
+1 −1 classes/userGroup/Repository.php
+1 −1 controllers/grid/admin/languages/AdminLanguageGridHandler.php
+21 −3 controllers/grid/languages/LanguageGridHandler.php
+2 −2 controllers/grid/users/reviewer/AuthorReviewerGridHandler.php
+3 −0 locale/en/api.po
+3 −0 locale/en/grid.po
+36 −0 locale/en/manager.po
+1 −8 pages/dashboard/PKPDashboardHandlerNext.php
+1 −0 pages/management/ManagementHandler.php
+8 −0 templates/management/workflow.tpl
12 changes: 12 additions & 0 deletions pages/dashboard/DashboardHandlerNext.php
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
<?php

/**
* @file pages/dashboard/DashboardHandlerNext.php
*
Expand All @@ -21,6 +22,7 @@
use APP\facades\Repo;
use APP\template\TemplateManager;
use PKP\pages\dashboard\PKPDashboardHandlerNext;
use PKP\submission\reviewer\recommendation\ReviewerRecommendation;

class_exists(\APP\components\forms\publication\AssignToIssueForm::class); // Force define of FORM_ASSIGN_TO_ISSUE

Expand Down Expand Up @@ -49,6 +51,16 @@ public function setupIndex($request)
$templateMgr->setConstants([
'FORM_ASSIGN_TO_ISSUE' => FORM_ASSIGN_TO_ISSUE
]);

$pageInitConfig = $templateMgr->getState('pageInitConfig');
$pageInitConfig['recommendations'] = ReviewerRecommendation::query()
->withContextId($context->getId())
->get()
->select(['recommendationId', 'status', 'value', 'title'])
->values()
->toArray();

$templateMgr->setState(['pageInitConfig' => $pageInitConfig]);
}


Expand Down
33 changes: 33 additions & 0 deletions pages/management/SettingsHandler.php
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
use APP\components\forms\context\AccessForm;
use APP\components\forms\context\ArchivingLockssForm;
use APP\template\TemplateManager;
use PKP\API\v1\reviewers\recommendations\resources\ReviewerRecommendationResource;
use PKP\components\forms\context\PKPContextStatisticsForm;
use PKP\components\forms\context\PKPDisableSubmissionsForm;
use PKP\components\forms\context\PKPDoiRegistrationSettingsForm;
Expand All @@ -29,11 +30,14 @@
use PKP\components\forms\context\PKPReviewGuidanceForm;
use PKP\components\forms\context\PKPReviewSetupForm;
use PKP\components\forms\context\PKPSearchIndexingForm;
use PKP\components\listPanels\ReviewerRecommendationsListPanel;
use PKP\core\PKPApplication;
use PKP\core\PKPRequest;
use PKP\pages\management\ManagementHandler;
use PKP\plugins\Hook;
use PKP\plugins\PluginRegistry;
use PKP\security\Role;
use PKP\submission\reviewer\recommendation\ReviewerRecommendation;

class SettingsHandler extends ManagementHandler
{
Expand Down Expand Up @@ -77,6 +81,35 @@ public function workflow($args, $request)
$templateMgr->display('management/workflow.tpl');
}

/**
* Add support for review related forms in workflow.
*/
protected function addReviewFormWorkflowSupport(PKPRequest $request): void
{
parent::addReviewFormWorkflowSupport($request);

$templateManager = TemplateManager::getManager($request);
$components = $templateManager->getState('components');

$context = $request->getContext();
$recommendations = ReviewerRecommendation::query()->withContextId($context->getId())->get();

$reviewerRecommendationsListPanel = new ReviewerRecommendationsListPanel(
__('manager.reviewerRecommendations'),
$context,
$this->getSupportedFormLocales($context),
array_values(
ReviewerRecommendationResource::collection($recommendations)
->toArray(app()->get('request'))
),
$recommendations->count()
);

$components[$reviewerRecommendationsListPanel->id] = $reviewerRecommendationsListPanel->getConfig();
$templateManager->setState(['components' => $components]);
$templateManager->assign('hasCustomizableRecommendation', true);
}

/**
* Add the archive and payments tabs to the distribution settings page
*
Expand Down
2 changes: 1 addition & 1 deletion plugins/reports/reviewReport
20 changes: 16 additions & 4 deletions templates/reviewer/review/reviewerRecommendations.tpl
Original file line number Diff line number Diff line change
@@ -1,13 +1,25 @@
{**
* templates/reviewer/review/reviewerRecommendations.tpl
*
* Copyright (c) 2014-2021 Simon Fraser University
* Copyright (c) 2003-2021 John Willinsky
* Copyright (c) 2014-2024 Simon Fraser University
* Copyright (c) 2003-2024 John Willinsky
* Distributed under the GNU GPL v3. For full terms see the file docs/COPYING.
*
* Include reviewer recommendations for OJS review assignment responses.
*}

{fbvFormSection label="reviewer.article.recommendation" description=$description|default:"reviewer.article.selectRecommendation"}
{fbvElement type="select" id="recommendation" from=$reviewerRecommendationOptions selected=$reviewAssignment->getRecommendation() size=$fbvStyles.size.MEDIUM required=$required|default:true disabled=$readOnly}
{fbvFormSection
label="reviewer.article.recommendation"
description=$description|default:"reviewer.article.selectRecommendation"
}
{fbvElement
type="select"
id="recommendation"
from=$reviewerRecommendationOptions
selected=$reviewAssignment->getRecommendation()
size=$fbvStyles.size.MEDIUM
required=$required|default:true
disabled=$readOnly
translate=false
}
{/fbvFormSection}
Loading