@burdenoff/microfe-kadaikodi 2026.802.1 → 2026.830.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/dist/kadaikodi/KadaikodiRoot.d.ts.map +1 -1
  2. package/dist/kadaikodi/KadaikodiRoot.js +69 -72
  3. package/dist/kadaikodi/KadaikodiRoot.js.map +1 -1
  4. package/dist/kadaikodi/components/InvestmentCard.d.ts.map +1 -1
  5. package/dist/kadaikodi/components/InvestmentCard.js +58 -54
  6. package/dist/kadaikodi/components/InvestmentCard.js.map +1 -1
  7. package/dist/kadaikodi/components/OrderCard.d.ts.map +1 -1
  8. package/dist/kadaikodi/components/StatusBadge.d.ts.map +1 -1
  9. package/dist/kadaikodi/components/StatusBadge.js +25 -14
  10. package/dist/kadaikodi/components/StatusBadge.js.map +1 -1
  11. package/dist/kadaikodi/hooks/useKadaikodiApi.d.ts +24 -0
  12. package/dist/kadaikodi/hooks/useKadaikodiApi.d.ts.map +1 -1
  13. package/dist/kadaikodi/hooks/useKadaikodiApi.js +177 -132
  14. package/dist/kadaikodi/hooks/useKadaikodiApi.js.map +1 -1
  15. package/dist/kadaikodi/pages/HomePage.d.ts.map +1 -1
  16. package/dist/kadaikodi/pages/HomePage.js +284 -282
  17. package/dist/kadaikodi/pages/HomePage.js.map +1 -1
  18. package/dist/kadaikodi/pages/admin/AdminAnalyticsPage.d.ts +7 -2
  19. package/dist/kadaikodi/pages/admin/AdminAnalyticsPage.d.ts.map +1 -1
  20. package/dist/kadaikodi/pages/admin/AdminAnalyticsPage.js +319 -228
  21. package/dist/kadaikodi/pages/admin/AdminAnalyticsPage.js.map +1 -1
  22. package/dist/kadaikodi/pages/admin/AdminOrdersPage.js +1 -1
  23. package/dist/kadaikodi/pages/admin/AdminOrdersPage.js.map +1 -1
  24. package/dist/kadaikodi/pages/admin/CartManagementPage.d.ts +10 -4
  25. package/dist/kadaikodi/pages/admin/CartManagementPage.d.ts.map +1 -1
  26. package/dist/kadaikodi/pages/admin/CartManagementPage.js +320 -279
  27. package/dist/kadaikodi/pages/admin/CartManagementPage.js.map +1 -1
  28. package/dist/kadaikodi/pages/cart-owner/MerchantOnboardingPage.d.ts.map +1 -1
  29. package/dist/kadaikodi/pages/cart-owner/MerchantOnboardingPage.js +365 -292
  30. package/dist/kadaikodi/pages/cart-owner/MerchantOnboardingPage.js.map +1 -1
  31. package/dist/kadaikodi/pages/cart-owner/StaffManagementPage.d.ts +7 -2
  32. package/dist/kadaikodi/pages/cart-owner/StaffManagementPage.d.ts.map +1 -1
  33. package/dist/kadaikodi/pages/cart-owner/StaffManagementPage.js +300 -158
  34. package/dist/kadaikodi/pages/cart-owner/StaffManagementPage.js.map +1 -1
  35. package/dist/kadaikodi/pages/common/SettingsPage.js +286 -286
  36. package/dist/kadaikodi/pages/common/SettingsPage.js.map +1 -1
  37. package/dist/kadaikodi/pages/customer/CartDetailPage.d.ts.map +1 -1
  38. package/dist/kadaikodi/pages/customer/CartDetailPage.js +3 -3
  39. package/dist/kadaikodi/pages/customer/CartDetailPage.js.map +1 -1
  40. package/dist/kadaikodi/pages/customer/CartDiscoveryPage.d.ts +13 -3
  41. package/dist/kadaikodi/pages/customer/CartDiscoveryPage.d.ts.map +1 -1
  42. package/dist/kadaikodi/pages/customer/CartDiscoveryPage.js +270 -220
  43. package/dist/kadaikodi/pages/customer/CartDiscoveryPage.js.map +1 -1
  44. package/dist/kadaikodi/pages/customer/CustomerDashboard.js +97 -97
  45. package/dist/kadaikodi/pages/customer/OrderTrackingPage.d.ts.map +1 -1
  46. package/dist/kadaikodi/pages/customer/OrderTrackingPage.js +1 -1
  47. package/dist/kadaikodi/pages/customer/OrderTrackingPage.js.map +1 -1
  48. package/dist/kadaikodi/pages/worker/TaskDetailsPage.d.ts +5 -3
  49. package/dist/kadaikodi/pages/worker/TaskDetailsPage.d.ts.map +1 -1
  50. package/dist/kadaikodi/pages/worker/TaskDetailsPage.js +286 -199
  51. package/dist/kadaikodi/pages/worker/TaskDetailsPage.js.map +1 -1
  52. package/dist/kadaikodi/types/index.d.ts +46 -2
  53. package/dist/kadaikodi/types/index.d.ts.map +1 -1
  54. package/dist/shared/hooks/useTr.d.ts +2 -0
  55. package/dist/shared/hooks/useTr.d.ts.map +1 -0
  56. package/dist/shared/hooks/useTr.js +14 -0
  57. package/dist/shared/hooks/useTr.js.map +1 -0
  58. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"AdminAnalyticsPage.js","names":[],"sources":["../../../../src/kadaikodi/pages/admin/AdminAnalyticsPage.tsx"],"sourcesContent":["/**\n * Admin Analytics Page\n * @module kadaikodi/pages/admin\n *\n * Platform analytics wired to the live backend (useDashboardStats +\n * useAdminAnalytics + useProviders + useOrders). Every figure is real or\n * derived from real records — order-status distribution is counted from\n * loaded orders, category/growth breakdowns come from the analytics hook.\n * Metrics with no honest source (operating costs, delivery time, etc.) are\n * omitted rather than fabricated.\n */\n\nimport { useMemo, useState } from 'react';\nimport {\n Users,\n ShoppingBag,\n IndianRupee,\n BarChart3,\n Zap,\n Loader2,\n Star,\n Award,\n Store,\n TrendingUp,\n} from 'lucide-react';\nimport { EmphasisPanel, GlassCard, PagePurpose, NextSteps } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../../components/PageLayout';\nimport { MetricsCard } from '../../components/MetricsCard';\nimport { DonutChart, AreaChart, HBarFunnel } from '../../components/viz';\nimport type { LabeledValue, Segment } from '../../components/viz';\nimport { useKadaikodi } from '../../context/KadaikodiContext';\nimport {\n useDashboardStats,\n useAdminAnalytics,\n useProviders,\n useOrders,\n} from '../../hooks/useKadaikodiApi';\nimport { cn } from '../../utils/cn';\nimport { formatCurrency } from '../../utils/formatters';\n\n/* ------------------------------------------------------------------ */\n/* Types + helpers */\n/* ------------------------------------------------------------------ */\n\ntype TabKey = 'overview' | 'revenue' | 'users' | 'performance';\n\nconst DAY_MS = 24 * 60 * 60 * 1000;\n\nconst titleCase = (s: string) =>\n s\n .replace(/_/g, ' ')\n .toLowerCase()\n .replace(/\\b\\w/g, (c) => c.toUpperCase());\n\nconst dayKey = (d: Date) => {\n const x = new Date(d);\n x.setHours(0, 0, 0, 0);\n return x.getTime();\n};\n\nconst dayLabel = (t: number) =>\n new Date(t).toLocaleDateString('en-IN', { day: 'numeric', month: 'short' });\n\n/* ------------------------------------------------------------------ */\n/* Component */\n/* ------------------------------------------------------------------ */\n\nexport function AdminAnalyticsPage() {\n const { navigateTo } = useKadaikodi();\n\n const { data: stats, isLoading: statsLoading } = useDashboardStats();\n const { data: analytics, isLoading: analyticsLoading } = useAdminAnalytics();\n const { data: providers = [], isLoading: providersLoading } = useProviders();\n const { data: orders = [], isLoading: ordersLoading } = useOrders({});\n\n const [activeTab, setActiveTab] = useState<TabKey>('overview');\n\n const loading = statsLoading || analyticsLoading || providersLoading || ordersLoading;\n\n const fmtCur = (amount: number) => {\n if (amount >= 10000000) return `₹${(amount / 10000000).toFixed(1)}Cr`;\n if (amount >= 100000) return `₹${(amount / 100000).toFixed(1)}L`;\n return formatCurrency(amount, { minimumFractionDigits: 0 });\n };\n\n // Order status distribution — counted from real loaded orders.\n const orderStats = useMemo(() => {\n const total = orders.length;\n const completed = orders.filter((o) => o.status === 'delivered').length;\n const cancelled = orders.filter((o) => o.status === 'cancelled').length;\n const pending = orders.filter((o) => o.status === 'pending' || o.status === 'confirmed').length;\n const startOfToday = new Date();\n startOfToday.setHours(0, 0, 0, 0);\n const ordersToday = orders.filter(\n (o) => new Date(o.orderDate).getTime() >= startOfToday.getTime()\n ).length;\n const avgOrderValue =\n stats && stats.totalOrders > 0 ? stats.totalRevenue / stats.totalOrders : 0;\n return { total, completed, cancelled, pending, ordersToday, avgOrderValue };\n }, [orders, stats]);\n\n const pendingCarts = useMemo(() => providers.filter((p) => !p.isOpen).length, [providers]);\n\n const topCarts = analytics?.topProviders ?? [];\n const customerTotal = analytics?.customerGrowth?.customers ?? 0;\n\n // Cart distribution per category with a real, derived share percentage.\n // The backend exposes counts per category, not revenue per category.\n const categoryDistRows = useMemo(() => {\n const entries = Object.entries(analytics?.categoryDistribution ?? {});\n const total = entries.reduce((sum, [, count]) => sum + count, 0);\n return entries\n .map(([category, count]) => ({\n category,\n count,\n percentage: total > 0 ? (count / total) * 100 : 0,\n }))\n .sort((a, b) => b.count - a.count);\n }, [analytics]);\n\n const prettyCategory = (c: string) => c.replace(/_/g, ' ').toLowerCase();\n\n const pct = (part: number, whole: number) => (whole > 0 ? (part / whole) * 100 : 0);\n\n // ── Category distribution donut — real cart counts per category. ───────────\n const categorySegments = useMemo<Segment[]>(\n () =>\n Object.entries(analytics?.categoryDistribution ?? {})\n .sort((a, b) => b[1] - a[1])\n .map(([c, count]) => ({ label: titleCase(c), value: count })),\n [analytics]\n );\n const totalCarts = useMemo(\n () => categorySegments.reduce((s, seg) => s + seg.value, 0),\n [categorySegments]\n );\n\n // ── GMV + order-volume over time — real per-day figures from real orders. ──\n const { gmvTrend, volumeTrend } = useMemo(() => {\n const today = dayKey(new Date());\n const start = today - 29 * DAY_MS;\n const gmv = new Map<number, number>();\n const vol = new Map<number, number>();\n for (let t = start; t <= today; t += DAY_MS) {\n gmv.set(t, 0);\n vol.set(t, 0);\n }\n for (const o of orders) {\n const t = dayKey(new Date(o.orderDate));\n if (gmv.has(t)) {\n gmv.set(t, (gmv.get(t) ?? 0) + (o.total ?? 0));\n vol.set(t, (vol.get(t) ?? 0) + 1);\n }\n }\n const g: LabeledValue[] = [...gmv.entries()].map(([t, v]) => ({\n label: dayLabel(t),\n value: v,\n }));\n const v: LabeledValue[] = [...vol.entries()].map(([t, val]) => ({\n label: dayLabel(t),\n value: val,\n }));\n return { gmvTrend: g, volumeTrend: v };\n }, [orders]);\n\n // ── Top categories by revenue — derived by joining real orders → provider. ─\n const topCategoryRevenue = useMemo<LabeledValue[]>(() => {\n const catOf = new Map(providers.map((p) => [p.id, p.category]));\n const byCat = new Map<string, number>();\n for (const o of orders) {\n const cat = catOf.get(o.cartId) ?? 'OTHER';\n byCat.set(cat, (byCat.get(cat) ?? 0) + (o.total ?? 0));\n }\n return [...byCat.entries()]\n .filter(([, v]) => v > 0)\n .sort((a, b) => b[1] - a[1])\n .slice(0, 6)\n .map(([c, v]) => ({ label: titleCase(c), value: v }));\n }, [orders, providers]);\n\n const medalIcon = (index: number) => {\n if (index < 3) return <Award className=\"h-5 w-5 text-status-warning-text\" />;\n return <BarChart3 className=\"h-5 w-5 text-text-secondary\" />;\n };\n\n if (loading || !stats) {\n return (\n <PageLayout title=\"Platform Analytics\" description=\"Loading analytics...\">\n <div className=\"flex flex-col items-center justify-center py-20\">\n <Loader2 className=\"h-10 w-10 animate-spin text-text-secondary mb-4\" />\n <p className=\"text-text-secondary\">Loading analytics...</p>\n </div>\n </PageLayout>\n );\n }\n\n const tabs: Array<{ key: TabKey; label: string; icon: typeof BarChart3 }> = [\n { key: 'overview', label: 'Overview', icon: BarChart3 },\n { key: 'revenue', label: 'Revenue', icon: IndianRupee },\n { key: 'users', label: 'Users', icon: Users },\n { key: 'performance', label: 'Performance', icon: Zap },\n ];\n\n return (\n <PageLayout title=\"Platform Analytics\" description=\"Comprehensive platform metrics and trends\">\n <PagePurpose className=\"mb-6\">\n Your bird&apos;s-eye view of how Kadaikodi is performing. Spot revenue and order trends, see\n which carts and categories drive the most business, and understand where customers are\n growing — so you can decide where to invest and which carts to promote. Switch tabs to drill\n into revenue, users, and operational performance.\n </PagePurpose>\n\n <NextSteps\n storageKey=\"kadaikodi-admin-analytics\"\n className=\"mb-6\"\n steps={[\n {\n id: 'review-carts',\n label: 'Review top-performing carts',\n description: 'See which carts drive the most revenue and orders.',\n onClick: () => setActiveTab('overview'),\n },\n {\n id: 'check-revenue',\n label: 'Break down revenue by category',\n description: 'Find your strongest categories in the Revenue tab.',\n onClick: () => setActiveTab('revenue'),\n },\n {\n id: 'manage-carts',\n label: 'Approve pending carts',\n description: 'Onboard the carts waiting for review.',\n onClick: () => navigateTo('/admin/carts'),\n done: pendingCarts === 0,\n },\n ]}\n />\n\n <div className=\"flex justify-end mb-6\">\n <span className=\"text-sm text-text-secondary\">\n Last updated: {new Date().toLocaleString('en-IN')}\n </span>\n </div>\n\n {/* Key Metrics — the one emphasis zone for this page */}\n <EmphasisPanel className=\"mb-8\">\n <h2 className=\"mb-4 text-lg font-semibold text-text-primary\">Key Metrics</h2>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4\">\n <MetricsCard\n featured\n icon={<IndianRupee className=\"h-5 w-5\" />}\n value={fmtCur(stats.totalRevenue)}\n label=\"Total Revenue\"\n />\n <MetricsCard\n icon={<ShoppingBag className=\"h-5 w-5\" />}\n value={(stats.totalOrders ?? 0).toLocaleString('en-IN')}\n label=\"Total Orders\"\n />\n <MetricsCard\n icon={<Users className=\"h-5 w-5\" />}\n value={(stats.activeCustomers ?? 0).toLocaleString('en-IN')}\n label=\"Active Customers\"\n />\n <MetricsCard\n icon={<Store className=\"h-5 w-5\" />}\n value={(stats.activeProviders ?? 0).toLocaleString('en-IN')}\n label=\"Active Carts\"\n trendValue={`${pendingCarts} pending`}\n />\n </div>\n </EmphasisPanel>\n\n {/* Real-chart grid — the mockup's analytics dashboard, all live data */}\n <div className=\"mb-8 grid grid-cols-1 gap-6 lg:grid-cols-2\">\n {/* Category Distribution */}\n <GlassCard treatment=\"plain\" className=\"p-6\">\n <h3 className=\"mb-4 text-base font-semibold text-text-primary\">Category Distribution</h3>\n {categorySegments.length > 0 ? (\n <DonutChart\n segments={categorySegments}\n centerLabel={totalCarts.toLocaleString('en-IN')}\n centerCaption=\"carts\"\n valueFormatter={(v) => v.toLocaleString('en-IN')}\n />\n ) : (\n <p className=\"text-sm text-text-secondary\">\n Category breakdown will appear here as carts are onboarded.\n </p>\n )}\n </GlassCard>\n\n {/* GMV over time */}\n <GlassCard treatment=\"plain\" className=\"p-6\">\n <div className=\"mb-4 flex items-center justify-between gap-2\">\n <h3 className=\"text-base font-semibold text-text-primary\">GMV over time</h3>\n <span className=\"text-xs text-text-muted\">Last 30 days</span>\n </div>\n {orders.length > 0 ? (\n <AreaChart\n series={gmvTrend}\n height={200}\n valueFormatter={(v) => fmtCur(v)}\n title=\"Gross merchandise value per day over the last 30 days\"\n />\n ) : (\n <p className=\"text-sm text-text-secondary\">\n GMV will chart here once orders are placed.\n </p>\n )}\n </GlassCard>\n\n {/* Order Volume over time (real substitute for un-derivable customer-growth series) */}\n <GlassCard treatment=\"plain\" className=\"p-6\">\n <div className=\"mb-4 flex items-center justify-between gap-2\">\n <h3 className=\"text-base font-semibold text-text-primary\">Order Volume</h3>\n <span className=\"text-xs text-text-muted\">Last 30 days</span>\n </div>\n {orders.length > 0 ? (\n <AreaChart\n series={volumeTrend}\n height={200}\n valueFormatter={(v) => v.toLocaleString('en-IN')}\n title=\"Order volume per day over the last 30 days\"\n />\n ) : (\n <p className=\"text-sm text-text-secondary\">\n Order volume will chart here once orders are placed.\n </p>\n )}\n </GlassCard>\n\n {/* Top Categories by Revenue */}\n <GlassCard treatment=\"plain\" className=\"p-6\">\n <h3 className=\"mb-4 text-base font-semibold text-text-primary\">\n Top Categories by Revenue\n </h3>\n {topCategoryRevenue.length > 0 ? (\n <HBarFunnel\n stages={topCategoryRevenue}\n showConversion={false}\n valueFormatter={(v) => fmtCur(v)}\n />\n ) : (\n <p className=\"text-sm text-text-secondary\">\n Category revenue will rank here as orders come in.\n </p>\n )}\n </GlassCard>\n </div>\n\n {/* Tabs */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface mb-8\">\n <div className=\"border-b border-border-subtle\">\n <nav className=\"flex -mb-px overflow-x-auto\">\n {tabs.map((tab) => {\n const TabIcon = tab.icon;\n return (\n <button\n key={tab.key}\n type=\"button\"\n onClick={() => setActiveTab(tab.key)}\n className={cn(\n 'flex items-center gap-2 py-3 px-4 sm:px-6 text-sm font-medium whitespace-nowrap border-b-2 transition-colors',\n activeTab === tab.key\n ? 'border-primary text-primary'\n : 'border-transparent text-text-secondary hover:text-text-primary'\n )}\n >\n <TabIcon className=\"h-4 w-4\" />\n <span className=\"hidden sm:inline\">{tab.label}</span>\n </button>\n );\n })}\n </nav>\n </div>\n\n <div className=\"p-4 sm:p-6\">\n {/* Overview Tab */}\n {activeTab === 'overview' && (\n <div className=\"space-y-8\">\n <div>\n <h3 className=\"text-lg font-semibold text-text-primary mb-4\">\n Order Status Distribution\n </h3>\n {orderStats.total > 0 ? (\n <div className=\"grid grid-cols-1 sm:grid-cols-3 gap-4\">\n <div className=\"rounded-lg border border-status-success-text/30 bg-status-success-bg-subtle p-4\">\n <p className=\"text-sm text-status-success-text\">Completed Orders</p>\n <p className=\"text-2xl font-bold text-status-success-text\">\n {orderStats.completed.toLocaleString('en-IN')}\n </p>\n <p className=\"text-sm text-status-success-text/80\">\n {pct(orderStats.completed, orderStats.total).toFixed(1)}% of total\n </p>\n </div>\n <div className=\"rounded-lg border border-status-warning-text/30 bg-status-warning-bg-subtle p-4\">\n <p className=\"text-sm text-status-warning-text\">Pending Orders</p>\n <p className=\"text-2xl font-bold text-status-warning-text\">\n {orderStats.pending.toLocaleString('en-IN')}\n </p>\n <p className=\"text-sm text-status-warning-text/80\">\n {pct(orderStats.pending, orderStats.total).toFixed(1)}% of total\n </p>\n </div>\n <div className=\"rounded-lg border border-status-error-text/30 bg-status-error-bg-subtle p-4\">\n <p className=\"text-sm text-status-error-text\">Cancelled Orders</p>\n <p className=\"text-2xl font-bold text-status-error-text\">\n {orderStats.cancelled.toLocaleString('en-IN')}\n </p>\n <p className=\"text-sm text-status-error-text/80\">\n {pct(orderStats.cancelled, orderStats.total).toFixed(1)}% of total\n </p>\n </div>\n </div>\n ) : (\n <p className=\"text-sm text-text-secondary\">\n Order breakdowns will appear here once orders are placed.\n </p>\n )}\n </div>\n\n <div>\n <h3 className=\"text-lg font-semibold text-text-primary mb-4\">\n Top Performing Carts\n </h3>\n {topCarts.length > 0 ? (\n <div className=\"rounded-lg border border-border-subtle overflow-hidden\">\n <table className=\"w-full\">\n <thead>\n <tr className=\"border-b border-border-subtle bg-bg-sunken/50\">\n <th className=\"px-4 py-3 text-left text-xs font-medium text-text-secondary uppercase\">\n Cart Name\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium text-text-secondary uppercase\">\n Category\n </th>\n <th className=\"px-4 py-3 text-right text-xs font-medium text-text-secondary uppercase\">\n Rating\n </th>\n </tr>\n </thead>\n <tbody className=\"divide-y divide-border\">\n {topCarts.map((cart, i) => (\n <tr key={cart.id} className=\"hover:bg-accent/50 transition-colors\">\n <td className=\"px-4 py-3\">\n <div className=\"flex items-center gap-2\">\n {medalIcon(i)}\n <span className=\"text-sm font-medium text-text-primary\">\n {cart.name}\n </span>\n </div>\n </td>\n <td className=\"px-4 py-3 text-sm text-left text-text-secondary capitalize\">\n {prettyCategory(cart.category)}\n </td>\n <td className=\"px-4 py-3 text-sm text-right text-text-primary\">\n <span className=\"flex items-center justify-end gap-1\">\n <Star className=\"h-3.5 w-3.5 fill-status-warning-text text-status-warning-text\" />\n {(cart.rating ?? 0).toFixed(1)}\n </span>\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n ) : (\n <p className=\"text-sm text-text-secondary\">\n Top-performing carts will be ranked here once orders start flowing.\n </p>\n )}\n </div>\n </div>\n )}\n\n {/* Revenue Tab */}\n {activeTab === 'revenue' && (\n <div className=\"space-y-8\">\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-4\">\n <div className=\"rounded-lg border border-border-focus/30 bg-[var(--color-accent-soft)] p-6\">\n <h4 className=\"text-sm font-medium text-text-primary mb-2\">Total Revenue</h4>\n <p className=\"text-2xl font-bold text-text-primary\">\n {fmtCur(stats.totalRevenue)}\n </p>\n </div>\n <div className=\"rounded-lg border border-border-subtle bg-bg-sunken/30 p-6\">\n <h4 className=\"text-sm font-medium text-text-secondary mb-2\">Total Orders</h4>\n <p className=\"text-2xl font-bold text-text-primary\">\n {(stats.totalOrders ?? 0).toLocaleString('en-IN')}\n </p>\n </div>\n <div className=\"rounded-lg border border-status-success-text/30 bg-status-success-bg-subtle p-6\">\n <h4 className=\"text-sm font-medium text-status-success-text mb-2\">\n Average Order Value\n </h4>\n <p className=\"text-2xl font-bold text-status-success-text\">\n {fmtCur(orderStats.avgOrderValue)}\n </p>\n </div>\n </div>\n\n {topCategoryRevenue.length > 0 ? (\n <div>\n <h4 className=\"mb-3 text-sm font-semibold text-text-primary\">\n Revenue by Category\n </h4>\n <HBarFunnel\n stages={topCategoryRevenue}\n showConversion={false}\n valueFormatter={(v) => fmtCur(v)}\n />\n <p className=\"mt-3 text-xs text-text-muted\">\n Derived by attributing each order&apos;s value to its cart&apos;s category.\n </p>\n </div>\n ) : (\n <p className=\"text-sm text-text-secondary\">\n Revenue by category will appear here as orders come in.\n </p>\n )}\n </div>\n )}\n\n {/* Users Tab */}\n {activeTab === 'users' && (\n <div className=\"space-y-8\">\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-4\">\n <div className=\"rounded-lg border border-border-subtle bg-bg-sunken/30 p-6\">\n <div className=\"flex items-center gap-2 mb-2\">\n <Users className=\"h-5 w-5 text-text-secondary\" />\n <h4 className=\"text-sm font-medium text-text-secondary\">Active Customers</h4>\n </div>\n <p className=\"text-3xl font-bold text-text-primary\">\n {(stats.activeCustomers ?? 0).toLocaleString('en-IN')}\n </p>\n </div>\n <div className=\"rounded-lg border border-border-subtle bg-bg-sunken/30 p-6\">\n <div className=\"flex items-center gap-2 mb-2\">\n <Store className=\"h-5 w-5 text-text-secondary\" />\n <h4 className=\"text-sm font-medium text-text-secondary\">Active Cart Owners</h4>\n </div>\n <p className=\"text-3xl font-bold text-text-primary\">\n {(stats.activeProviders ?? 0).toLocaleString('en-IN')}\n </p>\n </div>\n </div>\n\n <div className=\"rounded-lg border border-border-subtle bg-bg-sunken/20 p-6\">\n <div className=\"flex items-center gap-2 mb-2\">\n <Users className=\"h-5 w-5 text-text-secondary\" />\n <h3 className=\"text-sm font-medium text-text-secondary\">Total Customers</h3>\n </div>\n <p className=\"text-3xl font-bold text-text-primary\">\n {customerTotal.toLocaleString('en-IN')}\n </p>\n <p className=\"mt-1 text-sm text-text-secondary\">\n Customers on the platform to date.\n </p>\n </div>\n\n {categoryDistRows.length > 0 && (\n <div>\n <h3 className=\"text-lg font-semibold text-text-primary mb-4\">\n Cart Category Distribution\n </h3>\n <div className=\"space-y-3\">\n {categoryDistRows.map((row) => (\n <div key={row.category}>\n <div className=\"flex items-center justify-between mb-1\">\n <span className=\"text-sm font-medium text-text-primary capitalize\">\n {prettyCategory(row.category)}\n </span>\n <span className=\"text-sm text-text-secondary\">\n {(row.count ?? 0).toLocaleString('en-IN')} (\n {(row.percentage ?? 0).toFixed(1)}%)\n </span>\n </div>\n <div className=\"w-full bg-bg-sunken rounded-full h-2\">\n <div\n className=\"bg-action-primary-bg h-2 rounded-full transition-all duration-300\"\n style={{ width: `${row.percentage}%` }}\n />\n </div>\n </div>\n ))}\n </div>\n </div>\n )}\n </div>\n )}\n\n {/* Performance Tab */}\n {activeTab === 'performance' && (\n <div className=\"space-y-8\">\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-6\">\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-6\">\n <div className=\"flex items-center gap-2 mb-2\">\n <Star className=\"h-4 w-4 text-text-secondary\" />\n <h4 className=\"text-sm font-medium text-text-secondary\">\n Customer Satisfaction\n </h4>\n </div>\n <p className=\"text-3xl font-bold text-text-primary flex items-center gap-1\">\n <Star className=\"h-6 w-6 fill-status-warning-text text-status-warning-text\" />\n {stats.avgRating > 0 ? stats.avgRating.toFixed(1) : '—'}\n </p>\n <p className=\"text-sm text-text-secondary mt-1\">Average rating across carts</p>\n </div>\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-6\">\n <div className=\"flex items-center gap-2 mb-2\">\n <TrendingUp className=\"h-4 w-4 text-text-secondary\" />\n <h4 className=\"text-sm font-medium text-text-secondary\">Completion Rate</h4>\n </div>\n <p className=\"text-3xl font-bold text-text-primary\">\n {orderStats.total > 0\n ? `${pct(orderStats.completed, orderStats.total).toFixed(1)}%`\n : '—'}\n </p>\n <p className=\"text-sm text-text-secondary mt-1\">Orders delivered</p>\n </div>\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-6\">\n <div className=\"flex items-center gap-2 mb-2\">\n <BarChart3 className=\"h-4 w-4 text-text-secondary\" />\n <h4 className=\"text-sm font-medium text-text-secondary\">Cancellation Rate</h4>\n </div>\n <p className=\"text-3xl font-bold text-text-primary\">\n {orderStats.total > 0\n ? `${pct(orderStats.cancelled, orderStats.total).toFixed(1)}%`\n : '—'}\n </p>\n <p className=\"text-sm text-text-secondary mt-1\">Orders cancelled</p>\n </div>\n </div>\n\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-6\">\n <h3 className=\"text-lg font-semibold text-text-primary mb-4\">\n Today&apos;s Activity\n </h3>\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-6\">\n <div>\n <p className=\"text-sm text-text-secondary mb-2\">Orders Today</p>\n <p className=\"text-3xl font-bold text-text-primary\">\n {orderStats.ordersToday.toLocaleString('en-IN')}\n </p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary mb-2\">Pending Orders</p>\n <p className=\"text-3xl font-bold text-status-warning-text\">\n {(stats.pendingOrders ?? 0).toLocaleString('en-IN')}\n </p>\n </div>\n </div>\n </div>\n </div>\n )}\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"AdminAnalyticsPage.js","names":[],"sources":["../../../../src/kadaikodi/pages/admin/AdminAnalyticsPage.tsx"],"sourcesContent":["/**\n * Admin Analytics Page\n * @module kadaikodi/pages/admin\n *\n * Platform analytics wired to the live backend (useDashboardStats +\n * useAdminAnalytics + useProviders + useOrders). Every figure is real or\n * derived from real records — order-status distribution is counted from\n * loaded orders, category/growth breakdowns come from the analytics hook.\n * Metrics with no honest source (take rate, platform commission, operating\n * costs, delivery time) are omitted rather than fabricated.\n *\n * The range selector re-windows the same real records client-side; it never\n * claims a period the loaded data cannot cover. Customer growth is a cumulative\n * distinct-customer series built from `kadaikodiAdminAnalytics.orderTrends`,\n * whose rows carry `customerId` — `customerGrowth` itself is only a bare total.\n */\n\nimport { useMemo, useState } from 'react';\nimport {\n Users,\n ShoppingBag,\n IndianRupee,\n BarChart3,\n Zap,\n Loader2,\n Star,\n Award,\n Store,\n TrendingUp,\n CalendarRange,\n} from 'lucide-react';\nimport { EmphasisPanel, GlassCard, PagePurpose, NextSteps } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../../components/PageLayout';\nimport { MetricsCard } from '../../components/MetricsCard';\nimport { DonutChart, AreaChart, HBarFunnel } from '../../components/viz';\nimport type { LabeledValue, Segment } from '../../components/viz';\nimport { useKadaikodi } from '../../context/KadaikodiContext';\nimport {\n useDashboardStats,\n useAdminAnalytics,\n useProviders,\n useOrders,\n KADAIKODI_LIST_LIMIT,\n} from '../../hooks/useKadaikodiApi';\nimport { cn } from '../../utils/cn';\nimport { formatCurrency } from '../../utils/formatters';\n\n/* ------------------------------------------------------------------ */\n/* Types + helpers */\n/* ------------------------------------------------------------------ */\n\ntype TabKey = 'overview' | 'revenue' | 'users' | 'performance';\n\nconst DAY_MS = 24 * 60 * 60 * 1000;\n\n/** Windows the page can honestly render from the records it already holds. */\nconst RANGES = [\n { id: '7', label: 'Last 7 days', days: 7 },\n { id: '30', label: 'Last 30 days', days: 30 },\n { id: '90', label: 'Last 90 days', days: 90 },\n] as const;\n\ntype RangeId = (typeof RANGES)[number]['id'];\n\nconst titleCase = (s: string) =>\n s\n .replace(/_/g, ' ')\n .toLowerCase()\n .replace(/\\b\\w/g, (c) => c.toUpperCase());\n\nconst dayKey = (d: Date) => {\n const x = new Date(d);\n x.setHours(0, 0, 0, 0);\n return x.getTime();\n};\n\nconst dayLabel = (t: number) =>\n new Date(t).toLocaleDateString('en-IN', { day: 'numeric', month: 'short' });\n\n/* ------------------------------------------------------------------ */\n/* Component */\n/* ------------------------------------------------------------------ */\n\nexport function AdminAnalyticsPage() {\n const { navigateTo } = useKadaikodi();\n\n const { data: stats, isLoading: statsLoading } = useDashboardStats();\n const { data: analytics, isLoading: analyticsLoading } = useAdminAnalytics();\n const { data: providers = [], isLoading: providersLoading } = useProviders();\n const { data: orders = [], isLoading: ordersLoading } = useOrders({});\n\n const [activeTab, setActiveTab] = useState<TabKey>('overview');\n const [rangeId, setRangeId] = useState<RangeId>('30');\n\n const rangeDays = useMemo(() => RANGES.find((r) => r.id === rangeId)?.days ?? 30, [rangeId]);\n const rangeLabel = useMemo(\n () => RANGES.find((r) => r.id === rangeId)?.label ?? 'Last 30 days',\n [rangeId]\n );\n\n const loading = statsLoading || analyticsLoading || providersLoading || ordersLoading;\n\n const fmtCur = (amount: number) => {\n if (amount >= 10000000) return `₹${(amount / 10000000).toFixed(1)}Cr`;\n if (amount >= 100000) return `₹${(amount / 100000).toFixed(1)}L`;\n return formatCurrency(amount, { minimumFractionDigits: 0 });\n };\n\n // Order status distribution — counted from real loaded orders.\n const orderStats = useMemo(() => {\n const total = orders.length;\n const completed = orders.filter((o) => o.status === 'delivered').length;\n const cancelled = orders.filter((o) => o.status === 'cancelled').length;\n const pending = orders.filter((o) => o.status === 'pending' || o.status === 'confirmed').length;\n const startOfToday = new Date();\n startOfToday.setHours(0, 0, 0, 0);\n const ordersToday = orders.filter(\n (o) => new Date(o.orderDate).getTime() >= startOfToday.getTime()\n ).length;\n const avgOrderValue =\n stats && stats.totalOrders > 0 ? stats.totalRevenue / stats.totalOrders : 0;\n return { total, completed, cancelled, pending, ordersToday, avgOrderValue };\n }, [orders, stats]);\n\n const pendingCarts = useMemo(() => providers.filter((p) => !p.isOpen).length, [providers]);\n\n const topCarts = analytics?.topProviders ?? [];\n const customerTotal = analytics?.customerGrowth?.customers ?? 0;\n\n // Cart distribution per category with a real, derived share percentage.\n // The backend exposes counts per category, not revenue per category.\n const categoryDistRows = useMemo(() => {\n const entries = Object.entries(analytics?.categoryDistribution ?? {});\n const total = entries.reduce((sum, [, count]) => sum + count, 0);\n return entries\n .map(([category, count]) => ({\n category,\n count,\n percentage: total > 0 ? (count / total) * 100 : 0,\n }))\n .sort((a, b) => b.count - a.count);\n }, [analytics]);\n\n const prettyCategory = (c: string) => c.replace(/_/g, ' ').toLowerCase();\n\n const pct = (part: number, whole: number) => (whole > 0 ? (part / whole) * 100 : 0);\n\n // ── Category distribution donut — real cart counts per category. ───────────\n const categorySegments = useMemo<Segment[]>(\n () =>\n Object.entries(analytics?.categoryDistribution ?? {})\n .sort((a, b) => b[1] - a[1])\n .map(([c, count]) => ({ label: titleCase(c), value: count })),\n [analytics]\n );\n const totalCarts = useMemo(\n () => categorySegments.reduce((s, seg) => s + seg.value, 0),\n [categorySegments]\n );\n\n const rangeStart = useMemo(() => dayKey(new Date()) - (rangeDays - 1) * DAY_MS, [rangeDays]);\n\n // ── GMV + order-volume over time — real per-day figures from real orders. ──\n const { gmvTrend, volumeTrend } = useMemo(() => {\n const today = dayKey(new Date());\n const gmv = new Map<number, number>();\n const vol = new Map<number, number>();\n for (let t = rangeStart; t <= today; t += DAY_MS) {\n gmv.set(t, 0);\n vol.set(t, 0);\n }\n for (const o of orders) {\n const t = dayKey(new Date(o.orderDate));\n if (gmv.has(t)) {\n gmv.set(t, (gmv.get(t) ?? 0) + (o.total ?? 0));\n vol.set(t, (vol.get(t) ?? 0) + 1);\n }\n }\n const g: LabeledValue[] = [...gmv.entries()].map(([t, v]) => ({\n label: dayLabel(t),\n value: v,\n }));\n const v: LabeledValue[] = [...vol.entries()].map(([t, val]) => ({\n label: dayLabel(t),\n value: val,\n }));\n return { gmvTrend: g, volumeTrend: v };\n }, [orders, rangeStart]);\n\n /**\n * Customer growth — cumulative count of distinct customers who had ordered by\n * the end of each day in the window.\n *\n * Source: `orderTrends`, the only projection in this query carrying a\n * per-order `customerId`. It is the 200 most recent orders, so the series is\n * \"customers seen in the recent order stream\", not lifetime signups; the panel\n * says so rather than implying a full customer table.\n */\n const customerGrowthTrend = useMemo<LabeledValue[]>(() => {\n const rows = analytics?.orderTrends ?? [];\n if (rows.length === 0) return [];\n const today = dayKey(new Date());\n\n const firstSeen = new Map<string, number>();\n for (const row of rows) {\n const customerId = row.customerId;\n if (!customerId) continue;\n const day = dayKey(new Date(row.createdAt));\n if (Number.isNaN(day)) continue;\n const previous = firstSeen.get(customerId);\n if (previous === undefined || day < previous) firstSeen.set(customerId, day);\n }\n if (firstSeen.size === 0) return [];\n\n const firstSeenDays = [...firstSeen.values()];\n const series: LabeledValue[] = [];\n for (let t = rangeStart; t <= today; t += DAY_MS) {\n series.push({\n label: dayLabel(t),\n value: firstSeenDays.filter((day) => day <= t).length,\n });\n }\n return series;\n }, [analytics, rangeStart]);\n\n /**\n * Carts onboarded inside the window — real `createdAt` on each provider.\n *\n * The provider list is capped server-side and ordered by rating, so a full\n * page means this is a floor rather than a total; it is rendered with a \"+\"\n * and a caption saying so instead of asserting an exact figure.\n */\n const newMerchants = useMemo(() => {\n const count = providers.filter((p) => {\n if (!p.createdAt) return false;\n const t = new Date(p.createdAt).getTime();\n return !Number.isNaN(t) && t >= rangeStart;\n }).length;\n return { count, isFloor: providers.length >= KADAIKODI_LIST_LIMIT };\n }, [providers, rangeStart]);\n\n // ── Top categories by revenue — derived by joining real orders → provider. ─\n const topCategoryRevenue = useMemo<LabeledValue[]>(() => {\n const catOf = new Map(providers.map((p) => [p.id, p.category]));\n const byCat = new Map<string, number>();\n for (const o of orders) {\n const cat = catOf.get(o.cartId) ?? 'OTHER';\n byCat.set(cat, (byCat.get(cat) ?? 0) + (o.total ?? 0));\n }\n return [...byCat.entries()]\n .filter(([, v]) => v > 0)\n .sort((a, b) => b[1] - a[1])\n .slice(0, 6)\n .map(([c, v]) => ({ label: titleCase(c), value: v }));\n }, [orders, providers]);\n\n const medalIcon = (index: number) => {\n if (index < 3) return <Award className=\"h-5 w-5 text-status-warning-text\" />;\n return <BarChart3 className=\"h-5 w-5 text-text-secondary\" />;\n };\n\n if (loading || !stats) {\n return (\n <PageLayout title=\"Platform Analytics\" description=\"Loading analytics...\">\n <div className=\"flex flex-col items-center justify-center py-20\">\n <Loader2 className=\"h-10 w-10 animate-spin text-text-secondary mb-4\" />\n <p className=\"text-text-secondary\">Loading analytics...</p>\n </div>\n </PageLayout>\n );\n }\n\n const tabs: Array<{ key: TabKey; label: string; icon: typeof BarChart3 }> = [\n { key: 'overview', label: 'Overview', icon: BarChart3 },\n { key: 'revenue', label: 'Revenue', icon: IndianRupee },\n { key: 'users', label: 'Users', icon: Users },\n { key: 'performance', label: 'Performance', icon: Zap },\n ];\n\n return (\n <PageLayout title=\"Platform Analytics\" description=\"Comprehensive platform metrics and trends\">\n <PagePurpose className=\"mb-6\">\n Your bird&apos;s-eye view of how Kadaikodi is performing. Spot revenue and order trends, see\n which carts and categories drive the most business, and understand where customers are\n growing — so you can decide where to invest and which carts to promote. Switch tabs to drill\n into revenue, users, and operational performance.\n </PagePurpose>\n\n <NextSteps\n storageKey=\"kadaikodi-admin-analytics\"\n className=\"mb-6\"\n steps={[\n {\n id: 'review-carts',\n label: 'Review top-performing carts',\n description: 'See which carts drive the most revenue and orders.',\n onClick: () => setActiveTab('overview'),\n },\n {\n id: 'check-revenue',\n label: 'Break down revenue by category',\n description: 'Find your strongest categories in the Revenue tab.',\n onClick: () => setActiveTab('revenue'),\n },\n {\n id: 'manage-carts',\n label: 'Approve pending carts',\n description: 'Onboard the carts waiting for review.',\n onClick: () => navigateTo('/admin/carts'),\n done: pendingCarts === 0,\n },\n ]}\n />\n\n <div className=\"mb-6 flex flex-wrap items-center justify-end gap-3\">\n <span className=\"text-sm text-text-secondary\">\n Last updated: {new Date().toLocaleString('en-IN')}\n </span>\n <label className=\"flex items-center gap-2 text-sm text-text-secondary\">\n <CalendarRange className=\"h-4 w-4\" />\n <span className=\"sr-only\">Reporting period</span>\n <select\n value={rangeId}\n onChange={(e) => setRangeId(e.target.value as RangeId)}\n className=\"rounded-lg border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n >\n {RANGES.map((r) => (\n <option key={r.id} value={r.id}>\n {r.label}\n </option>\n ))}\n </select>\n </label>\n </div>\n\n {/* Key Metrics — the one emphasis zone for this page */}\n <EmphasisPanel className=\"mb-8\">\n <h2 className=\"mb-4 text-lg font-semibold text-text-primary\">Key Metrics</h2>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-5 gap-4\">\n <MetricsCard\n featured\n icon={<IndianRupee className=\"h-5 w-5\" />}\n value={fmtCur(stats.totalRevenue)}\n label=\"Total Revenue\"\n />\n <MetricsCard\n icon={<ShoppingBag className=\"h-5 w-5\" />}\n value={(stats.totalOrders ?? 0).toLocaleString('en-IN')}\n label=\"Total Orders\"\n />\n <MetricsCard\n icon={<Users className=\"h-5 w-5\" />}\n value={(stats.activeCustomers ?? 0).toLocaleString('en-IN')}\n label=\"Active Customers\"\n />\n <MetricsCard\n icon={<Store className=\"h-5 w-5\" />}\n value={(stats.activeProviders ?? 0).toLocaleString('en-IN')}\n label=\"Active Carts\"\n trendValue={`${pendingCarts} pending`}\n />\n <MetricsCard\n icon={<TrendingUp className=\"h-5 w-5\" />}\n value={`${newMerchants.count.toLocaleString('en-IN')}${newMerchants.isFloor ? '+' : ''}`}\n label=\"New Carts\"\n trendValue={\n newMerchants.isFloor\n ? `${rangeLabel.toLowerCase()} · of carts loaded`\n : rangeLabel.toLowerCase()\n }\n />\n </div>\n </EmphasisPanel>\n\n {/* Real-chart grid — the mockup's analytics dashboard, all live data */}\n <div className=\"mb-8 grid grid-cols-1 gap-6 lg:grid-cols-2\">\n {/* Category Distribution */}\n <GlassCard treatment=\"plain\" className=\"p-6\">\n <h3 className=\"mb-4 text-base font-semibold text-text-primary\">Category Distribution</h3>\n {categorySegments.length > 0 ? (\n <DonutChart\n segments={categorySegments}\n centerLabel={totalCarts.toLocaleString('en-IN')}\n centerCaption=\"carts\"\n valueFormatter={(v) => v.toLocaleString('en-IN')}\n />\n ) : (\n <p className=\"text-sm text-text-secondary\">\n Category breakdown will appear here as carts are onboarded.\n </p>\n )}\n </GlassCard>\n\n {/* GMV over time */}\n <GlassCard treatment=\"plain\" className=\"p-6\">\n <div className=\"mb-4 flex items-center justify-between gap-2\">\n <h3 className=\"text-base font-semibold text-text-primary\">GMV over time</h3>\n <span className=\"text-xs text-text-muted\">{rangeLabel}</span>\n </div>\n {orders.length > 0 ? (\n <AreaChart\n series={gmvTrend}\n height={200}\n valueFormatter={(v) => fmtCur(v)}\n title={`Gross merchandise value per day, ${rangeLabel.toLowerCase()}`}\n />\n ) : (\n <p className=\"text-sm text-text-secondary\">\n GMV will chart here once orders are placed.\n </p>\n )}\n </GlassCard>\n\n {/* Customer Growth — cumulative distinct customers in the order stream */}\n <GlassCard treatment=\"plain\" className=\"p-6\">\n <div className=\"mb-4 flex items-center justify-between gap-2\">\n <h3 className=\"text-base font-semibold text-text-primary\">Customer Growth</h3>\n <span className=\"text-xs text-text-muted\">{rangeLabel}</span>\n </div>\n {customerGrowthTrend.length > 0 ? (\n <>\n <AreaChart\n series={customerGrowthTrend}\n height={200}\n valueFormatter={(v) => v.toLocaleString('en-IN')}\n title={`Cumulative distinct ordering customers, ${rangeLabel.toLowerCase()}`}\n />\n <p className=\"mt-3 text-xs text-text-muted\">\n Distinct customers seen in the recent order stream, cumulative by day.\n </p>\n </>\n ) : (\n <p className=\"text-sm text-text-secondary\">\n Customer growth will chart here once orders carry customers.\n </p>\n )}\n </GlassCard>\n\n {/* Order Volume over time */}\n <GlassCard treatment=\"plain\" className=\"p-6\">\n <div className=\"mb-4 flex items-center justify-between gap-2\">\n <h3 className=\"text-base font-semibold text-text-primary\">Order Volume</h3>\n <span className=\"text-xs text-text-muted\">{rangeLabel}</span>\n </div>\n {orders.length > 0 ? (\n <AreaChart\n series={volumeTrend}\n height={200}\n valueFormatter={(v) => v.toLocaleString('en-IN')}\n title={`Order volume per day, ${rangeLabel.toLowerCase()}`}\n />\n ) : (\n <p className=\"text-sm text-text-secondary\">\n Order volume will chart here once orders are placed.\n </p>\n )}\n </GlassCard>\n\n {/* Top Categories by Revenue */}\n <GlassCard treatment=\"plain\" className=\"p-6\">\n <h3 className=\"mb-4 text-base font-semibold text-text-primary\">\n Top Categories by Revenue\n </h3>\n {topCategoryRevenue.length > 0 ? (\n <HBarFunnel\n stages={topCategoryRevenue}\n showConversion={false}\n valueFormatter={(v) => fmtCur(v)}\n />\n ) : (\n <p className=\"text-sm text-text-secondary\">\n Category revenue will rank here as orders come in.\n </p>\n )}\n </GlassCard>\n </div>\n\n {/* Tabs */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface mb-8\">\n <div className=\"border-b border-border-subtle\">\n <nav className=\"flex -mb-px overflow-x-auto\">\n {tabs.map((tab) => {\n const TabIcon = tab.icon;\n return (\n <button\n key={tab.key}\n type=\"button\"\n onClick={() => setActiveTab(tab.key)}\n className={cn(\n 'flex items-center gap-2 py-3 px-4 sm:px-6 text-sm font-medium whitespace-nowrap border-b-2 transition-colors',\n activeTab === tab.key\n ? 'border-primary text-primary'\n : 'border-transparent text-text-secondary hover:text-text-primary'\n )}\n >\n <TabIcon className=\"h-4 w-4\" />\n <span className=\"hidden sm:inline\">{tab.label}</span>\n </button>\n );\n })}\n </nav>\n </div>\n\n <div className=\"p-4 sm:p-6\">\n {/* Overview Tab */}\n {activeTab === 'overview' && (\n <div className=\"space-y-8\">\n <div>\n <h3 className=\"text-lg font-semibold text-text-primary mb-4\">\n Order Status Distribution\n </h3>\n {orderStats.total > 0 ? (\n <div className=\"grid grid-cols-1 sm:grid-cols-3 gap-4\">\n <div className=\"rounded-lg border border-status-success-text/30 bg-status-success-bg-subtle p-4\">\n <p className=\"text-sm text-status-success-text\">Completed Orders</p>\n <p className=\"text-2xl font-bold text-status-success-text\">\n {orderStats.completed.toLocaleString('en-IN')}\n </p>\n <p className=\"text-sm text-status-success-text/80\">\n {pct(orderStats.completed, orderStats.total).toFixed(1)}% of total\n </p>\n </div>\n <div className=\"rounded-lg border border-status-warning-text/30 bg-status-warning-bg-subtle p-4\">\n <p className=\"text-sm text-status-warning-text\">Pending Orders</p>\n <p className=\"text-2xl font-bold text-status-warning-text\">\n {orderStats.pending.toLocaleString('en-IN')}\n </p>\n <p className=\"text-sm text-status-warning-text/80\">\n {pct(orderStats.pending, orderStats.total).toFixed(1)}% of total\n </p>\n </div>\n <div className=\"rounded-lg border border-status-error-text/30 bg-status-error-bg-subtle p-4\">\n <p className=\"text-sm text-status-error-text\">Cancelled Orders</p>\n <p className=\"text-2xl font-bold text-status-error-text\">\n {orderStats.cancelled.toLocaleString('en-IN')}\n </p>\n <p className=\"text-sm text-status-error-text/80\">\n {pct(orderStats.cancelled, orderStats.total).toFixed(1)}% of total\n </p>\n </div>\n </div>\n ) : (\n <p className=\"text-sm text-text-secondary\">\n Order breakdowns will appear here once orders are placed.\n </p>\n )}\n </div>\n\n <div>\n <h3 className=\"text-lg font-semibold text-text-primary mb-4\">\n Top Performing Carts\n </h3>\n {topCarts.length > 0 ? (\n <div className=\"rounded-lg border border-border-subtle overflow-hidden\">\n <table className=\"w-full\">\n <thead>\n <tr className=\"border-b border-border-subtle bg-bg-sunken/50\">\n <th className=\"px-4 py-3 text-left text-xs font-medium text-text-secondary uppercase\">\n Cart Name\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium text-text-secondary uppercase\">\n Category\n </th>\n <th className=\"px-4 py-3 text-right text-xs font-medium text-text-secondary uppercase\">\n Rating\n </th>\n </tr>\n </thead>\n <tbody className=\"divide-y divide-border\">\n {topCarts.map((cart, i) => (\n <tr key={cart.id} className=\"hover:bg-accent/50 transition-colors\">\n <td className=\"px-4 py-3\">\n <div className=\"flex items-center gap-2\">\n {medalIcon(i)}\n <span className=\"text-sm font-medium text-text-primary\">\n {cart.name}\n </span>\n </div>\n </td>\n <td className=\"px-4 py-3 text-sm text-left text-text-secondary capitalize\">\n {prettyCategory(cart.category)}\n </td>\n <td className=\"px-4 py-3 text-sm text-right text-text-primary\">\n <span className=\"flex items-center justify-end gap-1\">\n <Star className=\"h-3.5 w-3.5 fill-status-warning-text text-status-warning-text\" />\n {(cart.rating ?? 0).toFixed(1)}\n </span>\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n ) : (\n <p className=\"text-sm text-text-secondary\">\n Top-performing carts will be ranked here once orders start flowing.\n </p>\n )}\n </div>\n </div>\n )}\n\n {/* Revenue Tab */}\n {activeTab === 'revenue' && (\n <div className=\"space-y-8\">\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-4\">\n <div className=\"rounded-lg border border-border-focus/30 bg-[var(--color-accent-soft)] p-6\">\n <h4 className=\"text-sm font-medium text-text-primary mb-2\">Total Revenue</h4>\n <p className=\"text-2xl font-bold text-text-primary\">\n {fmtCur(stats.totalRevenue)}\n </p>\n </div>\n <div className=\"rounded-lg border border-border-subtle bg-bg-sunken/30 p-6\">\n <h4 className=\"text-sm font-medium text-text-secondary mb-2\">Total Orders</h4>\n <p className=\"text-2xl font-bold text-text-primary\">\n {(stats.totalOrders ?? 0).toLocaleString('en-IN')}\n </p>\n </div>\n <div className=\"rounded-lg border border-status-success-text/30 bg-status-success-bg-subtle p-6\">\n <h4 className=\"text-sm font-medium text-status-success-text mb-2\">\n Average Order Value\n </h4>\n <p className=\"text-2xl font-bold text-status-success-text\">\n {fmtCur(orderStats.avgOrderValue)}\n </p>\n </div>\n </div>\n\n {topCategoryRevenue.length > 0 ? (\n <div>\n <h4 className=\"mb-3 text-sm font-semibold text-text-primary\">\n Revenue by Category\n </h4>\n <HBarFunnel\n stages={topCategoryRevenue}\n showConversion={false}\n valueFormatter={(v) => fmtCur(v)}\n />\n <p className=\"mt-3 text-xs text-text-muted\">\n Derived by attributing each order&apos;s value to its cart&apos;s category.\n </p>\n </div>\n ) : (\n <p className=\"text-sm text-text-secondary\">\n Revenue by category will appear here as orders come in.\n </p>\n )}\n </div>\n )}\n\n {/* Users Tab */}\n {activeTab === 'users' && (\n <div className=\"space-y-8\">\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-4\">\n <div className=\"rounded-lg border border-border-subtle bg-bg-sunken/30 p-6\">\n <div className=\"flex items-center gap-2 mb-2\">\n <Users className=\"h-5 w-5 text-text-secondary\" />\n <h4 className=\"text-sm font-medium text-text-secondary\">Active Customers</h4>\n </div>\n <p className=\"text-3xl font-bold text-text-primary\">\n {(stats.activeCustomers ?? 0).toLocaleString('en-IN')}\n </p>\n </div>\n <div className=\"rounded-lg border border-border-subtle bg-bg-sunken/30 p-6\">\n <div className=\"flex items-center gap-2 mb-2\">\n <Store className=\"h-5 w-5 text-text-secondary\" />\n <h4 className=\"text-sm font-medium text-text-secondary\">Active Cart Owners</h4>\n </div>\n <p className=\"text-3xl font-bold text-text-primary\">\n {(stats.activeProviders ?? 0).toLocaleString('en-IN')}\n </p>\n </div>\n </div>\n\n <div className=\"rounded-lg border border-border-subtle bg-bg-sunken/20 p-6\">\n <div className=\"flex items-center gap-2 mb-2\">\n <Users className=\"h-5 w-5 text-text-secondary\" />\n <h3 className=\"text-sm font-medium text-text-secondary\">Total Customers</h3>\n </div>\n <p className=\"text-3xl font-bold text-text-primary\">\n {customerTotal.toLocaleString('en-IN')}\n </p>\n <p className=\"mt-1 text-sm text-text-secondary\">\n Customers on the platform to date.\n </p>\n </div>\n\n {categoryDistRows.length > 0 && (\n <div>\n <h3 className=\"text-lg font-semibold text-text-primary mb-4\">\n Cart Category Distribution\n </h3>\n <div className=\"space-y-3\">\n {categoryDistRows.map((row) => (\n <div key={row.category}>\n <div className=\"flex items-center justify-between mb-1\">\n <span className=\"text-sm font-medium text-text-primary capitalize\">\n {prettyCategory(row.category)}\n </span>\n <span className=\"text-sm text-text-secondary\">\n {(row.count ?? 0).toLocaleString('en-IN')} (\n {(row.percentage ?? 0).toFixed(1)}%)\n </span>\n </div>\n <div className=\"w-full bg-bg-sunken rounded-full h-2\">\n <div\n className=\"bg-action-primary-bg h-2 rounded-full transition-all duration-300\"\n style={{ width: `${row.percentage}%` }}\n />\n </div>\n </div>\n ))}\n </div>\n </div>\n )}\n </div>\n )}\n\n {/* Performance Tab */}\n {activeTab === 'performance' && (\n <div className=\"space-y-8\">\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-6\">\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-6\">\n <div className=\"flex items-center gap-2 mb-2\">\n <Star className=\"h-4 w-4 text-text-secondary\" />\n <h4 className=\"text-sm font-medium text-text-secondary\">\n Customer Satisfaction\n </h4>\n </div>\n <p className=\"text-3xl font-bold text-text-primary flex items-center gap-1\">\n <Star className=\"h-6 w-6 fill-status-warning-text text-status-warning-text\" />\n {stats.avgRating > 0 ? stats.avgRating.toFixed(1) : '—'}\n </p>\n <p className=\"text-sm text-text-secondary mt-1\">Average rating across carts</p>\n </div>\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-6\">\n <div className=\"flex items-center gap-2 mb-2\">\n <TrendingUp className=\"h-4 w-4 text-text-secondary\" />\n <h4 className=\"text-sm font-medium text-text-secondary\">Completion Rate</h4>\n </div>\n <p className=\"text-3xl font-bold text-text-primary\">\n {orderStats.total > 0\n ? `${pct(orderStats.completed, orderStats.total).toFixed(1)}%`\n : '—'}\n </p>\n <p className=\"text-sm text-text-secondary mt-1\">Orders delivered</p>\n </div>\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-6\">\n <div className=\"flex items-center gap-2 mb-2\">\n <BarChart3 className=\"h-4 w-4 text-text-secondary\" />\n <h4 className=\"text-sm font-medium text-text-secondary\">Cancellation Rate</h4>\n </div>\n <p className=\"text-3xl font-bold text-text-primary\">\n {orderStats.total > 0\n ? `${pct(orderStats.cancelled, orderStats.total).toFixed(1)}%`\n : '—'}\n </p>\n <p className=\"text-sm text-text-secondary mt-1\">Orders cancelled</p>\n </div>\n </div>\n\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-6\">\n <h3 className=\"text-lg font-semibold text-text-primary mb-4\">\n Today&apos;s Activity\n </h3>\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-6\">\n <div>\n <p className=\"text-sm text-text-secondary mb-2\">Orders Today</p>\n <p className=\"text-3xl font-bold text-text-primary\">\n {orderStats.ordersToday.toLocaleString('en-IN')}\n </p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary mb-2\">Pending Orders</p>\n <p className=\"text-3xl font-bold text-status-warning-text\">\n {(stats.pendingOrders ?? 0).toLocaleString('en-IN')}\n </p>\n </div>\n </div>\n </div>\n </div>\n )}\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
@@ -58,7 +58,7 @@ function j() {
58
58
  confirmed: "bg-[var(--color-accent-soft)] text-text-primary"
59
59
  })[e] ?? "bg-bg-sunken text-text-secondary", X = (e) => {
60
60
  switch (e) {
61
- case "completed": return /* @__PURE__ */ w(f, { className: "h-4 w-4 text-status-success-text" });
61
+ case "paid": return /* @__PURE__ */ w(f, { className: "h-4 w-4 text-status-success-text" });
62
62
  case "failed": return /* @__PURE__ */ w(C, { className: "h-4 w-4 text-status-error-text" });
63
63
  case "refunded": return /* @__PURE__ */ w(_, { className: "h-4 w-4 text-text-primary" });
64
64
  default: return /* @__PURE__ */ w(d, { className: "h-4 w-4 text-status-warning-text" });
@@ -1 +1 @@
1
- {"version":3,"file":"AdminOrdersPage.js","names":[],"sources":["../../../../src/kadaikodi/pages/admin/AdminOrdersPage.tsx"],"sourcesContent":["/**\n * Admin Orders Page\n * @module kadaikodi/pages/admin\n *\n * Platform-wide order management wired to the live backend\n * (useOrders + useDashboardStats + useUpdateOrderStatus). Metrics, the order\n * table and the details modal all render real records only — no fabricated\n * customers, carts, workers or deltas.\n */\n\nimport { useState, useMemo } from 'react';\nimport {\n Search,\n ShoppingBag,\n IndianRupee,\n TrendingUp,\n Clock,\n Eye,\n CheckCircle2,\n XCircle,\n RefreshCw,\n AlertCircle,\n Loader2,\n X,\n MapPin,\n Store,\n} from 'lucide-react';\nimport { GlassCard, PagePurpose } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../../components/PageLayout';\nimport { EmptyState } from '../../components/EmptyState';\nimport { StatCard, DonutChart } from '../../components/viz';\nimport type { Segment } from '../../components/viz';\nimport { useKadaikodi } from '../../context/KadaikodiContext';\nimport { useOrders, useDashboardStats, useUpdateOrderStatus } from '../../hooks/useKadaikodiApi';\nimport type { MockOrder, OrderStatus } from '../../types';\nimport { cn } from '../../utils/cn';\nimport { formatCurrency } from '../../utils/formatters';\n\n/* ------------------------------------------------------------------ */\n/* Component */\n/* ------------------------------------------------------------------ */\n\nconst DAY_MS = 24 * 60 * 60 * 1000;\nconst dayKeyOf = (d: Date) => {\n const x = new Date(d);\n x.setHours(0, 0, 0, 0);\n return x.getTime();\n};\n\nconst ORDER_STATUSES: OrderStatus[] = [\n 'pending',\n 'confirmed',\n 'preparing',\n 'ready',\n 'picked_up',\n 'out_for_delivery',\n 'delivered',\n 'cancelled',\n];\n\nexport function AdminOrdersPage() {\n const { data: orders = [], isLoading } = useOrders({});\n const { data: stats } = useDashboardStats();\n const updateStatus = useUpdateOrderStatus();\n\n const [searchQuery, setSearchQuery] = useState('');\n const [statusFilter, setStatusFilter] = useState('all');\n const [selectedOrder, setSelectedOrder] = useState<MockOrder | null>(null);\n const [showOrderModal, setShowOrderModal] = useState(false);\n\n const fmtCur = (amount: number) => formatCurrency(amount, { minimumFractionDigits: 0 });\n\n const formatDate = (d: string) =>\n d\n ? new Date(d).toLocaleString('en-IN', {\n day: '2-digit',\n month: 'short',\n hour: '2-digit',\n minute: '2-digit',\n })\n : '—';\n\n // Derived platform metrics — real values only.\n const averageOrderValue = useMemo(() => {\n if (stats && stats.totalOrders > 0) return stats.totalRevenue / stats.totalOrders;\n if (orders.length === 0) return 0;\n return orders.reduce((sum, o) => sum + o.total, 0) / orders.length;\n }, [stats, orders]);\n\n // Real per-day trends (last 30 days) for KPI sparklines.\n const { ordersPerDay, gmvPerDay } = useMemo(() => {\n const today = dayKeyOf(new Date());\n const start = today - 29 * DAY_MS;\n const c = new Map<number, number>();\n const g = new Map<number, number>();\n for (let t = start; t <= today; t += DAY_MS) {\n c.set(t, 0);\n g.set(t, 0);\n }\n for (const o of orders) {\n const t = dayKeyOf(new Date(o.orderDate));\n if (c.has(t)) {\n c.set(t, (c.get(t) ?? 0) + 1);\n g.set(t, (g.get(t) ?? 0) + (o.total ?? 0));\n }\n }\n return { ordersPerDay: [...c.values()], gmvPerDay: [...g.values()] };\n }, [orders]);\n\n // Real order-status distribution for the donut.\n const statusSegments = useMemo<Segment[]>(() => {\n const m = new Map<string, number>();\n for (const o of orders) m.set(o.status, (m.get(o.status) ?? 0) + 1);\n return [...m.entries()]\n .sort((a, b) => b[1] - a[1])\n .map(([s, v]) => ({\n label: s.replace(/_/g, ' ').replace(/\\b\\w/g, (x) => x.toUpperCase()),\n value: v,\n }));\n }, [orders]);\n\n const getStatusColor = (status: string) => {\n const map: Record<string, string> = {\n delivered: 'bg-status-success-bg-subtle text-status-success-text',\n preparing: 'bg-status-warning-bg-subtle text-status-warning-text',\n ready: 'bg-status-warning-bg-subtle text-status-warning-text',\n picked_up: 'bg-[var(--color-accent-soft)] text-text-primary',\n out_for_delivery: 'bg-[var(--color-accent-soft)] text-text-primary',\n cancelled: 'bg-status-error-bg-subtle text-status-error-text',\n confirmed: 'bg-[var(--color-accent-soft)] text-text-primary',\n };\n return map[status] ?? 'bg-bg-sunken text-text-secondary';\n };\n\n const getPaymentIcon = (status: string) => {\n switch (status) {\n case 'completed':\n return <CheckCircle2 className=\"h-4 w-4 text-status-success-text\" />;\n case 'failed':\n return <XCircle className=\"h-4 w-4 text-status-error-text\" />;\n case 'refunded':\n return <RefreshCw className=\"h-4 w-4 text-text-primary\" />;\n default:\n return <AlertCircle className=\"h-4 w-4 text-status-warning-text\" />;\n }\n };\n\n const filteredOrders = useMemo(() => {\n return orders.filter((order) => {\n const matchesSearch =\n !searchQuery ||\n order.id.toLowerCase().includes(searchQuery.toLowerCase()) ||\n order.cartName.toLowerCase().includes(searchQuery.toLowerCase());\n const matchesStatus = statusFilter === 'all' || order.status === statusFilter;\n return matchesSearch && matchesStatus;\n });\n }, [orders, searchQuery, statusFilter]);\n\n const handleUpdateStatus = (orderId: string, newStatus: OrderStatus) => {\n updateStatus.mutate(\n { id: orderId, status: newStatus.toUpperCase() },\n {\n onSuccess: () => {\n setSelectedOrder((prev) => (prev ? { ...prev, status: newStatus } : prev));\n },\n }\n );\n };\n\n const formatAddress = (order: MockOrder) => {\n const a = order.deliveryAddress;\n const parts = [a.street, a.area, a.city, a.pincode].filter(Boolean);\n return parts.length > 0 ? parts.join(', ') : '—';\n };\n\n if (isLoading) {\n return (\n <PageLayout title=\"Order Management\" description=\"Loading orders...\">\n <div className=\"flex flex-col items-center justify-center py-20\">\n <Loader2 className=\"h-10 w-10 animate-spin text-text-secondary mb-4\" />\n <p className=\"text-text-secondary\">Loading orders...</p>\n </div>\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title=\"Order Management\"\n description={`${stats?.totalOrders ?? orders.length} total orders on the platform`}\n >\n <PagePurpose className=\"mb-6\">\n Every order placed across Kadaikodi in one queue. Use this page to keep operations running\n smoothly — search and filter orders, spot anything pending or stuck, open an order to see\n its full details, and step in when a customer or cart needs help. The metrics up top give\n you a live read on volume, revenue and what&apos;s awaiting action.\n </PagePurpose>\n\n {/* KPI row + real order-status donut */}\n {stats && (\n <div className=\"mb-6 grid grid-cols-1 gap-4 lg:grid-cols-3\">\n <div className=\"grid grid-cols-2 gap-4 lg:col-span-2\">\n <StatCard\n label=\"Total Orders\"\n value={(stats.totalOrders ?? 0).toLocaleString('en-IN')}\n icon={<ShoppingBag className=\"h-4 w-4\" />}\n sparkline={ordersPerDay}\n sparklineVariant=\"area\"\n />\n <StatCard\n label=\"Total Revenue\"\n value={fmtCur(stats.totalRevenue)}\n icon={<IndianRupee className=\"h-4 w-4\" />}\n sparkline={gmvPerDay}\n sparklineVariant=\"area\"\n />\n <StatCard\n label=\"Avg Order Value\"\n value={fmtCur(averageOrderValue)}\n icon={<TrendingUp className=\"h-4 w-4\" />}\n />\n <StatCard\n label=\"Pending Orders\"\n value={(stats.pendingOrders ?? 0).toLocaleString('en-IN')}\n icon={<Clock className=\"h-4 w-4\" />}\n />\n </div>\n <GlassCard treatment=\"plain\" className=\"p-6\">\n <h3 className=\"mb-4 text-base font-semibold text-text-primary\">Order Status</h3>\n {statusSegments.length > 0 ? (\n <DonutChart\n segments={statusSegments}\n size={140}\n centerLabel={orders.length.toLocaleString('en-IN')}\n centerCaption=\"orders\"\n valueFormatter={(v) => v.toLocaleString('en-IN')}\n />\n ) : (\n <p className=\"text-sm text-text-secondary\">Status mix will appear here.</p>\n )}\n </GlassCard>\n </div>\n )}\n\n {/* Filters */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4 mb-6\">\n <div className=\"flex flex-col gap-4\">\n <div className=\"relative flex-1\">\n <Search className=\"absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-text-secondary\" />\n <input\n type=\"text\"\n placeholder=\"Search by order ID or cart name...\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className=\"w-full rounded-lg border border-border-subtle bg-bg-surface py-2 pl-10 pr-4 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n />\n </div>\n <select\n value={statusFilter}\n onChange={(e) => setStatusFilter(e.target.value)}\n className=\"rounded-lg border border-border-subtle bg-bg-surface py-2 px-3 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n >\n <option value=\"all\">All Status</option>\n {ORDER_STATUSES.map((s) => (\n <option key={s} value={s}>\n {s.replace(/_/g, ' ').replace(/\\b\\w/g, (c) => c.toUpperCase())}\n </option>\n ))}\n </select>\n </div>\n </div>\n\n {/* Dual Layout */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface overflow-hidden\">\n {/* Mobile Card View */}\n <div className=\"block md:hidden space-y-4 p-4\">\n {filteredOrders.map((order) => (\n <div\n key={order.id}\n className=\"rounded-lg border border-border-subtle bg-bg-sunken/30 p-4\"\n >\n <div className=\"flex justify-between items-start mb-3\">\n <div>\n <h3 className=\"font-medium text-text-primary text-lg\">{order.cartName}</h3>\n <p className=\"text-sm text-text-secondary\">{formatDate(order.orderDate)}</p>\n </div>\n <span\n className={cn(\n 'inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-medium capitalize',\n getStatusColor(order.status)\n )}\n >\n {order.status.replace(/_/g, ' ')}\n </span>\n </div>\n <div className=\"grid grid-cols-2 gap-4 mb-3 text-sm\">\n <div>\n <p className=\"text-text-secondary font-medium\">Items</p>\n <p className=\"text-text-primary\">{order.items.length} item(s)</p>\n </div>\n <div>\n <p className=\"text-text-secondary font-medium\">Order ID</p>\n <p className=\"text-text-primary font-mono text-xs break-all\">{order.id}</p>\n </div>\n </div>\n <div className=\"flex justify-between items-center mb-3\">\n <div>\n <p className=\"text-text-secondary font-medium text-sm\">Amount</p>\n <p className=\"text-text-primary font-semibold text-lg\">{fmtCur(order.total)}</p>\n </div>\n <div className=\"flex items-center gap-2\">\n {getPaymentIcon(order.paymentStatus)}\n <div className=\"text-right\">\n <p className=\"text-sm text-text-primary\">{order.paymentMethod}</p>\n <p className=\"text-xs text-text-secondary capitalize\">{order.paymentStatus}</p>\n </div>\n </div>\n </div>\n <button\n type=\"button\"\n onClick={() => {\n setSelectedOrder(order);\n setShowOrderModal(true);\n }}\n className=\"w-full rounded-lg border border-border-subtle py-2 text-sm font-medium text-text-primary hover:bg-accent transition-colors flex items-center justify-center gap-2\"\n >\n <Eye className=\"h-4 w-4\" /> View Details\n </button>\n </div>\n ))}\n </div>\n\n {/* Desktop Table View */}\n <div className=\"hidden md:block overflow-x-auto\">\n <table className=\"w-full\">\n <thead>\n <tr className=\"border-b border-border-subtle bg-bg-sunken/50\">\n <th className=\"px-4 py-3 text-left text-xs font-medium text-text-secondary uppercase tracking-wider\">\n Order ID\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium text-text-secondary uppercase tracking-wider\">\n Cart\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium text-text-secondary uppercase tracking-wider\">\n Items\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium text-text-secondary uppercase tracking-wider\">\n Amount\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium text-text-secondary uppercase tracking-wider\">\n Status\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium text-text-secondary uppercase tracking-wider\">\n Payment\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium text-text-secondary uppercase tracking-wider\">\n Time\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium text-text-secondary uppercase tracking-wider\">\n Actions\n </th>\n </tr>\n </thead>\n <tbody className=\"divide-y divide-border\">\n {filteredOrders.map((order) => (\n <tr key={order.id} className=\"hover:bg-accent/50 transition-colors\">\n <td className=\"px-4 py-3 text-sm font-mono font-medium text-text-primary\">\n {order.id.slice(0, 12)}\n </td>\n <td className=\"px-4 py-3\">\n <div className=\"text-sm font-medium text-text-primary\">{order.cartName}</div>\n </td>\n <td className=\"px-4 py-3 text-sm text-text-secondary\">\n {order.items.length} item(s)\n </td>\n <td className=\"px-4 py-3 text-sm font-semibold text-text-primary\">\n {fmtCur(order.total)}\n </td>\n <td className=\"px-4 py-3\">\n <span\n className={cn(\n 'inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-medium capitalize',\n getStatusColor(order.status)\n )}\n >\n {order.status.replace(/_/g, ' ')}\n </span>\n </td>\n <td className=\"px-4 py-3\">\n <div className=\"flex items-center gap-2\">\n {getPaymentIcon(order.paymentStatus)}\n <div>\n <div className=\"text-sm text-text-primary\">{order.paymentMethod}</div>\n <div className=\"text-xs text-text-secondary capitalize\">\n {order.paymentStatus}\n </div>\n </div>\n </div>\n </td>\n <td className=\"px-4 py-3 text-sm text-text-secondary\">\n {formatDate(order.orderDate)}\n </td>\n <td className=\"px-4 py-3\">\n <button\n type=\"button\"\n onClick={() => {\n setSelectedOrder(order);\n setShowOrderModal(true);\n }}\n className=\"rounded p-1.5 text-text-secondary hover:text-text-primary hover:bg-accent transition-colors\"\n >\n <Eye className=\"h-4 w-4\" />\n </button>\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n\n {filteredOrders.length === 0 && (\n <EmptyState\n illustration=\"empty-search\"\n title={orders.length === 0 ? 'No orders yet' : 'No orders found'}\n description={\n orders.length === 0\n ? 'Orders placed across the platform will appear here as they come in.'\n : 'No orders match your current search and filters. Try a different status or search term.'\n }\n action={\n orders.length > 0 ? (\n <button\n type=\"button\"\n onClick={() => {\n setSearchQuery('');\n setStatusFilter('all');\n }}\n className=\"rounded-lg border border-border-subtle px-4 py-2 text-sm font-medium text-text-primary hover:bg-accent transition-colors\"\n >\n Clear filters\n </button>\n ) : undefined\n }\n />\n )}\n </div>\n\n {/* Order Details Modal */}\n {showOrderModal && selectedOrder && (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/50 p-4\">\n <div className=\"w-full max-w-2xl rounded-lg border border-border-subtle bg-bg-surface shadow-lg max-h-[90vh] overflow-y-auto\">\n <div className=\"flex items-center justify-between p-4 border-b border-border-subtle\">\n <h2 className=\"text-lg font-semibold text-text-primary\">Order Details</h2>\n <button\n type=\"button\"\n onClick={() => setShowOrderModal(false)}\n className=\"rounded p-1.5 text-text-secondary hover:text-text-primary hover:bg-accent transition-colors\"\n >\n <X className=\"h-5 w-5\" />\n </button>\n </div>\n <div className=\"p-4 space-y-6\">\n {/* Order Info */}\n <div>\n <h3 className=\"font-semibold text-text-primary mb-3\">Order Information</h3>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-4\">\n <div>\n <p className=\"text-sm text-text-secondary\">Order ID</p>\n <p className=\"font-medium text-text-primary font-mono text-sm break-all\">\n {selectedOrder.id}\n </p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Status</p>\n <span\n className={cn(\n 'inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-medium capitalize',\n getStatusColor(selectedOrder.status)\n )}\n >\n {selectedOrder.status.replace(/_/g, ' ')}\n </span>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Order Date</p>\n <p className=\"font-medium text-text-primary\">\n {formatDate(selectedOrder.orderDate)}\n </p>\n </div>\n {selectedOrder.estimatedDeliveryTime && (\n <div>\n <p className=\"text-sm text-text-secondary\">Estimated Delivery</p>\n <p className=\"font-medium text-text-primary\">\n {formatDate(selectedOrder.estimatedDeliveryTime)}\n </p>\n </div>\n )}\n </div>\n </div>\n\n {/* Cart Details */}\n <div>\n <h3 className=\"font-semibold text-text-primary mb-3 flex items-center gap-2\">\n <Store className=\"h-4 w-4\" /> Cart\n </h3>\n <p className=\"font-medium text-text-primary\">{selectedOrder.cartName}</p>\n </div>\n\n {/* Delivery Address */}\n {formatAddress(selectedOrder) !== '—' && (\n <div>\n <h3 className=\"font-semibold text-text-primary mb-3\">Delivery Address</h3>\n <p className=\"font-medium text-text-primary flex items-start gap-1\">\n <MapPin className=\"h-3 w-3 mt-1 shrink-0\" />\n {formatAddress(selectedOrder)}\n </p>\n </div>\n )}\n\n {/* Order Items */}\n <div>\n <h3 className=\"font-semibold text-text-primary mb-3\">Order Items</h3>\n <div className=\"rounded-lg bg-bg-sunken/50 p-4\">\n {selectedOrder.items.length > 0 ? (\n <ul className=\"space-y-2\">\n {selectedOrder.items.map((item) => (\n <li\n key={item.id}\n className=\"flex justify-between text-sm text-text-primary\"\n >\n <span>\n {item.name} × {item.quantity}\n </span>\n <span className=\"font-medium\">{fmtCur(item.price * item.quantity)}</span>\n </li>\n ))}\n </ul>\n ) : (\n <p className=\"text-sm text-text-secondary\">No line items recorded.</p>\n )}\n <div className=\"mt-4 pt-4 border-t border-border-subtle space-y-1 text-sm\">\n <div className=\"flex justify-between text-text-secondary\">\n <span>Subtotal</span>\n <span>{fmtCur(selectedOrder.subtotal)}</span>\n </div>\n <div className=\"flex justify-between text-text-secondary\">\n <span>Taxes</span>\n <span>{fmtCur(selectedOrder.taxes)}</span>\n </div>\n <div className=\"flex justify-between text-text-secondary\">\n <span>Delivery Fee</span>\n <span>{fmtCur(selectedOrder.deliveryFee)}</span>\n </div>\n {selectedOrder.discount ? (\n <div className=\"flex justify-between text-text-secondary\">\n <span>Discount</span>\n <span>-{fmtCur(selectedOrder.discount)}</span>\n </div>\n ) : null}\n <div className=\"flex justify-between pt-2 border-t border-border-subtle font-semibold text-text-primary text-base\">\n <span>Total</span>\n <span>{fmtCur(selectedOrder.total)}</span>\n </div>\n </div>\n </div>\n </div>\n\n {/* Payment Details */}\n <div>\n <h3 className=\"font-semibold text-text-primary mb-3\">Payment Details</h3>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-4\">\n <div>\n <p className=\"text-sm text-text-secondary\">Method</p>\n <p className=\"font-medium text-text-primary\">{selectedOrder.paymentMethod}</p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Status</p>\n <div className=\"flex items-center gap-2\">\n {getPaymentIcon(selectedOrder.paymentStatus)}\n <span className=\"font-medium text-text-primary capitalize\">\n {selectedOrder.paymentStatus}\n </span>\n </div>\n </div>\n </div>\n </div>\n\n {/* Customer Notes */}\n {selectedOrder.customerNotes && (\n <div>\n <h3 className=\"font-semibold text-text-primary mb-3\">Special Instructions</h3>\n <p className=\"text-sm rounded-lg bg-bg-sunken/50 p-3 text-text-primary\">\n {selectedOrder.customerNotes}\n </p>\n </div>\n )}\n\n {/* Actions */}\n <div className=\"flex flex-col sm:flex-row sm:justify-end gap-3 pt-2\">\n <button\n type=\"button\"\n onClick={() => setShowOrderModal(false)}\n className=\"rounded-lg border border-border-subtle py-2 px-4 text-sm font-medium text-text-primary hover:bg-accent transition-colors\"\n >\n Close\n </button>\n {selectedOrder.status !== 'delivered' && selectedOrder.status !== 'cancelled' && (\n <select\n disabled={updateStatus.isPending}\n className=\"rounded-lg border border-border-subtle bg-bg-surface py-2 px-3 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)] disabled:opacity-50\"\n value={selectedOrder.status}\n onChange={(e) =>\n handleUpdateStatus(selectedOrder.id, e.target.value as OrderStatus)\n }\n >\n {ORDER_STATUSES.map((s) => (\n <option key={s} value={s}>\n {s.replace(/_/g, ' ').replace(/\\b\\w/g, (c) => c.toUpperCase())}\n </option>\n ))}\n </select>\n )}\n </div>\n </div>\n </div>\n </div>\n )}\n </PageLayout>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"AdminOrdersPage.js","names":[],"sources":["../../../../src/kadaikodi/pages/admin/AdminOrdersPage.tsx"],"sourcesContent":["/**\n * Admin Orders Page\n * @module kadaikodi/pages/admin\n *\n * Platform-wide order management wired to the live backend\n * (useOrders + useDashboardStats + useUpdateOrderStatus). Metrics, the order\n * table and the details modal all render real records only — no fabricated\n * customers, carts, workers or deltas.\n */\n\nimport { useState, useMemo } from 'react';\nimport {\n Search,\n ShoppingBag,\n IndianRupee,\n TrendingUp,\n Clock,\n Eye,\n CheckCircle2,\n XCircle,\n RefreshCw,\n AlertCircle,\n Loader2,\n X,\n MapPin,\n Store,\n} from 'lucide-react';\nimport { GlassCard, PagePurpose } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../../components/PageLayout';\nimport { EmptyState } from '../../components/EmptyState';\nimport { StatCard, DonutChart } from '../../components/viz';\nimport type { Segment } from '../../components/viz';\nimport { useKadaikodi } from '../../context/KadaikodiContext';\nimport { useOrders, useDashboardStats, useUpdateOrderStatus } from '../../hooks/useKadaikodiApi';\nimport type { MockOrder, OrderStatus } from '../../types';\nimport { cn } from '../../utils/cn';\nimport { formatCurrency } from '../../utils/formatters';\n\n/* ------------------------------------------------------------------ */\n/* Component */\n/* ------------------------------------------------------------------ */\n\nconst DAY_MS = 24 * 60 * 60 * 1000;\nconst dayKeyOf = (d: Date) => {\n const x = new Date(d);\n x.setHours(0, 0, 0, 0);\n return x.getTime();\n};\n\nconst ORDER_STATUSES: OrderStatus[] = [\n 'pending',\n 'confirmed',\n 'preparing',\n 'ready',\n 'picked_up',\n 'out_for_delivery',\n 'delivered',\n 'cancelled',\n];\n\nexport function AdminOrdersPage() {\n const { data: orders = [], isLoading } = useOrders({});\n const { data: stats } = useDashboardStats();\n const updateStatus = useUpdateOrderStatus();\n\n const [searchQuery, setSearchQuery] = useState('');\n const [statusFilter, setStatusFilter] = useState('all');\n const [selectedOrder, setSelectedOrder] = useState<MockOrder | null>(null);\n const [showOrderModal, setShowOrderModal] = useState(false);\n\n const fmtCur = (amount: number) => formatCurrency(amount, { minimumFractionDigits: 0 });\n\n const formatDate = (d: string) =>\n d\n ? new Date(d).toLocaleString('en-IN', {\n day: '2-digit',\n month: 'short',\n hour: '2-digit',\n minute: '2-digit',\n })\n : '—';\n\n // Derived platform metrics — real values only.\n const averageOrderValue = useMemo(() => {\n if (stats && stats.totalOrders > 0) return stats.totalRevenue / stats.totalOrders;\n if (orders.length === 0) return 0;\n return orders.reduce((sum, o) => sum + o.total, 0) / orders.length;\n }, [stats, orders]);\n\n // Real per-day trends (last 30 days) for KPI sparklines.\n const { ordersPerDay, gmvPerDay } = useMemo(() => {\n const today = dayKeyOf(new Date());\n const start = today - 29 * DAY_MS;\n const c = new Map<number, number>();\n const g = new Map<number, number>();\n for (let t = start; t <= today; t += DAY_MS) {\n c.set(t, 0);\n g.set(t, 0);\n }\n for (const o of orders) {\n const t = dayKeyOf(new Date(o.orderDate));\n if (c.has(t)) {\n c.set(t, (c.get(t) ?? 0) + 1);\n g.set(t, (g.get(t) ?? 0) + (o.total ?? 0));\n }\n }\n return { ordersPerDay: [...c.values()], gmvPerDay: [...g.values()] };\n }, [orders]);\n\n // Real order-status distribution for the donut.\n const statusSegments = useMemo<Segment[]>(() => {\n const m = new Map<string, number>();\n for (const o of orders) m.set(o.status, (m.get(o.status) ?? 0) + 1);\n return [...m.entries()]\n .sort((a, b) => b[1] - a[1])\n .map(([s, v]) => ({\n label: s.replace(/_/g, ' ').replace(/\\b\\w/g, (x) => x.toUpperCase()),\n value: v,\n }));\n }, [orders]);\n\n const getStatusColor = (status: string) => {\n const map: Record<string, string> = {\n delivered: 'bg-status-success-bg-subtle text-status-success-text',\n preparing: 'bg-status-warning-bg-subtle text-status-warning-text',\n ready: 'bg-status-warning-bg-subtle text-status-warning-text',\n picked_up: 'bg-[var(--color-accent-soft)] text-text-primary',\n out_for_delivery: 'bg-[var(--color-accent-soft)] text-text-primary',\n cancelled: 'bg-status-error-bg-subtle text-status-error-text',\n confirmed: 'bg-[var(--color-accent-soft)] text-text-primary',\n };\n return map[status] ?? 'bg-bg-sunken text-text-secondary';\n };\n\n const getPaymentIcon = (status: string) => {\n switch (status) {\n case 'paid':\n return <CheckCircle2 className=\"h-4 w-4 text-status-success-text\" />;\n case 'failed':\n return <XCircle className=\"h-4 w-4 text-status-error-text\" />;\n case 'refunded':\n return <RefreshCw className=\"h-4 w-4 text-text-primary\" />;\n default:\n return <AlertCircle className=\"h-4 w-4 text-status-warning-text\" />;\n }\n };\n\n const filteredOrders = useMemo(() => {\n return orders.filter((order) => {\n const matchesSearch =\n !searchQuery ||\n order.id.toLowerCase().includes(searchQuery.toLowerCase()) ||\n order.cartName.toLowerCase().includes(searchQuery.toLowerCase());\n const matchesStatus = statusFilter === 'all' || order.status === statusFilter;\n return matchesSearch && matchesStatus;\n });\n }, [orders, searchQuery, statusFilter]);\n\n const handleUpdateStatus = (orderId: string, newStatus: OrderStatus) => {\n updateStatus.mutate(\n { id: orderId, status: newStatus.toUpperCase() },\n {\n onSuccess: () => {\n setSelectedOrder((prev) => (prev ? { ...prev, status: newStatus } : prev));\n },\n }\n );\n };\n\n const formatAddress = (order: MockOrder) => {\n const a = order.deliveryAddress;\n const parts = [a.street, a.area, a.city, a.pincode].filter(Boolean);\n return parts.length > 0 ? parts.join(', ') : '—';\n };\n\n if (isLoading) {\n return (\n <PageLayout title=\"Order Management\" description=\"Loading orders...\">\n <div className=\"flex flex-col items-center justify-center py-20\">\n <Loader2 className=\"h-10 w-10 animate-spin text-text-secondary mb-4\" />\n <p className=\"text-text-secondary\">Loading orders...</p>\n </div>\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title=\"Order Management\"\n description={`${stats?.totalOrders ?? orders.length} total orders on the platform`}\n >\n <PagePurpose className=\"mb-6\">\n Every order placed across Kadaikodi in one queue. Use this page to keep operations running\n smoothly — search and filter orders, spot anything pending or stuck, open an order to see\n its full details, and step in when a customer or cart needs help. The metrics up top give\n you a live read on volume, revenue and what&apos;s awaiting action.\n </PagePurpose>\n\n {/* KPI row + real order-status donut */}\n {stats && (\n <div className=\"mb-6 grid grid-cols-1 gap-4 lg:grid-cols-3\">\n <div className=\"grid grid-cols-2 gap-4 lg:col-span-2\">\n <StatCard\n label=\"Total Orders\"\n value={(stats.totalOrders ?? 0).toLocaleString('en-IN')}\n icon={<ShoppingBag className=\"h-4 w-4\" />}\n sparkline={ordersPerDay}\n sparklineVariant=\"area\"\n />\n <StatCard\n label=\"Total Revenue\"\n value={fmtCur(stats.totalRevenue)}\n icon={<IndianRupee className=\"h-4 w-4\" />}\n sparkline={gmvPerDay}\n sparklineVariant=\"area\"\n />\n <StatCard\n label=\"Avg Order Value\"\n value={fmtCur(averageOrderValue)}\n icon={<TrendingUp className=\"h-4 w-4\" />}\n />\n <StatCard\n label=\"Pending Orders\"\n value={(stats.pendingOrders ?? 0).toLocaleString('en-IN')}\n icon={<Clock className=\"h-4 w-4\" />}\n />\n </div>\n <GlassCard treatment=\"plain\" className=\"p-6\">\n <h3 className=\"mb-4 text-base font-semibold text-text-primary\">Order Status</h3>\n {statusSegments.length > 0 ? (\n <DonutChart\n segments={statusSegments}\n size={140}\n centerLabel={orders.length.toLocaleString('en-IN')}\n centerCaption=\"orders\"\n valueFormatter={(v) => v.toLocaleString('en-IN')}\n />\n ) : (\n <p className=\"text-sm text-text-secondary\">Status mix will appear here.</p>\n )}\n </GlassCard>\n </div>\n )}\n\n {/* Filters */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4 mb-6\">\n <div className=\"flex flex-col gap-4\">\n <div className=\"relative flex-1\">\n <Search className=\"absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-text-secondary\" />\n <input\n type=\"text\"\n placeholder=\"Search by order ID or cart name...\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className=\"w-full rounded-lg border border-border-subtle bg-bg-surface py-2 pl-10 pr-4 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n />\n </div>\n <select\n value={statusFilter}\n onChange={(e) => setStatusFilter(e.target.value)}\n className=\"rounded-lg border border-border-subtle bg-bg-surface py-2 px-3 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n >\n <option value=\"all\">All Status</option>\n {ORDER_STATUSES.map((s) => (\n <option key={s} value={s}>\n {s.replace(/_/g, ' ').replace(/\\b\\w/g, (c) => c.toUpperCase())}\n </option>\n ))}\n </select>\n </div>\n </div>\n\n {/* Dual Layout */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface overflow-hidden\">\n {/* Mobile Card View */}\n <div className=\"block md:hidden space-y-4 p-4\">\n {filteredOrders.map((order) => (\n <div\n key={order.id}\n className=\"rounded-lg border border-border-subtle bg-bg-sunken/30 p-4\"\n >\n <div className=\"flex justify-between items-start mb-3\">\n <div>\n <h3 className=\"font-medium text-text-primary text-lg\">{order.cartName}</h3>\n <p className=\"text-sm text-text-secondary\">{formatDate(order.orderDate)}</p>\n </div>\n <span\n className={cn(\n 'inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-medium capitalize',\n getStatusColor(order.status)\n )}\n >\n {order.status.replace(/_/g, ' ')}\n </span>\n </div>\n <div className=\"grid grid-cols-2 gap-4 mb-3 text-sm\">\n <div>\n <p className=\"text-text-secondary font-medium\">Items</p>\n <p className=\"text-text-primary\">{order.items.length} item(s)</p>\n </div>\n <div>\n <p className=\"text-text-secondary font-medium\">Order ID</p>\n <p className=\"text-text-primary font-mono text-xs break-all\">{order.id}</p>\n </div>\n </div>\n <div className=\"flex justify-between items-center mb-3\">\n <div>\n <p className=\"text-text-secondary font-medium text-sm\">Amount</p>\n <p className=\"text-text-primary font-semibold text-lg\">{fmtCur(order.total)}</p>\n </div>\n <div className=\"flex items-center gap-2\">\n {getPaymentIcon(order.paymentStatus)}\n <div className=\"text-right\">\n <p className=\"text-sm text-text-primary\">{order.paymentMethod}</p>\n <p className=\"text-xs text-text-secondary capitalize\">{order.paymentStatus}</p>\n </div>\n </div>\n </div>\n <button\n type=\"button\"\n onClick={() => {\n setSelectedOrder(order);\n setShowOrderModal(true);\n }}\n className=\"w-full rounded-lg border border-border-subtle py-2 text-sm font-medium text-text-primary hover:bg-accent transition-colors flex items-center justify-center gap-2\"\n >\n <Eye className=\"h-4 w-4\" /> View Details\n </button>\n </div>\n ))}\n </div>\n\n {/* Desktop Table View */}\n <div className=\"hidden md:block overflow-x-auto\">\n <table className=\"w-full\">\n <thead>\n <tr className=\"border-b border-border-subtle bg-bg-sunken/50\">\n <th className=\"px-4 py-3 text-left text-xs font-medium text-text-secondary uppercase tracking-wider\">\n Order ID\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium text-text-secondary uppercase tracking-wider\">\n Cart\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium text-text-secondary uppercase tracking-wider\">\n Items\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium text-text-secondary uppercase tracking-wider\">\n Amount\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium text-text-secondary uppercase tracking-wider\">\n Status\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium text-text-secondary uppercase tracking-wider\">\n Payment\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium text-text-secondary uppercase tracking-wider\">\n Time\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium text-text-secondary uppercase tracking-wider\">\n Actions\n </th>\n </tr>\n </thead>\n <tbody className=\"divide-y divide-border\">\n {filteredOrders.map((order) => (\n <tr key={order.id} className=\"hover:bg-accent/50 transition-colors\">\n <td className=\"px-4 py-3 text-sm font-mono font-medium text-text-primary\">\n {order.id.slice(0, 12)}\n </td>\n <td className=\"px-4 py-3\">\n <div className=\"text-sm font-medium text-text-primary\">{order.cartName}</div>\n </td>\n <td className=\"px-4 py-3 text-sm text-text-secondary\">\n {order.items.length} item(s)\n </td>\n <td className=\"px-4 py-3 text-sm font-semibold text-text-primary\">\n {fmtCur(order.total)}\n </td>\n <td className=\"px-4 py-3\">\n <span\n className={cn(\n 'inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-medium capitalize',\n getStatusColor(order.status)\n )}\n >\n {order.status.replace(/_/g, ' ')}\n </span>\n </td>\n <td className=\"px-4 py-3\">\n <div className=\"flex items-center gap-2\">\n {getPaymentIcon(order.paymentStatus)}\n <div>\n <div className=\"text-sm text-text-primary\">{order.paymentMethod}</div>\n <div className=\"text-xs text-text-secondary capitalize\">\n {order.paymentStatus}\n </div>\n </div>\n </div>\n </td>\n <td className=\"px-4 py-3 text-sm text-text-secondary\">\n {formatDate(order.orderDate)}\n </td>\n <td className=\"px-4 py-3\">\n <button\n type=\"button\"\n onClick={() => {\n setSelectedOrder(order);\n setShowOrderModal(true);\n }}\n className=\"rounded p-1.5 text-text-secondary hover:text-text-primary hover:bg-accent transition-colors\"\n >\n <Eye className=\"h-4 w-4\" />\n </button>\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n\n {filteredOrders.length === 0 && (\n <EmptyState\n illustration=\"empty-search\"\n title={orders.length === 0 ? 'No orders yet' : 'No orders found'}\n description={\n orders.length === 0\n ? 'Orders placed across the platform will appear here as they come in.'\n : 'No orders match your current search and filters. Try a different status or search term.'\n }\n action={\n orders.length > 0 ? (\n <button\n type=\"button\"\n onClick={() => {\n setSearchQuery('');\n setStatusFilter('all');\n }}\n className=\"rounded-lg border border-border-subtle px-4 py-2 text-sm font-medium text-text-primary hover:bg-accent transition-colors\"\n >\n Clear filters\n </button>\n ) : undefined\n }\n />\n )}\n </div>\n\n {/* Order Details Modal */}\n {showOrderModal && selectedOrder && (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/50 p-4\">\n <div className=\"w-full max-w-2xl rounded-lg border border-border-subtle bg-bg-surface shadow-lg max-h-[90vh] overflow-y-auto\">\n <div className=\"flex items-center justify-between p-4 border-b border-border-subtle\">\n <h2 className=\"text-lg font-semibold text-text-primary\">Order Details</h2>\n <button\n type=\"button\"\n onClick={() => setShowOrderModal(false)}\n className=\"rounded p-1.5 text-text-secondary hover:text-text-primary hover:bg-accent transition-colors\"\n >\n <X className=\"h-5 w-5\" />\n </button>\n </div>\n <div className=\"p-4 space-y-6\">\n {/* Order Info */}\n <div>\n <h3 className=\"font-semibold text-text-primary mb-3\">Order Information</h3>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-4\">\n <div>\n <p className=\"text-sm text-text-secondary\">Order ID</p>\n <p className=\"font-medium text-text-primary font-mono text-sm break-all\">\n {selectedOrder.id}\n </p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Status</p>\n <span\n className={cn(\n 'inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-medium capitalize',\n getStatusColor(selectedOrder.status)\n )}\n >\n {selectedOrder.status.replace(/_/g, ' ')}\n </span>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Order Date</p>\n <p className=\"font-medium text-text-primary\">\n {formatDate(selectedOrder.orderDate)}\n </p>\n </div>\n {selectedOrder.estimatedDeliveryTime && (\n <div>\n <p className=\"text-sm text-text-secondary\">Estimated Delivery</p>\n <p className=\"font-medium text-text-primary\">\n {formatDate(selectedOrder.estimatedDeliveryTime)}\n </p>\n </div>\n )}\n </div>\n </div>\n\n {/* Cart Details */}\n <div>\n <h3 className=\"font-semibold text-text-primary mb-3 flex items-center gap-2\">\n <Store className=\"h-4 w-4\" /> Cart\n </h3>\n <p className=\"font-medium text-text-primary\">{selectedOrder.cartName}</p>\n </div>\n\n {/* Delivery Address */}\n {formatAddress(selectedOrder) !== '—' && (\n <div>\n <h3 className=\"font-semibold text-text-primary mb-3\">Delivery Address</h3>\n <p className=\"font-medium text-text-primary flex items-start gap-1\">\n <MapPin className=\"h-3 w-3 mt-1 shrink-0\" />\n {formatAddress(selectedOrder)}\n </p>\n </div>\n )}\n\n {/* Order Items */}\n <div>\n <h3 className=\"font-semibold text-text-primary mb-3\">Order Items</h3>\n <div className=\"rounded-lg bg-bg-sunken/50 p-4\">\n {selectedOrder.items.length > 0 ? (\n <ul className=\"space-y-2\">\n {selectedOrder.items.map((item) => (\n <li\n key={item.id}\n className=\"flex justify-between text-sm text-text-primary\"\n >\n <span>\n {item.name} × {item.quantity}\n </span>\n <span className=\"font-medium\">{fmtCur(item.price * item.quantity)}</span>\n </li>\n ))}\n </ul>\n ) : (\n <p className=\"text-sm text-text-secondary\">No line items recorded.</p>\n )}\n <div className=\"mt-4 pt-4 border-t border-border-subtle space-y-1 text-sm\">\n <div className=\"flex justify-between text-text-secondary\">\n <span>Subtotal</span>\n <span>{fmtCur(selectedOrder.subtotal)}</span>\n </div>\n <div className=\"flex justify-between text-text-secondary\">\n <span>Taxes</span>\n <span>{fmtCur(selectedOrder.taxes)}</span>\n </div>\n <div className=\"flex justify-between text-text-secondary\">\n <span>Delivery Fee</span>\n <span>{fmtCur(selectedOrder.deliveryFee)}</span>\n </div>\n {selectedOrder.discount ? (\n <div className=\"flex justify-between text-text-secondary\">\n <span>Discount</span>\n <span>-{fmtCur(selectedOrder.discount)}</span>\n </div>\n ) : null}\n <div className=\"flex justify-between pt-2 border-t border-border-subtle font-semibold text-text-primary text-base\">\n <span>Total</span>\n <span>{fmtCur(selectedOrder.total)}</span>\n </div>\n </div>\n </div>\n </div>\n\n {/* Payment Details */}\n <div>\n <h3 className=\"font-semibold text-text-primary mb-3\">Payment Details</h3>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-4\">\n <div>\n <p className=\"text-sm text-text-secondary\">Method</p>\n <p className=\"font-medium text-text-primary\">{selectedOrder.paymentMethod}</p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Status</p>\n <div className=\"flex items-center gap-2\">\n {getPaymentIcon(selectedOrder.paymentStatus)}\n <span className=\"font-medium text-text-primary capitalize\">\n {selectedOrder.paymentStatus}\n </span>\n </div>\n </div>\n </div>\n </div>\n\n {/* Customer Notes */}\n {selectedOrder.customerNotes && (\n <div>\n <h3 className=\"font-semibold text-text-primary mb-3\">Special Instructions</h3>\n <p className=\"text-sm rounded-lg bg-bg-sunken/50 p-3 text-text-primary\">\n {selectedOrder.customerNotes}\n </p>\n </div>\n )}\n\n {/* Actions */}\n <div className=\"flex flex-col sm:flex-row sm:justify-end gap-3 pt-2\">\n <button\n type=\"button\"\n onClick={() => setShowOrderModal(false)}\n className=\"rounded-lg border border-border-subtle py-2 px-4 text-sm font-medium text-text-primary hover:bg-accent transition-colors\"\n >\n Close\n </button>\n {selectedOrder.status !== 'delivered' && selectedOrder.status !== 'cancelled' && (\n <select\n disabled={updateStatus.isPending}\n className=\"rounded-lg border border-border-subtle bg-bg-surface py-2 px-3 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)] disabled:opacity-50\"\n value={selectedOrder.status}\n onChange={(e) =>\n handleUpdateStatus(selectedOrder.id, e.target.value as OrderStatus)\n }\n >\n {ORDER_STATUSES.map((s) => (\n <option key={s} value={s}>\n {s.replace(/_/g, ' ').replace(/\\b\\w/g, (c) => c.toUpperCase())}\n </option>\n ))}\n </select>\n )}\n </div>\n </div>\n </div>\n </div>\n )}\n </PageLayout>\n );\n}\n"],"mappings":"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"}
@@ -4,10 +4,16 @@
4
4
  *
5
5
  * Merchant management wired to the live backend (useProviders +
6
6
  * useUpdateProvider). Status tabs, the merchant table, expandable detail rows
7
- * and the approve / verify / suspend / reject actions all operate on real
8
- * provider records. Approve→VERIFIED, Suspend→SUSPENDED and Reject→ARCHIVED
9
- * persist via useUpdateProvider. Fields with no backend source (verification
10
- * documents, monthly revenue) are omitted rather than fabricated.
7
+ * and the approve / verify / suspend / reject / reinstate actions all operate on
8
+ * real provider records.
9
+ *
10
+ * Statuses are the provider's own `KadaikodiProviderStatus` value (DRAFT,
11
+ * ACTIVE, VERIFIED, PAUSED, SUSPENDED, ARCHIVED), not a boolean derivation —
12
+ * an operator has to be able to tell a suspended cart from an archived or
13
+ * merely paused one. Approve→VERIFIED, Suspend→SUSPENDED, Reject→ARCHIVED and
14
+ * Reinstate→ACTIVE persist via useUpdateProvider. Fields with no backend source
15
+ * (verification documents, monthly revenue, per-merchant order counts) are
16
+ * omitted rather than fabricated.
11
17
  */
12
18
  export declare function CartManagementPage(): import("react").JSX.Element;
13
19
  //# sourceMappingURL=CartManagementPage.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"CartManagementPage.d.ts","sourceRoot":"","sources":["../../../../src/kadaikodi/pages/admin/CartManagementPage.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAyFH,wBAAgB,kBAAkB,gCA+oBjC"}
1
+ {"version":3,"file":"CartManagementPage.d.ts","sourceRoot":"","sources":["../../../../src/kadaikodi/pages/admin/CartManagementPage.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AA4GH,wBAAgB,kBAAkB,gCA6rBjC"}