├── .gitignore ├── docs └── images │ ├── screenshot1.png │ └── screenshot2.png ├── CHANGELOG.md ├── src ├── Filament │ └── Resources │ │ ├── MonitoredScheduledTaskResource │ │ └── Pages │ │ │ └── ListMonitoredScheduledTasks.php │ │ ├── MonitoredScheduledTaskLogItemResource │ │ └── Pages │ │ │ └── ListMonitoredScheduledTaskLogItems.php │ │ ├── MonitoredScheduledTaskResource.php │ │ └── MonitoredScheduledTaskLogItemResource.php ├── ServiceProvider.php └── FilamentPlugin.php ├── resources └── lang │ ├── en │ └── translations.php │ └── de │ └── translations.php ├── LICENSE.md ├── composer.json ├── config └── filament-schedule-monitor.php └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | .idea -------------------------------------------------------------------------------- /docs/images/screenshot1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mvenghaus/filament-plugin-schedule-monitor/HEAD/docs/images/screenshot1.png -------------------------------------------------------------------------------- /docs/images/screenshot2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mvenghaus/filament-plugin-schedule-monitor/HEAD/docs/images/screenshot2.png -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | All notable changes to `mvenghaus/filament-plugin-schedule-monitor` will be documented in this file. 4 | 5 | ## 3.0.0 - 2024-02-04 6 | 7 | - initial release 8 | -------------------------------------------------------------------------------- /src/Filament/Resources/MonitoredScheduledTaskResource/Pages/ListMonitoredScheduledTasks.php: -------------------------------------------------------------------------------- 1 | name(static::$name) 17 | ->hasConfigFile() 18 | ->hasTranslations(); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/Filament/Resources/MonitoredScheduledTaskLogItemResource/Pages/ListMonitoredScheduledTaskLogItems.php: -------------------------------------------------------------------------------- 1 | resources([ 22 | MonitoredScheduledTaskResource::class, 23 | MonitoredScheduledTaskLogItemResource::class 24 | ]); 25 | } 26 | 27 | public function boot(Panel $panel): void 28 | { 29 | } 30 | 31 | public static function make(): static 32 | { 33 | return app(static::class); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /resources/lang/en/translations.php: -------------------------------------------------------------------------------- 1 | [ 5 | 'label' => 'Scheduled Task', 6 | 'plural_label' => 'Scheduled Tasks', 7 | 'navigation_group' => 'Settings', 8 | 'navigation_label' => 'Scheduled Tasks', 9 | ], 10 | 'monitored_scheduled_task_log_item' => [ 11 | 'label' => 'Scheduled Task - Logs', 12 | 'plural_label' => 'Scheduled Tasks - Logs', 13 | 'navigation_group' => 'Settings', 14 | 'navigation_label' => 'Scheduled Tasks - Logs', 15 | ], 16 | 'name' => 'Name', 17 | 'type' => 'Type', 18 | 'cron_expression' => 'Cron Expression', 19 | 'timezone' => 'Timezone', 20 | 'last_started_at' => 'Last started at', 21 | 'last_finished_at' => 'Last finished at', 22 | 'last_failed_at' => 'Last failed at', 23 | 'last_skipped_at' => 'Last skipped at', 24 | 'created_at' => 'Created at', 25 | 'memory' => 'Memory', 26 | 'runtime' => 'Runtime', 27 | 'starting' => 'starting', 28 | 'finished' => 'finished', 29 | 'failed' => 'failed', 30 | 'skipped' => 'skipped', 31 | ]; -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 Marcus Venghaus 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /resources/lang/de/translations.php: -------------------------------------------------------------------------------- 1 | [ 5 | 'label' => 'Geplante Aufgabe', 6 | 'plural_label' => 'Geplante Aufgaben', 7 | 'navigation_group' => 'Einstellungen', 8 | 'navigation_label' => 'Geplante Aufgaben', 9 | ], 10 | 'monitored_scheduled_task_log_item' => [ 11 | 'label' => 'Geplante Aufgaben - Logs', 12 | 'plural_label' => 'Geplante Aufgaben - Logs', 13 | 'navigation_group' => 'Einstellungen', 14 | 'navigation_label' => 'Geplante Aufgaben - Logs', 15 | ], 16 | 'name' => 'Name', 17 | 'type' => 'Art', 18 | 'cron_expression' => 'Cron Ausdruck', 19 | 'timezone' => 'Zeitzone', 20 | 'last_started_at' => 'Zuletzt gestartet', 21 | 'last_finished_at' => 'Zuletzt beendet', 22 | 'last_failed_at' => 'Zuletzt fehlgeschlagen', 23 | 'last_skipped_at' => 'Zuletzt übersprungen', 24 | 'created_at' => 'Erstellt am', 25 | 'memory' => 'Speicher', 26 | 'runtime' => 'Laufzeit', 27 | 'starting' => 'gestartet', 28 | 'finished' => 'beendet', 29 | 'failed' => 'fehlgeschlagen', 30 | 'skipped' => 'übersprungen', 31 | ]; -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "mvenghaus/filament-plugin-schedule-monitor", 3 | "description": "Filament Plugin for Spatie's Schedule Monitor", 4 | "keywords": [ 5 | "mvenghaus", 6 | "laravel", 7 | "filament", 8 | "schedule", 9 | "monitor" 10 | ], 11 | "homepage": "https://github.com/mvenghaus/filament-plugin-schedule-monitor", 12 | "support": { 13 | "issues": "https://github.com/mvenghaus/filament-plugin-schedule-monitor/issues", 14 | "source": "https://github.com/mvenghaus/filament-plugin-schedule-monitor" 15 | }, 16 | "license": "MIT", 17 | "authors": [ 18 | { 19 | "name": "Marcus Venghaus", 20 | "email": "marcus.venghaus@inklammern.de", 21 | "role": "Developer" 22 | } 23 | ], 24 | "require": { 25 | "php": "^8.2", 26 | "spatie/laravel-schedule-monitor": "^3.5.0" 27 | }, 28 | "autoload": { 29 | "psr-4": { 30 | "Mvenghaus\\FilamentScheduleMonitor\\": "src/" 31 | } 32 | }, 33 | "extra": { 34 | "laravel": { 35 | "providers": [ 36 | "Mvenghaus\\FilamentScheduleMonitor\\ServiceProvider" 37 | ] 38 | } 39 | }, 40 | "config": { 41 | "sort-packages": true 42 | }, 43 | "minimum-stability": "stable", 44 | "prefer-stable": true 45 | } 46 | -------------------------------------------------------------------------------- /config/filament-schedule-monitor.php: -------------------------------------------------------------------------------- 1 | [ 5 | 'monitored_scheduled_task' => [ 6 | 'label' => 'filament-schedule-monitor::translations.monitored_scheduled_task.label', 7 | 'plural_label' => 'filament-schedule-monitor::translations.monitored_scheduled_task.plural_label', 8 | 'navigation_group' => 'filament-schedule-monitor::translations.monitored_scheduled_task.navigation_group', 9 | 'navigation_label' => 'filament-schedule-monitor::translations.monitored_scheduled_task.navigation_label', 10 | 'navigation_icon' => 'heroicon-o-cpu-chip', 11 | 'navigation_sort' => null, 12 | ], 13 | 'monitored_scheduled_task_log_item' => [ 14 | 'label' => 'filament-schedule-monitor::translations.monitored_scheduled_task_log_item.label', 15 | 'plural_label' => 'filament-schedule-monitor::translations.monitored_scheduled_task_log_item.plural_label', 16 | 'navigation_group' => 'filament-schedule-monitor::translations.monitored_scheduled_task_log_item.navigation_group', 17 | 'navigation_label' => 'filament-schedule-monitor::translations.monitored_scheduled_task_log_item.navigation_label', 18 | 'navigation_icon' => 'heroicon-o-cpu-chip', 19 | 'navigation_sort' => null, 20 | ] 21 | ] 22 | ]; -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Filament Plugin - Schedule Monitor 2 | 3 | With this plugin, you can display the data from [spatie/laravel-schedule-monitor](https://github.com/spatie/laravel-schedule-monitor) in your Filament panel. 4 | 5 | ## Screenshots 6 | 7 | ![Screenshot 1](https://raw.githubusercontent.com/mvenghaus/filament-plugin-schedule-monitor/main/docs/images/screenshot1.png) 8 | 9 | ![Screenshot 2](https://raw.githubusercontent.com/mvenghaus/filament-plugin-schedule-monitor/main/docs/images/screenshot2.png) 10 | 11 | ## Requirements 12 | 13 | You need the latest version of Filament v3. 14 | 15 | ## Installation 16 | 17 | Install the package via composer: 18 | 19 | ```bash 20 | composer require spatie/laravel-schedule-monitor 21 | php artisan vendor:publish --provider="Spatie\ScheduleMonitor\ScheduleMonitorServiceProvider" --tag="schedule-monitor-migrations" 22 | php artisan migrate 23 | ``` 24 | 25 | ```bash 26 | composer require mvenghaus/filament-plugin-schedule-monitor:"^3.0" 27 | ``` 28 | 29 | Register the plugin in AdminPanelProvider: 30 | 31 | ```bash 32 | ... 33 | ->plugin(\Mvenghaus\FilamentScheduleMonitor\FilamentPlugin::make()) 34 | ... 35 | ``` 36 | 37 | Publishing the config (optional): 38 | 39 | ```bash 40 | php artisan vendor:publish --tag="filament-schedule-monitor-config" 41 | ``` 42 | 43 | # Contact 44 | If you any questions or you find a bug, please report [here](https://github.com/mvenghaus/filament-plugin-schedule-monitor/issues). 45 | -------------------------------------------------------------------------------- /src/Filament/Resources/MonitoredScheduledTaskResource.php: -------------------------------------------------------------------------------- 1 | columns([ 50 | Tables\Columns\TextColumn::make('name') 51 | ->label(__('filament-schedule-monitor::translations.name')) 52 | ->sortable(), 53 | Tables\Columns\TextColumn::make('type') 54 | ->label(__('filament-schedule-monitor::translations.type')) 55 | ->sortable(), 56 | Tables\Columns\TextColumn::make('cron_expression') 57 | ->label(__('filament-schedule-monitor::translations.cron_expression')) 58 | ->sortable(), 59 | Tables\Columns\TextColumn::make('timezone') 60 | ->label(__('filament-schedule-monitor::translations.timezone')) 61 | ->sortable(), 62 | Tables\Columns\TextColumn::make('last_started_at') 63 | ->label(__('filament-schedule-monitor::translations.last_started_at')) 64 | ->sortable() 65 | ->dateTime(), 66 | Tables\Columns\TextColumn::make('last_finished_at') 67 | ->label(__('filament-schedule-monitor::translations.last_finished_at')) 68 | ->sortable() 69 | ->dateTime(), 70 | Tables\Columns\TextColumn::make('last_failed_at') 71 | ->label(__('filament-schedule-monitor::translations.last_failed_at')) 72 | ->sortable() 73 | ->dateTime(), 74 | Tables\Columns\TextColumn::make('last_skipped_at') 75 | ->label(__('filament-schedule-monitor::translations.last_skipped_at')) 76 | ->sortable() 77 | ->dateTime(), 78 | ]); 79 | } 80 | 81 | public static function getPages(): array 82 | { 83 | return [ 84 | 'index' => MonitoredScheduledTaskResource\Pages\ListMonitoredScheduledTasks::route('/'), 85 | ]; 86 | } 87 | } 88 | -------------------------------------------------------------------------------- /src/Filament/Resources/MonitoredScheduledTaskLogItemResource.php: -------------------------------------------------------------------------------- 1 | defaultSort('id', 'desc') 56 | ->columns([ 57 | Tables\Columns\TextColumn::make('type') 58 | ->label(__('filament-schedule-monitor::translations.type')) 59 | ->sortable() 60 | ->badge() 61 | ->color(fn(string $state): string => match ($state) { 62 | MonitoredScheduledTaskLogItem::TYPE_STARTING => 'info', 63 | MonitoredScheduledTaskLogItem::TYPE_FINISHED => 'success', 64 | MonitoredScheduledTaskLogItem::TYPE_SKIPPED => 'warning', 65 | MonitoredScheduledTaskLogItem::TYPE_FAILED => 'danger', 66 | }) 67 | ->formatStateUsing( 68 | fn(string $state): string => __('filament-schedule-monitor::translations.'.$state) 69 | ) 70 | ->action( 71 | Tables\Actions\ViewAction::make() 72 | ->modalHeading('') 73 | ->modalContent( 74 | fn(MonitoredScheduledTaskLogItem $record): HtmlString => new HtmlString( 75 | sprintf('
%s
', print_r($record->meta, true)) 76 | ) 77 | ) 78 | ), 79 | Tables\Columns\TextColumn::make('monitoredScheduledTask.name') 80 | ->label(__('filament-schedule-monitor::translations.name')) 81 | ->sortable(), 82 | Tables\Columns\TextColumn::make('meta.memory') 83 | ->label(__('filament-schedule-monitor::translations.memory')) 84 | ->sortable() 85 | ->formatStateUsing(fn(string $state): string => sprintf('%d MB', (int) $state / 1024 / 1024)), 86 | Tables\Columns\TextColumn::make('meta.runtime') 87 | ->label(__('filament-schedule-monitor::translations.runtime')) 88 | ->sortable() 89 | ->formatStateUsing(fn(string $state): string => sprintf('%.2fs', $state)), 90 | Tables\Columns\TextColumn::make('created_at') 91 | ->label(__('filament-schedule-monitor::translations.created_at')) 92 | ->sortable() 93 | ->dateTime(), 94 | ]) 95 | ->filters([ 96 | SelectFilter::make('type') 97 | ->label(__('filament-schedule-monitor::translations.type')) 98 | ->multiple() 99 | ->options([ 100 | MonitoredScheduledTaskLogItem::TYPE_STARTING => __('filament-schedule-monitor::translations.'.MonitoredScheduledTaskLogItem::TYPE_STARTING), 101 | MonitoredScheduledTaskLogItem::TYPE_FINISHED => __('filament-schedule-monitor::translations.'.MonitoredScheduledTaskLogItem::TYPE_FINISHED), 102 | MonitoredScheduledTaskLogItem::TYPE_SKIPPED => __('filament-schedule-monitor::translations.'.MonitoredScheduledTaskLogItem::TYPE_SKIPPED), 103 | MonitoredScheduledTaskLogItem::TYPE_FAILED => __('filament-schedule-monitor::translations.'.MonitoredScheduledTaskLogItem::TYPE_FAILED), 104 | ]), 105 | SelectFilter::make('name') 106 | ->attribute('monitored_scheduled_task_id') 107 | ->label(__('filament-schedule-monitor::translations.name')) 108 | ->multiple() 109 | ->options( 110 | MonitoredScheduledTask::all()->pluck('name', 'id') 111 | ), 112 | ]) 113 | ->filtersLayout(Tables\Enums\FiltersLayout::AboveContent); 114 | } 115 | 116 | public static function getPages(): array 117 | { 118 | return [ 119 | 'index' => MonitoredScheduledTaskLogItemResource\Pages\ListMonitoredScheduledTaskLogItems::route('/'), 120 | ]; 121 | } 122 | } 123 | --------------------------------------------------------------------------------