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

202 lines
7.4 KiB
PHP

<?php
/**
* @file components/listPanels/PKPSelectReviewerListPanel.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 PKPSelectReviewerListPanel
*
* @ingroup classes_controllers_list
*
* @brief A class for loading a panel to select a reviewer.
*/
namespace PKP\components\listPanels;
use APP\facades\Repo;
use Illuminate\Support\Enumerable;
use PKP\user\Collector;
class PKPSelectReviewerListPanel 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 List of user IDs already assigned as a reviewer to this review round */
public $currentlyAssigned = [];
/** @var array Query parameters to pass if this list executes GET requests */
public $getParams = [];
/** @var int Count of total items available for list */
public $itemsMax = 0;
/** @var string Name of the input field*/
public $selectorName = '';
/** @var array List of user IDs which may not be suitable for anonymous review because of existing access to author details */
public $warnOnAssignment = [];
/** @var Enumerable List of users who completed a review in the last round */
public Enumerable $lastRoundReviewers;
/**
* @copydoc ListPanel::set()
*/
public function set($args)
{
parent::set($args);
$this->currentlyAssigned = !empty($args['currentlyAssigned']) ? $args['currentlyAssigned'] : $this->currentlyAssigned;
$this->warnOnAssignment = !empty($args['warnOnAssignment']) ? $args['warnOnAssignment'] : $this->warnOnAssignment;
}
/**
* @copydoc ListPanel::getConfig()
*/
public function getConfig()
{
$config = parent::getConfig();
$config['apiUrl'] = $this->apiUrl;
$config['count'] = $this->count;
$config['currentlyAssigned'] = $this->currentlyAssigned;
$config['selectorName'] = $this->selectorName;
$config['warnOnAssignment'] = $this->warnOnAssignment;
$config['filters'] = [
[
'param' => 'reviewerRating',
'title' => __('reviewer.list.filterRating'),
'value' => 3,
'min' => 1,
'max' => 5,
'useStars' => true,
'valueLabel' => '{$value/5}',
],
[
'param' => 'reviewsCompleted',
'title' => __('reviewer.list.completedReviews'),
'value' => 10,
'min' => 0,
'max' => 20,
'valueLabel' => __('common.moreThan'),
],
[
'param' => 'daysSinceLastAssignment',
'title' => __('reviewer.list.daysSinceLastAssignmentDescription'),
'value' => [0, 365],
'min' => 0,
'max' => 365,
'filterType' => 'filter-slider-multirange',
'valueLabel' => __('common.range'),
'moreThanLabel' => __('common.moreThanOnly'),
'lessThanLabel' => __('common.lessThanOnly'),
],
[
'param' => 'reviewsActive',
'title' => __('reviewer.list.activeReviewsDescription'),
'value' => [0, 20],
'min' => 0,
'max' => 20,
'filterType' => 'filter-slider-multirange',
'valueLabel' => __('common.range'),
'moreThanLabel' => __('common.moreThanOnly'),
'lessThanLabel' => __('common.lessThanOnly'),
],
[
'param' => 'averageCompletion',
'title' => __('reviewer.list.averageCompletion'),
'value' => 75,
'min' => 0,
'max' => 75,
'valueLabel' => __('common.lessThan'),
],
];
if (!empty($this->lastRoundReviewers)) {
$config['lastRoundReviewers'] = Repo::user()
->getSchemaMap()
->summarizeManyReviewers($this->lastRoundReviewers)
->values()
->toArray();
}
if (!empty($this->getParams)) {
$config['getParams'] = $this->getParams;
}
$config['itemsMax'] = $this->itemsMax;
$config['activeReviewsCountLabel'] = __('reviewer.list.activeReviews');
$config['activeReviewsLabel'] = __('reviewer.list.activeReviewsDescription');
$config['assignedToLastRoundLabel'] = __('reviewer.list.assignedToLastRound');
$config['averageCompletionLabel'] = __('reviewer.list.averageCompletion');
$config['biographyLabel'] = __('reviewer.list.biography');
$config['cancelledReviewsLabel'] = __('reviewer.list.cancelledReviews');
$config['completedReviewsLabel'] = __('reviewer.list.completedReviews');
$config['currentlyAssignedLabel'] = __('reviewer.list.currentlyAssigned');
$config['daySinceLastAssignmentLabel'] = __('reviewer.list.daySinceLastAssignment');
$config['daysSinceLastAssignmentLabel'] = __('reviewer.list.daysSinceLastAssignment');
$config['daysSinceLastAssignmentDescriptionLabel'] = __('reviewer.list.daysSinceLastAssignmentDescription');
$config['declinedReviewsLabel'] = __('reviewer.list.declinedReviews');
$config['emptyLabel'] = __('reviewer.list.empty');
$config['gossipLabel'] = __('user.gossip');
$config['neverAssignedLabel'] = __('reviewer.list.neverAssigned');
$config['reassignLabel'] = __('reviewer.list.reassign');
$config['reassignWithNameLabel'] = __('reviewer.list.reassign.withName');
$config['reviewerRatingLabel'] = __('reviewer.list.reviewerRating');
$config['reviewInterestsLabel'] = __('reviewer.list.reviewInterests');
$config['selectReviewerLabel'] = __('editor.submission.selectReviewer');
$config['warnOnAssignmentLabel'] = __('reviewer.list.warnOnAssign');
$config['warnOnAssignmentUnlockLabel'] = __('reviewer.list.warnOnAssignUnlock');
return $config;
}
/**
* Helper method to get the items property according to the self::$getParams
*
* @param \APP\core\Request $request
*
* @return array
*/
public function getItems($request)
{
$reviewers = $this->_getCollector()->getMany();
$items = [];
$map = Repo::user()->getSchemaMap();
foreach ($reviewers as $reviewer) {
$items[] = $map->summarizeReviewer($reviewer);
}
return $items;
}
/**
* Helper method to get the itemsMax property according to self::$getParams
*
* @return int
*/
public function getItemsMax()
{
return $this->_getCollector()->offset(null)->limit(null)->getCount();
}
/**
* Helper method to compile initial params to get items
*/
protected function _getCollector(): Collector
{
return Repo::user()->getCollector()
->filterByContextIds([$this->getParams['contextId']])
->filterByWorkflowStageIds([$this->getParams['reviewStage']])
->filterByRoleIds([\PKP\security\Role::ROLE_ID_REVIEWER])
->includeReviewerData()
->offset(null)
->limit($this->count);
}
}