mirror of
https://github.com/Tria-plc/edr-platform.git
synced 2026-08-26 18:42:49 +00:00
Removing Blocked seat from dashboard
This commit is contained in:
@@ -10,9 +10,7 @@ import {
|
||||
Banknote,
|
||||
ArrowRight,
|
||||
ScanLine,
|
||||
Ban,
|
||||
} from "lucide-react";
|
||||
import { SEAT_BLOCK_REASON_CATEGORY_LABELS } from "@edr/types";
|
||||
import { dashboardApi } from "@/lib/api/dashboard";
|
||||
import { apiClient } from "@/lib/api-client";
|
||||
import { formatCurrency } from "@/lib/utils";
|
||||
@@ -163,10 +161,6 @@ function DashboardPageContent() {
|
||||
return rate !== null ? sum + Math.round(totalMinor * rate) : sum;
|
||||
}, 0);
|
||||
|
||||
const blockedLoss = stats?.blockedSeatRevenueLoss;
|
||||
// Never summed across currencies — each is shown on its own line, largest first.
|
||||
const blockedLossRows = blockedLoss?.lossByCurrency ?? [];
|
||||
|
||||
const normalRows = stats?.revenueByCurrency ?? [];
|
||||
const packageRows = stats?.packageRevenueByCurrency ?? [];
|
||||
const normalGrand = calcGrand(normalRows);
|
||||
@@ -326,73 +320,6 @@ function DashboardPageContent() {
|
||||
</>
|
||||
)}
|
||||
</div>
|
||||
|
||||
{/* Blocked-seat revenue loss — rides the same backoffice-stats payload, so the
|
||||
dashboard makes no extra request for it. */}
|
||||
<div className="card flex flex-col gap-3 border-rose-200 bg-rose-50/60 dark:border-rose-900/50 dark:bg-rose-950/20">
|
||||
<div className="flex items-center gap-2">
|
||||
<div className="rounded-lg bg-rose-100 dark:bg-rose-900/40 p-1.5">
|
||||
<Ban className="h-4 w-4 text-rose-600 dark:text-rose-400" />
|
||||
</div>
|
||||
<span className="text-xs font-semibold uppercase tracking-wider text-rose-700 dark:text-rose-400">
|
||||
Blocked Seats / Revenue Not Collected
|
||||
</span>
|
||||
<span className="ml-auto text-[11px] text-muted-foreground">
|
||||
{blockedLoss?.periodDays ? `Last ${blockedLoss.periodDays}d` : "All time"}
|
||||
</span>
|
||||
</div>
|
||||
{statsLoading ? (
|
||||
<p className="text-muted-foreground text-sm">Loading…</p>
|
||||
) : (
|
||||
<>
|
||||
{blockedLossRows.length === 0 ? (
|
||||
<p className="text-3xl font-bold text-foreground tabular-nums">
|
||||
{formatCurrency(0, "ETB")}
|
||||
</p>
|
||||
) : (
|
||||
blockedLossRows.map((row, i) => (
|
||||
<p
|
||||
key={row.currency}
|
||||
className={
|
||||
i === 0
|
||||
? "text-3xl font-bold text-rose-600 dark:text-rose-400 tabular-nums"
|
||||
: "text-lg font-semibold text-rose-600/80 dark:text-rose-400/80 tabular-nums"
|
||||
}
|
||||
>
|
||||
{formatCurrency(row.estimatedLossMinor, row.currency)}
|
||||
</p>
|
||||
))
|
||||
)}
|
||||
<p className="text-xs text-muted-foreground -mt-1">
|
||||
Estimated potential revenue never earned
|
||||
</p>
|
||||
<div className="flex flex-col gap-2 border-t border-border pt-3">
|
||||
<div className="flex items-center justify-between">
|
||||
<span className="text-xs text-muted-foreground">Seats blocked</span>
|
||||
<span className="text-sm font-semibold text-foreground tabular-nums">
|
||||
{(blockedLoss?.blockedSeatCount ?? 0).toLocaleString()} across{" "}
|
||||
{(blockedLoss?.schedulesAffected ?? 0).toLocaleString()} schedules
|
||||
</span>
|
||||
</div>
|
||||
<div className="flex items-center justify-between">
|
||||
<span className="text-xs text-muted-foreground">Top reason</span>
|
||||
<span className="text-sm font-semibold text-foreground">
|
||||
{blockedLoss?.topReasonCategory
|
||||
? (SEAT_BLOCK_REASON_CATEGORY_LABELS[blockedLoss.topReasonCategory] ??
|
||||
blockedLoss.topReasonCategory)
|
||||
: "—"}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<Link
|
||||
href="/reports/blocked-seats"
|
||||
className="flex items-center justify-center gap-1.5 rounded-md bg-rose-600 hover:bg-rose-700 dark:bg-rose-600 dark:hover:bg-rose-500 px-3 py-2 text-sm font-semibold text-white shadow-sm transition-colors mt-auto"
|
||||
>
|
||||
View full report <ArrowRight className="h-3.5 w-3.5" />
|
||||
</Link>
|
||||
</>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Revenue breakdown */}
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
import { apiClient } from '@/lib/api-client';
|
||||
import type { BlockedSeatRevenueLossStat } from '@edr/types';
|
||||
import { DashboardStats, RevenueData } from '@/types';
|
||||
|
||||
export const dashboardApi = {
|
||||
@@ -13,7 +12,6 @@ export const dashboardApi = {
|
||||
totalPackageTickets: number;
|
||||
totalPassengers: number;
|
||||
blockedSeatsCount: number;
|
||||
blockedSeatRevenueLoss: BlockedSeatRevenueLossStat;
|
||||
revenueByCurrency: { currency: string; totalMinor: number }[];
|
||||
packageRevenueByCurrency: { currency: string; totalMinor: number }[];
|
||||
}>('/dashboard/backoffice-stats');
|
||||
|
||||
Reference in New Issue
Block a user