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