diff --git a/Modules/Helpdesk/Livewire/TicketTimer.php b/Modules/Helpdesk/Livewire/TicketTimer.php index db87ea80..28157b5c 100644 --- a/Modules/Helpdesk/Livewire/TicketTimer.php +++ b/Modules/Helpdesk/Livewire/TicketTimer.php @@ -1,5 +1,7 @@ refreshActiveTimer(); } + /** + * Refresh the timer every poll cycle while the timer is running. + */ + public function refreshTimer(): void + { + $this->refreshActiveTimer(); + } + /** * Start a database-backed timer for the current authenticated user. * @@ -61,7 +71,7 @@ class TicketTimer extends Component 'ended_at' => null, 'logged_at' => $startedAt, ]); - } catch (QueryException $exception) { + } catch (QueryException) { throw ValidationException::withMessages([ 'timer' => 'You already have a running timer.', ]); @@ -94,7 +104,6 @@ class TicketTimer extends Component $endedAt = Carbon::now(); $description = trim($this->description) !== '' ? trim($this->description) : $timer->description; $seconds = max(1, (int) $timer->started_at->diffInSeconds($endedAt)); - $minutes = (int) ceil($seconds / 60); $timer->forceFill([ @@ -122,6 +131,22 @@ class TicketTimer extends Component $this->dispatch('timer-ended'); } + /** + * Get the currently elapsed timer duration. + */ + public function getElapsedTimeProperty(): string + { + return gmdate('H:i:s', $this->elapsedSeconds); + } + + /** + * Determine whether the current user has a running timer. + */ + public function getIsRunningProperty(): bool + { + return $this->activeTimer instanceof TicketTimeLog; + } + /** * Render the timer view. */ @@ -145,8 +170,9 @@ class TicketTimer extends Component } $this->activeTimer = $this->activeUserTimerQuery($user)->first(); + $this->elapsedSeconds = $this->activeTimer instanceof TicketTimeLog - ? $this->activeTimer->started_at->diffInSeconds(Carbon::now()) + ? max(0, (int) $this->activeTimer->started_at->diffInSeconds(Carbon::now())) : 0; } diff --git a/Modules/Helpdesk/Resources/views/views/livewire/ticket-timer.blade.php b/Modules/Helpdesk/Resources/views/views/livewire/ticket-timer.blade.php new file mode 100644 index 00000000..6d1522b6 --- /dev/null +++ b/Modules/Helpdesk/Resources/views/views/livewire/ticket-timer.blade.php @@ -0,0 +1,88 @@ +
isRunning) wire:poll.1s="refreshTimer" @endif + class="rounded-xl border border-emerald-700/70 bg-emerald-950/40 p-4 text-emerald-50 shadow-sm" + data-helpdesk-ticket-timer +> +
+
+ + + + +
+

Work timer

+ +

+ Start a user-specific timer. It remains active if the browser is closed. +

+
+
+ + @if ($this->isRunning) +
+
+ Running +
+ +
+ {{ $this->elapsedTime }} +
+
+ @endif +
+ + @if ($message) +
+ {{ $message }} +
+ @endif + +
+ + + +
+ + @error('timer') +

{{ $message }}

+ @enderror + +
+ @if ($this->isRunning) + + @else + + @endif +
+
diff --git a/Modules/Helpdesk/Resources/views/views/partials/ticket-time-timer.blade.php b/Modules/Helpdesk/Resources/views/views/partials/ticket-time-timer.blade.php new file mode 100644 index 00000000..6fa54a66 --- /dev/null +++ b/Modules/Helpdesk/Resources/views/views/partials/ticket-time-timer.blade.php @@ -0,0 +1,3 @@ +@can('update', $ticket) + @livewire('Modules\\Helpdesk\\Livewire\\TicketTimer', ['ticket' => $ticket], key('helpdesk-ticket-timer-'.$ticket->getKey())) +@endcan