diff --git a/Controller/BackendController.php b/Controller/BackendController.php index 0b5cdd1..dc8edc4 100755 --- a/Controller/BackendController.php +++ b/Controller/BackendController.php @@ -21,6 +21,8 @@ use Modules\Tasks\Models\AccountRelationMapper; use Modules\Tasks\Models\PermissionCategory; use Modules\Tasks\Models\TaskElementMapper; use Modules\Tasks\Models\TaskMapper; +use Modules\Tasks\Models\TaskSeen; +use Modules\Tasks\Models\TaskSeenMapper; use Modules\Tasks\Models\TaskStatus; use Modules\Tasks\Views\TaskView; use phpOMS\Account\PermissionType; @@ -110,6 +112,23 @@ final class BackendController extends Controller implements DashboardElementInte $view->data['open'] = $open; + /** @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; + return $view; } @@ -196,6 +215,31 @@ final class BackendController extends Controller implements DashboardElementInte ->where('tags/title/language', $request->header->l11n->language) ->execute(); + if ($task !== 0) { + $taskSeen = TaskSeenMapper::getAll() + ->where('task', (int) $request->getData('id')) + ->where('seenBy', $request->header->account) + ->execute(); + + foreach ($taskSeen as $unseen) { + if ($unseen->isRemindered && ($unseen->reminderAt?->getTimestamp() ?? 0) < $request->header->getRequestTime()) { + $old = clone $unseen; + + $unseen->isRemindered = false; + + $this->updateModel($request->header->account, $old, $unseen, TaskSeenMapper::class, 'task-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()); + } + } + $accountId = $request->header->account; if (!($task->createdBy->id === $accountId diff --git a/Models/NullTaskSeen.php b/Models/NullTaskSeen.php new file mode 100644 index 0000000..b6dbbfd --- /dev/null +++ b/Models/NullTaskSeen.php @@ -0,0 +1,47 @@ +id = $id; + parent::__construct(); + } + + /** + * {@inheritdoc} + */ + public function jsonSerialize() : mixed + { + return ['id' => $this->id]; + } +} diff --git a/Theme/Backend/task-dashboard.tpl.php b/Theme/Backend/task-dashboard.tpl.php index 310fb7b..70d5e9b 100755 --- a/Theme/Backend/task-dashboard.tpl.php +++ b/Theme/Backend/task-dashboard.tpl.php @@ -242,6 +242,10 @@ echo $this->data['nav']->render(); ?> $task) : ++$c; + if (isset($this->data['unread'][$key])) { + continue; + } + $url = UriFactory::build(empty($task->redirect) ? 'task/single?{?}&id=' . $task->id : ('{/app}/' . $task->redirect),