324 lines
9.4 KiB
PHP
324 lines
9.4 KiB
PHP
<?php
|
|
|
|
/**
|
|
* @file controllers/grid/issueGalleys/IssueGalleyGridHandler.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 IssueGalleyGridHandler
|
|
*
|
|
* @ingroup issue_galley
|
|
*
|
|
* @brief Handle issues grid requests.
|
|
*/
|
|
|
|
namespace APP\controllers\grid\issueGalleys;
|
|
|
|
use APP\controllers\grid\issues\form\IssueGalleyForm;
|
|
use APP\core\Application;
|
|
use APP\core\Request;
|
|
use APP\file\IssueFileManager;
|
|
use APP\issue\IssueGalleyDAO;
|
|
use APP\security\authorization\OjsIssueGalleyRequiredPolicy;
|
|
use APP\security\authorization\OjsIssueRequiredPolicy;
|
|
use PKP\controllers\grid\feature\OrderGridItemsFeature;
|
|
use PKP\controllers\grid\GridColumn;
|
|
use PKP\controllers\grid\GridHandler;
|
|
use PKP\core\JSONMessage;
|
|
use PKP\db\DAO;
|
|
use PKP\db\DAORegistry;
|
|
use PKP\file\TemporaryFileManager;
|
|
use PKP\linkAction\LinkAction;
|
|
use PKP\linkAction\request\AjaxModal;
|
|
use PKP\security\authorization\ContextAccessPolicy;
|
|
use PKP\security\Role;
|
|
|
|
class IssueGalleyGridHandler extends GridHandler
|
|
{
|
|
/**
|
|
* Constructor
|
|
*/
|
|
public function __construct()
|
|
{
|
|
parent::__construct();
|
|
$this->addRoleAssignment(
|
|
[Role::ROLE_ID_MANAGER, Role::ROLE_ID_SITE_ADMIN],
|
|
[
|
|
'fetchGrid', 'fetchRow', 'saveSequence',
|
|
'add', 'edit', 'upload', 'download', 'update', 'delete'
|
|
]
|
|
);
|
|
}
|
|
|
|
|
|
//
|
|
// 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));
|
|
|
|
// If a signoff ID was specified, authorize it.
|
|
if ($request->getUserVar('issueGalleyId')) {
|
|
$this->addPolicy(new OjsIssueGalleyRequiredPolicy($request, $args));
|
|
}
|
|
|
|
return parent::authorize($request, $args, $roleAssignments);
|
|
}
|
|
|
|
/**
|
|
* @copydoc GridHandler::getDataElementSequence()
|
|
*/
|
|
public function getDataElementSequence($issueGalley)
|
|
{
|
|
return $issueGalley->getSequence();
|
|
}
|
|
|
|
/**
|
|
* @copydoc GridHandler::setDataElementSequence()
|
|
*/
|
|
public function setDataElementSequence($request, $rowId, $gridDataElement, $newSequence)
|
|
{
|
|
$issueGalleyDao = DAORegistry::getDAO('IssueGalleyDAO'); /** @var IssueGalleyDAO $issueGalleyDao */
|
|
$gridDataElement->setSequence($newSequence);
|
|
$issueGalleyDao->updateObject($gridDataElement);
|
|
}
|
|
|
|
/**
|
|
* @copydoc GridHandler::addFeatures()
|
|
*/
|
|
public function initFeatures($request, $args)
|
|
{
|
|
return [new OrderGridItemsFeature()];
|
|
}
|
|
|
|
/**
|
|
* @copydoc GridDataProvider::getRequestArgs()
|
|
*/
|
|
public function getRequestArgs()
|
|
{
|
|
$issue = $this->getAuthorizedContextObject(Application::ASSOC_TYPE_ISSUE);
|
|
$issueGalley = $this->getAuthorizedContextObject(Application::ASSOC_TYPE_ISSUE_GALLEY);
|
|
$requestArgs = (array) parent::getRequestArgs();
|
|
$requestArgs['issueId'] = $issue->getId();
|
|
if ($issueGalley) {
|
|
$requestArgs['issueGalleyId'] = $issueGalley->getId();
|
|
}
|
|
return $requestArgs;
|
|
}
|
|
|
|
/**
|
|
* @copydoc GridHandler::initialize()
|
|
*
|
|
* @param null|mixed $args
|
|
*/
|
|
public function initialize($request, $args = null)
|
|
{
|
|
parent::initialize($request, $args);
|
|
|
|
// Add action
|
|
$router = $request->getRouter();
|
|
$this->addAction(
|
|
new LinkAction(
|
|
'add',
|
|
new AjaxModal(
|
|
$router->url(
|
|
$request,
|
|
null,
|
|
null,
|
|
'add',
|
|
null,
|
|
array_merge($this->getRequestArgs(), ['gridId' => $this->getId()])
|
|
),
|
|
__('grid.action.addIssueGalley'),
|
|
'modal_add'
|
|
),
|
|
__('grid.action.addIssueGalley'),
|
|
'add_category'
|
|
)
|
|
);
|
|
|
|
// Grid columns.
|
|
$issueGalleyGridCellProvider = new IssueGalleyGridCellProvider();
|
|
|
|
// Issue identification
|
|
$this->addColumn(
|
|
new GridColumn(
|
|
'label',
|
|
'submission.layout.galleyLabel',
|
|
null,
|
|
null,
|
|
$issueGalleyGridCellProvider
|
|
)
|
|
);
|
|
|
|
// Language, if more than one is supported
|
|
$journal = $request->getJournal();
|
|
if (count($journal->getSupportedLocaleNames()) > 1) {
|
|
$this->addColumn(
|
|
new GridColumn(
|
|
'locale',
|
|
'common.language',
|
|
null,
|
|
null,
|
|
$issueGalleyGridCellProvider
|
|
)
|
|
);
|
|
}
|
|
|
|
// Public ID, if enabled
|
|
$this->addColumn(
|
|
new GridColumn(
|
|
'publicGalleyId',
|
|
'submission.publisherId',
|
|
null,
|
|
null,
|
|
$issueGalleyGridCellProvider
|
|
)
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Get the row handler - override the default row handler
|
|
*
|
|
* @return IssueGalleyGridRow
|
|
*/
|
|
protected function getRowInstance()
|
|
{
|
|
$issue = $this->getAuthorizedContextObject(Application::ASSOC_TYPE_ISSUE);
|
|
return new IssueGalleyGridRow($issue->getId());
|
|
}
|
|
|
|
//
|
|
// Public operations
|
|
//
|
|
/**
|
|
* An action to add a new issue
|
|
*
|
|
* @param array $args
|
|
* @param Request $request
|
|
*/
|
|
public function add($args, $request)
|
|
{
|
|
// Calling editIssueData with an empty ID will add
|
|
// a new issue.
|
|
return $this->edit($args, $request);
|
|
}
|
|
|
|
/**
|
|
* An action to edit a issue galley
|
|
*
|
|
* @param array $args
|
|
* @param Request $request
|
|
*
|
|
* @return JSONMessage JSON object
|
|
*/
|
|
public function edit($args, $request)
|
|
{
|
|
$issue = $this->getAuthorizedContextObject(Application::ASSOC_TYPE_ISSUE);
|
|
$issueGalley = $this->getAuthorizedContextObject(Application::ASSOC_TYPE_ISSUE_GALLEY);
|
|
|
|
$issueGalleyForm = new IssueGalleyForm($request, $issue, $issueGalley);
|
|
$issueGalleyForm->initData();
|
|
return new JSONMessage(true, $issueGalleyForm->fetch($request));
|
|
}
|
|
|
|
/**
|
|
* An action to upload an issue galley file.
|
|
*
|
|
* @param array $args
|
|
* @param Request $request
|
|
*
|
|
* @return JSONMessage JSON object
|
|
*/
|
|
public function upload($args, $request)
|
|
{
|
|
$user = $request->getUser();
|
|
|
|
$temporaryFileManager = new TemporaryFileManager();
|
|
$temporaryFile = $temporaryFileManager->handleUpload('uploadedFile', $user->getId());
|
|
if ($temporaryFile) {
|
|
$json = new JSONMessage(true);
|
|
$json->setAdditionalAttributes([
|
|
'temporaryFileId' => $temporaryFile->getId()
|
|
]);
|
|
return $json;
|
|
} else {
|
|
return new JSONMessage(false, __('common.uploadFailed'));
|
|
}
|
|
}
|
|
|
|
/**
|
|
* An action to download an issue galley
|
|
*
|
|
* @param array $args
|
|
* @param Request $request
|
|
*
|
|
* @return string Serialized JSON object
|
|
*/
|
|
public function download($args, $request)
|
|
{
|
|
$issue = $this->getAuthorizedContextObject(Application::ASSOC_TYPE_ISSUE);
|
|
$issueGalley = $this->getAuthorizedContextObject(Application::ASSOC_TYPE_ISSUE_GALLEY);
|
|
$issueFileManager = new IssueFileManager($issue->getId());
|
|
return $issueFileManager->downloadById($issueGalley->getFileId());
|
|
}
|
|
|
|
/**
|
|
* Update a issue
|
|
*
|
|
* @param array $args
|
|
* @param Request $request
|
|
*
|
|
* @return JSONMessage JSON object
|
|
*/
|
|
public function update($args, $request)
|
|
{
|
|
$issue = $this->getAuthorizedContextObject(Application::ASSOC_TYPE_ISSUE);
|
|
$issueGalley = $this->getAuthorizedContextObject(Application::ASSOC_TYPE_ISSUE_GALLEY);
|
|
|
|
$issueGalleyForm = new IssueGalleyForm($request, $issue, $issueGalley);
|
|
$issueGalleyForm->readInputData();
|
|
|
|
if ($issueGalleyForm->validate()) {
|
|
$issueId = $issueGalleyForm->execute();
|
|
return DAO::getDataChangedEvent($issueId);
|
|
}
|
|
return new JSONMessage(false);
|
|
}
|
|
|
|
/**
|
|
* Removes an issue galley
|
|
*
|
|
* @param array $args
|
|
* @param Request $request
|
|
*/
|
|
public function delete($args, $request)
|
|
{
|
|
$issueGalleyDao = DAORegistry::getDAO('IssueGalleyDAO'); /** @var IssueGalleyDAO $issueGalleyDao */
|
|
$issueGalley = $this->getAuthorizedContextObject(Application::ASSOC_TYPE_ISSUE_GALLEY);
|
|
if ($issueGalley && $request->checkCSRF()) {
|
|
$issueGalleyDao->deleteObject($issueGalley);
|
|
return DAO::getDataChangedEvent();
|
|
}
|
|
return new JSONMessage(false);
|
|
}
|
|
|
|
/**
|
|
* @copydoc GridHandler::loadData
|
|
*/
|
|
protected function loadData($request, $filter)
|
|
{
|
|
$issue = $this->getAuthorizedContextObject(Application::ASSOC_TYPE_ISSUE);
|
|
$issueGalleyDao = DAORegistry::getDAO('IssueGalleyDAO'); /** @var IssueGalleyDAO $issueGalleyDao */
|
|
return $issueGalleyDao->getByIssueId($issue->getId());
|
|
}
|
|
}
|