From 636279c6eb7a9a8582abc58a3fd41e07a2db064a Mon Sep 17 00:00:00 2001 From: MartinOscar <40749467+rmartinoscar@users.noreply.github.com> Date: Thu, 3 Apr 2025 03:44:51 +0200 Subject: [PATCH] Add `FileNotEditableException` (#1135) * Add `FileNotEditableException` * Send `Notification` instead of Throwing * Remove useless `function` * Make them all `AlertBanner` --- .../Repository/FileNotEditableException.php | 7 +++ .../FileResource/Pages/EditFiles.php | 58 ++++++++++++++----- .../Daemon/DaemonFileRepository.php | 5 ++ resources/views/errors/400.blade.php | 8 +++ 4 files changed, 64 insertions(+), 14 deletions(-) create mode 100644 app/Exceptions/Repository/FileNotEditableException.php create mode 100644 resources/views/errors/400.blade.php diff --git a/app/Exceptions/Repository/FileNotEditableException.php b/app/Exceptions/Repository/FileNotEditableException.php new file mode 100644 index 000000000..7963161b3 --- /dev/null +++ b/app/Exceptions/Repository/FileNotEditableException.php @@ -0,0 +1,7 @@ + */ public ?array $data = []; @@ -66,11 +70,9 @@ class EditFiles extends Page ->authorize(fn () => auth()->user()->can(Permission::ACTION_FILE_UPDATE, $server)) ->icon('tabler-device-floppy') ->keyBindings('mod+shift+s') - ->action(function (DaemonFileRepository $fileRepository) use ($server) { - $data = $this->form->getState(); + ->action(function (array $data) { - $fileRepository - ->setServer($server) + $this->getDaemonFileRepository() ->putContent($this->path, $data['editor'] ?? ''); Activity::event('server:file.write') @@ -90,11 +92,9 @@ class EditFiles extends Page ->authorize(fn () => auth()->user()->can(Permission::ACTION_FILE_UPDATE, $server)) ->icon('tabler-device-floppy') ->keyBindings('mod+s') - ->action(function (DaemonFileRepository $fileRepository) use ($server) { - $data = $this->form->getState(); + ->action(function (array $data) { - $fileRepository - ->setServer($server) + $this->getDaemonFileRepository() ->putContent($this->path, $data['editor'] ?? ''); Activity::event('server:file.write') @@ -123,15 +123,36 @@ class EditFiles extends Page ->afterStateUpdated(fn ($state) => $this->dispatch('setLanguage', lang: $state)) ->default(fn () => EditorLanguages::fromWithAlias(pathinfo($this->path, PATHINFO_EXTENSION))), MonacoEditor::make('editor') - ->label('') - ->placeholderText('') - ->default(function (DaemonFileRepository $fileRepository) use ($server) { + ->hiddenLabel() + ->showPlaceholder(false) + ->default(function () { try { - return $fileRepository - ->setServer($server) + return $this->getDaemonFileRepository() ->getContent($this->path, config('panel.files.max_edit_size')); + } catch (FileSizeTooLargeException) { + AlertBanner::make() + ->title('File too large!') + ->body('' . $this->path . ' Max is ' . convert_bytes_to_readable(config('panel.files.max_edit_size'))) + ->danger() + ->closable() + ->send(); + $this->redirect(ListFiles::getUrl()); } catch (FileNotFoundException) { - abort(404, $this->path . ' not found.'); + AlertBanner::make() + ->title('File Not found!') + ->body('' . $this->path . '') + ->danger() + ->closable() + ->send(); + $this->redirect(ListFiles::getUrl()); + } catch (FileNotEditableException) { + AlertBanner::make() + ->title('Could not edit directory!') + ->body('' . $this->path . '') + ->danger() + ->closable() + ->send(); + $this->redirect(ListFiles::getUrl()); } }) ->language(fn (Get $get) => $get('lang')) @@ -200,6 +221,15 @@ class EditFiles extends Page return $breadcrumbs; } + private function getDaemonFileRepository(): DaemonFileRepository + { + /** @var Server $server */ + $server = Filament::getTenant(); + $this->fileRepository ??= (new DaemonFileRepository())->setServer($server); + + return $this->fileRepository; + } + public static function route(string $path): PageRegistration { return new PageRegistration( diff --git a/app/Repositories/Daemon/DaemonFileRepository.php b/app/Repositories/Daemon/DaemonFileRepository.php index 70cba278c..5cf1be031 100644 --- a/app/Repositories/Daemon/DaemonFileRepository.php +++ b/app/Repositories/Daemon/DaemonFileRepository.php @@ -5,6 +5,7 @@ namespace App\Repositories\Daemon; use Illuminate\Contracts\Filesystem\FileNotFoundException; use Illuminate\Http\Client\Response; use App\Exceptions\Http\Server\FileSizeTooLargeException; +use App\Exceptions\Repository\FileNotEditableException; use Illuminate\Http\Client\ConnectionException; class DaemonFileRepository extends DaemonRepository @@ -29,6 +30,10 @@ class DaemonFileRepository extends DaemonRepository throw new FileSizeTooLargeException(); } + if ($response->getStatusCode() === 400) { + throw new FileNotEditableException(); + } + if ($response->getStatusCode() === 404) { throw new FileNotFoundException(); } diff --git a/resources/views/errors/400.blade.php b/resources/views/errors/400.blade.php new file mode 100644 index 000000000..4d8dd2876 --- /dev/null +++ b/resources/views/errors/400.blade.php @@ -0,0 +1,8 @@ +@props([ +'code' => '400', +'title' => 'Bad request', +'subtitle' => $exception->getMessage(), +'icon' => 'tabler-exclamation-circle' +]) + +@extends('errors::layout') \ No newline at end of file