diff --git a/api/v1/contexts/index.php b/api/v1/contexts/index.php
index 59a41fb2796..cdd46f71f7e 100644
--- a/api/v1/contexts/index.php
+++ b/api/v1/contexts/index.php
@@ -15,4 +15,12 @@
* @brief Handle API requests for contexts (journals/presses).
*/
+$urlParts = explode('/', trim($_SERVER['PATH_INFO'], '/'));
+
+if (in_array('recommendations', $urlParts)) {
+ return new \PKP\handler\APIHandler(
+ new \PKP\API\v1\reviewers\recommendations\ReviewerRecommendationController()
+ );
+}
+
return new \PKP\handler\APIHandler(new \PKP\API\v1\contexts\PKPContextController());
diff --git a/classes/migration/install/ReviewerRecommendationsMigration.php b/classes/migration/install/ReviewerRecommendationsMigration.php
new file mode 100644
index 00000000000..989a834b16a
--- /dev/null
+++ b/classes/migration/install/ReviewerRecommendationsMigration.php
@@ -0,0 +1,42 @@
+
+
diff --git a/dbscripts/xml/upgrade.xml b/dbscripts/xml/upgrade.xml
index ac0540c3f13..bb40109cfb0 100644
--- a/dbscripts/xml/upgrade.xml
+++ b/dbscripts/xml/upgrade.xml
@@ -160,6 +160,7 @@
+
diff --git a/lib/pkp b/lib/pkp
index c1af6388c45..0eaf2fb7200 160000
--- a/lib/pkp
+++ b/lib/pkp
@@ -1 +1 @@
-Subproject commit c1af6388c45e9f4f0c3391fa437a75b5e983f2bb
+Subproject commit 0eaf2fb7200d17a5713ba75b2464974c8461233a
diff --git a/lib/ui-library b/lib/ui-library
index 63c6795eda5..9a47b499b51 160000
--- a/lib/ui-library
+++ b/lib/ui-library
@@ -1 +1 @@
-Subproject commit 63c6795eda58e49eb3f258babd0891b5a611fa67
+Subproject commit 9a47b499b51efe6711365af57660e81a99c41147
diff --git a/pages/management/SettingsHandler.php b/pages/management/SettingsHandler.php
index 7e2308d24ea..5abe4815de1 100644
--- a/pages/management/SettingsHandler.php
+++ b/pages/management/SettingsHandler.php
@@ -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;
@@ -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
{
@@ -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::withContextId($context->getId())->get();
+
+ $reviewerRecommendationsListPanel = new ReviewerRecommendationsListPanel(
+ __('manager.reviewerRecommendations'),
+ $context,
+ $this->getSupportedFormLocales($context),
+ array_values(
+ ReviewerRecommendationResource::collection($recommendations)
+ ->toArray(app()->get('request'))
+ ),
+ ReviewerRecommendation::withContextId($context->getId())->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
*
diff --git a/plugins/reports/reviewReport b/plugins/reports/reviewReport
index 613059b9792..0145b76d4ba 160000
--- a/plugins/reports/reviewReport
+++ b/plugins/reports/reviewReport
@@ -1 +1 @@
-Subproject commit 613059b97921cf6ade3a485b560bdcc6f1b1ca0d
+Subproject commit 0145b76d4ba0596dcb13186a84bb769243687434
diff --git a/registry/uiLocaleKeysBackend.json b/registry/uiLocaleKeysBackend.json
index 7d7a74391c0..4fe3ecf6745 100644
--- a/registry/uiLocaleKeysBackend.json
+++ b/registry/uiLocaleKeysBackend.json
@@ -402,14 +402,9 @@
"publication.version",
"publication.version.all",
"publication.version.confirm",
- "reviewer.article.decision.accept",
- "reviewer.article.decision.decline",
- "reviewer.article.decision.pendingRevisions",
- "reviewer.article.decision.resubmitElsewhere",
- "reviewer.article.decision.resubmitHere",
- "reviewer.article.decision.seeComments",
"reviewer.article.recommendation",
"reviewer.competingInterests",
+ "reviewer.recommendation.management.options",
"reviewer.submission.acceptedOn",
"reviewer.submission.responseDueDate",
"reviewer.submission.reviewDueDate",
@@ -494,7 +489,6 @@
"submission.list.revisionsSubmitted",
"submission.production",
"submission.publication",
- "submission.recommendation",
"submission.review",
"submission.stage.externalReviewWithRound",
"submission.stage.internalReviewWithRound",
diff --git a/templates/reviewer/review/reviewerRecommendations.tpl b/templates/reviewer/review/reviewerRecommendations.tpl
index aeff37ed12e..7ae44298a13 100644
--- a/templates/reviewer/review/reviewerRecommendations.tpl
+++ b/templates/reviewer/review/reviewerRecommendations.tpl
@@ -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}