diff --git a/app/Http/Controllers/ActivityNotificationController.php b/app/Http/Controllers/ActivityNotificationController.php index 4445385..b53ce24 100644 --- a/app/Http/Controllers/ActivityNotificationController.php +++ b/app/Http/Controllers/ActivityNotificationController.php @@ -36,6 +36,6 @@ public function __invoke(Request $request) ] ); - return response()->json(['status' => 'ok']); + return back(); } } diff --git a/app/Http/Controllers/NotificationController.php b/app/Http/Controllers/NotificationController.php index 657738a..88afccd 100644 --- a/app/Http/Controllers/NotificationController.php +++ b/app/Http/Controllers/NotificationController.php @@ -35,7 +35,15 @@ public function unread(Request $request) ->select(['id', 'due_date', 'amount', 'contract_id', 'client_case_id', 'created_at']) ->whereNotNull('due_date') ->whereDate('due_date', '<=', $today) - // Removed per-user unread filter: show notifications regardless of individual reads + // Exclude activities that have been marked as read by this user + ->whereNotExists(function ($q) use ($user, $today) { + $q->select(\DB::raw(1)) + ->from('activity_notification_reads') + ->whereColumn('activity_notification_reads.activity_id', 'activities.id') + ->where('activity_notification_reads.user_id', $user->id) + ->whereDate('activity_notification_reads.due_date', '<=', $today) + ->whereNotNull('activity_notification_reads.read_at'); + }) ->when($clientCaseIdsForFilter->isNotEmpty(), function ($q) use ($clientCaseIdsForFilter) { // Filter by clients: activities directly on any of the client's cases OR via contracts under those cases $q->where(function ($qq) use ($clientCaseIdsForFilter) { @@ -108,7 +116,15 @@ public function unread(Request $request) ->select(['contract_id', 'client_case_id']) ->whereNotNull('due_date') ->whereDate('due_date', '<=', $today) - // Removed per-user unread filter for client list base + // Exclude activities that have been marked as read by this user + ->whereNotExists(function ($q) use ($user, $today) { + $q->select(\DB::raw(1)) + ->from('activity_notification_reads') + ->whereColumn('activity_notification_reads.activity_id', 'activities.id') + ->where('activity_notification_reads.user_id', $user->id) + ->whereDate('activity_notification_reads.due_date', '<=', $today) + ->whereNotNull('activity_notification_reads.read_at'); + }) ->when($clientCaseIdsForFilter->isNotEmpty(), function ($q) use ($clientCaseIdsForFilter) { $q->where(function ($qq) use ($clientCaseIdsForFilter) { $qq->whereIn('activities.client_case_id', $clientCaseIdsForFilter) diff --git a/resources/js/Layouts/Partials/NotificationsBell.vue b/resources/js/Layouts/Partials/NotificationsBell.vue index 3ca8545..0146b3c 100644 --- a/resources/js/Layouts/Partials/NotificationsBell.vue +++ b/resources/js/Layouts/Partials/NotificationsBell.vue @@ -1,6 +1,6 @@ diff --git a/resources/js/Pages/Notifications/Unread.vue b/resources/js/Pages/Notifications/Unread.vue index f9bc2f8..6a21b5f 100644 --- a/resources/js/Pages/Notifications/Unread.vue +++ b/resources/js/Pages/Notifications/Unread.vue @@ -67,11 +67,14 @@ watch(selectedClient, (val) => { }); }); -async function markRead(id) { - try { - await window.axios.post(route("notifications.activity.read"), { activity_id: id }); - router.reload({ only: ["activities"] }); - } catch (e) {} +function markRead(id) { + router.patch(route("notifications.activity.read"), + { activity_id: id }, + { + only: ["activities"], + preserveScroll: true + } + ); } diff --git a/routes/web.php b/routes/web.php index dce054d..489d353 100644 --- a/routes/web.php +++ b/routes/web.php @@ -358,7 +358,7 @@ // Notifications: unread list and mark one activity as read (today) Route::get('notifications/unread', [NotificationController::class, 'unread'])->name('notifications.unread'); - Route::post('notifications/activity/read', ActivityNotificationController::class)->name('notifications.activity.read'); + Route::patch('notifications/activity/read', ActivityNotificationController::class)->name('notifications.activity.read'); Route::delete('contracts/{contract:uuid}/documents/{document:uuid}', [ClientCaseContoller::class, 'deleteContractDocument'])->name('contract.document.delete'); // settings Route::get('settings', [SettingController::class, 'index'])->name('settings');