diff --git a/composer.json b/composer.json index 5f7650a..3b17bfb 100644 --- a/composer.json +++ b/composer.json @@ -16,7 +16,7 @@ } ], "require": { - "php": "^8.0", + "php": "^8.1", "awcodes/filament-table-repeater": "^2.0.4", "filament/filament": "^3.0.47", "spatie/laravel-package-tools": "^1.13.5", diff --git a/database/migrations/2023_12_20_173900_change_status_type_in_schedule_table.php b/database/migrations/2023_12_20_173900_change_status_type_in_schedule_table.php new file mode 100644 index 0000000..f9ad1bf --- /dev/null +++ b/database/migrations/2023_12_20_173900_change_status_type_in_schedule_table.php @@ -0,0 +1,50 @@ +enum('new_status', ['active', 'inactive', 'trashed'])->default('active')->after('status'); + }); + + DB::table(Config::get('filament-database-schedule.table.schedules', 'schedules'))->where('status', 0)->update(['new_status' => 'inactive']); + DB::table(Config::get('filament-database-schedule.table.schedules', 'schedules'))->where('status', 1)->update(['new_status' => 'active']); + DB::table(Config::get('filament-database-schedule.table.schedules', 'schedules'))->where('status', 3)->update(['new_status' => 'trashed']); + + Schema::table(Config::get('filament-database-schedule.table.schedules', 'schedules'), function (Blueprint $table) { + $table->dropColumn('status'); + $table->renameColumn('new_status', 'status'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table(Config::get('filament-database-schedule.table.schedules', 'schedules'), function (Blueprint $table) { + $table->boolean('old_status')->default(true)->after('status'); + }); + + DB::table(Config::get('filament-database-schedule.table.schedules', 'schedules'))->where('status', 'inactive')->update(['old_status' => 0]); + DB::table(Config::get('filament-database-schedule.table.schedules', 'schedules'))->where('status', 'active')->update(['old_status' => 1]); + DB::table(Config::get('filament-database-schedule.table.schedules', 'schedules'))->where('status', 'trashed')->update(['old_status' => 3]); + + Schema::table(Config::get('filament-database-schedule.table.schedules', 'schedules'), function (Blueprint $table) { + $table->dropColumn('status'); + $table->renameColumn('old_status', 'status'); + }); + } +} diff --git a/src/Enums/Status.php b/src/Enums/Status.php new file mode 100644 index 0000000..f394303 --- /dev/null +++ b/src/Enums/Status.php @@ -0,0 +1,41 @@ + 'success', + self::Inactive => 'warning', + self::Trashed => 'danger', + }; + } + + public function getIcon(): ?string + { + return match ($this) { + self::Active => 'heroicon-o-check-circle', + self::Inactive => 'heroicon-o-document', + self::Trashed => 'heroicon-o-x-circle', + }; + } + + public function getLabel(): ?string + { + return match ($this) { + self::Active => __('filament-database-schedule::schedule.status.active'), + self::Inactive => __('filament-database-schedule::schedule.status.inactive'), + self::Trashed => __('filament-database-schedule::schedule.status.trashed'), + }; + } +} \ No newline at end of file diff --git a/src/Filament/Resources/ScheduleResource.php b/src/Filament/Resources/ScheduleResource.php index 0e7afba..10290a6 100644 --- a/src/Filament/Resources/ScheduleResource.php +++ b/src/Filament/Resources/ScheduleResource.php @@ -13,6 +13,7 @@ use Filament\Tables; use Filament\Tables\Columns\Column; use Filament\Tables\Table; +use HusamTariq\FilamentDatabaseSchedule\Enums\Status; use HusamTariq\FilamentDatabaseSchedule\Filament\Columns\ActionGroup; use HusamTariq\FilamentDatabaseSchedule\Filament\Columns\ScheduleArguments; use HusamTariq\FilamentDatabaseSchedule\Filament\Columns\ScheduleOptions; @@ -157,34 +158,11 @@ public static function table(Table $table): Table Tables\Columns\TextColumn::make('options')->label(__('filament-database-schedule::schedule.fields.options'))->searchable()->sortable()->getStateUsing(fn(Model $record)=>$record->getOptions())->separator(',')->badge(), Tables\Columns\TextColumn::make('expression')->label(__('filament-database-schedule::schedule.fields.expression'))->searchable()->sortable(), Tables\Columns\TextColumn::make('environments')->label(__('filament-database-schedule::schedule.fields.environments'))->separator(',')->searchable()->sortable()->badge()->toggleable(isToggledHiddenByDefault: false), - Tables\Columns\TextColumn::make('status')->formatStateUsing(static function ($state): ?string { - switch ($state) { - case Schedule::STATUS_INACTIVE: - return __('filament-database-schedule::schedule.status.inactive'); - break; - - case Schedule::STATUS_TRASHED: - return __('filament-database-schedule::schedule.status.trashed'); - break; - - case Schedule::STATUS_ACTIVE: - return __('filament-database-schedule::schedule.status.active'); - break; - - default: - return $state; - } - })->icons([ - 'heroicon-o-x-mark', - 'heroicon-o-document' => Schedule::STATUS_INACTIVE, - 'heroicon-o-x-circle' => Schedule::STATUS_TRASHED, - 'heroicon-o-check-circle' => Schedule::STATUS_ACTIVE, - ]) - ->colors([ - 'warning' => Schedule::STATUS_INACTIVE, - 'success' => Schedule::STATUS_ACTIVE, - 'danger' => Schedule::STATUS_TRASHED, - ])->label(__('filament-database-schedule::schedule.fields.status'))->searchable()->sortable()->toggleable(isToggledHiddenByDefault: false), + Tables\Columns\TextColumn::make('status') + ->label(__('filament-database-schedule::schedule.fields.status')) + ->searchable() + ->sortable() + ->toggleable(isToggledHiddenByDefault: false), Tables\Columns\TextColumn::make('created_at')->label(__('filament-database-schedule::schedule.fields.created_at'))->searchable()->sortable() ->dateTime()->wrap()->toggleable(isToggledHiddenByDefault: true), Tables\Columns\TextColumn::make('updated_at')->getStateUsing(fn ($record) => $record->created_at == $record->updated_at ? __('filament-database-schedule::schedule.fields.never') : $record->updated_at) @@ -211,14 +189,17 @@ public static function table(Table $table): Table Tables\Actions\RestoreAction::make()->tooltip(__('filament-actions::restore.single.label')), Tables\Actions\DeleteAction::make()->tooltip(__('filament-actions::delete.single.label')), Tables\Actions\ForceDeleteAction::make()->tooltip(__('filament-support::actions/force-delete.single.label')), - Tables\Actions\Action::make('toggle')->disabled(fn ($record) => $record->trashed()) - ->icon(fn ($record) => $record->status == Schedule::STATUS_ACTIVE ? 'schedule-pause-fill' : 'schedule-play-fill')->color(fn ($record) => $record->status == Schedule::STATUS_ACTIVE ? 'warning' : 'success')->action(function ($record): void { - if ($record->status == Schedule::STATUS_ACTIVE) - $record->status = Schedule::STATUS_INACTIVE; - else if ($record->status == Schedule::STATUS_INACTIVE) - $record->status = Schedule::STATUS_ACTIVE; + Tables\Actions\Action::make('toggle') + ->disabled(fn ($record) => $record->trashed()) + ->icon(fn ($record) => $record->status === Status::Active ? 'schedule-pause-fill' : 'schedule-play-fill') + ->color(fn ($record) => $record->status === Status::Active ? 'warning' : 'success') + ->action(function ($record): void { + if ($record->status === Status::Active) + $record->status = Status::Inactive; + else if ($record->status === Status::Inactive) + $record->status = Status::Active; $record->save(); - })->tooltip(fn ($record) => $record->status == Schedule::STATUS_ACTIVE ? __('filament-database-schedule::schedule.buttons.inactivate') : __('filament-database-schedule::schedule.buttons.activate')), + })->tooltip(fn ($record) => $record->status === Status::Active ? __('filament-database-schedule::schedule.buttons.inactivate') : __('filament-database-schedule::schedule.buttons.activate')), Tables\Actions\ViewAction::make()->icon('schedule-history')->color('gray')->tooltip(__('filament-database-schedule::schedule.buttons.history')), ]) diff --git a/src/Models/Schedule.php b/src/Models/Schedule.php index c6233e4..1b59cc2 100644 --- a/src/Models/Schedule.php +++ b/src/Models/Schedule.php @@ -2,6 +2,7 @@ namespace HusamTariq\FilamentDatabaseSchedule\Models; +use HusamTariq\FilamentDatabaseSchedule\Enums\Status; use Illuminate\Console\Scheduling\ManagesFrequencies; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; @@ -12,10 +13,6 @@ class Schedule extends Model use ManagesFrequencies; use SoftDeletes; - public const STATUS_INACTIVE = 0; - public const STATUS_ACTIVE = 1; - public const STATUS_TRASHED = 2; - /** * The database table used by the model. * @@ -58,6 +55,7 @@ class Schedule extends Model 'options' => 'array', 'options_with_value' => 'array', 'environments' => 'array', + 'status' => Status::class, ]; /** @@ -80,12 +78,12 @@ public function histories() public function scopeInactive($query) { - return $query->where('status', false); + return $query->where('status', Status::Inactive); } public function scopeActive($query) { - return $query->where('status', true); + return $query->where('status', Status::Active); } public function getArguments(): array diff --git a/src/Observer/ScheduleObserver.php b/src/Observer/ScheduleObserver.php index ec8b662..89d030a 100644 --- a/src/Observer/ScheduleObserver.php +++ b/src/Observer/ScheduleObserver.php @@ -2,6 +2,7 @@ namespace HusamTariq\FilamentDatabaseSchedule\Observer; +use HusamTariq\FilamentDatabaseSchedule\Enums\Status; use HusamTariq\FilamentDatabaseSchedule\Http\Services\ScheduleService; use HusamTariq\FilamentDatabaseSchedule\Models\Schedule; @@ -20,14 +21,14 @@ public function updated(Schedule $schedule) public function deleted(Schedule $schedule) { - $schedule->status = Schedule::STATUS_TRASHED; + $schedule->status = Status::Trashed; $schedule->saveQuietly(); $this->clearCache(); } public function restored(Schedule $schedule) { - $schedule->status = Schedule::STATUS_INACTIVE; + $schedule->status = Status::Inactive; $schedule->saveQuietly(); }