feat: able to download schedule task logs

This commit is contained in:
Andras Bacsai
2024-12-09 11:36:39 +01:00
parent e0aaed892d
commit 6b936a3e92
2 changed files with 46 additions and 28 deletions

View File

@@ -25,8 +25,11 @@ class Executions extends Component
public ?string $serverTimezone = null; public ?string $serverTimezone = null;
public $currentPage = 1; public $currentPage = 1;
public $logsPerPage = 100; public $logsPerPage = 100;
public $selectedExecution = null; public $selectedExecution = null;
public $isPollingActive = false; public $isPollingActive = false;
public function getListeners() public function getListeners()
@@ -74,6 +77,7 @@ class Executions extends Component
$this->selectedExecution = null; $this->selectedExecution = null;
$this->currentPage = 1; $this->currentPage = 1;
$this->isPollingActive = false; $this->isPollingActive = false;
return; return;
} }
$this->selectedKey = $key; $this->selectedKey = $key;
@@ -103,24 +107,33 @@ class Executions extends Component
public function getLogLinesProperty() public function getLogLinesProperty()
{ {
if (!$this->selectedExecution) { if (! $this->selectedExecution) {
return collect(); return collect();
} }
if (!$this->selectedExecution->message) { if (! $this->selectedExecution->message) {
return collect(['Waiting for task output...']); return collect(['Waiting for task output...']);
} }
$lines = collect(explode("\n", $this->selectedExecution->message)); $lines = collect(explode("\n", $this->selectedExecution->message));
return $lines->take($this->currentPage * $this->logsPerPage); return $lines->take($this->currentPage * $this->logsPerPage);
} }
public function downloadLogs()
{
return response()->streamDownload(function () {
echo $this->selectedExecution->message;
}, 'task-execution-'.$this->selectedExecution->id.'.log');
}
public function hasMoreLogs() public function hasMoreLogs()
{ {
if (!$this->selectedExecution || !$this->selectedExecution->message) { if (! $this->selectedExecution || ! $this->selectedExecution->message) {
return false; return false;
} }
$lines = collect(explode("\n", $this->selectedExecution->message)); $lines = collect(explode("\n", $this->selectedExecution->message));
return $lines->count() > ($this->currentPage * $this->logsPerPage); return $lines->count() > ($this->currentPage * $this->logsPerPage);
} }

View File

@@ -1,5 +1,4 @@
<div class="flex flex-col gap-4" <div class="flex flex-col gap-4" x-data="{
x-data="{
init() { init() {
let interval; let interval;
$wire.$watch('isPollingActive', value => { $wire.$watch('isPollingActive', value => {
@@ -12,7 +11,7 @@
} }
}); });
} }
}"> }">
@forelse($executions as $execution) @forelse($executions as $execution)
<a wire:click="selectTask({{ data_get($execution, 'id') }})" @class([ <a wire:click="selectTask({{ data_get($execution, 'id') }})" @class([
'flex flex-col border-l-2 transition-colors p-4 cursor-pointer', 'flex flex-col border-l-2 transition-colors p-4 cursor-pointer',
@@ -45,15 +44,21 @@
@endif @endif
@if ($this->logLines->isNotEmpty()) @if ($this->logLines->isNotEmpty())
<div> <div>
<pre class="whitespace-pre-wrap">@foreach($this->logLines as $line){{ $line }} <pre class="whitespace-pre-wrap">
@endforeach</pre> @foreach ($this->logLines as $line)
{{ $line }}
@endforeach
</pre>
<div class="flex gap-2">
@if ($this->hasMoreLogs()) @if ($this->hasMoreLogs())
<div class="flex justify-center mt-4"> <x-forms.button wire:click.prevent="loadMoreLogs" isHighlighted>
<button wire:click="loadMoreLogs" class="px-4 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-md hover:bg-gray-50"> Load More
Load More Logs </x-forms.button>
</button>
</div>
@endif @endif
<x-forms.button wire:click.prevent="downloadLogs" isHighlighted>
Download
</x-forms.button>
</div>
</div> </div>
@else @else
<div>No output was recorded for this execution.</div> <div>No output was recorded for this execution.</div>