From 87ba4d232acabbad3b2845f5f4585f81e3a12904 Mon Sep 17 00:00:00 2001 From: "diana.dolgolyova" Date: Tue, 24 Mar 2026 19:08:37 +0300 Subject: [PATCH] feat: reminder status counts in dashboard card MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Напоминания card now shows: не спрош. (gold), придёт (green), не придёт (red) — same visual style as booking cards. Clickable to navigate to reminders tab. Skipped "нет ответа" per user request. --- src/app/admin/bookings/page.tsx | 38 ++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/src/app/admin/bookings/page.tsx b/src/app/admin/bookings/page.tsx index 56dccfc..69e30b5 100644 --- a/src/app/admin/bookings/page.tsx +++ b/src/app/admin/bookings/page.tsx @@ -582,6 +582,9 @@ interface DashboardCounts { od: TabCounts; remindersToday: number; remindersTomorrow: number; + remindersNotAsked: number; + remindersComing: number; + remindersCancelled: number; } function countByStatus(items: { status: string }[]): TabCounts { @@ -621,13 +624,17 @@ function DashboardSummary({ statusFilter, onNavigate, onFilter }: { return adminFetch(`/api/admin/open-day/bookings?eventId=${active.id}`).then((r) => r.json()); }), adminFetch("/api/admin/reminders").then((r) => r.json()).catch(() => []), - ]).then(([gb, mc, od, rem]: [{ status: string }[], { status: string }[], { status: string }[], { eventDate: string }[]]) => { + ]).then(([gb, mc, od, rem]: [{ status: string }[], { status: string }[], { status: string }[], { eventDate: string; reminderStatus?: string }[]]) => { + const upcoming = rem.filter((r) => r.eventDate === today || r.eventDate === tomorrow); setCounts({ classes: countByStatus(gb), mc: countByStatus(mc), od: countByStatus(od), remindersToday: rem.filter((r) => r.eventDate === today).length, remindersTomorrow: rem.filter((r) => r.eventDate === tomorrow).length, + remindersNotAsked: upcoming.filter((r) => !r.reminderStatus).length, + remindersComing: upcoming.filter((r) => r.reminderStatus === "coming").length, + remindersCancelled: upcoming.filter((r) => r.reminderStatus === "cancelled").length, }); }).catch(() => {}); }, []); @@ -667,6 +674,35 @@ function DashboardSummary({ statusFilter, onNavigate, onFilter }: { {counts.remindersToday > 0 && <>{counts.remindersToday}сегодня} {counts.remindersTomorrow > 0 && <>{counts.remindersTomorrow}завтра} +
+ {counts.remindersNotAsked > 0 && ( + { e.stopPropagation(); onNavigate(c.tab); }}> + {counts.remindersNotAsked} + не спрош. + + )} + {counts.remindersComing > 0 && ( + <> + {counts.remindersNotAsked > 0 && ·} + { e.stopPropagation(); onNavigate(c.tab); }}> + {counts.remindersComing} + придёт + + + )} + {counts.remindersCancelled > 0 && ( + <> + {(counts.remindersNotAsked > 0 || counts.remindersComing > 0) && ·} + { e.stopPropagation(); onNavigate(c.tab); }}> + {counts.remindersCancelled} + не придёт + + + )} +
); }