diff --git a/app/Filament/Admin/Pages/ListLogs.php b/app/Filament/Admin/Pages/ListLogs.php new file mode 100644 index 000000000..4c728b7c2 --- /dev/null +++ b/app/Filament/Admin/Pages/ListLogs.php @@ -0,0 +1,130 @@ +emptyStateHeading(trans('admin/log.empty_table')) + ->emptyStateIcon('tabler-check') + ->columns([ + NameColumn::make('date'), + LevelColumn::make(Level::ALL) + ->tooltip(trans('admin/log.total_logs')), + LevelColumn::make(Level::Error) + ->tooltip(trans('admin/log.error')), + LevelColumn::make(Level::Warning) + ->tooltip(trans('admin/log.warning')), + LevelColumn::make(Level::Notice) + ->tooltip(trans('admin/log.notice')), + LevelColumn::make(Level::Info) + ->tooltip(trans('admin/log.info')), + LevelColumn::make(Level::Debug) + ->tooltip(trans('admin/log.debug')), + ]) + ->recordActions([ + ViewLogAction::make() + ->icon('tabler-file-description')->iconSize(IconSize::Medium), + DownloadAction::make() + ->icon('tabler-file-download')->iconSize(IconSize::Medium), + Action::make('uploadLogs') + ->button() + ->hiddenLabel() + ->icon('tabler-world-upload')->iconSize(IconSize::Medium) + ->requiresConfirmation() + ->modalHeading(trans('admin/log.actions.upload_logs')) + ->modalDescription(fn ($record) => trans('admin/log.actions.upload_logs_description', ['file' => $record['date'], 'url' => 'https://logs.pelican.dev'])) + ->action(function ($record) { + $logPath = storage_path('logs/' . $record['date']); + + if (!file_exists($logPath)) { + Notification::make() + ->title(trans('admin/log.actions.log_not_found')) + ->body(trans('admin/log.actions.log_not_found_description', ['filename' => $record['date']])) + ->danger() + ->send(); + + return; + } + + $lines = file($logPath, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); + $totalLines = count($lines); + $uploadLines = $totalLines <= 1000 ? $lines : array_slice($lines, -1000); + $content = implode("\n", $uploadLines); + + $logUrl = 'https://logs.pelican.dev'; + try { + $response = Http::timeout(10)->asMultipart()->post($logUrl, [ + [ + 'name' => 'c', + 'contents' => $content, + ], + [ + 'name' => 'e', + 'contents' => '14d', + ], + ]); + + if ($response->failed()) { + Notification::make() + ->title(trans('admin/log.actions.failed_to_upload')) + ->body(trans('admin/log.actions.failed_to_upload_description', ['status' => $response->status()])) + ->danger() + ->send(); + + return; + } + + $data = $response->json(); + $url = $data['url']; + + Notification::make() + ->title(trans('admin/log.actions.log_upload')) + ->body("{$url}") + ->success() + ->actions([ + Action::make('viewLogs') + ->label(trans('admin/log.actions.view_logs')) + ->url($url) + ->openUrlInNewTab(true), + ]) + ->persistent() + ->send(); + + } catch (\Exception $e) { + Notification::make() + ->title(trans('admin/log.actions.failed_to_upload')) + ->body($e->getMessage()) + ->danger() + ->send(); + + return; + } + }), + DeleteAction::make() + ->icon('tabler-trash')->iconSize(IconSize::Medium), + ]); + } +} diff --git a/app/Filament/Admin/Pages/ViewLogs.php b/app/Filament/Admin/Pages/ViewLogs.php new file mode 100644 index 000000000..3e24a1b08 --- /dev/null +++ b/app/Filament/Admin/Pages/ViewLogs.php @@ -0,0 +1,105 @@ +icon('tabler-trash')->iconSize(IconSize::Medium), + DownloadAction::make(withTooltip: true) + ->icon('tabler-file-download')->iconSize(IconSize::Medium), + Action::make('uploadLogs') + ->button() + ->hiddenLabel() + ->icon('tabler-world-upload')->iconSize(IconSize::Medium) + ->requiresConfirmation() + ->tooltip(trans('admin/log.actions.upload_tooltip', ['url' => 'logs.pelican.dev'])) + ->modalHeading(trans('admin/log.actions.upload_logs')) + ->modalDescription(fn () => trans('admin/log.actions.upload_logs_description', ['file' => $this->resolveRecordDate(), 'url' => 'https://logs.pelican.dev'])) + ->action(function () { + $logPath = storage_path('logs/' . $this->resolveRecordDate()); + + if (!file_exists($logPath)) { + Notification::make() + ->title(trans('admin/log.actions.log_not_found')) + ->body(trans('admin/log.actions.log_not_found_description', ['filename' => $this->resolveRecordDate()])) + ->danger() + ->send(); + + return; + } + + $lines = file($logPath, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); + $totalLines = count($lines); + $uploadLines = $totalLines <= 1000 ? $lines : array_slice($lines, -1000); + $content = implode("\n", $uploadLines); + + $logUrl = 'https://logs.pelican.dev'; + try { + $response = Http::timeout(10)->asMultipart()->post($logUrl, [ + [ + 'name' => 'c', + 'contents' => $content, + ], + [ + 'name' => 'e', + 'contents' => '14d', + ], + ]); + + if ($response->failed()) { + Notification::make() + ->title(trans('admin/log.actions.failed_to_upload')) + ->body(trans('admin/log.actions.failed_to_upload_description', ['status' => $response->status()])) + ->danger() + ->send(); + + return; + } + + $data = $response->json(); + $url = $data['url']; + + Notification::make() + ->title(trans('admin/log.actions.log_upload')) + ->body("{$url}") + ->success() + ->actions([ + Action::make('viewLogs') + ->label(trans('admin/log.actions.view_logs')) + ->url($url) + ->openUrlInNewTab(true), + ]) + ->persistent() + ->send(); + + } catch (\Exception $e) { + Notification::make() + ->title(trans('admin/log.actions.failed_to_upload')) + ->body($e->getMessage()) + ->danger() + ->send(); + + return; + } + }), + BackAction::make() + ->icon('tabler-arrow-left')->iconSize(IconSize::Medium), + ]; + } +} diff --git a/app/Providers/Filament/AdminPanelProvider.php b/app/Providers/Filament/AdminPanelProvider.php index 5e5f3ef58..64d9f1184 100644 --- a/app/Providers/Filament/AdminPanelProvider.php +++ b/app/Providers/Filament/AdminPanelProvider.php @@ -2,7 +2,9 @@ namespace App\Providers\Filament; -use AchyutN\FilamentLogViewer\FilamentLogViewer; +use App\Filament\Admin\Pages\ListLogs; +use App\Filament\Admin\Pages\ViewLogs; +use Boquizo\FilamentLogViewer\FilamentLogViewerPlugin; use Filament\Actions\Action; use Filament\Facades\Filament; use Filament\Navigation\NavigationGroup; @@ -35,8 +37,11 @@ class AdminPanelProvider extends PanelProvider ->discoverPages(in: app_path('Filament/Admin/Pages'), for: 'App\\Filament\\Admin\\Pages') ->discoverWidgets(in: app_path('Filament/Admin/Widgets'), for: 'App\\Filament\\Admin\\Widgets') ->plugins([ - FilamentLogViewer::make() + FilamentLogViewerPlugin::make() ->authorize(fn () => user()->can('view panelLog')) + ->listLogs(ListLogs::class) + ->viewLog(ViewLogs::class) + ->navigationLabel(fn () => trans('admin/log.navigation.panel_logs')) ->navigationGroup(fn () => trans('admin/dashboard.advanced')) ->navigationIcon('tabler-file-info'), ]); diff --git a/app/Providers/Filament/AppPanelProvider.php b/app/Providers/Filament/AppPanelProvider.php index 6907cebe5..a4a19ef3c 100644 --- a/app/Providers/Filament/AppPanelProvider.php +++ b/app/Providers/Filament/AppPanelProvider.php @@ -2,7 +2,7 @@ namespace App\Providers\Filament; -use AchyutN\FilamentLogViewer\FilamentLogViewer; +use Boquizo\FilamentLogViewer\FilamentLogViewerPlugin; use Filament\Actions\Action; use Filament\Facades\Filament; use Filament\Panel; @@ -26,7 +26,7 @@ class AppPanelProvider extends PanelProvider ]) ->discoverResources(in: app_path('Filament/App/Resources'), for: 'App\\Filament\\App\\Resources') ->plugins([ - FilamentLogViewer::make() + FilamentLogViewerPlugin::make() ->authorize(false), ]); } diff --git a/app/Traits/ResolvesRecordDate.php b/app/Traits/ResolvesRecordDate.php new file mode 100644 index 000000000..7323fb60f --- /dev/null +++ b/app/Traits/ResolvesRecordDate.php @@ -0,0 +1,45 @@ +record ?? null); + + if (is_scalar($r)) { + return (string) $r; + } + + if (is_array($r)) { + return Arr::get($r, 'date') !== null ? (string) Arr::get($r, 'date') : null; + } + + if (is_object($r)) { + if (method_exists($r, 'getAttribute')) { + $val = $r->getAttribute('date'); + if ($val !== null) { + return (string) $val; + } + } + + if (isset($r->date) || property_exists($r, 'date')) { + return (string) $r->date; + } + + if (method_exists($r, 'toArray')) { + $arr = $r->toArray(); + + return Arr::get($arr, 'date') !== null ? (string) Arr::get($arr, 'date') : null; + } + } + + return null; + } +} diff --git a/composer.json b/composer.json index a428ffd19..9ea239bc1 100644 --- a/composer.json +++ b/composer.json @@ -9,11 +9,11 @@ "ext-mbstring": "*", "ext-pdo": "*", "ext-zip": "*", - "achyutn/filament-log-viewer": "^1.4", "aws/aws-sdk-php": "^3.356", "calebporzio/sushi": "^2.5", "dedoc/scramble": "^0.12.10", "filament/filament": "~4.0", + "gboquizosanchez/filament-log-viewer": "^2.1", "guzzlehttp/guzzle": "^7.10", "laravel/framework": "^12.37", "laravel/helpers": "^1.7", diff --git a/composer.lock b/composer.lock index 965d8c97d..1763b867c 100644 --- a/composer.lock +++ b/composer.lock @@ -4,89 +4,8 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "c8143eccd2736bd88b35d8fe6c8de289", + "content-hash": "fc2037e2f16ad43582ceaf9d41aba799", "packages": [ - { - "name": "achyutn/filament-log-viewer", - "version": "v1.5.2", - "source": { - "type": "git", - "url": "https://github.com/achyutkneupane/filament-log-viewer.git", - "reference": "e285e5cb359d92d17c64e981de13d0e7741f4121" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/achyutkneupane/filament-log-viewer/zipball/e285e5cb359d92d17c64e981de13d0e7741f4121", - "reference": "e285e5cb359d92d17c64e981de13d0e7741f4121", - "shasum": "" - }, - "require": { - "filament/filament": "^4.0", - "phiki/phiki": "^2.0", - "php": ">=8.2" - }, - "require-dev": { - "larastan/larastan": "^3.0", - "laravel/pint": "^1.23", - "orchestra/testbench": "^10.4", - "pestphp/pest": "^3.8", - "pestphp/pest-plugin-laravel": "^3.2", - "pestphp/pest-plugin-livewire": "^3.0", - "phpstan/phpstan": "^2.1", - "rector/rector": "^2.1" - }, - "type": "library", - "extra": { - "laravel": { - "providers": [ - "AchyutN\\FilamentLogViewer\\LogViewerProvider" - ] - } - }, - "autoload": { - "psr-4": { - "AchyutN\\FilamentLogViewer\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Achyut Neupane", - "email": "achyutkneupane@gmail.com", - "homepage": "https://achyut.com.np", - "role": "Maintainer" - } - ], - "description": "A Filament package to view and manage Laravel logs.", - "keywords": [ - "Viewer", - "filament", - "laravel", - "log" - ], - "support": { - "issues": "https://github.com/achyutkneupane/filament-log-viewer/issues", - "source": "https://github.com/achyutkneupane/filament-log-viewer/tree/v1.5.2" - }, - "funding": [ - { - "url": "https://www.buymeacoffee.com/achyutn", - "type": "buy_me_a_coffee" - }, - { - "url": "https://github.com/achyutkneupane", - "type": "github" - }, - { - "url": "https://www.patreon.com/Achyut", - "type": "patreon" - } - ], - "time": "2025-10-10T18:58:40+00:00" - }, { "name": "anourvalar/eloquent-serialize", "version": "1.3.4", @@ -209,16 +128,16 @@ }, { "name": "aws/aws-sdk-php", - "version": "3.359.4", + "version": "3.359.8", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "510cb4b7e2fa3ea09ad2154e7a13fe7675c36b30" + "reference": "a5be7ed5efd25d70a74275daeff896b896d9c286" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/510cb4b7e2fa3ea09ad2154e7a13fe7675c36b30", - "reference": "510cb4b7e2fa3ea09ad2154e7a13fe7675c36b30", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/a5be7ed5efd25d70a74275daeff896b896d9c286", + "reference": "a5be7ed5efd25d70a74275daeff896b896d9c286", "shasum": "" }, "require": { @@ -300,9 +219,9 @@ "support": { "forum": "https://github.com/aws/aws-sdk-php/discussions", "issues": "https://github.com/aws/aws-sdk-php/issues", - "source": "https://github.com/aws/aws-sdk-php/tree/3.359.4" + "source": "https://github.com/aws/aws-sdk-php/tree/3.359.8" }, - "time": "2025-11-03T19:18:23+00:00" + "time": "2025-11-07T19:48:19+00:00" }, { "name": "blade-ui-kit/blade-heroicons", @@ -2023,6 +1942,70 @@ ], "time": "2023-10-12T05:21:21+00:00" }, + { + "name": "gboquizosanchez/filament-log-viewer", + "version": "2.1.8", + "source": { + "type": "git", + "url": "https://github.com/gboquizosanchez/filament-log-viewer.git", + "reference": "85480879ed0f4da15257393f6c2e0c0ea0892403" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/gboquizosanchez/filament-log-viewer/zipball/85480879ed0f4da15257393f6c2e0c0ea0892403", + "reference": "85480879ed0f4da15257393f6c2e0c0ea0892403", + "shasum": "" + }, + "require": { + "ext-zip": "*", + "owenvoke/blade-fontawesome": "^2.9", + "php": "^8.2|^8.3|^8.4", + "symfony/polyfill-php83": "^1.33" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.64", + "hermes/dependencies": "^1.1", + "larastan/larastan": "^2.9", + "orchestra/testbench": "^9.1", + "pestphp/pest": "^3.5" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Boquizo\\FilamentLogViewer\\FilamentLogViewerServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Boquizo\\FilamentLogViewer\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Germán Boquizo Sánchez", + "email": "germanboquizosanchez@gmail.com", + "role": "Developer" + } + ], + "description": "Filament Log Viewer", + "homepage": "https://github.com/gboquizosanchez", + "keywords": [ + "filament", + "laravel", + "log-viewer" + ], + "support": { + "issues": "https://github.com/gboquizosanchez/filament-log-viewer/issues", + "source": "https://github.com/gboquizosanchez/filament-log-viewer/tree/2.1.8" + }, + "time": "2025-11-07T21:40:26+00:00" + }, { "name": "graham-campbell/result-type", "version": "v1.1.3", @@ -5207,6 +5190,66 @@ ], "time": "2025-01-30T13:51:11+00:00" }, + { + "name": "owenvoke/blade-fontawesome", + "version": "v2.9.1", + "source": { + "type": "git", + "url": "https://github.com/owenvoke/blade-fontawesome.git", + "reference": "94dcd0c78f43f8234b0d9c76c903ecd288b8b0d1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/owenvoke/blade-fontawesome/zipball/94dcd0c78f43f8234b0d9c76c903ecd288b8b0d1", + "reference": "94dcd0c78f43f8234b0d9c76c903ecd288b8b0d1", + "shasum": "" + }, + "require": { + "blade-ui-kit/blade-icons": "^1.5", + "illuminate/support": "^10.34|^11.0|^12.0", + "php": "^8.1" + }, + "require-dev": { + "laravel/pint": "^1.13", + "orchestra/testbench": "^8.12|^9.0|^10.0", + "pestphp/pest": "^2.26|^3.7", + "phpstan/phpstan": "^1.10|^2.1", + "symfony/var-dumper": "^6.3|^7.2" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "OwenVoke\\BladeFontAwesome\\BladeFontAwesomeServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "OwenVoke\\BladeFontAwesome\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A package to easily make use of Font Awesome in your Laravel Blade views", + "support": { + "issues": "https://github.com/owenvoke/blade-fontawesome/issues", + "source": "https://github.com/owenvoke/blade-fontawesome/tree/v2.9.1" + }, + "funding": [ + { + "url": "https://ecologi.com/owenvoke?gift-trees", + "type": "custom" + }, + { + "url": "https://github.com/owenvoke", + "type": "github" + } + ], + "time": "2025-03-28T16:03:42+00:00" + }, { "name": "paragonie/constant_time_encoding", "version": "v3.1.3", @@ -5328,16 +5371,16 @@ }, { "name": "phiki/phiki", - "version": "v2.0.4", + "version": "v2.0.5", "source": { "type": "git", "url": "https://github.com/phikiphp/phiki.git", - "reference": "160785c50c01077780ab217e5808f00ab8f05a13" + "reference": "36d03e4c103b825f2657db966730d43e2035ff00" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phikiphp/phiki/zipball/160785c50c01077780ab217e5808f00ab8f05a13", - "reference": "160785c50c01077780ab217e5808f00ab8f05a13", + "url": "https://api.github.com/repos/phikiphp/phiki/zipball/36d03e4c103b825f2657db966730d43e2035ff00", + "reference": "36d03e4c103b825f2657db966730d43e2035ff00", "shasum": "" }, "require": { @@ -5383,7 +5426,7 @@ "description": "Syntax highlighting using TextMate grammars in PHP.", "support": { "issues": "https://github.com/phikiphp/phiki/issues", - "source": "https://github.com/phikiphp/phiki/tree/v2.0.4" + "source": "https://github.com/phikiphp/phiki/tree/v2.0.5" }, "funding": [ { @@ -5395,7 +5438,7 @@ "type": "other" } ], - "time": "2025-09-20T17:21:02+00:00" + "time": "2025-11-04T20:03:45+00:00" }, { "name": "phpdocumentor/reflection", @@ -8258,16 +8301,16 @@ }, { "name": "symfony/console", - "version": "v7.3.5", + "version": "v7.3.6", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "cdb80fa5869653c83cfe1a9084a673b6daf57ea7" + "reference": "c28ad91448f86c5f6d9d2c70f0cf68bf135f252a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/cdb80fa5869653c83cfe1a9084a673b6daf57ea7", - "reference": "cdb80fa5869653c83cfe1a9084a673b6daf57ea7", + "url": "https://api.github.com/repos/symfony/console/zipball/c28ad91448f86c5f6d9d2c70f0cf68bf135f252a", + "reference": "c28ad91448f86c5f6d9d2c70f0cf68bf135f252a", "shasum": "" }, "require": { @@ -8332,7 +8375,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v7.3.5" + "source": "https://github.com/symfony/console/tree/v7.3.6" }, "funding": [ { @@ -8352,20 +8395,20 @@ "type": "tidelift" } ], - "time": "2025-10-14T15:46:26+00:00" + "time": "2025-11-04T01:21:42+00:00" }, { "name": "symfony/css-selector", - "version": "v7.3.0", + "version": "v7.3.6", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "601a5ce9aaad7bf10797e3663faefce9e26c24e2" + "reference": "84321188c4754e64273b46b406081ad9b18e8614" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/601a5ce9aaad7bf10797e3663faefce9e26c24e2", - "reference": "601a5ce9aaad7bf10797e3663faefce9e26c24e2", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/84321188c4754e64273b46b406081ad9b18e8614", + "reference": "84321188c4754e64273b46b406081ad9b18e8614", "shasum": "" }, "require": { @@ -8401,7 +8444,7 @@ "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v7.3.0" + "source": "https://github.com/symfony/css-selector/tree/v7.3.6" }, "funding": [ { @@ -8412,12 +8455,16 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-09-25T14:21:43+00:00" + "time": "2025-10-29T17:24:25+00:00" }, { "name": "symfony/deprecation-contracts", @@ -8488,16 +8535,16 @@ }, { "name": "symfony/error-handler", - "version": "v7.3.4", + "version": "v7.3.6", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "99f81bc944ab8e5dae4f21b4ca9972698bbad0e4" + "reference": "bbe40bfab84323d99dab491b716ff142410a92a8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/99f81bc944ab8e5dae4f21b4ca9972698bbad0e4", - "reference": "99f81bc944ab8e5dae4f21b4ca9972698bbad0e4", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/bbe40bfab84323d99dab491b716ff142410a92a8", + "reference": "bbe40bfab84323d99dab491b716ff142410a92a8", "shasum": "" }, "require": { @@ -8545,7 +8592,7 @@ "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v7.3.4" + "source": "https://github.com/symfony/error-handler/tree/v7.3.6" }, "funding": [ { @@ -8565,7 +8612,7 @@ "type": "tidelift" } ], - "time": "2025-09-11T10:12:26+00:00" + "time": "2025-10-31T19:12:50+00:00" }, { "name": "symfony/event-dispatcher", @@ -8797,16 +8844,16 @@ }, { "name": "symfony/html-sanitizer", - "version": "v7.3.3", + "version": "v7.3.6", "source": { "type": "git", "url": "https://github.com/symfony/html-sanitizer.git", - "reference": "8740fc48979f649dee8b8fc51a2698e5c190bf12" + "reference": "3855e827adb1b675adcb98ad7f92681e293f2d77" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/html-sanitizer/zipball/8740fc48979f649dee8b8fc51a2698e5c190bf12", - "reference": "8740fc48979f649dee8b8fc51a2698e5c190bf12", + "url": "https://api.github.com/repos/symfony/html-sanitizer/zipball/3855e827adb1b675adcb98ad7f92681e293f2d77", + "reference": "3855e827adb1b675adcb98ad7f92681e293f2d77", "shasum": "" }, "require": { @@ -8846,7 +8893,7 @@ "sanitizer" ], "support": { - "source": "https://github.com/symfony/html-sanitizer/tree/v7.3.3" + "source": "https://github.com/symfony/html-sanitizer/tree/v7.3.6" }, "funding": [ { @@ -8866,20 +8913,20 @@ "type": "tidelift" } ], - "time": "2025-08-12T10:34:03+00:00" + "time": "2025-10-30T13:22:58+00:00" }, { "name": "symfony/http-client", - "version": "v7.3.4", + "version": "v7.3.6", "source": { "type": "git", "url": "https://github.com/symfony/http-client.git", - "reference": "4b62871a01c49457cf2a8e560af7ee8a94b87a62" + "reference": "3c0a55a2c8e21e30a37022801c11c7ab5a6cb2de" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client/zipball/4b62871a01c49457cf2a8e560af7ee8a94b87a62", - "reference": "4b62871a01c49457cf2a8e560af7ee8a94b87a62", + "url": "https://api.github.com/repos/symfony/http-client/zipball/3c0a55a2c8e21e30a37022801c11c7ab5a6cb2de", + "reference": "3c0a55a2c8e21e30a37022801c11c7ab5a6cb2de", "shasum": "" }, "require": { @@ -8946,7 +8993,7 @@ "http" ], "support": { - "source": "https://github.com/symfony/http-client/tree/v7.3.4" + "source": "https://github.com/symfony/http-client/tree/v7.3.6" }, "funding": [ { @@ -8966,7 +9013,7 @@ "type": "tidelift" } ], - "time": "2025-09-11T10:12:26+00:00" + "time": "2025-11-05T17:41:46+00:00" }, { "name": "symfony/http-client-contracts", @@ -9048,16 +9095,16 @@ }, { "name": "symfony/http-foundation", - "version": "v7.3.5", + "version": "v7.3.6", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "ce31218c7cac92eab280762c4375fb70a6f4f897" + "reference": "6379e490d6ecfc5c4224ff3a754b90495ecd135c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/ce31218c7cac92eab280762c4375fb70a6f4f897", - "reference": "ce31218c7cac92eab280762c4375fb70a6f4f897", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/6379e490d6ecfc5c4224ff3a754b90495ecd135c", + "reference": "6379e490d6ecfc5c4224ff3a754b90495ecd135c", "shasum": "" }, "require": { @@ -9107,7 +9154,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v7.3.5" + "source": "https://github.com/symfony/http-foundation/tree/v7.3.6" }, "funding": [ { @@ -9127,20 +9174,20 @@ "type": "tidelift" } ], - "time": "2025-10-24T21:42:11+00:00" + "time": "2025-11-06T11:05:57+00:00" }, { "name": "symfony/http-kernel", - "version": "v7.3.5", + "version": "v7.3.6", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "24fd3f123532e26025f49f1abefcc01a69ef15ab" + "reference": "f9a34dc0196677250e3609c2fac9de9e1551a262" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/24fd3f123532e26025f49f1abefcc01a69ef15ab", - "reference": "24fd3f123532e26025f49f1abefcc01a69ef15ab", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/f9a34dc0196677250e3609c2fac9de9e1551a262", + "reference": "f9a34dc0196677250e3609c2fac9de9e1551a262", "shasum": "" }, "require": { @@ -9225,7 +9272,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v7.3.5" + "source": "https://github.com/symfony/http-kernel/tree/v7.3.6" }, "funding": [ { @@ -9245,7 +9292,7 @@ "type": "tidelift" } ], - "time": "2025-10-28T10:19:01+00:00" + "time": "2025-11-06T20:58:12+00:00" }, { "name": "symfony/mailer", @@ -10454,16 +10501,16 @@ }, { "name": "symfony/routing", - "version": "v7.3.4", + "version": "v7.3.6", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "8dc648e159e9bac02b703b9fbd937f19ba13d07c" + "reference": "c97abe725f2a1a858deca629a6488c8fc20c3091" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/8dc648e159e9bac02b703b9fbd937f19ba13d07c", - "reference": "8dc648e159e9bac02b703b9fbd937f19ba13d07c", + "url": "https://api.github.com/repos/symfony/routing/zipball/c97abe725f2a1a858deca629a6488c8fc20c3091", + "reference": "c97abe725f2a1a858deca629a6488c8fc20c3091", "shasum": "" }, "require": { @@ -10515,7 +10562,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v7.3.4" + "source": "https://github.com/symfony/routing/tree/v7.3.6" }, "funding": [ { @@ -10535,20 +10582,20 @@ "type": "tidelift" } ], - "time": "2025-09-11T10:12:26+00:00" + "time": "2025-11-05T07:57:47+00:00" }, { "name": "symfony/service-contracts", - "version": "v3.6.0", + "version": "v3.6.1", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "f021b05a130d35510bd6b25fe9053c2a8a15d5d4" + "reference": "45112560a3ba2d715666a509a0bc9521d10b6c43" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f021b05a130d35510bd6b25fe9053c2a8a15d5d4", - "reference": "f021b05a130d35510bd6b25fe9053c2a8a15d5d4", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/45112560a3ba2d715666a509a0bc9521d10b6c43", + "reference": "45112560a3ba2d715666a509a0bc9521d10b6c43", "shasum": "" }, "require": { @@ -10602,7 +10649,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v3.6.0" + "source": "https://github.com/symfony/service-contracts/tree/v3.6.1" }, "funding": [ { @@ -10613,12 +10660,16 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-04-25T09:37:31+00:00" + "time": "2025-07-15T11:30:57+00:00" }, { "name": "symfony/string", @@ -10812,16 +10863,16 @@ }, { "name": "symfony/translation-contracts", - "version": "v3.6.0", + "version": "v3.6.1", "source": { "type": "git", "url": "https://github.com/symfony/translation-contracts.git", - "reference": "df210c7a2573f1913b2d17cc95f90f53a73d8f7d" + "reference": "65a8bc82080447fae78373aa10f8d13b38338977" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/df210c7a2573f1913b2d17cc95f90f53a73d8f7d", - "reference": "df210c7a2573f1913b2d17cc95f90f53a73d8f7d", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/65a8bc82080447fae78373aa10f8d13b38338977", + "reference": "65a8bc82080447fae78373aa10f8d13b38338977", "shasum": "" }, "require": { @@ -10870,7 +10921,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/translation-contracts/tree/v3.6.0" + "source": "https://github.com/symfony/translation-contracts/tree/v3.6.1" }, "funding": [ { @@ -10881,12 +10932,16 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-09-27T08:32:26+00:00" + "time": "2025-07-15T13:41:35+00:00" }, { "name": "symfony/uid", diff --git a/lang/en/admin/log.php b/lang/en/admin/log.php new file mode 100644 index 000000000..39bcc0c77 --- /dev/null +++ b/lang/en/admin/log.php @@ -0,0 +1,26 @@ + 'Yay! No Errors!', + 'total_logs' => 'Total Logs', + 'error' => 'Error', + 'warning' => 'Warning', + 'notice' => 'Notice', + 'info' => 'Info', + 'debug' => 'Debug', + 'navigation' => [ + 'panel_logs' => 'Panel Logs', + ], + 'actions' => [ + 'upload_logs' => 'Upload Logs?', + 'upload_logs_description' => 'This will upload :file to :url Are you sure you wish to do this?', + 'view_logs' => 'View Logs', + 'log_not_found' => 'Log not found!', + 'log_not_found_description' => 'Could not find log for :filename', + 'failed_to_upload' => 'Filed to upload.', + 'failed_to_upload_description' => 'HTTP Status: :status', + 'log_upload' => 'Log Uploaded!', + 'log_upload_action' => 'View Log', + 'upload_tooltip' => 'Upload to :url', + ], +]; diff --git a/resources/css/app.css b/resources/css/app.css index 8a072990b..8f68d0fb4 100644 --- a/resources/css/app.css +++ b/resources/css/app.css @@ -24,4 +24,6 @@ /* Required by widgets */ @import '../../vendor/filament/widgets/resources/css/index.css'; +@source '../../vendor/gboquizosanchez/filament-log-viewer/resources/views/**/*.blade.php'; + @variant dark (&:where(.dark, .dark *)); diff --git a/resources/views/filament/components/list-logs.blade.php b/resources/views/filament/components/list-logs.blade.php new file mode 100644 index 000000000..ce096a2d8 --- /dev/null +++ b/resources/views/filament/components/list-logs.blade.php @@ -0,0 +1,3 @@ + + {{ $this->table }} +