From b092f9a934cdac773a44a4e25eb4becacd434456 Mon Sep 17 00:00:00 2001 From: isaacclad Date: Thu, 16 Jul 2026 09:08:24 +0000 Subject: [PATCH] Nest Care team under settings with Frontdesk-style UI. Move team routes to /settings/team, restyle list and invite pages with settings layout and breadcrumbs, and keep legacy /members redirects. --- .../Controllers/Care/MemberController.php | 4 +- .../views/care/admin/members/create.blade.php | 140 ++++++++++-------- .../views/care/admin/members/index.blade.php | 124 +++++++++------- routes/web.php | 11 +- tests/Feature/CareWebTest.php | 4 +- 5 files changed, 160 insertions(+), 123 deletions(-) diff --git a/app/Http/Controllers/Care/MemberController.php b/app/Http/Controllers/Care/MemberController.php index a447d19..8af1770 100644 --- a/app/Http/Controllers/Care/MemberController.php +++ b/app/Http/Controllers/Care/MemberController.php @@ -29,12 +29,14 @@ class MemberController extends Controller ->orderBy('created_at') ->get(); + $adminRoles = ['super_admin', 'hospital_admin']; $clinicalRoles = ['doctor', 'nurse', 'lab_technician', 'pharmacist']; $heroStats = [ 'total' => $members->count(), + 'admins' => $members->whereIn('role', $adminRoles)->count(), 'clinical' => $members->whereIn('role', $clinicalRoles)->count(), - 'branches' => $members->whereNotNull('branch_id')->pluck('branch_id')->unique()->count(), + 'branch_scoped' => $members->whereNotNull('branch_id')->count(), ]; return view('care.admin.members.index', [ diff --git a/resources/views/care/admin/members/create.blade.php b/resources/views/care/admin/members/create.blade.php index f3116aa..4c7872e 100644 --- a/resources/views/care/admin/members/create.blade.php +++ b/resources/views/care/admin/members/create.blade.php @@ -1,78 +1,88 @@ -
-

Invite team member

-

They get access only to Ladill Care (plus Mail if they already have a Ladill mailbox).

+ +
+ Settings + / + Team + / + Invite +
-
- @csrf + + + @csrf + + @if (! empty($mailboxOptions)) +
+ + +

Or type any email below.

+
+ @endif - @if (! empty($mailboxOptions))
- - +

They will receive an email to accept and join your Care organization.

+ @error('email') +

{{ $message }}

+ @enderror +
+ +
+ + -

Or type any email below.

- @endif -
- - -

They will receive an email to accept and join your Care organization.

- @error('email') -

{{ $message }}

- @enderror -
+
+ + +
-
- - -
- -
- - -
- -
- -
-
- - -
-
- - +
+ +
+
+ + +
+
+ + +
-
- - -
+
+ Cancel + +
+ + + diff --git a/resources/views/care/admin/members/index.blade.php b/resources/views/care/admin/members/index.blade.php index 12dfbc9..3dd8cd6 100644 --- a/resources/views/care/admin/members/index.blade.php +++ b/resources/views/care/admin/members/index.blade.php @@ -1,55 +1,75 @@ - -
- - - Add member - - +@php + $member = auth()->user() + ? app(\App\Services\Care\OrganizationResolver::class)->memberFor(auth()->user()) + : null; + $permissions = app(\App\Services\Care\CarePermissions::class); + $canManageMembers = $permissions->can($member, 'admin.members.manage'); + $canViewBranches = $permissions->can($member, 'admin.branches.view'); +@endphp -
- - - - - - @foreach ($members as $member) - @php - $display = str_contains($member->user_ref, '@') - ? $member->user_ref - : (\App\Models\User::where('public_id', $member->user_ref)->value('email') ?? $member->user_ref); - @endphp - - - - - - - @endforeach - -
MemberRoleBranch
{{ $display }}{{ $roles[$member->role] ?? $member->role }}{{ $member->branch?->name ?? 'All branches' }} - @if ($member->user_ref !== auth()->user()->public_id) - - - Remove - - - @endif -
+ + +
+
+ Settings + / + Team + @if ($canViewBranches) + Branches + @endif +
+ @if ($canManageMembers) + Add member + @endif
-
+ + + @if ($members->isEmpty()) +

No team members yet.

+ @else +
+ + + + + + + + + + + @foreach ($members as $teamMember) + @php + $display = str_contains($teamMember->user_ref, '@') + ? $teamMember->user_ref + : (\App\Models\User::where('public_id', $teamMember->user_ref)->value('email') ?? $teamMember->user_ref); + @endphp + + + + + + + @endforeach + +
MemberRoleBranch
{{ $display }}{{ $roles[$teamMember->role] ?? $teamMember->role }}{{ $teamMember->branch?->name ?? 'All branches' }} + @if ($canManageMembers && $teamMember->user_ref !== auth()->user()->public_id) + + + + + + @endif +
+
+ @endif +
+ diff --git a/routes/web.php b/routes/web.php index cbdce75..0fe55fa 100644 --- a/routes/web.php +++ b/routes/web.php @@ -178,10 +178,13 @@ Route::middleware(['auth', 'platform.session'])->group(function () { Route::put('/practitioners/{practitioner}', [PractitionerController::class, 'update'])->name('care.practitioners.update'); Route::delete('/practitioners/{practitioner}', [PractitionerController::class, 'destroy'])->name('care.practitioners.destroy'); - Route::get('/members', [MemberController::class, 'index'])->name('care.members.index'); - Route::get('/members/create', [MemberController::class, 'create'])->name('care.members.create'); - Route::post('/members', [MemberController::class, 'store'])->name('care.members.store'); - Route::delete('/members/{member}', [MemberController::class, 'destroy'])->name('care.members.destroy'); + Route::get('/settings/team', [MemberController::class, 'index'])->name('care.members.index'); + Route::get('/settings/team/create', [MemberController::class, 'create'])->name('care.members.create'); + Route::post('/settings/team', [MemberController::class, 'store'])->name('care.members.store'); + Route::delete('/settings/team/{member}', [MemberController::class, 'destroy'])->name('care.members.destroy'); + + Route::redirect('/members', '/settings/team'); + Route::redirect('/members/create', '/settings/team/create'); Route::get('/audit-logs', [AuditLogController::class, 'index'])->name('care.audit.index'); Route::get('/audit-logs/export', [AuditLogController::class, 'export'])->name('care.audit.export'); diff --git a/tests/Feature/CareWebTest.php b/tests/Feature/CareWebTest.php index 2bc1503..f0ba781 100644 --- a/tests/Feature/CareWebTest.php +++ b/tests/Feature/CareWebTest.php @@ -139,7 +139,9 @@ class CareWebTest extends TestCase $this->actingAs($this->user) ->get(route('care.members.index')) ->assertOk() - ->assertSee('test-user-001'); + ->assertSee('Team members') + ->assertSee('test@example.com') + ->assertSee('Settings'); } public function test_audit_log_index_loads(): void