{{-- Clinic section of the admin sidebar, built from one list so every entry gets a Keenicons duotone icon, a permission check, an "active" state and optional count badge. The group that holds the current page opens by itself; groups the admin has no entry in are hidden. --}} @php $admin = auth('admin')->user(); $route = (string) \Illuminate\Support\Facades\Route::currentRouteName(); $starts = fn (string ...$prefixes) => collect($prefixes)->contains(fn ($prefix) => str_starts_with($route, $prefix)); // Counts are only computed for entries the admin can see. $badge = function (string $permission, callable $count) use ($admin) { if (! $admin?->can($permission)) { return null; } $value = (int) $count(); return $value > 0 ? $value : null; }; $pendingBookings = $badge('clinic.bookings.view', fn () => \App\Models\Clinic\Booking::query()->where('status', 'pending')->where('scheduled_at', '>=', now()->startOfDay())->count()); $pendingFollowups = $badge('clinic.followups.view', fn () => app(\App\Services\Clinic\FollowupService::class)->pendingQuery($admin)->count()); $pendingMedicine = $badge('clinic.medicine_orders.view', fn () => \App\Models\Clinic\MedicineOrder::query()->where('status', 'pending')->count()); $newLeads = $badge('crm.leads.view', fn () => \App\Models\Crm\Lead::query()->where('status', 'new')->whereNull('assigned_to')->count()); $myDueLeads = $badge('crm.leads.view', fn () => \App\Models\Crm\Lead::query()->due()->where('assigned_to', $admin->id)->count()); $myFollowUpsView = $starts('admin.dashboard.crm.leads.index') && request('assignee') === 'mine'; $newSubscriptions = $badge('clinic.offers.view', fn () => \App\Models\Site\SiteOfferSubscription::query()->where('status', 'new')->count()); $groups = [ [ 'key' => 'bookings', 'icon' => 'calendar-tick', 'title' => trans('sidebar.clinic_group_bookings'), 'items' => [ ['route' => 'admin.dashboard.clinic.bookings.index', 'can' => 'clinic.bookings.view', 'icon' => 'calendar-8', 'title' => trans('sidebar.bookings'), 'active' => $starts('admin.dashboard.clinic.bookings.') && $route !== 'admin.dashboard.clinic.bookings.create', 'badge' => $pendingBookings, 'badgeColor' => 'warning'], ['route' => 'admin.dashboard.clinic.bookings.create', 'can' => 'clinic.bookings.create', 'icon' => 'calendar-add', 'title' => trans('sidebar.clinic_new_booking'), 'active' => $route === 'admin.dashboard.clinic.bookings.create'], ['route' => 'admin.dashboard.clinic.followups.index', 'can' => 'clinic.followups.view', 'icon' => 'arrows-circle', 'title' => trans('sidebar.clinic_followups'), 'active' => $starts('admin.dashboard.clinic.followups.'), 'badge' => $pendingFollowups, 'badgeColor' => 'danger'], ['route' => 'admin.dashboard.clinic.schedules.index', 'can' => 'clinic.schedules.view', 'icon' => 'time', 'title' => trans('sidebar.doctor_schedules'), 'active' => $starts('admin.dashboard.clinic.schedules.', 'admin.dashboard.clinic.doctors.schedule.')], ], ], [ 'key' => 'patients', 'icon' => 'profile-circle', 'title' => trans('sidebar.clinic_group_patients'), 'items' => [ ['route' => 'admin.dashboard.clinic.patients.index', 'can' => 'clinic.patients.view', 'icon' => 'people', 'title' => trans('sidebar.patients'), 'active' => $starts('admin.dashboard.clinic.patients.')], ['route' => 'admin.dashboard.clinic.medicine-orders.index', 'can' => 'clinic.medicine_orders.view', 'icon' => 'capsule', 'title' => trans('sidebar.medicine_orders'), 'active' => $starts('admin.dashboard.clinic.medicine-orders.'), 'badge' => $pendingMedicine, 'badgeColor' => 'warning'], ['route' => 'admin.dashboard.clinic.reviews.index', 'can' => 'clinic.reviews.view', 'icon' => 'star', 'title' => trans('sidebar.reviews'), 'active' => $starts('admin.dashboard.clinic.reviews.')], ], ], [ 'key' => 'team', 'icon' => 'security-user', 'title' => trans('sidebar.clinic_group_staff'), 'items' => [ ['route' => 'admin.dashboard.clinic.doctors.index', 'can' => 'clinic.doctors.view', 'icon' => 'user-tick', 'title' => trans('sidebar.doctors'), 'active' => $starts('admin.dashboard.clinic.doctors.') && ! $starts('admin.dashboard.clinic.doctors.schedule.')], ['route' => 'admin.dashboard.clinic.staff.index', 'can' => 'clinic.staff.view', 'icon' => 'user-square', 'title' => trans('sidebar.clinic_staff'), 'active' => $starts('admin.dashboard.clinic.staff.')], ], ], [ 'key' => 'clinics', 'icon' => 'bank', 'title' => trans('sidebar.clinic_group_clinics'), 'items' => [ ['route' => 'admin.dashboard.clinic.clinics.index', 'can' => 'clinic.clinics.view', 'icon' => 'home-2', 'title' => trans('sidebar.clinics'), 'active' => $starts('admin.dashboard.clinic.clinics.')], ['route' => 'admin.dashboard.clinic.specialties.index', 'can' => 'clinic.specialties.view', 'icon' => 'heart-circle', 'title' => trans('sidebar.specialties'), 'active' => $starts('admin.dashboard.clinic.specialties.')], ['route' => 'admin.dashboard.clinic.pricing.index', 'can' => 'clinic.pricing.view', 'icon' => 'price-tag', 'title' => trans('sidebar.clinic_pricing'), 'active' => $starts('admin.dashboard.clinic.pricing.')], ['route' => 'admin.dashboard.clinic.medical-options.index', 'can' => 'clinic.medical_options.view', 'icon' => 'capsule', 'title' => trans('sidebar.medical_options'), 'active' => $starts('admin.dashboard.clinic.medical-options.')], ], ], [ 'key' => 'marketing', 'icon' => 'discount', 'title' => trans('sidebar.clinic_group_marketing'), 'items' => [ ['route' => 'admin.dashboard.clinic.offers.index', 'can' => 'clinic.offers.view', 'icon' => 'gift', 'title' => trans('sidebar.offers'), 'active' => $starts('admin.dashboard.clinic.offers.')], ['route' => 'admin.offer-subscriptions.index', 'can' => 'clinic.offers.view', 'icon' => 'notification-status', 'title' => trans('sidebar.offer_subscriptions'), 'active' => $starts('admin.offer-subscriptions.'), 'badge' => $newSubscriptions, 'badgeColor' => 'danger'], ['route' => 'admin.dashboard.clinic.banners.index', 'can' => 'clinic.banners.view', 'icon' => 'speaker', 'title' => trans('sidebar.banners'), 'active' => $starts('admin.dashboard.clinic.banners.')], ['route' => 'admin.dashboard.clinic.faqs.index', 'can' => 'clinic.faqs.view', 'icon' => 'message-question', 'title' => trans('sidebar.faqs'), 'active' => $starts('admin.dashboard.clinic.faqs.')], ], ], [ 'key' => 'crm', 'icon' => 'call', 'title' => trans('crm.title'), 'items' => [ ['route' => 'admin.dashboard.crm.leads.index', 'can' => 'crm.leads.view', 'icon' => 'people', 'title' => trans('crm.leads'), 'active' => $starts('admin.dashboard.crm.leads.') && ! $myFollowUpsView, 'badge' => $newLeads, 'badgeColor' => 'danger'], ['route' => 'admin.dashboard.crm.leads.index', 'params' => ['assignee' => 'mine', 'follow_up' => 'due'], 'can' => 'crm.leads.view', 'icon' => 'timer', 'title' => trans('crm.list.my_follow_ups'), 'active' => $myFollowUpsView, 'badge' => $myDueLeads, 'badgeColor' => 'warning'], ['route' => 'admin.dashboard.crm.report', 'can' => 'crm.reports.view', 'icon' => 'chart-simple', 'title' => trans('crm.report.title'), 'active' => $route === 'admin.dashboard.crm.report'], ], ], [ 'key' => 'reports', 'icon' => 'chart-pie-simple', 'title' => trans('sidebar.clinic_group_reports'), 'items' => [ ['route' => 'admin.dashboard.clinic.reports.statistics', 'can' => 'clinic.reports.view', 'icon' => 'chart-pie-simple', 'title' => trans('clinic.reports_center.statistics'), 'active' => $route === 'admin.dashboard.clinic.reports.statistics'], ['route' => 'admin.dashboard.clinic.reports.revenue', 'can' => 'clinic.reports.view', 'icon' => 'chart-line-star', 'title' => trans('clinic.reports_center.revenue'), 'active' => $route === 'admin.dashboard.clinic.reports.revenue'], ['route' => 'admin.dashboard.clinic.reports.clinic-profit', 'can' => 'clinic.reports.view', 'icon' => 'bank', 'title' => trans('clinic.reports_center.clinic_profit'), 'active' => $route === 'admin.dashboard.clinic.reports.clinic-profit'], ['route' => 'admin.dashboard.clinic.reports.doctor-account', 'can' => 'clinic.reports.view', 'icon' => 'wallet', 'title' => trans('clinic.reports_center.doctor_account'), 'active' => $route === 'admin.dashboard.clinic.reports.doctor-account'], ['route' => 'admin.dashboard.clinic.reports.index', 'can' => 'clinic.reports.view', 'icon' => 'chart-simple', 'title' => trans('sidebar.clinic_reports'), 'active' => $route === 'admin.dashboard.clinic.reports.index'], ], ], ]; // Keep only entries the admin may open (and whose route exists). $groups = collect($groups) ->map(function ($group) use ($admin) { $group['items'] = collect($group['items']) ->filter(fn ($item) => \Illuminate\Support\Facades\Route::has($item['route']) && $admin?->can($item['can'])) ->values(); $group['active'] = $group['items']->contains('active', true); $group['badge'] = $group['items']->sum(fn ($item) => $item['badge'] ?? 0) ?: null; return $group; }) ->filter(fn ($group) => $group['items']->isNotEmpty()); $canSeeHome = $admin?->can('clinic.reports.view') || $admin?->can('clinic.bookings.view'); @endphp @if ($canSeeHome || $groups->isNotEmpty())
@if ($canSeeHome) @endif @foreach ($groups as $group) @endforeach @endif