From ee346e35ab386ede83a95ae2ab2c6098c979ea79 Mon Sep 17 00:00:00 2001 From: Jay Hemnani <193022578+jayhemnani9910@users.noreply.github.com> Date: Sun, 1 Nov 2026 03:17:43 +0530 Subject: [PATCH] Sync the incident status after editing or deleting updates in the dashboard --- .../UpdatesRelationManager.php | 19 +++++- .../Resources/IncidentResourceTest.php | 67 +++++++++++++++++++ 2 files changed, 83 insertions(+), 3 deletions(-) diff --git a/src/Filament/Resources/Updates/RelationManagers/UpdatesRelationManager.php b/src/Filament/Resources/Updates/RelationManagers/UpdatesRelationManager.php index 70ea8154..b8b70196 100644 --- a/src/Filament/Resources/Updates/RelationManagers/UpdatesRelationManager.php +++ b/src/Filament/Resources/Updates/RelationManagers/UpdatesRelationManager.php @@ -2,6 +2,7 @@ namespace Cachet\Filament\Resources\Updates\RelationManagers; +use Cachet\Actions\Incident\SyncIncidentStatus; use Cachet\Enums\IncidentStatusEnum; use Cachet\Models\Incident; use Filament\Actions\BulkActionGroup; @@ -103,13 +104,25 @@ public function table(Table $table): Table ->visible(fn (): bool => $this->getOwnerRecord() instanceof Incident), ]) ->recordActions([ - EditAction::make(), - DeleteAction::make(), + EditAction::make()->after(fn () => $this->syncIncidentStatus()), + DeleteAction::make()->after(fn () => $this->syncIncidentStatus()), ]) ->toolbarActions([ BulkActionGroup::make([ - DeleteBulkAction::make(), + DeleteBulkAction::make()->after(fn () => $this->syncIncidentStatus()), ]), ]); } + + /** + * Keep the incident's status on its latest update, as the update actions do. + */ + private function syncIncidentStatus(): void + { + $incident = $this->getOwnerRecord(); + + if ($incident instanceof Incident) { + app(SyncIncidentStatus::class)->handle($incident); + } + } } diff --git a/tests/Feature/Filament/Resources/IncidentResourceTest.php b/tests/Feature/Filament/Resources/IncidentResourceTest.php index 92b5dca8..6872323d 100644 --- a/tests/Feature/Filament/Resources/IncidentResourceTest.php +++ b/tests/Feature/Filament/Resources/IncidentResourceTest.php @@ -16,6 +16,7 @@ use Cachet\Models\Subscriber; use Cachet\Notifications\NewIncidentNotification; use Cachet\Settings\MailSettings; +use Filament\Actions\Testing\TestAction; use Filament\Facades\Filament; use Illuminate\Support\Facades\Notification; use Workbench\App\User; @@ -185,3 +186,69 @@ expect(collect($options)->flatten()->all())->not->toContain('Already Attached'); }); + +it('syncs the incident status when an update is deleted from the updates tab', function () { + $incident = Incident::factory()->create(['status' => IncidentStatusEnum::fixed]); + $incident->updates()->create([ + 'message' => 'Cause identified.', + 'status' => IncidentStatusEnum::identified, + 'user_id' => auth()->id(), + 'created_at' => now()->subHour(), + ]); + $fixed = $incident->updates()->create([ + 'message' => 'All fixed.', + 'status' => IncidentStatusEnum::fixed, + 'user_id' => auth()->id(), + ]); + + livewire(UpdatesRelationManager::class, [ + 'ownerRecord' => $incident, + 'pageClass' => EditIncident::class, + ]) + ->callAction(TestAction::make('delete')->table($fixed)); + + expect($incident->fresh()->status)->toBe(IncidentStatusEnum::identified); +}); + +it('syncs the incident status when updates are bulk deleted from the updates tab', function () { + $incident = Incident::factory()->create(['status' => IncidentStatusEnum::fixed]); + $incident->updates()->create([ + 'message' => 'Cause identified.', + 'status' => IncidentStatusEnum::identified, + 'user_id' => auth()->id(), + 'created_at' => now()->subHour(), + ]); + $fixed = $incident->updates()->create([ + 'message' => 'All fixed.', + 'status' => IncidentStatusEnum::fixed, + 'user_id' => auth()->id(), + ]); + + livewire(UpdatesRelationManager::class, [ + 'ownerRecord' => $incident, + 'pageClass' => EditIncident::class, + ]) + ->selectTableRecords([$fixed]) + ->callAction(TestAction::make('delete')->table()->bulk()); + + expect($incident->fresh()->status)->toBe(IncidentStatusEnum::identified); +}); + +it('syncs the incident status when an update status is edited from the updates tab', function () { + $incident = Incident::factory()->create(['status' => IncidentStatusEnum::identified]); + $update = $incident->updates()->create([ + 'message' => 'Cause identified.', + 'status' => IncidentStatusEnum::identified, + 'user_id' => auth()->id(), + ]); + + livewire(UpdatesRelationManager::class, [ + 'ownerRecord' => $incident, + 'pageClass' => EditIncident::class, + ]) + ->callAction(TestAction::make('edit')->table($update), data: [ + 'status' => IncidentStatusEnum::fixed, + ]); + + expect($incident->fresh()->status)->toBe(IncidentStatusEnum::fixed); +});