From 2f724daf490ebcce5cf244642d730697aa8d698f Mon Sep 17 00:00:00 2001 From: isaacclad Date: Sun, 19 Jul 2026 16:21:43 +0000 Subject: [PATCH] Open the matching workspace tab after specialty stage advance. Stage Move CTAs and pills previously always redirected to overview; map each stage to its tab via shell config so examination lands on exam, etc. Co-authored-by: Cursor --- .../Care/BloodBankWorkspaceController.php | 7 +++- .../Care/DentistryWorkspaceController.php | 7 +++- .../Care/EmergencyWorkspaceController.php | 7 +++- .../Care/OphthalmologyWorkspaceController.php | 7 +++- app/Services/Care/SpecialtyShellService.php | 24 ++++++++++++ config/care_specialty_shell.php | 37 +++++++++++++++++++ tests/Feature/CareBloodBankSuiteTest.php | 6 ++- tests/Feature/CareDentistrySuiteTest.php | 6 ++- tests/Feature/CareEmergencySuiteTest.php | 6 ++- tests/Feature/CareOphthalmologySuiteTest.php | 6 ++- tests/Feature/CareSpecialtyShellTest.php | 6 +++ 11 files changed, 111 insertions(+), 8 deletions(-) diff --git a/app/Http/Controllers/Care/BloodBankWorkspaceController.php b/app/Http/Controllers/Care/BloodBankWorkspaceController.php index e1c537b..d20d571 100644 --- a/app/Http/Controllers/Care/BloodBankWorkspaceController.php +++ b/app/Http/Controllers/Care/BloodBankWorkspaceController.php @@ -71,6 +71,7 @@ class BloodBankWorkspaceController extends Controller Visit $visit, SpecialtyModuleService $modules, SpecialtyVisitStageService $stages, + SpecialtyShellService $shell, ): RedirectResponse { $this->authorizeBloodBankClinical($request); $this->assertBloodBankManage($request, $modules); @@ -94,7 +95,11 @@ class BloodBankWorkspaceController extends Controller } return redirect() - ->route('care.specialty.workspace', ['module' => 'blood_bank', 'visit' => $visit, 'tab' => 'overview']) + ->route('care.specialty.workspace', [ + 'module' => 'blood_bank', + 'visit' => $visit, + 'tab' => $shell->workspaceTabForStage('blood_bank', $validated['stage']), + ]) ->with('success', 'Visit stage updated.'); } diff --git a/app/Http/Controllers/Care/DentistryWorkspaceController.php b/app/Http/Controllers/Care/DentistryWorkspaceController.php index bba21bb..996cdfc 100644 --- a/app/Http/Controllers/Care/DentistryWorkspaceController.php +++ b/app/Http/Controllers/Care/DentistryWorkspaceController.php @@ -536,6 +536,7 @@ class DentistryWorkspaceController extends Controller Visit $visit, SpecialtyModuleService $modules, SpecialtyVisitStageService $stages, + SpecialtyShellService $shell, ): RedirectResponse { $this->authorizeAbility($request, 'consultations.manage'); $this->assertDentistryManage($request, $modules); @@ -559,7 +560,11 @@ class DentistryWorkspaceController extends Controller } return redirect() - ->route('care.specialty.workspace', ['module' => 'dentistry', 'visit' => $visit, 'tab' => 'overview']) + ->route('care.specialty.workspace', [ + 'module' => 'dentistry', + 'visit' => $visit, + 'tab' => $shell->workspaceTabForStage('dentistry', $validated['stage']), + ]) ->with('success', 'Visit stage updated.'); } diff --git a/app/Http/Controllers/Care/EmergencyWorkspaceController.php b/app/Http/Controllers/Care/EmergencyWorkspaceController.php index 67df83e..1b327cb 100644 --- a/app/Http/Controllers/Care/EmergencyWorkspaceController.php +++ b/app/Http/Controllers/Care/EmergencyWorkspaceController.php @@ -44,6 +44,7 @@ class EmergencyWorkspaceController extends Controller Visit $visit, SpecialtyModuleService $modules, SpecialtyVisitStageService $stages, + SpecialtyShellService $shell, ): RedirectResponse { $this->authorizeAbility($request, 'consultations.manage'); $this->assertEmergencyManage($request, $modules); @@ -67,7 +68,11 @@ class EmergencyWorkspaceController extends Controller } return redirect() - ->route('care.specialty.workspace', ['module' => 'emergency', 'visit' => $visit, 'tab' => 'overview']) + ->route('care.specialty.workspace', [ + 'module' => 'emergency', + 'visit' => $visit, + 'tab' => $shell->workspaceTabForStage('emergency', $validated['stage']), + ]) ->with('success', 'Visit stage updated.'); } diff --git a/app/Http/Controllers/Care/OphthalmologyWorkspaceController.php b/app/Http/Controllers/Care/OphthalmologyWorkspaceController.php index 60dfb8e..c66d7fe 100644 --- a/app/Http/Controllers/Care/OphthalmologyWorkspaceController.php +++ b/app/Http/Controllers/Care/OphthalmologyWorkspaceController.php @@ -43,6 +43,7 @@ class OphthalmologyWorkspaceController extends Controller Visit $visit, SpecialtyModuleService $modules, SpecialtyVisitStageService $stages, + SpecialtyShellService $shell, ): RedirectResponse { $this->authorizeAbility($request, 'consultations.manage'); $this->assertOphthalmologyManage($request, $modules); @@ -66,7 +67,11 @@ class OphthalmologyWorkspaceController extends Controller } return redirect() - ->route('care.specialty.workspace', ['module' => 'ophthalmology', 'visit' => $visit, 'tab' => 'overview']) + ->route('care.specialty.workspace', [ + 'module' => 'ophthalmology', + 'visit' => $visit, + 'tab' => $shell->workspaceTabForStage('ophthalmology', $validated['stage']), + ]) ->with('success', 'Visit stage updated.'); } diff --git a/app/Services/Care/SpecialtyShellService.php b/app/Services/Care/SpecialtyShellService.php index 7165989..84a435e 100644 --- a/app/Services/Care/SpecialtyShellService.php +++ b/app/Services/Care/SpecialtyShellService.php @@ -226,6 +226,30 @@ class SpecialtyShellService return $merged; } + /** + * Workspace tab to open after advancing/setting a visit specialty stage. + * Uses module `stage_tabs` config, then same-named tab, then overview. + */ + public function workspaceTabForStage(string $moduleKey, string $stage): string + { + $stage = trim($stage); + $tabs = $this->workspaceTabs($moduleKey); + $map = $this->definition($moduleKey)['stage_tabs'] ?? []; + + if (is_array($map) && isset($map[$stage]) && is_string($map[$stage]) && $map[$stage] !== '') { + $candidate = $map[$stage]; + if (array_key_exists($candidate, $tabs)) { + return $candidate; + } + } + + if ($stage !== '' && array_key_exists($stage, $tabs)) { + return $stage; + } + + return array_key_exists('overview', $tabs) ? 'overview' : (array_key_first($tabs) ?: 'overview'); + } + /** * @return array */ diff --git a/config/care_specialty_shell.php b/config/care_specialty_shell.php index 7c329d0..621b24e 100644 --- a/config/care_specialty_shell.php +++ b/config/care_specialty_shell.php @@ -34,6 +34,12 @@ return [ 'billing' => 'Billing', 'documents' => 'Documents', ], + // Maps visit specialty_stage → workspace ?tab= after Move / stage pill POST. + 'stage_tabs' => [ + 'waiting' => 'overview', + 'in_care' => 'clinical_notes', + 'completed' => 'overview', + ], 'actions' => [ 'call_next' => 'Call next', 'start' => 'Start', @@ -73,6 +79,13 @@ return [ 'billing' => 'Billing', 'documents' => 'Documents', ], + 'stage_tabs' => [ + 'arrival' => 'triage', + 'resus' => 'triage', + 'treatment' => 'clinical_notes', + 'observation' => 'observation', + 'disposition' => 'disposition', + ], ], 'blood_bank' => [ 'stages' => [ @@ -99,6 +112,13 @@ return [ 'billing' => 'Billing', 'documents' => 'Documents', ], + 'stage_tabs' => [ + 'request' => 'requests', + 'crossmatch' => 'requests', + 'issue' => 'issue', + 'transfusion' => 'transfusion', + 'completed' => 'overview', + ], ], 'dentistry' => [ 'stages' => [ @@ -138,6 +158,13 @@ return [ 'billing' => 'Billing', 'documents' => 'Documents', ], + 'stage_tabs' => [ + 'waiting' => 'overview', + 'chair' => 'odontogram', + 'procedure' => 'treat', + 'recovery' => 'notes', + 'completed' => 'overview', + ], ], 'ophthalmology' => [ 'stages' => [ @@ -175,6 +202,16 @@ return [ 'billing' => 'Billing', 'documents' => 'Documents', ], + 'stage_tabs' => [ + 'check_in' => 'overview', + 'history' => 'overview', + 'refraction' => 'refraction', + 'exam' => 'exam', + 'investigation' => 'investigations', + 'plan' => 'plan', + 'treatment' => 'treat', + 'completed' => 'overview', + ], ], 'physiotherapy' => [ 'stages' => [ diff --git a/tests/Feature/CareBloodBankSuiteTest.php b/tests/Feature/CareBloodBankSuiteTest.php index f23dc6a..127009b 100644 --- a/tests/Feature/CareBloodBankSuiteTest.php +++ b/tests/Feature/CareBloodBankSuiteTest.php @@ -196,7 +196,11 @@ class CareBloodBankSuiteTest extends TestCase ->post(route('care.specialty.blood-bank.stage', $this->visit), [ 'stage' => 'crossmatch', ]) - ->assertRedirect(); + ->assertRedirect(route('care.specialty.workspace', [ + 'module' => 'blood_bank', + 'visit' => $this->visit, + 'tab' => 'requests', + ])); $this->assertSame('crossmatch', $this->visit->fresh()->specialty_stage); diff --git a/tests/Feature/CareDentistrySuiteTest.php b/tests/Feature/CareDentistrySuiteTest.php index 52c0825..2bfe532 100644 --- a/tests/Feature/CareDentistrySuiteTest.php +++ b/tests/Feature/CareDentistrySuiteTest.php @@ -311,7 +311,11 @@ class CareDentistrySuiteTest extends TestCase ->post(route('care.specialty.dentistry.stage', $this->visit), [ 'stage' => 'chair', ]) - ->assertRedirect(); + ->assertRedirect(route('care.specialty.workspace', [ + 'module' => 'dentistry', + 'visit' => $this->visit, + 'tab' => 'odontogram', + ])); $this->assertSame('chair', $this->visit->fresh()->specialty_stage); diff --git a/tests/Feature/CareEmergencySuiteTest.php b/tests/Feature/CareEmergencySuiteTest.php index 5f2e185..49f5788 100644 --- a/tests/Feature/CareEmergencySuiteTest.php +++ b/tests/Feature/CareEmergencySuiteTest.php @@ -182,7 +182,11 @@ class CareEmergencySuiteTest extends TestCase ->post(route('care.specialty.emergency.stage', $this->visit), [ 'stage' => 'treatment', ]) - ->assertRedirect(); + ->assertRedirect(route('care.specialty.workspace', [ + 'module' => 'emergency', + 'visit' => $this->visit, + 'tab' => 'clinical_notes', + ])); $this->assertSame('treatment', $this->visit->fresh()->specialty_stage); diff --git a/tests/Feature/CareOphthalmologySuiteTest.php b/tests/Feature/CareOphthalmologySuiteTest.php index 9ffca50..f3d1dc4 100644 --- a/tests/Feature/CareOphthalmologySuiteTest.php +++ b/tests/Feature/CareOphthalmologySuiteTest.php @@ -180,7 +180,11 @@ class CareOphthalmologySuiteTest extends TestCase ->post(route('care.specialty.ophthalmology.stage', $this->visit), [ 'stage' => 'treatment', ]) - ->assertRedirect(); + ->assertRedirect(route('care.specialty.workspace', [ + 'module' => 'ophthalmology', + 'visit' => $this->visit, + 'tab' => 'treat', + ])); $this->assertSame('treatment', $this->visit->fresh()->specialty_stage); diff --git a/tests/Feature/CareSpecialtyShellTest.php b/tests/Feature/CareSpecialtyShellTest.php index aeb1477..5b2bece 100644 --- a/tests/Feature/CareSpecialtyShellTest.php +++ b/tests/Feature/CareSpecialtyShellTest.php @@ -84,6 +84,12 @@ class CareSpecialtyShellTest extends TestCase $stages = $shell->stages('emergency'); $this->assertSame('arrival', $stages[0]['code'] ?? null); $this->assertGreaterThanOrEqual(4, count($stages)); + $this->assertSame('triage', $shell->workspaceTabForStage('emergency', 'arrival')); + $this->assertSame('exam', $shell->workspaceTabForStage('ophthalmology', 'exam')); + $this->assertSame('investigations', $shell->workspaceTabForStage('ophthalmology', 'investigation')); + $this->assertSame('treat', $shell->workspaceTabForStage('ophthalmology', 'treatment')); + $this->assertSame('odontogram', $shell->workspaceTabForStage('dentistry', 'chair')); + $this->assertSame('issue', $shell->workspaceTabForStage('blood_bank', 'issue')); } public function test_specialty_shell_overview_and_sections_render(): void