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#4787 Reviewer suggestions #1835

Open
wants to merge 7 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
2 changes: 2 additions & 0 deletions api/v1/submissions/index.php
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@

if (strpos($requestPath, '/files')) {
return new \PKP\handler\APIHandler(new \PKP\API\v1\submissions\PKPSubmissionFileController());
} elseif (strpos($requestPath, '/suggestions')) {
return new \PKP\handler\APIHandler(new PKP\API\v1\reviewers\suggestions\ReviewerSuggestionController());
} else {
return new \PKP\handler\APIHandler(new \APP\API\v1\submissions\SubmissionController());
}
23 changes: 23 additions & 0 deletions classes/migration/upgrade/v3_6_0/I4787_AddReviewSuggestionHelp.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<?php

/**
* @file classes/migration/upgrade/v3_6_0/I4787_AddReviewSuggestionHelp.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.
*
* @class I4787_AddReviewSuggestionHelp.php
*
* @brief Add reviewer suggestion related default help text
*
*/

namespace APP\migration\upgrade\v3_6_0;

class I4787_AddReviewSuggestionHelp extends \PKP\migration\upgrade\v3_6_0\I4787_AddReviewSuggestionHelp
{
protected string $CONTEXT_TABLE = 'presses';
protected string $CONTEXT_SETTINGS_TABLE = 'press_settings';
protected string $CONTEXT_COLUMN = 'press_id';
}
1 change: 1 addition & 0 deletions dbscripts/xml/install.xml
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
<migration class="PKP\migration\install\ReviewFormsMigration" />
<migration class="PKP\migration\install\LibraryFilesMigration" />
<migration class="PKP\migration\install\ReviewsMigration" />
<migration class="PKP\migration\install\ReviewerSuggestionsMigration" />
<migration class="PKP\migration\install\TemporaryFilesMigration" />
<migration class="PKP\migration\install\TombstoneMigration" />
<migration class="PKP\migration\install\DoiMigration" />
Expand Down
4 changes: 4 additions & 0 deletions dbscripts/xml/upgrade.xml
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,10 @@
<migration class="PKP\migration\upgrade\v3_5_0\I10759_AddReviewAssignmentSettings"/>
<migration class="PKP\migration\upgrade\v3_5_0\I10819_OrcidOauthScopeMail"/>
<note file="docs/release-notes/README-3.5.0" />

<!-- Need to be moved to new block once 3.5 branch created -->
<migration class="APP\migration\upgrade\v3_6_0\I4787_AddReviewSuggestionHelp"/>
<migration class="PKP\migration\upgrade\v3_6_0\I4787_InstallReviewerSuggestion"/>
</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 94 files
+207 −0 api/v1/reviewers/suggestions/ReviewerSuggestionController.php
+112 −0 api/v1/reviewers/suggestions/formRequests/AddReviewerSuggestion.php
+72 −0 api/v1/reviewers/suggestions/formRequests/EditReviewerSuggestion.php
+53 −0 api/v1/reviewers/suggestions/resources/ReviewerSuggestionResource.php
+31 −1 classes/components/forms/context/PKPReviewSetupForm.php
+82 −0 classes/components/forms/submission/ReviewerSuggestionsForm.php
+25 −1 classes/components/forms/submission/SubmissionGuidanceSettings.php
+43 −0 classes/components/listPanels/PKPSelectReviewerListPanel.php
+117 −0 classes/components/listPanels/ReviewerSuggestionsListPanel.php
+50 −22 classes/controllers/grid/users/reviewer/PKPReviewerGridHandler.php
+11 −6 classes/core/PKPBaseController.php
+10 −4 classes/core/PKPContainer.php
+251 −0 classes/core/ValidationServiceProvider.php
+113 −0 classes/migration/install/ReviewerSuggestionsMigration.php
+31 −0 classes/migration/upgrade/v3_6_0/I4787_AddReviewSuggestionHelp.php
+36 −0 classes/migration/upgrade/v3_6_0/I4787_InstallReviewerSuggestion.php
+1 −1 classes/publication/Repository.php
+68 −0 classes/security/authorization/internal/SubmissionIncompletePolicy.php
+82 −4 classes/submission/maps/Schema.php
+306 −0 classes/submission/reviewer/suggestion/ReviewerSuggestion.php
+109 −0 classes/validation/MultilingualInput.php
+14 −107 classes/validation/ValidatorFactory.php
+92 −0 classes/validation/traits/HasMultilingualRule.php
+5 −0 composer.json
+5 −1 controllers/grid/settings/sections/form/PKPSectionForm.php
+31 −10 controllers/grid/users/reviewer/form/AdvancedSearchReviewerForm.php
+33 −15 controllers/grid/users/reviewer/form/CreateReviewerForm.php
+25 −7 controllers/grid/users/reviewer/form/EnrollExistingReviewerForm.php
+36 −11 controllers/grid/users/reviewer/form/ReviewerForm.php
+75 −50 js/controllers/grid/users/reviewer/AdvancedReviewerSearchHandler.js
+3 −0 locale/ar/submission.po
+3 −0 locale/az/submission.po
+3 −0 locale/bg/submission.po
+3 −0 locale/bs_Latn/submission.po
+3 −0 locale/ca/submission.po
+3 −0 locale/ckb/submission.po
+3 −0 locale/cs/submission.po
+3 −0 locale/da/submission.po
+3 −0 locale/de/submission.po
+3 −0 locale/el/submission.po
+3 −0 locale/en/api.po
+3 −0 locale/en/common.po
+3 −0 locale/en/editor.po
+11 −0 locale/en/grid.po
+3 −0 locale/en/manager.po
+40 −9 locale/en/submission.po
+3 −0 locale/en/user.po
+3 −0 locale/es/submission.po
+3 −0 locale/eu/submission.po
+3 −0 locale/fa/submission.po
+3 −0 locale/fi/submission.po
+3 −0 locale/fr/submission.po
+3 −0 locale/fr_CA/submission.po
+3 −0 locale/gd/submission.po
+3 −0 locale/gl/submission.po
+3 −0 locale/hr/submission.po
+3 −0 locale/hu/submission.po
+3 −0 locale/hy/submission.po
+3 −0 locale/id/submission.po
+3 −0 locale/is/submission.po
+3 −0 locale/it/submission.po
+3 −0 locale/ja/submission.po
+3 −0 locale/ka/submission.po
+3 −0 locale/kk/submission.po
+3 −0 locale/lv/submission.po
+3 −0 locale/mk/submission.po
+3 −0 locale/ms/submission.po
+3 −0 locale/nb_NO/submission.po
+3 −0 locale/nl/submission.po
+3 −0 locale/pl/submission.po
+3 −0 locale/pt/submission.po
+3 −0 locale/pt_BR/submission.po
+3 −0 locale/ro/submission.po
+3 −0 locale/ru/submission.po
+3 −0 locale/sk/submission.po
+3 −0 locale/sl/submission.po
+3 −0 locale/sr_Cyrl/submission.po
+3 −0 locale/sr_Latn/submission.po
+3 −0 locale/sv/submission.po
+3 −0 locale/sw/submission.po
+3 −0 locale/th/submission.po
+3 −0 locale/tr/submission.po
+3 −0 locale/uk/submission.po
+3 −0 locale/vi/submission.po
+3 −0 locale/zh_Hans/submission.po
+3 −0 locale/zh_Hant/submission.po
+4 −0 pages/dashboard/PKPDashboardHandlerNext.php
+103 −13 pages/submission/PKPSubmissionHandler.php
+12 −3 templates/controllers/grid/users/reviewer/form/advancedSearchReviewerAssignmentForm.tpl
+30 −25 templates/controllers/grid/users/reviewer/form/advancedSearchReviewerForm.tpl
+4 −0 templates/controllers/grid/users/reviewer/form/createReviewerForm.tpl
+15 −1 templates/controllers/grid/users/reviewer/form/enrollExistingReviewerForm.tpl
+71 −0 templates/submission/review-reviewer-suggestions.tpl
+8 −0 templates/submission/wizard.tpl
2 changes: 1 addition & 1 deletion lib/ui-library
Submodule ui-library updated 36 files
+38 −38 .storybook/main.js
+1,110 −6,828 package-lock.json
+15 −13 package.json
+56 −31 public/globals.js
+9 −0 src/components/Container/SubmissionWizardPage.vue
+2 −1 src/components/Form/Form.vue
+9 −0 src/components/Form/fields/FieldText.stories.js
+6 −1 src/components/Form/fields/FieldText.vue
+26 −0 src/components/ListPanel/reviewerSuggestions/ReviewerSuggestionsEditModal.vue
+322 −0 src/components/ListPanel/reviewerSuggestions/ReviewerSuggestionsListPanel.vue
+109 −0 src/components/ListPanel/users/SelectReviewerListPanel.vue
+155 −0 src/components/ListPanel/users/SelectReviewerSuggestionListItem.vue
+4 −1 src/components/Table/TableColumn.vue
+6 −2 src/composables/useFiltersForm.js
+13 −1 src/composables/useForm.js
+9 −0 src/composables/useSubmission.js
+75 −0 src/managers/ReviewerSuggestionManager/ReviewerSuggestionManager.vue
+111 −0 src/managers/ReviewerSuggestionManager/reviewerSuggestionManagerStore.js
+54 −0 src/managers/ReviewerSuggestionManager/useReviewerSuggestionManagerActions.js
+169 −10 src/pages/dashboard/DashboardPage.stories.js
+7 −5 src/pages/dashboard/components/DashboardTable/CellReviewAssignmentActions.vue
+11 −6 src/pages/dashboard/components/DashboardTable/CellSubmissionActivity/CellSubmissionActivityReviewsOpen.vue
+9 −9 src/pages/dashboard/components/ReviewActivityIndicatorPopover/ReviewActivityIndicatorPopover.stories.js
+89 −32 src/pages/dashboard/composables/useEditorialLogic.js
+0 −0 src/pages/dashboard/mocks/pageInitConfigEditorial.js
+1,558 −0 src/pages/dashboard/mocks/pageInitConfigMySubmissions.js
+1,513 −0 src/pages/dashboard/mocks/pageInitConfigReviewAssignments.js
+53 −0 src/pages/dashboard/mocks/reviewAssignmentScenariosMock.js
+38 −5 src/pages/dashboard/mocks/reviewAssignmentsMock.js
+11 −2 src/pages/dashboard/mocks/submissionMock.js
+84 −109 src/pages/dashboard/mocks/submissionScenariosMock.js
+2 −0 src/pages/workflow/WorkflowPageOJS.vue
+2 −0 src/pages/workflow/WorkflowPageOMP.vue
+1 −0 src/pages/workflow/composables/useWorkflowConfig/useWorkflowConfigOJS.js
+1 −0 src/pages/workflow/composables/useWorkflowConfig/useWorkflowConfigOMP.js
+35 −2 src/pages/workflow/composables/useWorkflowConfig/workflowConfigEditorialOJS.js
9 changes: 9 additions & 0 deletions locale/en/default.po
Original file line number Diff line number Diff line change
Expand Up @@ -153,3 +153,12 @@ msgstr "External Reviewers"

msgid "default.groups.abbrev.externalReviewer"
msgstr "ER"

msgid "default.submission.step.reviewerSuggestions"
msgstr ""
"<p>When submitting your article, you have the option to suggest 2/3 potential "
"reviewers. This can help streamline the review process and provide valueable "
"input for the editorial team. Please choose reviewers who are expert in your "
"field and have no conflict of interest with your work. This feature aims to "
"enhance the review process and and support a more efficient experience for both "
"authors and presses.</p>"
9 changes: 9 additions & 0 deletions locale/en/manager.po
Original file line number Diff line number Diff line change
Expand Up @@ -769,6 +769,15 @@ msgstr "Reviewer Ratings"
msgid "manager.setup.reviewOptions.reviewerReminders"
msgstr "Reviewer Reminders"

msgid "manager.setup.reviewOptions.reviewerSuggestionEnabled"
msgstr "Reviewer Suggestion at Submission"

msgid "manager.setup.reviewOptions.reviewerSuggestionEnabled.description"
msgstr "Author can suggest few potential reviewers before completing the submission which can streamline the review process and provide valuable input for editorial team."

msgid "manager.setup.reviewOptions.reviewerSuggestionEnabled.label"
msgstr "Allow authors to suggest potential reviewers at submission process"

msgid "manager.setup.reviewPolicy"
msgstr "Review Policy"

Expand Down
37 changes: 35 additions & 2 deletions registry/uiLocaleKeysBackend.json
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
"catalog.manage.isNotFeatured",
"catalog.manage.isNotNewRelease",
"catalog.manage.seriesFeatured",
"common.add",
"common.addCCBCC",
"common.assign",
"common.attachFiles",
Expand Down Expand Up @@ -230,6 +231,7 @@
"editor.submission.removeStageParticipant",
"editor.submission.removeStageParticipant.description",
"editor.submission.review.currentFiles",
"editor.submission.reviewerSuggestions",
"editor.submission.revisions",
"editor.submission.schedulePublication",
"editor.submission.search",
Expand All @@ -244,6 +246,7 @@
"email.bcc",
"email.cc",
"email.confirmSwitchLocale",
"email.email",
"email.subject",
"email.to",
"fileManager.copyeditedFiles",
Expand All @@ -260,22 +263,29 @@
"form.errorGoTo",
"form.errorMany",
"form.errorOne",
"form.errors",
"form.errorSummaryOne",
"form.errorSummaryMany",
"form.errorSummaryOne",
"form.errors",
"form.multilingualLabel",
"form.multilingualProgress",
"form.saved",
"grid.action.addContributor",
"grid.action.addGalley",
"grid.action.addReviewerSuggestion",
"grid.action.delete",
"grid.action.deleteContributor",
"grid.action.deleteContributor.confirmationMessage",
"grid.action.deleteReviewerSuggestion",
"grid.action.deleteReviewerSuggestion.confirmationMessage",
"grid.action.disable",
"grid.action.edit",
"grid.action.editFile",
"grid.action.enable",
"grid.action.logInAs",
"grid.action.mergeUser",
"grid.action.moreInformation",
"grid.action.order",
"grid.action.remove",
"grid.action.saveOrdering",
"grid.action.sort",
"grid.catalogEntry.publicationDates",
Expand All @@ -284,6 +294,9 @@
"grid.libraryFiles.submission.title",
"grid.noItems",
"grid.user.confirmLogInAs",
"grid.user.currentUsers",
"grid.user.disable",
"grid.user.email",
"help.help",
"informationCenter.informationCenter",
"invitation.cancelInvite.actionName",
Expand Down Expand Up @@ -370,6 +383,7 @@
"manager.mailables.addTemplates",
"manager.mailables.editTemplate",
"manager.mailables.templates",
"manager.people.confirmRemove",
"manager.publication.productionStage",
"manager.publication.reviewStage",
"manager.publication.submissionStage",
Expand Down Expand Up @@ -540,6 +554,20 @@
"submissions.declined",
"submissions.incomplete",
"user.affiliation",
"user.affiliations",
"user.affiliations.deleteModal.message",
"user.affiliations.deleteModal.title",
"user.affiliations.description",
"user.affiliations.institution",
"user.affiliations.primaryLocaleRequired",
"user.affiliations.searchPhraseLabel",
"user.affiliations.translation",
"user.affiliations.translationActionsAriaLabel",
"user.affiliations.translationDeleteActionLabel",
"user.affiliations.translationEditActionLabel",
"user.affiliations.translationsAllAvailable",
"user.affiliations.translationsSomeAvailable",
"user.affiliations.typeTranslationNameInLanguageLabel",
"user.authorization.accessibleWorkflowStage",
"user.email",
"user.familyName",
Expand All @@ -551,7 +579,12 @@
"user.removeRole.message",
"user.role.reviewer",
"user.role.reviewers",
"user.roles",
"user.username",
"userAccess.management.options",
"userAccess.search",
"userAccess.tableHeader.name",
"userAccess.tableHeader.startDate",
"userInvitation.cancel.goBack",
"userInvitation.cancel.message",
"userInvitation.edit.message",
Expand Down
14 changes: 14 additions & 0 deletions schemas/context.json
Original file line number Diff line number Diff line change
Expand Up @@ -177,6 +177,20 @@
"type": "boolean",
"default": false,
"description": "Whether each publication version should receive a unique DOI"
},
"reviewerSuggestionEnabled": {
"type": "boolean",
"validation": [
"nullable"
]
},
"reviewerSuggestionsHelp": {
"type": "string",
"multilingual": true,
"validation": [
"nullable"
],
"defaultLocaleKey": "default.submission.step.reviewerSuggestions"
}
}
}
79 changes: 79 additions & 0 deletions schemas/submission.json
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,85 @@
"validation": [
"in:1,2"
]
},
"reviewerSuggestions": {
"type": "array",
"description": "Information about suggested reviewers at the time of submission.",
"readOnly": true,
"items": {
"type": "object",
"properties": {
"id": {
"type": "integer"
},
"familyName" : {
"type": "string",
"multilingual": true,
"apiSummary": true
},
"givenName": {
"type": "string",
"multilingual": true,
"apiSummary": true
},
"fullName": {
"type": "string",
"multilingual": true,
"apiSummary": true
},
"email": {
"type": "string",
"apiSummary": true
},
"orcidId": {
"type": "string",
"apiSummary": true,
"validation": [
"nullable"
]
},
"suggestionReason": {
"type": "string",
"multilingual": true,
"apiSummary": true
},
"affiliation" : {
"type": "string",
"multilingual": true,
"apiSummary": true
},
"approvedAt": {
"type": "string",
"apiSummary": true,
"description": "The date suggestion was approved as reviewer.",
"validation": [
"nullable",
"date:Y-m-d H:i:s"
]
},
"existingUserId": {
"type": "integer",
"apiSummary": true,
"description": "The existing user id if already present as an user.",
"validation": [
"nullable"
]
},
"existingReviewerRole": {
"type": "boolean",
"apiSummary": true,
"description": "The existing user has reviewer role when already there is an existing user association."
},
"reviewerId": {
"type": "integer",
"apiSummary": true,
"description": "The existing user id with reviewer role who as been mapped to this suggestion after the suggestion has made",
"validation": [
"nullable"
]
}
}
}
}
}
}