From 614809a7c64c00fd1d9fb8cd6c06dba3710873fa Mon Sep 17 00:00:00 2001 From: Tajim Date: Fri, 28 Aug 2026 21:09:00 +0600 Subject: [PATCH 1/3] fix(chat): avoid truncate foreign key constraint error when clearing messages --- app/Http/Controllers/Admin/ChatSettingsController.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/app/Http/Controllers/Admin/ChatSettingsController.php b/app/Http/Controllers/Admin/ChatSettingsController.php index e13663c..5ea6bdd 100644 --- a/app/Http/Controllers/Admin/ChatSettingsController.php +++ b/app/Http/Controllers/Admin/ChatSettingsController.php @@ -6,9 +6,11 @@ use App\Http\Controllers\Controller; use App\Models\AppSetting; use App\Models\ChatMessage; +use App\Models\ChatMessageReaction; use App\Models\ChatReport; use App\Models\User; use Illuminate\Http\Request; +use Illuminate\Support\Facades\DB; use Inertia\Inertia; class ChatSettingsController extends Controller @@ -127,7 +129,10 @@ public function update(Request $request) public function clearMessages() { - ChatMessage::truncate(); + DB::transaction(function () { + ChatMessageReaction::query()->delete(); + ChatMessage::query()->delete(); + }); return back()->with('success', 'All chat messages have been cleared.'); } From db828f6921b2c5955cc8d835764f2e7f3343caec Mon Sep 17 00:00:00 2001 From: Tajim Date: Fri, 28 Aug 2026 21:10:33 +0600 Subject: [PATCH 2/3] feat(chat): add bulk delete option for reported messages --- .../Admin/ChatSettingsController.php | 15 +++++++ resources/js/pages/admin/chat/Reports.vue | 41 +++++++++++++++++++ routes/admin.php | 1 + 3 files changed, 57 insertions(+) diff --git a/app/Http/Controllers/Admin/ChatSettingsController.php b/app/Http/Controllers/Admin/ChatSettingsController.php index 5ea6bdd..6124274 100644 --- a/app/Http/Controllers/Admin/ChatSettingsController.php +++ b/app/Http/Controllers/Admin/ChatSettingsController.php @@ -155,6 +155,21 @@ public function deleteReport(ChatReport $report) return back()->with('success', 'Report deleted successfully.'); } + public function clearReports(Request $request) + { + $status = $request->input('status'); + + if ($status && in_array($status, ['pending', 'reviewed', 'dismissed'], true)) { + ChatReport::where('status', $status)->delete(); + $message = "All {$status} reports have been deleted."; + } else { + ChatReport::query()->delete(); + $message = 'All report records have been deleted.'; + } + + return back()->with('success', $message); + } + public function updateUserBan(Request $request, User $user) { if ($user->can('view admin')) { diff --git a/resources/js/pages/admin/chat/Reports.vue b/resources/js/pages/admin/chat/Reports.vue index 456773b..9548f87 100644 --- a/resources/js/pages/admin/chat/Reports.vue +++ b/resources/js/pages/admin/chat/Reports.vue @@ -81,6 +81,20 @@ const deleteReport = (reportId: number) => { } }; +const handleClearReports = (statusFilter?: string) => { + const isFiltered = statusFilter && statusFilter !== 'all'; + const confirmMessage = isFiltered + ? `Are you sure you want to permanently delete all ${statusFilter} report records? This action cannot be undone.` + : 'Are you sure you want to permanently delete ALL report records? This action cannot be undone.'; + + if (confirm(confirmMessage)) { + router.delete('/admin/chat/reports/clear', { + data: isFiltered ? { status: statusFilter } : {}, + preserveScroll: true, + }); + } +}; + const isBanModalOpen = ref(false); const selectedUser = ref(null); @@ -150,6 +164,33 @@ const formatDate = (isoString?: string | null) => {

+ + +
+ +
diff --git a/routes/admin.php b/routes/admin.php index 7cb3c49..81d68a7 100644 --- a/routes/admin.php +++ b/routes/admin.php @@ -119,6 +119,7 @@ Route::post('/chat/settings', [ChatSettingsController::class, 'update'])->name('chat.settings.update'); Route::post('/chat/clear', [ChatSettingsController::class, 'clearMessages'])->name('chat.clear'); Route::patch('/chat/reports/{report}/status', [ChatSettingsController::class, 'updateReportStatus'])->name('chat.reports.update-status'); + Route::delete('/chat/reports/clear', [ChatSettingsController::class, 'clearReports'])->name('chat.reports.clear'); Route::delete('/chat/reports/{report}', [ChatSettingsController::class, 'deleteReport'])->name('chat.reports.destroy'); Route::post('/chat/users/{user}/ban', [ChatSettingsController::class, 'updateUserBan'])->name('chat.users.ban'); }); From 4599f21083b84f7b06252dd2a32b7f6e695c3124 Mon Sep 17 00:00:00 2001 From: Tajim Date: Fri, 28 Aug 2026 21:12:34 +0600 Subject: [PATCH 3/3] fix(auth): improve dark mode focus and background styling for onboarding inputs --- resources/js/pages/auth/Onboarding.vue | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/resources/js/pages/auth/Onboarding.vue b/resources/js/pages/auth/Onboarding.vue index f304ff2..1cf9102 100644 --- a/resources/js/pages/auth/Onboarding.vue +++ b/resources/js/pages/auth/Onboarding.vue @@ -147,9 +147,9 @@ const submit = () => { required placeholder="Your full name" :disabled="form.processing" - class="w-full rounded-xl border border-slate-300 bg-white py-2.5 pr-3.5 pl-10 text-sm text-slate-900 transition outline-none placeholder:text-slate-400 focus:border-indigo-500 focus:ring-2 focus:ring-indigo-500/20 disabled:bg-slate-50 dark:border-gray-700 dark:bg-gray-950 dark:text-gray-100 dark:placeholder:text-gray-500" + class="w-full rounded-xl border border-slate-300 bg-white py-2.5 pr-3.5 pl-10 text-sm text-slate-900 transition outline-none placeholder:text-slate-400 focus:border-indigo-500 focus:ring-2 focus:ring-indigo-500/20 disabled:bg-slate-50 dark:border-gray-700 dark:bg-gray-800/80 dark:text-gray-100 dark:placeholder:text-gray-500 dark:focus:border-indigo-400 dark:focus:ring-indigo-400/20" :class="{ - 'border-rose-500 focus:ring-rose-500/20': + 'border-rose-500 focus:ring-rose-500/20 dark:border-rose-500 dark:focus:border-rose-400 dark:focus:ring-rose-400/20': form.errors.name, }" /> @@ -183,9 +183,9 @@ const submit = () => { required placeholder="your_username" :disabled="form.processing" - class="w-full rounded-xl border border-slate-300 bg-white py-2.5 pr-3.5 pl-10 text-sm text-slate-900 transition outline-none placeholder:text-slate-400 focus:border-indigo-500 focus:ring-2 focus:ring-indigo-500/20 disabled:bg-slate-50 dark:border-gray-700 dark:bg-gray-950 dark:text-gray-100 dark:placeholder:text-gray-500" + class="w-full rounded-xl border border-slate-300 bg-white py-2.5 pr-3.5 pl-10 text-sm text-slate-900 transition outline-none placeholder:text-slate-400 focus:border-indigo-500 focus:ring-2 focus:ring-indigo-500/20 disabled:bg-slate-50 dark:border-gray-700 dark:bg-gray-800/80 dark:text-gray-100 dark:placeholder:text-gray-500 dark:focus:border-indigo-400 dark:focus:ring-indigo-400/20" :class="{ - 'border-rose-500 focus:ring-rose-500/20': + 'border-rose-500 focus:ring-rose-500/20 dark:border-rose-500 dark:focus:border-rose-400 dark:focus:ring-rose-400/20': form.errors.username, }" /> @@ -226,9 +226,9 @@ const submit = () => { required placeholder="e.g., Notre Dame College, Dhaka College, BUET" :disabled="form.processing" - class="w-full rounded-xl border border-slate-300 bg-white py-2.5 pr-3.5 pl-10 text-sm text-slate-900 transition outline-none placeholder:text-slate-400 focus:border-indigo-500 focus:ring-2 focus:ring-indigo-500/20 disabled:bg-slate-50 dark:border-gray-700 dark:bg-gray-950 dark:text-gray-100 dark:placeholder:text-gray-500" + class="w-full rounded-xl border border-slate-300 bg-white py-2.5 pr-3.5 pl-10 text-sm text-slate-900 transition outline-none placeholder:text-slate-400 focus:border-indigo-500 focus:ring-2 focus:ring-indigo-500/20 disabled:bg-slate-50 dark:border-gray-700 dark:bg-gray-800/80 dark:text-gray-100 dark:placeholder:text-gray-500 dark:focus:border-indigo-400 dark:focus:ring-indigo-400/20" :class="{ - 'border-rose-500 focus:ring-rose-500/20': + 'border-rose-500 focus:ring-rose-500/20 dark:border-rose-500 dark:focus:border-rose-400 dark:focus:ring-rose-400/20': form.errors.school, }" />