diff --git a/app/Enums/BackupStatus.php b/app/Enums/BackupStatus.php new file mode 100644 index 000000000..077fca54f --- /dev/null +++ b/app/Enums/BackupStatus.php @@ -0,0 +1,37 @@ + 'tabler-circle-dashed', + self::Successful => 'tabler-circle-check', + self::Failed => 'tabler-circle-x', + }; + } + + public function getColor(): string + { + return match ($this) { + self::InProgress => 'primary', + self::Successful => 'success', + self::Failed => 'danger', + }; + } + + public function getLabel(): string + { + return str($this->value)->headline(); + } +} diff --git a/app/Filament/Server/Resources/BackupResource/Pages/ListBackups.php b/app/Filament/Server/Resources/BackupResource/Pages/ListBackups.php index 6377d6d06..b6a9d3a6c 100644 --- a/app/Filament/Server/Resources/BackupResource/Pages/ListBackups.php +++ b/app/Filament/Server/Resources/BackupResource/Pages/ListBackups.php @@ -2,6 +2,7 @@ namespace App\Filament\Server\Resources\BackupResource\Pages; +use App\Enums\BackupStatus; use App\Enums\ServerState; use App\Facades\Activity; use App\Filament\Server\Resources\BackupResource; @@ -70,13 +71,14 @@ class ListBackups extends ListRecords ->label('Created') ->since() ->sortable(), - IconColumn::make('is_successful') - ->label('Successful') - ->boolean(), + TextColumn::make('status') + ->label('Status') + ->badge(), IconColumn::make('is_locked') ->visibleFrom('md') ->label('Lock Status') - ->icon(fn (Backup $backup) => !$backup->is_locked ? 'tabler-lock-open' : 'tabler-lock'), + ->trueIcon('tabler-lock') + ->falseIcon('tabler-lock-open'), ]) ->actions([ ActionGroup::make([ @@ -84,12 +86,14 @@ class ListBackups extends ListRecords ->icon(fn (Backup $backup) => !$backup->is_locked ? 'tabler-lock' : 'tabler-lock-open') ->authorize(fn () => auth()->user()->can(Permission::ACTION_BACKUP_DELETE, $server)) ->label(fn (Backup $backup) => !$backup->is_locked ? 'Lock' : 'Unlock') - ->action(fn (BackupController $backupController, Backup $backup, Request $request) => $backupController->toggleLock($request, $server, $backup)), + ->action(fn (BackupController $backupController, Backup $backup, Request $request) => $backupController->toggleLock($request, $server, $backup)) + ->visible(fn (Backup $backup) => $backup->status === BackupStatus::Successful), Action::make('download') ->color('primary') ->icon('tabler-download') ->authorize(fn () => auth()->user()->can(Permission::ACTION_BACKUP_DOWNLOAD, $server)) - ->url(fn (DownloadLinkService $downloadLinkService, Backup $backup, Request $request) => $downloadLinkService->handle($backup, $request->user()), true), + ->url(fn (DownloadLinkService $downloadLinkService, Backup $backup, Request $request) => $downloadLinkService->handle($backup, $request->user()), true) + ->visible(fn (Backup $backup) => $backup->status === BackupStatus::Successful), Action::make('restore') ->color('success') ->icon('tabler-folder-up') @@ -138,12 +142,14 @@ class ListBackups extends ListRecords return Notification::make() ->title('Restoring Backup') ->send(); - }), + }) + ->visible(fn (Backup $backup) => $backup->status === BackupStatus::Successful), DeleteAction::make('delete') - ->disabled(fn (Backup $backup): bool => $backup->is_locked) + ->disabled(fn (Backup $backup) => $backup->is_locked) ->modalDescription(fn (Backup $backup) => 'Do you wish to delete, ' . $backup->name . '?') ->modalSubmitActionLabel('Delete Backup') - ->action(fn (BackupController $backupController, Backup $backup, Request $request) => $backupController->delete($request, $server, $backup)), + ->action(fn (BackupController $backupController, Backup $backup, Request $request) => $backupController->delete($request, $server, $backup)) + ->visible(fn (Backup $backup) => $backup->status !== BackupStatus::InProgress), ]), ]); } @@ -180,7 +186,6 @@ class ListBackups extends ListRecords ->body($backup->name . ' created.') ->success() ->send(); - } catch (HttpException $e) { return Notification::make() ->danger() diff --git a/app/Models/Backup.php b/app/Models/Backup.php index b4f807a4f..e07d19948 100644 --- a/app/Models/Backup.php +++ b/app/Models/Backup.php @@ -7,6 +7,8 @@ use App\Traits\HasValidation; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use App\Eloquent\BackupQueryBuilder; +use App\Enums\BackupStatus; +use Illuminate\Database\Eloquent\Casts\Attribute; use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Database\Eloquent\Relations\BelongsTo; @@ -23,6 +25,7 @@ use Illuminate\Database\Eloquent\Relations\BelongsTo; * @property int $bytes * @property string|null $upload_id * @property \Carbon\CarbonImmutable|null $completed_at + * @property BackupStatus $status * @property \Carbon\CarbonImmutable $created_at * @property \Carbon\CarbonImmutable $updated_at * @property \Carbon\CarbonImmutable|null $deleted_at @@ -79,6 +82,13 @@ class Backup extends Model implements Validatable ]; } + protected function status(): Attribute + { + return Attribute::make( + get: fn () => !$this->completed_at ? BackupStatus::InProgress : ($this->is_successful ? BackupStatus::Successful : BackupStatus::Failed), + ); + } + public function server(): BelongsTo { return $this->belongsTo(Server::class);