app->l11nManager, $request, $response); /** @var \phpOMS\Model\Html\Head $head */ $head = $response->data['Content']->head; $head->addAsset(AssetType::CSS, 'Modules/Tasks/Theme/Backend/css/styles.css?v=1.0.0'); $view->setTemplate('/Modules/Tasks/Theme/Backend/task-dashboard'); $view->data['nav'] = $this->app->moduleManager->get('Navigation')->createNavigationMid(1001101001, $request, $response); $mapperQuery = TaskMapper::getAnyRelatedToUser($request->header->account) ->with('tags') ->with('tags/title') ->where('status', TaskStatus::OPEN, '!=') ->where('tags/title/language', $response->header->l11n->language) ->sort('createdAt', OrderType::DESC) ->limit(25); if ($request->getData('ptype') === 'p') { $view->data['tasks'] = $mapperQuery->with('createdBy') ->where('id', $request->getDataInt('id') ?? 0, '<') ->execute(); } elseif ($request->getData('ptype') === 'n') { $view->data['tasks'] = $mapperQuery->with('createdBy') ->where('id', $request->getDataInt('id') ?? 0, '>') ->execute(); } else { $view->data['tasks'] = $mapperQuery->with('createdBy') ->where('id', 0, '>') ->execute(); } $view->data['task_media'] = []; foreach ($view->data['tasks'] as $task) { $view->data['task_media'][$task->id] = TaskMapper::has() ->with('media') ->where('id', $task->id) ->execute(); } $openQuery = new Builder($this->app->dbPool->get(), true); $openQuery->innerJoin(TaskElementMapper::TABLE) ->on(TaskMapper::TABLE . '_d1.' . TaskMapper::PRIMARYFIELD, '=', TaskElementMapper::TABLE . '.task_element_task') ->innerJoin(AccountRelationMapper::TABLE) ->on(TaskElementMapper::TABLE . '.' . TaskElementMapper::PRIMARYFIELD, '=', AccountRelationMapper::TABLE . '.task_account_task_element') ->andWhere(AccountRelationMapper::TABLE . '.task_account_account', '=', $request->header->account); /** @var \Modules\Tasks\Models\Task[] $open */ $open = TaskMapper::getAll() ->with('createdBy') ->with('tags') ->with('tags/title') ->where('tags/title/language', $response->header->l11n->language) ->where('status', TaskStatus::OPEN) ->sort('createdAt', OrderType::DESC) ->query($openQuery) ->execute(); $view->data['open'] = $open; foreach ($view->data['open'] as $task) { $view->data['task_media'][$task->id] = TaskMapper::has() ->with('media') ->where('id', $task->id) ->execute(); } // given // @todo: this should also include forwarded tasks /** @var \Modules\Tasks\Models\Task[] $given */ $given = TaskMapper::getAll() ->with('createdBy') ->with('tags') ->with('tags/title') ->where('tags/title/language', $response->header->l11n->language) ->where('status', TaskStatus::OPEN) ->where('createdBy', $response->header->account, '=') ->sort('createdAt', OrderType::DESC) ->execute(); $view->data['given'] = $given; foreach ($view->data['given'] as $task) { $view->data['task_media'][$task->id] = TaskMapper::has() ->with('media') ->where('id', $task->id) ->execute(); } /** @var \Modules\Tasks\Models\TaskSeen[] $unread */ $unread = TaskSeenMapper::getAll() ->where('task', \array_keys($open), 'in') ->where('seenBy', $request->header->account) ->execute(); $unseen = []; foreach ($unread as $read) { if ($read->isRemindered && ($read->reminderAt?->getTimestamp() ?? 0) > $request->header->getRequestTime()) { continue; } $unseen[$read->task] = true; } $view->data['unread'] = $unseen; foreach ($view->data['unread'] as $task) { $view->data['task_media'][$task->id] = TaskMapper::has() ->with('media') ->where('id', $task->id) ->execute(); } return $view; } /** * {@inheritdoc} * @codeCoverageIgnore */ public function viewDashboard(RequestAbstract $request, ResponseAbstract $response, array $data = []) : RenderableInterface { /** @var \phpOMS\Model\Html\Head $head */ $head = $response->data['Content']->head; $head->addAsset(AssetType::CSS, 'Modules/Tasks/Theme/Backend/css/styles.css?v=1.0.0'); $view = new View($this->app->l11nManager, $request, $response); $view->setTemplate('/Modules/Tasks/Theme/Backend/dashboard-task'); $view->data['nav'] = $this->app->moduleManager->get('Navigation')->createNavigationMid(1001101001, $request, $response); /** @var \Modules\Tasks\Models\Task[] $tasks */ $tasks = TaskMapper::getAnyRelatedToUser($request->header->account) ->with('tags') ->with('tags/title') ->sort('taskElements/createdAt', OrderType::DESC) ->limit(5) ->where('id', 0, '>') ->where('tags/title/language', $response->header->l11n->language) ->execute(); $view->data['tasks'] = $tasks; return $view; } /** * Routing end-point for application behaviour. * * @param RequestAbstract $request Request * @param ResponseAbstract $response Response * @param array $data Generic data * * @return RenderableInterface Returns a renderable object * * @since 1.0.0 * @codeCoverageIgnore */ public function viewTaskView(RequestAbstract $request, ResponseAbstract $response, array $data = []) : RenderableInterface { $view = new TaskView($this->app->l11nManager, $request, $response); /** @var \Model\Setting $profileImage */ $profileImage = $this->app->appSettings->get(names: SettingsEnum::DEFAULT_PROFILE_IMAGE, module: 'Profile'); /** @var \Modules\Media\Models\Media $image */ $image = MediaMapper::get()->where('id', (int) $profileImage->content)->execute(); $view->defaultProfileImage = $image; if (!TaskMapper::hasReadingPermission($request->header->account, (int) $request->getData('id'))) { $response->header->status = RequestStatusCode::R_403; $view->setTemplate('/Web/Backend/Error/403'); $this->app->loadLanguageFromPath( $response->header->l11n->language, __DIR__ . '/../../../Web/Backend/Error/lang/' . $response->header->l11n->language . '.lang.php' ); return $view; } /** @var \phpOMS\Model\Html\Head $head */ $head = $response->data['Content']->head; $head->addAsset(AssetType::CSS, 'Modules/Tasks/Theme/Backend/css/styles.css?v=1.0.0'); /** @var \Modules\Tasks\Models\Task $task */ $task = TaskMapper::get() ->with('createdBy') ->with('media') ->with('tags') ->with('tags/title') ->with('taskElements') ->with('taskElements/createdBy') ->with('taskElements/media') ->with('taskElements/accRelation') ->with('taskElements/accRelation/relation') ->where('id', (int) $request->getData('id')) ->where('tags/title/language', $request->header->l11n->language) ->execute(); $accountId = $request->header->account; if (!($task->createdBy->id === $accountId || $task->isCCAccount($accountId) || $task->isToAccount($accountId)) && !$this->app->accountManager->get($accountId)->hasPermission( PermissionType::READ, $this->app->unitId, $this->app->appId, self::NAME, PermissionCategory::TASK, $task->id) ) { $view->setTemplate('/Web/Backend/Error/403_inline'); $response->header->status = RequestStatusCode::R_403; return $view; } $reminderStatus = []; // Set task as seen if ($task->id !== 0) { /** @var \Modules\Tasks\Models\TaskSeen[] $taskSeen */ $taskSeen = TaskSeenMapper::getAll() ->with('reminderBy') ->where('task', $task->id) ->where('seenBy', $request->header->account) ->execute(); foreach ($taskSeen as $unseen) { // Shows all reminders if ($unseen->reminderBy !== null && ($unseen->reminderAt?->getTimestamp() ?? 0) < $request->header->getRequestTime() && ($unseen->reminderAt?->getTimestamp() ?? 0) > ($unseen->seenAt?->getTimestamp() ?? 0) - 300 ) { $reminderStatus[] = $unseen; if ($unseen->isRemindered) { $new = clone $unseen; $new->seenAt = new \DateTime('now'); $new->isRemindered = false; $this->updateModel($request->header->account, $unseen, $new, TaskSeenMapper::class, 'reminder_seen', $request->getOrigin()); } } } if (empty($taskSeen)) { $taskSeen = new TaskSeen(); $taskSeen->seenBy = $request->header->account; $taskSeen->task = (int) $request->getData('id'); $this->createModel($request->header->account, $taskSeen, TaskSeenMapper::class, 'task_seen', $request->getOrigin()); } } $view->data['reminder'] = $reminderStatus; $view->setTemplate('/Modules/Tasks/Theme/Backend/task-single'); $view->data['task'] = $task; $view->data['nav'] = $this->app->moduleManager->get('Navigation')->createNavigationMid(1001101001, $request, $response); $accGrpSelector = new \Modules\Profile\Theme\Backend\Components\AccountGroupSelector\BaseView($this->app->l11nManager, $request, $response); $view->data['accGrpSelector'] = $accGrpSelector; $editor = new \Modules\Editor\Theme\Backend\Components\Editor\BaseView($this->app->l11nManager, $request, $response); $view->data['editor'] = $editor; return $view; } /** * Routing end-point for application behaviour. * * @param RequestAbstract $request Request * @param ResponseAbstract $response Response * @param array $data Generic data * * @return RenderableInterface Returns a renderable object * * @since 1.0.0 * @codeCoverageIgnore */ public function viewTaskCreate(RequestAbstract $request, ResponseAbstract $response, array $data = []) : RenderableInterface { $view = new View($this->app->l11nManager, $request, $response); $view->setTemplate('/Modules/Tasks/Theme/Backend/task-create'); $view->data['nav'] = $this->app->moduleManager->get('Navigation')->createNavigationMid(1001101001, $request, $response); $accGrpSelector = new \Modules\Profile\Theme\Backend\Components\AccountGroupSelector\BaseView($this->app->l11nManager, $request, $response); $view->data['accGrpSelector'] = $accGrpSelector; $editor = new \Modules\Editor\Theme\Backend\Components\Editor\BaseView($this->app->l11nManager, $request, $response); $view->data['editor'] = $editor; return $view; } /** * Routing end-point for application behaviour. * * @param RequestAbstract $request Request * @param ResponseAbstract $response Response * @param array $data Generic data * * @return RenderableInterface Returns a renderable object * * @since 1.0.0 * @codeCoverageIgnore */ public function viewTaskAnalysis(RequestAbstract $request, ResponseAbstract $response, array $data = []) : RenderableInterface { $view = new View($this->app->l11nManager, $request, $response); $view->setTemplate('/Modules/Tasks/Theme/Backend/task-analysis'); $view->data['nav'] = $this->app->moduleManager->get('Navigation')->createNavigationMid(1001101001, $request, $response); return $view; } /** * Count unread messages * * @param int $account Account id * * @return int Returns the amount of unread tasks * * @since 1.0.0 */ public function openNav(int $account) : int { return TaskMapper::countUnread($account); } }