Refactor AlertBanner to be ViewComponent (#1555)

This commit is contained in:
Boy132 2025-07-31 23:54:53 +02:00 committed by GitHub
parent bab8ec6e18
commit 71225bd2dc
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 50 additions and 50 deletions

View File

@ -133,7 +133,7 @@ class EditFiles extends Page
try {
return $this->getDaemonFileRepository()->getContent($this->path, config('panel.files.max_edit_size'));
} catch (FileSizeTooLargeException) {
AlertBanner::make()
AlertBanner::make('file_too_large')
->title('<code>' . basename($this->path) . '</code> is too large!')
->body('Max is ' . convert_bytes_to_readable(config('panel.files.max_edit_size')))
->danger()
@ -142,7 +142,7 @@ class EditFiles extends Page
$this->redirect(ListFiles::getUrl(['path' => dirname($this->path)]));
} catch (FileNotFoundException) {
AlertBanner::make()
AlertBanner::make('file_not_found')
->title('<code>' . basename($this->path) . '</code> not found!')
->danger()
->closable()
@ -150,7 +150,7 @@ class EditFiles extends Page
$this->redirect(ListFiles::getUrl(['path' => dirname($this->path)]));
} catch (FileNotEditableException) {
AlertBanner::make()
AlertBanner::make('file_is_directory')
->title('<code>' . basename($this->path) . '</code> is a directory')
->danger()
->closable()
@ -184,15 +184,6 @@ class EditFiles extends Page
->info()
->closable()
->send();
try {
$this->getDaemonFileRepository()->getDirectory('/');
} catch (ConnectionException) {
AlertBanner::make('node_connection_error')
->title('Could not connect to the node!')
->danger()
->send();
}
}
}

View File

@ -430,7 +430,7 @@ class ListFiles extends ListRecords
->property('file', join_paths($path, $data['name']))
->log();
} catch (FileExistsException) {
AlertBanner::make()
AlertBanner::make('file_already_exists')
->title('<code>' . $path . '</code> already exists!')
->danger()
->closable()
@ -471,7 +471,7 @@ class ListFiles extends ListRecords
->log();
} catch (FileExistsException) {
$path = join_paths($this->path, $data['name']);
AlertBanner::make()
AlertBanner::make('folder_already_exists')
->title('<code>' . $path . '</code> already exists!')
->danger()
->closable()

View File

@ -4,25 +4,32 @@ namespace App\Livewire;
use Closure;
use Filament\Notifications\Concerns;
use Filament\Support\Concerns\EvaluatesClosures;
use Illuminate\Support\Str;
use Livewire\Wireable;
use Filament\Support\Components\ViewComponent;
use Illuminate\Contracts\Support\Arrayable;
final class AlertBanner implements Wireable
final class AlertBanner extends ViewComponent implements Arrayable
{
use Concerns\HasBody;
use Concerns\HasIcon;
use Concerns\HasId;
use Concerns\HasStatus;
use Concerns\HasTitle;
use EvaluatesClosures;
protected bool|Closure $closable = false;
public static function make(?string $id = null): AlertBanner
protected string $view = 'livewire.alerts.alert-banner';
protected string $viewIdentifier = 'alert-banner';
public function __construct(string $id)
{
$static = new self();
$static->id($id ?? Str::orderedUuid());
$this->id($id);
}
public static function make(string $id): AlertBanner
{
$static = new self($id);
$static->configure();
return $static;
}
@ -30,7 +37,7 @@ final class AlertBanner implements Wireable
/**
* @return array{id: string, title: ?string, body: ?string, status: ?string, icon: ?string, closeable: bool}
*/
public function toLivewire(): array
public function toArray(): array
{
return [
'id' => $this->getId(),
@ -42,15 +49,18 @@ final class AlertBanner implements Wireable
];
}
public static function fromLivewire(mixed $value): AlertBanner
/**
* @param array{id: string, title: ?string, body: ?string, status: ?string, icon: ?string, closeable: bool} $data
*/
public static function fromArray(array $data): AlertBanner
{
$static = AlertBanner::make($value['id']);
$static = AlertBanner::make($data['id']);
$static->title($value['title']);
$static->body($value['body']);
$static->status($value['status']);
$static->icon($value['icon']);
$static->closable($value['closeable']);
$static->title($data['title']);
$static->body($data['body']);
$static->status($data['status']);
$static->icon($data['icon']);
$static->closable($data['closeable']);
return $static;
}
@ -69,7 +79,7 @@ final class AlertBanner implements Wireable
public function send(): AlertBanner
{
session()->push('alert-banners', $this->toLivewire());
session()->push('alert-banners', $this->toArray());
return $this;
}

View File

@ -2,18 +2,18 @@
namespace App\Livewire;
use Filament\Notifications\Collection;
use Illuminate\Contracts\View\View;
use Livewire\Attributes\On;
use Livewire\Component;
class AlertBannerContainer extends Component
{
/** @var array<AlertBanner> */
public array $alertBanners;
public Collection $alertBanners;
public function mount(): void
{
$this->alertBanners = [];
$this->alertBanners = new Collection();
$this->pullFromSession();
}
@ -21,15 +21,16 @@ class AlertBannerContainer extends Component
public function pullFromSession(): void
{
foreach (session()->pull('alert-banners', []) as $alertBanner) {
$alertBanner = AlertBanner::fromLivewire($alertBanner);
$this->alertBanners[$alertBanner->getId()] = $alertBanner;
$alertBanner = AlertBanner::fromArray($alertBanner);
$this->alertBanners->put($alertBanner->getId(), $alertBanner);
}
}
public function remove(string $id): void
{
$alertBanners = &$this->alertBanners;
unset($alertBanners[$id]);
if ($this->alertBanners->has($id)) {
$this->alertBanners->forget($id);
}
}
public function render(): View

View File

@ -194,7 +194,7 @@ class File extends Model
$message = str('Node connection failed');
}
AlertBanner::make()
AlertBanner::make('files_node_error')
->title('Could not load files!')
->body($message->toString())
->danger()

View File

@ -1,5 +1,5 @@
<div id="alert-banner-container" class="flex flex-col gap-4">
@foreach (array_values($alertBanners) as $alertBanner)
@include('livewire.alerts.alert-banner', ['alertBanner' => $alertBanner])
@foreach ($alertBanners as $alertBanner)
{{ $alertBanner }}
@endforeach
</div>

View File

@ -1,14 +1,12 @@
@props(['alertBanner'])
@php
$icon = $alertBanner->getIcon();
$title = $alertBanner->getTitle();
$body = $alertBanner->getBody();
$icon = $getIcon();
$title = $getTitle();
$body = $getBody();
@endphp
<div class="{{$alertBanner->getColorClasses()}} flex p-4 mt-3 rounded-xl shadow-lg bg-white dark:bg-gray-900 ring-1 ring-gray-950/5 dark:ring-white/10">
<div class="{{$getColorClasses()}} flex p-4 mt-3 rounded-xl shadow-lg bg-white dark:bg-gray-900 ring-1 ring-gray-950/5 dark:ring-white/10">
@if (filled($icon))
<x-filament::icon :icon="$icon" class="h-8 w-8 mr-2" color="{{$alertBanner->getStatus()}}" />
<x-filament::icon :icon="$icon" class="h-8 w-8 mr-2" color="{{$getStatus()}}" />
@endif
<div class="flex flex-col flex-grow">
@ -21,7 +19,7 @@
@endif
</div>
@if ($alertBanner->isCloseable())
<x-filament::icon-button color="gray" icon="tabler-x" wire:click="remove('{{$alertBanner->getID()}}')" />
@if ($isCloseable())
<x-filament::icon-button color="gray" icon="tabler-x" wire:click="remove('{{$getID()}}')" />
@endif
</div>