From 3df754ea62fea652643a8f75df30ff2a14304a93 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christopher=20M=C3=BChl?= Date: Wed, 8 Apr 2026 15:29:53 +0200 Subject: [PATCH] feat(04-01): add getUserProjects service, widget data, and Twig data attributes --- Resources/views/widget/heatmap.html.twig | 2 ++ Service/HeatmapService.php | 19 +++++++++++++++++++ Widget/HeatmapWidget.php | 13 +++++++++++-- 3 files changed, 32 insertions(+), 2 deletions(-) diff --git a/Resources/views/widget/heatmap.html.twig b/Resources/views/widget/heatmap.html.twig index 65c11a9..1a5ea2c 100644 --- a/Resources/views/widget/heatmap.html.twig +++ b/Resources/views/widget/heatmap.html.twig @@ -6,6 +6,8 @@
diff --git a/Service/HeatmapService.php b/Service/HeatmapService.php index d70f707..fc5ba48 100644 --- a/Service/HeatmapService.php +++ b/Service/HeatmapService.php @@ -47,4 +47,23 @@ class HeatmapService ]; }, $results); } + + /** + * @return array + */ + public function getUserProjects(User $user): array + { + $qb = $this->repository->createQueryBuilder('t'); + $qb->select('DISTINCT IDENTITY(t.project) as projectId, p.name') + ->join('t.project', 'p') + ->andWhere($qb->expr()->eq('t.user', ':user')) + ->andWhere($qb->expr()->isNotNull('t.end')) + ->setParameter('user', $user) + ->orderBy('p.name', 'ASC'); + + return array_map(fn(array $row) => [ + 'id' => (int) $row['projectId'], + 'name' => $row['name'], + ], $qb->getQuery()->getResult()); + } } diff --git a/Widget/HeatmapWidget.php b/Widget/HeatmapWidget.php index a38e7f1..c9bcd6c 100644 --- a/Widget/HeatmapWidget.php +++ b/Widget/HeatmapWidget.php @@ -4,9 +4,14 @@ namespace KimaiPlugin\KimaiHeatmapBundle\Widget; use App\Widget\Type\AbstractWidget; use App\Widget\WidgetInterface; +use KimaiPlugin\KimaiHeatmapBundle\Service\HeatmapService; -final class HeatmapWidget extends AbstractWidget +class HeatmapWidget extends AbstractWidget { + public function __construct(private readonly HeatmapService $service) + { + } + public function getId(): string { return 'HeatmapWidget'; @@ -34,7 +39,11 @@ final class HeatmapWidget extends AbstractWidget public function getData(array $options = []): mixed { - return null; + $user = $this->getUser(); + + return [ + 'projects' => $this->service->getUserProjects($user), + ]; } public function getTemplateName(): string