Files
OSJ/lib/pkp/classes/components/listPanels/PKPSubmissionsListPanel.php
CHIEFSOFT\ameye df3a033196 first commit
2024-06-08 17:09:23 -04:00

289 lines
11 KiB
PHP

<?php
/**
* @file components/listPanels/PKPSubmissionsListPanel.php
*
* Copyright (c) 2014-2021 Simon Fraser University
* Copyright (c) 2000-2021 John Willinsky
* Distributed under the GNU GPL v3. For full terms see the file docs/COPYING.
*
* @class PKPSubmissionsListPanel
*
* @ingroup classes_components_list
*
* @brief A ListPanel component for displaying submissions in the dashboard
*/
namespace PKP\components\listPanels;
use APP\core\Application;
use APP\facades\Repo;
use APP\template\TemplateManager;
use PKP\components\forms\FieldAutosuggestPreset;
use PKP\components\forms\FieldSelectUsers;
use PKP\security\Role;
use PKP\submission\PKPSubmission;
use PKP\submission\reviewAssignment\ReviewAssignment;
use PKP\submission\reviewRound\ReviewRound;
abstract class PKPSubmissionsListPanel extends ListPanel
{
/** @var string URL to the API endpoint where items can be retrieved */
public $apiUrl = '';
/** @var int Number of items to show at one time */
public $count = 30;
/** @var array Query parameters to pass if this list executes GET requests */
public $getParams = [];
/** @var bool Should items be loaded after the component is mounted? */
public $lazyLoad = false;
/** @var int Count of total items available for list */
public $itemsMax = 0;
/** @var bool Whether to show assigned to editors filter */
public $includeAssignedEditorsFilter = false;
/** @var bool Whether to show categories filter */
public $includeCategoriesFilter = false;
/** @var array List of all available categories */
public $categories = [];
/**
* @copydoc ListPanel::getConfig()
*/
public function getConfig()
{
$request = Application::get()->getRequest();
$context = $request->getContext();
$config = parent::getConfig();
$config['apiUrl'] = $this->apiUrl;
$config['count'] = $this->count;
$config['getParams'] = $this->getParams;
$config['lazyLoad'] = $this->lazyLoad;
$config['itemsMax'] = $this->itemsMax;
// URL to add a new submission
if ($context->getData('disableSubmissions')) {
$config['allowSubmissions'] = false;
}
$config['addUrl'] = $request->getDispatcher()->url(
$request,
Application::ROUTE_PAGE,
null,
'submission'
);
// URL to view info center for a submission
$config['infoUrl'] = $request->getDispatcher()->url(
$request,
Application::ROUTE_COMPONENT,
null,
'informationCenter.SubmissionInformationCenterHandler',
'viewInformationCenter',
null,
['submissionId' => '__id__']
);
// URL to assign a participant
$config['assignParticipantUrl'] = $request->getDispatcher()->url(
$request,
Application::ROUTE_COMPONENT,
null,
'grid.users.stageParticipant.StageParticipantGridHandler',
'addParticipant',
null,
['submissionId' => '__id__', 'stageId' => '__stageId__']
);
$config['filters'] = [
[
'filters' => [
[
'param' => 'isOverdue',
'value' => true,
'title' => __('common.overdue'),
],
[
'param' => 'isIncomplete',
'value' => true,
'title' => __('submissions.incomplete'),
],
],
],
[
'heading' => __('settings.roles.stages'),
'filters' => $this->getWorkflowStages(),
],
[
'heading' => __('submission.list.activity'),
'filters' => [
[
'title' => __('submission.list.daysSinceLastActivity'),
'param' => 'daysInactive',
'value' => 30,
'min' => 1,
'max' => 180,
'filterType' => 'pkp-filter-slider',
]
]
]
];
if ($this->includeCategoriesFilter) {
$categoryFilter = [];
$categoryFilter = $this->getCategoryFilters($this->categories);
if ($categoryFilter) {
$config['filters'][] = $categoryFilter;
}
}
if ($this->includeAssignedEditorsFilter) {
$assignedEditorsField = new FieldSelectUsers('assignedTo', [
'label' => __('editor.submissions.assignedTo'),
'value' => [],
'apiUrl' => $request->getDispatcher()->url(
$request,
Application::ROUTE_API,
$context->getPath(),
'users',
null,
null,
['roleIds' => [Role::ROLE_ID_MANAGER, Role::ROLE_ID_SUB_EDITOR]]
),
]);
$config['filters'][] = [
'filters' => [
[
'title' => __('editor.submissions.assignedTo'),
'param' => 'assignedTo',
'value' => [],
'filterType' => 'pkp-filter-autosuggest',
'component' => $assignedEditorsField->component,
'autosuggestProps' => $assignedEditorsField->getConfig(),
]
]
];
}
// Provide required constants
$templateMgr = TemplateManager::getManager($request);
$templateMgr->setConstants([
'STATUS_QUEUED' => PKPSubmission::STATUS_QUEUED,
'STATUS_PUBLISHED' => PKPSubmission::STATUS_PUBLISHED,
'STATUS_DECLINED' => PKPSubmission::STATUS_DECLINED,
'STATUS_SCHEDULED' => PKPSubmission::STATUS_SCHEDULED,
'WORKFLOW_STAGE_ID_SUBMISSION' => WORKFLOW_STAGE_ID_SUBMISSION,
'WORKFLOW_STAGE_ID_INTERNAL_REVIEW' => WORKFLOW_STAGE_ID_INTERNAL_REVIEW,
'WORKFLOW_STAGE_ID_EXTERNAL_REVIEW' => WORKFLOW_STAGE_ID_EXTERNAL_REVIEW,
'WORKFLOW_STAGE_ID_EDITING' => WORKFLOW_STAGE_ID_EDITING,
'WORKFLOW_STAGE_ID_PRODUCTION' => WORKFLOW_STAGE_ID_PRODUCTION,
'STAGE_STATUS_SUBMISSION_UNASSIGNED' => Repo::submission()::STAGE_STATUS_SUBMISSION_UNASSIGNED,
'REVIEW_ROUND_STATUS_PENDING_REVIEWERS' => ReviewRound::REVIEW_ROUND_STATUS_PENDING_REVIEWERS,
'REVIEW_ROUND_STATUS_REVIEWS_READY' => ReviewRound::REVIEW_ROUND_STATUS_REVIEWS_READY,
'REVIEW_ROUND_STATUS_REVIEWS_COMPLETED' => ReviewRound::REVIEW_ROUND_STATUS_REVIEWS_COMPLETED,
'REVIEW_ROUND_STATUS_REVIEWS_OVERDUE' => ReviewRound::REVIEW_ROUND_STATUS_REVIEWS_OVERDUE,
'REVIEW_ROUND_STATUS_REVISIONS_REQUESTED' => ReviewRound::REVIEW_ROUND_STATUS_REVISIONS_REQUESTED,
'REVIEW_ROUND_STATUS_REVISIONS_SUBMITTED' => ReviewRound::REVIEW_ROUND_STATUS_REVISIONS_SUBMITTED,
'REVIEW_ROUND_STATUS_RESUBMIT_FOR_REVIEW' => ReviewRound::REVIEW_ROUND_STATUS_RESUBMIT_FOR_REVIEW,
'REVIEW_ROUND_STATUS_RESUBMIT_FOR_REVIEW_SUBMITTED' => ReviewRound::REVIEW_ROUND_STATUS_RESUBMIT_FOR_REVIEW_SUBMITTED,
'REVIEW_ASSIGNMENT_STATUS_AWAITING_RESPONSE' => ReviewAssignment::REVIEW_ASSIGNMENT_STATUS_AWAITING_RESPONSE,
'REVIEW_ASSIGNMENT_STATUS_RESPONSE_OVERDUE' => ReviewAssignment::REVIEW_ASSIGNMENT_STATUS_RESPONSE_OVERDUE,
'REVIEW_ASSIGNMENT_STATUS_REVIEW_OVERDUE' => ReviewAssignment::REVIEW_ASSIGNMENT_STATUS_REVIEW_OVERDUE,
'REVIEW_ASSIGNMENT_STATUS_ACCEPTED' => ReviewAssignment::REVIEW_ASSIGNMENT_STATUS_ACCEPTED,
'REVIEW_ASSIGNMENT_STATUS_RECEIVED' => ReviewAssignment::REVIEW_ASSIGNMENT_STATUS_RECEIVED,
'REVIEW_ASSIGNMENT_STATUS_COMPLETE' => ReviewAssignment::REVIEW_ASSIGNMENT_STATUS_COMPLETE,
'REVIEW_ASSIGNMENT_STATUS_THANKED' => ReviewAssignment::REVIEW_ASSIGNMENT_STATUS_THANKED,
'REVIEW_ASSIGNMENT_STATUS_CANCELLED' => ReviewAssignment::REVIEW_ASSIGNMENT_STATUS_CANCELLED,
'REVIEW_ASSIGNMENT_STATUS_REQUEST_RESEND' => ReviewAssignment::REVIEW_ASSIGNMENT_STATUS_REQUEST_RESEND,
'REVIEW_ROUND_STATUS_RECOMMENDATIONS_READY' => ReviewRound::REVIEW_ROUND_STATUS_RECOMMENDATIONS_READY,
'REVIEW_ROUND_STATUS_RECOMMENDATIONS_COMPLETED' => ReviewRound::REVIEW_ROUND_STATUS_RECOMMENDATIONS_COMPLETED,
]);
$templateMgr->setLocaleKeys([
'common.lastActivity',
'editor.submissionArchive.confirmDelete',
'submission.list.empty',
'submission.submit.newSubmissionSingle',
'submission.review',
'submissions.incomplete',
'submission.list.assignEditor',
'submission.list.copyeditsSubmitted',
'submission.list.currentStage',
'submission.list.discussions',
'submission.list.dualWorkflowLinks',
'submission.list.galleysCreated',
'submission.list.infoCenter',
'submission.list.reviewAssignment',
'submission.list.responseDue',
'submission.list.reviewCancelled',
'submission.list.reviewComplete',
'submission.list.reviewDue',
'submission.list.reviewerWorkflowLink',
'submission.list.reviewsCompleted',
'submission.list.revisionsSubmitted',
'submission.list.viewSubmission',
]);
return $config;
}
/**
* Compile the categories for passing as filters
*
* @param array $categories
*
* @return array
*/
public function getCategoryFilters($categories = [])
{
$request = Application::get()->getRequest();
if ($categories) {
// Use an autosuggest field if the list of categories is too long
if (count($categories) > 5) {
$autosuggestField = new FieldAutosuggestPreset('categoryIds', [
'label' => __('category.category'),
'value' => [],
'options' => array_map(function ($category) {
return [
'value' => (int) $category['id'],
'label' => $category['title'],
];
}, $categories),
]);
return [
'filters' => [
[
'title' => __('category.category'),
'param' => 'categoryIds',
'filterType' => 'pkp-filter-autosuggest',
'component' => 'field-autosuggest-preset',
'value' => [],
'autosuggestProps' => $autosuggestField->getConfig(),
]
],
];
}
return [
'heading' => __('category.category'),
'filters' => array_map(function ($category) {
return [
'param' => 'categoryIds',
'value' => (int) $category['id'],
'title' => $category['title'],
];
}, $categories),
];
}
return [];
}
}