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 $currentPage = 1;
public $logsPerPage = 100;
public $selectedExecution = null;
public $isPollingActive = false;
public function getListeners()
@@ -74,12 +77,13 @@ class Executions extends Component
$this->selectedExecution = null;
$this->currentPage = 1;
$this->isPollingActive = false;
return;
}
$this->selectedKey = $key;
$this->selectedExecution = $this->task->executions()->find($key);
$this->currentPage = 1;
// Start polling if task is running
if ($this->selectedExecution && $this->selectedExecution->status === 'running') {
$this->isPollingActive = true;
@@ -103,24 +107,33 @@ class Executions extends Component
public function getLogLinesProperty()
{
if (!$this->selectedExecution) {
if (! $this->selectedExecution) {
return collect();
}
if (!$this->selectedExecution->message) {
if (! $this->selectedExecution->message) {
return collect(['Waiting for task output...']);
}
$lines = collect(explode("\n", $this->selectedExecution->message));
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()
{
if (!$this->selectedExecution || !$this->selectedExecution->message) {
if (! $this->selectedExecution || ! $this->selectedExecution->message) {
return false;
}
$lines = collect(explode("\n", $this->selectedExecution->message));
return $lines->count() > ($this->currentPage * $this->logsPerPage);
}

View File

@@ -1,18 +1,17 @@
<div class="flex flex-col gap-4"
x-data="{
init() {
let interval;
$wire.$watch('isPollingActive', value => {
if (value) {
interval = setInterval(() => {
$wire.polling();
}, 1000);
} else {
if (interval) clearInterval(interval);
}
});
}
}">
<div class="flex flex-col gap-4" x-data="{
init() {
let interval;
$wire.$watch('isPollingActive', value => {
if (value) {
interval = setInterval(() => {
$wire.polling();
}, 1000);
} else {
if (interval) clearInterval(interval);
}
});
}
}">
@forelse($executions as $execution)
<a wire:click="selectTask({{ data_get($execution, 'id') }})" @class([
'flex flex-col border-l-2 transition-colors p-4 cursor-pointer',
@@ -45,15 +44,21 @@
@endif
@if ($this->logLines->isNotEmpty())
<div>
<pre class="whitespace-pre-wrap">@foreach($this->logLines as $line){{ $line }}
@endforeach</pre>
@if ($this->hasMoreLogs())
<div class="flex justify-center mt-4">
<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 Logs
</button>
</div>
@endif
<pre class="whitespace-pre-wrap">
@foreach ($this->logLines as $line)
{{ $line }}
@endforeach
</pre>
<div class="flex gap-2">
@if ($this->hasMoreLogs())
<x-forms.button wire:click.prevent="loadMoreLogs" isHighlighted>
Load More
</x-forms.button>
@endif
<x-forms.button wire:click.prevent="downloadLogs" isHighlighted>
Download
</x-forms.button>
</div>
</div>
@else
<div>No output was recorded for this execution.</div>