17 import(
'lib.pkp.classes.controllers.grid.GridHandler');
20 import(
'lib.pkp.classes.linkAction.request.AjaxModal');
34 parent::__construct();
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'));
39 array(ROLE_ID_MANAGER, ROLE_ID_SUB_EDITOR, ROLE_ID_ASSISTANT),
40 array(
'openQuery',
'closeQuery',
'saveSequence'));
42 array(ROLE_ID_MANAGER),
79 return ASSOC_TYPE_SUBMISSION;
95 import(
'lib.pkp.controllers.grid.queries.QueriesGridCellProvider');
111 function authorize($request, &$args, $roleAssignments) {
112 $this->_stageId = (int) $request->getUserVar(
'stageId');
114 $this->_request = $request;
116 if ($request->getUserVar(
'queryId')) {
117 import(
'lib.pkp.classes.security.authorization.QueryAccessPolicy');
120 import(
'lib.pkp.classes.security.authorization.QueryWorkflowStageAccessPolicy');
124 return parent::authorize($request, $args, $roleAssignments);
131 parent::initialize($request, $args);
132 import(
'lib.pkp.controllers.grid.queries.QueriesGridCellProvider');
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');
142 default: assert(
false);
147 LOCALE_COMPONENT_PKP_SUBMISSION,
148 LOCALE_COMPONENT_PKP_USER,
149 LOCALE_COMPONENT_PKP_EDITOR
153 import(
'lib.pkp.controllers.grid.queries.QueryTitleGridColumn');
159 'submission.query.from',
163 array(
'html' => TRUE,
'width' => 20)
167 'submission.query.lastReply',
171 array(
'html' => TRUE,
'width' => 20)
175 'submission.query.replies',
179 array(
'width' => 10,
'alignment' => COLUMN_ALIGNMENT_CENTER)
185 'submission.query.closed',
187 'controllers/grid/common/cell/selectStatusCell.tpl',
189 array(
'width' => 10,
'alignment' => COLUMN_ALIGNMENT_CENTER)
193 $router = $request->getRouter();
197 $router->url($request,
null,
null,
'addQuery',
null, $this->getRequestArgs()),
198 __(
'grid.action.addQuery'),
201 __(
'grid.action.addQuery'),
214 $features = parent::initFeatures($request, $args);
216 import(
'lib.pkp.classes.controllers.grid.feature.OrderGridItemsFeature');
226 return $row->getSequence();
235 $query->setSequence($newSequence);
236 $queryDao->updateObject($query);
244 import(
'lib.pkp.controllers.grid.queries.QueriesGridRow');
257 import(
'lib.pkp.controllers.grid.queries.QueriesAccessHelper');
276 function loadData($request, $filter =
null) {
278 return $queryDao->getByAssoc(
295 function addQuery($args, $request) {
298 import(
'lib.pkp.controllers.grid.queries.form.QueryForm');
305 $queryForm->initData();
306 return new JSONMessage(
true, $queryForm->fetch($request,
null,
false, $this->getRequestArgs()));
317 if (!$request->checkCSRF() || !$query || !$this->getAccessHelper()->getCanDelete($query->getId()))
return new JSONMessage(
false);
320 $queryDao->deleteObject($query);
323 $notificationDao->deleteByAssoc(ASSOC_TYPE_QUERY, $query->getId());
325 if ($this->
getStageId() == WORKFLOW_STAGE_ID_EDITING ||
326 $this->
getStageId() == WORKFLOW_STAGE_ID_PRODUCTION) {
330 $notificationMgr->updateNotification(
333 NOTIFICATION_TYPE_ASSIGN_COPYEDITOR,
334 NOTIFICATION_TYPE_AWAITING_COPYEDITS,
335 NOTIFICATION_TYPE_ASSIGN_PRODUCTIONUSER,
336 NOTIFICATION_TYPE_AWAITING_REPRESENTATIONS,
339 ASSOC_TYPE_SUBMISSION,
358 $query->setIsClosed(
false);
359 $queryDao->updateObject($query);
374 $query->setIsClosed(
true);
375 $queryDao->updateObject($query);
384 return 'grid.queries.QueryNotesGridHandler';
395 $router = $request->getRouter();
396 $user = $request->getUser();
397 $context = $request->getContext();
399 $actionArgs = array_merge($this->
getRequestArgs(), array(
'queryId' => $query->getId()));
403 import(
'lib.pkp.classes.linkAction.request.AjaxModal');
407 $router->url($request,
null,
null,
'editQuery',
null, $actionArgs),
408 __(
'grid.action.updateQuery'),
411 __(
'grid.action.edit'),
418 import(
'lib.pkp.classes.linkAction.request.RemoteActionConfirmationModal');
422 $request->getSession(),
423 __(
'submission.query.leaveQuery.confirm'),
424 __(
'submission.query.leaveQuery'),
425 $router->url($request,
null,
null,
'leaveQuery',
null, $actionArgs),
428 __(
'submission.query.leaveQuery'),
434 $showLeaveQueryButton =
true;
436 $showLeaveQueryButton =
false;
440 $templateMgr->assign(array(
444 'editAction' => $editAction,
445 'leaveQueryLinkAction' => $leaveQueryLinkAction,
446 'showLeaveQueryButton' => $showLeaveQueryButton,
448 return new JSONMessage(
true, $templateMgr->fetch(
'controllers/grid/queries/readQuery.tpl'));
461 $context = $request->getContext();
462 $user = $request->getUser();
464 $participants = array();
465 foreach ($queryDao->getParticipantIds($query->getId()) as $userId) {
466 $participants[] = $userDao->getById($userId);
470 $templateMgr->assign(
'participants', $participants);
473 $showLeaveQueryButton =
true;
475 $showLeaveQueryButton =
false;
478 $json->setStatus(
true);
479 $json->setContent($templateMgr->fetch(
'controllers/grid/queries/participants.tpl'));
480 $json->setAdditionalAttributes(array(
'showLeaveQueryButton' => $showLeaveQueryButton));
495 import(
'lib.pkp.controllers.grid.queries.form.QueryForm');
503 $queryForm->initData();
504 return new JSONMessage(
true, $queryForm->fetch($request,
null,
false, $this->getRequestArgs()));
517 import(
'lib.pkp.controllers.grid.queries.form.QueryForm');
525 $queryForm->readInputData();
527 if ($queryForm->validate()) {
528 $queryForm->execute();
530 if ($this->
getStageId() == WORKFLOW_STAGE_ID_EDITING ||
531 $this->
getStageId() == WORKFLOW_STAGE_ID_PRODUCTION) {
535 $notificationMgr->updateNotification(
538 NOTIFICATION_TYPE_ASSIGN_COPYEDITOR,
539 NOTIFICATION_TYPE_AWAITING_COPYEDITS,
540 NOTIFICATION_TYPE_ASSIGN_PRODUCTIONUSER,
541 NOTIFICATION_TYPE_AWAITING_REPRESENTATIONS,
544 ASSOC_TYPE_SUBMISSION,
558 array(
'queryId' => $query->getId())
571 $queryId = $args[
'queryId'];
572 $user = $request->getUser();
573 $context = $request->getContext();
576 $queryDao->removeParticipant($queryId, $user->getId());
578 $json->setEvent(
'user-left-discussion');
592 if (!in_array(ROLE_ID_MANAGER, $userRoles)) {
596 $participantIds = $queryDao->getParticipantIds($queryId);
597 if (count($participantIds) < 3) {
601 return in_array($user->getId(), $participantIds);