From 0384a274e584d99f818a50d5c467caf3f3435623 Mon Sep 17 00:00:00 2001 From: Sukhwinder Dhillon Date: Tue, 11 Feb 2025 13:55:44 +0100 Subject: [PATCH] Schedule detail: Introduce current time indicator --- library/Notifications/Widget/Timeline.php | 38 ++++++++++++++++++++++- public/css/timeline.less | 38 ++++++++++++++++++++++- 2 files changed, 74 insertions(+), 2 deletions(-) diff --git a/library/Notifications/Widget/Timeline.php b/library/Notifications/Widget/Timeline.php index 49083cc6..0dd310fc 100644 --- a/library/Notifications/Widget/Timeline.php +++ b/library/Notifications/Widget/Timeline.php @@ -12,9 +12,11 @@ use Icinga\Module\Notifications\Widget\TimeGrid\EntryProvider; use Icinga\Module\Notifications\Widget\TimeGrid\GridStep; use Icinga\Module\Notifications\Widget\TimeGrid\Timescale; +use Icinga\Module\Notifications\Widget\TimeGrid\Util; use Icinga\Module\Notifications\Widget\Timeline\Entry; use Icinga\Module\Notifications\Widget\Timeline\MinimalGrid; use Icinga\Module\Notifications\Widget\Timeline\Rotation; +use IntlDateFormatter; use ipl\Html\Attributes; use ipl\Html\BaseHtmlElement; use ipl\Html\HtmlElement; @@ -23,6 +25,7 @@ use ipl\Web\Style; use ipl\Web\Url; use ipl\Web\Widget\Icon; +use Locale; use SplObjectStorage; use Traversable; @@ -314,8 +317,41 @@ protected function assemble() ) ); + $dateFormatter = new IntlDateFormatter( + Locale::getDefault(), + IntlDateFormatter::NONE, + IntlDateFormatter::SHORT + ); + + $now = new DateTime(); + $currentTime = new HtmlElement( + 'div', + new Attributes(['class' => 'time-hand']), + new HtmlElement( + 'div', + new Attributes(['class' => 'now', 'title' => $dateFormatter->format($now)]), + Text::create($this->translate('now')) + ) + ); + + $now = Util::roundToNearestThirtyMinute($now); + + $this->getStyle()->addFor($currentTime, [ + '--timeStartColumn' => + $now->format('G') * 2 // 2 columns per hour + + ($now->format('i') >= 30 ? 1 : 0) // 1 column for the half hour + + 1 // CSS starts counting columns from 1, not zero + ]); + + $clock = new HtmlElement( + 'div', + new Attributes(['class' => 'clock']), + new HtmlElement('div', new Attributes(['class' => 'current-day']), $currentTime) + ); + $this->getGrid() - ->addHtml(new Timescale($this->days, $this->getStyle())); + ->addHtml(new Timescale($this->days, $this->getStyle())) + ->addHtml($clock); } $this->addHtml( diff --git a/public/css/timeline.less b/public/css/timeline.less index 94edbbb0..7344cb06 100644 --- a/public/css/timeline.less +++ b/public/css/timeline.less @@ -15,7 +15,7 @@ .time-grid-header { box-sizing: border-box; position: sticky; - z-index: 1; + z-index: 2; // overlap the .clock .time-hand top: 0; } @@ -35,6 +35,7 @@ .overlay .entry { margin-top: 1em; margin-bottom: 1em; + z-index: 2; // overlap the .clock .time-hand .title { height: 100%; @@ -95,6 +96,34 @@ } } } + + .clock { + display: grid; + grid-template-columns: repeat(var(--primaryColumns), 1fr); + grid-area: ~"3 / 2 / 4 / 3"; + border-top: 1px solid transparent; // left not required, otherwise the .time-hand is not aligned properly + + .current-day { + display: grid; + grid-template-columns: repeat(var(--columnsPerStep), 1fr); + grid-area: ~"1 / 1 / 2 / 2"; + + .time-hand { + grid-area: ~"1 / var(--timeStartColumn) / 2 / calc(var(--timeStartColumn) + 1)"; + display: flex; + align-items: flex-end; + width: 1px; + border-left: 1px solid red; + z-index: 1; + + .now { + .rounded-corners(); + padding: 0 .25em; + transform: translate(-50%, 50%); + } + } + } + } } } @@ -151,6 +180,13 @@ background: @gray-lighter; } } + + .clock .now { + background-color: @gray-light; + font-size: 0.75em; + color: red; + cursor: pointer; + } } .timeline.minimal-layout .empty-notice {