diff --git a/app/Http/Middleware/HandleInertiaRequests.php b/app/Http/Middleware/HandleInertiaRequests.php index 1092882..bde195a 100644 --- a/app/Http/Middleware/HandleInertiaRequests.php +++ b/app/Http/Middleware/HandleInertiaRequests.php @@ -2,6 +2,10 @@ namespace App\Http\Middleware; +use App\Enums\EmployeeAdvanceStatus; +use App\Enums\LeaveRequestStatus; +use App\Models\EmployeeAdvance; +use App\Models\LeaveRequest; use App\Services\System\Setting\SystemService; use App\Settings\SystemSettings; use Illuminate\Http\Request; @@ -63,6 +67,34 @@ public function share(Request $request): array || $request->cookie('sidebar_state') === 'true', 'appearance' => $request->cookie('appearance', 'system'), 'vapidPublicKey' => config('webpush.vapid.public_key'), + 'pendingLeaveRequests' => fn () => $this->pendingLeaveRequests($request), + 'pendingEmployeeAdvances' => fn () => $this->pendingEmployeeAdvances($request), ]; } + + private function pendingLeaveRequests(Request $request): int + { + $user = $request->user(); + + if ($user === null || ! $user->hasAnyRole(['owner', 'developer'])) { + return 0; + } + + return LeaveRequest::query() + ->where('status', LeaveRequestStatus::PENDING) + ->count(); + } + + private function pendingEmployeeAdvances(Request $request): int + { + $user = $request->user(); + + if ($user === null || ! $user->hasAnyRole(['owner', 'developer'])) { + return 0; + } + + return EmployeeAdvance::query() + ->where('status', EmployeeAdvanceStatus::PENDING) + ->count(); + } } diff --git a/package-lock.json b/package-lock.json index 697bc31..9366f87 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,7 +12,7 @@ "@fullcalendar/vue3": "^6.1.20", "@inertiajs/vite": "^3.0.0", "@inertiajs/vue3": "^3.0.0", - "@lucide/vue": "^1.18.0", + "@lucide/vue": "^1.21.0", "@point-of-sale/receipt-printer-encoder": "^3.0.3", "@point-of-sale/webbluetooth-receipt-printer": "^2.0.0", "@point-of-sale/webserial-receipt-printer": "^2.0.0", @@ -2618,9 +2618,9 @@ "license": "MIT" }, "node_modules/@lucide/vue": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/@lucide/vue/-/vue-1.18.0.tgz", - "integrity": "sha512-DmnUpDB85PlMZ+ofjZLcKq3JoJnaD1bk7SIj9xwUvqerfNqA6hCLa0/m3gIybH6rdrErABbqvTD8yYJdNqiZ3Q==", + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@lucide/vue/-/vue-1.21.0.tgz", + "integrity": "sha512-eoFn3tppjKAc12ZqdnRSMFdtwQ1ZMRQFb6SV1Eub6Y8kU28ccnqKeSFdnur9hMg8gIbosU2Y3WFJr/J/xS/IlQ==", "license": "ISC", "peerDependencies": { "vue": ">=3.0.1" diff --git a/package.json b/package.json index b6ec731..0c8ae49 100644 --- a/package.json +++ b/package.json @@ -40,7 +40,7 @@ "@fullcalendar/vue3": "^6.1.20", "@inertiajs/vite": "^3.0.0", "@inertiajs/vue3": "^3.0.0", - "@lucide/vue": "^1.18.0", + "@lucide/vue": "^1.21.0", "@point-of-sale/receipt-printer-encoder": "^3.0.3", "@point-of-sale/webbluetooth-receipt-printer": "^2.0.0", "@point-of-sale/webserial-receipt-printer": "^2.0.0", diff --git a/resources/js/components/AppSidebar.vue b/resources/js/components/AppSidebar.vue index 97af191..4d07b2c 100644 --- a/resources/js/components/AppSidebar.vue +++ b/resources/js/components/AppSidebar.vue @@ -9,6 +9,7 @@ import { SidebarGroupLabel, SidebarHeader, SidebarMenu, + SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem, SidebarRail, @@ -23,6 +24,7 @@ interface MenuItem { href: string; icon: any; permission?: string; + badgeKey?: 'pendingLeaveRequests' | 'pendingEmployeeAdvances'; } interface MenuGroup { @@ -60,7 +62,7 @@ const menuGroups: MenuGroup[] = [ items: [ { title: 'Kas Toko', href: '/admin/finance/cash', icon: Wallet, permission: 'cash.view' }, { title: 'Pengeluaran', href: '/admin/finance/expenses', icon: Receipt, permission: 'expenses.view' }, - { title: 'Kasbon', href: '/admin/finance/employee-advances', icon: Banknote, permission: 'employee-advances.view' }, + { title: 'Kasbon', href: '/admin/finance/employee-advances', icon: Banknote, permission: 'employee-advances.view', badgeKey: 'pendingEmployeeAdvances' }, { title: 'Gaji', href: '/admin/finance/payroll', icon: WalletCards, permission: 'payroll.view' }, ], }, @@ -69,7 +71,7 @@ const menuGroups: MenuGroup[] = [ items: [ { title: 'Pegawai', href: '/admin/hr/employees', icon: Users, permission: 'employees.view' }, { title: 'Presensi', href: '/admin/hr/attendances', icon: Clock, permission: 'attendances.view' }, - { title: 'Cuti', href: '/admin/hr/leave-requests', icon: CalendarDays, permission: 'leave-requests.view' }, + { title: 'Cuti', href: '/admin/hr/leave-requests', icon: CalendarDays, permission: 'leave-requests.view', badgeKey: 'pendingLeaveRequests' }, ], }, { @@ -116,6 +118,9 @@ const menuGroups: MenuGroup[] = [ {{ item.title }} + + {{ (page.props as any)[item.badgeKey] }} +