first commit

This commit is contained in:
CHIEFSOFT\ameye
2024-06-08 17:09:23 -04:00
commit df3a033196
17887 changed files with 8637778 additions and 0 deletions
@@ -0,0 +1,35 @@
<?php
/**
* @file controllers/grid/toc/TocGridCategoryRow.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 TocGridCategoryRow
*
* @ingroup controllers_grid_admin_systemInfo
*
* @brief System Info grid category row definition
*/
namespace APP\controllers\grid\toc;
use PKP\controllers\grid\GridCategoryRow;
class TocGridCategoryRow extends GridCategoryRow
{
//
// Overridden methods from GridCategoryRow
//
/**
* Use a label if the actions in the grid are disabled.
* return string
*/
public function getCategoryLabel()
{
$section = $this->getData();
return $section->getLocalizedTitle();
}
}
@@ -0,0 +1,83 @@
<?php
/**
* @file controllers/grid/toc/TocGridCellProvider.php
*
* Copyright (c) 2014-2021 Simon Fraser University
* Copyright (c) 2003-2021 John Willinsky
* Distributed under the GNU GPL v3. For full terms see the file docs/COPYING.
*
* @class TocGridCellProvider
*
* @ingroup controllers_grid_toc
*
* @brief Grid cell provider for the TOC (Table of Contents) category grid
*/
namespace APP\controllers\grid\toc;
use APP\submission\Submission;
use PKP\controllers\grid\GridCellProvider;
use PKP\controllers\grid\GridColumn;
use PKP\controllers\grid\GridHandler;
use PKP\linkAction\LinkAction;
use PKP\linkAction\request\AjaxAction;
class TocGridCellProvider extends GridCellProvider
{
/**
* Extracts variables for a given column from a data element
* so that they may be assigned to template before rendering.
*
* @param \PKP\controllers\grid\GridRow $row
* @param GridColumn $column
*
* @return array
*/
public function getTemplateVarsFromRowColumn($row, $column)
{
$element = $row->getData();
$columnId = $column->getId();
assert(!empty($columnId));
switch ($columnId) {
case 'title':
return ['label' => $element->getLocalizedTitle()];
case 'access':
return ['selected' => $element->getCurrentPublication()->getData('accessStatus') == Submission::ARTICLE_ACCESS_OPEN];
default: assert(false);
}
}
/**
* @copydoc GridCellProvider::getCellActions()
*/
public function getCellActions($request, $row, $column, $position = GridHandler::GRID_ACTION_POSITION_DEFAULT)
{
switch ($column->getId()) {
case 'access':
$article = $row->getData(); /** @var Submission $article */
return [new LinkAction(
'disable',
new AjaxAction(
$request->url(
null,
null,
'setAccessStatus',
null,
array_merge(
[
'articleId' => $article->getId(),
'status' => ($article->getCurrentPublication()->getData('accessStatus') == Submission::ARTICLE_ACCESS_OPEN) ? Submission::ARTICLE_ACCESS_ISSUE_DEFAULT : Submission::ARTICLE_ACCESS_OPEN,
'csrfToken' => $request->getSession()->getCSRFToken(),
],
$row->getRequestArgs()
)
)
),
__('manager.plugins.disable'),
null
)];
}
return parent::getCellActions($request, $row, $column, $position);
}
}
+300
View File
@@ -0,0 +1,300 @@
<?php
/**
* @file controllers/grid/toc/TocGridHandler.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 TocGridHandler
*
* @ingroup controllers_grid_toc
*
* @brief Handle TOC (table of contents) grid requests.
*/
namespace APP\controllers\grid\toc;
use APP\core\Application;
use APP\core\Request;
use APP\facades\Repo;
use APP\section\Section;
use APP\security\authorization\OjsIssueRequiredPolicy;
use APP\submission\Submission;
use PKP\controllers\grid\CategoryGridHandler;
use PKP\controllers\grid\feature\OrderCategoryGridItemsFeature;
use PKP\controllers\grid\GridColumn;
use PKP\core\JSONMessage;
use PKP\db\DAO;
use PKP\security\authorization\ContextAccessPolicy;
use PKP\security\Role;
use PKP\submission\PKPSubmission;
class TocGridHandler extends CategoryGridHandler
{
public $submissionsBySectionId = [];
/**
* Constructor
*/
public function __construct()
{
parent::__construct();
$this->addRoleAssignment(
[Role::ROLE_ID_MANAGER, Role::ROLE_ID_SITE_ADMIN],
['fetchGrid', 'fetchCategory', 'fetchRow', 'saveSequence', 'removeArticle', 'setAccessStatus']
);
$this->submissionsBySectionId = [];
}
//
// Implement template methods from PKPHandler.
//
/**
* @copydoc PKPHandler::authorize()
*/
public function authorize($request, &$args, $roleAssignments)
{
$this->addPolicy(new ContextAccessPolicy($request, $roleAssignments));
$this->addPolicy(new OjsIssueRequiredPolicy($request, $args));
return parent::authorize($request, $args, $roleAssignments);
}
/**
* @copydoc CategoryGridHandler::initialize()
*
* @param null|mixed $args
*/
public function initialize($request, $args = null)
{
parent::initialize($request, $args);
//
// Grid columns.
//
$tocGridCellProvider = new TocGridCellProvider();
// Article title
$this->addColumn(
new GridColumn(
'title',
'article.title',
null,
null,
$tocGridCellProvider
)
);
$issue = $this->getAuthorizedContextObject(Application::ASSOC_TYPE_ISSUE);
if ($request->getJournal()->getData('publishingMode') == \APP\journal\Journal::PUBLISHING_MODE_SUBSCRIPTION && $issue->getAccessStatus() == \APP\issue\Issue::ISSUE_ACCESS_SUBSCRIPTION) {
// Article access status
$this->addColumn(
new GridColumn(
'access',
'reader.openAccess',
null,
'controllers/grid/common/cell/selectStatusCell.tpl',
$tocGridCellProvider,
['width' => 20, 'alignment' => GridColumn::COLUMN_ALIGNMENT_CENTER]
)
);
}
}
/**
* @copydoc GridHandler::initFeatures()
*/
public function initFeatures($request, $args)
{
return [new OrderCategoryGridItemsFeature(OrderCategoryGridItemsFeature::ORDER_CATEGORY_GRID_CATEGORIES_AND_ROWS, true, $this)];
}
/**
* @copydoc CategoryGridHandler::getCategoryRowIdParameterName()
*/
public function getCategoryRowIdParameterName()
{
return 'sectionId';
}
/**
* @copydoc GridDataProvider::getRequestArgs()
*/
public function getRequestArgs()
{
$issue = $this->getAuthorizedContextObject(Application::ASSOC_TYPE_ISSUE);
return array_merge(
parent::getRequestArgs(),
['issueId' => $issue->getId()]
);
}
/**
* Get the row handler - override the default row handler
*
* @return TocGridRow
*/
protected function getRowInstance()
{
$issue = $this->getAuthorizedContextObject(Application::ASSOC_TYPE_ISSUE);
return new TocGridRow($issue->getId());
}
/**
* @copydoc CategoryGridHandler::getCategoryRowInstance()
*/
protected function getCategoryRowInstance()
{
return new TocGridCategoryRow();
}
/**
* @copydoc CategoryGridHandler::loadCategoryData()
*
* @param null|mixed $filter
*/
public function loadCategoryData($request, &$section, $filter = null)
{
return $this->submissionsBySectionId[$section->getId()];
}
/**
* @copydoc GridHandler::loadData()
*/
protected function loadData($request, $filter)
{
$issue = $this->getAuthorizedContextObject(Application::ASSOC_TYPE_ISSUE);
$submissionsInSections = Repo::submission()->getInSections($issue->getId(), $request->getContext()->getId());
foreach ($submissionsInSections as $sectionId => $articles) {
foreach ($articles['articles'] as $article) {
$this->submissionsBySectionId[$sectionId][$article->getId()] = $article;
}
}
$sections = Repo::section()->getByIssueId($issue->getId());
$arrayKeySections = [];
foreach ($sections as $section) {
$arrayKeySections[$section->getId()] = $section;
}
return $arrayKeySections;
}
/**
* @copydoc GridHandler::getDataElementSequence()
*
* @param Section|Submission $object
*/
public function getDataElementSequence($object)
{
if ($object instanceof Submission) {
return $object->getCurrentPublication()->getData('seq');
} else { // section
$issue = $this->getAuthorizedContextObject(Application::ASSOC_TYPE_ISSUE);
$customOrdering = Repo::section()->getCustomSectionOrder($issue->getId(), $object->getId());
if ($customOrdering === null) { // No custom ordering specified; use default section ordering
return $object->getSequence();
} else { // Custom ordering specified.
return $customOrdering;
}
}
}
/**
* @copydoc GridHandler::setDataElementSequence()
*/
public function setDataElementSequence($request, $sectionId, $gridDataElement, $newSequence)
{
$issue = $this->getAuthorizedContextObject(Application::ASSOC_TYPE_ISSUE);
Repo::section()->upsertCustomSectionOrder($issue->getId(), $sectionId, $newSequence);
}
/**
* @copydoc CategoryGridHandler::getDataElementInCategorySequence()
*/
public function getDataElementInCategorySequence($categoryId, &$submission)
{
return $submission->getCurrentPublication()->getData('seq');
}
/**
* @copydoc GridHandler::setDataElementSequence()
*/
public function setDataElementInCategorySequence($sectionId, &$submission, $newSequence)
{
$publication = $submission->getCurrentPublication();
$params = ['seq' => $newSequence];
if ($sectionId != $publication->getData('sectionId')) {
$params['sectionId'] = $sectionId;
}
Repo::publication()->edit($publication, $params);
}
//
// Public handler functions
//
/**
* Remove an article from the issue.
*
* @param array $args
* @param Request $request
*
* @return JSONMessage JSON object
*/
public function removeArticle($args, $request)
{
$journal = $request->getJournal();
$submission = Repo::submission()->get((int) $request->getUserVar('articleId'));
$issue = $this->getAuthorizedContextObject(Application::ASSOC_TYPE_ISSUE);
if ($submission && $request->checkCSRF()) {
foreach ($submission->getData('publications') as $publication) {
if ($publication->getData('issueId') === (int) $issue->getId()
&& in_array($publication->getData('status'), [PKPSubmission::STATUS_SCHEDULED, PKPSubmission::STATUS_PUBLISHED])) {
Repo::publication()->unpublish($publication);
$publication = Repo::publication()->get($publication->getId());
Repo::publication()->edit(
$publication,
['seq' => '']
);
}
}
// If the article is the only one in the section, delete the section from custom issue ordering
$sectionId = $submission->getCurrentPublication()->getData('sectionId');
$submissionsInSections = Repo::submission()->getInSections($issue->getId(), $issue->getJournalId());
if (!empty($submissionsInSections[$sectionId]) && count($submissionsInSections[$sectionId]) === 1) {
Repo::section()->deleteCustomSectionOrder($issue->getId(), $sectionId);
}
return DAO::getDataChangedEvent();
}
// If we've fallen through, it must be a badly-specified article
return new JSONMessage(false);
}
/**
* Set access status on an article.
*
* @param array $args
* @param Request $request
*
* @return JSONMessage JSON object
*/
public function setAccessStatus($args, $request)
{
$articleId = (int) $request->getUserVar('articleId');
$issue = $this->getAuthorizedContextObject(Application::ASSOC_TYPE_ISSUE);
$submission = Repo::submission()->get($articleId);
$publication = $submission ? $submission->getCurrentPublication() : null;
if ($publication && $publication->getData('issueId') == $issue->getId() && $request->checkCSRF()) {
Repo::publication()->edit($publication, ['accessStatus' => $request->getUserVar('status')]);
return DAO::getDataChangedEvent();
}
// If we've fallen through, it must be a badly-specified article
return new JSONMessage(false);
}
}
+81
View File
@@ -0,0 +1,81 @@
<?php
/**
* @file controllers/grid/toc/TocGridRow.php
*
* Copyright (c) 2014-2021 Simon Fraser University
* Copyright (c) 2003-2021 John Willinsky
* Distributed under the GNU GPL v3. For full terms see the file docs/COPYING.
*
* @class TocGridRow
*
* @ingroup controllers_grid_settings_issue
*
* @brief Handle issue grid row requests.
*/
namespace APP\controllers\grid\toc;
use PKP\controllers\grid\GridRow;
use PKP\core\PKPApplication;
use PKP\linkAction\LinkAction;
use PKP\linkAction\request\RedirectAction;
use PKP\linkAction\request\RemoteActionConfirmationModal;
class TocGridRow extends GridRow
{
/** @var int */
public $issueId;
/**
* Constructor
*
* @param int $issueId
*/
public function __construct($issueId)
{
parent::__construct();
$this->issueId = $issueId;
}
//
// Overridden template methods
//
/**
* @copydoc GridRow::initialize
*
* @param null|mixed $template
*/
public function initialize($request, $template = null)
{
parent::initialize($request, $template);
$dispatcher = $request->getDispatcher();
$this->addAction(
new LinkAction(
'workflow',
new RedirectAction(
$dispatcher->url($request, PKPApplication::ROUTE_PAGE, null, 'workflow', 'access', [$this->getId()])
),
__('submission.submission'),
'information'
)
);
$router = $request->getRouter();
$this->addAction(
new LinkAction(
'removeArticle',
new RemoteActionConfirmationModal(
$request->getSession(),
__('editor.article.remove.confirm'),
__('grid.action.removeArticle'),
$router->url($request, null, null, 'removeArticle', null, ['articleId' => $this->getId(), 'issueId' => $this->issueId]),
'modal_delete'
),
__('editor.article.remove'),
'delete'
)
);
}
}