Open Journal Systems  3.3.0
QueriesGridHandler.inc.php
1 <?php
2 
16 // import grid base classes
17 import('lib.pkp.classes.controllers.grid.GridHandler');
18 
19 // Link action & modal classes
20 import('lib.pkp.classes.linkAction.request.AjaxModal');
21 
23 
25  var $_stageId;
26 
28  var $_request;
29 
33  function __construct() {
34  parent::__construct();
35  $this->addRoleAssignment(
36  array(ROLE_ID_MANAGER, ROLE_ID_SUB_EDITOR, ROLE_ID_ASSISTANT, ROLE_ID_REVIEWER, ROLE_ID_AUTHOR),
37  array('fetchGrid', 'fetchRow', 'readQuery', 'participants', 'addQuery', 'editQuery', 'updateQuery', 'deleteQuery'));
38  $this->addRoleAssignment(
39  array(ROLE_ID_MANAGER, ROLE_ID_SUB_EDITOR, ROLE_ID_ASSISTANT),
40  array('openQuery', 'closeQuery', 'saveSequence'));
41  $this->addRoleAssignment(
42  array(ROLE_ID_MANAGER),
43  array('leaveQuery'));
44  }
45 
46 
47  //
48  // Getters/Setters
49  //
54  function getSubmission() {
55  return $this->getAuthorizedContextObject(ASSOC_TYPE_SUBMISSION);
56  }
57 
62  function getQuery() {
63  return $this->getAuthorizedContextObject(ASSOC_TYPE_QUERY);
64  }
65 
70  function getStageId() {
71  return $this->_stageId;
72  }
73 
78  function getAssocType() {
79  return ASSOC_TYPE_SUBMISSION;
80  }
81 
86  function getAssocId() {
87  return $this->getSubmission()->getId();
88  }
89 
94  function getCellProvider() {
95  import('lib.pkp.controllers.grid.queries.QueriesGridCellProvider');
96  return new QueriesGridCellProvider(
97  $this->getSubmission(),
98  $this->getStageId(),
99  $this->getAccessHelper()
100  );
101  }
102 
103 
104  //
105  // Overridden methods from PKPHandler.
106  // Note: this is subclassed in application-specific grids.
107  //
111  function authorize($request, &$args, $roleAssignments) {
112  $this->_stageId = (int) $request->getUserVar('stageId'); // This is being validated in WorkflowStageAccessPolicy
113 
114  $this->_request = $request;
115 
116  if ($request->getUserVar('queryId')) {
117  import('lib.pkp.classes.security.authorization.QueryAccessPolicy');
118  $this->addPolicy(new QueryAccessPolicy($request, $args, $roleAssignments, $this->_stageId));
119  } else {
120  import('lib.pkp.classes.security.authorization.QueryWorkflowStageAccessPolicy');
121  $this->addPolicy(new QueryWorkflowStageAccessPolicy($request, $args, $roleAssignments, 'submissionId', $this->_stageId));
122  }
123 
124  return parent::authorize($request, $args, $roleAssignments);
125  }
126 
130  function initialize($request, $args = null) {
131  parent::initialize($request, $args);
132  import('lib.pkp.controllers.grid.queries.QueriesGridCellProvider');
133 
134  switch ($this->getStageId()) {
135  case WORKFLOW_STAGE_ID_SUBMISSION: $this->setTitle('submission.queries.submission'); break;
136  case WORKFLOW_STAGE_ID_EDITING: $this->setTitle('submission.queries.editorial'); break;
137  case WORKFLOW_STAGE_ID_PRODUCTION: $this->setTitle('submission.queries.production'); break;
138  case WORKFLOW_STAGE_ID_INTERNAL_REVIEW:
139  case WORKFLOW_STAGE_ID_EXTERNAL_REVIEW:
140  $this->setTitle('submission.queries.review');
141  break;
142  default: assert(false);
143  }
144 
145  // Load pkp-lib translations
147  LOCALE_COMPONENT_PKP_SUBMISSION,
148  LOCALE_COMPONENT_PKP_USER,
149  LOCALE_COMPONENT_PKP_EDITOR
150  );
151 
152  // Columns
153  import('lib.pkp.controllers.grid.queries.QueryTitleGridColumn');
154  $cellProvider = $this->getCellProvider();
155  $this->addColumn(new QueryTitleGridColumn($this->getRequestArgs()));
156 
157  $this->addColumn(new GridColumn(
158  'from',
159  'submission.query.from',
160  null,
161  null,
162  $cellProvider,
163  array('html' => TRUE, 'width' => 20)
164  ));
165  $this->addColumn(new GridColumn(
166  'lastReply',
167  'submission.query.lastReply',
168  null,
169  null,
170  $cellProvider,
171  array('html' => TRUE, 'width' => 20)
172  ));
173  $this->addColumn(new GridColumn(
174  'replies',
175  'submission.query.replies',
176  null,
177  null,
178  $cellProvider,
179  array('width' => 10, 'alignment' => COLUMN_ALIGNMENT_CENTER)
180  ));
181 
182  $this->addColumn(
183  new GridColumn(
184  'closed',
185  'submission.query.closed',
186  null,
187  'controllers/grid/common/cell/selectStatusCell.tpl',
188  $cellProvider,
189  array('width' => 10, 'alignment' => COLUMN_ALIGNMENT_CENTER)
190  )
191  );
192 
193  $router = $request->getRouter();
194  if ($this->getAccessHelper()->getCanCreate($this->getStageId())) $this->addAction(new LinkAction(
195  'addQuery',
196  new AjaxModal(
197  $router->url($request, null, null, 'addQuery', null, $this->getRequestArgs()),
198  __('grid.action.addQuery'),
199  'modal_add_item'
200  ),
201  __('grid.action.addQuery'),
202  'add_item'
203  ));
204  }
205 
206 
207  //
208  // Overridden methods from GridHandler
209  //
213  function initFeatures($request, $args) {
214  $features = parent::initFeatures($request, $args);
215  if ($this->getAccessHelper()->getCanOrder($this->getStageId())) {
216  import('lib.pkp.classes.controllers.grid.feature.OrderGridItemsFeature');
217  $features[] = new OrderGridItemsFeature();
218  }
219  return $features;
220  }
221 
225  function getDataElementSequence($row) {
226  return $row->getSequence();
227  }
228 
232  function setDataElementSequence($request, $rowId, $gridDataElement, $newSequence) {
233  $queryDao = DAORegistry::getDAO('QueryDAO'); /* @var $queryDao QueryDAO */
234  $query = $queryDao->getById($rowId, $this->getAssocType(), $this->getAssocId());
235  $query->setSequence($newSequence);
236  $queryDao->updateObject($query);
237  }
238 
243  function getRowInstance() {
244  import('lib.pkp.controllers.grid.queries.QueriesGridRow');
245  return new QueriesGridRow(
246  $this->getSubmission(),
247  $this->getStageId(),
248  $this->getAccessHelper()
249  );
250  }
251 
256  function getAccessHelper() {
257  import('lib.pkp.controllers.grid.queries.QueriesAccessHelper');
258  return new QueriesAccessHelper($this->getAuthorizedContext(), $this->_request->getUser());
259  }
260 
266  function getRequestArgs() {
267  return array(
268  'submissionId' => $this->getSubmission()->getId(),
269  'stageId' => $this->getStageId(),
270  );
271  }
272 
276  function loadData($request, $filter = null) {
277  $queryDao = DAORegistry::getDAO('QueryDAO'); /* @var $queryDao QueryDAO */
278  return $queryDao->getByAssoc(
279  $this->getAssocType(),
280  $this->getAssocId(),
281  $this->getStageId(),
282  $this->getAccessHelper()->getCanListAll($this->getStageId())?null:$request->getUser()->getId()
283  );
284  }
285 
286  //
287  // Public Query Grid Actions
288  //
295  function addQuery($args, $request) {
296  if (!$this->getAccessHelper()->getCanCreate($this->getStageId())) return new JSONMessage(false);
297 
298  import('lib.pkp.controllers.grid.queries.form.QueryForm');
299  $queryForm = new QueryForm(
300  $request,
301  $this->getAssocType(),
302  $this->getAssocId(),
303  $this->getStageId()
304  );
305  $queryForm->initData();
306  return new JSONMessage(true, $queryForm->fetch($request, null, false, $this->getRequestArgs()));
307  }
308 
315  function deleteQuery($args, $request) {
316  $query = $this->getQuery();
317  if (!$request->checkCSRF() || !$query || !$this->getAccessHelper()->getCanDelete($query->getId())) return new JSONMessage(false);
318 
319  $queryDao = DAORegistry::getDAO('QueryDAO'); /* @var $queryDao QueryDAO */
320  $queryDao->deleteObject($query);
321 
322  $notificationDao = DAORegistry::getDAO('NotificationDAO'); /* @var $notificationDao NotificationDAO */
323  $notificationDao->deleteByAssoc(ASSOC_TYPE_QUERY, $query->getId());
324 
325  if ($this->getStageId() == WORKFLOW_STAGE_ID_EDITING ||
326  $this->getStageId() == WORKFLOW_STAGE_ID_PRODUCTION) {
327 
328  // Update submission notifications
329  $notificationMgr = new NotificationManager();
330  $notificationMgr->updateNotification(
331  $request,
332  array(
333  NOTIFICATION_TYPE_ASSIGN_COPYEDITOR,
334  NOTIFICATION_TYPE_AWAITING_COPYEDITS,
335  NOTIFICATION_TYPE_ASSIGN_PRODUCTIONUSER,
336  NOTIFICATION_TYPE_AWAITING_REPRESENTATIONS,
337  ),
338  null,
339  ASSOC_TYPE_SUBMISSION,
340  $this->getAssocId()
341  );
342  }
343 
344  return DAO::getDataChangedEvent($query->getId());
345  }
346 
353  function openQuery($args, $request) {
354  $query = $this->getQuery();
355  if (!$query || !$this->getAccessHelper()->getCanOpenClose($query)) return new JSONMessage(false);
356 
357  $queryDao = DAORegistry::getDAO('QueryDAO'); /* @var $queryDao QueryDAO */
358  $query->setIsClosed(false);
359  $queryDao->updateObject($query);
360  return DAO::getDataChangedEvent($query->getId());
361  }
362 
369  function closeQuery($args, $request) {
370  $query = $this->getQuery();
371  if (!$query || !$this->getAccessHelper()->getCanOpenClose($query)) return new JSONMessage(false);
372 
373  $queryDao = DAORegistry::getDAO('QueryDAO'); /* @var $queryDao QueryDAO */
374  $query->setIsClosed(true);
375  $queryDao->updateObject($query);
376  return DAO::getDataChangedEvent($query->getId());
377  }
378 
383  function getQueryNotesGridHandlerName() {
384  return 'grid.queries.QueryNotesGridHandler';
385  }
386 
393  function readQuery($args, $request) {
394  $query = $this->getQuery();
395  $router = $request->getRouter();
396  $user = $request->getUser();
397  $context = $request->getContext();
398 
399  $actionArgs = array_merge($this->getRequestArgs(), array('queryId' => $query->getId()));
400 
401  // If appropriate, create an Edit action for the participants list
402  if ($this->getAccessHelper()->getCanEdit($query->getId())) {
403  import('lib.pkp.classes.linkAction.request.AjaxModal');
404  $editAction = new LinkAction(
405  'editQuery',
406  new AjaxModal(
407  $router->url($request, null, null, 'editQuery', null, $actionArgs),
408  __('grid.action.updateQuery'),
409  'modal_edit'
410  ),
411  __('grid.action.edit'),
412  'edit'
413  );
414  } else {
415  $editAction = null;
416  }
417 
418  import('lib.pkp.classes.linkAction.request.RemoteActionConfirmationModal');
419  $leaveQueryLinkAction = new LinkAction(
420  'leaveQuery',
422  $request->getSession(),
423  __('submission.query.leaveQuery.confirm'),
424  __('submission.query.leaveQuery'),
425  $router->url($request, null, null, 'leaveQuery', null, $actionArgs),
426  'modal_delete'
427  ),
428  __('submission.query.leaveQuery'),
429  'leaveQuery'
430  );
431 
432  // Show leave query button for journal managers included in the query
433  if ($user && $this->_getCurrentUserCanLeave($query->getId())) {
434  $showLeaveQueryButton = true;
435  } else {
436  $showLeaveQueryButton = false;
437  }
438 
439  $templateMgr = TemplateManager::getManager($request);
440  $templateMgr->assign(array(
441  'queryNotesGridHandlerName' => $this->getQueryNotesGridHandlerName(),
442  'requestArgs' => $this->getRequestArgs(),
443  'query' => $query,
444  'editAction' => $editAction,
445  'leaveQueryLinkAction' => $leaveQueryLinkAction,
446  'showLeaveQueryButton' => $showLeaveQueryButton,
447  ));
448  return new JSONMessage(true, $templateMgr->fetch('controllers/grid/queries/readQuery.tpl'));
449  }
450 
457  function participants($args, $request) {
458  $query = $this->getQuery();
459  $queryDao = DAORegistry::getDAO('QueryDAO'); /* @var $queryDao QueryDAO */
460  $userDao = DAORegistry::getDAO('UserDAO'); /* @var $userDao UserDAO */
461  $context = $request->getContext();
462  $user = $request->getUser();
463 
464  $participants = array();
465  foreach ($queryDao->getParticipantIds($query->getId()) as $userId) {
466  $participants[] = $userDao->getById($userId);
467  }
468 
469  $templateMgr = TemplateManager::getManager($request);
470  $templateMgr->assign('participants', $participants);
471 
472  if ($user && $this->_getCurrentUserCanLeave($query->getId())) {
473  $showLeaveQueryButton = true;
474  } else {
475  $showLeaveQueryButton = false;
476  }
477  $json = new JSONMessage();
478  $json->setStatus(true);
479  $json->setContent($templateMgr->fetch('controllers/grid/queries/participants.tpl'));
480  $json->setAdditionalAttributes(array('showLeaveQueryButton' => $showLeaveQueryButton));
481  return $json;
482  }
483 
490  function editQuery($args, $request) {
491  $query = $this->getQuery();
492  if (!$this->getAccessHelper()->getCanEdit($query->getId())) return new JSONMessage(false);
493 
494  // Form handling
495  import('lib.pkp.controllers.grid.queries.form.QueryForm');
496  $queryForm = new QueryForm(
497  $request,
498  $this->getAssocType(),
499  $this->getAssocId(),
500  $this->getStageId(),
501  $query->getId()
502  );
503  $queryForm->initData();
504  return new JSONMessage(true, $queryForm->fetch($request, null, false, $this->getRequestArgs()));
505  }
506 
513  function updateQuery($args, $request) {
514  $query = $this->getQuery();
515  if (!$this->getAccessHelper()->getCanEdit($query->getId())) return new JSONMessage(false);
516 
517  import('lib.pkp.controllers.grid.queries.form.QueryForm');
518  $queryForm = new QueryForm(
519  $request,
520  $this->getAssocType(),
521  $this->getAssocId(),
522  $this->getStageId(),
523  $query->getId()
524  );
525  $queryForm->readInputData();
526 
527  if ($queryForm->validate()) {
528  $queryForm->execute();
529 
530  if ($this->getStageId() == WORKFLOW_STAGE_ID_EDITING ||
531  $this->getStageId() == WORKFLOW_STAGE_ID_PRODUCTION) {
532 
533  // Update submission notifications
534  $notificationMgr = new NotificationManager();
535  $notificationMgr->updateNotification(
536  $request,
537  array(
538  NOTIFICATION_TYPE_ASSIGN_COPYEDITOR,
539  NOTIFICATION_TYPE_AWAITING_COPYEDITS,
540  NOTIFICATION_TYPE_ASSIGN_PRODUCTIONUSER,
541  NOTIFICATION_TYPE_AWAITING_REPRESENTATIONS,
542  ),
543  null,
544  ASSOC_TYPE_SUBMISSION,
545  $this->getAssocId()
546  );
547  }
548  return DAO::getDataChangedEvent($query->getId());
549  }
550  return new JSONMessage(
551  true,
552  $queryForm->fetch(
553  $request,
554  null,
555  false,
556  array_merge(
557  $this->getRequestArgs(),
558  array('queryId' => $query->getId())
559  )
560  )
561  );
562  }
563 
570  function leaveQuery($args, $request) {
571  $queryId = $args['queryId'];
572  $user = $request->getUser();
573  $context = $request->getContext();
574  if ($user && $this->_getCurrentUserCanLeave($queryId)) {
575  $queryDao = DAORegistry::getDAO('QueryDAO'); /* @var $queryDao QueryDAO */
576  $queryDao->removeParticipant($queryId, $user->getId());
577  $json = new JSONMessage();
578  $json->setEvent('user-left-discussion');
579  } else {
580  $json = new JSONMessage(false);
581  }
582  return $json;
583  }
584 
590  function _getCurrentUserCanLeave($queryId) {
591  $userRoles = $this->getAuthorizedContextObject(ASSOC_TYPE_USER_ROLES);
592  if (!in_array(ROLE_ID_MANAGER, $userRoles)) {
593  return false;
594  }
595  $queryDao = DAORegistry::getDAO('QueryDAO'); /* @var $queryDao QueryDAO */
596  $participantIds = $queryDao->getParticipantIds($queryId);
597  if (count($participantIds) < 3) {
598  return false;
599  }
600  $user = Application::get()->getRequest()->getUser();
601  return in_array($user->getId(), $participantIds);
602 
603  }
604 }
605 
606 
PKPHandler\addRoleAssignment
addRoleAssignment($roleIds, $operations)
Definition: PKPHandler.inc.php:213
GridColumn
The GridColumn class represents a column within a grid. It is used to format the data presented in a ...
Definition: GridColumn.inc.php:27
AppLocale\requireComponents
static requireComponents()
Definition: env1/MockAppLocale.inc.php:56
QueriesGridHandler\editQuery
editQuery($args, $request)
Definition: QueriesGridHandler.inc.php:496
QueriesGridHandler\leaveQuery
leaveQuery($args, $request)
Definition: QueriesGridHandler.inc.php:576
QueriesGridHandler\loadData
loadData($request, $filter=null)
Definition: QueriesGridHandler.inc.php:282
RemoteActionConfirmationModal
Class defining a simple confirmation modal with a remote action and ok/cancel buttons.
Definition: RemoteActionConfirmationModal.inc.php:18
QueriesGridHandler\authorize
authorize($request, &$args, $roleAssignments)
Definition: QueriesGridHandler.inc.php:117
QueriesGridHandler\getAssocType
getAssocType()
Definition: QueriesGridHandler.inc.php:84
DAORegistry\getDAO
static & getDAO($name, $dbconn=null)
Definition: DAORegistry.inc.php:57
QueriesGridHandler\participants
participants($args, $request)
Definition: QueriesGridHandler.inc.php:463
QueriesGridHandler\getQueryNotesGridHandlerName
getQueryNotesGridHandlerName()
Definition: QueriesGridHandler.inc.php:389
QueriesGridHandler\initialize
initialize($request, $args=null)
Definition: QueriesGridHandler.inc.php:136
QueriesGridHandler\readQuery
readQuery($args, $request)
Definition: QueriesGridHandler.inc.php:399
QueriesAccessHelper
Implements access rules for queries. Permissions are intended as follows (per UI/UX group,...
Definition: QueriesAccessHelper.inc.php:26
QueriesGridHandler\getAccessHelper
getAccessHelper()
Definition: QueriesGridHandler.inc.php:262
QueriesGridHandler\__construct
__construct()
Definition: QueriesGridHandler.inc.php:39
PKPHandler\getId
getId()
Definition: PKPHandler.inc.php:107
QueriesGridHandler\getDataElementSequence
getDataElementSequence($row)
Definition: QueriesGridHandler.inc.php:231
QueriesGridHandler\_getCurrentUserCanLeave
_getCurrentUserCanLeave($queryId)
Definition: QueriesGridHandler.inc.php:596
QueriesGridHandler\updateQuery
updateQuery($args, $request)
Definition: QueriesGridHandler.inc.php:519
QueriesGridHandler\getRowInstance
getRowInstance()
Definition: QueriesGridHandler.inc.php:249
QueriesGridCellProvider
Base class for a cell provider that can retrieve labels for queries.
Definition: QueriesGridCellProvider.inc.php:18
QueryAccessPolicy
Class to control access to queries.
Definition: QueryAccessPolicy.inc.php:18
QueriesGridHandler\$_stageId
$_stageId
Definition: QueriesGridHandler.inc.php:28
QueriesGridHandler\getAssocId
getAssocId()
Definition: QueriesGridHandler.inc.php:92
QueriesGridHandler\addQuery
addQuery($args, $request)
Definition: QueriesGridHandler.inc.php:301
GridHandler\addAction
addAction($action, $position=GRID_ACTION_POSITION_ABOVE)
Definition: GridHandler.inc.php:266
GridHandler\addColumn
addColumn($column)
Definition: GridHandler.inc.php:335
QueryForm
Form for adding/editing a new query.
Definition: QueryForm.inc.php:18
QueryWorkflowStageAccessPolicy
Class to control access to submission workflow stage components related to queries.
Definition: QueryWorkflowStageAccessPolicy.inc.php:19
DAO\getDataChangedEvent
static getDataChangedEvent($elementId=null, $parentElementId=null, $content='')
Definition: DAO.inc.php:647
QueriesGridHandler\openQuery
openQuery($args, $request)
Definition: QueriesGridHandler.inc.php:359
QueriesGridHandler\getCellProvider
getCellProvider()
Definition: QueriesGridHandler.inc.php:100
QueriesGridHandler\getStageId
getStageId()
Definition: QueriesGridHandler.inc.php:76
PKPHandler\getAuthorizedContext
& getAuthorizedContext()
Definition: PKPHandler.inc.php:189
JSONMessage
Class to represent a JSON (Javascript Object Notation) message.
Definition: JSONMessage.inc.php:18
AjaxModal
A modal that retrieves its content from via AJAX.
Definition: AjaxModal.inc.php:18
OrderGridItemsFeature
Implements grid ordering functionality.
Definition: OrderGridItemsFeature.inc.php:19
LinkAction
Base class defining an action that can be performed by the user in the user interface.
Definition: LinkAction.inc.php:22
GridHandler\setTitle
setTitle($title)
Definition: GridHandler.inc.php:215
PKPTemplateManager\getManager
static & getManager($request=null)
Definition: PKPTemplateManager.inc.php:1239
QueriesGridHandler\initFeatures
initFeatures($request, $args)
Definition: QueriesGridHandler.inc.php:219
QueriesGridHandler\getSubmission
getSubmission()
Definition: QueriesGridHandler.inc.php:60
QueryTitleGridColumn
Implements a query tile column.
Definition: QueryTitleGridColumn.inc.php:18
QueriesGridHandler\deleteQuery
deleteQuery($args, $request)
Definition: QueriesGridHandler.inc.php:321
QueriesGridRow
Base class for query grid row definition.
Definition: QueriesGridRow.inc.php:18
QueriesGridHandler\getRequestArgs
getRequestArgs()
Definition: QueriesGridHandler.inc.php:272
QueriesGridHandler\closeQuery
closeQuery($args, $request)
Definition: QueriesGridHandler.inc.php:375
PKPHandler\getAuthorizedContextObject
& getAuthorizedContextObject($assocType)
Definition: PKPHandler.inc.php:174
GridHandler
This class defines basic operations for handling HTML grids. Grids are used to implement a standardiz...
Definition: GridHandler.inc.php:58
QueriesGridHandler
base PKP class to handle query grid requests.
Definition: QueriesGridHandler.inc.php:22
NotificationManager
Definition: NotificationManager.inc.php:19
QueriesGridHandler\setDataElementSequence
setDataElementSequence($request, $rowId, $gridDataElement, $newSequence)
Definition: QueriesGridHandler.inc.php:238
PKPApplication\get
static get()
Definition: PKPApplication.inc.php:235
PKPHandler\addPolicy
addPolicy($authorizationPolicy, $addToTop=false)
Definition: PKPHandler.inc.php:157
QueriesGridHandler\getQuery
getQuery()
Definition: QueriesGridHandler.inc.php:68
QueriesGridHandler\$_request
$_request
Definition: QueriesGridHandler.inc.php:34